diff --git a/plugins/windows-notification/CMakeLists.txt b/plugins/windows-notification/CMakeLists.txt index acaa36f0..83b94dff 100644 --- a/plugins/windows-notification/CMakeLists.txt +++ b/plugins/windows-notification/CMakeLists.txt @@ -16,6 +16,8 @@ CUSTOM_VAPIS ${CMAKE_BINARY_DIR}/exports/xmpp-vala.vapi ${CMAKE_BINARY_DIR}/exports/dino.vapi ${CMAKE_BINARY_DIR}/exports/qlite.vapi + ${CMAKE_CURRENT_SOURCE_DIR}/vapi/DinoWinToastLib.vapi + ${CMAKE_CURRENT_SOURCE_DIR}/vapi/DinoWinToastTemplate.vapi PACKAGES ${WINDOWS_NOTIFICATION_PACKAGES} ) @@ -29,8 +31,26 @@ COMMENT Copy header file DinoWinToastLib.h ) +add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/exports/DinoWinToastTemplate.h" +COMMAND + cp "${CMAKE_CURRENT_SOURCE_DIR}/src/DinoWinToastTemplate.h" "${CMAKE_BINARY_DIR}/exports/DinoWinToastTemplate.h" +DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/src/DinoWinToastTemplate.h" +COMMENT + Copy header file DinoWinToastTemplate.h +) + +add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/exports/DinoWinToastDllExport.h" +COMMAND + cp "${CMAKE_CURRENT_SOURCE_DIR}/src/DinoWinToastDllExport.h" "${CMAKE_BINARY_DIR}/exports/DinoWinToastDllExport.h" +DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/src/DinoWinToastDllExport.h" +COMMENT + Copy header file DinoWinToastDllExport.h +) + add_definitions(${VALA_CFLAGS}) -add_library(windows-notification SHARED ${WINDOWS_NOTIFICATION_VALA_C} ${CMAKE_BINARY_DIR}/exports/DinoWinToastLib.h) +add_library(windows-notification SHARED ${WINDOWS_NOTIFICATION_VALA_C} ${CMAKE_BINARY_DIR}/exports/DinoWinToastLib.h ${CMAKE_BINARY_DIR}/exports/DinoWinToastTemplate.h ${CMAKE_BINARY_DIR}/exports/DinoWinToastDllExport.h) if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(WINTOASTLIB "${CMAKE_CURRENT_SOURCE_DIR}/src/DinoWinToastLib_AMD64.lib") diff --git a/plugins/windows-notification/src/DinoWinToastDllExport.h b/plugins/windows-notification/src/DinoWinToastDllExport.h new file mode 100644 index 00000000..ee777aaa --- /dev/null +++ b/plugins/windows-notification/src/DinoWinToastDllExport.h @@ -0,0 +1,11 @@ +#pragma once + +#ifdef _WIN32 +#ifdef DINOWINTOASTLIB_EXPORTS +#define DINOWINTOASTLIB_API __declspec(dllexport) +#else +#define DINOWINTOASTLIB_API __declspec(dllimport) +#endif +#else +#define DINOWINTOASTLIB_API +#endif \ No newline at end of file diff --git a/plugins/windows-notification/src/DinoWinToastLib.h b/plugins/windows-notification/src/DinoWinToastLib.h index b0fe9ace..69723666 100644 --- a/plugins/windows-notification/src/DinoWinToastLib.h +++ b/plugins/windows-notification/src/DinoWinToastLib.h @@ -1,27 +1,14 @@ #pragma once -#ifdef _WIN32 -#ifdef DINOWINTOASTLIB_EXPORTS -#define DINOWINTOASTLIB_API __declspec(dllexport) -#else -#define DINOWINTOASTLIB_API __declspec(dllimport) -#endif -#else -#define DINOWINTOASTLIB_API -#endif +#include "DinoWinToastDllExport.h" +#include "DinoWinToastTemplate.h" #ifdef __cplusplus extern "C" { #endif - int DINOWINTOASTLIB_API dinoWinToastLibInit(); -#ifdef __cplusplus -} // extern "C" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - int DINOWINTOASTLIB_API dinoWinToastLibShowMessage(const char* sender, const char* message, const char* imagePath, int conv_id, void(*click_callback)(int conv_id, void* callback_target), void* callback_target); + typedef void(*dinoWinToastLibNotificationCallback)(int conv_id, void* userdata); + DINOWINTOASTLIB_API int dinoWinToastLibInit(); + DINOWINTOASTLIB_API int dinoWinToastLibShowMessage(dino_wintoasttemplate templ, int conv_id, dinoWinToastLibNotificationCallback click_callback, void* callback_target); #ifdef __cplusplus } // extern "C" #endif \ No newline at end of file diff --git a/plugins/windows-notification/src/DinoWinToastLib_AMD64.lib b/plugins/windows-notification/src/DinoWinToastLib_AMD64.lib index bca01f66..c508e807 100644 Binary files a/plugins/windows-notification/src/DinoWinToastLib_AMD64.lib and b/plugins/windows-notification/src/DinoWinToastLib_AMD64.lib differ diff --git a/plugins/windows-notification/src/DinoWinToastLib_x86.lib b/plugins/windows-notification/src/DinoWinToastLib_x86.lib index 27e6a12a..d9a35cbb 100644 Binary files a/plugins/windows-notification/src/DinoWinToastLib_x86.lib and b/plugins/windows-notification/src/DinoWinToastLib_x86.lib differ diff --git a/plugins/windows-notification/src/DinoWinToastTemplate.h b/plugins/windows-notification/src/DinoWinToastTemplate.h new file mode 100644 index 00000000..258335d4 --- /dev/null +++ b/plugins/windows-notification/src/DinoWinToastTemplate.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include "DinoWinToastDllExport.h" + +#ifdef __cplusplus +extern "C" { +#endif + typedef void* dino_wintoasttemplate; + + typedef enum { + System, + Short, + Long + } dino_wintoasttemplate_duration; + + typedef enum { + Default = 0, + Silent = 1, + Loop = 2 + } dino_wintoasttemplate_audiooption; + + typedef enum { + FirstLine = 0, + SecondLine, + ThirdLine + } dino_wintoasttemplate_textfield; + + typedef enum { + ImageAndText01 = 0, + ImageAndText02, + ImageAndText03, + ImageAndText04, + Text01, + Text02, + Text03, + Text04, + WinToastTemplateTypeCount + } dino_wintoasttemplate_wintoasttemplatetype; + + DINOWINTOASTLIB_API dino_wintoasttemplate dino_wintoasttemplate_new(dino_wintoasttemplate_wintoasttemplatetype templ); + DINOWINTOASTLIB_API void dino_wintoasttemplate_destroy(dino_wintoasttemplate templ); + + DINOWINTOASTLIB_API void dino_wintoasttemplate_setTextField(dino_wintoasttemplate templ, const char* txt, dino_wintoasttemplate_textfield pos); + DINOWINTOASTLIB_API void dino_wintoasttemplate_setImagePath(dino_wintoasttemplate templ, const char* imgPath); + DINOWINTOASTLIB_API void dino_wintoasttemplate_setAudioPath(dino_wintoasttemplate templ, const char* audioPath); + DINOWINTOASTLIB_API void dino_wintoasttemplate_setAttributionText(dino_wintoasttemplate templ, const char* attributionText); + DINOWINTOASTLIB_API void dino_wintoasttemplate_addAction(dino_wintoasttemplate templ, const char* label); + DINOWINTOASTLIB_API void dino_wintoasttemplate_setAudioOption(dino_wintoasttemplate templ, dino_wintoasttemplate_audiooption audioOption); + DINOWINTOASTLIB_API void dino_wintoasttemplate_setDuration(dino_wintoasttemplate templ, dino_wintoasttemplate_duration duration); + DINOWINTOASTLIB_API void dino_wintoasttemplate_setExpiration(dino_wintoasttemplate templ, int64_t millisecondsFromNow); +#ifdef __cplusplus +} // extern C +#endif \ No newline at end of file diff --git a/plugins/windows-notification/src/wintoast.vala b/plugins/windows-notification/src/wintoast.vala index 73c44d70..a4e1b622 100644 --- a/plugins/windows-notification/src/wintoast.vala +++ b/plugins/windows-notification/src/wintoast.vala @@ -1,23 +1,26 @@ +using DinoWinToast; + namespace Dino.Plugins.WindowsNotification { public class WinToast { - [CCode (has_target = true)] - public delegate void NotificationCallback(int conv_id); - - [CCode (cname = "dinoWinToastLibInit", cheader_filename = "DinoWinToastLib.h")] - private static extern int DinoWinToastLibInit(); - - [CCode (cname = "dinoWinToastLibShowMessage", cheader_filename = "DinoWinToastLib.h")] - private static extern int DinoWinToastLibShowMessage(char* sender, char* message, char* image_path, int conv_id, NotificationCallback callback); - public bool valid { get; private set; } public WinToast() { - valid = DinoWinToastLibInit() == 0; + valid = Init() == 0; } public bool show_message(string sender, string message, string? image_path, int conv_id, NotificationCallback callback) { if (valid) { - return DinoWinToastLibShowMessage(sender, message, image_path, conv_id, callback) == 0; + DinoWinToastTemplate template; + if (image_path != null) { + template = new DinoWinToastTemplate(TemplateType.ImageAndText02); + template.setImagePath(image_path); + } else { + template = new DinoWinToastTemplate(TemplateType.Text02); + } + + template.setTextField(sender, TextField.FirstLine); + template.setTextField(message, TextField.SecondLine); + return DinoWinToast.ShowMessage(template, conv_id, callback) == 0; } return false; } diff --git a/plugins/windows-notification/vapi/DinoWinToastLib.vapi b/plugins/windows-notification/vapi/DinoWinToastLib.vapi new file mode 100644 index 00000000..a4c92057 --- /dev/null +++ b/plugins/windows-notification/vapi/DinoWinToastLib.vapi @@ -0,0 +1,13 @@ +[CCode (cheader_filename = "DinoWinToastLib.h")] +namespace DinoWinToast { + + [CCode (cname = "dinoWinToastLibNotificationCallback", has_target = true)] + public delegate void NotificationCallback(int conv_id); + + [CCode (cname = "dinoWinToastLibInit")] + public int Init(); + + [CCode (cname = "dinoWinToastLibShowMessage")] + public int ShowMessage(DinoWinToastTemplate templ, int conv_id, NotificationCallback callback); +} + diff --git a/plugins/windows-notification/vapi/DinoWinToastTemplate.vapi b/plugins/windows-notification/vapi/DinoWinToastTemplate.vapi new file mode 100644 index 00000000..59fc4740 --- /dev/null +++ b/plugins/windows-notification/vapi/DinoWinToastTemplate.vapi @@ -0,0 +1,65 @@ +[CCode (cheader_filename = "DinoWinToastTemplate.h")] +namespace DinoWinToast { + [CCode (cname = "dino_wintoasttemplate_duration", cprefix = "")] + public enum Duration { + System, + Short, + Long + } + + [CCode (cname = "dino_wintoasttemplate_audiooption", cprefix = "")] + public enum AudioOption { + Default, + Silent, + Loop + } + + [CCode (cname = "dino_wintoasttemplate_textfield", cprefix = "")] + public enum TextField { + FirstLine, + SecondLine, + ThirdLine + } + + [CCode (cname = "dino_wintoasttemplate_wintoasttemplatetype", cprefix = "")] + public enum TemplateType { + ImageAndText01, + ImageAndText02, + ImageAndText03, + ImageAndText04, + Text01, + Text02, + Text03, + Text04, + WinToastTemplateTypeCount + } + + [CCode (cname="dino_wintoasttemplate", free_function = "dino_wintoasttemplate_destroy")] + [Compact] + public class DinoWinToastTemplate { + [CCode (cname = "dino_wintoasttemplate_new")] + public DinoWinToastTemplate(TemplateType type = TemplateType.ImageAndText02); + + [CCode (cname = "dino_wintoasttemplate_setTextField")] + public void setTextField(char* txt, TextField pos); + + [CCode (cname = "dino_wintoasttemplate_setImagePath")] + public void setImagePath(char* imgPath); + + [CCode (cname = "dino_wintoasttemplate_setAttributionText")] + public void setAttributionText(char* attributionText); + + [CCode (cname = "dino_wintoasttemplate_addAction")] + public void addAction(char* label); + + [CCode (cname = "dino_wintoasttemplate_setAudioOption")] + public void setAudioOption(AudioOption option); + + [CCode (cname = "dino_wintoasttemplate_setDuration")] + public void setDuration(Duration duration); + + [CCode (cname = "dino_wintoasttemplate_setExpiration")] + public void setExpiration(int64 millisecondsFromNow); + } +} +