Skip to content

Commit

Permalink
Block event trigger during checkbox change
Browse files Browse the repository at this point in the history
  • Loading branch information
Florian Brinker committed Nov 16, 2020
1 parent 48b2241 commit 323d5eb
Showing 1 changed file with 13 additions and 1 deletion.
14 changes: 13 additions & 1 deletion systray_linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ static char temp_file_name[PATH_MAX] = "";
typedef struct {
GtkWidget *menu_item;
int menu_id;
long signalHandlerId;
} MenuItemNode;

typedef struct {
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down

0 comments on commit 323d5eb

Please sign in to comment.