summaryrefslogtreecommitdiff
path: root/capplets/accessibility/at-properties/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'capplets/accessibility/at-properties/main.c')
-rw-r--r--capplets/accessibility/at-properties/main.c293
1 files changed, 293 insertions, 0 deletions
diff --git a/capplets/accessibility/at-properties/main.c b/capplets/accessibility/at-properties/main.c
new file mode 100644
index 00000000..766c473b
--- /dev/null
+++ b/capplets/accessibility/at-properties/main.c
@@ -0,0 +1,293 @@
+#include <config.h>
+#include <gtk/gtk.h>
+#include <mateconf/mateconf-client.h>
+
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#define GSM_SERVICE_DBUS "org.mate.SessionManager"
+#define GSM_PATH_DBUS "/org/mate/SessionManager"
+#define GSM_INTERFACE_DBUS "org.mate.SessionManager"
+
+enum {
+ GSM_LOGOUT_MODE_NORMAL = 0,
+ GSM_LOGOUT_MODE_NO_CONFIRMATION,
+ GSM_LOGOUT_MODE_FORCE
+};
+
+#include "capplet-util.h"
+#include "mateconf-property-editor.h"
+#include "activate-settings-daemon.h"
+
+#define ACCESSIBILITY_KEY "/desktop/mate/interface/accessibility"
+#define ACCESSIBILITY_KEY_DIR "/desktop/mate/interface"
+
+static gboolean initial_state;
+
+static GtkBuilder *
+create_builder (void)
+{
+ GtkBuilder *builder;
+ GError *error = NULL;
+ static const gchar *uifile = UIDIR "/at-enable-dialog.ui";
+
+ builder = gtk_builder_new ();
+
+ if (gtk_builder_add_from_file (builder, uifile, &error)) {
+ GObject *object;
+ gchar *prog;
+
+ object = gtk_builder_get_object (builder, "at_enable_image");
+ gtk_image_set_from_file (GTK_IMAGE (object),
+ PIXMAPDIR "/at-startup.png");
+
+ object = gtk_builder_get_object (builder,
+ "at_applications_image");
+ gtk_image_set_from_file (GTK_IMAGE (object),
+ PIXMAPDIR "/at-support.png");
+
+ prog = g_find_program_in_path ("mdmsetup");
+ if (prog == NULL) {
+ object = gtk_builder_get_object (builder,
+ "login_button");
+ gtk_widget_hide (GTK_WIDGET (object));
+ }
+
+ g_free (prog);
+ } else {
+ g_warning ("Could not load UI: %s", error->message);
+ g_error_free (error);
+ g_object_unref (builder);
+ builder = NULL;
+ }
+
+ return builder;
+}
+
+static void
+cb_at_preferences (GtkDialog *dialog, gint response_id)
+{
+ g_spawn_command_line_async ("mate-default-applications-properties --show-page=a11y", NULL);
+}
+
+static void
+cb_keyboard_preferences (GtkDialog *dialog, gint response_id)
+{
+ g_spawn_command_line_async ("mate-keyboard-properties --a11y", NULL);
+}
+
+static void
+cb_mouse_preferences (GtkDialog *dialog, gint response_id)
+{
+ g_spawn_command_line_async ("mate-mouse-properties --show-page=accessibility", NULL);
+}
+
+static void
+cb_login_preferences (GtkDialog *dialog, gint response_id)
+{
+ g_spawn_command_line_async ("mdmsetup", NULL);
+}
+
+/* get_session_bus(), get_sm_proxy(), and do_logout() are all
+ * based on code from mate-session-save.c from mate-session.
+ */
+static DBusGConnection *
+get_session_bus (void)
+{
+ DBusGConnection *bus;
+ GError *error = NULL;
+
+ bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+ if (bus == NULL) {
+ g_warning ("Couldn't connect to session bus: %s", error->message);
+ g_error_free (error);
+ }
+
+ return bus;
+}
+
+static DBusGProxy *
+get_sm_proxy (void)
+{
+ DBusGConnection *connection;
+ DBusGProxy *sm_proxy;
+
+ if (!(connection = get_session_bus ()))
+ return NULL;
+
+ sm_proxy = dbus_g_proxy_new_for_name (connection,
+ GSM_SERVICE_DBUS,
+ GSM_PATH_DBUS,
+ GSM_INTERFACE_DBUS);
+
+ return sm_proxy;
+}
+
+static gboolean
+do_logout (GError **err)
+{
+ DBusGProxy *sm_proxy;
+ GError *error;
+ gboolean res;
+
+ sm_proxy = get_sm_proxy ();
+ if (sm_proxy == NULL)
+ return FALSE;
+
+ res = dbus_g_proxy_call (sm_proxy,
+ "Logout",
+ &error,
+ G_TYPE_UINT, 0, /* '0' means 'log out normally' */
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+
+ if (sm_proxy)
+ g_object_unref (sm_proxy);
+
+ return res;
+}
+
+static void
+cb_dialog_response (GtkDialog *dialog, gint response_id)
+{
+ if (response_id == GTK_RESPONSE_HELP)
+ capplet_help (GTK_WINDOW (dialog),
+ "goscustaccess-11");
+ else if (response_id == GTK_RESPONSE_CLOSE || response_id == GTK_RESPONSE_DELETE_EVENT)
+ gtk_main_quit ();
+ else {
+ g_message ("CLOSE AND LOGOUT!");
+
+ if (!do_logout (NULL))
+ gtk_main_quit ();
+ }
+}
+
+static void
+close_logout_update (GtkBuilder *builder)
+{
+ MateConfClient *client = mateconf_client_get_default ();
+ gboolean curr_state = mateconf_client_get_bool (client, ACCESSIBILITY_KEY, NULL);
+ GObject *btn = gtk_builder_get_object (builder,
+ "at_close_logout_button");
+
+ gtk_widget_set_sensitive (GTK_WIDGET (btn), initial_state != curr_state);
+ g_object_unref (client);
+}
+
+static void
+at_enable_toggled (GtkToggleButton *toggle_button,
+ GtkBuilder *builder)
+{
+ MateConfClient *client = mateconf_client_get_default ();
+ gboolean is_enabled = gtk_toggle_button_get_active (toggle_button);
+
+ mateconf_client_set_bool (client, ACCESSIBILITY_KEY,
+ is_enabled,
+ NULL);
+ g_object_unref (client);
+}
+
+static void
+at_enable_update (MateConfClient *client,
+ GtkBuilder *builder)
+{
+ gboolean is_enabled = mateconf_client_get_bool (client, ACCESSIBILITY_KEY, NULL);
+ GObject *btn = gtk_builder_get_object (builder, "at_enable_toggle");
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn),
+ is_enabled);
+}
+
+static void
+at_enable_changed (MateConfClient *client,
+ guint cnxn_id,
+ MateConfEntry *entry,
+ gpointer user_data)
+{
+ at_enable_update (client, user_data);
+ close_logout_update (user_data);
+}
+
+static void
+setup_dialog (GtkBuilder *builder)
+{
+ MateConfClient *client;
+ GtkWidget *widget;
+ GObject *object;
+ GObject *peditor;
+
+ client = mateconf_client_get_default ();
+
+ mateconf_client_add_dir (client, ACCESSIBILITY_KEY_DIR,
+ MATECONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+
+ object = gtk_builder_get_object (builder, "at_enable_toggle");
+ g_signal_connect (object, "toggled",
+ G_CALLBACK (at_enable_toggled),
+ builder);
+
+ peditor = mateconf_peditor_new_boolean (NULL, ACCESSIBILITY_KEY,
+ GTK_WIDGET (object),
+ NULL);
+
+ initial_state = mateconf_client_get_bool (client, ACCESSIBILITY_KEY, NULL);
+
+ at_enable_update (client, builder);
+
+ mateconf_client_notify_add (client, ACCESSIBILITY_KEY_DIR,
+ at_enable_changed,
+ builder, NULL, NULL);
+
+ object = gtk_builder_get_object (builder, "at_pref_button");
+ g_signal_connect (object, "clicked",
+ G_CALLBACK (cb_at_preferences), NULL);
+
+ object = gtk_builder_get_object (builder, "keyboard_button");
+ g_signal_connect (object, "clicked",
+ G_CALLBACK (cb_keyboard_preferences), NULL);
+
+ object = gtk_builder_get_object (builder, "mouse_button");
+ g_signal_connect (object, "clicked",
+ G_CALLBACK (cb_mouse_preferences), NULL);
+
+ object = gtk_builder_get_object (builder, "login_button");
+ g_signal_connect (object, "clicked",
+ G_CALLBACK (cb_login_preferences), NULL);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (builder,
+ "at_properties_dialog"));
+ capplet_set_icon (widget, "preferences-desktop-accessibility");
+
+ g_signal_connect (G_OBJECT (widget),
+ "response",
+ G_CALLBACK (cb_dialog_response), NULL);
+
+ gtk_widget_show (widget);
+
+ g_object_unref (client);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GtkBuilder *builder;
+
+ capplet_init (NULL, &argc, &argv);
+
+ activate_settings_daemon ();
+
+ builder = create_builder ();
+
+ if (builder) {
+
+ setup_dialog (builder);
+
+ gtk_main ();
+
+ g_object_unref (builder);
+ }
+
+ return 0;
+}