summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client.c45
-rw-r--r--openbox/client.h9
-rw-r--r--openbox/focus.c6
-rw-r--r--openbox/openbox.c34
-rw-r--r--openbox/session.c1
-rw-r--r--openbox/stacking.c4
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)) {