X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=828b158c27e7ae4871c718e4f772b2abd5f2c97e;hb=6e42b65bda1706887f3b2a7f9d79ba20f7611a06;hp=dd25e4d2d4a7861e3e5d0d16acfd33aca6b873f9;hpb=d5eacc5642ad8f5611f7c946d734863bc8898513;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index dd25e4d2..828b158c 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1,4 +1,5 @@ #include "client.h" +#include "slit.h" #include "startup.h" #include "screen.h" #include "moveresize.h" @@ -157,7 +158,7 @@ void client_manage_all() w = startup_stack_order[i-1]; c = g_hash_table_lookup(client_map, &w); - if (c) stacking_lower(c); + if (c) stacking_lower(CLIENT_AS_WINDOW(c)); } g_free(startup_stack_order); startup_stack_order = NULL; @@ -176,7 +177,8 @@ void client_manage(Window window) XEvent e; XWindowAttributes attrib; XSetWindowAttributes attrib_set; -/* XWMHints *wmhint; */ + XWMHints *wmhint; + gboolean activate = FALSE; grab_server(TRUE); @@ -197,18 +199,18 @@ void client_manage(Window window) return; /* don't manage it */ } -/* /\* is the window a docking app *\/ + /* is the window a docking app */ if ((wmhint = XGetWMHints(ob_display, window))) { if ((wmhint->flags & StateHint) && wmhint->initial_state == WithdrawnState) { - /\* XXX: make dock apps work! *\/ + slit_add(window, wmhint); grab_server(FALSE); XFree(wmhint); return; } XFree(wmhint); } -*/ + g_message("Managing window: %lx", window); /* choose the events we want to receive on the CLIENT window */ @@ -221,6 +223,7 @@ void client_manage(Window window) /* create the Client struct, and populate it from the hints on the window */ self = g_new(Client, 1); + self->obwin.type = Window_Client; self->window = window; client_get_all(self); @@ -239,30 +242,18 @@ void client_manage(Window window) client_apply_startup_state(self); grab_server(FALSE); - + + /* add to client list/map */ client_list = g_list_append(client_list, self); - stacking_list = g_list_append(stacking_list, self); - g_assert(!g_hash_table_lookup(client_map, &self->window)); g_hash_table_insert(client_map, &self->window, self); /* update the focus lists */ focus_order_add_new(self); - stacking_raise(self); - - screen_update_struts(); - - dispatch_client(Event_Client_New, self, 0, 0); - - client_showhide(self); - /* focus the new window? */ - if (ob_state != State_Starting) { - Client *parent; + if (ob_state != State_Starting && config_focus_new) { gboolean group_foc = FALSE; - parent = NULL; - if (self->group) { GSList *it; @@ -272,39 +263,42 @@ void client_manage(Window window) break; } } - if (!group_foc && self->transient_for) { - if (self->transient_for != TRAN_GROUP) {/* transient of a window */ - parent = self->transient_for; - } else { /* transient of a group */ - GSList *it; - - for (it = self->group->members; it; it = it->next) - if (it->data != self && - ((Client*)it->data)->transient_for != TRAN_GROUP) - parent = it->data; - } - } - /* note the check against Type_Normal, not client_normal(self), which - would also include dialog types. in this case we want more strict - rules for focus */ - if ((config_focus_new && - (self->type == Type_Normal || + /* note the check against Type_Normal/Dialog, not client_normal(self), + which would also include other types. in this case we want more + strict rules for focus */ + if (((self->type == Type_Normal || (self->type == Type_Dialog && (group_foc || - (!parent && (!self->group || - !self->group->members->next)))))) || - (parent && (client_focused(parent) || - client_search_focus_tree(parent)))) { - client_focus(self); + (!self->transient_for && (!self->group || + !self->group->members->next)))))) || + client_search_focus_tree_full(self) || + !focus_client || + !client_normal(focus_client)) { + /* activate the window */ + stacking_add(CLIENT_AS_WINDOW(self)); + activate = TRUE; + } else { + /* try to not get in the way */ + stacking_add_nonintrusive(CLIENT_AS_WINDOW(self)); } + } else { + stacking_add(CLIENT_AS_WINDOW(self)); } - /* update the list hints */ - client_set_list(); + screen_update_struts(); /* make sure the window is visible */ client_move_onscreen(self); + dispatch_client(Event_Client_New, self, 0, 0); + + client_showhide(self); + + if (activate) client_activate(self); + + /* update the list hints */ + client_set_list(); + dispatch_client(Event_Client_Mapped, self, 0, 0); g_message("Managed window 0x%lx", window); @@ -335,7 +329,7 @@ void client_unmanage(Client *self) frame_hide(self->frame); client_list = g_list_remove(client_list, self); - stacking_list = g_list_remove(stacking_list, self); + stacking_remove(self); g_hash_table_remove(client_map, &self->window); /* update the focus lists */ @@ -1454,8 +1448,7 @@ static StackLayer calc_layer(Client *self) { StackLayer l; - if (self->iconic) l = Layer_Icon; - else if (self->fullscreen) l = Layer_Fullscreen; + if (self->fullscreen) l = Layer_Fullscreen; else if (self->type == Type_Desktop) l = Layer_Desktop; else if (self->type == Type_Dock) { if (!self->below) l = Layer_Top; @@ -1483,7 +1476,7 @@ static void calc_recursive(Client *self, Client *orig, StackLayer l, if (!raised && l != old) if (orig->frame) /* only restack if the original window is managed */ - stacking_raise(self); + stacking_raise(CLIENT_AS_WINDOW(self)); } void client_calc_layer(Client *self) @@ -1713,15 +1706,13 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, event.xconfigure.event = self->window; event.xconfigure.window = self->window; - /* root window coords with border in mind */ - event.xconfigure.x = x - self->border_width + - self->frame->size.left; - event.xconfigure.y = y - self->border_width + - self->frame->size.top; + /* root window real coords */ + event.xconfigure.x = self->frame->area.x + self->frame->size.left; + event.xconfigure.y = self->frame->area.y + self->frame->size.top; - event.xconfigure.width = self->area.width; - event.xconfigure.height = self->area.height; - event.xconfigure.border_width = self->border_width; + event.xconfigure.width = w; + event.xconfigure.height = h; + event.xconfigure.border_width = 0; event.xconfigure.above = self->frame->plate; event.xconfigure.override_redirect = FALSE; XSendEvent(event.xconfigure.display, event.xconfigure.window, @@ -2027,7 +2018,7 @@ void client_set_desktop(Client *self, guint target, gboolean donthide) client_showhide(self); /* raise if it was not already on the desktop */ if (old != DESKTOP_ALL) - stacking_raise(self); + stacking_raise(CLIENT_AS_WINDOW(self)); screen_update_struts(); /* add to the new desktop(s) */ @@ -2309,7 +2300,7 @@ void client_activate(Client *self) if (self->shaded) client_shade(self, FALSE); client_focus(self); - stacking_raise(self); + stacking_raise(CLIENT_AS_WINDOW(self)); } gboolean client_focused(Client *self)