Fix fullscreen - remove all the garbage which breaks things and let Gtk do its job.
authorJosef Kufner <josef@kufner.cz>
Wed, 20 Apr 2016 21:58:40 +0000 (23:58 +0200)
committerJosef Kufner <josef@kufner.cz>
Wed, 20 Apr 2016 22:03:55 +0000 (00:03 +0200)
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.

src/fullscreen.c

index f6f4ae2..c751229 100644 (file)
@@ -214,7 +214,6 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
        gint x, y;
        gint w, h;
        GdkGeometry geometry;
-       GdkWindow *gdkwin;
 
        if (!window || !imd) return NULL;
 
@@ -234,35 +233,30 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
 
        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) */
+       g_signal_connect(G_OBJECT(fs->window), "delete_event",
+                        G_CALLBACK(fullscreen_delete_cb), fs);
+
+       /* few cosmetic details */
        gtk_window_set_decorated(GTK_WINDOW(fs->window), FALSE);
+       gtk_container_set_border_width(GTK_CONTAINER(fs->window), 0);
 
-       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
-               {
+       /* 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);
-               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);
+       /* 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);
 
-       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;
        /* 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 @@ FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
         * 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);