[Xfce4-commits] <xfce4-places-plugin:master> Switched from a configuration file to xfconf.

Andrzej noreply at xfce.org
Sat Sep 15 21:56:02 CEST 2012


Updating branch refs/heads/master
         to 19178ffd167bc0e0139fbf7db54f8acf999b47de (commit)
       from 362dd6ee150a0140d7f328c8e361ad06e0b94655 (commit)

commit 19178ffd167bc0e0139fbf7db54f8acf999b47de
Author: Andrzej <ndrwrdck at gmail.com>
Date:   Sun Sep 16 04:54:10 2012 +0900

    Switched from a configuration file to xfconf.

 configure.in.in          |    1 +
 panel-plugin/Makefile.am |    4 +-
 panel-plugin/cfg.c       |  667 ++++++++++++++++++++++++++--------------------
 panel-plugin/cfg.h       |    6 +-
 panel-plugin/view.c      |   57 +---
 panel-plugin/view.h      |   14 +-
 6 files changed, 391 insertions(+), 358 deletions(-)

diff --git a/configure.in.in b/configure.in.in
index c0ab984..ea1fb3d 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -35,6 +35,7 @@ XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.8.0])
 XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.8.0])
 XDT_CHECK_PACKAGE([LIBXFCE4PANEL], [libxfce4panel-1.0], [4.8.0])
 XDT_CHECK_PACKAGE([EXO], [exo-1], [0.5.0])
+XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.6.0])
 XDT_CHECK_LIBX11()
 
 XDT_CHECK_OPTIONAL_PACKAGE([GIO_UNIX], [gio-unix-2.0], [2.22.0], [gio-unix],
diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am
index fbb4dfa..7f8bcaa 100644
--- a/panel-plugin/Makefile.am
+++ b/panel-plugin/Makefile.am
@@ -47,6 +47,7 @@ libplaces_la_CFLAGS =							\
 	$(LIBXFCE4UI_CFLAGS)						\
 	$(LIBXFCE4PANEL_CFLAGS)						\
 	$(EXO_CFLAGS)							\
+	$(XFCONF_CFLAGS)						\
 	$(PLATFORM_CFLAGS)
 
 libplaces_la_LIBADD =							\
@@ -62,7 +63,8 @@ libplaces_la_LIBADD =							\
 	$(LIBXFCE4UI_LIBS)						\
 	$(LIBXFCE4PANEL_LIBS)						\
 	$(LIBX11_LIBS)							\
-	$(EXO_LIBS)
+	$(EXO_LIBS)							\
+	$(XFCONF_LIBS)
 
 libplaces_la_LDFLAGS = \
 	-avoid-version \
diff --git a/panel-plugin/cfg.c b/panel-plugin/cfg.c
index 3cd5ed5..f32747f 100644
--- a/panel-plugin/cfg.c
+++ b/panel-plugin/cfg.c
@@ -3,6 +3,7 @@
  *  This file provides a means of configuring the plugin.
  *
  *  Copyright (c) 2007-2008 Diego Ongaro <ongardie at gmail.com>
+ *  Copyright (c) 2012 Andrzej <ndrwrdck at gmail.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
@@ -30,12 +31,48 @@
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4panel/libxfce4panel.h>
 #include <libxfce4ui/libxfce4ui.h>
+#include <exo/exo.h>
+#include <xfconf/xfconf.h>
 
 #include "cfg.h"
 #include "view.h"
 
 static void             places_cfg_finalize              (GObject         *object);
+static void             places_cfg_get_property          (GObject         *object,
+                                                          guint            prop_id,
+                                                          GValue          *value,
+                                                          GParamSpec      *pspec);
+static void             places_cfg_set_property          (GObject         *object,
+                                                          guint            prop_id,
+                                                          const GValue    *value,
+                                                          GParamSpec      *pspec);
+
+enum
+{
+  PROP_0,
+  PROP_SHOW_BUTTON_TYPE,
+  PROP_BUTTON_LABEL,
+  PROP_SHOW_ICONS,
+  PROP_SHOW_VOLUMES,
+  PROP_MOUNT_OPEN_VOLUMES,
+  PROP_SHOW_BOOKMARKS,
+#if USE_RECENT_DOCUMENTS
+  PROP_SHOW_RECENT,
+  PROP_SHOW_RECENT_CLEAR,
+  PROP_SHOW_RECENT_NUMBER,
+#endif
+  PROP_SEARCH_CMD
+};
+
+enum
+{
+  BUTTON_CHANGED,
+  MENU_CHANGED,
+  MODEL_CHANGED,
+  LAST_SIGNAL
+};
 
+static guint places_cfg_signals[LAST_SIGNAL] = { 0, };
 
 G_DEFINE_TYPE (PlacesCfg, places_cfg, G_TYPE_OBJECT)
 
@@ -46,279 +83,317 @@ places_cfg_class_init (PlacesCfgClass *klass)
 
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = places_cfg_finalize;
-}
-
+  gobject_class->get_property = places_cfg_get_property;
+  gobject_class->set_property = places_cfg_set_property;
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_BUTTON_TYPE,
+                                   g_param_spec_uint ("show-button-type",
+                                                      NULL, NULL,
+                                                      0,
+                                                      2,
+                                                      0,
+                                                      EXO_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_BUTTON_LABEL,
+                                   g_param_spec_string ("button-label",
+                                                        NULL, NULL,
+                                                        _("Places"),
+                                                        EXO_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_ICONS,
+                                   g_param_spec_boolean ("show-icons", NULL, NULL,
+                                                         TRUE,
+                                                         EXO_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_VOLUMES,
+                                   g_param_spec_boolean ("show-volumes", NULL, NULL,
+                                                         TRUE,
+                                                         EXO_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_MOUNT_OPEN_VOLUMES,
+                                   g_param_spec_boolean ("mount-open-volumes", NULL, NULL,
+                                                         FALSE,
+                                                         EXO_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_BOOKMARKS,
+                                   g_param_spec_boolean ("show-bookmarks", NULL, NULL,
+                                                         TRUE,
+                                                         EXO_PARAM_READWRITE));
 
+#if USE_RECENT_DOCUMENTS
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_RECENT,
+                                   g_param_spec_boolean ("show-recent", NULL, NULL,
+                                                         TRUE,
+                                                         EXO_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_RECENT_CLEAR,
+                                   g_param_spec_boolean ("show-recent-clear", NULL, NULL,
+                                                         TRUE,
+                                                         EXO_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHOW_RECENT_NUMBER,
+                                   g_param_spec_uint ("show-recent-number",
+                                                      NULL, NULL,
+                                                      1,
+                                                      25,
+                                                      10,
+                                                      EXO_PARAM_READWRITE));
+#endif
 
-static void
-places_cfg_init (PlacesCfg *cfg)
-{
+  g_object_class_install_property (gobject_class,
+                                   PROP_SEARCH_CMD,
+                                   g_param_spec_string ("search-cmd",
+                                                        NULL, NULL,
+                                                        "",
+                                                        EXO_PARAM_READWRITE));
+
+  places_cfg_signals[BUTTON_CHANGED] =
+    g_signal_new (g_intern_static_string ("button-changed"),
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
+  places_cfg_signals[MENU_CHANGED] =
+    g_signal_new (g_intern_static_string ("menu-changed"),
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
+  places_cfg_signals[MODEL_CHANGED] =
+    g_signal_new (g_intern_static_string ("model-changed"),
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
 }
 
 
-/********** Configuration File **********/
 
 static void
-pcfg_init_defaults(PlacesCfg *cfg)
+places_cfg_init (PlacesCfg *cfg)
 {
-
-    cfg->show_button_icon   = TRUE;
-    cfg->show_button_label  = FALSE;
-    cfg->show_icons         = TRUE;
-    cfg->show_volumes       = TRUE;
-    cfg->mount_open_volumes = FALSE;
-    cfg->show_bookmarks     = TRUE;
+  cfg->show_button_icon   = TRUE;
+  cfg->show_button_label  = FALSE;
+  cfg->show_icons         = TRUE;
+  cfg->show_volumes       = TRUE;
+  cfg->mount_open_volumes = FALSE;
+  cfg->show_bookmarks     = TRUE;
 #if USE_RECENT_DOCUMENTS
-    cfg->show_recent        = TRUE;
-    cfg->show_recent_clear  = TRUE;
-    cfg->show_recent_number = 10;
+  cfg->show_recent        = TRUE;
+  cfg->show_recent_clear  = TRUE;
+  cfg->show_recent_number = 10;
 #endif
-
-    if(cfg->search_cmd != NULL)
-        g_free(cfg->search_cmd);
-    cfg->search_cmd = g_strdup("");
-
-    if(cfg->label != NULL)
-        g_free(cfg->label);
-    cfg->label = g_strdup(_("Places"));
-
+  cfg->search_cmd = g_strdup("");
+  cfg->label = g_strdup(_("Places"));
 }
 
+
 static void
-pcfg_load(PlacesCfg *cfg)
+places_cfg_get_property (GObject    *object,
+                         guint       prop_id,
+                         GValue     *value,
+                         GParamSpec *pspec)
 {
-    XfceRc *rcfile;
-
-    g_assert(cfg != NULL);
-
-    if(cfg->read_path == NULL){
-        pcfg_init_defaults(cfg);
-        return;
-    }
-
-    rcfile = xfce_rc_simple_open(cfg->read_path, TRUE);
-    if(rcfile == NULL){
-        pcfg_init_defaults(cfg);
-        return;
-    }
-
-    cfg->show_button_label = xfce_rc_read_bool_entry(rcfile, "show_button_label", FALSE);
+  PlacesCfg     *cfg = XFCE_PLACES_CFG (object);
+  gint           val;
 
-    if(!cfg->show_button_label)
-        cfg->show_button_icon = TRUE;
-    else
-        cfg->show_button_icon = xfce_rc_read_bool_entry(rcfile, "show_button_icon", TRUE);
+  switch (prop_id)
+    {
+    case PROP_SHOW_BUTTON_TYPE:
+      if      ( cfg->show_button_icon && !cfg->show_button_label) val = 0;
+      else if ( cfg->show_button_icon &&  cfg->show_button_label) val = 2;
+      else                                                        val = 1;
 
-    cfg->show_icons = xfce_rc_read_bool_entry(rcfile, "show_icons", TRUE);
+      g_value_set_uint (value, val);
+      break;
 
-    cfg->show_volumes       = xfce_rc_read_bool_entry(rcfile, "show_volumes", TRUE);
-    cfg->mount_open_volumes = xfce_rc_read_bool_entry(rcfile, "mount_open_volumes", FALSE);
+    case PROP_BUTTON_LABEL:
+      g_value_set_string (value, cfg->label);
+      break;
 
-    cfg->show_bookmarks = xfce_rc_read_bool_entry(rcfile, "show_bookmarks", TRUE);
+    case PROP_SHOW_ICONS:
+      g_value_set_boolean (value, cfg->show_icons);
+      break;
 
-    if(cfg->label != NULL)
-        g_free(cfg->label);
+    case PROP_SHOW_VOLUMES:
+      g_value_set_boolean (value, cfg->show_volumes);
+      break;
 
-    cfg->label = (gchar*) xfce_rc_read_entry(rcfile, "label", NULL);
-    if(cfg->label == NULL || *cfg->label == '\0')
-        cfg->label = _("Places");
-    cfg->label = g_strdup(cfg->label);
+    case PROP_MOUNT_OPEN_VOLUMES:
+      g_value_set_boolean (value, cfg->mount_open_volumes);
+      break;
 
-    if(cfg->search_cmd != NULL)
-        g_free(cfg->search_cmd);
-
-    cfg->search_cmd = (gchar*) xfce_rc_read_entry(rcfile, "search_cmd", NULL);
-    if(cfg->search_cmd == NULL)
-        cfg->search_cmd = "";
-    cfg->search_cmd = g_strdup(cfg->search_cmd);
+    case PROP_SHOW_BOOKMARKS:
+      g_value_set_boolean (value, cfg->show_bookmarks);
+      break;
 
 #if USE_RECENT_DOCUMENTS
-    cfg->show_recent        = xfce_rc_read_bool_entry(rcfile, "show_recent", TRUE);
-    cfg->show_recent_clear  = xfce_rc_read_bool_entry(rcfile, "show_recent_clear", TRUE);
-    cfg->show_recent_number = CLAMP(xfce_rc_read_int_entry(rcfile, "show_recent_number", 10),
-                                    1, 25);
-#endif
-
-    xfce_rc_close(rcfile);
-}
-
-void
-places_cfg_save(PlacesCfg *cfg)
-{
-    XfceRc *rcfile;
-
-    g_assert(cfg != NULL);
+    case PROP_SHOW_RECENT:
+      g_value_set_boolean (value, cfg->show_recent);
+      break;
 
-    if(cfg->write_path == NULL)
-        return;
+    case PROP_SHOW_RECENT_CLEAR:
+      g_value_set_boolean (value, cfg->show_recent_clear);
+      break;
 
-    rcfile = xfce_rc_simple_open(cfg->write_path, FALSE);
-    if(rcfile == NULL)
-        return;
-
-    /* BUTTON */
-    xfce_rc_write_bool_entry(rcfile, "show_button_icon", cfg->show_button_icon);
-    xfce_rc_write_bool_entry(rcfile, "show_button_label", cfg->show_button_label);
-    xfce_rc_write_entry(rcfile, "label", cfg->label);
-
-    /* MENU */
-    xfce_rc_write_bool_entry(rcfile, "show_icons", cfg->show_icons);
-    xfce_rc_write_bool_entry(rcfile, "show_volumes", cfg->show_volumes);
-    xfce_rc_write_bool_entry(rcfile, "mount_open_volumes", cfg->mount_open_volumes);
-    xfce_rc_write_bool_entry(rcfile, "show_bookmarks", cfg->show_bookmarks);
-#if USE_RECENT_DOCUMENTS
-    xfce_rc_write_bool_entry(rcfile, "show_recent", cfg->show_recent);
-
-    /* RECENT DOCUMENTS */
-    xfce_rc_write_bool_entry(rcfile, "show_recent_clear", cfg->show_recent_clear);
-    xfce_rc_write_int_entry(rcfile, "show_recent_number", cfg->show_recent_number);
+    case PROP_SHOW_RECENT_NUMBER:
+      g_value_set_uint (value, cfg->show_recent_number);
+      break;
 #endif
 
-    /* SEARCH */
-    xfce_rc_write_entry(rcfile, "search_cmd", cfg->search_cmd);
+    case PROP_SEARCH_CMD:
+      g_value_set_string (value, cfg->search_cmd);
+      break;
 
-    xfce_rc_close(rcfile);
-
-    DBG("configuration saved");
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
 }
 
 
-/********** Dialog **********/
 
 static void
-pcfg_button_show_cb(GtkComboBox *combo, PlacesCfg *cfg)
+places_cfg_set_property (GObject      *object,
+                         guint         prop_id,
+                         const GValue *value,
+                         GParamSpec   *pspec)
 {
-    gint option = gtk_combo_box_get_active(combo);
-
-    g_assert(cfg != NULL);
-    g_assert(option >= 0 && option <= 2);
-
-    cfg->show_button_icon  = (option == 0 || option == 2);
-    cfg->show_button_label = (option == 1 || option == 2);
-
-    places_view_cfg_iface_update_button(cfg->view_iface);
-}
-
-static gboolean
-pcfg_button_label_cb(GtkWidget *label_entry, GdkEventFocus *event, PlacesCfg *cfg)
-{
-    const gchar *entry_text;
-    gchar *old_text = cfg->label;
-    gchar *new_text;
-
-    g_assert(cfg != NULL);
-
-    entry_text = gtk_entry_get_text(GTK_ENTRY(label_entry));
-    new_text = g_strstrip(g_strdup(entry_text));
-    if(old_text == NULL || (strcmp(old_text, new_text) && *new_text != '\0')){
-        cfg->label = new_text;
-
-        if(old_text != NULL)
-            g_free(old_text);
-
-        places_view_cfg_iface_update_button(cfg->view_iface);
-
-    }else{ /* we prefer the old/default text */
-
-        if(old_text == NULL)
-            cfg->label = g_strdup(_("Places"));
-
-        if(old_text == NULL || *new_text == '\0'){
-            gtk_entry_set_text(GTK_ENTRY(label_entry), cfg->label);
-            places_view_cfg_iface_update_button(cfg->view_iface);
+  PlacesCfg     *cfg = XFCE_PLACES_CFG (object);
+  gint           val;
+  const char    *text;
+
+  DBG ("Property changed");
+  switch (prop_id)
+    {
+    case PROP_SHOW_BUTTON_TYPE:
+      val = g_value_get_uint (value);
+      if (cfg->show_button_icon != (val == 0 || val == 2))
+        {
+          cfg->show_button_icon = (val == 0 || val == 2);
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[BUTTON_CHANGED], 0);
         }
-
-        g_free(new_text);
-    }
-
-    return FALSE;
-}
-
-static gboolean
-pcfg_search_cmd_cb(GtkWidget *label_entry, GdkEventFocus *event, PlacesCfg *cfg)
-{
-    const gchar *entry_text;
-    gchar *old_text = cfg->search_cmd;
-    gchar *new_text;
-
-    g_assert(cfg != NULL);
-
-    entry_text = gtk_entry_get_text(GTK_ENTRY(label_entry));
-    new_text = g_strstrip(g_strdup(entry_text));
-
-    if(old_text == NULL || strcmp(old_text, new_text)){
-        cfg->search_cmd = new_text;
-
-        if(old_text != NULL)
-            g_free(old_text);
-
-        places_view_cfg_iface_update_menu(cfg->view_iface);
-
-    }else /* we prefer the old text */
-        g_free(new_text);
-
-    return FALSE;
-}
+      if (cfg->show_button_label != (val == 1 || val == 2))
+        {
+          cfg->show_button_label = (val == 1 || val == 2);
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[BUTTON_CHANGED], 0);
+        }
+      break;
+
+    case PROP_BUTTON_LABEL:
+      text = g_value_get_string (value);
+      if (strcmp(cfg->label, text))
+        {
+          if (cfg->label != NULL)
+            g_free (cfg->label);
+          cfg->label = g_value_dup_string (value);
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[BUTTON_CHANGED], 0);
+        }
+      break;
+
+    case PROP_SHOW_ICONS:
+      val = g_value_get_boolean (value);
+      if (cfg->show_icons != val)
+        {
+          cfg->show_icons = val;
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[MENU_CHANGED], 0);
+        }
+      break;
+
+    case PROP_SHOW_VOLUMES:
+      val = g_value_get_boolean (value);
+      if (cfg->show_volumes != val)
+        {
+          cfg->show_volumes = val;
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[MODEL_CHANGED], 0);
+        }
+      break;
+
+    case PROP_MOUNT_OPEN_VOLUMES:
+      val = g_value_get_boolean (value);
+      if (cfg->mount_open_volumes != val)
+        {
+          cfg->mount_open_volumes = val;
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[MODEL_CHANGED], 0);
+        }
+      break;
+
+    case PROP_SHOW_BOOKMARKS:
+      val = g_value_get_boolean (value);
+      if (cfg->show_bookmarks != val)
+        {
+          cfg->show_bookmarks = val;
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[MODEL_CHANGED], 0);
+        }
+      break;
 
 #if USE_RECENT_DOCUMENTS
-static void
-pcfg_recent_num_cb(GtkAdjustment *adj, PlacesCfg *cfg)
-{
-    g_assert(cfg != NULL);
-
-    cfg->show_recent_number = (gint) gtk_adjustment_get_value(adj);
-    DBG("Show %d recent documents", cfg->show_recent_number);
-
-    places_view_cfg_iface_update_menu(cfg->view_iface);
-}
+    case PROP_SHOW_RECENT:
+      val = g_value_get_boolean (value);
+      if (cfg->show_recent != val)
+        {
+          cfg->show_recent = val;
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[MENU_CHANGED], 0);
+        }
+      break;
+
+    case PROP_SHOW_RECENT_CLEAR:
+      val = g_value_get_boolean (value);
+      if (cfg->show_recent_clear != val)
+        {
+          cfg->show_recent_clear = val;
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[MENU_CHANGED], 0);
+        }
+      break;
+
+    case PROP_SHOW_RECENT_NUMBER:
+      val = g_value_get_uint (value);
+      if (cfg->show_recent_number != val)
+        {
+          cfg->show_recent_number = val;
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[MENU_CHANGED], 0);
+        }
+      break;
 #endif
 
-static void
-pcfg_menu_cb(GtkToggleButton *toggle, PlacesCfg *cfg)
-{
-    gboolean *opt;
-    GtkWidget *transient;
-
-    g_assert(cfg != NULL);
-
-    opt = g_object_get_data(G_OBJECT(toggle), "cfg_opt");
-    g_assert(opt != NULL);
-
-    *opt = gtk_toggle_button_get_active(toggle);
-
-    transient = g_object_get_data(G_OBJECT(toggle), "cfg_transient");
-    if(transient != NULL)
-        gtk_widget_set_sensitive(transient, *opt);
+    case PROP_SEARCH_CMD:
+      text = g_value_get_string (value);
+      if (strcmp(cfg->search_cmd, text))
+        {
+          if (cfg->search_cmd != NULL)
+            g_free (cfg->search_cmd);
+          cfg->search_cmd = g_value_dup_string (value);
+          g_signal_emit (G_OBJECT (cfg), places_cfg_signals[MENU_CHANGED], 0);
+        }
+      break;
 
-    places_view_cfg_iface_update_menu(cfg->view_iface);
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
 }
 
-static void
-pcfg_model_cb(GtkToggleButton *toggle, PlacesCfg *cfg)
-{
-    gboolean *opt;
-    GtkWidget *transient;
-
-    g_assert(cfg != NULL);
-
-    opt = g_object_get_data(G_OBJECT(toggle), "cfg_opt");
-    g_assert(opt != NULL);
-
-    *opt = gtk_toggle_button_get_active(toggle);
-
-    transient = g_object_get_data(G_OBJECT(toggle), "cfg_transient");
-    if(transient != NULL)
-        gtk_widget_set_sensitive(transient, *opt);
-
-    places_view_cfg_iface_reconfigure_model(cfg->view_iface);
-}
+/********** Dialog **********/
 
 static void
 pcfg_dialog_close_cb(GtkDialog *dialog, gint response, PlacesCfg *cfg)
 {
     gtk_widget_destroy(GTK_WIDGET(dialog));
     xfce_panel_plugin_unblock_menu(cfg->plugin);
-    places_cfg_save(cfg);
 }
 
 static GtkWidget*
@@ -355,7 +430,6 @@ places_cfg_open_dialog(PlacesCfg *cfg)
 
     GtkWidget *tmp_box, *tmp_label, *tmp_widget;
     GtkObject * adj;
-    gint active;
 
     DBG("configure plugin");
 
@@ -384,17 +458,8 @@ places_cfg_open_dialog(PlacesCfg *cfg)
     gtk_combo_box_append_text(GTK_COMBO_BOX(tmp_widget), _("Label Only"));
     gtk_combo_box_append_text(GTK_COMBO_BOX(tmp_widget), _("Icon and Label"));
 
-    if(cfg->show_button_label)
-        if(cfg->show_button_icon)
-            active = 2;
-        else
-            active = 1;
-    else
-        active = 0;
-    gtk_combo_box_set_active(GTK_COMBO_BOX(tmp_widget), active);
-
-    g_signal_connect(G_OBJECT(tmp_widget), "changed",
-                     G_CALLBACK(pcfg_button_show_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "show-button-type",
+                            G_OBJECT (tmp_widget), "active");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(tmp_box), tmp_widget, FALSE, FALSE, 0);
@@ -410,10 +475,8 @@ places_cfg_open_dialog(PlacesCfg *cfg)
 
     tmp_widget = gtk_entry_new();
     gtk_label_set_mnemonic_widget(GTK_LABEL(tmp_label), tmp_widget);
-    gtk_entry_set_text(GTK_ENTRY(tmp_widget), cfg->label);
-
-    g_signal_connect(G_OBJECT(tmp_widget), "focus-out-event",
-                     G_CALLBACK(pcfg_button_label_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "button-label",
+                            G_OBJECT (tmp_widget), "text");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(tmp_box), tmp_widget, FALSE, FALSE, 0);
@@ -427,11 +490,8 @@ places_cfg_open_dialog(PlacesCfg *cfg)
 
     /* MENU: Show Icons */
     tmp_widget = gtk_check_button_new_with_mnemonic(_("Show _icons in menu"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp_widget), cfg->show_icons);
-
-    g_object_set_data(G_OBJECT(tmp_widget), "cfg_opt", &(cfg->show_icons));
-    g_signal_connect(G_OBJECT(tmp_widget), "toggled",
-                     G_CALLBACK(pcfg_menu_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "show-icons",
+                            G_OBJECT (tmp_widget), "active");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(vbox_menu), tmp_widget, FALSE, FALSE, 0);
@@ -439,11 +499,8 @@ places_cfg_open_dialog(PlacesCfg *cfg)
 
     /* MENU: Show Removable Media */
     tmp_widget = gtk_check_button_new_with_mnemonic(_("Show _removable media"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp_widget), cfg->show_volumes);
-
-    g_object_set_data(G_OBJECT(tmp_widget), "cfg_opt", &(cfg->show_volumes));
-    g_signal_connect(G_OBJECT(tmp_widget), "toggled",
-                     G_CALLBACK(pcfg_model_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "show-volumes",
+                            G_OBJECT (tmp_widget), "active");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(vbox_menu), tmp_widget, FALSE, FALSE, 0);
@@ -452,19 +509,16 @@ places_cfg_open_dialog(PlacesCfg *cfg)
     tmp_box = gtk_hbox_new(FALSE, 15);
 
     /* Gray out this box when "Show removable media" is off */
-    gtk_widget_set_sensitive(tmp_box, cfg->show_volumes);
-    g_object_set_data(G_OBJECT(tmp_widget), "cfg_transient", tmp_box);
+    exo_binding_new (G_OBJECT (cfg), "show-volumes",
+                     G_OBJECT (tmp_box), "sensitive");
 
     tmp_widget = gtk_label_new(" "); /* TODO: is there a more appropriate widget? */
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(tmp_box), tmp_widget, FALSE, FALSE, 0);
 
     tmp_widget = gtk_check_button_new_with_mnemonic(_("Mount and _Open on click"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp_widget), cfg->mount_open_volumes);
