From 323d5eb3e0570efbc26f1f4c1c13ca10bf8b8b4c Mon Sep 17 00:00:00 2001 From: Florian Brinker Date: Mon, 16 Nov 2020 23:22:09 +0100 Subject: [PATCH] Block event trigger during checkbox change --- systray_linux.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/systray_linux.c b/systray_linux.c index debbf68..02c5a45 100644 --- a/systray_linux.c +++ b/systray_linux.c @@ -13,6 +13,7 @@ static char temp_file_name[PATH_MAX] = ""; typedef struct { GtkWidget *menu_item; int menu_id; + long signalHandlerId; } MenuItemNode; typedef struct { @@ -95,7 +96,11 @@ gboolean do_add_or_update_menu_item(gpointer data) { gtk_menu_item_set_label(GTK_MENU_ITEM(item->menu_item), mii->title); if (mii->isCheckable) { + // We need to block the "activate" event, to emulate the same behaviour as in the windows version + // A Check/Uncheck does change the checkbox, but does not trigger the checkbox menuItem channel + g_signal_handler_block(GTK_CHECK_MENU_ITEM(item->menu_item), item->signalHandlerId); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item->menu_item), mii->checked == 1); + g_signal_handler_unblock(GTK_CHECK_MENU_ITEM(item->menu_item), item->signalHandlerId); } break; } @@ -112,11 +117,18 @@ gboolean do_add_or_update_menu_item(gpointer data) { } int *id = malloc(sizeof(int)); *id = mii->menu_id; - g_signal_connect_swapped(G_OBJECT(menu_item), "activate", G_CALLBACK(_systray_menu_item_selected), id); + long signalHandlerId = g_signal_connect_swapped( + G_OBJECT(menu_item), + "activate", + G_CALLBACK(_systray_menu_item_selected), + id + ); + gtk_menu_shell_append(GTK_MENU_SHELL(global_tray_menu), menu_item); MenuItemNode* new_item = malloc(sizeof(MenuItemNode)); new_item->menu_id = mii->menu_id; + new_item->signalHandlerId = signalHandlerId; new_item->menu_item = menu_item; GList* new_node = malloc(sizeof(GList)); new_node->data = new_item;