summaryrefslogtreecommitdiff
blob: 0547395a3b2bd88048cb9be63ee4c2e2773fb703 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 <vanvugt@gmail.com>
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);