summaryrefslogtreecommitdiff
path: root/mate-panel/panel-mateconf.c
diff options
context:
space:
mode:
authorPerberos <[email protected]>2011-12-01 22:56:10 -0300
committerPerberos <[email protected]>2011-12-01 22:56:10 -0300
commitc51ef797a707f4e2c6f9688d4378f2b0e9898a66 (patch)
tree019ae92bb53c19b30077545cb14743cbd1b57aef /mate-panel/panel-mateconf.c
downloadmate-panel-c51ef797a707f4e2c6f9688d4378f2b0e9898a66.tar.bz2
mate-panel-c51ef797a707f4e2c6f9688d4378f2b0e9898a66.tar.xz
moving from https://github.com/perberos/mate-desktop-environment
Diffstat (limited to 'mate-panel/panel-mateconf.c')
-rw-r--r--mate-panel/panel-mateconf.c351
1 files changed, 351 insertions, 0 deletions
diff --git a/mate-panel/panel-mateconf.c b/mate-panel/panel-mateconf.c
new file mode 100644
index 00000000..974ddb4b
--- /dev/null
+++ b/mate-panel/panel-mateconf.c
@@ -0,0 +1,351 @@
+/*
+ * panel-mateconf.c: panel mateconf utility methods
+ *
+ * Copyright (C) 2001 - 2003 Sun Microsystems, Inc.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Authors:
+ * Mark McLoughlin <[email protected]>
+ * Glynn Foster <[email protected]>
+ */
+
+#include <config.h>
+
+#include "panel-mateconf.h"
+
+#include <string.h>
+#include <glib.h>
+#include <mateconf/mateconf-client.h>
+
+#include <libpanel-util/panel-cleanup.h>
+
+#undef PANEL_MATECONF_DEBUG
+
+MateConfClient *
+panel_mateconf_get_client (void)
+{
+ static MateConfClient *panel_mateconf_client = NULL;
+
+ if (!panel_mateconf_client) {
+ panel_mateconf_client = mateconf_client_get_default ();
+ panel_cleanup_register (panel_cleanup_unref_and_nullify,
+ &panel_mateconf_client);
+ }
+
+ return panel_mateconf_client;
+}
+
+/*
+ * panel_mateconf_sprintf:
+ * @format: the format string. See sprintf() documentation.
+ * @...: the arguments to be inserted.
+ *
+ * This is a version of sprintf using a static buffer which is
+ * intended for use in generating the full mateconf key for all panel
+ * config keys.
+ * Note, you should not free the return value from this function and
+ * you should realize that the return value will get overwritten or
+ * freed by a subsequent call to this function.
+ *
+ * Return Value: a pointer to the static string buffer.
+ */
+const char *
+panel_mateconf_sprintf (const char *format,
+ ...)
+{
+ static char *buffer = NULL;
+ static int buflen = 128;
+ va_list args;
+ int len;
+
+ if (!buffer)
+ buffer = g_new (char, buflen);
+
+ va_start (args, format);
+ len = g_vsnprintf (buffer, buflen, format, args);
+
+ if (len >= buflen) {
+ int i;
+
+ /* Round up length to the nearest power of 2 */
+ for (i = 0; len != 1; i++, len >>= 1);
+
+ buflen = len << (i + 1);
+ g_assert (buflen > 0);
+
+ g_free (buffer);
+ buffer = g_new (char, buflen);
+
+ va_start (args, format);
+ len = g_vsnprintf (buffer, buflen, format, args);
+
+ g_assert (len < buflen);
+ }
+
+ va_end (args);
+
+ return buffer;
+}
+
+const char *
+panel_mateconf_key_type_to_id_list (PanelMateConfKeyType type)
+{
+ char *retval;
+
+ switch (type) {
+ case PANEL_MATECONF_TOPLEVELS:
+ retval = "toplevel_id_list";
+ break;
+ case PANEL_MATECONF_APPLETS:
+ retval = "applet_id_list";
+ break;
+ case PANEL_MATECONF_OBJECTS:
+ retval = "object_id_list";
+ break;
+ default:
+ retval = NULL;
+ g_assert_not_reached ();
+ break;
+ }
+
+ return retval;
+}
+
+const char *
+panel_mateconf_global_key (const char *key)
+{
+ return panel_mateconf_sprintf ("/apps/panel/global/%s", key);
+}
+
+const char *
+panel_mateconf_general_key (const char *key)
+{
+ return panel_mateconf_sprintf (PANEL_CONFIG_DIR "/general/%s", key);
+}
+
+const char *
+panel_mateconf_full_key (PanelMateConfKeyType type,
+ const char *id,
+ const char *key)
+{
+ char *subdir = NULL;
+
+ switch (type) {
+ case PANEL_MATECONF_TOPLEVELS:
+ subdir = "toplevels";
+ break;
+ case PANEL_MATECONF_OBJECTS:
+ subdir = "objects";
+ break;
+ case PANEL_MATECONF_APPLETS:
+ subdir = "applets";
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ return panel_mateconf_sprintf (PANEL_CONFIG_DIR "/%s/%s/%s",
+ subdir, id, key);
+}
+
+const char *
+panel_mateconf_basename (const char *key)
+{
+ char *retval;
+
+ g_return_val_if_fail (key != NULL, NULL);
+
+ retval = strrchr (key, '/');
+
+ return retval ? retval + 1 : NULL;
+}
+
+char *
+panel_mateconf_dirname (const char *key)
+{
+ char *retval;
+ int len;
+
+ g_return_val_if_fail (key != NULL, NULL);
+
+ retval = strrchr (key, '/');
+ g_assert (retval != NULL);
+
+ len = retval - key;
+ g_assert (len > 0);
+
+ retval = g_new0 (char, len + 1);
+ memcpy (retval, key, len);
+
+ return retval;
+}
+
+static void
+panel_notify_object_dead (guint notify_id)
+{
+ MateConfClient *client;
+
+ client = panel_mateconf_get_client ();
+
+ mateconf_client_notify_remove (client, notify_id);
+}
+
+guint
+panel_mateconf_notify_add_while_alive (const char *key,
+ MateConfClientNotifyFunc notify_func,
+ GObject *alive_object)
+{
+ MateConfClient *client;
+ guint notify_id;
+
+ g_return_val_if_fail (G_IS_OBJECT (alive_object), 0);
+
+ client = panel_mateconf_get_client ();
+
+ notify_id = mateconf_client_notify_add (client, key, notify_func,
+ alive_object, NULL, NULL);
+
+ if (notify_id > 0)
+ g_object_weak_ref (alive_object,
+ (GWeakNotify) panel_notify_object_dead,
+ GUINT_TO_POINTER (notify_id));
+
+ return notify_id;
+}
+
+void
+panel_mateconf_copy_dir (MateConfClient *client,
+ const char *src_dir,
+ const char *dest_dir)
+{
+ GSList *list, *l;
+
+ list = mateconf_client_all_entries (client, src_dir, NULL);
+ for (l = list; l; l = l->next) {
+ MateConfEntry *entry = l->data;
+ const char *key;
+ char *tmp;
+
+ tmp = g_path_get_basename (mateconf_entry_get_key (entry));
+ key = panel_mateconf_sprintf ("%s/%s", dest_dir, tmp);
+ g_free (tmp);
+
+ mateconf_engine_associate_schema (client->engine,
+ key,
+ mateconf_entry_get_schema_name (entry),
+ NULL);
+
+ if (!mateconf_entry_get_is_default (entry) && entry->value)
+ mateconf_client_set (client, key, entry->value, NULL);
+
+ mateconf_entry_unref (entry);
+ }
+ g_slist_free (list);
+
+ list = mateconf_client_all_dirs (client, src_dir, NULL);
+ for (l = list; l; l = l->next) {
+ char *subdir = l->data;
+ char *src_subdir;
+ char *dest_subdir;
+ char *tmp;
+
+ tmp = g_path_get_basename (subdir);
+ src_subdir = mateconf_concat_dir_and_key (src_dir, tmp);
+ dest_subdir = mateconf_concat_dir_and_key (dest_dir, tmp);
+ g_free (tmp);
+
+ panel_mateconf_copy_dir (client, src_subdir, dest_subdir);
+
+ g_free (src_subdir);
+ g_free (dest_subdir);
+ g_free (subdir);
+ }
+
+ g_slist_free (list);
+}
+
+void
+panel_mateconf_associate_schemas_in_dir (MateConfClient *client,
+ const char *profile_dir,
+ const char *schema_dir)
+{
+ GSList *list, *l;
+
+#ifdef PANEL_MATECONF_DEBUG
+ g_print ("associating schemas in %s to %s\n", schema_dir, profile_dir);
+#endif
+
+ list = mateconf_client_all_entries (client, schema_dir, NULL);
+ for (l = list; l; l = l->next) {
+ MateConfEntry *entry = l->data;
+ const char *key;
+ char *tmp;
+
+ tmp = g_path_get_basename (mateconf_entry_get_key (entry));
+
+ key = panel_mateconf_sprintf ("%s/%s", profile_dir, tmp);
+
+ g_free (tmp);
+
+ mateconf_engine_associate_schema (
+ client->engine, key, mateconf_entry_get_key (entry), NULL);
+
+ mateconf_entry_unref (entry);
+ }
+
+ g_slist_free (list);
+
+ list = mateconf_client_all_dirs (client, schema_dir, NULL);
+ for (l = list; l; l = l->next) {
+ char *subdir = l->data;
+ char *prefs_subdir;
+ char *schema_subdir;
+ char *tmp;
+
+ tmp = g_path_get_basename (subdir);
+
+ prefs_subdir = g_strdup_printf ("%s/%s", profile_dir, tmp);
+ schema_subdir = g_strdup_printf ("%s/%s", schema_dir, tmp);
+
+ panel_mateconf_associate_schemas_in_dir (
+ client, prefs_subdir, schema_subdir);
+
+ g_free (prefs_subdir);
+ g_free (schema_subdir);
+ g_free (subdir);
+ g_free (tmp);
+ }
+
+ g_slist_free (list);
+}
+
+gint
+panel_mateconf_value_strcmp (gconstpointer a,
+ gconstpointer b)
+{
+ const char *str_a;
+ const char *str_b;
+
+ if (a == b || !a || !b)
+ return 0;
+
+ str_a = mateconf_value_get_string (a);
+ str_b = mateconf_value_get_string (b);
+
+ return strcmp (str_a, str_b);
+}