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