~ubuntu-branches/ubuntu/saucy/alarm-clock-applet/saucy

« back to all changes in this revision

Viewing changes to src/prefs.c

  • Committer: Bazaar Package Importer
  • Author(s): Chow Loong Jin
  • Date: 2010-03-17 09:02:44 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20100317090244-ni0ye04mva2hxe10
Tags: 0.3.0-1
* New upstream release
* debian/control:
  + No change bump of Standards-Version to 3.8.4
  + Update build-deps:
    - Drop libglade, libpanel-applet, libgnomevfs2, libgnome{2,ui}
    - Add libxml2-dev and libunique-dev, intltool
* debian/patches/01_update-alarms-eta,patch:
  + Dropped, applied upstream
* debian/(alarm-clock-applet.1, alarm-clock-applet.manpages):
  + Add manpage for alarm-clock-applet, now that the binary is moved to
    /usr/bin.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 *              Johannes H. Jensen <joh@pseudoberries.com>
22
22
 */
23
23
 
 
24
#include <glib.h>
 
25
#include <gio/gio.h>
 
26
 
24
27
#include "prefs.h"
25
28
 
26
 
void
27
 
preferences_dialog_response_cb (GtkDialog *dialog,
28
 
                                                                gint rid,
29
 
                                                                AlarmApplet *applet)
30
 
{       
31
 
        g_debug ("Preferences Response: %s", (rid == GTK_RESPONSE_CLOSE) ? "Close" : "Unknown");
32
 
        
33
 
        gtk_widget_destroy (GTK_WIDGET (dialog));
34
 
        applet->preferences_dialog = NULL;
35
 
}
36
 
 
37
 
void
38
 
pref_update_label_show (AlarmApplet *applet)
39
 
{
40
 
        g_object_set (applet->pref_label_show, "active", applet->show_label, NULL);
41
 
        g_object_set (applet->pref_label_type_box, "sensitive", applet->show_label, NULL);
42
 
}
43
 
 
44
 
void
45
 
pref_update_label_type (AlarmApplet *applet)
46
 
{
47
 
        switch (applet->label_type) {
48
 
        case LABEL_TYPE_TIME:
49
 
                g_object_set (applet->pref_label_type_time, "active", TRUE, NULL);
50
 
                break;
51
 
        default:
52
 
                // LABEL_TYPE_TOTAL
53
 
                g_object_set (applet->pref_label_type_remain, "active", TRUE, NULL);
54
 
                break;
55
 
        }
56
 
}
57
 
 
58
 
 
59
 
 
60
 
static void
61
 
pref_label_show_changed_cb (GtkToggleButton *togglebutton,
62
 
                                                        AlarmApplet *applet)
63
 
{
64
 
        gboolean value = gtk_toggle_button_get_active (togglebutton);
65
 
        
66
 
        panel_applet_gconf_set_bool (applet->parent, KEY_SHOW_LABEL, value, NULL);
67
 
}
68
 
 
69
 
 
70
 
static void
71
 
pref_label_type_changed_cb (GtkToggleButton *togglebutton,
72
 
                                                        AlarmApplet *applet)
73
 
{
74
 
        const gchar *name = gtk_widget_get_name (GTK_WIDGET (togglebutton));
75
 
        gboolean value    = gtk_toggle_button_get_active (togglebutton);
76
 
        const gchar *kval;
77
 
        
78
 
        if (!value) {
79
 
                // Not checked, not interested
80
 
                return;
81
 
        }
82
 
        
83
 
        if (strcmp (name, "time-radio") == 0) {
84
 
                kval = gconf_enum_to_string (label_type_enum_map, LABEL_TYPE_TIME);
85
 
                panel_applet_gconf_set_string (applet->parent, KEY_LABEL_TYPE, kval, NULL);
86
 
        } else {
87
 
                kval = gconf_enum_to_string (label_type_enum_map, LABEL_TYPE_REMAIN);
88
 
                panel_applet_gconf_set_string (applet->parent, KEY_LABEL_TYPE, kval, NULL);
89
 
        }
90
 
}
91
 
 
92
 
void
93
 
preferences_dialog_display (AlarmApplet *applet)
94
 
