X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=8e3252137cff9e3d21f77051a75e0b23b1bd90da;hb=62b3b8c57e61a1db007fc8825636e08cbe8f6220;hp=e63f78678018361bd346a493d32cfd9408fc1be7;hpb=19e48200739dc95f9b0079a25849e7e06c99302c;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index e63f7867..8e325213 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -183,9 +183,6 @@ void client_manage_all() } } XFree(children); - - if (config_focus_new) - focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); } void client_manage(Window window) @@ -280,7 +277,10 @@ void client_manage(Window window) client_restore_session_stacking(self); /* focus the new window? */ - if (ob_state() != OB_STATE_STARTING && config_focus_new && + if (ob_state() != OB_STATE_STARTING && + (config_focus_new || (self->transient_for && + self->transient_for != OB_TRAN_GROUP && + client_focused(self->transient_for))) && /* 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 */ @@ -2074,7 +2074,14 @@ static void client_iconify_recursive(ObClient *self, if (iconic) { if (self->functions & OB_CLIENT_FUNC_ICONIFY) { + long old; + + old = self->wmstate; self->wmstate = IconicState; + if (old != self->wmstate) + PROP_MSG(self->window, kde_wm_change_state, + self->wmstate, 1, 0, 0); + self->ignore_unmaps++; /* we unmap the client itself so that we can get MapRequest events, and because the ICCCM tells us to! */ @@ -2088,9 +2095,17 @@ static void client_iconify_recursive(ObClient *self, changed = TRUE; } } else { + long old; + if (curdesk) client_set_desktop(self, screen_desktop, FALSE); + + old = self->wmstate; self->wmstate = self->shaded ? IconicState : NormalState; + if (old != self->wmstate) + PROP_MSG(self->window, kde_wm_change_state, + self->wmstate, 1, 0, 0); + XMapWindow(ob_display, self->window); /* this puts it after the current focused window */ @@ -2239,8 +2254,16 @@ void client_shade(ObClient *self, gboolean shade) self->shaded == shade) return; /* already done */ /* when we're iconic, don't change the wmstate */ - if (!self->iconic) - self->wmstate = shade ? IconicState : NormalState; + if (!self->iconic) { + long old; + + old = self->wmstate; + self->wmstate = shade ? IconicState : NormalState; + if (old != self->wmstate) + PROP_MSG(self->window, kde_wm_change_state, + self->wmstate, 1, 0, 0); + } + self->shaded = shade; client_change_state(self); /* resize the frame to just the titlebar */ @@ -2594,11 +2617,12 @@ gboolean client_focus(ObClient *self) void client_unfocus(ObClient *self) { - g_assert(focus_client == self); + if (focus_client == self) { #ifdef DEBUG_FOCUS - ob_debug("client_unfocus for %lx\n", self->window); + ob_debug("client_unfocus for %lx\n", self->window); #endif - focus_fallback(OB_FOCUS_FALLBACK_UNFOCUSING); + focus_fallback(OB_FOCUS_FALLBACK_UNFOCUSING); + } } void client_activate(ObClient *self, gboolean here) @@ -3010,9 +3034,29 @@ int client_directional_edge_search(ObClient *c, ObDirection dir) case OB_DIRECTION_NORTHWEST: case OB_DIRECTION_SOUTHWEST: /* not implemented */ - break; default: - g_assert_not_reached(); + g_assert_not_reached(); } return dest; } + +ObClient* client_under_pointer() +{ + int x, y; + GList *it; + ObClient *ret = NULL; + + if (screen_pointer_pos(&x, &y)) { + for (it = stacking_list; it != NULL; it = it->next) { + if (WINDOW_IS_CLIENT(it->data)) { + ObClient *c = WINDOW_AS_CLIENT(it->data); + if (c->desktop == screen_desktop && + RECT_CONTAINS(c->frame->area, x, y)) { + ret = c; + break; + } + } + } + } + return ret; +}