Initial code to allow buttons and text

This commit is contained in:
LAGonauta 2021-02-21 20:13:23 -03:00
parent ae9671716f
commit ca0cab0e36
10 changed files with 106 additions and 59 deletions

View file

@ -27,10 +27,7 @@ PACKAGES
)
set(WINDOWS_API_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/api/src/gobject/winrt.cpp
${CMAKE_CURRENT_SOURCE_DIR}/api/src/gobject/winrt-enums.cpp
${CMAKE_CURRENT_SOURCE_DIR}/api/src/gobject/winrt-event-token.cpp
${CMAKE_CURRENT_SOURCE_DIR}/api/src/gobject/winrt-toast-notification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/api/src/unity.cpp
${CMAKE_CURRENT_SOURCE_DIR}/api/src/win32.cpp
${CMAKE_CURRENT_SOURCE_DIR}/api/src/converter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/api/src/shortcutcreator.cpp

View file

@ -4,5 +4,6 @@
#include <winrt/Windows.UI.Notifications.h>
#include <winrt/Windows.Data.Xml.Dom.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#endif /* __WINRT_HEADERS_H__ */

View file

@ -3,6 +3,6 @@
#include <glib.h>
#include "winrt.h"
//#include "gobject/winrt-headers.h"
#include "gobject/winrt-headers.h"
#endif // __WINRT_GLIB_H_PRIVATE__

View file

@ -25,25 +25,25 @@ extern "C"
{
#endif
typedef void(*Notification_Callback_Simple)(void* userdata);
typedef void(*Notification_Callback_ActivatedWithActionIndex)(int action_id, void* userdata);
typedef void(*NotificationCallbackSimple)(void* userdata);
typedef void(*NotificationCallbackActivated)(const gchar* arguments, gchar** userInput, gint count, void* userdata);
//typedef void(*Notification_Callback_Dismissed)(Dismissed_Reason reason, void* userdata);
winrtWindowsUINotificationsToastNotification* winrt_windows_ui_notifications_toast_notification_new(const char* doc);
winrtWindowsUINotificationsToastNotification* winrt_windows_ui_notifications_toast_notification_new(const gchar* doc);
void winrt_windows_ui_notifications_toast_notification_set_ExpiresOnReboot(winrtWindowsUINotificationsToastNotification* self, gboolean value);
gboolean winrt_windows_ui_notifications_toast_notification_get_ExpiresOnReboot(winrtWindowsUINotificationsToastNotification* self);
void winrt_windows_ui_notifications_toast_notification_set_Tag(winrtWindowsUINotificationsToastNotification* self, const char* value);
char* winrt_windows_ui_notifications_toast_notification_get_Tag(winrtWindowsUINotificationsToastNotification* self);
void winrt_windows_ui_notifications_toast_notification_set_Tag(winrtWindowsUINotificationsToastNotification* self, const gchar* value);
gchar* winrt_windows_ui_notifications_toast_notification_get_Tag(winrtWindowsUINotificationsToastNotification* self);
void winrt_windows_ui_notifications_toast_notification_set_Group(winrtWindowsUINotificationsToastNotification* self, const char* value);
char* winrt_windows_ui_notifications_toast_notification_get_Group(winrtWindowsUINotificationsToastNotification* self);
void winrt_windows_ui_notifications_toast_notification_set_Group(winrtWindowsUINotificationsToastNotification* self, const gchar* value);
gchar* winrt_windows_ui_notifications_toast_notification_get_Group(winrtWindowsUINotificationsToastNotification* self);
winrtEventToken* winrt_windows_ui_notifications_toast_notification_Activated(winrtWindowsUINotificationsToastNotification* self, Notification_Callback_Simple callback, void* context, void(*free)(void*));
winrtEventToken* winrt_windows_ui_notifications_toast_notification_Activated(winrtWindowsUINotificationsToastNotification* self, NotificationCallbackActivated callback, void* context, void(*free)(void*));
void winrt_windows_ui_notifications_toast_notification_RemoveActivatedAction(winrtWindowsUINotificationsToastNotification* self, winrtEventToken* token);
winrtEventToken* winrt_windows_ui_notifications_toast_notification_Failed(winrtWindowsUINotificationsToastNotification* self, Notification_Callback_Simple callback, void* context, void(*free)(void*));
winrtEventToken* winrt_windows_ui_notifications_toast_notification_Failed(winrtWindowsUINotificationsToastNotification* self, NotificationCallbackSimple callback, void* context, void(*free)(void*));
//winrtEventToken* winrt_windows_ui_notifications_toast_notification_Dismissed(winrtWindowsUINotificationsToastNotification* self, Notification_Callback_Dismissed callback, void* context, void(*free)(void*));
#ifdef __cplusplus

View file

@ -1,5 +1,5 @@
#ifndef __WINRT_GLIB_H__
#define __WINRT_GLIB_H__
#ifndef __WINRT_GLIB_2_H__
#define __WINRT_GLIB_2_H__
#ifdef __cplusplus
extern "C"
@ -12,4 +12,4 @@ gboolean winrt_InitApartment();
}
#endif
#endif // __WINRT_GLIB_H__
#endif // __WINRT_GLIB_2_H__

View file

@ -68,10 +68,9 @@ gboolean winrt_event_token_operator_bool(winrtEventToken* self)
return winrt_event_token_get_internal(self)->operator bool();
}
gint64 winrt_event_token_create_toast_notifier_get_value(winrtEventToken* self)
gint64 winrt_event_token_get_value(winrtEventToken* self)
{
g_return_val_if_fail (WINRT_IS_EVENT_TOKEN (self), 0);
//return winrt_event_token_get_internal(self)->value;
return 0;
return winrt_event_token_get_internal(self)->value;
}