-
-    g_object_set_data(G_OBJECT(tmp_widget), "cfg_opt", &(cfg->mount_open_volumes));
-    g_signal_connect(G_OBJECT(tmp_widget), "toggled",
-                     G_CALLBACK(pcfg_model_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "mount-open-volumes",
+                            G_OBJECT (tmp_widget), "active");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(tmp_box), tmp_widget, FALSE, FALSE, 0);
@@ -474,11 +528,8 @@ places_cfg_open_dialog(PlacesCfg *cfg)
 
     /* MENU: Show GTK Bookmarks */
     tmp_widget = gtk_check_button_new_with_mnemonic(_("Show GTK _bookmarks"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp_widget), cfg->show_bookmarks);
-
-    g_object_set_data(G_OBJECT(tmp_widget), "cfg_opt", &(cfg->show_bookmarks));
-    g_signal_connect(G_OBJECT(tmp_widget), "toggled",
-                     G_CALLBACK(pcfg_model_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "show-bookmarks",
+                            G_OBJECT (tmp_widget), "active");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(vbox_menu), tmp_widget, FALSE, FALSE, 0);
@@ -487,11 +538,8 @@ places_cfg_open_dialog(PlacesCfg *cfg)
 #if USE_RECENT_DOCUMENTS
     /* MENU: Show Recent Documents */
     tmp_widget = gtk_check_button_new_with_mnemonic(_("Show recent _documents"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp_widget), cfg->show_recent);
