X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=b53671fabbaad8889c8f6cbf04e74c78963818c0;hb=4bf6b1b551be744be4fbe4d1faab5be12d051378;hp=09d5003c4eeaba5d52964ec6e672fa713563606a;hpb=a170ad7c85b5f23fafe64d28a3f183a7ce42ce53;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 09d5003c..b53671fa 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -31,7 +31,6 @@ #include "event.h" #include "focus.h" #include "popup.h" -#include "hooks.h" #include "render/render.h" #include "gettext.h" #include "obt/display.h" @@ -57,7 +56,7 @@ static void screen_tell_ksplash(void); static void screen_fallback_focus(void); guint screen_num_desktops; -guint screen_num_monitors; +guint screen_num_monitors = 0; guint screen_desktop; guint screen_last_desktop; gboolean screen_showing_desktop; @@ -77,7 +76,7 @@ static GSList *struts_left = NULL; static GSList *struts_right = NULL; static GSList *struts_bottom = NULL; -static ObPagerPopup **desktop_popup; +static ObPagerPopup **desktop_popup = NULL; /*! The number of microseconds that you need to be on a desktop before it will replace the remembered "last desktop" */ @@ -346,20 +345,19 @@ void screen_startup(gboolean reconfig) if (reconfig) { guint i; + + /* recreate the pager popups to use any new theme stuff. it was + freed in screen_shutdown() already. */ desktop_popup = g_new(ObPagerPopup*, screen_num_monitors); for (i = 0; i < screen_num_monitors; i++) { desktop_popup[i] = pager_popup_new(); pager_popup_height(desktop_popup[i], POPUP_HEIGHT); - - /* update the pager popup's width */ pager_popup_text_width_to_strings(desktop_popup[i], screen_desktop_names, screen_num_desktops); } return; - } else { - desktop_popup = NULL; } /* get the initial size */ @@ -450,10 +448,10 @@ void screen_shutdown(gboolean reconfig) { guint i; - for (i = 0; i < screen_num_monitors; i++) { + for (i = 0; i < screen_num_monitors; i++) pager_popup_free(desktop_popup[i]); - } g_free(desktop_popup); + desktop_popup = NULL; if (reconfig) return; @@ -499,13 +497,13 @@ void screen_resize(void) screen_update_areas(); dock_configure(); + /* make sure all windows are visible */ for (it = client_list; it; it = g_list_next(it)) client_move_onscreen(it->data, FALSE); } void screen_set_num_desktops(guint num) { - guint old; gulong *viewport; GList *it, *stacking_copy; @@ -513,7 +511,6 @@ void screen_set_num_desktops(guint num) if (screen_num_desktops == num) return; - old = screen_num_desktops; screen_num_desktops = num; OBT_PROP_SET32(obt_root(ob_screen), NET_NUMBER_OF_DESKTOPS, CARDINAL, num); @@ -721,8 +718,6 @@ void screen_set_desktop(guint num, gboolean dofocus) if (event_curtime != CurrentTime) screen_desktop_user_time = event_curtime; - - hooks_queue(OB_HOOK_SCREEN_DESK_CHANGE, NULL); } void screen_add_desktop(gboolean current) @@ -1377,22 +1372,32 @@ static void get_xinerama_screens(Rect **xin_areas, guint *nxin) void screen_update_areas(void) { - guint i, j; + guint i, j, onum; gulong *dims; GList *it; GSList *sit; + onum = screen_num_monitors; + g_free(monitor_area); get_xinerama_screens(&monitor_area, &screen_num_monitors); - if (!desktop_popup) { - desktop_popup = g_new(ObPagerPopup*, screen_num_monitors); - for (i = 0; i < screen_num_monitors; i++) { + if (screen_num_monitors < onum) { + /* free some of the pager popups */ + for (i = screen_num_monitors; i < onum; ++i) + pager_popup_free(desktop_popup[i]); + desktop_popup = g_renew(ObPagerPopup*, desktop_popup, + screen_num_monitors); + } + else { + /* add some more pager popups */ + desktop_popup = g_renew(ObPagerPopup*, desktop_popup, + screen_num_monitors); + for (i = onum; i < screen_num_monitors; ++i) { desktop_popup[i] = pager_popup_new(); pager_popup_height(desktop_popup[i], POPUP_HEIGHT); - - if (screen_desktop_names) - /* update the pager popup's width */ + if (screen_desktop_names) /* the areas are initialized before the + desktop names */ pager_popup_text_width_to_strings(desktop_popup[i], screen_desktop_names, screen_num_desktops); @@ -1496,6 +1501,9 @@ void screen_update_areas(void) b = MAX(b, s->strut->bottom); } + /* if the monitor is not against the edge of the root window, + the struts will include the distance from the root window's edge + to the monitor, so add that back into the monitor's work area */ if (l) l += RECT_LEFT (monitor_area[screen_num_monitors]) - RECT_LEFT (monitor_area[i]); if (t) t += RECT_TOP (monitor_area[screen_num_monitors]) @@ -1582,7 +1590,7 @@ Rect* screen_area(guint desktop, guint head, Rect *search) { Rect *a; GSList *it; - gint l, r, t, b, al, ar, at, ab; + gint l, r, t, b; guint i, d; gboolean us = search != NULL; /* user provided search */ @@ -1608,30 +1616,30 @@ Rect* screen_area(guint desktop, guint head, Rect *search) /* only include monitors which the search area lines up with */ if (RECT_INTERSECTS_RECT(monitor_area[screen_num_monitors], *search)) { - al = l = RECT_RIGHT(monitor_area[screen_num_monitors]); - at = t = RECT_BOTTOM(monitor_area[screen_num_monitors]); - ar = r = RECT_LEFT(monitor_area[screen_num_monitors]); - ab = b = RECT_TOP(monitor_area[screen_num_monitors]); + l = RECT_RIGHT(monitor_area[screen_num_monitors]); + t = RECT_BOTTOM(monitor_area[screen_num_monitors]); + r = RECT_LEFT(monitor_area[screen_num_monitors]); + b = RECT_TOP(monitor_area[screen_num_monitors]); for (i = 0; i < screen_num_monitors; ++i) { /* add the monitor if applicable */ if (RANGES_INTERSECT(search->x, search->width, monitor_area[i].x, monitor_area[i].width)) { - at = t = MIN(t, RECT_TOP(monitor_area[i])); - ab = b = MAX(b, RECT_BOTTOM(monitor_area[i])); + t = MIN(t, RECT_TOP(monitor_area[i])); + b = MAX(b, RECT_BOTTOM(monitor_area[i])); } if (RANGES_INTERSECT(search->y, search->height, monitor_area[i].y, monitor_area[i].height)) { - al = l = MIN(l, RECT_LEFT(monitor_area[i])); - ar = r = MAX(r, RECT_RIGHT(monitor_area[i])); + l = MIN(l, RECT_LEFT(monitor_area[i])); + r = MAX(r, RECT_RIGHT(monitor_area[i])); } } } else { - al = l = RECT_LEFT(monitor_area[screen_num_monitors]); - at = t = RECT_TOP(monitor_area[screen_num_monitors]); - ar = r = RECT_RIGHT(monitor_area[screen_num_monitors]); - ab = b = RECT_BOTTOM(monitor_area[screen_num_monitors]); + l = RECT_LEFT(monitor_area[screen_num_monitors]); + t = RECT_TOP(monitor_area[screen_num_monitors]); + r = RECT_RIGHT(monitor_area[screen_num_monitors]); + b = RECT_BOTTOM(monitor_area[screen_num_monitors]); } for (d = 0; d < screen_num_desktops; ++d) {