all repos — openbox @ 94140a4b359d5e570a8a886dc359d64f5fcaaf86

openbox fork - make it a bit more like ryudo

get rid of client->transient_for. just client->parents and client->transient_for_group now.
Dana Jansens danakj@orodu.net
commit

94140a4b359d5e570a8a886dc359d64f5fcaaf86

parent

a79e51c64fdfa1ffd303a5a96c6ae9e393b1353a

3 files changed, 53 insertions(+), 58 deletions(-)

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

@@ -85,6 +85,7 @@ static gboolean client_restore_session_stacking(ObClient *self);

static ObAppSettings *client_get_settings_state(ObClient *self); static void client_update_transient_tree(ObClient *self, ObGroup *oldgroup, ObGroup *newgroup, + gboolean oldgtran, gboolean newgtran, ObClient* oldparent, ObClient *newparent); static void client_present(ObClient *self, gboolean here, gboolean raise);

@@ -1038,7 +1039,7 @@ client_update_protocols(self);

client_update_wmhints(self); /* this may have already been called from client_update_wmhints */ - if (self->transient_for == NULL) + if (!self->parents && !self->transient_for_group) client_update_transient_for(self); client_get_startup_id(self);

@@ -1196,6 +1197,7 @@ void client_update_transient_for(ObClient *self)

