all repos — openbox @ 277db2822d79a6000d31b93ec963ae87286d6ade

openbox fork - make it a bit more like ryudo

a bunch of thigns got squashed into this commit.. sorry..
1. soem bug fixes for window stacking
2. clarify some functions behavior with their names
3. add (untested) support for legacy fullscreen apps. i have no idea what they do on a multihead xinerama setup though and if this would help there or need some changes.
Dana Jansens danakj@orodu.net
commit

277db2822d79a6000d31b93ec963ae87286d6ade

parent

007e62fa7722cafcd5344976cb4b621931eae3b0

6 files changed, 72 insertions(+), 27 deletions(-)

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

@@ -90,6 +90,9 @@ ObGroup *oldgroup, ObGroup *newgroup,

ObClient* oldparent, ObClient *newparent); static void client_present(ObClient *self, gboolean here, gboolean raise); +static GSList *client_search_all_top_parents_internal(ObClient *self, + gboolean bylayer, + ObStackingLayer layer); void client_startup(gboolean reconfig) {

@@ -2180,7 +2183,14 @@ static ObStackingLayer calc_layer(ObClient *self)

{ ObStackingLayer l; - if (self->fullscreen && + if ((self->fullscreen || + /* no decorations and fills the monitor means oldskool fullscreen */ + (self->frame != NULL && + (self->frame->size.top == 0 && self->frame->size.left == 0 && + self->frame->size.bottom == 0 && self->frame->size.right == 0 && + RECT_EQUAL(self->area, + *screen_physical_area_monitor(client_monitor(self)))))) + && (client_focused(self) || client_search_focus_tree(self))) l = OB_STACKING_LAYER_FULLSCREEN; else if (self->type == OB_CLIENT_TYPE_DESKTOP)

@@ -2765,7 +2775,7 @@

void client_iconify(ObClient *self, gboolean iconic, gboolean curdesk) { /* move up the transient chain as far as possible first */ - self = client_search_top_parent(self); + self = client_search_top_normal_parent(self); client_iconify_recursive(self, iconic, curdesk); }

@@ -2960,7 +2970,7 @@ }

void client_set_desktop(ObClient *self, guint target, gboolean donthide) { - self = client_search_top_parent(self); + self = client_search_top_normal_parent(self); client_set_desktop_recursive(self, target, donthide); }

@@ -3451,20 +3461,24 @@ {

return screen_find_monitor(&self->frame->area); } -ObClient *client_search_top_parent(ObClient *self) +ObClient *client_search_top_normal_parent(ObClient *self) { while (self->transient_for && self->transient_for != OB_TRAN_GROUP && - client_normal(self)) + client_normal(self->transient_for)) self = self->transient_for; return self; } -GSList *client_search_all_top_parents(ObClient *self) +static GSList *client_search_all_top_parents_internal(ObClient *self, + gboolean bylayer, + ObStackingLayer layer) { GSList *ret = NULL; - + /* move up the direct transient chain as far as possible */ - while (self->transient_for && self->transient_for != OB_TRAN_GROUP) + while (self->transient_for && self->transient_for != OB_TRAN_GROUP && + (!bylayer || self->transient_for->layer == layer) && + client_normal(self->transient_for)) self = self->transient_for; if (!self->transient_for)

@@ -3477,8 +3491,11 @@

for (it = self->group->members; it; it = g_slist_next(it)) { ObClient *c = it->data; - if (!c->transient_for && client_normal(c)) + if (!c->transient_for && client_normal(c) && + (!bylayer || c->layer == layer)) + { ret = g_slist_prepend(ret, c); + } } if (ret == NULL) /* no group parents */

@@ -3486,6 +3503,16 @@ ret = g_slist_prepend(ret, self);

} return ret; +} + +GSList *client_search_all_top_parents(ObClient *self) +{ + return client_search_all_top_parents_internal(self, FALSE, 0); +} + +GSList *client_search_all_top_parents_layer(ObClient *self) +{ + return client_search_all_top_parents_internal(self, TRUE, self->layer); } ObClient *client_search_focus_parent(ObClient *self)
M openbox/client.hopenbox/client.h

@@ -634,10 +634,17 @@ group.

