X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=ded81e3893a843eb2c24e3787de80457a8d9b83e;hb=f0fdba8ad36010280fc84c2425010c195b76562a;hp=872d964b605bd00dbe0bc89f28b58256de331845;hpb=cc9ef6f22d5264a2a6b3c88558134d43ef8d34ea;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 872d964b..ded81e38 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -64,7 +64,6 @@ typedef struct GList *client_list = NULL; static GSList *client_destructors = NULL; -static GSList *client_desktop_notifies = NULL; static void client_get_all(ObClient *self); static void client_toggle_border(ObClient *self, gboolean show); @@ -128,29 +127,6 @@ void client_remove_destructor(ObClientCallback func) } } -void client_add_desktop_notify(ObClientCallback func, gpointer data) -{ - ClientCallback *d = g_new(ClientCallback, 1); - d->func = func; - d->data = data; - client_desktop_notifies = g_slist_prepend(client_desktop_notifies, d); -} - -void client_remove_desktop_notify(ObClientCallback func) -{ - GSList *it; - - for (it = client_desktop_notifies; it; it = g_slist_next(it)) { - ClientCallback *d = it->data; - if (d->func == func) { - g_free(d); - client_desktop_notifies = - g_slist_delete_link(client_desktop_notifies, it); - break; - } - } -} - void client_set_list() { Window *windows, *win_it; @@ -1599,10 +1575,15 @@ void client_setup_decor_and_functions(ObClient *self) self->functions &= ~(OB_CLIENT_FUNC_ICONIFY | OB_CLIENT_FUNC_RESIZE); break; + case OB_CLIENT_TYPE_SPLASH: + /* these don't get get any decorations, and the only thing you can + do with them is move them */ + self->decorations = 0; + self->functions = OB_CLIENT_FUNC_MOVE; + case OB_CLIENT_TYPE_DESKTOP: case OB_CLIENT_TYPE_DOCK: - case OB_CLIENT_TYPE_SPLASH: - /* none of these windows are manipulated by the window manager */ + /* these windows are not manipulated by the window manager */ self->decorations = 0; self->functions = 0; break; @@ -2394,6 +2375,22 @@ gboolean client_helper(ObClient *self) self->type == OB_CLIENT_TYPE_TOOLBAR); } +gboolean client_mouse_focusable(ObClient *self) +{ + return !(self->type == OB_CLIENT_TYPE_MENU || + self->type == OB_CLIENT_TYPE_TOOLBAR || + self->type == OB_CLIENT_TYPE_SPLASH || + self->type == OB_CLIENT_TYPE_DOCK); +} + +gboolean client_enter_focusable(ObClient *self) +{ + /* you can focus desktops but it shouldn't on enter */ + return (client_mouse_focusable(self) && + self->type != OB_CLIENT_TYPE_DESKTOP); +} + + static void client_apply_startup_state(ObClient *self, gint x, gint y) { gboolean pos = FALSE; /* has the window's position been configured? */ @@ -2798,7 +2795,9 @@ static void client_iconify_recursive(ObClient *self, self->window); if (iconic) { - if (self->functions & OB_CLIENT_FUNC_ICONIFY) { + /* don't let non-normal windows iconify along with their parents + or whatever */ + if (client_normal(self)) { self->iconic = iconic; /* update the focus lists.. iconic windows go to the bottom of @@ -2813,7 +2812,7 @@ static void client_iconify_recursive(ObClient *self, if (curdesk && self->desktop != screen_desktop && self->desktop != DESKTOP_ALL) - client_set_desktop(self, screen_desktop, FALSE, FALSE); + client_set_desktop(self, screen_desktop, FALSE); /* this puts it after the current focused window */ focus_order_remove(self); @@ -2841,9 +2840,11 @@ static void client_iconify_recursive(ObClient *self, void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk) { - /* move up the transient chain as far as possible first */ - self = client_search_top_normal_parent(self); - client_iconify_recursive(self, iconic, curdesk); + if (self->functions & OB_CLIENT_FUNC_ICONIFY || !iconic) { + /* move up the transient chain as far as possible first */ + self = client_search_top_normal_parent(self); + client_iconify_recursive(self, iconic, curdesk); + } } void client_maximize(ObClient *self, gboolean max, gint dir) @@ -2994,8 +2995,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 +3006,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); @@ -3023,36 +3019,20 @@ void client_set_desktop_recursive(ObClient *self, client_raise(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)) { - ClientCallback *d = it->data; - d->func(self, d->data); - } } /* move all transients */ for (it = self->transients; it; it = g_slist_next(it)) if (it->data != self) if (client_is_direct_child(self, it->data)) - client_set_desktop_recursive(it->data, target, - donthide, focus_nonintrusive); + client_set_desktop_recursive(it->data, target, donthide); } 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); + client_set_desktop_recursive(self, target, donthide); } gboolean client_is_direct_child(ObClient *parent, ObClient *child) @@ -3115,6 +3095,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 +3173,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 +3202,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 +3249,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 */ } @@ -3386,7 +3374,7 @@ static void client_present(ObClient *self, gboolean here, gboolean raise) self->desktop != screen_desktop) { if (here) - client_set_desktop(self, screen_desktop, FALSE, FALSE); + client_set_desktop(self, screen_desktop, FALSE); else screen_set_desktop(self->desktop, FALSE); } else if (!self->frame->visible) @@ -3452,7 +3440,7 @@ 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); } } @@ -3894,17 +3882,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; -}