21
21
* Johannes H. Jensen <joh@pseudoberries.com>
27
preferences_dialog_response_cb (GtkDialog *dialog,
31
g_debug ("Preferences Response: %s", (rid == GTK_RESPONSE_CLOSE) ? "Close" : "Unknown");
33
gtk_widget_destroy (GTK_WIDGET (dialog));
34
applet->preferences_dialog = NULL;
38
pref_update_label_show (AlarmApplet *applet)
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);
45
pref_update_label_type (AlarmApplet *applet)
47
switch (applet->label_type) {
49
g_object_set (applet->pref_label_type_time, "active", TRUE, NULL);
53
g_object_set (applet->pref_label_type_remain, "active", TRUE, NULL);
61
pref_label_show_changed_cb (GtkToggleButton *togglebutton,
64
gboolean value = gtk_toggle_button_get_active (togglebutton);
66
panel_applet_gconf_set_bool (applet->parent, KEY_SHOW_LABEL, value, NULL);
71
pref_label_type_changed_cb (GtkToggleButton *togglebutton,
74
const gchar *name = gtk_widget_get_name (GTK_WIDGET (togglebutton));
75
gboolean value = gtk_toggle_button_get_active (togglebutton);
79
// Not checked, not interested
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);
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);
93
preferences_dialog_display (AlarmApplet *applet)
95
if (applet->preferences_dialog != NULL) {
96
// Dialog already open.
97
gtk_window_present (GTK_WINDOW (applet->preferences_dialog));
101
GladeXML *ui = glade_xml_new(ALARM_UI_XML, "preferences", NULL);
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");
111
pref_update_label_show (applet);
112
pref_update_label_type (applet);
114
// Set response and connect signal handlers
116
g_signal_connect (applet->preferences_dialog, "response",
117
G_CALLBACK (preferences_dialog_response_cb), applet);
120
g_signal_connect (applet->pref_label_show, "toggled",
121
G_CALLBACK (pref_label_show_changed_cb), applet);
123
g_signal_connect (applet->pref_label_type_time, "toggled",
124
G_CALLBACK (pref_label_type_changed_cb), applet);
126
g_signal_connect (applet->pref_label_type_remain, "toggled",
127
G_CALLBACK (pref_label_type_changed_cb), applet);
130
gtk_widget_show_all (GTK_WIDGET (applet->preferences_dialog));
31
prefs_autostart_init (AlarmApplet *applet);
34
prefs_autostart_update (AlarmApplet *applet);
37
autostart_monitor_changed(GFileMonitor *monitor, GFile *file,
38
GFile *other_file, GFileMonitorEvent event_type, gpointer user_data);
41
* Initialize preferences dialog and friends
44
prefs_init (AlarmApplet *applet)
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"));
49
prefs_autostart_init (applet);
52
// Ordered list of autostart files we watch for
53
GFile *autostart_user_file = NULL;
54
GList *autostart_files = NULL;
57
* Initialize autostart preference
60
prefs_autostart_init (AlarmApplet *applet)
62
// Initialize autostart files
64
// ~/.config/autostart/PACKAGE.desktop
65
// /etc/xdg/autostart/PACKAGE.desktop
69
GFileMonitor *monitor;
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);
76
autostart_files = g_list_append (autostart_files, autostart_user_file);
80
// Add global autostart(s): /etc/xdg/autostart/PACKAGE.desktop
81
const gchar* const *sys_cfg_dirs = g_get_system_config_dirs();
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);
87
autostart_files = g_list_append (autostart_files, file);
93
// Update autostart state
95
prefs_autostart_update (applet);
98
// Monitor the autostart files
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);
105
filename = g_file_get_path (file);
106
g_debug ("Preferences: Autostart watching %s", filename);
112
* Get the current most important autostart desktop file
114
* Returns NULL if no autostart desktop files were found
117
prefs_autostart_get_current ()
122
for (l = autostart_files; l != NULL; l = l->next) {
123
f = G_FILE (l->data);
124
if (g_file_query_exists (f, NULL)) {
133
* Get the current autostart state
136
prefs_autostart_get_state ()
138
GFile *file = prefs_autostart_get_current ();
144
g_debug ("Preferences: Autostart get_state for file %p", 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);
151
g_debug ("Preferences: Autostart get_state: %s", filename);
153
if (g_key_file_load_from_file(kf, filename, G_KEY_FILE_NONE, &err)) {
156
// Check for Hidden=true
157
b = g_key_file_get_boolean(kf, "Desktop Entry", "Hidden", &err);
160
// Hidden is true, autostart is FALSE
161
g_debug ("Preferences: Autostart Hidden=true");
162
g_key_file_free (kf);
171
// Check for X-GNOME-Autostart-enabled=false
172
b = g_key_file_get_boolean(kf, "Desktop Entry", "X-GNOME-Autostart-enabled", &err);
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);
186
g_key_file_free (kf);
189
g_warning ("Preferences: Could not load autostart-file '%s': %s", filename, err->message);
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");
203
* Enable / disable autostart
206
prefs_autostart_set_state (gboolean state)
208
gboolean current_state = prefs_autostart_get_state();
210
if (current_state == state) {
215
GFile *file = prefs_autostart_get_current ();
217
gchar *filename, *str;
220
GFileOutputStream *fstream;
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 ();
230
filename = g_file_get_path (file);
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);
237
fstream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &err);
239
str = g_key_file_to_data (kf, &length, NULL);
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);
249
g_key_file_free (kf);
252
g_warning ("Preferences: Error when enabling autostart-file '%s': %s", filename, err->message);
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);
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);
273
g_debug ("Preferences: Autostart DISABLE!");
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);
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);
288
file = autostart_user_file;
292
kf = g_key_file_new ();
294
filename = g_file_get_path (file);
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);
300
fstream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &err);
302
str = g_key_file_to_data (kf, &length, NULL);
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);
312
g_key_file_free (kf);
315
g_warning ("Preferences: Error when disabling autostart-file '%s': %s", filename, err->message);
320
// Disabled already, should not happen
321
g_warning ("Preferences: Autostart is already disabled!?!?");
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
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
343
* Update autostart state
346
prefs_autostart_update (AlarmApplet *applet)
348
gboolean state = gtk_toggle_action_get_active (applet->action_toggle_autostart);
349
gboolean new_state = prefs_autostart_get_state();
351
g_debug ("Preferences: Autostart update: new state: %d", new_state);
353
if (state != new_state) {
354
gtk_toggle_action_set_active (applet->action_toggle_autostart, new_state);
359
* Show preferences dialog
362
prefs_dialog_show (AlarmApplet *applet)
364
if (GTK_WIDGET_VISIBLE(applet->prefs_dialog)) {
365
gtk_window_present_with_time (GTK_WINDOW (applet->prefs_dialog), gtk_get_current_event_time());
367
gtk_dialog_run (applet->prefs_dialog);
372
autostart_monitor_changed (GFileMonitor *monitor,
375
GFileMonitorEvent event_type,
378
AlarmApplet *applet = (AlarmApplet *)user_data;
379
gchar *s = g_file_get_path (file);
380
g_print ("Monitor changed on %s: ", s);
382
switch (event_type) {
383
case G_FILE_MONITOR_EVENT_CHANGED:
386
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
387
g_print ("CHANGES_DONE_HINT");
389
case G_FILE_MONITOR_EVENT_DELETED:
392
case G_FILE_MONITOR_EVENT_CREATED:
395
case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED:
396
g_print ("ATTRIBUTE_CHANGED");
398
case G_FILE_MONITOR_EVENT_PRE_UNMOUNT:
399
g_print ("PRE_UNMOUNT");
401
case G_FILE_MONITOR_EVENT_UNMOUNTED:
402
g_print ("UNMOUNTED");
405
g_print ("UNKNOWN (%d)", event_type);
413
prefs_autostart_update (applet);