X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=40b0836e1c61276e9688fdb4c0639cf04f116596;hb=e0fa57d21c83bbfe87b15224f699bc24628fd89f;hp=0f2519cff751e82a36324c57f76995e167e7011a;hpb=365a9fbb69f599990dae1d5e1458dbe58beff161;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 0f2519cf..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" @@ -260,11 +261,12 @@ void client_manage(Window window) 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 @@ -1139,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 */ @@ -1322,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; } @@ -1336,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) { @@ -1357,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, @@ -1364,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 { @@ -1373,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), @@ -1382,6 +1391,7 @@ void client_update_icons(Client *self) g_free(&self->icons[self->nicons-1]); self->nicons--; } + xerror_set_ignore(FALSE); } XFree(hints); } @@ -2229,10 +2239,30 @@ 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);