{
95
 
        if (applet->preferences_dialog != NULL) {
96
 
                // Dialog already open.
97
 
                gtk_window_present (GTK_WINDOW (applet->preferences_dialog));
98
 
                return;
99
 
        }
100
 
        
101
 
        GladeXML *ui = glade_xml_new(ALARM_UI_XML, "preferences", NULL);
102
 
        
103
 
        // Fetch widgets
104
 
        applet->preferences_dialog            = GTK_DIALOG (glade_xml_get_widget (ui, "preferences"));
105
 
        applet->pref_label_show               = glade_xml_get_widget (ui, "show-label");
106
 
        applet->pref_label_type_box           = glade_xml_get_widget (ui, "label-type-box");
107
 
        applet->pref_label_type_time          = glade_xml_get_widget (ui, "time-radio");
108
 
        applet->pref_label_type_remain        = glade_xml_get_widget (ui, "remain-radio");
109
 
        
110
 
        // Update UI
111
 
        pref_update_label_show (applet);
112
 
        pref_update_label_type (applet);
113
 
        
114
 
        // Set response and connect signal handlers
115
 
        
116
 
        g_signal_connect (applet->preferences_dialog, "response", 
117
 
                                          G_CALLBACK (preferences_dialog_response_cb), applet);
118
 
        
119
 
        // Display
120
 
        g_signal_connect (applet->pref_label_show, "toggled",
121
 
                                          G_CALLBACK (pref_label_show_changed_cb), applet);
122
 
        
123
 
        g_signal_connect (applet->pref_label_type_time, "toggled",
124
 
                                          G_CALLBACK (pref_label_type_changed_cb), applet);
125
 
        
126
 
        g_signal_connect (applet->pref_label_type_remain, "toggled",
127
 
                                          G_CALLBACK (pref_label_type_changed_cb), applet);
128
 
        
129
 
        // Show it all
130
 
        gtk_widget_show_all (GTK_WIDGET (applet->preferences_dialog));
 
29
 
 
30
void
 
31
prefs_autostart_init (AlarmApplet *applet);
 
32
 
 
33
void
 
34
prefs_autostart_update (AlarmApplet *applet);
 
35
 
 
36
void
 
37
autostart_monitor_changed(GFileMonitor *monitor, GFile *file,
 
38
                GFile *other_file, GFileMonitorEvent event_type, gpointer user_data);
 
39
 
 
40
/**
 
41
 * Initialize preferences dialog and friends
 
42
 */
 
43
void
 
44
prefs_init (AlarmApplet *applet)
 
45
{
 
46
        applet->prefs_dialog = GTK_DIALOG (gtk_builder_get_object(applet->ui, "preferences"));
 
47
        applet->prefs_autostart_check = GTK_WIDGET (gtk_builder_get_object (applet->ui, "autostart-check"));
 
48
 
 
49
        prefs_autostart_init (applet);
 
50
}
 
51
 
 
52
// Ordered list of autostart files we watch for
 
53
GFile *autostart_user_file = NULL;
 
54
GList *autostart_files = NULL;
 
55
 
 
56
/**
 
57
 * Initialize autostart preference
 
58
 */
 
59
void
 
60
prefs_autostart_init (AlarmApplet *applet)
 
61
{
 
62
        // Initialize autostart files
 
63
        // We monitor:
 
64
        //      ~/.config/autostart/PACKAGE.desktop
 
65
        //      /etc/xdg/autostart/PACKAGE.desktop
 
66
        //      ...
 
67
        gchar *filename;
 
68
        GFile *file;
 
69
        GFileMonitor *monitor;
 
70
        GList *l = NULL;
 
71
 
 
72
        // Add user-specific autostart: ~/.config/autostart/PACKAGE.desktop
 
73
        filename = g_build_filename (g_get_user_config_dir (), "autostart", PACKAGE ".desktop", NULL);
 
74
        autostart_user_file = g_file_new_for_path (filename);
 
75
 
 
76
        autostart_files = g_list_append (autostart_files, autostart_user_file);
 
77
 
 
78
        g_free(filename);
 
79
 
 
80
        // Add global autostart(s): /etc/xdg/autostart/PACKAGE.desktop
 
81
        const gchar* const *sys_cfg_dirs = g_get_system_config_dirs();
 
82
        gint i;
 
83
        for (i = 0; sys_cfg_dirs[i] != NULL; i++) {
 
84
                filename = g_build_filename (sys_cfg_dirs[i], "autostart", PACKAGE ".desktop", NULL);
 
85
                file = g_file_new_for_path (filename);
 
86
 
 
87
                autostart_files = g_list_append (autostart_files, file);
 
88
 
 
89
                g_free(filename);
 
90
        }
 
91
 
 
92
        //
 
93
        // Update autostart state
 
94
        //
 
95
        prefs_autostart_update (applet);
 
96
 
 
97
        //
 
98
        // Monitor the autostart files
 
99
        //
 
100
        for (l = autostart_files; l != NULL; l = l->next) {
 
101
                file = G_FILE (l->data);
 
102
                monitor = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL);
 
103
                g_signal_connect (monitor, "changed", G_CALLBACK (autostart_monitor_changed), applet);
 
104
 
 
105
                filename = g_file_get_path (file);
 
106
                g_debug ("Preferences: Autostart watching %s", filename);
 
107
                g_free(filename);
 
108
        }
 
109
}
 
