X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=013836d11cf47c0a478cb1a64f7988dcbd7bf616;hb=f999797f01755dcb5de3db010ad282feb8e3ac37;hp=df658ccdb62bde6c184fedf063a8e1c7be1fd30a;hpb=d713bdf4623aa46676f95d1f38618b219ea5d9c9;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index df658ccd..013836d1 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -41,6 +41,10 @@ #include "mouse.h" #include "render/render.h" +#ifdef HAVE_UNISTD_H +# include +#endif + #include #include @@ -70,6 +74,7 @@ static void client_get_layer(ObClient *self); static void client_get_shaped(ObClient *self); static void client_get_mwm_hints(ObClient *self); static void client_get_gravity(ObClient *self); +static void client_get_client_machine(ObClient *self); static void client_change_allowed_actions(ObClient *self); static void client_change_state(ObClient *self); static void client_change_wm_state(ObClient *self); @@ -77,7 +82,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 +476,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 +511,20 @@ void client_unmanage(ObClient *self) g_assert(self != NULL); - /* update the focus lists */ - focus_order_remove(self); + /* we dont want events no more. do this before hiding the frame so we + don't generate more events */ + XSelectInput(ob_display, self->window, NoEventMask); - if (focus_client == self) { - XEvent e; + frame_hide(self->frame); + /* flush to send the hide to the server quickly */ + XFlush(ob_display); - /* 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); + if (focus_client == 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); @@ -537,8 +532,8 @@ void client_unmanage(ObClient *self) /* remove the window from our save set */ XChangeSaveSet(ob_display, self->window, SetModeDelete); - /* 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); @@ -634,14 +629,12 @@ void client_unmanage(ObClient *self) g_free(self->name); g_free(self->class); g_free(self->role); + g_free(self->client_machine); g_free(self->sm_client_id); g_free(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) @@ -946,6 +939,7 @@ static void client_get_all(ObClient *self) (min/max sizes), so we're ready to set up the decorations/functions */ client_setup_decor_and_functions(self); + client_get_client_machine(self); client_update_title(self); client_update_class(self); client_update_sm_client_id(self); @@ -1654,6 +1648,7 @@ void client_update_wmhints(ObClient *self) void client_update_title(ObClient *self) { gchar *data = NULL; + gchar *visible = NULL; g_free(self->title); @@ -1673,8 +1668,14 @@ void client_update_title(ObClient *self) } } - PROP_SETS(self->window, net_wm_visible_name, data); - self->title = data; + if (self->client_machine) { + visible = g_strdup_printf("%s (%s)", data, self->client_machine); + g_free(data); + } else + visible = data; + + PROP_SETS(self->window, net_wm_visible_name, visible); + self->title = visible; if (self->frame) frame_adjust_title(self->frame); @@ -1873,6 +1874,21 @@ void client_update_user_time(ObClient *self) } } +static void client_get_client_machine(ObClient *self) +{ + gchar *data = NULL; + gchar localhost[128]; + + g_free(self->client_machine); + + if (PROP_GETS(self->window, wm_client_machine, locale, &data)) { + gethostname(localhost, 127); + localhost[127] = '\0'; + if (strcmp(localhost, data)) + self->client_machine = data; + } +} + static void client_change_wm_state(ObClient *self) { gulong state[2]; @@ -3013,11 +3029,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 +3070,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; @@ -3341,7 +3350,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); }