Description: Make fullscreen modes actually use the full screen. The default fullscreen mode now leaves everything up to the window manager, which usually produces the best result. Custom fullscreen modes now use override-redirect to ensure docks and panels never obscure the image. Author: Daniel van Vugt Bug: http://sourceforge.net/support/tracker.php?aid=2925034 Bug-Ubuntu: https://launchpad.net/bugs/788321 Forwarded: yes === modified file 'src/fullscreen.c' --- old/src/fullscreen.c 2010-02-26 10:41:38 +0000 +++ new/src/fullscreen.c 2011-08-16 03:55:04 +0000 @@ -218,75 +218,65 @@ void (*stop_func)(FullScreenData *, gpointer), gpointer stop_data) { FullScreenData *fs; - GdkScreen *screen; - gboolean same; - gint x, y; - gint w, h; - GdkGeometry geometry; if (!window || !imd) return NULL; + DEBUG_1("full screen requests screen %d", options->fullscreen.screen); + fs = g_new0(FullScreenData, 1); - fs->cursor_state = FULLSCREEN_CURSOR_HIDDEN; - fs->normal_window = window; fs->normal_imd = imd; - fs->stop_func = stop_func; fs->stop_data = stop_data; - - DEBUG_1("full screen requests screen %d", options->fullscreen.screen); - fullscreen_prefs_get_geometry(options->fullscreen.screen, window, &x, &y, &w, &h, - &screen, &same); - - 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); + fs->window = window_new(GTK_WINDOW_TOPLEVEL, "fullscreen", NULL, NULL, + _("Full screen")); 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. - */ + { /* Fullscreen as determined by the window manager... */ gtk_window_fullscreen(GTK_WINDOW(fs->window)); } - else if (options->fullscreen.above) - { - /* request to be above other windows */ - gtk_window_set_keep_above(GTK_WINDOW(fs->window), TRUE); + else + { /* Custom fullscreen modes. Done by hand, the hard way... */ + GdkScreen *screen; + gint x, y, w, h; + GdkGeometry geometry; + GtkWindow *gtkwin = GTK_WINDOW(fs->window); + GdkWindow *gdkwin; + + fullscreen_prefs_get_geometry(options->fullscreen.screen, + window, &x, &y, &w, &h, &screen, NULL); + + if (options->fullscreen.above) + gtk_window_set_keep_above(gtkwin, TRUE); + + gtk_window_set_screen(gtkwin, screen); + gtk_window_set_decorated(gtkwin, FALSE); + gtk_window_set_resizable(gtkwin, FALSE); + gtk_container_set_border_width(GTK_CONTAINER(fs->window), 0); + + geometry.min_width = w; + geometry.min_height = h; + geometry.max_width = w; + geometry.max_height = h; + geometry.base_width = w; + geometry.base_height = h; + gtk_window_set_geometry_hints(gtkwin, fs->window, &geometry, + GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE | + GDK_HINT_BASE_SIZE); + + gtk_window_set_default_size(gtkwin, w, h); + gtk_window_move(gtkwin, x, y); + + gtk_widget_realize(fs->window); + gdkwin = gtk_widget_get_window(fs->window); + if (gdkwin != NULL) + gdk_window_set_override_redirect(gdkwin, TRUE); } - gtk_window_set_resizable(GTK_WINDOW(fs->window), FALSE); - - gtk_window_set_screen(GTK_WINDOW(fs->window), screen); - 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; - /* By setting USER_POS and USER_SIZE, most window managers will - * not request positioning of the full screen window (for example twm). - * - * In addition, setting gravity to STATIC will result in the - * decorations of twm to not effect the requested window position, - * the decorations will simply be off screen, except in multi monitor setups :-/ - */ - 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); - fs->imd = image_new(FALSE); gtk_container_add(GTK_CONTAINER(fs->window), fs->imd->widget); @@ -393,7 +383,11 @@ else { gdk_screen_get_monitor_geometry(screen, j, &rect); - subname = g_strdup_printf("%s %d", _("Monitor"), j + 1); + subname = gdk_screen_get_monitor_plug_name(screen, j); + if (subname == NULL) + { + subname = g_strdup_printf("%s %d", _("Monitor"), j + 1); + } } sd = g_new0(ScreenData, 1);