X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=40b0836e1c61276e9688fdb4c0639cf04f116596;hb=1139d96e7f109158e27a0605f4de94ccceb41c55;hp=ade1a1093cb59abf9fea2a7acf79d2c311179086;hpb=a373b1582e4e40a4f126632a7528553e74fd26f2;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index ade1a109..40b0836e 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1,5 +1,6 @@ #include "client.h" #include "dock.h" +#include "xerror.h" #include "startup.h" #include "screen.h" #include "moveresize.h" @@ -253,26 +254,26 @@ void client_manage(Window window) focus_order_add_new(self); /* focus the new window? */ - if (ob_state != State_Starting && config_focus_new) { + if (ob_state != State_Starting && config_focus_new && + (self->type == Type_Normal || self->type == Type_Dialog)) { gboolean group_foc = FALSE; if (self->group) { GSList *it; - for (it = self->group->members; it; it = it->next) + 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 (((self->type == Type_Normal || - (self->type == Type_Dialog && - (group_foc || - (!self->transient_for && (!self->group || - !self->group->members->next)))))) || + if ((group_foc || + (!self->transient_for && (!self->group || + !self->group->members->next))) || client_search_focus_tree_full(self) || !focus_client || !client_normal(focus_client)) { @@ -1140,18 +1141,20 @@ void client_update_wmhints(Client *self) group_remove(self->group, self); self->group = NULL; } - /* i can only have transients from the group if i am not transient - myself */ - if (hints->window_group != None && !self->transient_for) { + if (hints->window_group != None) { self->group = group_add(hints->window_group, self); - /* add other transients of the group that are already - set up */ - for (it = self->group->members; it; it = it->next) - if (it->data != self && - ((Client*)it->data)->transient_for == TRAN_GROUP) - self->transients = g_slist_append(self->transients, - it->data); + /* i can only have transients from the group if i am not + transient myself */ + 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 && + ((Client*)it->data)->transient_for == TRAN_GROUP) + self->transients = g_slist_append(self->transients, + it->data); + } } /* the WM_HINTS can contain an icon */ @@ -1323,7 +1326,7 @@ void client_update_icons(Client *self) w = data[i++]; h = data[i++]; i += w * h; - if (i > num) break; + if (i > num || w*h == 0) break; ++self->nicons; } @@ -1337,6 +1340,8 @@ void client_update_icons(Client *self) w = self->icons[j].width = data[i++]; h = self->icons[j].height = data[i++]; + if (w*h == 0) continue; + self->icons[j].data = g_new(pixel32, w * h); for (x = 0, y = 0, t = 0; t < w * h; ++t, ++x, ++i) { if (x >= w) { @@ -1358,6 +1363,7 @@ void client_update_icons(Client *self) if (num == 2) { self->nicons++; self->icons = g_new(Icon, self->nicons); + xerror_set_ignore(TRUE); if (!render_pixmap_to_rgba(data[0], data[1], &self->icons[self->nicons-1].width, &self->icons[self->nicons-1].height, @@ -1365,6 +1371,7 @@ void client_update_icons(Client *self) g_free(&self->icons[self->nicons-1]); self->nicons--; } + xerror_set_ignore(FALSE); } g_free(data); } else { @@ -1374,6 +1381,7 @@ void client_update_icons(Client *self) if (hints->flags & IconPixmapHint) { self->nicons++; self->icons = g_new(Icon, self->nicons); + xerror_set_ignore(TRUE); if (!render_pixmap_to_rgba(hints->icon_pixmap, (hints->flags & IconMaskHint ? hints->icon_mask : None), @@ -1383,6 +1391,7 @@ void client_update_icons(Client *self) g_free(&self->icons[self->nicons-1]); self->nicons--; } + xerror_set_ignore(FALSE); } XFree(hints); } @@ -2230,14 +2239,34 @@ Client *client_focus_target(Client *self) return self; } +gboolean client_can_focus(Client *self) +{ + /* same code as in client_focus */ + + /* choose the correct target */ + self = client_focus_target(self); + + if (!self->frame->visible) + return FALSE; + + if (!((self->can_focus || self->focus_notify) && + (self->desktop == screen_desktop || + self->desktop == DESKTOP_ALL) && + !self->iconic)) + return FALSE; + return TRUE; +} + gboolean client_focus(Client *self) { XEvent ev; + /* same code as in client_can_focus */ + /* choose the correct target */ self = client_focus_target(self); - if (self->desktop != DESKTOP_ALL && self->desktop != screen_desktop) { + if (!self->frame->visible) { /* update the focus lists */ focus_order_to_top(self); return FALSE;