diff -Naur xfwm4-4.8.2-orig//settings-dialogs/tweaks-settings.c xfwm4-4.8.2/settings-dialogs/tweaks-settings.c --- xfwm4-4.8.2-orig//settings-dialogs/tweaks-settings.c 2011-09-22 21:12:37.000000000 +0200 +++ xfwm4-4.8.2/settings-dialogs/tweaks-settings.c 2012-01-26 17:50:47.000000000 +0100 @@ -160,6 +160,7 @@ 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_arrow_keys = GTK_WIDGET (gtk_builder_get_object (builder, "cycle_arrow_keys")); /* Focus tab */ GtkWidget *prevent_focus_stealing_check = GTK_WIDGET (gtk_builder_get_object (builder, "prevent_focus_stealing_check")); @@ -303,6 +304,10 @@ "/general/cycle_draw_frame", G_TYPE_BOOLEAN, (GObject *)cycle_draw_frame, "active"); + xfconf_g_property_bind (xfwm4_channel, + "/general/cycle_arrow_keys", + G_TYPE_BOOLEAN, + (GObject *)cycle_arrow_keys, "active"); /* Focus tab */ xfconf_g_property_bind (xfwm4_channel, diff -Naur xfwm4-4.8.2-orig//settings-dialogs/xfwm4-tweaks-dialog.glade xfwm4-4.8.2/settings-dialogs/xfwm4-tweaks-dialog.glade --- xfwm4-4.8.2-orig//settings-dialogs/xfwm4-tweaks-dialog.glade 2011-09-22 21:12:37.000000000 +0200 +++ xfwm4-4.8.2/settings-dialogs/xfwm4-tweaks-dialog.glade 2012-01-26 17:50:47.000000000 +0100 @@ -123,6 +123,21 @@ 3 + + + _Allow left/right arrow keys while cycling + True + True + False + True + True + + + False + False + 4 + + diff -Naur xfwm4-4.8.2-orig//settings-dialogs/xfwm4-tweaks-dialog_ui.h xfwm4-4.8.2/settings-dialogs/xfwm4-tweaks-dialog_ui.h --- xfwm4-4.8.2-orig//settings-dialogs/xfwm4-tweaks-dialog_ui.h 2011-09-22 21:13:03.000000000 +0200 +++ xfwm4-4.8.2/settings-dialogs/xfwm4-tweaks-dialog_ui.h 2012-01-26 17:52:43.000000000 +0100 @@ -74,490 +74,498 @@ "/property>TrueTrueFalseFalse3TrueC_yclingTrueFalseTrue12vertical6A" - "ctivate _focus stealing prevention3_Allow left/right arrow keys while cyclingTrueTrueFalseTrueTrueFals" + "eFalse4TrueC_ycling<" + "/property>TrueFalseTr" + "ue12vertical6Activate _focus" + " stealing preventionTrueTrueFalseTrueTrue" + "FalseFalse" + "0Honor _standard ICCCM focus hintTrueTrueFalseTrueTrueFalseFalse1T" + "ruevertical6True0When a" + " window raises itself:0True612True6vertical6_Bring window on current workspaceTrueTrueFalseTrueTrueFalseFalse0Honor _standard ICCC" - "M focus hintTrueTrueFalseTrueTrueFalseFalse1Truevertical6True0When a window raises itself:TrueTrueTrue0Switch to win_dow\'s workspaceTrueTrueFalseTrueTrueTrueactivate_action_bring_option1Do _nothingTrueTrueFalseTrueTrueTruea" + "ctivate_action_bring_option21FalseFalse21True_FocusTrue1FalseTrue" + "12vertical6True12True0Key used to _grab and move windows:Trueeasy_click_combo_boxFalseFalse0TrueFalseFalse1FalseFalse0True612True6vertical6_Bring window on current workspaceTrueTrueFalseTrueTrueTrue0Switch to win_dow\'s workspace<" + "s=\"GtkCheckButton\" id=\"raise_with_any_button_check\">_Raise windows when any mouse button is " + "pressedTrueTrueFa" + "lseTrueTrueFalseFalse1Hide _frame of windows when maximized<" "/property>TrueTrueFalseTrueTrueTrueactivate_action_bring_option1" - "Do _nothingTrueTrueFalseTrue" - "TrueTrueactivate_action_bring_option2" - "1FalseFalse2" - "1True_FocusTrue1FalseTrue12vertical6True12True0Key used to _grab and move wind" - "ows:Trueeasy_click_combo_boxFalse" - "False0TrueFalseFalse1FalseFal" - "se0" - "_Raise windows when a" - "ny mouse button is pressedTrueTrueFalseTrue<" - "/property>TrueFalseFalse1Hide _frame of wind" - "ows when maximizedTrue" - "TrueFalseTrueTrueFalseFalse2Restore original _size of maxim" - "ized windows when movingTrueTrueFalseTrueTrueFalseF" - "alse3Use _edge resistance instead " - "of window snappingTrue" - "TrueFalseTrueTrueFalseFalse4Notify of _urgency by making window\'s d" - "ecoration blinkTrueTrueFalseTrue<" - "property name=\"draw_indicator\">TrueFalseFalse5" - "Keep urgent windows _blinking repeat" - "edlyTrueTrueFalse" - "TrueTrueFalseFalse6<" - "property name=\"position\">2True_Access" - "ibilityTrue2FalseTrue12verti" - "cal6Use the _mouse wheel on the desktop to swit" - "ch workspacesTrueTrueFalseTrueTrueFalseFalse0_Remember and recall previous work" - "space\nwhen switching via keyboard shortcutsTrueTrueFalseTrueTrueFalseFalse1Wrap works" - "paces depending on the actual desktop _layoutTrueTrue" - "FalseTrueTrueFalseFalse2Wrap work" - "spaces when the _first or the last workspace is reachedTrueFalseFalse2Restore original _size of maximized windows when m" + "ovingTrueTrueFals" + "eTrueTrueFalseFalse3Use _edge resistance instead of window snappingTrueTrueFalseTrueTrueFalseFalse4Notify of _urgency by making window\'s decoration blinkTrueTrueFalseTrueTrueFalseFalse5Keep urgent windows _blinking repeatedlyTrueTrue<" "/property>FalseTrueTrueFalseFalse33True_WorkspacesTrue3FalseTrue12<" - "/property>vertical6True0_Minimum siz" - "e of windows to trigger smart placement:Trueplacemen" - "t_ratio_scaleFal" - "seFalse0True612TrueTrue<i>Sm" - "all</i>TrueFalseFalse0TrueTrueadjustment1FalseFalse1True&" - "lt;i>Large</i>TrueFalse2FalseFalse1<" - "/packing>Truevertical6True0By default, place windows:0" - "True612True6v" - "ertical6At the _center of the screen" - "True" - "TrueFalseTrueTrue0" - "Under the mouse _pointerTrueTrueFalseTrueTrueTrueplacement_center_op" - "tion11FalseFalse<" - "property name=\"position\">24True_P" - "lacementTrue4FalseTrue12vert" - "ical6_Enable display compositingTrueTrueFalseTrueTrueFalseFalse0TrueFalseTrueneverautomaticTru" - "equeuenoneTrue612<" - "/property>Truevertical6Display _fullscreen overlay windows directly62True_AccessibilityTrue2FalseTrue" + "12vertical6Use the _mouse wheel on the desktop to switch workspacesTrueTrueFalseTrueTrueFals" + "eFalse0_Remember and recall previous workspace\nwhen switching v" + "ia keyboard shortcutsTrueTrueFalseTrueTrueFalseFals" + "e1<" + "child>Wrap workspaces depending on the" + " actual desktop _layoutTrueTrueFalseTrueTrueFalseFa" + "lse2Wrap workspaces when the _first" + " or the last workspace is reached" + "TrueTrueFalseTrueTrueFalseFalse33True_WorkspacesTrue3False<" + "child>True12vertical6True0_Minimum size of windows to tri" + "gger smart placement:Trueplacement_ratio_scaleFalseFalse0True612T" + "rueTrue<i>Small</i>TrueFalseFalse0TrueTrueadjustment1FalseFalse1" + "True<i>Large</i" + ">TrueFalse2" + "FalseFalse" + "1Truevertical<" + "/property>6True0By default, place windows:0True612True6vertical6At the _center of the screenTrueTrueFalseTrueTrue0<" + "/child>Under the mouse _po" + "interTrueTrueFals" + "eTrueTrueTrueplacement_center_option11Fals" + "eFalse24True_PlacementTrue4FalseTrue12vertical6_Enable display compositingTrueTrueFalseTrueTrueFalseFalse0TrueFalseTrue" + "neverautomaticTruequeue" + "none" + "True612Truevertical6Display _fullscreen overlay windows directlyTrueTrueFalseTrueTrueFalse0Show shadows under _regular windowsTrueTrueFalseTrueTrueFalse0Show shadows under _r" - "egular windowsTrueTrueFalseTrueTrueFalse1Sh" - "ow shadows under pop_up windowsTr" - "ueTrueFalse" - "TrueTrueFalse2Show shadows under _dock windowsTrueTrueFalseTrueTrueFalse3True0Opaci_ty of window decorations:True" - "frame_opacity_scaleFalse4True212TrueTrue<i>" - "Transparent</i>TrueFalseFalse0TrueTruediscontinuo" - "usadjustment2FalseFalse1True<i>Opaque</i>TrueFalseFalse2FalseFalse5True0Opacity of _inactive win" - "dows:Trueinactive_opacity_scale<" - "packing>FalseFalse6True212TrueTrue<i>" - "Transparent</i>TrueFalseFalse0TrueTruediscont" - "inuousadjustment3FalseFalse1True<i>Opaque</i>TrueFalseFalse<" - "property name=\"position\">2FalseFalse7True0Opacity of windows " - "during _move:Truemove_opacity_scaleFalseFalse8True212True" - "True<i" - ">Transparent</i>True<" + ">False1Show shadows under po" + "p_up windowsTrueTrueFalseTrueTrueFalse2Show " + "shadows under _dock windowsTrueTrueFalseTrue" + "TrueFalse3True0Op" + "aci_ty of window decorations:Trueframe_opacity_scale<" "/property>False<" - "property name=\"fill\">False0TrueTruediscont" - "inuousadjustment4FalseFalse1True<i>Opaque</i>TrueFalseFalse<" - "property name=\"position\">2FalseFalse9True0Opacity of windows " - "during resi_ze:Trueresize_opacity_scaleFalseFalse10" - "True212TrueTrue&" - "lt;i>Transparent</i>T" - "rueFalseFalse" - "0TrueTrued" - "iscontinuousadjustment5FalseFalse1True<i>Opaque</i>True4Tr" + "ue212TrueTrue<i>Transparent</i>" + ";TrueFalseF" + "alse0TrueTruediscontinuousadjustment2FalseFalse1True<i>Opaque</i>TrueFalseFalse2FalseFalse5True0Opacity of _inactive windows:Trueinactive_opacity_scaleFalseFalse6" + "True212TrueTrue<i>Transparent</i&g" + "t;TrueFalse" + "False0TrueTru" + "ediscontinuousadjustment3FalseFals" + "e1<" + "/packing>True<i>Opaque</i>TrueFalse" + "False2FalseFal" + "se7" + "True0Opacity of windows during _move:Truemove_opacity_scaleFalseFalse2" - "FalseFalse11True" - "0Opacity of po" - "pup window_s:Truepopup_opacity_scale8True212TrueTrue<i>Transparent<" + "/i>True" + "FalseFalse0<" + "/child>TrueTru" + "ediscontinuousadjustment4FalseFals" + "e1<" + "/packing>True<i>Opaque</i>TrueFalse" + "False2FalseFal" + "se9" + "True0Opacity of windows during resi_ze:Trueresize_opacity_scaleFalseFalse10True212TrueTrue<i>Transparent" + "</i>TrueFalseFalse12True2<" - "/property>12TrueTrue<" - "i>Transparent</i>True" - "False" - "False0TrueTruedisco" - "ntinuousadjustment6" - "FalseFalse1True<i>Opaque</i>TrueFalseFalse2FalseFalse131<" - "/child>5TrueC_ompositorTrue5False1<" - "child internal-child=\"action_area\">Trueendgtk-helpTrueFalse<" - "/property>TrueTrueTrueFalseFalse0True" - "gtk-closeTrueTrue" - "TrueTrueFalseFalse1Falseend0button2but" - "ton1" + "fill\">False0TrueTruediscontinuousadjustment5False" + "False1<" + "property name=\"visible\">True<i>Opaque</i>TrueF" + "alseFalse2False" + "False11True0Opacity of popup window_s:Truepopup_opacity_scaleFalseFalse12True212TrueTrue<i>Transparent<" + "/i>True" + "FalseFalse0<" + "/child>TrueTr" + "uediscontinuous<" + "property name=\"adjustment\">adjustment6FalseFal" + "se1" + "True<i>Opaque</i>TrueFals" + "eFalse2FalseFa" + "lse13" + "15TrueC" + "_ompositorTrue5False1Trueendgtk-helpTrueFalseTrueTrueTrueFalseFalse0Truegtk-closeTrueTrueTrueTrueFalseFalse1Falseend0butt" + "on2button1" }; -static const unsigned tweaks_dialog_ui_length = 37210u; +static const unsigned tweaks_dialog_ui_length = 37742u; diff -Naur xfwm4-4.8.2-orig//src/cycle.c xfwm4-4.8.2/src/cycle.c --- xfwm4-4.8.2-orig//src/cycle.c 2011-09-22 21:12:34.000000000 +0200 +++ xfwm4-4.8.2/src/cycle.c 2012-01-26 17:53:45.000000000 +0100 @@ -192,7 +192,7 @@ ClientCycleData *passdata; Client *c, *removed; eventFilterStatus status; - KeyCode cancel; + KeyCode cancel, left, right; int key, modifier; gboolean key_pressed, cycling, gone; @@ -208,6 +208,8 @@ screen_info = c->screen_info; display_info = screen_info->display_info; cancel = screen_info->params->keys[KEY_CANCEL].keycode; + left = screen_info->params->keys[KEY_LEFT].keycode; + right = screen_info->params->keys[KEY_RIGHT].keycode; modifier = screen_info->params->keys[KEY_CYCLE_WINDOWS].modifier; status = EVENT_FILTER_STOP; removed = NULL; @@ -249,12 +251,12 @@ c2 = tabwinSelectHead (passdata->tabwin); cycling = FALSE; } - else if (key == KEY_CYCLE_REVERSE_WINDOWS) + else if (key == KEY_CYCLE_REVERSE_WINDOWS || (screen_info->params->cycle_arrow_keys && xevent->xkey.keycode == left)) { TRACE ("Cycle: previous"); c2 = tabwinSelectPrev(passdata->tabwin); } - else if (key == KEY_CYCLE_WINDOWS) + else if (key == KEY_CYCLE_WINDOWS || (screen_info->params->cycle_arrow_keys && xevent->xkey.keycode == right)) { TRACE ("Cycle: next"); c2 = tabwinSelectNext(passdata->tabwin); diff -Naur xfwm4-4.8.2-orig//src/settings.c xfwm4-4.8.2/src/settings.c --- xfwm4-4.8.2-orig//src/settings.c 2011-09-22 21:12:34.000000000 +0200 +++ xfwm4-4.8.2/src/settings.c 2012-01-26 17:53:45.000000000 +0100 @@ -676,6 +676,7 @@ {"focus_delay", NULL, G_TYPE_INT, TRUE}, {"cycle_apps_only", NULL, G_TYPE_BOOLEAN, TRUE}, {"cycle_draw_frame", NULL, G_TYPE_BOOLEAN, TRUE}, + {"cycle_arrow_keys", 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}, @@ -764,6 +765,8 @@ getBoolValue ("cycle_minimum", rc); screen_info->params->cycle_draw_frame = getBoolValue ("cycle_draw_frame", rc); + screen_info->params->cycle_arrow_keys= + getBoolValue ("cycle_arrow_keys", rc); screen_info->params->cycle_hidden = getBoolValue ("cycle_hidden", rc); screen_info->params->cycle_workspaces = @@ -1272,6 +1275,10 @@ { screen_info->params->cycle_draw_frame = g_value_get_boolean (value); } + else if (!strcmp (name, "cycle_arrow_keys")) + { + screen_info->params->cycle_arrow_keys = g_value_get_boolean (value); + } else if (!strcmp (name, "cycle_hidden")) { screen_info->params->cycle_hidden = g_value_get_boolean (value); diff -Naur xfwm4-4.8.2-orig//src/settings.h xfwm4-4.8.2/src/settings.h --- xfwm4-4.8.2-orig//src/settings.h 2011-09-22 21:12:34.000000000 +0200 +++ xfwm4-4.8.2/src/settings.h 2012-01-26 17:53:45.000000000 +0100 @@ -198,6 +198,7 @@ gboolean click_to_focus; gboolean cycle_apps_only; gboolean cycle_draw_frame; + gboolean cycle_arrow_keys; gboolean cycle_hidden; gboolean cycle_minimum; gboolean cycle_workspaces;