summaryrefslogtreecommitdiff
path: root/capplets/keyboard/mate-keyboard-properties-a11y.c
diff options
context:
space:
mode:
Diffstat (limited to 'capplets/keyboard/mate-keyboard-properties-a11y.c')
-rw-r--r--capplets/keyboard/mate-keyboard-properties-a11y.c325
1 files changed, 325 insertions, 0 deletions
diff --git a/capplets/keyboard/mate-keyboard-properties-a11y.c b/capplets/keyboard/mate-keyboard-properties-a11y.c
new file mode 100644
index 00000000..3405ffa7
--- /dev/null
+++ b/capplets/keyboard/mate-keyboard-properties-a11y.c
@@ -0,0 +1,325 @@
+/* -*- mode: c; style: linux -*- */
+
+/*
+ * Copyright (C) 2007 The MATE Foundation
+ * Written by Denis Washington <[email protected]>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "mate-keyboard-properties-a11y.h"
+#include <mateconf/mateconf-client.h>
+#include "mateconf-property-editor.h"
+#include "capplet-util.h"
+
+#define CONFIG_ROOT "/desktop/mate/accessibility/keyboard"
+#define NWID(s) GTK_WIDGET (gtk_builder_get_object (notifications_dialog, s))
+
+static GtkBuilder *notifications_dialog = NULL;
+
+static void
+stickykeys_enable_toggled_cb (GtkWidget *w, GtkBuilder *dialog)
+{
+ gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+
+ gtk_widget_set_sensitive (WID ("stickykeys_two_key_off"), active);
+ if (notifications_dialog)
+ gtk_widget_set_sensitive (NWID ("stickykeys_notifications_box"), active);
+}
+
+static void
+slowkeys_enable_toggled_cb (GtkWidget *w, GtkBuilder *dialog)
+{
+ gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+
+ gtk_widget_set_sensitive (WID ("slowkeys_delay_box"), active);
+ if (notifications_dialog)
+ gtk_widget_set_sensitive (NWID ("slowkeys_notifications_box"), active);
+}
+
+static void
+bouncekeys_enable_toggled_cb (GtkWidget *w, GtkBuilder *dialog)
+{
+ gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+
+ gtk_widget_set_sensitive (WID ("bouncekeys_delay_box"), active);
+ if (notifications_dialog)
+ gtk_widget_set_sensitive (NWID ("bouncekeys_notifications_box"), active);
+}
+
+static void
+visual_bell_enable_toggled_cb (GtkWidget *w, GtkBuilder *dialog)
+{
+ gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+
+ if (notifications_dialog) {
+ gtk_widget_set_sensitive (NWID ("visual_bell_titlebar"), active);
+ gtk_widget_set_sensitive (NWID ("visual_bell_fullscreen"), active);
+ }
+}
+
+static MateConfEnumStringPair bell_flash_enums[] = {
+ { 0, "frame_flash" },
+ { 1, "fullscreen" },
+ { -1, NULL }
+};
+
+static MateConfValue *
+bell_flash_from_widget (MateConfPropertyEditor *peditor, const MateConfValue *value)
+{
+ MateConfValue *new_value;
+
+ new_value = mateconf_value_new (MATECONF_VALUE_STRING);
+ mateconf_value_set_string (new_value,
+ mateconf_enum_to_string (bell_flash_enums, mateconf_value_get_int (value)));
+
+ return new_value;
+}
+
+static MateConfValue *
+bell_flash_to_widget (MateConfPropertyEditor *peditor, const MateConfValue *value)
+{
+ MateConfValue *new_value;
+ const gchar *str;
+ gint val = 2;
+
+ str = (value && (value->type == MATECONF_VALUE_STRING)) ? mateconf_value_get_string (value) : NULL;
+
+ new_value = mateconf_value_new (MATECONF_VALUE_INT);
+ if (value->type == MATECONF_VALUE_STRING) {
+ mateconf_string_to_enum (bell_flash_enums,
+ str,
+ &val);
+ }
+ mateconf_value_set_int (new_value, val);
+
+ return new_value;
+}
+
+static void
+a11y_notifications_dialog_response_cb (GtkWidget *w, gint response)
+{
+ if (response == GTK_RESPONSE_HELP) {
+
+ }
+ else {
+ gtk_widget_destroy (w);
+ }
+}
+static void
+notifications_button_clicked_cb (GtkWidget *button, GtkBuilder *dialog)
+{
+ GtkWidget *w;
+
+ notifications_dialog = gtk_builder_new ();
+ gtk_builder_add_from_file (notifications_dialog, MATECC_UI_DIR
+ "/mate-keyboard-properties-a11y-notifications.ui",
+ NULL);
+
+ stickykeys_enable_toggled_cb (WID ("stickykeys_enable"), dialog);
+ slowkeys_enable_toggled_cb (WID ("slowkeys_enable"), dialog);
+ bouncekeys_enable_toggled_cb (WID ("bouncekeys_enable"), dialog);
+
+ w = NWID ("feature_state_change_beep");
+ mateconf_peditor_new_boolean (NULL,
+ CONFIG_ROOT "/feature_state_change_beep",
+ w, NULL);
+
+ w = NWID ("togglekeys_enable");
+ mateconf_peditor_new_boolean (NULL,
+ CONFIG_ROOT "/togglekeys_enable",
+ w, NULL);
+
+ w = NWID ("stickykeys_modifier_beep");
+ mateconf_peditor_new_boolean (NULL,
+ CONFIG_ROOT "/stickykeys_modifier_beep",
+ w, NULL);
+
+ w = NWID ("slowkeys_beep_press");
+ mateconf_peditor_new_boolean (NULL,
+ CONFIG_ROOT "/slowkeys_beep_press",
+ w, NULL);
+
+ w = NWID ("slowkeys_beep_accept");
+ mateconf_peditor_new_boolean (NULL,
+ CONFIG_ROOT "/slowkeys_beep_accept",
+ w, NULL);
+
+ w = NWID ("slowkeys_beep_reject");
+ mateconf_peditor_new_boolean (NULL,
+ CONFIG_ROOT "/slowkeys_beep_reject",
+ w, NULL);
+
+ w = NWID ("bouncekeys_beep_reject");
+ mateconf_peditor_new_boolean (NULL,
+ CONFIG_ROOT "/bouncekeys_beep_reject",
+ w, NULL);
+
+ w = NWID ("visual_bell_enable");
+ mateconf_peditor_new_boolean (NULL,
+ "/apps/marco/general/visual_bell",
+ w, NULL);
+ g_signal_connect (w, "toggled",
+ G_CALLBACK (visual_bell_enable_toggled_cb), dialog);
+ visual_bell_enable_toggled_cb (w, dialog);
+
+ mateconf_peditor_new_select_radio (NULL,
+ "/apps/marco/general/visual_bell_type",
+ gtk_radio_button_get_group (GTK_RADIO_BUTTON (NWID ("visual_bell_titlebar"))),
+ "conv-to-widget-cb", bell_flash_to_widget,
+ "conv-from-widget-cb", bell_flash_from_widget,
+ NULL);
+
+ w = NWID ("a11y_notifications_dialog");
+ gtk_window_set_transient_for (GTK_WINDOW (w),
+ GTK_WINDOW (WID ("keyboard_dialog")));
+ g_signal_connect (w, "response",
+ G_CALLBACK (a11y_notifications_dialog_response_cb), NULL);
+
+ gtk_dialog_run (GTK_DIALOG (w));
+
+ g_object_unref (notifications_dialog);
+ notifications_dialog = NULL;
+}
+
+static void
+mousekeys_enable_toggled_cb (GtkWidget *w, GtkBuilder *dialog)
+{
+ gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+ gtk_widget_set_sensitive (WID ("mousekeys_table"), active);
+}
+
+static MateConfValue *
+mousekeys_accel_time_to_widget (MateConfPropertyEditor *peditor, const MateConfValue *value)
+{
+ GtkAdjustment *adjustment;
+ gdouble range_upper;
+ MateConfValue *new_value;
+
+ adjustment = GTK_ADJUSTMENT (mateconf_property_editor_get_ui_control (peditor));
+ g_object_get (adjustment,
+ "upper", &range_upper,
+ NULL);
+
+ new_value = mateconf_value_new (MATECONF_VALUE_INT);
+ mateconf_value_set_int (new_value, MAX (0, ((int) range_upper) - mateconf_value_get_int (value)));
+
+ return new_value;
+}
+
+static MateConfValue *
+mousekeys_accel_time_from_widget (MateConfPropertyEditor *peditor, const MateConfValue *value)
+{
+ GtkAdjustment *adjustment;
+ gdouble range_value, range_upper;
+ MateConfValue *new_value;
+
+ adjustment = GTK_ADJUSTMENT (mateconf_property_editor_get_ui_control (peditor));
+ g_object_get (adjustment,
+ "value", &range_value,
+ "upper", &range_upper,
+ NULL);
+
+ new_value = mateconf_value_new (MATECONF_VALUE_INT);
+ mateconf_value_set_int (new_value, (int) range_upper - range_value);
+
+ return new_value;
+}
+
+void
+setup_a11y_tabs (GtkBuilder *dialog, MateConfChangeSet *changeset)
+{
+ MateConfClient *client;
+ GtkWidget *w;
+
+ client = mateconf_client_get_default ();
+ mateconf_client_add_dir (client, CONFIG_ROOT, MATECONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+ g_object_unref (client);
+
+ /* Accessibility tab */
+
+ w = WID ("master_enable");
+ mateconf_peditor_new_boolean (changeset,
+ CONFIG_ROOT "/enable",
+ w, NULL);
+
+ w = WID ("stickykeys_enable");
+ mateconf_peditor_new_boolean (changeset,
+ CONFIG_ROOT "/stickykeys_enable",
+ w, NULL);
+ g_signal_connect (w, "toggled",
+ G_CALLBACK (stickykeys_enable_toggled_cb), dialog);
+ stickykeys_enable_toggled_cb (w, dialog);
+
+ w = WID ("stickykeys_two_key_off");
+ mateconf_peditor_new_boolean (changeset,
+ CONFIG_ROOT "/stickykeys_two_key_off",
+ w, NULL);
+
+ w = WID ("slowkeys_enable");
+ mateconf_peditor_new_boolean (changeset,
+ CONFIG_ROOT "/slowkeys_enable",
+ w, NULL);
+ g_signal_connect (w, "toggled",
+ G_CALLBACK (slowkeys_enable_toggled_cb), dialog);
+ slowkeys_enable_toggled_cb (w, dialog);
+
+ w = WID ("bouncekeys_enable");
+ mateconf_peditor_new_boolean (changeset,
+ CONFIG_ROOT "/bouncekeys_enable",
+ w, NULL);
+ g_signal_connect (w, "toggled",
+ G_CALLBACK (bouncekeys_enable_toggled_cb), dialog);
+ bouncekeys_enable_toggled_cb (w, dialog);
+
+ mateconf_peditor_new_numeric_range (changeset,
+ CONFIG_ROOT "/slowkeys_delay",
+ WID ("slowkeys_delay_slide"), NULL);
+ mateconf_peditor_new_numeric_range (changeset,
+ CONFIG_ROOT "/bouncekeys_delay",
+ WID ("bouncekeys_delay_slide"), NULL);
+
+ w = WID ("notifications_button");
+ g_signal_connect (w, "clicked",
+ G_CALLBACK (notifications_button_clicked_cb), dialog);
+
+ /* Mouse Keys tab */
+
+ w = WID ("mousekeys_enable");
+ mateconf_peditor_new_boolean (changeset,
+ CONFIG_ROOT "/mousekeys_enable",
+ w, NULL);
+ g_signal_connect (w, "toggled",
+ G_CALLBACK (mousekeys_enable_toggled_cb), dialog);
+ mousekeys_enable_toggled_cb (w, dialog);
+
+ mateconf_peditor_new_numeric_range (changeset,
+ CONFIG_ROOT "/mousekeys_accel_time",
+ WID ("mousekeys_accel_time_slide"),
+ "conv-to-widget-cb", mousekeys_accel_time_to_widget,
+ "conv-from-widget-cb", mousekeys_accel_time_from_widget,
+ NULL);
+ mateconf_peditor_new_numeric_range (changeset,
+ CONFIG_ROOT "/mousekeys_max_speed",
+ WID ("mousekeys_max_speed_slide"), NULL);
+ mateconf_peditor_new_numeric_range (changeset,
+ CONFIG_ROOT "/mousekeys_init_delay",
+ WID ("mousekeys_init_delay_slide"), NULL);
+}