/* focus the new window? */
if (ob_state() != OB_STATE_STARTING &&
- (config_focus_new || (self->transient_for &&
- self->transient_for != OB_TRAN_GROUP &&
- client_focused(self->transient_for))) &&
+ (config_focus_new || client_search_focus_parent(self)) &&
/* 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 */
/* the WM_HINTS can contain an icon */
client_update_icons(self);
- XFree(hints);
+ XFree(hints);
}
if (ur != self->urgent) {
- self->urgent = ur;
- 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)
+ self->urgent = ur;
+ /* fire the urgent callback if we're mapped, otherwise, wait until
+ after we're mapped */
+ if (self->frame)
client_urgent_notify(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) {
}
}
if ((dir == 0 || dir == 2) && self->max_vert) { /* vert */
- if (self->pre_max_area.width > 0) {
+ if (self->pre_max_area.height > 0) {
y = self->pre_max_area.y;
h = self->pre_max_area.height;
return;
if (self->shaded)
client_shade(self, FALSE);
- client_focus(self);
- stacking_raise(CLIENT_AS_WINDOW(self));
+ action_run_string("Focus", self);
+ action_run_string("Raise", self);
}
gboolean client_focused(ObClient *self)
return self;
}
+ObClient *client_search_focus_parent(ObClient *self)
+{
+ if (self->transient_for) {
+ if (self->transient_for != OB_TRAN_GROUP) {
+ if (client_focused(self->transient_for))
+ return self->transient_for;
+ } else {
+ GSList *it;
+
+ for (it = self->group->members; it; it = it->next) {
+ ObClient *c = it->data;
+
+ /* checking transient_for prevents infinate loops! */
+ if (c != self && !c->transient_for)
+ if (client_focused(c))
+ return c;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+ObClient *client_search_parent(ObClient *self, ObClient *search)
+{
+ if (self->transient_for) {
+ if (self->transient_for != OB_TRAN_GROUP) {
+ if (self->transient_for == search)
+ return search;
+ } else {
+ GSList *it;
+
+ for (it = self->group->members; it; it = it->next) {
+ ObClient *c = it->data;
+
+ /* checking transient_for prevents infinate loops! */
+ if (c != self && !c->transient_for)
+ if (c == search)
+ return search;
+ }
+ }
+ }
+
+ return NULL;
+}
+
ObClient *client_search_transient(ObClient *self, ObClient *search)
{
GSList *sit;