X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=1b1fedad7b944e63270abdc3203026aec7a5149c;hb=db086ef336e01ee23c777f3dc6678568565d44ef;hp=8f219193ef6fe008fc76683f6029f7b78b78b046;hpb=abbb454a29984a1d73f8bc43477768f783405bc3;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 8f219193..1b1fedad 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -2,7 +2,6 @@ #include "screen.h" #include "prop.h" #include "extensions.h" -#include "config.h" #include "frame.h" #include "engine.h" #include "event.h" @@ -21,7 +20,7 @@ #define CLIENT_NOPROPAGATEMASK (ButtonPressMask | ButtonReleaseMask | \ ButtonMotionMask) -GSList *client_list = NULL; +GList *client_list = NULL; GHashTable *client_map = NULL; static Window *client_startup_stack_order = NULL; @@ -65,8 +64,8 @@ void client_shutdown() void client_set_list() { Window *windows, *win_it; - GSList *it; - guint size = g_slist_length(client_list); + GList *it; + guint size = g_list_length(client_list); /* create an array of the window ids */ if (size > 0) { @@ -87,7 +86,6 @@ void client_set_list() void client_manage_all() { - ConfigValue focus_new; unsigned int i, j, nchild; Window w, *children; XWMHints *wmhints; @@ -132,16 +130,13 @@ void client_manage_all() w = client_startup_stack_order[i-1]; c = g_hash_table_lookup(client_map, &w); - g_message("0x%lx %d %d", c->window, c->iconic, c->shaded); if (c) stacking_lower(c); } g_free(client_startup_stack_order); client_startup_stack_order = NULL; client_startup_stack_size = 0; - if (!config_get("focusNew", Config_Bool, &focus_new)) - g_assert_not_reached(); - if (focus_new.bool) + if (focus_new) focus_fallback(FALSE); } @@ -153,7 +148,6 @@ void client_manage(Window window) XSetWindowAttributes attrib_set; /* XWMHints *wmhint; */ guint i; - ConfigValue focus_new; grab_server(TRUE); @@ -216,7 +210,7 @@ void client_manage(Window window) grab_server(FALSE); - client_list = g_slist_append(client_list, client); + client_list = g_list_append(client_list, client); stacking_list = g_list_append(stacking_list, client); g_assert(!g_hash_table_lookup(client_map, &client->window)); g_hash_table_insert(client_map, &client->window, client); @@ -240,9 +234,7 @@ void client_manage(Window window) dispatch_client(Event_Client_Mapped, client, 0, 0); - if (!config_get("focusNew", Config_Bool, &focus_new)) - g_assert_not_reached(); - if (ob_state != State_Starting && focus_new.bool) + if (ob_state != State_Starting && focus_new) client_focus(client); /* update the list hints */ @@ -276,7 +268,7 @@ void client_unmanage(Client *client) engine_frame_hide(client->frame); - client_list = g_slist_remove(client_list, client); + client_list = g_list_remove(client_list, client); stacking_list = g_list_remove(stacking_list, client); g_hash_table_remove(client_map, &client->window); @@ -747,7 +739,8 @@ void client_setup_decor_and_functions(Client *self) { /* start with everything (cept fullscreen) */ self->decorations = Decor_Titlebar | Decor_Handle | Decor_Border | - Decor_Icon | Decor_AllDesktops | Decor_Iconify | Decor_Maximize; + Decor_Icon | Decor_AllDesktops | Decor_Iconify | Decor_Maximize | + Decor_Shade; self->functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize | Func_Shade; if (self->delete_window) { @@ -842,6 +835,8 @@ void client_setup_decor_and_functions(Client *self) self->decorations &= ~Decor_Maximize; if (self->disabled_decorations & Decor_AllDesktops) self->decorations &= ~Decor_AllDesktops; + if (self->disabled_decorations & Decor_Shade) + self->decorations &= ~Decor_Shade; if (self->disabled_decorations & Decor_Close) self->decorations &= ~Decor_Close; @@ -1706,7 +1701,6 @@ void client_kill(Client *self) void client_set_desktop(Client *self, guint target, gboolean donthide) { guint old, i; - ConfigValue focus_new; if (target == self->desktop) return; @@ -1728,8 +1722,6 @@ void client_set_desktop(Client *self, guint target, gboolean donthide) screen_update_struts(); /* update the focus lists */ - if (!config_get("focusNew", Config_Bool, &focus_new)) - g_assert_not_reached(); if (old == DESKTOP_ALL) { for (i = 0; i < screen_num_desktops; ++i) focus_order[i] = g_list_remove(focus_order[i], self); @@ -1737,13 +1729,13 @@ void client_set_desktop(Client *self, guint target, gboolean donthide) focus_order[old] = g_list_remove(focus_order[old], self); if (target == DESKTOP_ALL) { for (i = 0; i < screen_num_desktops; ++i) { - if (focus_new.bool) + if (focus_new) focus_order[i] = g_list_prepend(focus_order[i], self); else focus_order[i] = g_list_append(focus_order[i], self); } } else { - if (focus_new.bool) + if (focus_new) focus_order[target] = g_list_prepend(focus_order[target], self); else focus_order[target] = g_list_append(focus_order[target], self); @@ -1924,20 +1916,32 @@ void client_set_state(Client *self, Atom action, long data1, long data2) client_change_state(self); /* change the hint to relect these changes */ } -gboolean client_focus(Client *self) +Client *client_focus_target(Client *self) { - XEvent ev; Client *child; /* if we have a modal child, then focus it, not us */ child = client_find_modal_child(self); - if (child) - return client_focus(child); + if (child) return child; + return self; +} +gboolean client_focusable(Client *self) +{ /* won't try focus if the client doesn't want it, or if the window isn't visible on the screen */ - if (!(self->frame->visible && - (self->can_focus || self->focus_notify))) + return self->frame->visible && + (self->can_focus || self->focus_notify); +} + +gboolean client_focus(Client *self) +{ + XEvent ev; + + /* choose the correct target */ + self = client_focus_target(self); + + if (!client_focusable(self)) return FALSE; /* do a check to see if the window has already been unmapped or destroyed @@ -1992,6 +1996,7 @@ gboolean client_focus(Client *self) void client_unfocus(Client *self) { g_assert(focus_client == self); + g_message("client_unfocus"); focus_fallback(FALSE); }