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 + + + _Bring selected windows to the front while cycling + True + True + False + True + True + + + 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 *);