X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=a65e7400313367609d03a8f92eab07494350423c;hb=dc43b74abdfdf9f8d847ba562accd8ea6dcd52b1;hp=849d87e36235ef35856b3513c084878662529d62;hpb=0e9bd66b75725b4d6632eafcaeb34b9fe310e4ea;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 849d87e3..a65e7400 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -77,7 +77,6 @@ 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) { @@ -472,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); @@ -507,29 +506,17 @@ void client_unmanage(ObClient *self) g_assert(self != NULL); - /* update the focus lists */ - focus_order_remove(self); + frame_hide(self->frame); + /* sync to send the hide to the server quickly, and to get back the enter + events */ + XSync(ob_display, FALSE); if (focus_client == self) { - XEvent e; - - /* 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); + /* ignore enter events from the unmap so it doesnt mess with the focus + */ + event_ignore_queued_enters(); } - /* 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); @@ -540,6 +527,9 @@ void client_unmanage(ObClient *self) /* we dont want events no more */ XSelectInput(ob_display, self->window, NoEventMask); + /* update the focus lists */ + focus_order_remove(self); + client_list = g_list_remove(client_list, self); stacking_remove(self); g_hash_table_remove(window_map, &self->window); @@ -639,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) @@ -3013,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) { @@ -3048,19 +3041,6 @@ 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 = focus_client ? focus_client->user_time : CurrentTime;