X-Git-Url: http://wpitchoune.net/gitweb/?p=psensor-pkg-debian.git;a=blobdiff_plain;f=src%2Fpxdg.c;fp=src%2Fpxdg.c;h=7c3cffa03dca5a564fdeae55415864920c631fef;hp=0000000000000000000000000000000000000000;hb=e248180cc4ebc258fdd5778a26c08287089165b1;hpb=162a992f0f857ef0969d64206b9762f0d054528f diff --git a/src/pxdg.c b/src/pxdg.c new file mode 100644 index 0000000..7c3cffa --- /dev/null +++ b/src/pxdg.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2010-2014 jeanfi@gmail.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include +#include +#include +#include +#include + +#include + +#include +#include + +static const char *KEY_GNOME_AUTOSTART = "X-GNOME-Autostart-enabled"; + +static char *get_user_autostart_dir() +{ + const char *xdg_cfg_dir; + + xdg_cfg_dir = g_get_user_config_dir(); + + log_fct("g_user_config_dir(): %s", xdg_cfg_dir); + + return path_append(xdg_cfg_dir, "autostart"); +} + +static char *get_user_desktop_file() +{ + char *dir, *path; + + dir = get_user_autostart_dir(); + path = path_append(dir, "psensor.desktop"); + + free(dir); + + return path; +} + +static const char *get_desktop_file() +{ + return DATADIR"/applications/psensor.desktop"; +} + +static int is_file_exists(const char *path) +{ + struct stat st; + + return stat(path, &st) == 0; +} + +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, + KEY_GNOME_AUTOSTART, + NULL)) + || g_key_file_get_boolean(f, + G_KEY_FILE_DESKTOP_GROUP, + KEY_GNOME_AUTOSTART, + NULL); +} + +int pxdg_is_autostarted() +{ + char *user_desktop; + unsigned int ret; + GKeyFile *kfile; + + log_fct_enter(); + + user_desktop = get_user_desktop_file(); + + log_fct("user desktop file: %s", user_desktop); + + ret = is_file_exists(user_desktop); + + 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); + + log_fct_exit(); + + return ret; +} + +static void enable_gnome_autostart(const char *path) +{ + GKeyFile *f; + char *data; + + f = get_key_file(path); + if (f) { + if (g_key_file_has_key(f, + G_KEY_FILE_DESKTOP_GROUP, + KEY_GNOME_AUTOSTART, + NULL)) + g_key_file_set_boolean(f, + G_KEY_FILE_DESKTOP_GROUP, + KEY_GNOME_AUTOSTART, + TRUE); + data = g_key_file_to_data(f, NULL, NULL); + g_file_set_contents(path, data, -1, NULL); + + g_key_file_free(f); + } else { + log_err("Fail to enable %s", KEY_GNOME_AUTOSTART); + } +} + +void pxdg_set_autostart(unsigned int enable) +{ + char *user_desktop; + + log_fct_enter(); + + user_desktop = get_user_desktop_file(); + + log_fct("user desktop file: %s", user_desktop); + + log_fct("desktop file: %s", get_desktop_file()); + + if (enable) { + if (!is_file_exists(user_desktop)) + file_copy(get_desktop_file(), user_desktop); + enable_gnome_autostart(user_desktop); + } else { + /* because X-GNOME-Autostart-enabled does not turn off + * autostart on all Desktop Envs. */ + remove(user_desktop); + } + + log_fct_exit(); + + free(user_desktop); +}