-
-    g_object_set_data(G_OBJECT(tmp_widget), "cfg_opt", &(cfg->show_recent));
-    g_signal_connect(G_OBJECT(tmp_widget), "toggled",
-                     G_CALLBACK(pcfg_menu_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "show-recent",
+                            G_OBJECT (tmp_widget), "active");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(vbox_menu), tmp_widget, FALSE, FALSE, 0);
@@ -501,19 +549,16 @@ places_cfg_open_dialog(PlacesCfg *cfg)
     gtk_widget_show(vbox_recent);
 
     /* Gray out this box when "Show recent documents" is off */
-    gtk_widget_set_sensitive(vbox_recent, cfg->show_recent);
-    g_object_set_data(G_OBJECT(tmp_widget), "cfg_transient", vbox_recent);
+    exo_binding_new (G_OBJECT (cfg), "show-recent",
+                     G_OBJECT (vbox_recent), "sensitive");
 
     frame_recent = xfce_gtk_frame_box_new_with_content(_("Recent Documents"), vbox_recent);
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame_recent, FALSE, FALSE, 0);
 
     /* RECENT DOCUMENTS: Show clear option */
     tmp_widget = gtk_check_button_new_with_mnemonic(_("Show cl_ear option"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmp_widget), cfg->show_recent_clear);
