all repos — openbox @ 6273bf2e94a777760fee5346c290fb6672a0cb70

openbox fork - make it a bit more like ryudo

Make RaiseLower work for the dock as well

As a side effect, _NET_RESTACK_REQUEST now also allows specifying the dock as the sibling.
Mikael Magnusson mikachu@gmail.com
commit

6273bf2e94a777760fee5346c290fb6672a0cb70

parent

7b3dc69468e3cb97117b82036041afd9d89912e1

3 files changed, 69 insertions(+), 15 deletions(-)

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

@@ -1198,7 +1198,7 @@ move = TRUE;

} if (e->xconfigurerequest.value_mask & CWStackMode) { - ObClient *sibling = NULL; + ObWindow *sibling = NULL; gulong ignore_start; gboolean ok = TRUE;

@@ -1209,7 +1209,11 @@ win = window_find(e->xconfigurerequest.above);

if (win && WINDOW_IS_CLIENT(win) && WINDOW_AS_CLIENT(win) != client) { - sibling = WINDOW_AS_CLIENT(win); + sibling = win; + } + else if (win && WINDOW_IS_DOCK(win)) + { + sibling = win; } else /* an invalid sibling was specified so don't restack at

@@ -1560,13 +1564,17 @@ "_NET_RESTACK_WINDOW sent for window %s with "

"invalid source indication %ld", client->title, e->xclient.data.l[0]); } else { - ObClient *sibling = NULL; + ObWindow *sibling = NULL; if (e->xclient.data.l[1]) { ObWindow *win = window_find(e->xclient.data.l[1]); if (WINDOW_IS_CLIENT(win) && WINDOW_AS_CLIENT(win) != client) { - sibling = WINDOW_AS_CLIENT(win); + sibling = win; + } + if (WINDOW_IS_DOCK(win)) + { + sibling = win; } if (sibling == NULL) ob_debug_type(OB_DEBUG_APP_BUGS,
M openbox/stacking.copenbox/stacking.c

@@ -26,6 +26,8 @@ #include "frame.h"

#include "window.h" #include "event.h" #include "debug.h" +#include "dock.h" +#include "config.h" #include "obt/prop.h" GList *stacking_list = NULL;

@@ -567,14 +569,18 @@

/*! Returns TRUE if client is occluded by the sibling. If sibling is NULL it tries against all other clients. */ -static gboolean stacking_occluded(ObClient *client, ObClient *sibling) +static gboolean stacking_occluded(ObClient *client, ObWindow *sibling_win) { GList *it; gboolean occluded = FALSE; + ObClient *sibling = NULL; + + if (sibling_win && WINDOW_IS_CLIENT(sibling_win)) + sibling = WINDOW_AS_CLIENT(sibling_win); /* no need for any looping in this case */ if (sibling && client->layer != sibling->layer) - return occluded; + return FALSE; for (it = g_list_previous(g_list_find(stacking_list, client)); it; it = g_list_previous(it))

@@ -601,6 +607,21 @@ else if (c->layer > client->layer)

break; /* we past its layer */ } } + } else if (WINDOW_IS_DOCK(it->data)) { + ObDock *dock = it->data; + if (RECT_INTERSECTS_RECT(dock->area, client->frame->area)) + { + if (sibling_win != NULL) { + if (DOCK_AS_WINDOW(dock) == sibling_win) { + occluded = TRUE; + break; + } + } + else if (config_dock_layer == client->layer) { + occluded = TRUE; + break; + } + } } return occluded; }

@@ -608,14 +629,18 @@

/*! Returns TRUE if client occludes the sibling. If sibling is NULL it tries against all other clients. */ -static gboolean stacking_occludes(ObClient *client, ObClient *sibling) +static gboolean stacking_occludes(ObClient *client, ObWindow *sibling_win) { GList *it; gboolean occludes = FALSE; + ObClient *sibling = NULL; + + if (sibling_win && WINDOW_IS_CLIENT(sibling_win)) + sibling = WINDOW_AS_CLIENT(sibling_win); /* no need for any looping in this case */ if (sibling && client->layer != sibling->layer) - return occludes; + return FALSE; for (it = g_list_next(g_list_find(stacking_list, client)); it; it = g_list_next(it))

@@ -643,13 +668,34 @@ break; /* we past its layer */

} } } + else if (WINDOW_IS_DOCK(it->data)) { + ObDock *dock = it->data; + if (RECT_INTERSECTS_RECT(dock->area, client->frame->area)) + { + if (sibling_win != NULL) { + if (DOCK_AS_WINDOW(dock) == sibling_win) { + occludes = TRUE; + break; + } + } + else if (config_dock_layer == client->layer) { + occludes = TRUE; + break; + } + } + } return occludes; } -gboolean stacking_restack_request(ObClient *client, ObClient *sibling, +gboolean stacking_restack_request(ObClient *client, ObWindow *sibling_win, gint detail) { gboolean ret = FALSE; + + ObClient *sibling = NULL; + + if (sibling_win && WINDOW_IS_CLIENT(sibling_win)) + sibling = WINDOW_AS_CLIENT(sibling_win); if (sibling && ((client->desktop != sibling->desktop && client->desktop != DESKTOP_ALL &&

@@ -674,7 +720,7 @@ ob_debug("Restack request BottomIf for client %s sibling %s",

client->title, sibling ? sibling->title : "(all)"); /* if this client occludes sibling (or anything if NULL), then lower it to the bottom */ - if (stacking_occludes(client, sibling)) { + if (stacking_occludes(client, sibling_win)) { stacking_lower(CLIENT_AS_WINDOW(client)); ret = TRUE; }

@@ -688,7 +734,7 @@ break;

case TopIf: ob_debug("Restack request TopIf for client %s sibling %s", client->title, sibling ? sibling->title : "(all)"); - if (stacking_occluded(client, sibling)) { + if (stacking_occluded(client, sibling_win)) { stacking_raise(CLIENT_AS_WINDOW(client)); ret = TRUE; }

@@ -696,11 +742,11 @@ break;

case Opposite: ob_debug("Restack request Opposite for client %s sibling %s", client->title, sibling ? sibling->title : "(all)"); - if (stacking_occluded(client, sibling)) { + if (stacking_occluded(client, sibling_win)) { stacking_raise(CLIENT_AS_WINDOW(client)); ret = TRUE; } - else if (stacking_occludes(client, sibling)) { + else if (stacking_occludes(client, sibling_win)) { stacking_lower(CLIENT_AS_WINDOW(client)); ret = TRUE; }
M openbox/stacking.hopenbox/stacking.h

@@ -71,7 +71,7 @@ void stacking_below(struct _ObWindow *window, struct _ObWindow *below);

/*! Restack a window based upon a sibling (or all windows) in various ways. @param client The client to be restacked - @param sibling Another client to compare to, or NULL to compare to all + @param sibling A window to compare to, or NULL to compare to all windows @param detail One of Above, Below, TopIf, BottomIf, Opposite @return TRUE if the client was restacked

@@ -79,7 +79,7 @@ See http://tronche.com/gui/x/xlib/window/configure.html for details on

how each detail works with and without a sibling. */ gboolean stacking_restack_request(struct _ObClient *client, - struct _ObClient *sibling, + struct _ObWindow *sibling_win, gint detail); #endif