]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - utils/lightdm-set-defaults.c
lightdm-set-defaults enables tweaking the default session and chosen
[sojka/lightdm.git] / utils / lightdm-set-defaults.c
1 /*
2  * Copyright (C) 2011 Didier Roche.
3  * Author: Didier Roche <didrocks@ubuntu.com>
4  * 
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
9  * license.
10  */
11
12 #ifdef HAVE_CONFIG_H
13 #include "config.h"
14 #endif
15
16 #include <stdlib.h>
17 #include <unistd.h>
18
19 #include <glib.h>
20 #include <glib/gi18n.h>
21
22 #define SEATDEFAULT_KEY_GROUP "SeatDefaults"
23 #define SESSION_KEY_NAME  "user-session"
24 #define GREETER_KEY_NAME  "greeter-session"
25
26 #define IS_STRING_EMPTY(x) ((x)==NULL||(x)[0]=='\0')
27
28 static gboolean debug = FALSE;
29 static gboolean keep_old = FALSE;
30 static gboolean remove = FALSE;
31
32 static char    *session = NULL;
33 static char    *greeter = NULL;
34
35 static GOptionEntry entries[] =
36 {
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 },
42   { NULL }
43 };
44
45 void
46 show_nothing(const gchar   *log_domain,
47              GLogLevelFlags log_level,
48              const gchar   *message,
49              gpointer       unused_data) {};
50
51 int
52 update_string(const gchar *default_value,
53               const gchar *new_value,
54               gboolean     keep_old,
55               gboolean     remove,
56               const gchar *key_group,
57               const gchar *key_name,
58               GKeyFile    *keyfile)
59 {
60     gboolean success = TRUE;
61         
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);
65     }
66     else {
67         if (remove) {
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, "");
71                 if (!success)
72                     return(2);
73                 return(0);
74             }
75             g_debug ("Can't remove: %s is not the default value for %s", default_value, key_name);
76             return(4);
77         }
78         else {
79             g_debug ("Found existing default value(%s) for %s", default_value, key_name);
80             if (keep_old)
81                 g_debug ("keep-old mode: keep previous default value");
82             else {
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);
85             }
86         }
87     }
88     if (!success)
89         return(2);
90     return(0);
91 }
92
93 int 
94 main (int argc, char *argv[])
95 {
96     GOptionContext *context = NULL;
97     GError         *error = NULL;
98
99     GKeyFile       *keyfile;
100     GKeyFileFlags   flags;
101     gchar          *s_data;
102     gsize           size;
103     const gchar    *gdm_conf_file = CONFIG_DIR "/lightdm.conf";
104
105     gchar          *default_session = NULL;
106     gchar          *default_greeter = NULL;
107     gint            return_code = 0;
108
109     bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
110     bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
111     textdomain (GETTEXT_PACKAGE);
112
113     g_type_init ();
114
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);
121         return 1;
122     }
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);
126         return 1;
127     }
128     if (context)
129         g_option_context_free (context); 
130     if (!debug)
131         g_log_set_handler (NULL, G_LOG_LEVEL_DEBUG, show_nothing, NULL);
132
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);
138             error = NULL;
139     }
140
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);
144
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);
149
150     if(return_code == 0) {
151         s_data = g_key_file_to_data (keyfile, &size, &error);
152         if (!s_data) {
153             g_debug ("Can't convert data to string: %s", error->message);
154             g_error_free (error);
155             return_code = 1;
156         }
157         else {
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);
161                 return_code = 1;
162             }
163             g_free (s_data);
164          }
165     }
166
167     g_key_file_free (keyfile);
168
169     if (default_session)
170         g_free (default_session);
171     if (default_greeter)
172         g_free (default_greeter);
173
174     return return_code;
175
176 }