*/ GSList *client_search_all_top_parents(ObClient *self); +/*! Returns a list of top-level windows which this is a transient for, and + which are in the same layer as this client. + It will only contain more than 1 element if the client is transient for its + group. +*/ +GSList *client_search_all_top_parents_layer(ObClient *self); + /*! Returns a window's top level parent. This only counts direct parents, not groups if it is transient for its group. */ -ObClient *client_search_top_parent(ObClient *self); +ObClient *client_search_top_normal_parent(ObClient *self); /*! Is one client a direct child of another (i.e. not through the group.) */ gboolean client_is_direct_child(ObClient *parent, ObClient *child);
M openbox/focus.copenbox/focus.c

@@ -306,12 +306,14 @@ a->x + a->width / 2, a->y + a->height / 2);

icon_popup_width(focus_cycle_popup, MAX(a->width/3, POPUP_WIDTH)); icon_popup_height(focus_cycle_popup, POPUP_HEIGHT); - /* use the transient's parent's title/icon */ - p = client_search_top_parent(c); + /* find our highest direct parent, including non-normal windows */ + for (p = c; p->transient_for && p->transient_for != OB_TRAN_GROUP; + p = p->transient_for); if (c->desktop != DESKTOP_ALL && c->desktop != screen_desktop) desk = screen_desktop_names[c->desktop]; + /* use the transient's parent's title/icon if we don't have one */ if (p != c && !strcmp("", (c->iconic ? c->icon_title : c->title))) title = g_strdup(p->iconic ? p->icon_title : p->title); /*ptitle = g_strconcat((c->iconic ? c->icon_title : c->title),
M openbox/openbox.copenbox/openbox.c

@@ -379,19 +379,27 @@ }

} /* we remove the session arguments from argv, so put them back */ - if (ob_sm_save_file != NULL) { - guint l = g_strv_length(argv); - argv = g_renew(gchar*, argv, l+2); - argv[l] = g_strdup("--sm-save-file"); - argv[l+1] = ob_sm_save_file; - argv[l+2] = NULL; - } - if (ob_sm_id != NULL) { - guint l = g_strv_length(argv); - argv = g_renew(gchar*, argv, l+2); - argv[l] = g_strdup("--sm-client-id"); - argv[l+1] = ob_sm_id; - argv[l+2] = NULL; + if (ob_sm_save_file != NULL || ob_sm_id != NULL) { + gchar **nargv; + gint i, l; + + l = argc + + (ob_sm_save_file != NULL ? 2 : 0) + + (ob_sm_id != NULL ? 2 : 0); + nargv = g_new0(gchar*, l+1); + for (i = 0; i < argc; ++i) + nargv[i] = argv[i]; + + if (ob_sm_save_file != NULL) { + nargv[i++] = g_strdup("--sm-save-file"); + nargv[i++] = ob_sm_save_file; + } + if (ob_sm_id != NULL) { + nargv[i++] = g_strdup("--sm-client-id"); + nargv[i++] = ob_sm_id; + } + g_assert(i == l); + argv = nargv; } /* re-run me */
M openbox/session.copenbox/session.c

@@ -358,6 +358,7 @@ static void sm_save_yourself(SmcConn conn, SmPointer data, gint save_type,

Bool shutdown, gint interact_style, Bool fast) { ob_debug_type(OB_DEBUG_SM, "Session save requested\n"); + if (!SmcRequestSaveYourselfPhase2(conn, sm_save_yourself_2, data)) { ob_debug_type(OB_DEBUG_SM, "Requst for phase 2 failed\n"); SmcSaveYourselfDone(conn, FALSE);
M openbox/stacking.copenbox/stacking.c

@@ -174,7 +174,7 @@ GSList *top_reorder = NULL;

/* if it's a transient lowering, lower its parents so that we can lower this window, or it won't move */ - top = client_search_all_top_parents(selected); + top = client_search_all_top_parents_layer(selected); /* that is, if it has any parents */ if (!(top->data == selected && top->next == NULL)) {

@@ -375,7 +375,7 @@ GList *it;

GSList *top; /* get all top level relatives of this client */ - top = client_search_all_top_parents(client); + top = client_search_all_top_parents_layer(client); /* go from the top of the stacking order down */ for (it = stacking_list; !ret && it; it = g_list_next(it)) {