aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2023-11-26 22:56:12 +0100
committerFederico Angelilli <code@fedang.net>2023-11-26 22:56:12 +0100
commit52668d11f90a25c917d29353bf3a2dab2fa13bc4 (patch)
tree59e1cdeb1338757a76d8e4bec6d9a6eba80a65c7
parentecc229d416c9f9bb16d1f05cfe514ea9386700e7 (diff)
Add menu button that dynamically changes group items
TODO: Make the creation of such menus less cumbersome and do some more testing
-rw-r--r--src/comet.c48
1 files 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);