110
 
 
111
/**
 
112
 * Get the current most important autostart desktop file
 
113
 *
 
114
 * Returns NULL if no autostart desktop files were found
 
115
 */
 
116
static GFile *
 
117
prefs_autostart_get_current ()
 
118
{
 
119
        GFile *f;
 
120
        GList *l = NULL;
 
121
 
 
122
        for (l = autostart_files; l != NULL; l = l->next) {
 
123
                f = G_FILE (l->data);
 
124
                if (g_file_query_exists (f, NULL)) {
 
125
                        return f;
 
126
                }
 
127
        }
 
128
 
 
129
        return NULL;
 
130
}
 
131
 
 
132
/**
 
133
 * Get the current autostart state
 
134
 */
 
135
gboolean
 
136
prefs_autostart_get_state ()
 
137
{
 
138
        GFile *file = prefs_autostart_get_current ();
 
139
        gchar *filename;
 
140
        GKeyFile *kf;
 
141
        GError *err = NULL;
 
142
        gboolean b;
 
143
 
 
144
        g_debug ("Preferences: Autostart get_state for file %p", file);
 
145
 
 
146
        if (file) {
 
147
                // An autostart file exists, open it and check for Hidden=true and X-GNOME-Autostart-enabled=false
 
148
                kf = g_key_file_new ();
 
149
                filename = g_file_get_path (file);
 
150
 
 
151
                g_debug ("Preferences: Autostart get_state: %s", filename);
 
152
 
 
153
                if (g_key_file_load_from_file(kf, filename, G_KEY_FILE_NONE, &err)) {
 
154
                        g_free (filename);
 
155
 
 
156
                        // Check for Hidden=true
 
157
                        b = g_key_file_get_boolean(kf, "Desktop Entry", "Hidden", &err);
 
158
 
 
159
                        if (!err && b) {
 
160
                                // Hidden is true, autostart is FALSE
 
161
                                g_debug ("Preferences: Autostart Hidden=true");
 
162
                                g_key_file_free (kf);
 
163
                                return FALSE;
 
164
                        }
 
165
 
 
166
                        if (err) {
 
167
                                g_error_free (err);
 
168
                                err = NULL;
 
169
                        }
 
170
 
 
171
                        // Check for X-GNOME-Autostart-enabled=false
 
172
                        b = g_key_file_get_boolean(kf, "Desktop Entry", "X-GNOME-Autostart-enabled", &err);
 
173
 
 
174
                        if (!err && !b) {
 
175
                                // X-GNOME-Autostart-enabled is false, autostart is FALSE
 
176
                                g_debug ("Preferences: Autostart X-GNOME-Autostart-enabled=false");
 
177
                                g_key_file_free (kf);
 
178
                                return FALSE;
 
179
                        }
 
180
 
 
181
                        if (err) {
 
182
                                g_error_free (err);
 
183
                                err = NULL;
 
184
                        }
 
185
 
 
186
                        g_key_file_free (kf);
 
187
 
 
188
                } else {
 
189
                        g_warning ("Preferences: Could not load autostart-file '%s': %s", filename, err->message);
 
190
                        g_error_free (err);
 
191
                        g_free(filename);
 
192
                }
 
193
 
 
194
                // File exists and none of the keys have been set to disable it => assume autostart is active
 
195
                g_debug ("Preferences: Autostart is TRUE");
 
196
                return TRUE;
 
197
        }
 
198
 
 
199
        return FALSE;
 
200
}
 
201
 
 
202
/**
 
203
 * Enable / disable autostart
 
204
 */
 
205
void
 
206
prefs_autostart_set_state (gboolean state)
 
