changeset 2298:de5d95fd809b

Fix fullscreen - remove all the garbage which breaks things and let Gtk do its job. The most problematic thing was the `gdk_window_set_override_redirect` call. That was what made most of the mess. Another bad idea was to deny resizing of the fullscreen window, which causes window manager to fail to adjust window size to screen size. Fixes #222, #218, #103.
author Josef Kufner <josef@kufner.cz>
date Wed, 20 Apr 2016 23:58:40 +0200
parents a987ea1ea4f8
children e093199a85de
files src/fullscreen.c
diffstat 1 files changed, 27 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/src/fullscreen.c	Thu Apr 14 14:25:44 2016 +0100
+++ b/src/fullscreen.c	Wed Apr 20 23:58:40 2016 +0200
@@ -214,7 +214,6 @@
 	gint x, y;
 	gint w, h;
 	GdkGeometry geometry;
-	GdkWindow *gdkwin;
 
 	if (!window || !imd) return NULL;
 
@@ -234,35 +233,30 @@
 
 	fs->window = window_new(GTK_WINDOW_TOPLEVEL, "fullscreen", NULL, NULL, _("Full screen"));
 
-	/* this requests no decorations, if you still have them complain to the window manager author(s) */
-	gtk_window_set_decorated(GTK_WINDOW(fs->window), FALSE);
-
-	if (options->fullscreen.screen < 0)
-		{
-		/* If we want control of the window size and position this is not what we want.
-		 * Geeqie needs control of which monitor(s) to use for full screen.
-		 */
-		gtk_window_fullscreen(GTK_WINDOW(fs->window));
-		}
-	else
-		{
-		gtk_window_set_screen(GTK_WINDOW(fs->window), screen);
-		if (options->fullscreen.above)
-			gtk_window_set_keep_above(GTK_WINDOW(fs->window), TRUE);
-		}
-
-	gtk_window_set_resizable(GTK_WINDOW(fs->window), FALSE);
-	gtk_container_set_border_width(GTK_CONTAINER(fs->window), 0);
 	g_signal_connect(G_OBJECT(fs->window), "delete_event",
 			 G_CALLBACK(fullscreen_delete_cb), fs);
 
-	geometry.min_width = w;
-	geometry.min_height = h;
-	geometry.max_width = w;
-	geometry.max_height = h;
-	geometry.base_width = w;
-	geometry.base_height = h;
-	geometry.win_gravity = GDK_GRAVITY_STATIC;
+	/* few cosmetic details */
+	gtk_window_set_decorated(GTK_WINDOW(fs->window), FALSE);
+	gtk_container_set_border_width(GTK_CONTAINER(fs->window), 0);
+
+	/* make window fullscreen -- let Gtk do it's job, don't screw it in any way */
+	gtk_window_fullscreen(GTK_WINDOW(fs->window));
+
+	/* move it to requested screen */
+	if (options->fullscreen.screen >= 0) {
+		gtk_window_set_screen(GTK_WINDOW(fs->window), screen);
+	}
+
+	/* keep window above others, if requested */
+	if (options->fullscreen.above) {
+		gtk_window_set_keep_above(GTK_WINDOW(fs->window), TRUE);
+	}
+
+	/* set default size and position, so the window appears where it was before */
+	gtk_window_set_default_size(GTK_WINDOW(fs->window), w, h);
+	gtk_window_move(GTK_WINDOW(fs->window), x, y);
+
 	/* By setting USER_POS and USER_SIZE, most window managers will
 	 * not request positioning of the full screen window (for example twm).
 	 *
@@ -270,18 +264,15 @@
 	 * decorations of twm to not effect the requested window position,
 	 * the decorations will simply be off screen, except in multi monitor setups :-/
 	 */
+	geometry.min_width = 1;
+	geometry.min_height = 1;
+	geometry.base_width = w;
+	geometry.base_height = h;
+	geometry.win_gravity = GDK_GRAVITY_STATIC;
 	gtk_window_set_geometry_hints(GTK_WINDOW(fs->window), fs->window, &geometry,
-				      GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE | GDK_HINT_BASE_SIZE |
-				      GDK_HINT_WIN_GRAVITY |
-				      GDK_HINT_USER_POS);
-
-	gtk_window_set_default_size(GTK_WINDOW(fs->window), w, h);
-	gtk_window_move(GTK_WINDOW(fs->window), x, y);
+			GDK_HINT_WIN_GRAVITY | GDK_HINT_USER_POS | GDK_HINT_USER_SIZE);
 
 	gtk_widget_realize(fs->window);
-	gdkwin = gtk_widget_get_window(fs->window);
-	if (gdkwin != NULL)
-		gdk_window_set_override_redirect(gdkwin, TRUE);
 
 	fs->imd = image_new(FALSE);