From 52668d11f90a25c917d29353bf3a2dab2fa13bc4 Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Sun, 26 Nov 2023 22:56:12 +0100 Subject: Add menu button that dynamically changes group items TODO: Make the creation of such menus less cumbersome and do some more testing --- src/comet.c | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/comet.c b/src/comet.c index ece7c89..6257bf1 100644 --- a/src/comet.c +++ b/src/comet.c @@ -196,6 +196,25 @@ static void quit_action(Button *btn) g_main_loop_quit(CAST(btn, ButtonSimple)->action_data); } +static void menu_action(Button *btn) +{ + struct { + ButtonGroup *group; + GList *toggled; + State *state; + } *menu_ctx = CAST(btn, ButtonSimple)->action_data; + + // Otherwise the menu can't be closed + g_assert(menu_ctx->group->children->data == btn); + + GList *temp = menu_ctx->group->children; + menu_ctx->group->children = menu_ctx->toggled; + menu_ctx->toggled = temp; + + log_debug("Toggled menu"); + state_redraw(menu_ctx->state, true); +} + static void register_buttons(State *state, Color color, Color line_color, Color text_color) { // Tags button @@ -309,22 +328,35 @@ int main(int argc, char **argv) Button *child1 = button_simple_create(PANGO_ALIGN_CENTER, color, line_color); button_set_padding(child1, 1); - button_simple_set_text(child1, "Open", text_color); + button_simple_set_text(child1, "C1", text_color); button_simple_set_action(child1, show_action, NULL); Button *child2 = button_simple_create(PANGO_ALIGN_CENTER, color, line_color); button_set_padding(child2, 1); - button_simple_set_text(child2, "Firefox", text_color); + button_simple_set_text(child2, "C2", text_color); button_simple_set_action(child2, show_action, NULL); Button *child3 = button_simple_create(PANGO_ALIGN_CENTER, color, line_color); - button_set_padding(child3, 0); - button_simple_set_text(child3, "Alacritty", text_color); + button_set_padding(child3, 1); + button_simple_set_text(child3, "C3", text_color); button_simple_set_action(child3, show_action, NULL); - button_group_append(group, child1); - button_group_append(group, child2); - button_group_append(group, child3); + struct { + ButtonGroup *group; + GList *toggled; + State *state; + } menu_ctx = { (gpointer)group, NULL, state }; + + Button *menu = button_simple_create(PANGO_ALIGN_CENTER, color, line_color); + button_simple_set_text(menu, "Open", text_color); + button_simple_set_action(menu, menu_action, &menu_ctx); + + menu_ctx.toggled = g_list_append(menu_ctx.toggled, menu); + menu_ctx.toggled = g_list_append(menu_ctx.toggled, child1); + menu_ctx.toggled = g_list_append(menu_ctx.toggled, child2); + menu_ctx.toggled = g_list_append(menu_ctx.toggled, child3); + + button_group_append(group, menu); state_add_button(state, group); connect_attach_state(con, state); @@ -347,7 +379,9 @@ int main(int argc, char **argv) g_source_remove(source_int); timer_delete(date_ctx.timer); + g_list_free(menu_ctx.toggled); + // Buttons are freed by state_destroy state_destroy(state); draw_destroy(draw); window_destroy(win); -- cgit v1.2.3