diff options
| author | Dana Jansens <danakj@orodu.net> | 2007-07-23 21:32:31 -0400 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2008-01-20 01:36:54 -0500 |
| commit | 32a92abf7578ea93d85741b7c89a0958082aa9ee (patch) | |
| tree | f8947a21386d8153350441653c216d3a93d53495 /openbox/screen.c | |
| parent | 27274cff9c3ee668be0aa71ff4a72979a13cb4ca (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.c | 56 |
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]); |
