Use XDG standard paths for fallback (default) settings.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Sat, 22 Feb 2014 00:35:40 +0000 (02:35 +0200)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Sat, 22 Feb 2014 00:35:40 +0000 (02:35 +0200)
The XDG_CONFIG_DIRS should be used for default config, not XDG_DATA_DIRS.

configure.ac
data/Makefile.am
src/Makefile.am
src/configurator.c
src/panel.c
src/private.h

index bfa7296..85d9a57 100644 (file)
@@ -400,6 +400,12 @@ else
     CPPFLAGS="$CPPFLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS"
 fi
 
+dnl Fix invalid sysconfdir when --prefix=/usr
+if test `eval "echo $sysconfdir"` = /usr/etc
+then
+    sysconfdir=/etc
+fi
+
 AC_CONFIG_FILES([
     lxpanel.pc
     Makefile
@@ -432,6 +438,9 @@ echo
 echo lxpanel ......................... : Version $VERSION
 echo
 echo Prefix........................... : $prefix
+echo System config directory.......... : `eval "echo $sysconfdir"`
+echo
+
 if test x$plugins_loading = xyes; then
 echo Building dynamic plugins:
     if test x"$plugin_netstatus" != x; then
@@ -480,6 +489,12 @@ else
 echo Dynamic loader for plugins....... : disabled.
 fi
 
+if test x"$sysconfdir" != x'/etc'; then
+    echo
+    echo 'Warning: sysconfdir is not /etc. It might be not what you want.'
+    echo 'Please consider passing --sysconfdir=/etc to configure.'
+fi
+
 echo
 echo 'LXPanel requires menu-cache and lxmenu-data packages since'
 echo 'version 0.4.0. Please make sure they are correctly installed.'
index fd0ca31..c0efaf6 100644 (file)
@@ -1,19 +1,19 @@
 default_config_DATA = \
        default/config
-default_configdir = $(datadir)/lxpanel/profile/default
+default_configdir = $(sysconfdir)/xdg/lxpanel/default
 
 default_config_panel_DATA = \
        default/panels/panel
-default_config_paneldir = $(datadir)/lxpanel/profile/default/panels
+default_config_paneldir = $(sysconfdir)/xdg/lxpanel/default/panels
 
 two_panels_config_DATA = \
        two_panels/config
-two_panels_configdir = $(datadir)/lxpanel/profile/two_panels
+two_panels_configdir = $(sysconfdir)/xdg/lxpanel/two_panels
 
 two_panels_config_panel_DATA = \
        two_panels/panels/bottom \
        two_panels/panels/top
-two_panels_config_paneldir = $(datadir)/lxpanel/profile/two_panels/panels
+two_panels_config_paneldir = $(sysconfdir)/xdg/lxpanel/two_panels/panels
 
 uidir=$(datadir)/lxpanel/ui
 ui_in_files= \
index 2941ab5..de07e8a 100644 (file)
@@ -10,6 +10,7 @@ lxpanel_CFLAGS = \
        -I$(top_srcdir)/src/plugins \
        -DPACKAGE_LIB_DIR=\""$(libdir)"\" \
        -DPACKAGE_DATA_DIR=\""$(datadir)/lxpanel"\" \
+       -DPACKAGE_SYSCONF_DIR=\""$(sysconfdir)/xdg/lxpanel"\" \
        -DPACKAGE_UI_DIR=\""$(datadir)/lxpanel/ui"\" \
        -DPACKAGE_BIN_DIR=\""$(bindir)"\" \
        -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
index 58c8d6b..bc99386 100644 (file)
@@ -21,6 +21,8 @@
 #include "config.h"
 #endif
 
+#define __LXPANEL_INTERNALS__
+
 #include "private.h"
 #include "misc.h"
 #include "bg.h"
@@ -60,7 +62,6 @@ Command commands[] = {
 static char* logout_cmd = NULL;
 
 extern GSList* all_panels;
-extern gchar *cprofile;
 extern int config;
 
 /* macros to update config */
@@ -1202,15 +1203,10 @@ void panel_configure( Panel* p, int sel_page )
 
 void panel_config_save( Panel* p )
 {
-    gchar *fname, *dir;
-
-    dir = get_config_file( cprofile, "panels", FALSE );
-    fname = g_build_filename( dir, p->name, NULL );
+    gchar *fname;
 
-    /* ensure the 'panels' dir exists */
-    if( ! g_file_test( dir, G_FILE_TEST_EXISTS ) )
-        g_mkdir_with_parents( dir, 0755 );
-    g_free( dir );
+    fname = _user_config_file_name("panels", p->name);
+    /* existance of 'panels' dir ensured in main() */
 
     if (!config_write_file(p->config, fname)) {
         ERR("can't open for write %s:", fname);
@@ -1506,38 +1502,29 @@ GtkWidget* create_generic_config_dlg( const char* title, GtkWidget* parent,
     return dlg;
 }
 
-char* get_config_file( const char* profile, const char* file_name, gboolean is_global )
-{
-    char* path;
-    if( is_global )
-    {
-        path = g_build_filename( PACKAGE_DATA_DIR "/profile", profile, file_name, NULL );
-    }
-    else
-    {
-        char* dir = g_build_filename( g_get_user_config_dir(), "lxpanel" , profile, NULL);
-        /* make sure the private profile dir exists */
-        /* FIXME: Should we do this everytime this func gets called?
-    *        Maybe simply doing this before saving config files is enough. */
-        g_mkdir_with_parents( dir, 0700 );
-        path = g_build_filename( dir,file_name, NULL);
-        g_free( dir );
-    }
-    return path;
-}
-
 const char command_group[] = "Command";
 void load_global_config()
 {
     GKeyFile* kf = g_key_file_new();
-    char* file = get_config_file( cprofile, "config", FALSE );
-    gboolean loaded = g_key_file_load_from_file( kf, file, 0, NULL );
-    if( ! loaded )
+    char* file = _old_system_config_file_name("config");
+    gboolean loaded = FALSE;
+
+    /* try to load system config file first */
+    if (g_key_file_load_from_file(kf, file, 0, NULL))
+        loaded = TRUE;
+    else /* fallback to old config place for backward compatibility */
     {
-        g_free( file );
-        file = get_config_file( cprofile, "config", TRUE ); /* get the system-wide config file */
-        loaded = g_key_file_load_from_file( kf, file, 0, NULL );
+        g_free(file);
+        file = _system_config_file_name("config");
+        if (g_key_file_load_from_file(kf, file, 0, NULL))
+            loaded = TRUE;
     }
+    /* now try to load user config file */
+    g_free(file);
+    file = _user_config_file_name("config", NULL);
+    if (g_key_file_load_from_file(kf, file, 0, NULL))
+        loaded = TRUE;
+    g_free(file);
 
     if( loaded )
     {
@@ -1583,7 +1570,7 @@ void load_global_config()
 
 static void save_global_config()
 {
-    char* file = get_config_file( cprofile, "config", FALSE );
+    char* file = _user_config_file_name("config", NULL);
     FILE* f = fopen( file, "w" );
     if( f )
     {
index 0d61df8..c9974dd 100644 (file)
@@ -32,6 +32,8 @@
 #include <gdk/gdkx.h>
 #include <libfm/fm-gtk.h>
 
+#define __LXPANEL_INTERNALS__
+
 #include "private.h"
 #include "misc.h"
 #include "bg.h"
@@ -602,7 +604,7 @@ static char* gen_panel_name( int edge, gint monitor )
 {
     const char* edge_str = num2str( edge_pair, edge, "" );
     char* name = NULL;
-    char* dir = get_config_file( cprofile, "panels", FALSE );
+    char* dir = _user_config_file_name("panels", NULL);
     int i;
     for( i = 0; i < G_MAXINT; ++i )
     {
@@ -689,14 +691,13 @@ static void panel_popupmenu_delete_panel( GtkMenuItem* item, Panel* panel )
     gtk_widget_destroy( dlg );
     if( ok )
     {
-        gchar *fname, *dir;
+        gchar *fname;
         all_panels = g_slist_remove( all_panels, panel );
 
         /* delete the config file of this panel */
-        dir = get_config_file( cprofile, "panels", FALSE );
-        fname = g_build_filename( dir, panel->name, NULL );
-        g_free( dir );
+        fname = _user_config_file_name("panels", panel->name);
         g_unlink( fname );
+        g_free(fname);
         panel->config_changed = 0;
         panel_destroy( panel );
     }
@@ -1518,41 +1519,66 @@ out:
 }
 #undef CLIPBOARD_NAME
 
-static gboolean start_all_panels( )
+static void _start_panels_from_dir(const char *panel_dir)
 {
-    gboolean is_global;
-    for( is_global = 0; ! all_panels && is_global < 2; ++is_global )
-    {
-        char* panel_dir = get_config_file( cprofile, "panels", is_global );
-        GDir* dir = g_dir_open( panel_dir, 0, NULL );
-        const gchar* name;
+    GDir* dir = g_dir_open( panel_dir, 0, NULL );
+    const gchar* name;
 
-        if( ! dir )
-        {
-            g_free( panel_dir );
-            continue;
-        }
+    if( ! dir )
+    {
+        return;
+    }
 
-        while((name = g_dir_read_name(dir)) != NULL)
+    while((name = g_dir_read_name(dir)) != NULL)
+    {
+        char* panel_config = g_build_filename( panel_dir, name, NULL );
+        if (strchr(panel_config, '~') == NULL) /* Skip editor backup files in case user has hand edited in this directory */
         {
-            char* panel_config = g_build_filename( panel_dir, name, NULL );
-            if (strchr(panel_config, '~') == NULL)     /* Skip editor backup files in case user has hand edited in this directory */
-            {
-                Panel* panel = panel_new( panel_config, name );
-                if( panel )
-                    all_panels = g_slist_prepend( all_panels, panel );
-            }
-            g_free( panel_config );
+            Panel* panel = panel_new( panel_config, name );
+            if( panel )
+                all_panels = g_slist_prepend( all_panels, panel );
         }
-        g_dir_close( dir );
-        g_free( panel_dir );
+        g_free( panel_config );
     }
+    g_dir_close( dir );
+}
+
+static gboolean start_all_panels( )
+{
+    char *panel_dir;
+
+    /* try user panels */
+    panel_dir = _user_config_file_name("panels", NULL);
+    _start_panels_from_dir(panel_dir);
+    g_free(panel_dir);
+    if (all_panels != NULL)
+        return TRUE;
+    /* else try XDG fallback */
+    panel_dir = _system_config_file_name("panels");
+    _start_panels_from_dir(panel_dir);
+    g_free(panel_dir);
+    if (all_panels != NULL)
+        return TRUE;
+    /* last try at old fallback for compatibility reasons */
+    panel_dir = _old_system_config_file_name("panels");
+    _start_panels_from_dir(panel_dir);
+    g_free(panel_dir);
     return all_panels != NULL;
 }
 
 void load_global_config();
 void free_global_config();
 
+static void _ensure_user_config_dirs(void)
+{
+    char *dir = g_build_filename(g_get_user_config_dir(), "lxpanel", cprofile,
+                                 "panels", NULL);
+
+    /* make sure the private profile and panels dir exists */
+    g_mkdir_with_parents(dir, 0700);
+    g_free(dir);
+}
+
 int main(int argc, char *argv[], char *env[])
 {
     int i;
@@ -1621,6 +1647,8 @@ int main(int argc, char *argv[], char *env[])
         exit(1);
     }
 
+    _ensure_user_config_dirs();
+
     /* Add our own icons to the search path of icon theme */
     gtk_icon_theme_append_search_path( gtk_icon_theme_get_default(), PACKAGE_DATA_DIR "/images" );
 
index 2d3b69b..eb131a6 100644 (file)
@@ -156,7 +156,23 @@ extern pair bool_pair[];
 int str2num(pair *p, const gchar *str, int defval);
 const gchar *num2str(pair *p, int num, const gchar *defval);
 
-char* get_config_file( const char* profile, const char* file_name, gboolean is_global );
+#ifdef __LXPANEL_INTERNALS__
+static inline char *_system_config_file_name(const char *file_name)
+{
+    return g_build_filename(PACKAGE_SYSCONF_DIR, cprofile, file_name, NULL);
+}
+
+static inline char *_old_system_config_file_name(const char *file_name)
+{
+    return g_build_filename(PACKAGE_DATA_DIR "/profile", cprofile, file_name, NULL);
+}
+
+static inline char *_user_config_file_name(const char *name1, const char *name2)
+{
+    return g_build_filename(g_get_user_config_dir(), "lxpanel", cprofile, name1,
+                            name2, NULL);
+}
+#endif
 
 //void _queue_panel_calculate_size(Panel *panel);