]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
lightdm-set-defaults enables tweaking the default session and chosen
authorDidier Roche <didier.roche@canonical.com>
Tue, 9 Aug 2011 23:53:46 +0000 (01:53 +0200)
committerDidier Roche <didier.roche@canonical.com>
Tue, 9 Aug 2011 23:53:46 +0000 (01:53 +0200)
greeter for lightdm. This is useful for derivatives waiting to not ship
the whole configuration file of lightdm

.bzrignore
Makefile.am
NEWS
configure.ac
utils/Makefile.am [new file with mode: 0644]
utils/lightdm-set-defaults.c [new file with mode: 0644]

index 56e2c619e7733d64da1eda83b2f2fd63ce6ae771..f3d1c7081fa825e9fdbeb9c957478466939bc8db 100644 (file)
@@ -62,3 +62,4 @@ tests/src/test-qt-greeter
 tests/src/test-runner
 tests/src/test-session
 tests/src/test-xserver
+utils/lightdm-set-defaults
index c7cb54265768ca8a6aa67a74c60864deade5e88f..1143c076cb145d247c02e3b41f12b02b9bc4ce94 100644 (file)
@@ -5,7 +5,7 @@ endif
 if COMPILE_LIBLIGHTDM_QT
 SUBDIRS += liblightdm-qt
 endif
-SUBDIRS += data greeters po src doc tests
+SUBDIRS += data greeters po src doc tests utils
 
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection --enable-gtk-doc
 
diff --git a/NEWS b/NEWS
index 064deb6a45f02dfa19a535e2956e141a65b48259..1387ada7c8fa951fe19dbfdd9d39ee779485f3ba 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,9 @@
+Overview of changes in lightdm 0.9.4
+
+    * lightdm-set-defaults enables tweaking the default session and chosen
+      greeter for lightdm. This is useful for derivatives waiting to not ship
+      the whole configuration file of lightdm
+
 Overview of changes in lightdm 0.9.3
 
     * Unlock ConsoleKit sessions when switching to them
index 3508df5349694926bac17a4fc26514ae7d879ba8..bdda1655d3fc8c104de4500f7fc3aca836a5381c 100644 (file)
@@ -193,6 +193,7 @@ po/Makefile.in
 src/Makefile
 tests/Makefile
 tests/src/Makefile
