diff --git a/settings-dialogs/tweaks-settings.c b/settings-dialogs/tweaks-settings.c
index 4442ba2..84c8526 100644
--- a/settings-dialogs/tweaks-settings.c
+++ b/settings-dialogs/tweaks-settings.c
@@ -160,6 +160,7 @@ wm_tweaks_dialog_configure_widgets (GtkBuilder *builder)
GtkWidget *cycle_hidden_check = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_hidden_check"));
GtkWidget *cycle_minimum_check = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_minimum_check"));
GtkWidget *cycle_draw_frame = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_draw_frame"));
+ GtkWidget *cycle_bring_front = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_bring_front"));
/* Focus tab */
GtkWidget *prevent_focus_stealing_check = GTK_WIDGET (gtk_builder_get_object (builder, "prevent_focus_stealing_check"));
@@ -303,6 +304,10 @@ wm_tweaks_dialog_configure_widgets (GtkBuilder *builder)
"/general/cycle_draw_frame",
G_TYPE_BOOLEAN,
(GObject *)cycle_draw_frame, "active");
+ xfconf_g_property_bind (xfwm4_channel,
+ "/general/cycle_bring_front",
+ G_TYPE_BOOLEAN,
+ (GObject *)cycle_bring_front, "active");
/* Focus tab */
xfconf_g_property_bind (xfwm4_channel,
diff --git a/settings-dialogs/xfwm4-tweaks-dialog.glade b/settings-dialogs/xfwm4-tweaks-dialog.glade
index a9e91ee..475bfba 100644
--- a/settings-dialogs/xfwm4-tweaks-dialog.glade
+++ b/settings-dialogs/xfwm4-tweaks-dialog.glade
@@ -123,6 +123,21 @@ or "skip taskbar" properties set
3
+
+
+
+ False
+ False
+ 4
+
+
diff --git a/src/cycle.c b/src/cycle.c
index 9098d35..b0f44d7 100644
--- a/src/cycle.c
+++ b/src/cycle.c
@@ -312,6 +312,11 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
{
if (c)
{
+ if (screen_info->params->cycle_bring_front)
+ {
+ /* Should we raise it up to the tabwin. Providing None will figure it out by itself. */
+ clientRaisePreview (c, None);
+ }
if (passdata->wireframe)
{
wireframeUpdate (c, passdata->wireframe);
@@ -426,6 +431,11 @@ clientCycle (Client * c, XKeyEvent * ev)
passdata.wireframe = None;
TRACE ("entering cycle loop");
+ if (screen_info->params->cycle_bring_front)
+ {
+ /* Should we raise it up to the tabwin. Providing None will figure it out by itself. */
+ clientRaisePreview ((Client *) selected->data, None);
+ }
if (screen_info->params->cycle_draw_frame)
{
passdata.wireframe = wireframeCreate ((Client *) selected->data);
@@ -435,6 +445,10 @@ clientCycle (Client * c, XKeyEvent * ev)
gtk_main ();
eventFilterPop (display_info->xfilter);
TRACE ("leaving cycle loop");
+ if (screen_info->params->cycle_bring_front)
+ {
+ clientApplyStackList (screen_info);
+ }
if (passdata.wireframe)
{
wireframeDelete (screen_info, passdata.wireframe);
diff --git a/src/settings.c b/src/settings.c
index fd84fe4..d5d250e 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -672,6 +672,7 @@ loadSettings (ScreenInfo *screen_info)
{"focus_delay", NULL, G_TYPE_INT, TRUE},
{"cycle_apps_only", NULL, G_TYPE_BOOLEAN, TRUE},
{"cycle_draw_frame", NULL, G_TYPE_BOOLEAN, TRUE},
+ {"cycle_bring_front", NULL, G_TYPE_BOOLEAN, TRUE},
{"cycle_hidden", NULL, G_TYPE_BOOLEAN, TRUE},
{"cycle_minimum", NULL, G_TYPE_BOOLEAN, TRUE},
{"cycle_workspaces", NULL, G_TYPE_BOOLEAN, TRUE},
@@ -760,6 +761,8 @@ loadSettings (ScreenInfo *screen_info)
getBoolValue ("cycle_minimum", rc);
screen_info->params->cycle_draw_frame =
getBoolValue ("cycle_draw_frame", rc);
+ screen_info->params->cycle_bring_front =
+ getBoolValue ("cycle_bring_front", rc);
screen_info->params->cycle_hidden =
getBoolValue ("cycle_hidden", rc);
screen_info->params->cycle_workspaces =
@@ -1262,6 +1265,10 @@ cb_xfwm4_channel_property_changed(XfconfChannel *channel, const gchar *property_
{
screen_info->params->cycle_draw_frame = g_value_get_boolean (value);
}
+ else if (!strcmp (name, "cycle_bring_front"))
+ {
+ screen_info->params->cycle_bring_front = g_value_get_boolean (value);
+ }
else if (!strcmp (name, "cycle_hidden"))
{
screen_info->params->cycle_hidden = g_value_get_boolean (value);
diff --git a/src/settings.h b/src/settings.h
index 6642d2a..3799054 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -199,6 +199,7 @@ struct _XfwmParams
gboolean click_to_focus;
gboolean cycle_apps_only;
gboolean cycle_draw_frame;
+ gboolean cycle_bring_front;
gboolean cycle_hidden;
gboolean cycle_minimum;
gboolean cycle_workspaces;
diff --git a/src/stacking.c b/src/stacking.c
index 1d0a59a..c41621e 100644
--- a/src/stacking.c
+++ b/src/stacking.c
@@ -529,6 +529,64 @@ clientLower (Client * c, Window wsibling)
}
}
+void
+clientRaisePreview (Client * c, Window wsibling)
+{
+ ScreenInfo *screen_info;
+ DisplayInfo *display_info;
+ Client *c2, *client_sibling;
+ GList *sibling;
+ GList *list1;
+ Window xwinstack[2];
+
+ screen_info = c->screen_info;
+ display_info = screen_info->display_info;
+
+ /* Re-apply the stack to get every thing in order */
+ clientApplyStackList (screen_info);
+
+ if (wsibling)
+ {
+ c2 = myDisplayGetClientFromWindow (display_info, wsibling, SEARCH_FRAME | SEARCH_WINDOW);
+ if (c2)
+ {
+ sibling = g_list_find (screen_info->windows_stack, (gconstpointer) c2);
+ if (sibling)
+ {
+ list1 = g_list_next (sibling);
+ if (list1)
+ {
+ client_sibling = (Client *) list1->data;
+ /* Do not place window under higher layers though */
+ if ((client_sibling) && (client_sibling->win_layer < c->win_layer))
+ {
+ client_sibling = NULL;
+ }
+ }
+ }
+ }
+ }
+ if (!client_sibling)
+ {
+ client_sibling = clientGetNextTopMost (screen_info, c->win_layer, c);
+ }
+ /* Position this window on top without changing the stack.
+ * Should we store the preview window anyway, in case another window change will trigger clientApplyStackList?
+ */
+ if (client_sibling)
+ {
+ xwinstack[0] = client_sibling->frame;
+ xwinstack[1] = c->frame;
+ /* Place the raised window just before it */
+ XRestackWindows (myScreenGetXDisplay (screen_info), xwinstack, (int) 2);
+ }
+ else
+ {
+ /* There will be no window on top of the raised window, so place it at the top */
+ XRaiseWindow (myScreenGetXDisplay (screen_info), c->frame);
+ }
+}
+
gboolean
clientAdjustFullscreenLayer (Client *c, gboolean set)
{
diff --git a/src/stacking.h b/src/stacking.h
index cfe4121..86cf8a9 100644
--- a/src/stacking.h
+++ b/src/stacking.h
@@ -50,6 +50,8 @@ void clientRaise (Client *,
Window);
void clientLower (Client *,
Window);
+void clientRaisePreview (Client *,
+ Window);
gboolean clientAdjustFullscreenLayer (Client *,
gboolean);
void clientAddToList (Client *);