all repos — openbox @ 6714a0e2caa97517c16441721969cbc48b7d7637

openbox fork - make it a bit more like ryudo

Honor transient_for=Root, even thought this is crap and breaks some KDE stuff. Also include a big comment as to why this is suck.
Dana Jansens danakj@orodu.net
commit

6714a0e2caa97517c16441721969cbc48b7d7637

parent

616cb6061188a1c752a806bc79932d28b1b704a8

1 files changed, 57 insertions(+), 45 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -68,6 +68,7 @@ static void client_get_startup_id(ObClient *self);

static void client_get_area(ObClient *self); static void client_get_desktop(ObClient *self); static void client_get_state(ObClient *self); +static void client_get_layer(ObClient *self); static void client_get_shaped(ObClient *self); static void client_get_mwm_hints(ObClient *self); static void client_get_gravity(ObClient *self);

@@ -864,6 +865,7 @@ have one). This is Havoc's idea, but it is needed to make some apps

work right (eg tsclient). */ client_update_transient_for(self); client_get_type(self);/* this can change the mwmhints for special cases */ + client_get_state(self); client_update_transient_for(self); client_update_wmhints(self);

@@ -872,7 +874,8 @@ client_get_desktop(self);/* uses transient data/group/startup id if a

desktop is not specified */ client_get_shaped(self); - client_get_state(self); + client_get_layer(self); /* if layer hasn't been specified, get it from + other sources if possible */ { /* a couple type-based defaults for new windows */

@@ -965,6 +968,41 @@ PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop);

} } +static void client_get_layer(ObClient *self) +{ + if (!(self->above || self->below)) { + if (self->group) { + /* apply stuff from the group */ + GSList *it; + gint layer = -2; + + for (it = self->group->members; it; it = g_slist_next(it)) { + ObClient *c = it->data; + if (c != self && !client_search_transient(self, c) && + client_normal(self) && client_normal(c)) + { + layer = MAX(layer, + (c->above ? 1 : (c->below ? -1 : 0))); + } + } + switch (layer) { + case -1: + self->below = TRUE; + break; + case -2: + case 0: + break; + case 1: + self->above = TRUE; + break; + default: + g_assert_not_reached(); + break; + } + } + } +} + static void client_get_state(ObClient *self) { guint32 *state;

@@ -1001,38 +1039,6 @@ }

g_free(state); } - - if (!(self->above || self->below)) { - if (self->group) { - /* apply stuff from the group */ - GSList *it; - gint layer = -2; - - for (it = self->group->members; it; it = g_slist_next(it)) { - ObClient *c = it->data; - if (c != self && !client_search_transient(self, c) && - client_normal(self) && client_normal(c)) - { - layer = MAX(layer, - (c->above ? 1 : (c->below ? -1 : 0))); - } - } - switch (layer) { - case -1: - self->below = TRUE; - break; - case -2: - case 0: - break; - case 1: - self->above = TRUE; - break; - default: - g_assert_not_reached(); - break; - } - } - } } static void client_get_shaped(ObClient *self)

@@ -1071,25 +1077,31 @@ a dockapp, for example */

target = NULL; } -#if 0 -/* we used to do this, but it violates the ICCCM and causes problems because - toolkits seem to set transient_for = root rather arbitrarily (eg kicker's - config dialogs), so it is being removed. the ewmh provides other ways to - make things transient for their group. -dana -*/ + /* THIS IS SO ANNOYING ! ! ! ! Let me explain.... have a seat.. + + Setting the transient_for to Root is actually illegal, however + applications from time have done this to specify transient for + their group. + + Now you can do that by being a TYPE_DIALOG and not setting + the transient_for hint at all on your window. But people still + use Root, and Kwin is very strange in this regard. + + KWin 3.0 will not consider windows with transient_for set to + Root as transient for their group *UNLESS* they are also modal. + In that case, it will make them transient for the group. This + leads to all sorts of weird behavior from KDE apps which are + only tested in KWin. I'd like to follow their behavior just to + make this work right with KDE stuff, but that seems wrong. + */ if (!target && self->group) { /* not transient to a client, see if it is transient for a group */ - if (t == self->group->leader || - t == None || - t == RootWindow(ob_display, ob_screen)) - { + if (t == RootWindow(ob_display, ob_screen)) { /* window is a transient for its group! */ target = OB_TRAN_GROUP; } } -#endif - } } else if (self->type == OB_CLIENT_TYPE_DIALOG && self->group) { self->transient = TRUE;