View file

@ -12,6 +12,8 @@
#include <iostream>
#include <string>
#include <vector>
#include <tuple>
#include "winrt-toast-notification-private.h"
#include "winrt-event-token-private.h"
@ -25,15 +27,28 @@ typedef struct
winrt::Windows::UI::Notifications::ToastNotification data;
} _winrtWindowsUINotificationsToastNotificationPrivate;
template<class T>
class Callback {
public:
T callback;
void* context;
void(*free)(void*);
winrtEventToken* token;
void Clear()
{
callback = nullptr;
context = nullptr;
free = nullptr;
g_clear_object(&token);
}
};
typedef struct
{
Notification_Callback_Simple activated;
void* activated_context;
void(*activated_free)(void*);
Callback<NotificationCallbackActivated> activated;
Notification_Callback_Simple failed;
void* failed_context;
void(*failed_free)(void*);
Callback<NotificationCallbackSimple> failed;
// Notification_Callback_ActivatedWithActionIndex callback;
// void* context;
@ -52,17 +67,24 @@ static void winrt_windows_ui_notifications_toast_notification_finalize(GObject*
{
winrtWindowsUINotificationsToastNotificationPrivate* priv = WINRT_WINDOWS_UI_NOTIFICATION_TOAST_NOTIFICATION_GET_PRIVATE (self);
delete priv->notification;
// TODO: save token to remove the notification
if (priv->activated && priv->activated_context && priv->activated_free)
if (winrt_event_token_operator_bool(priv->activated.token))
{
priv->activated_free(priv->activated_context);
priv->notification->data.Activated(*winrt_event_token_get_internal(priv->activated.token));
g_clear_object(&priv->activated.token);
}
if (priv->failed && priv->failed_context && priv->failed_free)
delete priv->notification;
if (priv->activated.callback && priv->activated.context && priv->activated.free)
{
priv->failed_free(priv->failed_context);
priv->activated.free(priv->activated.context);
priv->activated.Clear();
}
if (priv->failed.callback && priv->failed.context && priv->failed.free)
{
priv->failed.free(priv->failed.context);
priv->failed.Clear();
}
G_OBJECT_CLASS(winrt_windows_ui_notifications_toast_notification_parent_class)->dispose(self);
@ -188,43 +210,67 @@ char* winrt_windows_ui_notifications_toast_notification_get_Group(winrtWindowsUI
return wstr_to_char(std::wstring(winrt_windows_ui_notifications_toast_notification_get_internal(self)->Group()));
}
winrtEventToken* winrt_windows_ui_notifications_toast_notification_Activated(winrtWindowsUINotificationsToastNotification* self, Notification_Callback_Simple callback, void* context, void(*free)(void*))
winrtEventToken* winrt_windows_ui_notifications_toast_notification_Activated(winrtWindowsUINotificationsToastNotification* self, NotificationCallbackActivated callback, void* context, void(*free)(void*))
{
g_return_val_if_fail (WINRT_IS_WINDOWS_UI_NOTIFICATIONS_TOAST_NOTIFICATION (self), NULL);
g_return_val_if_fail (callback != nullptr && context != nullptr && free != nullptr, NULL);
winrtWindowsUINotificationsToastNotificationPrivate* priv = WINRT_WINDOWS_UI_NOTIFICATION_TOAST_NOTIFICATION_GET_PRIVATE(self);
if (priv->activated && priv->activated_context && priv->activated_free)
{
// TODO: should also save token to unregister it
priv->activated_free(priv->activated_context);
}
winrt_windows_ui_notifications_toast_notification_RemoveActivatedAction(self, priv->activated.token);
priv->activated = callback;
priv->activated_context = context;
priv->activated_free = free;
priv->activated.callback = callback;
priv->activated.context = context;
priv->activated.free = free;
auto token = priv->notification->data.Activated([&](auto sender, winrt::Windows::Foundation::IInspectable inspectable)
{
std::wstring arguments;
std::vector<std::tuple<std::wstring, std::wstring>> user_input;
{
auto args = inspectable.try_as<winrt::Windows::UI::Notifications::IToastActivatedEventArgs>();
if (args != nullptr)
{
arguments = std::wstring(args.Arguments());
}
}
{
auto args = inspectable.try_as<winrt::Windows::UI::Notifications::IToastActivatedEventArgs2>();
if (args != nullptr)
{
for (const auto& item : args.UserInput())
{
auto value = winrt::unbox_value_or<winrt::hstring>(item.Value(), winrt::hstring());
user_input.emplace_back(std::make_tuple(std::wstring(item.Key()), std::wstring(value)));
}
}
}
std::cout << "Notification activated!" << std::endl;
priv->activated(priv->activated_context);
priv->activated.callback(wstr_to_char(arguments.data()), nullptr, user_input.size(), priv->activated.context);
});
return winrt_event_token_new_from_token(&token);
return nullptr;
priv->activated.token = winrt_event_token_new_from_token(&token);
return priv->activated.token;
}
void winrt_windows_ui_notifications_toast_notification_RemoveActivatedAction(winrtWindowsUINotificationsToastNotification* self, winrtEventToken* token)
{
g_return_if_fail (WINRT_IS_WINDOWS_UI_NOTIFICATIONS_TOAST_NOTIFICATION (self));
winrtWindowsUINotificationsToastNotificationPrivate* priv = WINRT_WINDOWS_UI_NOTIFICATION_TOAST_NOTIFICATION_GET_PRIVATE(self);
if (winrt_event_token_get_value(token) == winrt_event_token_get_value(priv->activated.token))
{
if (winrt_event_token_operator_bool(token))
{
priv->notification->data.Activated(*winrt_event_token_get_internal(token));
}
if (priv->activated && priv->activated_context && priv->activated_free)
if (priv->activated.callback && priv->activated.context && priv->activated.free)
{
priv->activated_free(priv->activated_context);
priv->activated = nullptr;
priv->activated_context = nullptr;
priv->activated_free = nullptr;
priv->activated.free(priv->activated.context);
priv->activated.Clear();
}
}
}

View file

@ -6,7 +6,7 @@ gboolean winrt_InitApartment()
{
try
{
//winrt::init_apartment(); // TODO: FIXME
winrt::init_apartment(); // TODO: FIXME, header only works with unity build
return true;
}
catch(const std::exception& e)

View file

@ -0,0 +1,4 @@
#include "./gobject/winrt.cpp"
#include "./gobject/winrt-toast-notification.cpp"
#include "./gobject/winrt-event-token.cpp"
#include "./gobject/winrt-enums.cpp"

View file

@ -1,10 +1,10 @@
[CCode (cheader_filename = "gobject/winrt-glib.h")]
namespace winrt.Windows.UI.Notifications {
[CCode (cname = "Notification_Callback_Simple", has_target = true)]
[CCode (cname = "NotificationCallbackSimple", has_target = true)]
public delegate void NotificationCallbackSimple();
// [CCode (cname = "Notification_Callback_ActivatedWithActionIndex", has_target = true)]
// public delegate void NotificationCallbackWithActionIndex(int actionId);
[CCode (cname = "NotificationCallbackActivated", has_target = true)]
public delegate void NotificationCallbackActivated(string? arguments, string[]? userInput);
// [CCode (cname = "Notification_Callback_Dismissed", has_target = true)]
// public delegate void NotificationCallbackDismissed(DismissedReason reason);
@ -15,7 +15,7 @@ namespace winrt.Windows.UI.Notifications {
public bool ExpiresOnReboot { get; set; }
public string Tag { get; set; } // TODO: check if valac is cleaning this string
public string Group { get; set; }
public winrt.EventToken Activated(owned NotificationCallbackSimple handler);
public winrt.EventToken Activated(owned NotificationCallbackActivated handler);
public void RemoveActivatedAction(winrt.EventToken token);
}
}