162 lines
4.3 KiB
Diff
162 lines
4.3 KiB
Diff
Fix for https://bugzilla.novell.com/show_bug.cgi?id=343858
|
|
|
|
2008-01-15 Federico Mena Quintero <federico@novell.com>
|
|
|
|
* gui/gdmwm.c (gdm_wm_screen_init): Use the GdkScreen functions to
|
|
get the monitors, instead of sanitizing the monitor geometries
|
|
here. This assumes an updated GTK+ package with the sanitization
|
|
logic in GdkScreen.
|
|
|
|
diff --git a/gui/gdmwm.c b/gui/gdmwm.c
|
|
index 806b944..681de8a 100644
|
|
--- a/gui/gdmwm.c
|
|
+++ b/gui/gdmwm.c
|
|
@@ -84,6 +84,9 @@ static guint save_struts[4] = {0, 0, 0, 0};
|
|
void
|
|
gdm_wm_screen_init (int cur_screen_num)
|
|
{
|
|
+ GdkScreen *screen;
|
|
+ int i;
|
|
+
|
|
if (g_getenv ("FAKE_XINERAMA_GDM") != NULL) {
|
|
/* for testing Xinerama support on non-xinerama setups */
|
|
gdm_wm_screen.x = 100;
|
|
@@ -101,129 +104,18 @@ gdm_wm_screen_init (int cur_screen_num)
|
|
return;
|
|
}
|
|
|
|
- {
|
|
-#ifdef HAVE_XFREE_XINERAMA
|
|
- gboolean have_xinerama = FALSE;
|
|
-
|
|
- gdk_flush ();
|
|
- gdk_error_trap_push ();
|
|
- have_xinerama = XineramaIsActive (GDK_DISPLAY ());
|
|
- gdk_flush ();
|
|
- if (gdk_error_trap_pop () != 0)
|
|
- have_xinerama = FALSE;
|
|
-
|
|
- if (have_xinerama) {
|
|
- int screen_num, i;
|
|
- XineramaScreenInfo *xscreens =
|
|
- XineramaQueryScreens (GDK_DISPLAY (),
|
|
- &screen_num);
|
|
-
|
|
-
|
|
- if (screen_num <= 0) {
|
|
- /* should NEVER EVER happen */
|
|
- gdm_common_error ("Xinerama active, but <= 0 screens?");
|
|
- gdm_wm_screen.x = 0;
|
|
- gdm_wm_screen.y = 0;
|
|
- gdm_wm_screen.width = gdk_screen_width ();
|
|
- gdm_wm_screen.height = gdk_screen_height ();
|
|
-
|
|
- gdm_wm_allscreens = g_new0 (GdkRectangle, 1);
|
|
- gdm_wm_allscreens[0] = gdm_wm_screen;
|
|
- gdm_wm_screens = 1;
|
|
- return;
|
|
- }
|
|
+ screen = gdk_screen_get_default ();
|
|
|
|
- if (screen_num <= cur_screen_num)
|
|
- cur_screen_num = 0;
|
|
+ gdm_wm_screens = gdk_screen_get_n_monitors (screen);
|
|
|
|
- gdm_wm_allscreens = g_new0 (GdkRectangle, screen_num);
|
|
- gdm_wm_screens = screen_num;
|
|
+ gdm_wm_allscreens = g_new (GdkRectangle, gdm_wm_screens);
|
|
+ for (i = 0; i < gdm_wm_screens; i++)
|
|
+ gdk_screen_get_monitor_geometry (screen, i, gdm_wm_allscreens + i);
|
|
|
|
- for (i = 0; i < screen_num; i++) {
|
|
- gdm_wm_allscreens[i].x = xscreens[i].x_org;
|
|
- gdm_wm_allscreens[i].y = xscreens[i].y_org;
|
|
- gdm_wm_allscreens[i].width = xscreens[i].width;
|
|
- gdm_wm_allscreens[i].height = xscreens[i].height;
|
|
-
|
|
- if (cur_screen_num == i)
|
|
- gdm_wm_screen = gdm_wm_allscreens[i];
|
|
- }
|
|
-
|
|
- XFree (xscreens);
|
|
- } else
|
|
-#elif HAVE_SOLARIS_XINERAMA
|
|
- gboolean have_xinerama = FALSE;
|
|
- /* This code from GDK, Copyright (C) 2002 Sun Microsystems */
|
|
- int opcode;
|
|
- int firstevent;
|
|
- int firsterror;
|
|
- int n_monitors = 0;
|
|
-
|
|
- gdk_flush ();
|
|
- gdk_error_trap_push ();
|
|
- have_xinerama = XQueryExtension (GDK_DISPLAY (),
|
|
- "XINERAMA",
|
|
- &opcode,
|
|
- &firstevent,
|
|
- &firsterror);
|
|
- gdk_flush ();
|
|
- if (gdk_error_trap_pop () != 0)
|
|
- have_xinerama = FALSE;
|
|
-
|
|
- if (have_xinerama) {
|
|
- int i;
|
|
- int result;
|
|
- XRectangle monitors[MAXFRAMEBUFFERS];
|
|
- unsigned char hints[16];
|
|
-
|
|
- result = XineramaGetInfo (GDK_DISPLAY (), 0, monitors, hints, &n_monitors);
|
|
- /* Yes I know it should be Success but the current implementation
|
|
- * returns the num of monitor
|
|
- */
|
|
-
|
|
- if (result <= 0) {
|
|
- /* should NEVER EVER happen */
|
|
- gdm_common_error ("Xinerama active, but <= 0 screens?");
|
|
- gdm_wm_screen.x = 0;
|
|
- gdm_wm_screen.y = 0;
|
|
- gdm_wm_screen.width = gdk_screen_width ();
|
|
- gdm_wm_screen.height = gdk_screen_height ();
|
|
-
|
|
- gdm_wm_allscreens = g_new0 (GdkRectangle, 1);
|
|
- gdm_wm_allscreens[0] = gdm_wm_screen;
|
|
- gdm_wm_screens = 1;
|
|
- return;
|
|
- }
|
|
-
|
|
- if (n_monitors <= cur_screen_num)
|
|
- cur_screen_num = 0;
|
|
-
|
|
- gdm_wm_allscreens = g_new0 (GdkRectangle, n_monitors);
|
|
- gdm_wm_screens = n_monitors;
|
|
-
|
|
- for (i = 0; i < n_monitors; i++) {
|
|
- gdm_wm_allscreens[i].x = monitors[i].x;
|
|
- gdm_wm_allscreens[i].y = monitors[i].y;
|
|
- gdm_wm_allscreens[i].width = monitors[i].width;
|
|
- gdm_wm_allscreens[i].height = monitors[i].height;
|
|
-
|
|
- if (cur_screen_num == i)
|
|
- gdm_wm_screen = gdm_wm_allscreens[i];
|
|
- }
|
|
-
|
|
- } else
|
|
-#endif
|
|
- {
|
|
- gdm_wm_screen.x = 0;
|
|
- gdm_wm_screen.y = 0;
|
|
- gdm_wm_screen.width = gdk_screen_width ();
|
|
- gdm_wm_screen.height = gdk_screen_height ();
|
|
+ if (gdm_wm_screens < cur_screen_num)
|
|
+ cur_screen_num = 0;
|
|
|
|
- gdm_wm_allscreens = g_new0 (GdkRectangle, 1);
|
|
- gdm_wm_allscreens[0] = gdm_wm_screen;
|
|
- gdm_wm_screens = 1;
|
|
- }
|
|
- }
|
|
+ gdm_wm_screen = gdm_wm_allscreens[cur_screen_num];
|
|
}
|
|
|
|
void
|