From e66756e2c457d3966c75dbcb87ac2803aedeb5e3 Mon Sep 17 00:00:00 2001 From: Jason Francis Date: Sat, 14 Mar 2020 21:49:46 -0400 Subject: [PATCH] Show headerbar when window is fullscreen Fixes #14 --- resources/wdisplays.ui | 2 +- src/main.c | 22 ++++++++++++++++++++++ src/wdisplays.h | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/resources/wdisplays.ui b/resources/wdisplays.ui index 35a85c8..bae6442 100644 --- a/resources/wdisplays.ui +++ b/resources/wdisplays.ui @@ -76,7 +76,7 @@ True False - + True False vertical diff --git a/src/main.c b/src/main.c index 9b90550..f2cd912 100644 --- a/src/main.c +++ b/src/main.c @@ -1231,6 +1231,25 @@ static void overlay_selected(GSimpleAction *action, GVariant *param, gpointer da } } +static void window_state_changed(GtkWidget *window, GdkEventWindowState *event, + gpointer data) { + struct wd_state *state = data; + if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) { + g_object_ref(state->header_stack); + GtkWidget *container = gtk_widget_get_parent(state->header_stack); + gtk_container_remove(GTK_CONTAINER(container), state->header_stack); + if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) { + gtk_container_add(GTK_CONTAINER(state->main_box), state->header_stack); + gtk_box_reorder_child(GTK_BOX(state->main_box), state->header_stack, 0); + } else { + gtk_widget_unrealize(window); + gtk_window_set_titlebar(GTK_WINDOW(window), state->header_stack); + gtk_widget_map(window); + } + g_object_unref(state->header_stack); + } +} + static void activate(GtkApplication* app, gpointer user_data) { GdkDisplay *gdk_display = gdk_display_get_default(); if (!GDK_IS_WAYLAND_DISPLAY(gdk_display)) { @@ -1254,6 +1273,7 @@ static void activate(GtkApplication* app, gpointer user_data) { GtkBuilder *builder = gtk_builder_new_from_resource("/wdisplays.ui"); GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "heads_window")); + state->main_box = GTK_WIDGET(gtk_builder_get_object(builder, "main_box")); state->header_stack = GTK_WIDGET(gtk_builder_get_object(builder, "header_stack")); state->stack_switcher = GTK_WIDGET(gtk_builder_get_object(builder, "heads_stack_switcher")); state->stack = GTK_WIDGET(gtk_builder_get_object(builder, "heads_stack")); @@ -1277,6 +1297,8 @@ static void activate(GtkApplication* app, gpointer user_data) { gtk_builder_connect_signals(builder, state); gtk_box_set_homogeneous(GTK_BOX(gtk_builder_get_object(builder, "zoom_box")), FALSE); + g_signal_connect(window, "window-state-event", G_CALLBACK(window_state_changed), state); + state->canvas = wd_gl_viewport_new(); gtk_container_add(GTK_CONTAINER(state->scroller), state->canvas); gtk_widget_add_events(state->canvas, GDK_POINTER_MOTION_MASK diff --git a/src/wdisplays.h b/src/wdisplays.h index e408957..c78128b 100644 --- a/src/wdisplays.h +++ b/src/wdisplays.h @@ -209,6 +209,7 @@ struct wd_state { bool panning; struct wd_point pan_last; + GtkWidget *main_box; GtkWidget *header_stack; GtkWidget *stack_switcher; GtkWidget *stack;