summaryrefslogtreecommitdiff
path: root/openbox/screen.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-07-23 21:32:31 -0400
committerDana Jansens <danakj@orodu.net>2008-01-20 01:36:54 -0500
commit32a92abf7578ea93d85741b7c89a0958082aa9ee (patch)
treef8947a21386d8153350441653c216d3a93d53495 /openbox/screen.c
parent27274cff9c3ee668be0aa71ff4a72979a13cb4ca (diff)
move the code for tracking what extensions are available on the display into the libobt
Diffstat (limited to 'openbox/screen.c')
-rw-r--r--openbox/screen.c56
1 files changed, 52 insertions, 4 deletions
diff --git a/openbox/screen.c b/openbox/screen.c
index d287c9fc..0d891630 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -33,7 +33,6 @@
#include "event.h"
#include "focus.h"
#include "popup.h"
-#include "extensions.h"
#include "render/render.h"
#include "gettext.h"
#include "obt/display.h"
@@ -110,7 +109,7 @@ static gboolean replace_wm(void)
XSync(ob_display, FALSE);
obt_display_ignore_errors(ob_display, FALSE);
- if (obt_display_error_occured())
+ if (obt_display_error_occured)
current_wm_sn_owner = None;
}
@@ -184,7 +183,7 @@ gboolean screen_annex(void)
XSelectInput(ob_display, RootWindow(ob_display, ob_screen),
ROOT_EVENTMASK);
obt_display_ignore_errors(ob_display, FALSE);
- if (obt_display_error_occured()) {
+ if (obt_display_error_occured) {
g_message(_("A window manager is already running on screen %d"),
ob_screen);
@@ -1291,6 +1290,55 @@ typedef struct {
} \
}
+static void get_xinerama_screens(Rect **xin_areas, guint *nxin)
+{
+ guint i;
+ gint l, r, t, b;
+
+ if (ob_debug_xinerama) {
+ g_print("Using fake xinerama !\n");
+ gint w = WidthOfScreen(ScreenOfDisplay(ob_display, ob_screen));
+ gint h = HeightOfScreen(ScreenOfDisplay(ob_display, ob_screen));
+ *nxin = 2;
+ *xin_areas = g_new(Rect, *nxin + 1);
+ RECT_SET((*xin_areas)[0], 0, 0, w/2, h);
+ RECT_SET((*xin_areas)[1], w/2, 0, w-(w/2), h);
+ }
+#ifdef XINERAMA
+ else if (obt_display_extension_xinerama) {
+ guint i;
+ gint n;
+ XineramaScreenInfo *info = XineramaQueryScreens(ob_display, &n);
+ *nxin = n;
+ *xin_areas = g_new(Rect, *nxin + 1);
+ for (i = 0; i < *nxin; ++i)
+ RECT_SET((*xin_areas)[i], info[i].x_org, info[i].y_org,
+ info[i].width, info[i].height);
+ XFree(info);
+ }
+#endif
+ else {
+ *nxin = 1;
+ *xin_areas = g_new(Rect, *nxin + 1);
+ RECT_SET((*xin_areas)[0], 0, 0,
+ WidthOfScreen(ScreenOfDisplay(ob_display, ob_screen)),
+ HeightOfScreen(ScreenOfDisplay(ob_display, ob_screen)));
+ }
+
+ /* returns one extra with the total area in it */
+ l = (*xin_areas)[0].x;
+ t = (*xin_areas)[0].y;
+ r = (*xin_areas)[0].x + (*xin_areas)[0].width - 1;
+ b = (*xin_areas)[0].y + (*xin_areas)[0].height - 1;
+ for (i = 1; i < *nxin; ++i) {
+ l = MIN(l, (*xin_areas)[i].x);
+ t = MIN(l, (*xin_areas)[i].y);
+ r = MAX(r, (*xin_areas)[i].x + (*xin_areas)[i].width - 1);
+ b = MAX(b, (*xin_areas)[i].y + (*xin_areas)[i].height - 1);
+ }
+ RECT_SET((*xin_areas)[*nxin], l, t, r - l + 1, b - t + 1);
+}
+
void screen_update_areas(void)
{
guint i, j;
@@ -1299,7 +1347,7 @@ void screen_update_areas(void)
GSList *sit;
g_free(monitor_area);
- extensions_xinerama_screens(&monitor_area, &screen_num_monitors);
+ get_xinerama_screens(&monitor_area, &screen_num_monitors);
/* set up the user-specified margins */
config_margins.top_start = RECT_LEFT(monitor_area[screen_num_monitors]);