X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fscreen.c;h=d69b2447cec1499a99c329a50112076675c53b55;hb=64adc0eeba598cb1469b2140777fba30e3053f0e;hp=5074f18606c39e5684d6139250f6a09155cf07de;hpb=501943b53d68821a752ceda3fbd9b64bbcae4a4c;p=chaz%2Fopenbox diff --git a/openbox/screen.c b/openbox/screen.c index 5074f186..d69b2447 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" @@ -293,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; @@ -703,18 +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; - if (client_hide(c) && 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) @@ -925,7 +939,7 @@ static gboolean hide_desktop_popup_func(gpointer data) void screen_show_desktop_popup(guint d, gboolean perm) { - Rect *a; + Rect const *a; /* 0 means don't show the popup */ if (!config_desktop_popup_time) return; @@ -949,8 +963,8 @@ void screen_show_desktop_popup(guint d, gboolean perm) config_desktop_popup_time * 1000, hide_desktop_popup_func, desktop_popup, g_direct_equal, NULL); - - g_free(a); + if (perm) + desktop_popup_perm = TRUE; } void screen_hide_desktop_popup(void) @@ -1282,11 +1296,14 @@ typedef struct { } ObScreenStrut; #define RESET_STRUT_LIST(sl) \ - (g_slist_free(sl), sl = NULL) + while (sl) { \ + g_slice_free(ObScreenStrut, (sl)->data); \ + sl = g_slist_delete_link(sl, sl); \ + } #define ADD_STRUT_TO_LIST(sl, d, s) \ { \ - ObScreenStrut *ss = g_new(ObScreenStrut, 1); \ + ObScreenStrut *ss = g_slice_new(ObScreenStrut); \ ss->desktop = d; \ ss->strut = s; \ sl = g_slist_prepend(sl, ss); \ @@ -1420,7 +1437,7 @@ void screen_update_areas(void) dims[i*4+1] = area->y; dims[i*4+2] = area->width; dims[i*4+3] = area->height; - g_free(area); + g_slice_free(Rect, area); } /* set the legacy workarea hint to the union of all the monitors */ @@ -1592,7 +1609,7 @@ Rect* screen_area(guint desktop, guint head, Rect *search) } } - a = g_new(Rect, 1); + a = g_slice_new(Rect); a->x = l; a->y = t; a->width = r - l + 1; @@ -1600,14 +1617,14 @@ Rect* screen_area(guint desktop, guint head, Rect *search) return a; } -guint screen_find_monitor(Rect *search) +guint screen_find_monitor(const Rect const *search) { guint i; guint most = screen_num_monitors; guint mostv = 0; for (i = 0; i < screen_num_monitors; ++i) { - Rect *area = screen_physical_area_monitor(i); + Rect const *area = screen_physical_area_monitor(i); if (RECT_INTERSECTS_RECT(*area, *search)) { Rect r; guint v; @@ -1620,24 +1637,20 @@ guint screen_find_monitor(Rect *search) most = i; } } - g_free(area); } return most; } -Rect* screen_physical_area_all_monitors(void) +Rect const* screen_physical_area_all_monitors(void) { return screen_physical_area_monitor(screen_num_monitors); } -Rect* screen_physical_area_monitor(guint head) +Rect const* screen_physical_area_monitor(guint head) { - Rect *a; g_assert(head <= screen_num_monitors); - a = g_new(Rect, 1); - *a = monitor_area[head]; - return a; + return &monitor_area[head]; } gboolean screen_physical_area_monitor_contains(guint head, Rect *search) @@ -1657,7 +1670,7 @@ guint screen_monitor_active(void) return screen_monitor_pointer(); } -Rect* screen_physical_area_active(void) +Rect const* screen_physical_area_active(void) { return screen_physical_area_monitor(screen_monitor_active()); } @@ -1678,7 +1691,7 @@ guint screen_monitor_primary(gboolean fixed) return screen_monitor_pointer(); } -Rect *screen_physical_area_primary(gboolean fixed) +Rect const *screen_physical_area_primary(gboolean fixed) { return screen_physical_area_monitor(screen_monitor_primary(fixed)); }