X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=707d0b6b29fb649c9a4e897af168e4c38bdc14cb;hb=c6f2875d61ce038bcc3b28e28aa26a0648efd752;hp=1a01bfbfeee22969856e81d544134e403ff8d08f;hpb=97792a403a52c12c2601a7b2caebdea197f0b5f0;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 1a01bfbf..707d0b6b 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -27,7 +27,6 @@ #include "moveresize.h" #include "config.h" #include "screen.h" -#include "composite.h" #include "client.h" #include "session.h" #include "frame.h" @@ -491,9 +490,6 @@ void screen_resize() for (it = client_list; it; it = g_list_next(it)) client_move_onscreen(it->data, FALSE); - - /* this needs to be setup whenever the root window's size changes */ - composite_setup_root_window(); } void screen_set_num_desktops(guint num) @@ -1199,6 +1195,15 @@ typedef struct { sl = g_slist_prepend(sl, ss); \ } +#define VALIDATE_STRUTS(sl, side, max) \ +{ \ + GSList *it; \ + for (it = sl; it; it = g_slist_next(it)) { \ + ObScreenStrut *ss = it->data; \ + ss->strut->side = MIN(max, ss->strut->side); \ + } \ +} + void screen_update_areas() { guint i, j; @@ -1206,11 +1211,19 @@ void screen_update_areas() GList *it; GSList *sit; - ob_debug("updating screen areas\n"); - g_free(monitor_area); extensions_xinerama_screens(&monitor_area, &screen_num_monitors); + /* set up the user-specified margins */ + config_margins.top_start = RECT_LEFT(monitor_area[screen_num_monitors]); + config_margins.top_end = RECT_RIGHT(monitor_area[screen_num_monitors]); + config_margins.bottom_start = RECT_LEFT(monitor_area[screen_num_monitors]); + config_margins.bottom_end = RECT_RIGHT(monitor_area[screen_num_monitors]); + config_margins.left_start = RECT_TOP(monitor_area[screen_num_monitors]); + config_margins.left_end = RECT_BOTTOM(monitor_area[screen_num_monitors]); + config_margins.right_start = RECT_TOP(monitor_area[screen_num_monitors]); + config_margins.right_end = RECT_BOTTOM(monitor_area[screen_num_monitors]); + dims = g_new(gulong, 4 * screen_num_desktops * screen_num_monitors); RESET_STRUT_LIST(struts_left); @@ -1239,6 +1252,24 @@ void screen_update_areas() if (dock_strut.bottom) ADD_STRUT_TO_LIST(struts_bottom, DESKTOP_ALL, &dock_strut); + if (config_margins.left) + ADD_STRUT_TO_LIST(struts_left, DESKTOP_ALL, &config_margins); + if (config_margins.top) + ADD_STRUT_TO_LIST(struts_top, DESKTOP_ALL, &config_margins); + if (config_margins.right) + ADD_STRUT_TO_LIST(struts_right, DESKTOP_ALL, &config_margins); + if (config_margins.bottom) + ADD_STRUT_TO_LIST(struts_bottom, DESKTOP_ALL, &config_margins); + + VALIDATE_STRUTS(struts_left, left, + monitor_area[screen_num_monitors].width / 2); + VALIDATE_STRUTS(struts_right, right, + monitor_area[screen_num_monitors].width / 2); + VALIDATE_STRUTS(struts_top, top, + monitor_area[screen_num_monitors].height / 2); + VALIDATE_STRUTS(struts_bottom, bottom, + monitor_area[screen_num_monitors].height / 2); + /* set up the work areas to be full screen */ for (i = 0; i < screen_num_monitors; ++i) for (j = 0; j < screen_num_desktops; ++j) { @@ -1288,8 +1319,10 @@ void screen_update_areas() dims[(i * screen_num_desktops + j) * 4 + 3] -= t + b; } + /* all the work areas are not used here, only the ones for the first + monitor are */ PROP_SETA32(RootWindow(ob_display, ob_screen), net_workarea, cardinal, - dims, 4 * screen_num_desktops * screen_num_monitors); + dims, 4 * screen_num_desktops); /* the area has changed, adjust all the windows if they need it */ for (it = client_list; it; it = g_list_next(it))