aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gsr-window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gsr-window.c')
-rw-r--r--src/gsr-window.c57
1 files changed, 42 insertions, 15 deletions
diff --git a/src/gsr-window.c b/src/gsr-window.c
index e2c1ab7..19b5f1a 100644
--- a/src/gsr-window.c
+++ b/src/gsr-window.c
@@ -46,6 +46,11 @@ struct _GsrWindow {
GsrRecordPage *record_page;
GsrReplayPage *replay_page;
+ /* ── Hamburger menu ─── */
+ GMenu *primary_menu; /* top-level menu model */
+ GMenu *view_section; /* "View" section (Simple/Advanced) */
+ gboolean view_section_visible;
+
/* ── Hotkeys ─── */
GsrHotkeys *hotkeys;
#ifdef HAVE_WAYLAND
@@ -650,47 +655,66 @@ on_close_request(GtkWindow *window, gpointer user_data G_GNUC_UNUSED)
/* ── Hamburger menu ──────────────────────────────────────────────── */
-static GMenuModel *
-create_primary_menu(void)
+static void
+create_primary_menu(GsrWindow *self)
{
- GMenu *menu = g_menu_new();
+ self->primary_menu = g_menu_new();
- /* View mode section (with "View" header label) */
- GMenu *view_section = g_menu_new();
+ /* View mode section (with "View" header label) — kept separate for
+ dynamic insertion/removal based on the active tab. */
+ self->view_section = g_menu_new();
GMenuItem *simple_item = g_menu_item_new("Simple", NULL);
g_menu_item_set_action_and_target_value(simple_item,
"win.view-mode", g_variant_new_string("simple"));
- g_menu_append_item(view_section, simple_item);
+ g_menu_append_item(self->view_section, simple_item);
g_object_unref(simple_item);
GMenuItem *advanced_item = g_menu_item_new("Advanced", NULL);
g_menu_item_set_action_and_target_value(advanced_item,
"win.view-mode", g_variant_new_string("advanced"));
- g_menu_append_item(view_section, advanced_item);
+ g_menu_append_item(self->view_section, advanced_item);
g_object_unref(advanced_item);
- g_menu_append_section(menu, "View", G_MENU_MODEL(view_section));
- g_object_unref(view_section);
+ /* Start with the View section hidden; it will be shown when the
+ Config tab becomes visible. */
+ self->view_section_visible = FALSE;
- /* About section */
+ /* About section (always present) */
GMenu *about_section = g_menu_new();
g_menu_append(about_section, "Keyboard Shortcuts", "app.shortcuts");
g_menu_append(about_section, "About", "app.about");
- g_menu_append_section(menu, NULL, G_MENU_MODEL(about_section));
+ g_menu_append_section(self->primary_menu, NULL,
+ G_MENU_MODEL(about_section));
g_object_unref(about_section);
-
- return G_MENU_MODEL(menu);
}
/* ── Hotkey: page changed → regrab + register Wayland shortcuts ─── */
static void
+update_view_section_visibility(GsrWindow *self, gboolean show)
+{
+ if (show && !self->view_section_visible) {
+ g_menu_insert_section(self->primary_menu, 0,
+ "View", G_MENU_MODEL(self->view_section));
+ self->view_section_visible = TRUE;
+ } else if (!show && self->view_section_visible) {
+ g_menu_remove(self->primary_menu, 0);
+ self->view_section_visible = FALSE;
+ }
+}
+
+static void
on_visible_page_changed(GObject *object G_GNUC_UNUSED,
GParamSpec *pspec G_GNUC_UNUSED,
gpointer user_data)
{
GsrWindow *self = GSR_WINDOW(user_data);
+ /* Show/hide the View section depending on the active tab */
+ const char *page = adw_view_stack_get_visible_child_name(self->view_stack);
+ gboolean on_config = page && g_str_equal(page, "config");
+ update_view_section_visibility(self, on_config);
+
/* X11: re-grab hotkeys for the now-visible page */
#ifdef HAVE_X11
if (self->hotkeys)
@@ -700,7 +724,6 @@ on_visible_page_changed(GObject *object G_GNUC_UNUSED,
/* Wayland: register shortcuts once when first visiting an action page */
#ifdef HAVE_WAYLAND
if (self->hotkeys && !self->wayland_shortcuts_registered) {
- const char *page = adw_view_stack_get_visible_child_name(self->view_stack);
if (page && (!g_str_equal(page, "config"))) {
self->wayland_shortcuts_registered = TRUE;
gsr_hotkeys_register_wayland_shortcuts_once(self->hotkeys);
@@ -872,7 +895,11 @@ gsr_window_init(GsrWindow *self)
/* Hamburger menu button */
self->menu_button = GTK_MENU_BUTTON(gtk_menu_button_new());
gtk_menu_button_set_icon_name(self->menu_button, "open-menu-symbolic");
- gtk_menu_button_set_menu_model(self->menu_button, create_primary_menu());
+ create_primary_menu(self);
+ gtk_menu_button_set_menu_model(self->menu_button,
+ G_MENU_MODEL(self->primary_menu));
+ /* Config is the default visible page, so show the View section */
+ update_view_section_visibility(self, TRUE);
adw_header_bar_pack_end(self->header_bar, GTK_WIDGET(self->menu_button));
/* ── Bottom view switcher bar (narrow mode fallback) ─── */