X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=e0d5c215a9afd6b00797b8dce3f15672fe827fb1;hb=1e4215c5c63c53c199a3a5a177607de308c8a3f1;hp=b38a8e079645a3435b5fca34a6145e91a500b34f;hpb=de82c4a5dfd771b89b6f48b56fcb578d91bd6bed;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index b38a8e07..e0d5c215 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -2994,8 +2994,7 @@ void client_hilite(ObClient *self, gboolean hilite) void client_set_desktop_recursive(ObClient *self, guint target, - gboolean donthide, - gboolean focus_nonintrusive) + gboolean donthide) { guint old; GSList *it; @@ -3006,10 +3005,6 @@ void client_set_desktop_recursive(ObClient *self, g_assert(target < screen_num_desktops || target == DESKTOP_ALL); - /* remove from the old desktop(s) */ - if (!focus_nonintrusive) - focus_order_remove(self); - old = self->desktop; self->desktop = target; PROP_SET32(self->window, net_wm_desktop, cardinal, target); @@ -3024,14 +3019,6 @@ void client_set_desktop_recursive(ObClient *self, if (STRUT_EXISTS(self->strut)) screen_update_areas(); - /* add to the new desktop(s) */ - if (!focus_nonintrusive) { - if (config_focus_new) - focus_order_to_top(self); - else - focus_order_to_bottom(self); - } - /* call the notifies */ GSList *it; for (it = client_desktop_notifies; it; it = g_slist_next(it)) { @@ -3049,7 +3036,7 @@ void client_set_desktop_recursive(ObClient *self, } void client_set_desktop(ObClient *self, guint target, - gboolean donthide, gboolean focus_nonintrusive) + gboolean donthide) { self = client_search_top_normal_parent(self); client_set_desktop_recursive(self, target, donthide, focus_nonintrusive); @@ -3115,6 +3102,8 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) gboolean modal = self->modal; gboolean iconic = self->iconic; gboolean demands_attention = self->demands_attention; + gboolean above = self->above; + gboolean below = self->below; gint i; if (!(action == prop_atoms.net_wm_state_add || @@ -3191,11 +3180,11 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) } else if (state == prop_atoms.net_wm_state_fullscreen) { fullscreen = TRUE; } else if (state == prop_atoms.net_wm_state_above) { - self->above = TRUE; - self->below = FALSE; + above = TRUE; + below = FALSE; } else if (state == prop_atoms.net_wm_state_below) { - self->above = FALSE; - self->below = TRUE; + above = FALSE; + below = TRUE; } else if (state == prop_atoms.net_wm_state_demands_attention) { demands_attention = TRUE; } else if (state == prop_atoms.openbox_wm_state_undecorated) { @@ -3220,9 +3209,9 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) } else if (state == prop_atoms.net_wm_state_fullscreen) { fullscreen = FALSE; } else if (state == prop_atoms.net_wm_state_above) { - self->above = FALSE; + above = FALSE; } else if (state == prop_atoms.net_wm_state_below) { - self->below = FALSE; + below = FALSE; } else if (state == prop_atoms.net_wm_state_demands_attention) { demands_attention = FALSE; } else if (state == prop_atoms.openbox_wm_state_undecorated) { @@ -3267,6 +3256,12 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) if (demands_attention != self->demands_attention) client_hilite(self, demands_attention); + if (above != self->above || below != self->below) { + self->above = above; + self->below = below; + client_calc_layer(self); + } + client_change_state(self); /* change the hint to reflect these changes */ } @@ -3411,27 +3406,34 @@ static void client_present(ObClient *self, gboolean here, gboolean raise) void client_activate(ObClient *self, gboolean here, gboolean user) { guint32 last_time = focus_client ? focus_client->user_time : CurrentTime; + gboolean allow = FALSE; - /* 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 - active)? + /* if the request came from the user, or if nothing is focused, then grant + the request. + if the currently focused app doesn't set a user_time, then it can't + benefit from any focus stealing prevention. */ + if (user || !focus_client || !last_time) + allow = TRUE; + /* otherwise, if they didn't give a time stamp or if it is too old, they + don't get focus */ + else + allow = event_curtime && event_time_after(event_curtime, last_time); + ob_debug_type(OB_DEBUG_FOCUS, "Want to activate window 0x%x with time %u (last time %u), " - "source=%s\n", + "source=%s allowing? %d\n", self->window, event_curtime, last_time, - (user ? "user" : "application")); + (user ? "user" : "application"), allow); - if (!user && event_curtime && last_time && - !event_time_after(event_curtime, last_time)) - { - client_hilite(self, TRUE); - } else { + if (allow) { if (event_curtime != CurrentTime) self->user_time = event_curtime; client_present(self, here, TRUE); - } + } else + /* don't focus it but tell the user it wants attention */ + client_hilite(self, TRUE); } static void client_bring_helper_windows_recursive(ObClient *self, @@ -3445,7 +3447,8 @@ static void client_bring_helper_windows_recursive(ObClient *self, if (client_helper(self) && self->desktop != desktop && self->desktop != DESKTOP_ALL) { - client_set_desktop(self, desktop, FALSE, TRUE); + client_set_desktop(self, desktop, FALSE); +>>>>>>> .merge-right.r6182 } } @@ -3887,17 +3890,3 @@ gboolean client_has_group_siblings(ObClient *self) { return self->group && self->group->members->next; } - -gboolean client_has_non_helper_group_siblings(ObClient *self) -{ - GSList *it; - - if (!self->group) return FALSE; - - for (it = self->group->members; it; it = g_slist_next(it)) { - ObClient *c = it->data; - if (c != self && client_normal(c) && !client_helper(c)) - return TRUE; - } - return FALSE; -}