From 277db2822d79a6000d31b93ec963ae87286d6ade Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 6 May 2007 08:32:03 +0000 Subject: [PATCH] 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. --- openbox/client.c | 45 ++++++++++++++++++++++++++++++++++++--------- openbox/client.h | 9 ++++++++- openbox/focus.c | 6 ++++-- openbox/openbox.c | 34 +++++++++++++++++++++------------- openbox/session.c | 1 + openbox/stacking.c | 4 ++-- 6 files changed, 72 insertions(+), 27 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 0caaa4b5..4672b8cb 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -90,6 +90,9 @@ static void client_update_transient_tree(ObClient *self, 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 @@ static void client_iconify_recursive(ObClient *self, 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_recursive(ObClient *self, 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 @@ guint client_monitor(ObClient *self) 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 @@ GSList *client_search_all_top_parents(ObClient *self) 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 */ @@ -3488,6 +3505,16 @@ GSList *client_search_all_top_parents(ObClient *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) { if (self->transient_for) { diff --git a/openbox/client.h b/openbox/client.h index afdeac50..3fab451e 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -634,10 +634,17 @@ ObClient *client_search_modal_child(ObClient *self); */ 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); diff --git a/openbox/focus.c b/openbox/focus.c index fbac20ec..eead6000 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -306,12 +306,14 @@ static void popup_cycle(ObClient *c, gboolean show) 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), diff --git a/openbox/openbox.c b/openbox/openbox.c index 63379641..8b54e70b 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -379,19 +379,27 @@ gint main(gint argc, gchar **argv) } /* 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 */ diff --git a/openbox/session.c b/openbox/session.c index 124ff8bc..64ed1787 100644 --- a/openbox/session.c +++ b/openbox/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); diff --git a/openbox/stacking.c b/openbox/stacking.c index 26726c7b..18747b9c 100644 --- a/openbox/stacking.c +++ b/openbox/stacking.c @@ -174,7 +174,7 @@ static void restack_windows(ObClient *selected, gboolean raise) /* 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 @@ static GList *find_highest_relative(ObClient *client) 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)) { -- 2.45.2