+utils/Makefile
 ])
 AC_OUTPUT
 
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644 (file)
index 0000000..1d3f9db
--- /dev/null
@@ -0,0 +1,21 @@
+AM_CPPFLAGS = \
+       $(LIGHTDM_CFLAGS) \
+       -DCONFIG_DIR=\"$(sysconfdir)/lightdm\" \
+       -DLOCALE_DIR=\"$(datadir)/locale\"      \
+       $(NULL)
+
+libexec_PROGRAMS = \
+       lightdm-set-defaults \
+       $(NULL)
+
+lightdm_set_defaults_SOURCES = \
+       lightdm-set-defaults.c  \
+       $(NULL)
+
+lightdm_set_defaults_LDADD =   \
+       $(LIGHTDM_LIBS) \
+       $(NULL)
+
+DISTCLEANFILES = \
+    Makefile.in
+
diff --git a/utils/lightdm-set-defaults.c b/utils/lightdm-set-defaults.c
new file mode 100644 (file)
index 0000000..6efe565
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2011 Didier Roche.
+ * Author: Didier Roche <didrocks@ubuntu.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 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#define SEATDEFAULT_KEY_GROUP "SeatDefaults"
+#define SESSION_KEY_NAME  "user-session"
+#define GREETER_KEY_NAME  "greeter-session"
+
+#define IS_STRING_EMPTY(x) ((x)==NULL||(x)[0]=='\0')
+
+static gboolean debug = FALSE;
+static gboolean keep_old = FALSE;
+static gboolean remove = FALSE;
+
+static char    *session = NULL;
+static char    *greeter = NULL;
+
+static GOptionEntry entries[] =
+{
+  { "debug",    'd', 0, G_OPTION_ARG_NONE, &debug, N_("Enable debugging"), NULL },
+  { "keep-old", 'k', 0, G_OPTION_ARG_NONE, &keep_old, N_("Only update if no default already set"), NULL },
+  { "remove",   'r', 0, G_OPTION_ARG_NONE, &remove, N_("Remove default value if it's the current one"), NULL },
+  { "session",  's', 0, G_OPTION_ARG_STRING, &session, N_("Set default session"), NULL },
+  { "greeter",  'g', 0, G_OPTION_ARG_STRING, &greeter, N_("Set default greeter"), NULL },
+  { NULL }
+};
+
+void
+show_nothing(const gchar   *log_domain,
+             GLogLevelFlags log_level,
+             const gchar   *message,
+             gpointer       unused_data) {};
+
+int
+update_string(const gchar *default_value,
+              const gchar *new_value,
+              gboolean     keep_old,
+              gboolean     remove,
+              const gchar *key_group,
+              const gchar *key_name,
+              GKeyFile    *keyfile)
+{
+    gboolean success = TRUE;
+        
+    if (!(default_value) || (strlen(default_value) < 1)) {
+        g_debug ("No existing valid value for %s. Set to %s", key_name, new_value);
+        g_key_file_set_string (keyfile, key_group, key_name, new_value);
+    }
+    else {
+        if (remove) {
+            if (g_strcmp0 (default_value, new_value) == 0) {
+                g_debug ("Remove %s as default value for %s", default_value, key_name);
+                g_key_file_set_string (keyfile, key_group, key_name, "");
+                if (!success)
+                    return(2);
+                return(0);
+            }
+            g_debug ("Can't remove: %s is not the default value for %s", default_value, key_name);
+            return(4);
+        }
+        else {
+            g_debug ("Found existing default value(%s) for %s", default_value, key_name);
+            if (keep_old)
+                g_debug ("keep-old mode: keep previous default value");
+            else {
+                g_debug ("Update to %s for %s", default_value, key_name);
+                g_key_file_set_string (keyfile, key_group, key_name, new_value);
+            }
+        }
+    }
+    if (!success)
+        return(2);
+    return(0);
+}
+
+int 
+main (int argc, char *argv[])
+{
+    GOptionContext *context = NULL;
+    GError         *error = NULL;
+
+    GKeyFile       *keyfile;
+    GKeyFileFlags   flags;
+    gchar          *s_data;
+    gsize           size;
+    const gchar    *gdm_conf_file = CONFIG_DIR "/lightdm.conf";
+
+    gchar          *default_session = NULL;
+    gchar          *default_greeter = NULL;
+    gint            return_code = 0;
+
+    bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
+    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+    textdomain (GETTEXT_PACKAGE);
+
+    g_type_init ();
+
+    context = g_option_context_new (N_("- set lightdm default values"));
+    g_option_context_add_main_entries (context, entries, NULL);
+    if (!g_option_context_parse (context, &argc, &argv, &error)) {
+        g_printerr (N_("option parsing failed: %s\n"), error->message);
+        g_option_context_free (context);
+        g_error_free (error);
+        return 1;
+    }
+    if (IS_STRING_EMPTY (session) && IS_STRING_EMPTY (greeter)) {
+        g_printerr (N_("Wrong usage of the command\n%s"), g_option_context_get_help (context, FALSE, NULL));
+        g_option_context_free (context);
+        return 1;
+    }
+    if (context)
+        g_option_context_free (context); 
+    if (!debug)
+        g_log_set_handler (NULL, G_LOG_LEVEL_DEBUG, show_nothing, NULL);
+
+    keyfile = g_key_file_new ();
+    flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
+    if (!(g_key_file_load_from_file (keyfile, gdm_conf_file, flags, &error))) {
+            g_debug ("File doesn't seem to exist or can't be read: create one (%s)", error->message);
+            g_error_free (error);
+            error = NULL;
+    }
+
+    // try to get the right keys
+    default_session = g_key_file_get_string (keyfile, SEATDEFAULT_KEY_GROUP, SESSION_KEY_NAME, NULL);
+    default_greeter = g_key_file_get_string (keyfile, SEATDEFAULT_KEY_GROUP, GREETER_KEY_NAME, NULL);
+
+    if (!(IS_STRING_EMPTY (session)))
+        return_code = update_string (default_session, session, keep_old, remove, SEATDEFAULT_KEY_GROUP, SESSION_KEY_NAME, keyfile);
+    if (!(IS_STRING_EMPTY (greeter)) && (return_code == 0))
+        return_code = update_string (default_greeter, greeter, keep_old, remove, SEATDEFAULT_KEY_GROUP, GREETER_KEY_NAME, keyfile);
+
+    if(return_code == 0) {
+        s_data = g_key_file_to_data (keyfile, &size, &error);
+        if (!s_data) {
+            g_debug ("Can't convert data to string: %s", error->message);
+            g_error_free (error);
+            return_code = 1;
+        }
+        else {
+            if(!g_file_set_contents (gdm_conf_file, s_data, size, &error)) {
+                g_printerr ("Can't update: %s\n", error->message);
+                g_error_free (error);
+                return_code = 1;
+            }
+            g_free (s_data);
+         }
+    }
+
+    g_key_file_free (keyfile);
+
+    if (default_session)
+        g_free (default_session);
+    if (default_greeter)
+        g_free (default_greeter);
+
+    return return_code;
+
+}