summaryrefslogtreecommitdiff
path: root/src/screen.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@pobox.com>2002-04-21 19:35:02 +0000
committerHavoc Pennington <hp@src.gnome.org>2002-04-21 19:35:02 +0000
commitf5c10f387bb90aafa357a77defe6b757eec3e29e (patch)
tree77019739b99b8e525478ec9a4a0777c9abc3c4b1 /src/screen.c
parent458e125c092896a234dac5ad32824368602ed114 (diff)
downloadmetacity-f5c10f387bb90aafa357a77defe6b757eec3e29e.tar.gz
query Xinerama screen information if HAVE_XINERAMA
2002-04-17 Havoc Pennington <hp@pobox.com> * src/screen.c (meta_screen_new): query Xinerama screen information if HAVE_XINERAMA * configure.in (found_xinerama): check for Xinerama
Diffstat (limited to 'src/screen.c')
-rw-r--r--src/screen.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/screen.c b/src/screen.c
index 005014aa..f02e99d2 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -30,6 +30,10 @@
#include "keybindings.h"
#include "stack.h"
+#ifdef HAVE_XINERAMA
+#include <X11/extensions/Xinerama.h>
+#endif
+
#include <X11/Xatom.h>
#include <locale.h>
#include <string.h>
@@ -210,6 +214,75 @@ meta_screen_new (MetaDisplay *display,
screen->current_cursor = -1; /* invalid/unset */
screen->default_xvisual = DefaultVisualOfScreen (screen->xscreen);
screen->default_depth = DefaultDepthOfScreen (screen->xscreen);
+
+ screen->xinerama_infos = NULL;
+ screen->n_xinerama_infos = 0;
+
+#ifdef HAVE_XINERAMA
+ if (XineramaQueryExtension (display->xdisplay, NULL, NULL))
+ {
+ XineramaScreenInfo *infos;
+ int n_infos;
+ int i;
+
+ n_infos = 0;
+ infos = XineramaQueryScreens (display->xdisplay, &n_infos);
+
+ meta_topic (META_DEBUG_XINERAMA,
+ "Found %d Xinerama screens on display %s\n",
+ n_infos, display->name);
+
+ if (n_infos > 0)
+ {
+ screen->xinerama_infos = g_new (MetaXineramaScreenInfo, n_infos);
+ screen->n_xinerama_infos = n_infos;
+
+ i = 0;
+ while (i < n_infos)
+ {
+ screen->xinerama_infos[i].number = infos[i].screen_number;
+ screen->xinerama_infos[i].x_origin = infos[i].x_org;
+ screen->xinerama_infos[i].y_origin = infos[i].y_org;
+ screen->xinerama_infos[i].width = infos[i].width;
+ screen->xinerama_infos[i].height = infos[i].height;
+
+ ++i;
+ }
+ }
+
+ meta_XFree (infos);
+ }
+ else
+ {
+ meta_topic (META_DEBUG_XINERAMA,
+ "No Xinerama extension on display %s\n",
+ display->name);
+ }
+#else
+ meta_topic (META_DEBUG_XINERAMA,
+ "Metacity compiled without Xinerama support\n");
+#endif
+
+ /* If no Xinerama, fill in the single screen info so
+ * we can use the field unconditionally
+ */
+ if (screen->n_xinerama_infos == 0)
+ {
+ meta_topic (META_DEBUG_XINERAMA,
+ "No Xinerama screens, using default screen info\n");
+
+ screen->xinerama_infos = g_new (MetaXineramaScreenInfo, 1);
+ screen->n_xinerama_infos = 1;
+
+ screen->xinerama_infos[0].number = 0;
+ screen->xinerama_infos[0].x_origin = 0;
+ screen->xinerama_infos[0].y_origin = 0;
+ screen->xinerama_infos[0].width = screen->width;
+ screen->xinerama_infos[0].height = screen->height;
+ }
+
+ g_assert (screen->n_xinerama_infos > 0);
+ g_assert (screen->xinerama_infos != NULL);
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);