Index: plugins/keyboard_plugin/keyboard_plugin.c =================================================================== --- plugins/keyboard_plugin/keyboard_plugin.c (revision 22098) +++ plugins/keyboard_plugin/keyboard_plugin.c (working copy) @@ -82,6 +82,8 @@ static gboolean sticky_key = FALSE; static gboolean sticky_key_ltl = FALSE; static gboolean sticky_key_tk = FALSE; +static gboolean bounce_key = FALSE; +static gboolean slow_key = FALSE; static int repeat_delay = 500; static int repeat_rate = 30; @@ -162,7 +164,7 @@ } static void -toggle_sticky() +toggle_accessx() { #ifdef USE_XKB if (xkbpresent) @@ -173,10 +175,23 @@ gdk_error_trap_push (); XkbGetControls (GDK_DISPLAY (), XkbAllControlsMask, xkb); + /* Slow keys */ + if(slow_key) + xkb->ctrls->enabled_ctrls |= XkbSlowKeysMask; + else + xkb->ctrls->enabled_ctrls &= ~XkbSlowKeysMask; + + /* Bounce keys */ + if(bounce_key) + xkb->ctrls->enabled_ctrls |= XkbBounceKeysMask; + else + xkb->ctrls->enabled_ctrls &= ~XkbBounceKeysMask; + + /* Sticky keys */ if(sticky_key) - xkb->ctrls->enabled_ctrls |= (XkbStickyKeysMask | XkbAccessXKeysMask); + xkb->ctrls->enabled_ctrls |= XkbStickyKeysMask; else - xkb->ctrls->enabled_ctrls &= ~(XkbStickyKeysMask | XkbAccessXKeysMask); + xkb->ctrls->enabled_ctrls &= ~XkbStickyKeysMask; if(sticky_key_ltl) xkb->ctrls->ax_options |= XkbAX_LatchToLockMask; @@ -188,7 +203,13 @@ else xkb->ctrls->ax_options &= ~XkbAX_TwoKeysMask; - XkbSetControls (GDK_DISPLAY (), XkbControlsEnabledMask | XkbStickyKeysMask, xkb); + /* If any option is set, enable AccessXKeys, otherwise: don't */ + if(sticky_key || bounce_key || slow_key) + xkb->ctrls->enabled_ctrls |= XkbAccessXKeysMask; + else + xkb->ctrls->enabled_ctrls &= ~XkbAccessXKeysMask; + + XkbSetControls (GDK_DISPLAY (), XkbControlsEnabledMask | XkbStickyKeysMask | XkbBounceKeysMask | XkbSlowKeysMask, xkb); XFree (xkb); gdk_flush (); gdk_error_trap_pop (); @@ -363,11 +384,13 @@ } static void -cb_checkbutton_sticky_changed (GtkWidget * widget, gpointer user_data) +cb_checkbutton_accessx_changed (GtkWidget * widget, gpointer user_data) { KeyboardMcsDialog *dialog = (KeyboardMcsDialog *) user_data; McsPlugin *mcs_plugin = dialog->mcs_plugin; + bounce_key = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_bounce)); + slow_key = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_slow)); sticky_key = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_sticky)); if(sticky_key) { @@ -383,10 +406,12 @@ } sticky_key_ltl = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_sticky_ltl)); sticky_key_tk = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_sticky_tk)); - toggle_sticky(); - mcs_manager_set_int (mcs_plugin->manager, "Key/Sticky", CHANNEL2, sticky_key ? 1 : 0); + toggle_accessx(); + mcs_manager_set_int (mcs_plugin->manager, "Key/StickyKeys", CHANNEL2, sticky_key ? 1 : 0); mcs_manager_set_int (mcs_plugin->manager, "Key/StickyLatchToLock", CHANNEL2, sticky_key_ltl ? 1 : 0); mcs_manager_set_int (mcs_plugin->manager, "Key/StickyTwoKeysDisable", CHANNEL2, sticky_key_tk ? 1 : 0); + mcs_manager_set_int (mcs_plugin->manager, "Key/BounceKeys", CHANNEL2, bounce_key ? 1 : 0); + mcs_manager_set_int (mcs_plugin->manager, "Key/SlowKeys", CHANNEL2, slow_key ? 1 : 0); mcs_manager_notify (mcs_plugin->manager, CHANNEL2); write_options (mcs_plugin); } @@ -667,7 +692,7 @@ gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), nth++), label); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); - main_hbox = gtk_hbox_new(FALSE, 5); + main_hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(main_hbox); gtk_container_add(GTK_CONTAINER(notebook), main_hbox); gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 5); @@ -697,7 +722,33 @@ gtk_widget_set_sensitive(dialog->checkbutton_sticky_tk, sticky_key); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_sticky_tk), sticky_key_tk); - label = gtk_label_new (_("Accessibility")); + frame = xfce_framebox_new (_("Slow keys"), FALSE); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (main_hbox), frame, FALSE, TRUE, 0); + + vbox = gtk_vbox_new (FALSE, 5); + gtk_widget_show (vbox); + xfce_framebox_add (XFCE_FRAMEBOX (frame), vbox); + + dialog->checkbutton_slow = gtk_check_button_new_with_mnemonic(_("Enable Slow keys")); + gtk_widget_show(dialog->checkbutton_slow); + gtk_box_pack_start(GTK_BOX(vbox), dialog->checkbutton_slow, FALSE, FALSE, 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_slow), slow_key); + + frame = xfce_framebox_new (_("Bounce keys"), FALSE); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (main_hbox), frame, FALSE, TRUE, 0); + + vbox = gtk_vbox_new (FALSE, 5); + gtk_widget_show (vbox); + xfce_framebox_add (XFCE_FRAMEBOX (frame), vbox); + + dialog->checkbutton_bounce = gtk_check_button_new_with_mnemonic(_("Enable Bounce keys")); + gtk_widget_show(dialog->checkbutton_bounce); + gtk_box_pack_start(GTK_BOX(vbox), dialog->checkbutton_bounce, FALSE, FALSE, 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->checkbutton_bounce), bounce_key); + + label = gtk_label_new (_("Accessability")); gtk_widget_show (label); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), nth++), label); @@ -749,9 +800,11 @@ g_signal_connect (G_OBJECT (dialog->scale_repeat_delay), "value_changed", (GCallback) cb_repeatdelay_changed, dialog); g_signal_connect (G_OBJECT (dialog->checkbutton_blink), "toggled", G_CALLBACK (cb_checkbutton_blink_changed), dialog); g_signal_connect (G_OBJECT (dialog->scale_blink_time), "value_changed", (GCallback) cb_blinktime_changed, dialog); - g_signal_connect (G_OBJECT (dialog->checkbutton_sticky), "toggled", G_CALLBACK (cb_checkbutton_sticky_changed), dialog); - g_signal_connect (G_OBJECT (dialog->checkbutton_sticky_ltl), "toggled", G_CALLBACK (cb_checkbutton_sticky_changed), dialog); - g_signal_connect (G_OBJECT (dialog->checkbutton_sticky_tk), "toggled", G_CALLBACK (cb_checkbutton_sticky_changed), dialog); + g_signal_connect (G_OBJECT (dialog->checkbutton_sticky), "toggled", G_CALLBACK (cb_checkbutton_accessx_changed), dialog); + g_signal_connect (G_OBJECT (dialog->checkbutton_sticky_ltl), "toggled", G_CALLBACK (cb_checkbutton_accessx_changed), dialog); + g_signal_connect (G_OBJECT (dialog->checkbutton_sticky_tk), "toggled", G_CALLBACK (cb_checkbutton_accessx_changed), dialog); + g_signal_connect (G_OBJECT (dialog->checkbutton_bounce), "toggled", G_CALLBACK (cb_checkbutton_accessx_changed), dialog); + g_signal_connect (G_OBJECT (dialog->checkbutton_slow), "toggled", G_CALLBACK (cb_checkbutton_accessx_changed), dialog); } static void @@ -917,7 +970,7 @@ mcs_manager_set_int (mcs_plugin->manager, "Key/RepeatRate", CHANNEL2, repeat_rate); } - setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/Sticky", CHANNEL2); + setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/StickyKeys", CHANNEL2); if(setting) { sticky_key = (setting->data.v_int ? TRUE : FALSE); @@ -925,7 +978,7 @@ else { sticky_key = FALSE; - mcs_manager_set_int (mcs_plugin->manager, "Key/Sticky", CHANNEL2, sticky_key ? 1 : 0); + mcs_manager_set_int (mcs_plugin->manager, "Key/StickyKeys", CHANNEL2, sticky_key ? 1 : 0); } setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/StickyLatchToLock", CHANNEL2); @@ -950,6 +1003,28 @@ mcs_manager_set_int (mcs_plugin->manager, "Key/StickyTwoKeysDisable", CHANNEL2, sticky_key_tk ? 1 : 0); } + setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/BounceKeys", CHANNEL2); + if(setting) + { + bounce_key = (setting->data.v_int ? TRUE : FALSE); + } + else + { + bounce_key = FALSE; + mcs_manager_set_int (mcs_plugin->manager, "Key/BounceKeys", CHANNEL2, bounce_key ? 1 : 0); + } + + setting = mcs_manager_setting_lookup (mcs_plugin->manager, "Key/SlowKeys", CHANNEL2); + if(setting) + { + slow_key = (setting->data.v_int ? TRUE : FALSE); + } + else + { + slow_key = FALSE; + mcs_manager_set_int (mcs_plugin->manager, "Key/SlowKeys", CHANNEL2, slow_key ? 1 : 0); + } + #ifdef USE_XF86MISC #ifdef DEBUG g_message ("Querying XF86Misc extension"); @@ -999,7 +1074,7 @@ #endif set_repeat_rate (repeat_delay, repeat_rate); - toggle_sticky(); + toggle_accessx(); #if 0 /* I fail to see why we need to save the options here, during startup... */ Index: plugins/keyboard_plugin/shortcuts_plugin.h =================================================================== --- plugins/keyboard_plugin/shortcuts_plugin.h (revision 22098) +++ plugins/keyboard_plugin/shortcuts_plugin.h (working copy) @@ -32,6 +32,8 @@ GtkWidget *checkbutton_sticky; GtkWidget *checkbutton_sticky_ltl; GtkWidget *checkbutton_sticky_tk; + GtkWidget *checkbutton_bounce; + GtkWidget *checkbutton_slow; GtkWidget *scale_repeat_rate; GtkWidget *scale_repeat_delay; GtkWidget *scale_blink_time;