X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=e7af570150a7040868231c41851ef0f8fb889c54;hb=48f237203b8766e7d13af3f6e2d5deecc14b6651;hp=9d679738fee34f1523f72d488e9e6b6060e6acf1;hpb=90cd9c62192194d1b3ab868a77fe56a9b1e215c2;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 9d679738..e7af5701 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -18,7 +18,6 @@ */ #include "client.h" -#include "client_time_heap.h" #include "debug.h" #include "startupnotify.h" #include "dock.h" @@ -58,7 +57,6 @@ typedef struct } Destructor; GList *client_list = NULL; -ObClientTimeHeap *client_user_times = NULL; static GSList *client_destructors = NULL; @@ -79,19 +77,16 @@ static void client_apply_startup_state(ObClient *self, gint x, gint y); static void client_restore_session_state(ObClient *self); static void client_restore_session_stacking(ObClient *self); static ObAppSettings *client_get_settings_state(ObClient *self); -static void client_unfocus(ObClient *self); void client_startup(gboolean reconfig) { if (reconfig) return; - client_user_times = client_time_heap_new(); client_set_list(); } void client_shutdown(gboolean reconfig) { - client_time_heap_free(client_user_times); } void client_add_destructor(ObClientDestructor func, gpointer data) @@ -406,10 +401,12 @@ void client_manage(Window window) mouse_grab_for_client(self, TRUE); if (activate) { + guint32 last_time = focus_client ? + focus_client->user_time : CurrentTime; + /* This is focus stealing prevention */ ob_debug("Want to focus new window 0x%x with time %u (last time %u)\n", - self->window, self->user_time, - client_time_heap_maximum(client_user_times)); + self->window, self->user_time, last_time); /* If a nothing at all, or a parent was focused, then focus this always @@ -418,7 +415,6 @@ void client_manage(Window window) activate = TRUE; else { - guint32 last_time = client_time_heap_maximum(client_user_times); /* If time stamp is old, don't steal focus */ if (self->user_time && last_time && !event_time_after(self->user_time, last_time)) @@ -441,8 +437,7 @@ void client_manage(Window window) } else { ob_debug("Focus stealing prevention activated for %s with time %u " "(last time %u)\n", - self->title, self->user_time, - client_time_heap_maximum(client_user_times)); + self->title, self->user_time, last_time); /* if the client isn't focused, then hilite it so the user knows it is there */ client_hilite(self, TRUE); @@ -476,7 +471,7 @@ void client_manage(Window window) client_focus(self); } - /* client_activate does this but we aret using it so we have to do it + /* client_activate does this but we aren't using it so we have to do it here as well */ if (screen_showing_desktop) screen_show_desktop(FALSE); @@ -511,8 +506,8 @@ void client_unmanage(ObClient *self) g_assert(self != NULL); - /* update the focus lists */ - focus_order_remove(self); + frame_hide(self->frame); + XSync(ob_display, FALSE); if (focus_client == self) { XEvent e; @@ -520,20 +515,8 @@ void client_unmanage(ObClient *self) /* focus the last focused window on the desktop, and ignore enter events from the unmap so it doesnt mess with the focus */ while (XCheckTypedEvent(ob_display, EnterNotify, &e)); - /* remove these flags so we don't end up getting focused in the - fallback! */ - self->can_focus = FALSE; - self->focus_notify = FALSE; - self->modal = FALSE; - client_unfocus(self); } - /* potentially fix focusLast */ - if (config_focus_last) - grab_pointer(TRUE, OB_CURSOR_NONE); - - frame_hide(self->frame); - XFlush(ob_display); keyboard_grab_for_client(self, FALSE); mouse_grab_for_client(self, FALSE); @@ -544,8 +527,8 @@ void client_unmanage(ObClient *self) /* we dont want events no more */ XSelectInput(ob_display, self->window, NoEventMask); - /* remove from the time heap */ - client_time_heap_remove(client_user_times, self); + /* update the focus lists */ + focus_order_remove(self); client_list = g_list_remove(client_list, self); stacking_remove(self); @@ -646,9 +629,6 @@ void client_unmanage(ObClient *self) /* update the list hints */ client_set_list(); - - if (config_focus_last) - grab_pointer(FALSE, OB_CURSOR_NONE); } static ObAppSettings *client_get_settings_state(ObClient *self) @@ -1866,7 +1846,6 @@ void client_update_user_time(ObClient *self) guint32 time; if (PROP_GET32(self->window, net_wm_user_time, cardinal, &time)) { - guint32 otime = self->user_time; /* we set this every time, not just when it grows, because in practice sometimes time goes backwards! (ntpdate.. yay....) so.. if it goes backward we don't want all windows to stop focusing. we'll just @@ -1874,22 +1853,9 @@ void client_update_user_time(ObClient *self) would be pretty stupid anyways */ self->user_time = time; - /* adjust the time heap - windows with CurrentTime for their user_time - are not in the heap */ - if (time == CurrentTime && otime != CurrentTime) - client_time_heap_remove(client_user_times, self); - else if (time != CurrentTime && otime == CurrentTime) - client_time_heap_add(client_user_times, self); - else if (time != CurrentTime && otime != CurrentTime) { - if (event_time_after(time, otime)) - client_time_heap_increase_key(client_user_times, self); - else - client_time_heap_decrease_key(client_user_times, self); - } /* ob_debug("window %s user time %u\n", self->title, time); - ob_debug("last user time %u\n", client_time_heap_maximum(client_user_times)); */ } } @@ -3034,11 +3000,17 @@ gboolean client_focus(ObClient *self) return FALSE; } - ob_debug("Focusing client \"%s\" at time %u\n", self->title, event_curtime); + ob_debug_type(OB_DEBUG_FOCUS, + "Focusing client \"%s\" at time %u\n", + self->title, event_curtime); if (self->can_focus) { + /* This can cause a BadMatch error with CurrentTime, or if an app + passed in a bad time for _NET_WM_ACTIVE_WINDOW. */ + xerror_set_ignore(TRUE); XSetInputFocus(ob_display, self->window, RevertToPointerRoot, event_curtime); + xerror_set_ignore(FALSE); } if (self->focus_notify) { @@ -3069,22 +3041,9 @@ gboolean client_focus(ObClient *self) return TRUE; } -/* Used when the current client is closed or otherwise hidden, focus_last will - then prevent focus from going to the mouse pointer -*/ -static void client_unfocus(ObClient *self) -{ - if (focus_client == self) { -#ifdef DEBUG_FOCUS - ob_debug("client_unfocus for %lx\n", self->window); -#endif - focus_fallback(FALSE); - } -} - void client_activate(ObClient *self, gboolean here, gboolean user) { - guint32 last_time; + guint32 last_time = focus_client ? focus_client->user_time : CurrentTime; /* XXX do some stuff here if user is false to determine if we really want to activate it or not (a parent or group member is currently @@ -3092,11 +3051,9 @@ void client_activate(ObClient *self, gboolean here, gboolean user) */ ob_debug("Want to activate window 0x%x with time %u (last time %u), " "source=%s\n", - self->window, event_curtime, - client_time_heap_maximum(client_user_times), + self->window, event_curtime, last_time, (user ? "user" : "application")); - last_time = client_time_heap_maximum(client_user_times); if (!user && event_curtime && last_time && !event_time_after(event_curtime, last_time)) { @@ -3364,7 +3321,7 @@ GSList *client_search_all_top_parents(ObClient *self) for (it = self->group->members; it; it = g_slist_next(it)) { ObClient *c = it->data; - if (!c->transient_for) + if (!c->transient_for && client_normal(c)) ret = g_slist_prepend(ret, c); }