X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fstacking.c;h=29b3d1a9b064a65679668b90e4f46da6df201114;hb=86b809df8a5e6c3c65faaaeadcd6e0d196a74040;hp=cebbfc9fd72d0f3efa091b535afd20611e0ed674;hpb=1ce84062b4f84634c925a7ae2b729ba05b7c02ec;p=chaz%2Fopenbox diff --git a/openbox/stacking.c b/openbox/stacking.c index cebbfc9f..29b3d1a9 100644 --- a/openbox/stacking.c +++ b/openbox/stacking.c @@ -1,3 +1,22 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- + + stacking.c for the Openbox window manager + Copyright (c) 2006 Mikael Magnusson + Copyright (c) 2003 Ben Jansens + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + See the COPYING file for a copy of the GNU General Public License. +*/ + #include "openbox.h" #include "prop.h" #include "screen.h" @@ -23,7 +42,7 @@ void stacking_set_list() /* create an array of the window ids (from bottom to top, reverse order!) */ if (stacking_list) { - windows = g_new(Window, g_list_length(stacking_list)); + windows = g_new(Window, g_list_length(stacking_list)); for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) { if (WINDOW_IS_CLIENT(it->data)) windows[i++] = WINDOW_AS_CLIENT(it->data)->window; @@ -31,18 +50,19 @@ void stacking_set_list() } PROP_SETA32(RootWindow(ob_display, ob_screen), - net_client_list_stacking, window, (guint32*)windows, i); + net_client_list_stacking, window, (gulong*)windows, i); g_free(windows); } static void do_restack(GList *wins, GList *before) { - GList *it, *next; + GList *it; Window *win; - int i; + gint i; #ifdef DEBUG + GList *next; /* pls only restack stuff in the same layer at a time */ for (it = wins; it; it = next) { next = g_list_next(it); @@ -88,7 +108,7 @@ static void do_raise(GList *wins) { GList *it; GList *layer[OB_NUM_STACKING_LAYERS] = {NULL}; - int i; + gint i; for (it = wins; it; it = g_list_next(it)) { ObStackingLayer l; @@ -115,7 +135,7 @@ static void do_lower(GList *wins) { GList *it; GList *layer[OB_NUM_STACKING_LAYERS] = {NULL}; - int i; + gint i; for (it = wins; it; it = g_list_next(it)) { ObStackingLayer l; @@ -143,7 +163,7 @@ static GList *pick_windows(ObClient *top, ObClient *selected, gboolean raise) GList *ret = NULL; GList *it, *next, *prev; GSList *sit; - int i, n; + gint i, n; GList *modals = NULL; GList *trans = NULL; GList *modal_sel = NULL; /* the selected guys if modal */ @@ -210,14 +230,13 @@ static GList *pick_windows(ObClient *top, ObClient *selected, gboolean raise) return ret; } -#if 0 static GList *pick_group_windows(ObClient *top, ObClient *selected, - gboolean raise) + gboolean raise, gboolean normal) { GList *ret = NULL; GList *it, *next, *prev; GSList *sit; - int i, n; + gint i, n; /* add group members in their stacking order */ if (top->group) { @@ -228,20 +247,34 @@ static GList *pick_group_windows(ObClient *top, ObClient *selected, next = g_list_next(it); if ((sit = g_slist_find(top->group->members, it->data))) { + ObClient *c; + ObClientType t; + ++i; - ret = g_list_concat(ret, - pick_windows(sit->data, selected, raise)); - /* if we dont have a prev then start back at the beginning, - otherwise skip back to the prev's next */ - next = prev ? g_list_next(prev) : stacking_list; + c = it->data; + t = c->type; + + if ((c->desktop == selected->desktop || + c->desktop == DESKTOP_ALL) && + (t == OB_CLIENT_TYPE_TOOLBAR || + t == OB_CLIENT_TYPE_MENU || + t == OB_CLIENT_TYPE_UTILITY || + (normal && t == OB_CLIENT_TYPE_NORMAL))) + { + ret = g_list_concat(ret, + pick_windows(sit->data, + selected, raise)); + /* if we dont have a prev then start back at the beginning, + otherwise skip back to the prev's next */ + next = prev ? g_list_next(prev) : stacking_list; + } } } } return ret; } -#endif -void stacking_raise(ObWindow *window) +void stacking_raise(ObWindow *window, gboolean group) { GList *wins; @@ -249,9 +282,10 @@ void stacking_raise(ObWindow *window) ObClient *c; ObClient *selected; selected = WINDOW_AS_CLIENT(window); - /*c = client_search_top_transient(selected);*/ c = selected; + c = client_search_top_transient(selected); wins = pick_windows(c, selected, TRUE); - /*wins = g_list_concat(wins, pick_group_windows(c, selected, TRUE));*/ + wins = g_list_concat(wins, + pick_group_windows(c, selected, TRUE, group)); } else { wins = g_list_append(NULL, window); stacking_list = g_list_remove(stacking_list, window); @@ -260,7 +294,7 @@ void stacking_raise(ObWindow *window) g_list_free(wins); } -void stacking_lower(ObWindow *window) +void stacking_lower(ObWindow *window, gboolean group) { GList *wins; @@ -270,7 +304,8 @@ void stacking_lower(ObWindow *window) selected = WINDOW_AS_CLIENT(window); c = client_search_top_transient(selected); wins = pick_windows(c, selected, FALSE); - /*wins = g_list_concat(pick_group_windows(c, selected, FALSE), wins);*/ + wins = g_list_concat(pick_group_windows(c, selected, FALSE, group), + wins); } else { wins = g_list_append(NULL, window); stacking_list = g_list_remove(stacking_list, window); @@ -295,17 +330,11 @@ void stacking_below(ObWindow *window, ObWindow *below) void stacking_add(ObWindow *win) { - ObStackingLayer l; - GList *wins; - g_assert(screen_support_win != None); /* make sure I dont break this in the - future */ - - l = window_layer(win); - wins = g_list_append(NULL, win); /* list of 1 element */ + future */ stacking_list = g_list_append(stacking_list, win); - stacking_raise(win); + stacking_raise(win, FALSE); } void stacking_add_nonintrusive(ObWindow *win) @@ -330,10 +359,11 @@ void stacking_add_nonintrusive(ObWindow *win) GList *it; if (client->group) - for (it = stacking_list; !parent && it; it = it->next) { + for (it = stacking_list; !parent && it; it = g_list_next(it)) { if ((sit = g_slist_find(client->group->members, it->data))) for (sit = client->group->members; !parent && sit; - sit = sit->next) { + sit = g_slist_next(sit)) + { ObClient *c = sit->data; /* checking transient_for prevents infinate loops! */ if (sit->data == it->data && !c->transient_for)