1 #include <config.h>
2 #include <gtk/gtk.h>
3 #include <gio/gio.h>
4 #include <gio/gdesktopappinfo.h>
5 #include "dm-util.h"
6
7 #define GSM_SERVICE_DBUS "org.gnome.SessionManager"
8 #define GSM_PATH_DBUS "/org/gnome/SessionManager"
9 #define GSM_INTERFACE_DBUS "org.gnome.SessionManager"
10
11 enum {
12 GSM_LOGOUT_MODE_NORMAL = 0,
13 GSM_LOGOUT_MODE_NO_CONFIRMATION,
14 GSM_LOGOUT_MODE_FORCE
15 };
16
17 #include "capplet-util.h"
18 #include "activate-settings-daemon.h"
19
20 #define ACCESSIBILITY_KEY "accessibility"
21 #define ACCESSIBILITY_SCHEMA "org.mate.interface"
22
23 static gboolean initial_state;
24
get_desktop_app_info_from_dm(void)25 static GDesktopAppInfo *get_desktop_app_info_from_dm (void)
26 {
27 DMType dm_type;
28 GDesktopAppInfo *app_info = NULL;
29
30 dm_type = dm_get_type();
31 if (dm_type == DM_TYPE_MDM) {
32 app_info = g_desktop_app_info_new ("mdmsetup.desktop");
33 } else if (dm_type == DM_TYPE_LIGHTDM) {
34 app_info = g_desktop_app_info_new ("lightdm-gtk-greeter-settings.desktop");
35 }
36 return app_info;
37 }
38
39 static GtkBuilder *
create_builder(void)40 create_builder (void)
41 {
42 GtkBuilder *builder;
43 GObject *object;
44 GDesktopAppInfo *app_info = NULL;
45
46 builder = gtk_builder_new_from_resource ("/org/mate/mcc/accessibility/at/at-enable-dialog.ui");
47
48 object = gtk_builder_get_object (builder, "at_enable_image");
49 gtk_image_set_from_file (GTK_IMAGE (object),
50 PIXMAPDIR "/at-startup.png");
51
52 object = gtk_builder_get_object (builder,
53 "at_applications_image");
54 gtk_image_set_from_file (GTK_IMAGE (object),
55 PIXMAPDIR "/at-support.png");
56 app_info = get_desktop_app_info_from_dm ();
57 if (app_info == NULL) {
58 object = gtk_builder_get_object (builder, "login_button");
59 gtk_widget_hide (GTK_WIDGET (object));
60 } else {
61 g_object_unref (app_info);
62 }
63
64 return builder;
65 }
66
67 static void
cb_at_preferences(GtkDialog * dialog,gint response_id)68 cb_at_preferences (GtkDialog *dialog, gint response_id)
69 {
70 g_spawn_command_line_async ("mate-default-applications-properties --show-page=a11y", NULL);
71 }
72
73 static void
cb_keyboard_preferences(GtkDialog * dialog,gint response_id)74 cb_keyboard_preferences (GtkDialog *dialog, gint response_id)
75 {
76 g_spawn_command_line_async ("mate-keyboard-properties --a11y", NULL);
77 }
78
79 static void
cb_mouse_preferences(GtkDialog * dialog,gint response_id)80 cb_mouse_preferences (GtkDialog *dialog, gint response_id)
81 {
82 g_spawn_command_line_async ("mate-mouse-properties --show-page=accessibility", NULL);
83 }
84
85 static void
cb_login_preferences(GtkDialog * dialog,gint response_id)86 cb_login_preferences (GtkDialog *dialog, gint response_id)
87 {
88 GDesktopAppInfo *app_info = NULL;
89
90 app_info = get_desktop_app_info_from_dm ();
91
92 if (app_info != NULL) {
93 g_app_info_launch (G_APP_INFO(app_info), NULL, NULL, NULL);
94 g_object_unref (app_info);
95 }
96 }
97
98 static GDBusProxy *
get_sm_proxy(void)99 get_sm_proxy (void)
100 {
101 GError *error = NULL;
102 static GDBusProxy *proxy = NULL;
103
104 if (proxy == NULL) {
105 proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
106 G_DBUS_PROXY_FLAGS_NONE,
107 NULL,
108 GSM_SERVICE_DBUS,
109 GSM_PATH_DBUS,
110 GSM_INTERFACE_DBUS,
111 NULL,
112 &error);
113 if (proxy == NULL) {
114 g_warning ("Couldn't connect to session bus: %s", error->message);
115 g_error_free (error);
116 }
117 }
118 return proxy;
119 }
120
121 static gboolean
do_logout(void)122 do_logout (void)
123 {
124 GDBusProxy *sm_proxy;
125 GError *error = NULL;
126 GVariant *ret;
127 gboolean res = FALSE;
128
129 sm_proxy = get_sm_proxy ();
130 if (sm_proxy == NULL)
131 return FALSE;
132
133 ret = g_dbus_proxy_call_sync (sm_proxy,
134 "Logout",
135 g_variant_new ("(u)", 0), /* '0' means 'log out normally' */
136 G_DBUS_CALL_FLAGS_NONE,
137 -1,
138 NULL,
139 &error);
140 if (ret == NULL) {
141 g_warning ("Could not call Logout by dbus: %s\n", error->message);
142 g_error_free (error);
143 } else {
144 g_variant_unref (ret);
145 res = TRUE;
146 }
147
148 if (sm_proxy)
149 g_object_unref (sm_proxy);
150
151 return res;
152 }
153
154 static void
cb_dialog_response(GtkDialog * dialog,gint response_id)155 cb_dialog_response (GtkDialog *dialog, gint response_id)
156 {
157 if (response_id == GTK_RESPONSE_HELP)
158 capplet_help (GTK_WINDOW (dialog),
159 "goscustaccess-11");
160 else if (response_id == GTK_RESPONSE_CLOSE || response_id == GTK_RESPONSE_DELETE_EVENT)
161 gtk_main_quit ();
162 else {
163 g_message ("CLOSE AND LOGOUT!");
164
165 if (!do_logout ())
166 gtk_main_quit ();
167 }
168 }
169
170 static void
close_logout_update(GtkBuilder * builder)171 close_logout_update (GtkBuilder *builder)
172 {
173 GSettings *settings = g_settings_new (ACCESSIBILITY_SCHEMA);
174 gboolean curr_state = g_settings_get_boolean (settings, ACCESSIBILITY_KEY);
175 GObject *btn = gtk_builder_get_object (builder,
176 "at_close_logout_button");
177
178 gtk_widget_set_sensitive (GTK_WIDGET (btn), initial_state != curr_state);
179 g_object_unref (settings);
180 }
181
182 static void
at_enable_toggled(GtkToggleButton * toggle_button,GtkBuilder * builder)183 at_enable_toggled (GtkToggleButton *toggle_button,
184 GtkBuilder *builder)
185 {
186 GSettings *settings = g_settings_new (ACCESSIBILITY_SCHEMA);
187 gboolean is_enabled = gtk_toggle_button_get_active (toggle_button);
188
189 g_settings_set_boolean (settings, ACCESSIBILITY_KEY, is_enabled);
190 g_object_unref (settings);
191 }
192
193 static void
at_enable_update(GSettings * settings,GtkBuilder * builder)194 at_enable_update (GSettings *settings,
195 GtkBuilder *builder)
196 {
197 gboolean is_enabled = g_settings_get_boolean (settings, ACCESSIBILITY_KEY);
198 GObject *btn = gtk_builder_get_object (builder, "at_enable_toggle");
199
200 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn),
201 is_enabled);
202 }
203
204 static void
at_enable_changed(GSettings * settings,gchar * key,gpointer user_data)205 at_enable_changed (GSettings *settings,
206 gchar *key,
207 gpointer user_data)
208 {
209 at_enable_update (settings, user_data);
210 close_logout_update (user_data);
211 }
212
213 static void
setup_dialog(GtkBuilder * builder,GSettings * settings)214 setup_dialog (GtkBuilder *builder, GSettings *settings)
215 {
216 GtkWidget *widget;
217 GObject *object;
218
219 object = gtk_builder_get_object (builder, "at_enable_toggle");
220 g_signal_connect (object, "toggled",
221 G_CALLBACK (at_enable_toggled),
222 builder);
223
224 initial_state = g_settings_get_boolean (settings, ACCESSIBILITY_KEY);
225
226 at_enable_update (settings, builder);
227
228 g_signal_connect (settings, "changed::" ACCESSIBILITY_KEY, G_CALLBACK (at_enable_changed),
229 builder);
230
231 object = gtk_builder_get_object (builder, "at_pref_button");
232 g_signal_connect (object, "clicked",
233 G_CALLBACK (cb_at_preferences), NULL);
234
235 object = gtk_builder_get_object (builder, "keyboard_button");
236 g_signal_connect (object, "clicked",
237 G_CALLBACK (cb_keyboard_preferences), NULL);
238
239 object = gtk_builder_get_object (builder, "mouse_button");
240 g_signal_connect (object, "clicked",
241 G_CALLBACK (cb_mouse_preferences), NULL);
242
243 object = gtk_builder_get_object (builder, "login_button");
244 g_signal_connect (object, "clicked",
245 G_CALLBACK (cb_login_preferences), NULL);
246
247 widget = GTK_WIDGET (gtk_builder_get_object (builder,
248 "at_properties_dialog"));
249 capplet_set_icon (widget, "preferences-desktop-accessibility");
250
251 g_signal_connect (G_OBJECT (widget),
252 "response",
253 G_CALLBACK (cb_dialog_response), NULL);
254
255 gtk_widget_show (widget);
256 }
257
258 int
main(int argc,char * argv[])259 main (int argc, char *argv[])
260 {
261 GSettings *settings;
262 GtkBuilder *builder;
263
264 capplet_init (NULL, &argc, &argv);
265
266 activate_settings_daemon ();
267
268 settings = g_settings_new (ACCESSIBILITY_SCHEMA);
269 builder = create_builder ();
270
271 if (builder) {
272
273 setup_dialog (builder, settings);
274
275 gtk_main ();
276
277 g_object_unref (builder);
278 g_object_unref (settings);
279 }
280
281 return 0;
282 }
283