diff -ur xfwm4-4.12.3-orig/defaults/defaults xfwm4-4.12.3/defaults/defaults --- xfwm4-4.12.3-orig/defaults/defaults 2015-05-15 14:25:56.000000000 +0200 +++ xfwm4-4.12.3/defaults/defaults 2016-06-05 01:19:38.708387619 +0200 @@ -10,6 +10,7 @@ cycle_draw_frame=true cycle_hidden=true cycle_minimum=true +cycle_on_monitor=false cycle_preview=true cycle_tabwin_mode=0 cycle_workspaces=false diff -ur xfwm4-4.12.3-orig/settings-dialogs/tweaks-settings.c xfwm4-4.12.3/settings-dialogs/tweaks-settings.c --- xfwm4-4.12.3-orig/settings-dialogs/tweaks-settings.c 2015-05-16 18:41:45.000000000 +0200 +++ xfwm4-4.12.3/settings-dialogs/tweaks-settings.c 2016-06-05 00:49:22.088504842 +0200 @@ -169,6 +169,7 @@ 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_tabwin_mode = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_tabwin_mode")); + GtkWidget *cycle_on_monitor = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_on_monitor")); /* Focus tab */ GtkWidget *prevent_focus_stealing_check = GTK_WIDGET (gtk_builder_get_object (builder, "prevent_focus_stealing_check")); @@ -317,6 +318,10 @@ "/general/cycle_tabwin_mode", G_TYPE_INT, (GObject *)cycle_tabwin_mode, "active"); + xfconf_g_property_bind (xfwm4_channel, + "/general/cycle_on_monitor", + G_TYPE_BOOLEAN, + (GObject *)cycle_on_monitor, "active"); /* Focus tab */ xfconf_g_property_bind (xfwm4_channel, diff -ur xfwm4-4.12.3-orig/settings-dialogs/xfwm4-tweaks-dialog.glade xfwm4-4.12.3/settings-dialogs/xfwm4-tweaks-dialog.glade --- xfwm4-4.12.3-orig/settings-dialogs/xfwm4-tweaks-dialog.glade 2015-05-15 14:25:56.000000000 +0200 +++ xfwm4-4.12.3/settings-dialogs/xfwm4-tweaks-dialog.glade 2016-06-05 00:50:45.841081660 +0200 @@ -187,6 +187,22 @@ 4 + + + Cycle only windows on the same _monitor + False + True + True + False + True + True + + + False + False + 5 + + diff -ur xfwm4-4.12.3-orig/src/cycle.c xfwm4-4.12.3/src/cycle.c --- xfwm4-4.12.3-orig/src/cycle.c 2015-05-15 14:25:56.000000000 +0200 +++ xfwm4-4.12.3/src/cycle.c 2016-06-05 02:14:17.822672990 +0200 @@ -95,6 +95,7 @@ Client *c2; guint range, search_range, i; GList *client_list; + GdkRectangle monitor_rect; g_return_val_if_fail (c, NULL); TRACE ("entering clientCycleCreateList"); @@ -103,6 +104,11 @@ range = clientGetCycleRange (screen_info); client_list = NULL; + if (screen_info->params->cycle_on_monitor) + { + myScreenFindMonitorAtPoint(screen_info, c->x, c->y, &monitor_rect); + } + for (c2 = c, i = 0; c && i < screen_info->client_count; i++, c2 = c2->next) { search_range = range; @@ -119,6 +125,17 @@ TRACE ("%s not in select mask", c2->name); continue; } + if (screen_info->params->cycle_on_monitor) + { + GdkRectangle client_rect; + + myScreenFindMonitorAtPoint(screen_info, c2->x, c2->y, &client_rect); + + if (monitor_rect.x != client_rect.x || monitor_rect.y != client_rect.y) + { + continue; + } + } if (screen_info->params->cycle_apps_only) { /* @@ -503,7 +520,7 @@ { passdata.wireframe = wireframeCreate ((Client *) selected->data); } - passdata.tabwin = tabwinCreate (&client_list, selected, screen_info->params->cycle_workspaces); + passdata.tabwin = tabwinCreate (&client_list, selected, screen_info->params->cycle_workspaces, screen_info->params->cycle_on_monitor); eventFilterPush (display_info->xfilter, clientCycleEventFilter, &passdata); gtk_main (); diff -ur xfwm4-4.12.3-orig/src/settings.c xfwm4-4.12.3/src/settings.c --- xfwm4-4.12.3-orig/src/settings.c 2015-05-15 14:25:56.000000000 +0200 +++ xfwm4-4.12.3/src/settings.c 2016-06-05 00:44:53.807534248 +0200 @@ -717,6 +717,7 @@ {"cycle_draw_frame", NULL, G_TYPE_BOOLEAN, TRUE}, {"cycle_hidden", NULL, G_TYPE_BOOLEAN, TRUE}, {"cycle_minimum", NULL, G_TYPE_BOOLEAN, TRUE}, + {"cycle_on_monitor", NULL, G_TYPE_BOOLEAN, FALSE}, {"cycle_preview", NULL, G_TYPE_BOOLEAN, TRUE}, {"cycle_tabwin_mode", NULL, G_TYPE_INT, FALSE}, {"cycle_workspaces", NULL, G_TYPE_BOOLEAN, TRUE}, @@ -814,6 +815,8 @@ getBoolValue ("cycle_draw_frame", rc); screen_info->params->cycle_hidden = getBoolValue ("cycle_hidden", rc); + screen_info->params->cycle_on_monitor = + getBoolValue ("cycle_on_monitor", rc); screen_info->params->cycle_preview = getBoolValue ("cycle_preview", rc); screen_info->params->cycle_tabwin_mode = @@ -1341,6 +1344,10 @@ { screen_info->params->cycle_hidden = g_value_get_boolean (value); } + else if (!strcmp (name, "cycle_on_monitor")) + { + screen_info->params->cycle_on_monitor = g_value_get_boolean (value); + } else if (!strcmp (name, "cycle_workspaces")) { screen_info->params->cycle_workspaces = g_value_get_boolean (value); diff -ur xfwm4-4.12.3-orig/src/settings.h xfwm4-4.12.3/src/settings.h --- xfwm4-4.12.3-orig/src/settings.h 2015-05-15 14:25:56.000000000 +0200 +++ xfwm4-4.12.3/src/settings.h 2016-06-05 00:42:49.798583771 +0200 @@ -212,6 +212,7 @@ gboolean cycle_minimum; gboolean cycle_preview; gboolean cycle_workspaces; + gboolean cycle_on_monitor; gboolean focus_hint; gboolean focus_new; gboolean full_width_title; diff -ur xfwm4-4.12.3-orig/src/tabwin.c xfwm4-4.12.3/src/tabwin.c --- xfwm4-4.12.3-orig/src/tabwin.c 2015-05-15 14:25:56.000000000 +0200 +++ xfwm4-4.12.3/src/tabwin.c 2016-06-05 02:13:15.775752672 +0200 @@ -933,13 +933,14 @@ } Tabwin * -tabwinCreate (GList **client_list, GList *selected, gboolean display_workspace) +tabwinCreate (GList **client_list, GList *selected, gboolean display_workspace, gboolean one_monitor) { ScreenInfo *screen_info; Client *c; Tabwin *tabwin; TabwinWidget *win; int num_monitors, i; + GdkRectangle monitor_rect; g_return_val_if_fail (selected, NULL); g_return_val_if_fail (client_list, NULL); @@ -956,12 +957,28 @@ tabwin->tabwin_list = NULL; tabwin->icon_list = NULL; + if (one_monitor) + { + myScreenFindMonitorAtPoint(screen_info, c->x, c->y, &monitor_rect); + } + num_monitors = myScreenGetNumMonitors (screen_info); for (i = 0; i < num_monitors; i++) { gint monitor_index; monitor_index = myScreenGetMonitorIndex (screen_info, i); + + if (one_monitor) { + GdkRectangle monitor; + + gdk_screen_get_monitor_geometry (screen_info->gscr, monitor_index, &monitor); + if (monitor.x != monitor_rect.x || monitor.y != monitor_rect.y) + { + continue; + } + } + win = tabwinCreateWidget (tabwin, screen_info, monitor_index); tabwin->tabwin_list = g_list_append (tabwin->tabwin_list, win); } diff -ur xfwm4-4.12.3-orig/src/tabwin.h xfwm4-4.12.3/src/tabwin.h --- xfwm4-4.12.3-orig/src/tabwin.h 2015-05-15 14:25:56.000000000 +0200 +++ xfwm4-4.12.3/src/tabwin.h 2016-06-05 02:05:25.716505648 +0200 @@ -84,6 +84,7 @@ Tabwin *tabwinCreate (GList **, GList *, + gboolean, gboolean); Client *tabwinGetSelected (Tabwin *); Client *tabwinSelectHead (Tabwin *);