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)
{
{
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)
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);
}
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);
}
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)
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 */
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) {
*/
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);
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),
}
/* 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 */
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);
/* 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)) {
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)) {