207
{
 
208
        gboolean current_state = prefs_autostart_get_state();
 
209
 
 
210
        if (current_state == state) {
 
211
                // No change
 
212
                return;
 
213
        }
 
214
 
 
215
        GFile *file = prefs_autostart_get_current ();
 
216
        GFile *f;
 
217
        gchar *filename, *str;
 
218
        gsize length;
 
219
        GKeyFile *kf;
 
220
        GFileOutputStream *fstream;
 
221
        GError *err = NULL;
 
222
 
 
223
        if (state) {
 
224
                // Enable
 
225
                g_debug ("Preferences: Autostart ENABLE!");
 
226
                if (file == autostart_user_file) {
 
227
                        // Unset Hidden and X-GNOME-Autostart-enabled
 
228
                        kf = g_key_file_new ();
 
229
 
 
230
                        filename = g_file_get_path (file);
 
231
 
 
232
                        if (g_key_file_load_from_file(kf, filename, G_KEY_FILE_NONE, &err)) {
 
233
                                g_key_file_remove_key (kf, "Desktop Entry", "Hidden", NULL);
 
234
                                g_key_file_remove_key (kf, "Desktop Entry", "X-GNOME-Autostart-enabled", NULL);
 
235
 
 
236
                                // Write out results
 
237
                                fstream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &err);
 
238
                                if (fstream) {
 
239
                                        str = g_key_file_to_data (kf, &length, NULL);
 
240
 
 
241
                                        g_print ("Writing str: %s", str);
 
242
                                        g_output_stream_write_all (G_OUTPUT_STREAM (fstream), str, length, NULL, NULL, &err);
 
243
                                        g_output_stream_close (G_OUTPUT_STREAM (fstream), NULL, &err);
 
244
 
 
245
                                        g_free (str);
 
246
                                }
 
247
                        }
 
248
 
 
249
                        g_key_file_free (kf);
 
250
 
 
251
                        if (err) {
 
252
                                g_warning ("Preferences: Error when enabling autostart-file '%s': %s", filename, err->message);
 
253
                                g_error_free (err);
 
254
                        }
 
255
 
 
256
                        g_free(filename);
 
257
 
 
258
                } else {
 
259
                        // Copy .desktop to autostart_user_file
 
260
                        filename = g_build_filename (ALARM_CLOCK_DATADIR, "applications", PACKAGE ".desktop", NULL);
 
261
                        f = g_file_new_for_path (filename);
 
262
 
 
263
                        if (!g_file_copy (f, autostart_user_file, G_FILE_COPY_NONE, NULL, NULL, NULL, &err)) {
 
264
                                g_warning ("Preferences: Could not copy '%s' to user config dir: %s", filename, err->message);
 
265
                                g_error_free (err);
 
266
                        }
 
267
 
 
268
                        g_free (filename);
 
269
                }
 
270
 
 
271
        } else {
 
272
                // Disable
 
273
                g_debug ("Preferences: Autostart DISABLE!");
 
274
 
 
275
                if (file) {
 
276
                        if (file != autostart_user_file) {
 
277
                                // Copy .desktop to autostart_user_file
 
278
                                filename = g_build_filename (ALARM_CLOCK_DATADIR, "applications", PACKAGE ".desktop", NULL);
 
279
                                f = g_file_new_for_path (filename);
 
280
 
 
281
                                if (!g_file_copy (f, autostart_user_file, G_FILE_COPY_NONE, NULL, NULL, NULL, &err)) {
 
282
                                        g_warning ("Preferences: Could not copy '%s' to user config dir: %s", filename, err->message);
 
283
                                        g_error_free (err);
 
284
                                }
 
285
 
 
286
                                g_free(filename);
 
287
 
 
288
                                file = autostart_user_file;
 
289
                        }
 
290
 
 
291
                        // Set Hidden=true
 
292
                        kf = g_key_file_new ();
 
293
 
 
294
                        filename = g_file_get_path (file);
 
295
 
 
296
                        if (g_key_file_load_from_file(kf, filename, G_KEY_FILE_NONE, &err)) {
 
297
                                g_key_file_set_boolean(kf, "Desktop Entry", "Hidden", TRUE);
 
298
 
 
299
                                // Write out results
 
300
                                fstream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &err);
 
301
                                if (fstream) {
 
302
                                        str = g_key_file_to_data (kf, &length, NULL);
 
303
 
 
304
                                        g_print ("Writing str: %s", str);
 
305
                                        g_output_stream_write_all (G_OUTPUT_STREAM (fstream), str, length, NULL, NULL, &err);
 
306
                                        g_output_stream_close (G_OUTPUT_STREAM (fstream), NULL, &err);
 
307
 
 
308
                                        g_free (str);
 
309
                                }
 
310
                        }
 
311
 
 
312
                        g_key_file_free (kf);
 
313
 
 
314
                        if (err) {
 
315
                                g_warning ("Preferences: Error when disabling autostart-file '%s': %s", filename, err->message);
 
316
                                g_error_free (err);
 
317
                        }
 
318
 
 
319
                } else {
 
320
                        // Disabled already, should not happen
 
321
                        g_warning ("Preferences: Autostart is already disabled!?!?");
 
322
                }
 
