X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=83291132a14535917763ad0c622b6f743e566fcb;hb=4ccc4c5ed7d5cffc4bf733191f7bc30fbbf069c8;hp=eae55bcc8adbb13afd66f04411a0db39f174144d;hpb=d89391ec941077c556246bfc49b53919e694fd3e;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index eae55bcc..83291132 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -461,6 +461,7 @@ void client_unmanage(ObClient *self) g_free(self->name); g_free(self->class); g_free(self->role); + g_free(self->sm_client_id); g_free(self); /* update the list hints */ @@ -551,14 +552,16 @@ gboolean client_find_onscreen(ObClient *self, int *x, int *y, int w, int h, /* XXX watch for xinerama dead areas */ a = screen_area(self->desktop); - if (!self->strut.right && *x >= a->x + a->width - 1) - *x = a->x + a->width - self->frame->area.width; - if (!self->strut.bottom && *y >= a->y + a->height - 1) - *y = a->y + a->height - self->frame->area.height; - if (!self->strut.left && *x + self->frame->area.width - 1 < a->x) - *x = a->x; - if (!self->strut.top && *y + self->frame->area.height - 1 < a->y) - *y = a->y; + if (client_normal(self)) { + if (!self->strut.right && *x >= a->x + a->width - 1) + *x = a->x + a->width - self->frame->area.width; + if (!self->strut.bottom && *y >= a->y + a->height - 1) + *y = a->y + a->height - self->frame->area.height; + if (!self->strut.left && *x + self->frame->area.width - 1 < a->x) + *x = a->x; + if (!self->strut.top && *y + self->frame->area.height - 1 < a->y) + *y = a->y; + } if (rude) { /* this is my MOZILLA BITCHSLAP. oh ya it fucking feels good. @@ -675,6 +678,7 @@ static void client_get_all(ObClient *self) client_update_title(self); client_update_class(self); + client_update_sm_client_id(self); client_update_strut(self); client_update_icons(self); } @@ -1643,7 +1647,9 @@ static ObStackingLayer calc_layer(ObClient *self) { ObStackingLayer l; - if (self->fullscreen) l = OB_STACKING_LAYER_FULLSCREEN; + if (self->fullscreen && + (client_focused(self) || client_search_focus_tree(self))) + l = OB_STACKING_LAYER_FULLSCREEN; else if (self->type == OB_CLIENT_TYPE_DESKTOP) l = OB_STACKING_LAYER_DESKTOP; else if (self->type == OB_CLIENT_TYPE_DOCK) { @@ -1665,7 +1671,9 @@ static void client_calc_layer_recursive(ObClient *self, ObClient *orig, old = self->layer; own = calc_layer(self); - self->layer = l > own ? l : own; + self->layer = MAX(l, own); + + g_message("calc for 0x%x %d %d", self->window, old, self->layer); for (it = self->transients; it; it = it->next) client_calc_layer_recursive(it->data, orig, @@ -1673,7 +1681,6 @@ static void client_calc_layer_recursive(ObClient *self, ObClient *orig, if (!raised && l != old) if (orig->frame) { /* only restack if the original window is managed */ - /* XXX add_non_intrusive ever? */ stacking_remove(CLIENT_AS_WINDOW(self)); stacking_add(CLIENT_AS_WINDOW(self)); } @@ -2522,14 +2529,15 @@ gboolean client_focus(ObClient *self) /* choose the correct target */ self = client_focus_target(self); - if (!client_can_focus(self)) { - if (!self->frame->visible) { - /* update the focus lists */ - focus_order_to_top(self); - } + if (!self->frame->visible) { + /* update the focus lists */ + focus_order_to_top(self); return FALSE; } + if (!client_can_focus(self)) + return FALSE; + if (self->can_focus) { /* RevertToPointerRoot causes much more headache than RevertToNone, so I choose to use it always, hopefully to find errors quicker, if any @@ -2557,6 +2565,8 @@ gboolean client_focus(ObClient *self) XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce); } + focus_set_client(self); + #ifdef DEBUG_FOCUS ob_debug("%sively focusing %lx at %d\n", (self->can_focus ? "act" : "pass"), @@ -2793,13 +2803,15 @@ ObClient *client_search_transient(ObClient *self, ObClient *search) return NULL; } -gchar* client_get_sm_client_id(ObClient *self) +void client_update_sm_client_id(ObClient *self) { - gchar *id = NULL; + g_free(self->sm_client_id); + self->sm_client_id = NULL; - if (!PROP_GETS(self->window, sm_client_id, locale, &id) && self->group) - PROP_GETS(self->group->leader, sm_client_id, locale, &id); - return id; + if (!PROP_GETS(self->window, sm_client_id, locale, &self->sm_client_id) && + self->group) + PROP_GETS(self->group->leader, sm_client_id, locale, + &self->sm_client_id); } /* finds the nearest edge in the given direction from the current client