return stat(path, &st) == 0;
}
-unsigned int pxdg_is_autostarted()
+static GKeyFile *get_key_file(const char *path)
+{
+ GKeyFile *kfile;
+ int ret;
+
+ kfile = g_key_file_new();
+ ret = g_key_file_load_from_file(kfile,
+ path,
+ G_KEY_FILE_KEEP_COMMENTS
+ | G_KEY_FILE_KEEP_TRANSLATIONS,
+ NULL);
+
+ if (ret) {
+ return kfile;
+ } else {
+ log_err("Failed to parse: %s", path);
+
+ g_key_file_free(kfile);
+ return NULL;
+ }
+}
+
+static int is_user_desktop_autostarted(GKeyFile *f)
+{
+ return (!g_key_file_has_key(f,
+ G_KEY_FILE_DESKTOP_GROUP,
+ "X-GNOME-Autostart-enabled",
+ NULL))
+ || g_key_file_get_boolean(f,
+ G_KEY_FILE_DESKTOP_GROUP,
+ "X-GNOME-Autostart-enabled",
+ NULL);
+}
+
+int pxdg_is_autostarted()
{
char *user_desktop;
unsigned int ret;
+ GKeyFile *kfile;
log_fct_enter();
ret = is_file_exists(user_desktop);
- if (!ret)
+ if (!ret) {
log_fct("user desktop file does not exist.");
+ } else {
+ log_fct("user desktop file exist.");
+ if (ret) {
+ kfile = get_key_file(user_desktop);
+ if (kfile)
+ ret = is_user_desktop_autostarted(kfile);
+ else
+ ret = -1;
+ }
+ g_key_file_free(kfile);
+ }
free(user_desktop);
void pxdg_set_autostart(unsigned int enable)
{
- char *user_desktop;
+ char *user_desktop, *data;
+ GKeyFile *f;
log_fct_enter();
if (enable) {
if (!is_file_exists(user_desktop))
file_copy(get_desktop_file(), user_desktop);
+
+ f = get_key_file(user_desktop);
+ if (f) {
+ if (g_key_file_has_key(f,
+ G_KEY_FILE_DESKTOP_GROUP,
+ "X-GNOME-Autostart-enabled",
+ NULL))
+ g_key_file_set_boolean
+ (f,
+ G_KEY_FILE_DESKTOP_GROUP,
+ "X-GNOME-Autostart-enabled",
+ TRUE);
+ data = g_key_file_to_data(f, NULL, NULL);
+ g_file_set_contents(user_desktop,
+ data,
+ -1,
+ NULL);
+
+ g_key_file_free(f);
+ }
} else {
+ /* because X-GNOME-Autostart-enabled does not turn off
+ * autostart on all Desktop Envs. */
remove(user_desktop);
}