{ Window t = None; ObClient *target = NULL; + gboolean trangroup = FALSE; if (XGetTransientForHint(ob_display, self->window, &t)) { if (t != self->window) { /* cant be transient to itself! */

@@ -1207,35 +1209,40 @@ /* this can happen when a dialog is a child of

a dockapp, for example */ target = NULL; } - - /* Setting the transient_for to Root is actually illegal, however - applications from time have done this to specify transient for - their group */ - if (!target && self->group) { - /* not transient to a client, see if it is transient for a - group */ - if (t == RootWindow(ob_display, ob_screen)) { - /* window is a transient for its group! */ - target = OB_TRAN_GROUP; - } - } } - } else if (self->transient && self->group) - target = OB_TRAN_GROUP; + + /* Setting the transient_for to Root is actually illegal, however + applications from time have done this to specify transient for + their group */ + if (!target && self->group && t == RootWindow(ob_display, ob_screen)) + trangroup = TRUE; + } else if (self->group && self->transient) + trangroup = TRUE; client_update_transient_tree(self, self->group, self->group, - self->transient_for, target); - self->transient_for = target; + self->transient_for_group, trangroup, + client_direct_parent(self), target); + self->transient_for_group = trangroup; } static void client_update_transient_tree(ObClient *self, ObGroup *oldgroup, ObGroup *newgroup, + gboolean oldgtran, gboolean newgtran, ObClient* oldparent, ObClient *newparent) { GSList *it, *next; ObClient *c; + + g_assert(!oldgtran || oldgroup); + g_assert(!newgtran || newgroup); + g_assert((!oldgtran && !oldparent) || + (oldgtran && !oldparent) || + (!oldgtran && oldparent)); + g_assert((!newgtran && !newparent) || + (newgtran && !newparent) || + (!newgtran && newparent)); /* * * Group transient windows are not allowed to have other group

@@ -1244,7 +1251,9 @@ * * */

/* No change has occured */ - if (oldgroup == newgroup && oldparent == newparent) return; + if (oldgroup == newgroup && + oldgtran == newgtran && + oldparent == newparent) return; /** Remove the client from the transient tree wherever it has changed **/

@@ -1256,9 +1265,9 @@ Group transients can't be children of group transients already, but

we could have any number of direct parents above up, any of which could be transient for the group, and we need to remove it from our children. */ - if (oldparent != newparent && - newparent != NULL && newparent != OB_TRAN_GROUP && - newgroup != NULL && newgroup == oldgroup && client_normal(newparent)) + if (!oldgtran && oldparent != newparent && newparent != NULL && + newgroup != NULL && newgroup == oldgroup && + client_normal(newparent)) { ObClient *look = client_search_top_direct_parent(newparent); self->transients = g_slist_remove(self->transients, look);

@@ -1270,9 +1279,8 @@ /* If the group changed, or if we are just becoming transient for the

group, then we need to remove any old group transient windows from our children. But if we were already transient for the group, then other group transients are not our children. */ - if ((oldgroup != newgroup || - (newparent == OB_TRAN_GROUP && oldparent != newparent)) && - oldgroup != NULL && oldparent != OB_TRAN_GROUP) + if ((oldgroup != newgroup || (newgtran && oldgtran != newgtran)) && + oldgroup != NULL && !oldgtran) { for (it = self->transients; it; it = next) { next = g_slist_next(it);

@@ -1287,14 +1295,12 @@

/* If we used to be transient for a group and now we are not, or we're transient for a new group, then we need to remove ourselves from all our ex-parents */ - if (oldparent == OB_TRAN_GROUP && (oldgroup != newgroup || - oldparent != newparent)) + if (oldgtran && (oldgroup != newgroup || oldgtran != newgtran)) { for (it = self->parents; it; it = next) { next = g_slist_next(it); c = it->data; - if (c->transient_for != OB_TRAN_GROUP && client_normal(c)) - { + if (!c->transient_for_group && client_normal(c)) { c->transients = g_slist_remove(c->transients, self); self->parents = g_slist_delete_link(self->parents, it); }

@@ -1302,8 +1308,8 @@ }

} /* If we used to be transient for a single window and we are no longer transient for it, then we need to remove ourself from its children */ - else if (oldparent != NULL && oldparent != OB_TRAN_GROUP && - oldparent != newparent && client_normal(oldparent)) + else if (oldparent && oldparent != newparent && + client_normal(oldparent)) { oldparent->transients = g_slist_remove(oldparent->transients, self); self->parents = g_slist_remove(self->parents, oldparent);

@@ -1313,13 +1319,11 @@ /** Re-add the client to the transient tree wherever it has changed **/

/* If we're now transient for a group and we weren't transient for it before then we need to add ourselves to all our new parents */ - if (newparent == OB_TRAN_GROUP && (oldgroup != newgroup || - oldparent != newparent)) + if (newgtran && (oldgroup != newgroup || oldgtran != newgtran)) { for (it = oldgroup->members; it; it = g_slist_next(it)) { c = it->data; - if (c != self && - c->transient_for != OB_TRAN_GROUP && client_normal(c)) + if (c != self && !c->transient_for_group && client_normal(c)) { c->transients = g_slist_prepend(c->transients, self); self->parents = g_slist_prepend(self->parents, c);

@@ -1332,8 +1336,7 @@

WARNING: Cyclical transient ness is possible if two windows are transient for eachother. */ - else if (newparent != NULL && newparent != OB_TRAN_GROUP && - newparent != oldparent && + else if (newparent && newparent != oldparent && /* don't make ourself its child if it is already our child */ !client_is_direct_child(self, newparent) && client_normal(newparent))

@@ -1352,13 +1355,12 @@ B is transient for A

C is transient for B A can't be transient for C or we have a cycle */ - if (oldgroup != newgroup && newgroup != NULL && - newparent != OB_TRAN_GROUP && + if (oldgroup != newgroup && newgroup != NULL && !newgtran && client_normal(self)) { for (it = newgroup->members; it; it = g_slist_next(it)) { c = it->data; - if (c != self && c->transient_for == OB_TRAN_GROUP && + if (c != self && c->transient_for_group && /* Don't make it our child if it is already our parent */ !client_is_direct_child(c, self)) {

@@ -1834,8 +1836,10 @@

/* Put ourselves into the new group's transient tree, and remove ourselves from the old group's */ client_update_transient_tree(self, oldgroup, self->group, - self->transient_for, - self->transient_for); + self->transient_for_group, + self->transient_for_group, + client_direct_parent(self), + client_direct_parent(self)); /* Lastly, being in a group, or not, can change if the window is transient for anything.

@@ -1849,7 +1853,7 @@ If parents was NULL and oldgroup was NULL we can assume

that when we add the new group, it will become transient for something. - If transient_for was OB_TRAN_GROUP, then it must have already + If transient_for_group is TRUE, then it must have already had a group. If it is getting a new group, the above call to client_update_transient_tree has already taken care of everything ! If it is losing all group status then it will

@@ -1858,7 +1862,7 @@ updated.

*/ if (self->transient && ((self->parents == NULL && oldgroup == NULL) || - (self->transient_for == OB_TRAN_GROUP && !self->group))) + (self->transient_for_group && !self->group))) client_update_transient_for(self); }

@@ -3707,7 +3711,7 @@

ObClient *client_direct_parent(ObClient *self) { if (!self->parents) return NULL; - if (self->transient_for == OB_TRAN_GROUP) return NULL; + if (self->transient_for_group) return NULL; return self->parents->data; }
M openbox/client.hopenbox/client.h

@@ -36,10 +36,6 @@

typedef struct _ObClient ObClient; typedef struct _ObClientIcon ObClientIcon; -/* The value in client.transient_for indicating it is a transient for its - group instead of for a single window */ -#define OB_TRAN_GROUP ((void*)~0l) - /*! Holds an icon in ARGB format */ struct _ObClientIcon {

@@ -93,16 +89,11 @@

/*! Saved session data to apply to this client */ struct _ObSessionState *session; - /*! Whether or not the client is a transient window. This is guaranteed to - be TRUE if transient_for != NULL, but not guaranteed to be FALSE if - transient_for == NULL. */ + /*! Whether or not the client is a transient window. It may or may not + have parents when this is true. */ gboolean transient; - /*! The client which this client is a transient (child) for. - A value of TRAN_GROUP signifies that the window is a transient for all - members of its ObGroup, and is not a valid pointer to be followed in this - case. - */ - ObClient *transient_for; + /*! Whether or not the client is transient for its group */ + gboolean transient_for_group; /*! The client which are parents of this client */ GSList *parents; /*! The clients which are transients (children) of this client */
M openbox/stacking.copenbox/stacking.c

@@ -233,7 +233,7 @@ wins = g_list_concat(modals, trans);

wins = g_list_append(wins, selected); /* if selected window is transient for group then raise it above others */ - if (selected->transient_for == OB_TRAN_GROUP) { + if (selected->transient_for_group) { /* if it's modal, raise it above those also */ if (selected->modal) { wins = g_list_concat(wins, group_modals);