X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=cbcaad798604af9eb61d2a119c3459aa6ea9e222;hb=6cf3357036561134383198cc8b853abb3fe5a982;hp=5050a68525851b5b7a3fd844b66b5496af24a646;hpb=50d662681160c309ea86268c0d05794b87b75593;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 5050a685..cbcaad79 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -30,8 +30,10 @@ #include "frame.h" #include "event.h" #include "focus.h" +#include "focus_cycle.h" #include "popup.h" -#include "render/render.h" +#include "version.h" +#include "obrender/render.h" #include "gettext.h" #include "obt/display.h" #include "obt/prop.h" @@ -77,6 +79,7 @@ static GSList *struts_right = NULL; static GSList *struts_bottom = NULL; static ObPagerPopup *desktop_popup; +static gboolean desktop_popup_perm; /*! The number of microseconds that you need to be on a desktop before it will replace the remembered "last desktop" */ @@ -292,15 +295,21 @@ gboolean screen_annex(void) supported[i++] = OBT_PROP_ATOM(OB_THEME); supported[i++] = OBT_PROP_ATOM(OB_CONFIG_FILE); supported[i++] = OBT_PROP_ATOM(OB_CONTROL); - supported[i++] = OBT_PROP_ATOM(OB_ROLE); - supported[i++] = OBT_PROP_ATOM(OB_NAME); - supported[i++] = OBT_PROP_ATOM(OB_CLASS); + supported[i++] = OBT_PROP_ATOM(OB_VERSION); + supported[i++] = OBT_PROP_ATOM(OB_APP_ROLE); + supported[i++] = OBT_PROP_ATOM(OB_APP_TITLE); + supported[i++] = OBT_PROP_ATOM(OB_APP_NAME); + supported[i++] = OBT_PROP_ATOM(OB_APP_CLASS); + supported[i++] = OBT_PROP_ATOM(OB_APP_TYPE); g_assert(i == num_support); OBT_PROP_SETA32(obt_root(ob_screen), NET_SUPPORTED, ATOM, supported, num_support); g_free(supported); + OBT_PROP_SETS(RootWindow(obt_display, ob_screen), OB_VERSION, utf8, + OPENBOX_VERSION); + screen_tell_ksplash(); return TRUE; @@ -347,6 +356,7 @@ void screen_startup(gboolean reconfig) gboolean namesexist = FALSE; desktop_popup = pager_popup_new(); + desktop_popup_perm = FALSE; pager_popup_height(desktop_popup, POPUP_HEIGHT); if (reconfig) { @@ -677,7 +687,7 @@ void screen_set_desktop(guint num, gboolean dofocus) ob_debug("Moving to desktop %d", num+1); if (ob_state() == OB_STATE_RUNNING) - screen_show_desktop_popup(screen_desktop); + screen_show_desktop_popup(screen_desktop, FALSE); /* ignore enter events caused by the move */ ignore_start = event_start_ignore_all_enters(); @@ -701,19 +711,24 @@ void screen_set_desktop(guint num, gboolean dofocus) for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; - client_hide(c); - if (c == focus_client) { - /* c was focused and we didn't do fallback clearly so make sure - openbox doesnt still consider the window focused. - this happens when using NextWindow with allDesktops, since - it doesnt want to move focus on desktop change, but the - focus is not going to stay with the current window, which - has now disappeared */ - focus_set_client(NULL); + if (client_hide(c)) { + if (c == focus_client) { + /* c was focused and we didn't do fallback clearly so make + sure openbox doesnt still consider the window focused. + this happens when using NextWindow with allDesktops, + since it doesnt want to move focus on desktop change, + but the focus is not going to stay with the current + window, which has now disappeared. + only do this if the client was actually hidden, + otherwise it can keep focus. */ + focus_set_client(NULL); + } } } } + focus_cycle_addremove(NULL, TRUE); + event_end_ignore_all_enters(ignore_start); if (event_curtime != CurrentTime) @@ -922,7 +937,7 @@ static gboolean hide_desktop_popup_func(gpointer data) return FALSE; /* don't repeat */ } -void screen_show_desktop_popup(guint d) +void screen_show_desktop_popup(guint d, gboolean perm) { Rect *a; @@ -942,9 +957,15 @@ void screen_show_desktop_popup(guint d) pager_popup_show(desktop_popup, screen_desktop_names[d], d); obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func); - obt_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000, - hide_desktop_popup_func, desktop_popup, - g_direct_equal, NULL); + if (!perm && !desktop_popup_perm) + /* only hide if its not already being show permanently */ + obt_main_loop_timeout_add(ob_main_loop, + config_desktop_popup_time * 1000, + hide_desktop_popup_func, desktop_popup, + g_direct_equal, NULL); + if (perm) + desktop_popup_perm = TRUE; + g_free(a); } @@ -953,6 +974,7 @@ void screen_hide_desktop_popup(void) obt_main_loop_timeout_remove_data(ob_main_loop, hide_desktop_popup_func, desktop_popup, FALSE); pager_popup_hide(desktop_popup); + desktop_popup_perm = FALSE; } guint screen_find_desktop(guint from, ObDirection dir, @@ -1346,10 +1368,9 @@ static void get_xinerama_screens(Rect **xin_areas, guint *nxin) void screen_update_areas(void) { - guint j; + guint i; gulong *dims; GList *it; - GSList *sit; g_free(monitor_area); get_xinerama_screens(&monitor_area, &screen_num_monitors); @@ -1364,8 +1385,6 @@ void screen_update_areas(void) 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); - RESET_STRUT_LIST(struts_left); RESET_STRUT_LIST(struts_top); RESET_STRUT_LIST(struts_right); @@ -1410,48 +1429,14 @@ void screen_update_areas(void) VALIDATE_STRUTS(struts_bottom, bottom, monitor_area[screen_num_monitors].height / 2); - /* set up the work area to be full screen across all monitors */ - for (j = 0; j < screen_num_desktops; ++j) { - dims[j*4 + 0] = - monitor_area[screen_num_monitors].x; - dims[j*4 + 1] = - monitor_area[screen_num_monitors].y; - dims[j*4 + 2] = - monitor_area[screen_num_monitors].width; - dims[j*4 + 3] = - monitor_area[screen_num_monitors].height; - } - - /* calculate the work area from the struts */ - for (j = 0; j < screen_num_desktops; ++j) { - gint l = 0, r = 0, t = 0, b = 0; - - for (sit = struts_left; sit; sit = g_slist_next(sit)) { - ObScreenStrut *s = sit->data; - if (s->desktop == j || s->desktop == DESKTOP_ALL) - l = MAX(l, s->strut->left); - } - for (sit = struts_top; sit; sit = g_slist_next(sit)) { - ObScreenStrut *s = sit->data; - if (s->desktop == j || s->desktop == DESKTOP_ALL) - t = MAX(t, s->strut->top); - } - for (sit = struts_right; sit; sit = g_slist_next(sit)) { - ObScreenStrut *s = sit->data; - if (s->desktop == j || s->desktop == DESKTOP_ALL) - r = MAX(r, s->strut->right); - } - for (sit = struts_bottom; sit; sit = g_slist_next(sit)) { - ObScreenStrut *s = sit->data; - if (s->desktop == j || s->desktop == DESKTOP_ALL) - b = MAX(b, s->strut->bottom); - } - - /* based on these margins, set the work area for the desktop */ - dims[j*4 + 0] += l; - dims[j*4 + 1] += t; - dims[j*4 + 2] -= l + r; - dims[j*4 + 3] -= t + b; + dims = g_new(gulong, 4 * screen_num_desktops); + for (i = 0; i < screen_num_desktops; ++i) { + Rect *area = screen_area(i, SCREEN_AREA_ALL_MONITORS, NULL); + dims[i*4+0] = area->x; + dims[i*4+1] = area->y; + dims[i*4+2] = area->width; + dims[i*4+3] = area->height; + g_free(area); } /* set the legacy workarea hint to the union of all the monitors */