# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1592801087 0 # Node ID aaea278c2356d3acd12fd5e0a57648f7b59d0b86 # Parent b33d020b04e748372a406165783bc3a4dd2d916f GTK: Fix variant warning, needed to specify parameter type on action. Implemented notification clicked callback on GTK2. diff -r b33d020b04e7 -r aaea278c2356 gtk/dw.c --- a/gtk/dw.c Sun Jun 21 22:04:51 2020 +0000 +++ b/gtk/dw.c Mon Jun 22 04:44:47 2020 +0000 @@ -1980,6 +1980,26 @@ } #endif +#if GLIB_CHECK_VERSION(2,40,0) +/* Handle system notification click callbacks */ +static void _dw_notification_handler(GSimpleAction *action, GVariant *param, gpointer user_data) +{ + char textbuf[101] = {0}; + int (*func)(HWND, void *); + void *data; + + snprintf(textbuf, 100, "dw-notification-%llu-func", (unsigned long long)g_variant_get_uint64(param)); + func = g_object_get_data(G_OBJECT(_DWApp), textbuf); + g_object_set_data(G_OBJECT(_DWApp), textbuf, NULL); + snprintf(textbuf, 100, "dw-notification-%llu-data", (unsigned long long)g_variant_get_uint64(param)); + data = g_object_get_data(G_OBJECT(_DWApp), textbuf); + g_object_set_data(G_OBJECT(_DWApp), textbuf, NULL); + + if(func) + func((HWND)g_variant_get_uint64(param), data); +} +#endif + /* * Initializes the Dynamic Windows engine. * Parameters: @@ -2118,7 +2138,16 @@ */ _DWApp = g_application_new(_dw_app_id, G_APPLICATION_FLAGS_NONE); if(g_application_register(_DWApp, NULL, NULL)) + { +#if GLIB_CHECK_VERSION(2,40,0) + /* Creat our notification handler for any notifications */ + GSimpleAction *action = g_simple_action_new("notification", "t"); + + g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK(_dw_notification_handler), NULL); + g_action_map_add_action(G_ACTION_MAP(_DWApp), G_ACTION(action)); +#endif g_application_activate(_DWApp); + } #endif return TRUE; } @@ -12361,6 +12390,7 @@ if(pixmap && pixmap->pixbuf) g_notification_set_icon(notification, G_ICON(pixmap->pixbuf)); #endif + g_notification_set_default_action_and_target(notification, "app.notification", "t", (guint64)notification); } return (HWND)notification; #else @@ -13494,6 +13524,19 @@ params[1] = discfunc; DW_MUTEX_LOCK; +#if GLIB_CHECK_VERSION(2,40,0) + /* Special case for handling notification signals, which aren't really signals */ + if (G_IS_NOTIFICATION(thiswindow) && strcmp(signame, DW_SIGNAL_CLICKED) == 0) + { + char textbuf[101] = {0}; + snprintf(textbuf, 100, "dw-notification-%llu-func", (unsigned long long)thiswindow); + g_object_set_data(G_OBJECT(_DWApp), textbuf, DW_POINTER(sigfunc)); + snprintf(textbuf, 100, "dw-notification-%llu-data", (unsigned long long)thiswindow); + g_object_set_data(G_OBJECT(_DWApp), textbuf, DW_POINTER(data)); + DW_MUTEX_UNLOCK; + return; + } +#endif /* * If the window we are setting the signal on is a scrolled window we need to get * the "real" widget type. thiswindow is the "real" widget type diff -r b33d020b04e7 -r aaea278c2356 gtk3/dw.c --- a/gtk3/dw.c Sun Jun 21 22:04:51 2020 +0000 +++ b/gtk3/dw.c Mon Jun 22 04:44:47 2020 +0000 @@ -1960,7 +1960,7 @@ static void _dw_notification_handler(GSimpleAction *action, GVariant *param, gpointer user_data) { char textbuf[101] = {0}; - void (*func)(HWND, void *); + int (*func)(HWND, void *); void *data; snprintf(textbuf, 100, "dw-notification-%llu-func", (unsigned long long)g_variant_get_uint64(param)); @@ -2069,7 +2069,7 @@ { #if GLIB_CHECK_VERSION(2,40,0) /* Creat our notification handler for any notifications */ - GSimpleAction *action = g_simple_action_new("notification", NULL); + GSimpleAction *action = g_simple_action_new("notification", "t"); g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK(_dw_notification_handler), NULL); g_action_map_add_action(G_ACTION_MAP(_DWApp), G_ACTION(action)); @@ -11079,8 +11079,6 @@ if(notification) { - GVariant *param = g_variant_new_uint64((guint64)notification); - if(description) { va_list args; @@ -11094,7 +11092,7 @@ } if(pixmap && pixmap->pixbuf) g_notification_set_icon(notification, G_ICON(pixmap->pixbuf)); - g_notification_set_default_action_and_target_value(notification, "app.notification", param); + g_notification_set_default_action_and_target(notification, "app.notification", "t", (guint64)notification); } return (HWND)notification; #else