diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index 9d8ed20810..2cb62ffa4d 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -33,13 +33,6 @@ #include -#ifdef HAVE_SOLARIS_XINERAMA -#include -#endif -#ifdef HAVE_XFREE_XINERAMA -#include -#endif - #ifdef HAVE_RANDR #include #endif @@ -517,60 +510,6 @@ init_monitor_geometry (GdkX11Monitor *monitor, monitor->manufacturer = NULL; } -static gboolean -init_fake_xinerama (GdkScreen *screen) -{ -#ifdef G_ENABLE_DEBUG - GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); - XSetWindowAttributes atts; - Window win; - gint w, h; - - if (!GDK_DEBUG_CHECK (XINERAMA)) - return FALSE; - - /* Fake Xinerama mode by splitting the screen into 4 monitors. - * Also draw a little cross to make the monitor boundaries visible. - */ - w = WidthOfScreen (x11_screen->xscreen); - h = HeightOfScreen (x11_screen->xscreen); - - x11_screen->n_monitors = 4; - x11_screen->monitors = g_new0 (GdkX11Monitor, 4); - init_monitor_geometry (&x11_screen->monitors[0], 0, 0, w / 2, h / 2); - init_monitor_geometry (&x11_screen->monitors[1], w / 2, 0, w / 2, h / 2); - init_monitor_geometry (&x11_screen->monitors[2], 0, h / 2, w / 2, h / 2); - init_monitor_geometry (&x11_screen->monitors[3], w / 2, h / 2, w / 2, h / 2); - - atts.override_redirect = 1; - atts.background_pixel = WhitePixel(GDK_SCREEN_XDISPLAY (screen), - x11_screen->screen_num); - win = XCreateWindow(GDK_SCREEN_XDISPLAY (screen), - x11_screen->xroot_window, 0, h / 2, w, 1, 0, - DefaultDepth(GDK_SCREEN_XDISPLAY (screen), - x11_screen->screen_num), - InputOutput, - DefaultVisual(GDK_SCREEN_XDISPLAY (screen), - x11_screen->screen_num), - CWOverrideRedirect|CWBackPixel, - &atts); - XMapRaised(GDK_SCREEN_XDISPLAY (screen), win); - win = XCreateWindow(GDK_SCREEN_XDISPLAY (screen), - x11_screen->xroot_window, w/2 , 0, 1, h, 0, - DefaultDepth(GDK_SCREEN_XDISPLAY (screen), - x11_screen->screen_num), - InputOutput, - DefaultVisual(GDK_SCREEN_XDISPLAY (screen), - x11_screen->screen_num), - CWOverrideRedirect|CWBackPixel, - &atts); - XMapRaised(GDK_SCREEN_XDISPLAY (screen), win); - return TRUE; -#endif - - return FALSE; -} - static void free_monitors (GdkX11Monitor *monitors, gint n_monitors) @@ -846,230 +785,6 @@ init_randr13 (GdkScreen *screen) return FALSE; } -static gboolean -init_solaris_xinerama (GdkScreen *screen) -{ -#ifdef HAVE_SOLARIS_XINERAMA - Display *dpy = GDK_SCREEN_XDISPLAY (screen); - int screen_no = gdk_screen_get_number (screen); - GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); - XRectangle monitors[MAXFRAMEBUFFERS]; - unsigned char hints[16]; - gint result; - int n_monitors; - int i; - int opcode, firstevent, firsterror; - - if (!XQueryExtension (GDK_SCREEN_XDISPLAY (screen), "XINERAMA", - &opcode, &firstevent, &firsterror)) - return FALSE; - - if (!XineramaGetState (dpy, screen_no)) - return FALSE; - - result = XineramaGetInfo (dpy, screen_no, monitors, hints, &n_monitors); - - /* Yes I know it should be Success but the current implementation - * returns the num of monitor - */ - if (result == 0) - { - return FALSE; - } - - x11_screen->monitors = g_new0 (GdkX11Monitor, n_monitors); - x11_screen->n_monitors = n_monitors; - - for (i = 0; i < n_monitors; i++) - { - init_monitor_geometry (&x11_screen->monitors[i], - monitors[i].x, monitors[i].y, - monitors[i].width, monitors[i].height); - } - - x11_screen->primary_monitor = 0; - - return TRUE; -#endif /* HAVE_SOLARIS_XINERAMA */ - - return FALSE; -} - -static gboolean -init_xfree_xinerama (GdkScreen *screen) -{ -#ifdef HAVE_XFREE_XINERAMA - Display *dpy = GDK_SCREEN_XDISPLAY (screen); - GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); - XineramaScreenInfo *monitors; - int i, n_monitors; - int opcode, firstevent, firsterror; - - if (!XQueryExtension (GDK_SCREEN_XDISPLAY (screen), "XINERAMA", - &opcode, &firstevent, &firsterror)) - return FALSE; - - if (!XineramaIsActive (dpy)) - return FALSE; - - monitors = XineramaQueryScreens (dpy, &n_monitors); - - if (n_monitors <= 0 || monitors == NULL) - { - /* If Xinerama doesn't think we have any monitors, try acting as - * though we had no Xinerama. If the "no monitors" condition - * is because XRandR 1.2 is currently switching between CRTCs, - * we'll be notified again when we have our monitor back, - * and can go back into Xinerama-ish mode at that point. - */ - if (monitors) - XFree (monitors); - - return FALSE; - } - - x11_screen->n_monitors = n_monitors; - x11_screen->monitors = g_new0 (GdkX11Monitor, n_monitors); - - for (i = 0; i < n_monitors; ++i) - { - init_monitor_geometry (&x11_screen->monitors[i], - monitors[i].x_org, monitors[i].y_org, - monitors[i].width, monitors[i].height); - } - - XFree (monitors); - - x11_screen->primary_monitor = 0; - - return TRUE; -#endif /* HAVE_XFREE_XINERAMA */ - - return FALSE; -} - -static gboolean -init_solaris_xinerama_indices (GdkX11Screen *x11_screen) -{ -#ifdef HAVE_SOLARIS_XINERAMA - XRectangle x_monitors[MAXFRAMEBUFFERS]; - unsigned char hints[16]; - gint result; - gint monitor_num; - gint x_n_monitors; - gint i; - - if (!XineramaGetState (x11_screen->xdisplay, x11_screen->screen_num)) - return FALSE; - - result = XineramaGetInfo (x11_screen->xdisplay, x11_screen->screen_num, - x_monitors, hints, &x_n_monitors); - - if (result == 0) - return FALSE; - - - for (monitor_num = 0; monitor_num < x11_screen->n_monitors; ++monitor_num) - { - for (i = 0; i < x_n_monitors; ++i) - { - if (x11_screen->monitors[monitor_num].geometry.x == x_monitors[i].x && - x11_screen->monitors[monitor_num].geometry.y == x_monitors[i].y && - x11_screen->monitors[monitor_num].geometry.width == x_monitors[i].width && - x11_screen->monitors[monitor_num].geometry.height == x_monitors[i].height) - { - g_hash_table_insert (x11_screen->xinerama_matches, - GINT_TO_POINTER (monitor_num), - GINT_TO_POINTER (i)); - } - } - } - return TRUE; -#endif /* HAVE_SOLARIS_XINERAMA */ - - return FALSE; -} - -static gboolean -init_xfree_xinerama_indices (GdkX11Screen *x11_screen) -{ -#ifdef HAVE_XFREE_XINERAMA - XineramaScreenInfo *x_monitors; - gint monitor_num; - gint x_n_monitors; - gint i; - - if (!XineramaIsActive (x11_screen->xdisplay)) - return FALSE; - - x_monitors = XineramaQueryScreens (x11_screen->xdisplay, &x_n_monitors); - if (x_n_monitors <= 0 || x_monitors == NULL) - { - if (x_monitors) - XFree (x_monitors); - - return FALSE; - } - - for (monitor_num = 0; monitor_num < x11_screen->n_monitors; ++monitor_num) - { - for (i = 0; i < x_n_monitors; ++i) - { - if (x11_screen->monitors[monitor_num].geometry.x == x_monitors[i].x_org && - x11_screen->monitors[monitor_num].geometry.y == x_monitors[i].y_org && - x11_screen->monitors[monitor_num].geometry.width == x_monitors[i].width && - x11_screen->monitors[monitor_num].geometry.height == x_monitors[i].height) - { - g_hash_table_insert (x11_screen->xinerama_matches, - GINT_TO_POINTER (monitor_num), - GINT_TO_POINTER (i)); - } - } - } - XFree (x_monitors); - return TRUE; -#endif /* HAVE_XFREE_XINERAMA */ - - return FALSE; -} - -static void -init_xinerama_indices (GdkX11Screen *x11_screen) -{ - int opcode, firstevent, firsterror; - - x11_screen->xinerama_matches = g_hash_table_new (g_direct_hash, g_direct_equal); - if (XQueryExtension (x11_screen->xdisplay, "XINERAMA", - &opcode, &firstevent, &firsterror)) - { - x11_screen->xinerama_matches = g_hash_table_new (g_direct_hash, g_direct_equal); - - /* Solaris Xinerama first, then XFree/Xorg Xinerama - * to match the order in init_multihead() - */ - if (init_solaris_xinerama_indices (x11_screen) == FALSE) - init_xfree_xinerama_indices (x11_screen); - } -} - -gint -_gdk_x11_screen_get_xinerama_index (GdkScreen *screen, - gint monitor_num) -{ - GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); - gpointer val; - - g_return_val_if_fail (monitor_num < x11_screen->n_monitors, -1); - - if (x11_screen->xinerama_matches == NULL) - init_xinerama_indices (x11_screen); - - if (g_hash_table_lookup_extended (x11_screen->xinerama_matches, GINT_TO_POINTER (monitor_num), NULL, &val)) - return (GPOINTER_TO_INT(val)); - - return -1; -} - void _gdk_x11_screen_get_edge_monitors (GdkScreen *screen, gint *top, @@ -1120,7 +835,6 @@ deinit_multihead (GdkScreen *screen) GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen); free_monitors (x11_screen->monitors, x11_screen->n_monitors); - g_clear_pointer (&x11_screen->xinerama_matches, g_hash_table_destroy); x11_screen->n_monitors = 0; x11_screen->monitors = NULL; @@ -1184,21 +898,12 @@ init_no_multihead (GdkScreen *screen) static void init_multihead (GdkScreen *screen) { - if (init_fake_xinerama (screen)) - return; - if (init_randr15 (screen)) return; if (init_randr13 (screen)) return; - if (init_solaris_xinerama (screen)) - return; - - if (init_xfree_xinerama (screen)) - return; - init_no_multihead (screen); } diff --git a/gdk/x11/gdkscreen-x11.h b/gdk/x11/gdkscreen-x11.h index c2b9faa283..db827358be 100644 --- a/gdk/x11/gdkscreen-x11.h +++ b/gdk/x11/gdkscreen-x11.h @@ -96,9 +96,6 @@ struct _GdkX11Screen /* cache for window->translate vfunc */ GC subwindow_gcs[32]; - - /* cache for Xinerama monitor indices */ - GHashTable *xinerama_matches; }; struct _GdkX11ScreenClass