323
        }
 
324
 
 
325
        //
 
326
        // Enabling:
 
327
        // 1. get_current?
 
328
        //          no: copy .desktop to ~/.config/autostart, finished
 
329
        //          yes: is in user cfg?
 
330
        //                      no: copy .desktop to ~/.config/autostart, finished
 
331
        //                      yes: unset Hidden and X-GNOME-Autostart-enabled
 
332
        //
 
333
        // Disabling:
 
334
        // 1. get_current?
 
335
        //              no: disabled already, finished
 
336
        //              yes: is in user cfg?
 
337
        //                      no: copy .desktop to ~/.config/autostart, set Hidden=true
 
338
        //                      yes: set Hidden=true
 
339
        //
 
340
}
 
341
 
 
342
/**
 
343
 * Update autostart state
 
344
 */
 
345
void
 
346
prefs_autostart_update (AlarmApplet *applet)
 
347
{
 
348
        gboolean state = gtk_toggle_action_get_active (applet->action_toggle_autostart);
 
349
        gboolean new_state = prefs_autostart_get_state();
 
350
 
 
351
        g_debug ("Preferences: Autostart update: new state: %d", new_state);
 
352
 
 
353
        if (state != new_state) {
 
354
                gtk_toggle_action_set_active (applet->action_toggle_autostart, new_state);
 
355
        }
 
356
}
 
357
 
 
358
/**
 
359
 * Show preferences dialog
 
360
 */
 
361
void
 
362
prefs_dialog_show (AlarmApplet *applet)
 
363
{
 
364
        if (GTK_WIDGET_VISIBLE(applet->prefs_dialog)) {
 
365
                gtk_window_present_with_time (GTK_WINDOW (applet->prefs_dialog), gtk_get_current_event_time());
 
366
        } else {
 
367
                gtk_dialog_run (applet->prefs_dialog);
 
368
        }
 
369
}
 
370
 
 
371
void
 
372
autostart_monitor_changed (GFileMonitor     *monitor,
 
373
                 GFile            *file,
 
374
                 GFile            *other_file,
 
375
                 GFileMonitorEvent event_type,
 
376
                 gpointer          user_data)
 
377
{
 
378
        AlarmApplet *applet = (AlarmApplet *)user_data;
 
379
        gchar *s = g_file_get_path (file);
 
380
        g_print ("Monitor changed on %s: ", s);
 
381
 
 
382
        switch (event_type) {
 
383
                case G_FILE_MONITOR_EVENT_CHANGED:
 
384
                        g_print ("CHANGED");
 
385
                        break;
 
386
                case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
 
387
                        g_print ("CHANGES_DONE_HINT");
 
388
                        break;
 
389
                case G_FILE_MONITOR_EVENT_DELETED:
 
390
                        g_print ("DELETED");
 
391
                        break;
 
392
                case G_FILE_MONITOR_EVENT_CREATED:
 
393
                        g_print ("CREATED");
 
394
                        break;
 
395
                case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED:
 
396
                        g_print ("ATTRIBUTE_CHANGED");
 
397
                        break;
 
398
                case G_FILE_MONITOR_EVENT_PRE_UNMOUNT:
 
399
                        g_print ("PRE_UNMOUNT");
 
400
                        break;
 
401
                case G_FILE_MONITOR_EVENT_UNMOUNTED:
 
402
                        g_print ("UNMOUNTED");
 
403
                        break;
 
404
                default:
 
405
                        g_print ("UNKNOWN (%d)", event_type);
 
406
                        break;
 
407
        }
 
408
 
 
409
        g_print ("\n");
 
410
 
 
411
        g_free (s);
 
412
 
 
413
        prefs_autostart_update (applet);
131
414
}