-
-    g_object_set_data(G_OBJECT(tmp_widget), "cfg_opt", &(cfg->show_recent_clear));
-    g_signal_connect(G_OBJECT(tmp_widget), "toggled",
-                     G_CALLBACK(pcfg_menu_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "show-recent-clear",
+                            G_OBJECT (tmp_widget), "active");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(vbox_recent), tmp_widget, FALSE, FALSE, 0);
@@ -532,8 +577,8 @@ places_cfg_open_dialog(PlacesCfg *cfg)
     tmp_widget = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
     gtk_label_set_mnemonic_widget(GTK_LABEL(tmp_label), tmp_widget);
 
-    g_signal_connect(G_OBJECT(adj), "value-changed",
-                     G_CALLBACK(pcfg_recent_num_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "show-recent-number",
+                            G_OBJECT (adj), "value");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(tmp_box), tmp_widget, FALSE, FALSE, 0);
@@ -557,10 +602,8 @@ places_cfg_open_dialog(PlacesCfg *cfg)
 
     tmp_widget = gtk_entry_new();
     gtk_label_set_mnemonic_widget(GTK_LABEL(tmp_label), tmp_widget);
-    gtk_entry_set_text(GTK_ENTRY(tmp_widget), cfg->search_cmd);
-
-    g_signal_connect(G_OBJECT(tmp_widget), "focus-out-event",
-                     G_CALLBACK(pcfg_search_cmd_cb), cfg);
+    exo_mutual_binding_new (G_OBJECT (cfg), "search-cmd",
+                            G_OBJECT (tmp_widget), "text");
 
     gtk_widget_show(tmp_widget);
     gtk_box_pack_start(GTK_BOX(tmp_box), tmp_widget, FALSE, FALSE, 0);
