X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=a961c1496dd1aa80acb612835574429235fe1be6;hb=702995014a0ef567e98899bda931901d98461341;hp=a339bf0f038ca0ff36c801a0ea80f0e6dcc19108;hpb=81af5a8b0caadc0a82ff2304c315f816c9576e93;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index a339bf0f..a961c149 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1,3 +1,4 @@ +#include "debug.h" #include "client.h" #include "dock.h" #include "xerror.h" @@ -216,7 +217,7 @@ void client_manage(Window window) XFree(wmhint); } - g_message("Managing window: %lx", window); + ob_debug("Managing window: %lx\n", window); /* choose the events we want to receive on the CLIENT window */ attrib_set.event_mask = CLIENT_EVENTMASK; @@ -255,39 +256,45 @@ void client_manage(Window window) /* update the focus lists */ focus_order_add_new(self); + stacking_add(CLIENT_AS_WINDOW(self)); + /* focus the new window? */ if (ob_state() != OB_STATE_STARTING && config_focus_new && - (self->type == OB_CLIENT_TYPE_NORMAL || self->type == OB_CLIENT_TYPE_DIALOG)) { - gboolean group_foc = FALSE; - - if (self->group) { - GSList *it; - - for (it = self->group->members; it; it = it->next) { - if (client_focused(it->data)) { - group_foc = TRUE; - break; - } - } - } /* 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 ((group_foc || - (!self->transient_for && (!self->group || - !self->group->members->next))) || - client_search_focus_tree_full(self) || - !focus_client || - !client_normal(focus_client)) { + (self->type == OB_CLIENT_TYPE_NORMAL || + self->type == OB_CLIENT_TYPE_DIALOG)) + { + if (self->desktop != screen_desktop) { /* 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)); + gboolean group_foc = FALSE; + + if (self->group) { + GSList *it; + + for (it = self->group->members; it; it = it->next) + { + if (client_focused(it->data)) + { + group_foc = TRUE; + break; + } + } + } + if ((group_foc || + (!self->transient_for && (!self->group || + !self->group->members->next))) || + client_search_focus_tree_full(self) || + !focus_client || + !client_normal(focus_client)) + { + /* activate the window */ + activate = TRUE; + } } - } else { - stacking_add(CLIENT_AS_WINDOW(self)); } dispatch_client(Event_Client_New, self, 0, 0); @@ -299,14 +306,24 @@ void client_manage(Window window) client_showhide(self); - if (activate) client_activate(self); + /* use client_focus instead of client_activate cuz client_activate does + stuff like switch desktops etc and I'm not interested in all that when + a window maps since its not based on an action from the user like + clicking a window to activate is. so keep the new window out of the way + but do focus it. */ + if (activate) client_focus(self); + + /* client_activate does this but we aret using it so we have to do it + here as well */ + if (screen_showing_desktop) + screen_show_desktop(FALSE); /* update the list hints */ client_set_list(); dispatch_client(Event_Client_Mapped, self, 0, 0); - g_message("Managed window 0x%lx (%s)", window, self->class); + ob_debug("Managed window 0x%lx (%s)\n", window, self->class); } void client_unmanage_all() @@ -327,7 +344,7 @@ void client_unmanage(ObClient *self) guint j; GSList *it; - g_message("Unmanaging window: %lx (%s)", self->window, self->class); + ob_debug("Unmanaging window: %lx (%s)\n", self->window, self->class); dispatch_client(Event_Client_Destroy, self, 0, 0); g_assert(self != NULL); @@ -418,7 +435,7 @@ void client_unmanage(ObClient *self) } - g_message("Unmanaged window 0x%lx", self->window); + ob_debug("Unmanaged window 0x%lx\n", self->window); /* free all data allocated in the client struct */ g_slist_free(self->transients); @@ -687,24 +704,24 @@ static void client_get_shaped(ObClient *self) void client_update_transient_for(ObClient *self) { Window t = None; - ObClient *c = NULL; + ObClient *target = NULL; if (XGetTransientForHint(ob_display, self->window, &t)) { self->transient = TRUE; if (t != self->window) { /* cant be transient to itself! */ - c = g_hash_table_lookup(window_map, &t); + target = g_hash_table_lookup(window_map, &t); /* if this happens then we need to check for it*/ - g_assert(c != self); - g_assert(!c || WINDOW_IS_CLIENT(c)); + g_assert(target != self); + g_assert(!target || WINDOW_IS_CLIENT(target)); - if (!c && self->group) { + if (!target && self->group) { /* not transient to a client, see if it is transient for a group */ if (t == self->group->leader || t == None || t == RootWindow(ob_display, ob_screen)) { /* window is a transient for its group! */ - c = OB_TRAN_GROUP; + target = OB_TRAN_GROUP; } } } @@ -712,41 +729,41 @@ void client_update_transient_for(ObClient *self) self->transient = FALSE; /* if anything has changed... */ - if (c != self->transient_for) { + if (target != self->transient_for) { if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */ GSList *it; /* remove from old parents */ - for (it = self->group->members; it; it = it->next) - if (it->data != self && - !((ObClient*)it->data)->transient_for) - ((ObClient*)it->data)->transients = - g_slist_remove(((ObClient*)it->data)->transients, self); + for (it = self->group->members; it; it = g_slist_next(it)) { + ObClient *c = it->data; + if (c != self && !c->transient_for) + c->transients = g_slist_remove(c->transients, self); + } } else if (self->transient_for != NULL) { /* transient of window */ /* remove from old parent */ self->transient_for->transients = g_slist_remove(self->transient_for->transients, self); } - self->transient_for = c; + self->transient_for = target; if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */ GSList *it; /* add to new parents */ - for (it = self->group->members; it; it = it->next) - if (it->data != self && - !((ObClient*)it->data)->transient_for) - ((ObClient*)it->data)->transients = - g_slist_append(((ObClient*)it->data)->transients, self); + for (it = self->group->members; it; it = g_slist_next(it)) { + ObClient *c = it->data; + if (c != self && !c->transient_for) + c->transients = g_slist_append(c->transients, self); + } /* remove all transients which are in the group, that causes circlular pointer hell of doom */ - for (it = self->group->members; it; it = it->next) { + for (it = self->group->members; it; it = g_slist_next(it)) { GSList *sit, *next; for (sit = self->transients; sit; sit = next) { - next = sit->next; + next = g_slist_next(sit); if (sit->data == it->data) - self->transients = g_slist_remove(self->transients, - sit->data); + self->transients = + g_slist_delete_link(self->transients, sit); } } } else if (self->transient_for != NULL) { /* transient of window */ @@ -1082,7 +1099,6 @@ static void client_change_allowed_actions(ObClient *self) else self->shaded = FALSE; } if (!(self->functions & OB_CLIENT_FUNC_ICONIFY) && self->iconic) { - g_message("UNSETTING ICONIC"); if (self->frame) client_iconify(self, FALSE, TRUE); else self->iconic = FALSE; } @@ -1151,11 +1167,12 @@ void client_update_wmhints(ObClient *self) if (!self->transient_for) { /* add other transients of the group that are already set up */ - for (it = self->group->members; it; it = it->next) - if (it->data != self && - ((ObClient*)it->data)->transient_for == OB_TRAN_GROUP) - self->transients = g_slist_append(self->transients, - it->data); + for (it = self->group->members; it; it = it->next) { + ObClient *c = it->data; + if (c != self && c->transient_for == OB_TRAN_GROUP) + self->transients = + g_slist_append(self->transients, c); + } } } @@ -1174,8 +1191,8 @@ void client_update_wmhints(ObClient *self) if (ur != self->urgent) { self->urgent = ur; - g_message("Urgent Hint for 0x%lx: %s", self->window, - ur ? "ON" : "OFF"); + ob_debug("Urgent Hint for 0x%lx: %s\n", self->window, + ur ? "ON" : "OFF"); /* fire the urgent callback if we're mapped, otherwise, wait until after we're mapped */ if (self->frame) @@ -1888,8 +1905,8 @@ static void client_iconify_recursive(ObClient *self, if (self->iconic != iconic) { - g_message("%sconifying window: 0x%lx", (iconic ? "I" : "Uni"), - self->window); + ob_debug("%sconifying window: 0x%lx\n", (iconic ? "I" : "Uni"), + self->window); self->iconic = iconic; @@ -2109,7 +2126,7 @@ void client_set_desktop_recursive(ObClient *self, if (target != self->desktop) { - g_message("Setting desktop %u", target+1); + ob_debug("Setting desktop %u\n", target+1); g_assert(target < screen_num_desktops || target == DESKTOP_ALL); @@ -2399,9 +2416,9 @@ gboolean client_focus(ObClient *self) } #ifdef DEBUG_FOCUS - g_message("%sively focusing %lx at %d", (self->can_focus ? "act" : "pass"), - self->window, (int) - event_lasttime); + ob_debug("%sively focusing %lx at %d\n", + (self->can_focus ? "act" : "pass"), + self->window, (int) event_lasttime); #endif /* Cause the FocusIn to come back to us. Important for desktop switches, @@ -2415,7 +2432,7 @@ void client_unfocus(ObClient *self) { g_assert(focus_client == self); #ifdef DEBUG_FOCUS - g_message("client_unfocus for %lx", self->window); + ob_debug("client_unfocus for %lx\n", self->window); #endif focus_fallback(OB_FOCUS_FALLBACK_UNFOCUSING); } @@ -2425,7 +2442,10 @@ void client_activate(ObClient *self) if (client_normal(self) && screen_showing_desktop) screen_show_desktop(FALSE); if (self->iconic) - client_iconify(self, FALSE, TRUE); + client_iconify(self, FALSE, FALSE); + if (self->desktop != DESKTOP_ALL && + self->desktop != screen_desktop) + screen_set_desktop(self->desktop); else if (!self->frame->visible) /* if its not visible for other reasons, then don't mess with it */ @@ -2615,3 +2635,16 @@ ObClient *client_search_top_transient(ObClient *self) return self; } + +ObClient *client_search_transient(ObClient *self, ObClient *search) +{ + GSList *sit; + + for (sit = self->transients; sit; sit = g_slist_next(sit)) { + if (sit->data == search) + return search; + if (client_search_transient(sit->data, search)) + return search; + } + return NULL; +}