2 * Copyright (C) 2011 Didier Roche.
3 * Author: Didier Roche <didrocks@ubuntu.com>
5 * This program is free software: you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option) any later
8 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
20 #include <glib/gi18n.h>
22 #define SEATDEFAULT_KEY_GROUP "SeatDefaults"
23 #define SESSION_KEY_NAME "user-session"
24 #define GREETER_KEY_NAME "greeter-session"
26 #define IS_STRING_EMPTY(x) ((x)==NULL||(x)[0]=='\0')
28 static gboolean debug = FALSE;
29 static gboolean keep_old = FALSE;
30 static gboolean remove = FALSE;
32 static char *session = NULL;
33 static char *greeter = NULL;
35 static GOptionEntry entries[] =
37 { "debug", 'd', 0, G_OPTION_ARG_NONE, &debug, N_("Enable debugging"), NULL },
38 { "keep-old", 'k', 0, G_OPTION_ARG_NONE, &keep_old, N_("Only update if no default already set"), NULL },
39 { "remove", 'r', 0, G_OPTION_ARG_NONE, &remove, N_("Remove default value if it's the current one"), NULL },
40 { "session", 's', 0, G_OPTION_ARG_STRING, &session, N_("Set default session"), NULL },
41 { "greeter", 'g', 0, G_OPTION_ARG_STRING, &greeter, N_("Set default greeter"), NULL },
46 show_nothing(const gchar *log_domain,
47 GLogLevelFlags log_level,
49 gpointer unused_data) {};
52 update_string(const gchar *default_value,
53 const gchar *new_value,
56 const gchar *key_group,
57 const gchar *key_name,
60 gboolean success = TRUE;
62 if (!(default_value) || (strlen(default_value) < 1)) {
63 g_debug ("No existing valid value for %s. Set to %s", key_name, new_value);
64 g_key_file_set_string (keyfile, key_group, key_name, new_value);
68 if (g_strcmp0 (default_value, new_value) == 0) {
69 g_debug ("Remove %s as default value for %s", default_value, key_name);
70 g_key_file_set_string (keyfile, key_group, key_name, "");
75 g_debug ("Can't remove: %s is not the default value for %s", default_value, key_name);
79 g_debug ("Found existing default value(%s) for %s", default_value, key_name);
81 g_debug ("keep-old mode: keep previous default value");
83 g_debug ("Update to %s for %s", default_value, key_name);
84 g_key_file_set_string (keyfile, key_group, key_name, new_value);
94 main (int argc, char *argv[])
96 GOptionContext *context = NULL;
103 const gchar *gdm_conf_file = CONFIG_DIR "/lightdm.conf";
105 gchar *default_session = NULL;
106 gchar *default_greeter = NULL;
107 gint return_code = 0;
109 bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
110 bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
111 textdomain (GETTEXT_PACKAGE);
115 context = g_option_context_new (N_("- set lightdm default values"));
116 g_option_context_add_main_entries (context, entries, NULL);
117 if (!g_option_context_parse (context, &argc, &argv, &error)) {
118 g_printerr (N_("option parsing failed: %s\n"), error->message);
119 g_option_context_free (context);
120 g_error_free (error);
123 if (IS_STRING_EMPTY (session) && IS_STRING_EMPTY (greeter)) {
124 g_printerr (N_("Wrong usage of the command\n%s"), g_option_context_get_help (context, FALSE, NULL));
125 g_option_context_free (context);
129 g_option_context_free (context);
131 g_log_set_handler (NULL, G_LOG_LEVEL_DEBUG, show_nothing, NULL);
133 keyfile = g_key_file_new ();
134 flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
135 if (!(g_key_file_load_from_file (keyfile, gdm_conf_file, flags, &error))) {
136 g_debug ("File doesn't seem to exist or can't be read: create one (%s)", error->message);
137 g_error_free (error);
141 // try to get the right keys
142 default_session = g_key_file_get_string (keyfile, SEATDEFAULT_KEY_GROUP, SESSION_KEY_NAME, NULL);
143 default_greeter = g_key_file_get_string (keyfile, SEATDEFAULT_KEY_GROUP, GREETER_KEY_NAME, NULL);
145 if (!(IS_STRING_EMPTY (session)))
146 return_code = update_string (default_session, session, keep_old, remove, SEATDEFAULT_KEY_GROUP, SESSION_KEY_NAME, keyfile);
147 if (!(IS_STRING_EMPTY (greeter)) && (return_code == 0))
148 return_code = update_string (default_greeter, greeter, keep_old, remove, SEATDEFAULT_KEY_GROUP, GREETER_KEY_NAME, keyfile);
150 if(return_code == 0) {
151 s_data = g_key_file_to_data (keyfile, &size, &error);
153 g_debug ("Can't convert data to string: %s", error->message);
154 g_error_free (error);
158 if(!g_file_set_contents (gdm_conf_file, s_data, size, &error)) {
159 g_printerr ("Can't update: %s\n", error->message);
160 g_error_free (error);
167 g_key_file_free (keyfile);
170 g_free (default_session);
172 g_free (default_greeter);