@@ -581,34 +624,66 @@ places_cfg_finalize (GObject *object)
     if(cfg->search_cmd != NULL)
         g_free(cfg->search_cmd);
 
-    if(cfg->read_path != NULL)
-        g_free(cfg->read_path);
-    if(cfg->write_path != NULL)
-        g_free(cfg->write_path);
-
+  xfconf_shutdown();
   G_OBJECT_CLASS (places_cfg_parent_class)->finalize (object);
 }
 
 PlacesCfg*
-places_cfg_new(XfcePanelPlugin *plugin, PlacesViewCfgIface *view_iface)
+places_cfg_new(XfcePanelPlugin *plugin)
 {
-    PlacesCfg *cfg;
-
-    g_assert(view_iface != NULL);
+    PlacesCfg     *cfg;
+    XfconfChannel *channel;
+    gchar         *property;
 
     cfg             = g_object_new (XFCE_TYPE_PLACES_CFG, NULL);
     cfg->plugin     = plugin;
-    cfg->view_iface = view_iface;
 
-    cfg->read_path  = xfce_panel_plugin_lookup_rc_file(plugin);
-    cfg->write_path = xfce_panel_plugin_save_location(plugin, TRUE);
+    xfconf_init(NULL);
+    channel = xfconf_channel_get ("xfce4-panel");
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/show-button-type", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_INT, cfg, "show-button-type");
+    g_free (property);
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/button-label", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_STRING, cfg, "button-label");
+    g_free (property);
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/show-icons", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, cfg, "show-icons");
+    g_free (property);
 
-    pcfg_load(cfg);
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/show-volumes", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, cfg, "show-volumes");
+    g_free (property);
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/mount-open-volumes", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, cfg, "mount-open-volumes");
+    g_free (property);
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/show-bookmarks", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, cfg, "show-bookmarks");
+    g_free (property);
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/show-recent", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, cfg, "show-recent");
+    g_free (property);
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/show-recent-clear", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_BOOLEAN, cfg, "show-recent-clear");
+    g_free (property);
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/show-recent-number", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_INT, cfg, "show-recent-number");
+    g_free (property);
+
+    property = g_strconcat (xfce_panel_plugin_get_property_base (plugin), "/search-cmd", NULL);
+    xfconf_g_property_bind (channel, property, G_TYPE_STRING, cfg, "search-cmd");
+    g_free (property);
 
     g_signal_connect_swapped(G_OBJECT(plugin), "configure-plugin",
                              G_CALLBACK(places_cfg_open_dialog), cfg);
-    g_signal_connect_swapped(G_OBJECT(plugin), "save",
-                             G_CALLBACK(places_cfg_save), cfg);
+
     xfce_panel_plugin_menu_show_configure(plugin);
 
     return cfg;
diff --git a/panel-plugin/cfg.h b/panel-plugin/cfg.h
index 15afa51..54f1eef 100644
--- a/panel-plugin/cfg.h
+++ b/panel-plugin/cfg.h
@@ -3,6 +3,7 @@
  *  Defines the struct holding configuration data.
  *
  *  Copyright (c) 2007-2008 Diego Ongaro <ongardie at gmail.com>
+ *  Copyright (c) 2012 Andrzej <ndrwrdck at gmail.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
@@ -44,9 +45,6 @@ struct _PlacesCfg
 
     /* "private" */
     XfcePanelPlugin     *plugin;
-    PlacesViewCfgIface  *view_iface;
-    gchar               *read_path;
-    gchar               *write_path;
 
     /* "public" for view's access */
     gboolean            show_button_icon;
@@ -80,7 +78,7 @@ void
 places_cfg_save(PlacesCfg*);
 
 PlacesCfg*
-places_cfg_new(XfcePanelPlugin*, PlacesViewCfgIface*);
+places_cfg_new(XfcePanelPlugin*);
 
 G_END_DECLS
 
diff --git a/panel-plugin/view.c b/panel-plugin/view.c
index 802ea36..1b394f8 100644
--- a/panel-plugin/view.c
+++ b/panel-plugin/view.c
@@ -3,6 +3,7 @@
  *  This file handles the GUI. It "owns" the model and cfg.
  *
  *  Copyright (c) 2007-2009 Diego Ongaro <ongardie at gmail.com>
+ *  Copyright (c) 2012 Andrzej <ndrwrdck at gmail.com>
  *
  *  Largely based on:
  *
@@ -71,15 +72,6 @@
 #include "model_volumes_notify.h"
 #endif
 
-struct _PlacesViewCfgIface
-{
-    PlacesView          *places_view;
-
-    void                (*update_menu)              (PlacesView*);
-    void                (*update_button)            (PlacesView*);
-    void                (*reconfigure_model)        (PlacesView*);
-};
-
 struct _PlacesView
 {
     /* plugin */
@@ -87,7 +79,6 @@ struct _PlacesView
     
     /* configuration */
     PlacesCfg                 *cfg;
-    PlacesViewCfgIface        *view_cfg_iface;
     
     /* view */
     GtkWidget                 *button;
@@ -141,26 +132,6 @@ static void     pview_update_menu(PlacesView*);
 static void     pview_destroy_menu(PlacesView*);
 static void     pview_button_update(PlacesView*);
 
-/********** Interface for Cfg's Use **********/
-
-inline void
-places_view_cfg_iface_update_menu(PlacesViewCfgIface *iface)
-{
-    iface->update_menu(iface->places_view);
-}
-
-inline void
-places_view_cfg_iface_update_button(PlacesViewCfgIface *iface)
-{
-    iface->update_button(iface->places_view);
-}
-
-inline void
-places_view_cfg_iface_reconfigure_model(PlacesViewCfgIface *iface)
-{
-    iface->reconfigure_model(iface->places_view);
-}
-
 /********** Model Management **********/
 static void
 pview_destroy_model(PlacesView *view)
@@ -435,8 +406,11 @@ pview_cb_recent_changed(GtkRecentManager *recent_manager, GtkWidget *recent_menu
         gtk_menu_popdown(GTK_MENU(recent_menu));
     }
     else {
-        while (gtk_events_pending())
-            gtk_main_iteration();
+      /* Disabled */
+      /* Causes plugin to crash when search-cmd text field is edited */
+      /* (backspace key is pressed) */
+      /* while (gtk_events_pending())*/
+      /*      gtk_main_iteration();*/
 
         gtk_menu_reposition(GTK_MENU(recent_menu));
     }
@@ -972,7 +946,6 @@ PlacesView*
 places_view_init(XfcePanelPlugin *plugin)
 {
     PlacesView *view;                   /* internal use in this file */
-    PlacesViewCfgIface *view_cfg_iface; /* given to cfg */
 
     DBG("initializing");
     g_assert(plugin != NULL);
@@ -980,14 +953,13 @@ places_view_init(XfcePanelPlugin *plugin)
     view            = g_new0(PlacesView, 1);
     view->plugin    = plugin;
     
-    view_cfg_iface                          = g_new0(PlacesViewCfgIface, 1);
-    view_cfg_iface->places_view             = view;
-    view_cfg_iface->update_menu             = pview_update_menu;
-    view_cfg_iface->update_button           = pview_button_update;
-    view_cfg_iface->reconfigure_model       = pview_reconfigure_model;
-    view->view_cfg_iface = view_cfg_iface;
-
-    view->cfg      = places_cfg_new(view->plugin, view_cfg_iface);
+    view->cfg      = places_cfg_new(view->plugin);
+    g_signal_connect_swapped (G_OBJECT (view->cfg), "button-changed",
+                              G_CALLBACK (pview_button_update), view);
+    g_signal_connect_swapped (G_OBJECT (view->cfg), "menu-changed",
+                              G_CALLBACK (pview_update_menu), view);
+    g_signal_connect_swapped (G_OBJECT (view->cfg), "model-changed",
+                              G_CALLBACK (pview_reconfigure_model), view);
 
     pview_reconfigure_model(view);
     
@@ -1057,9 +1029,6 @@ places_view_finalize(PlacesView *view)
     g_object_unref(view->cfg);
     view->cfg = NULL;
 
-    g_free(view->view_cfg_iface);
-    view->view_cfg_iface = NULL;
-
     g_free(view);
 
 #ifdef HAVE_LIBNOTIFY
diff --git a/panel-plugin/view.h b/panel-plugin/view.h
index 12ac0d5..50bc076 100644
--- a/panel-plugin/view.h
+++ b/panel-plugin/view.h
@@ -4,6 +4,7 @@
  *  Headers for interface by which places.c creates/destroys view.
  *
  *  Copyright (c) 2007-2008 Diego Ongaro <ongardie at gmail.com>
+ *  Copyright (c) 2012 Andrzej <ndrwrdck at gmail.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
@@ -31,19 +32,6 @@
 
 typedef struct _PlacesView PlacesView;
 
-/* Interface for cfg */
-typedef struct _PlacesViewCfgIface PlacesViewCfgIface;
-
-inline void
-places_view_cfg_iface_update_menu(PlacesViewCfgIface*);
-
-inline void
-places_view_cfg_iface_update_button(PlacesViewCfgIface*);
-
-inline void
-places_view_cfg_iface_reconfigure_model(PlacesViewCfgIface*);
-
-
 /* Init & Finalize */
 PlacesView*
 places_view_init(XfcePanelPlugin*);


More information about the Xfce4-commits mailing list