[gnome-commander] Sync bookmarks between all instances of gnome-commander



commit 85e1e1c89af591705bcffa98959e47e5d4d9f6c2
Author: Puux <puuxmine gmail com>
Date:   Wed Jul 20 22:16:12 2016 +0300

    Sync bookmarks between all instances of gnome-commander

 src/dialogs/gnome-cmd-manage-bookmarks-dialog.cc |    6 +
 src/gnome-cmd-con.cc                             |   27 +++
 src/gnome-cmd-con.h                              |   12 +-
 src/gnome-cmd-data.cc                            |  192 ++++++++++++++--------
 src/gnome-cmd-data.h                             |    3 +
 src/gnome-cmd-dir-indicator.cc                   |   14 +--
 src/gnome-cmd-xml-config.cc                      |    4 +-
 7 files changed, 167 insertions(+), 91 deletions(-)
---
diff --git a/src/dialogs/gnome-cmd-manage-bookmarks-dialog.cc 
b/src/dialogs/gnome-cmd-manage-bookmarks-dialog.cc
index 686a500..4120fac 100644
--- a/src/dialogs/gnome-cmd-manage-bookmarks-dialog.cc
+++ b/src/dialogs/gnome-cmd-manage-bookmarks-dialog.cc
@@ -358,6 +358,10 @@ static void remove_clicked_callback (GtkButton *button, GtkWidget *view)
             g_free (bookmark->name);
             g_free (bookmark->path);
             g_free (bookmark);
+            
+            main_win->update_bookmarks ();
+            
+            gnome_cmd_data.save_xml ();
         }
     }
 }
@@ -550,6 +554,8 @@ void gnome_cmd_bookmark_add_current (GnomeCmdDir *dir)
         group->bookmarks = g_list_append (group->bookmarks, bookmark);
 
         main_win->update_bookmarks();
+        
+        gnome_cmd_data.save_xml ();
     }
     else
     {
diff --git a/src/gnome-cmd-con.cc b/src/gnome-cmd-con.cc
index db67a1a..7a8d525 100644
--- a/src/gnome-cmd-con.cc
+++ b/src/gnome-cmd-con.cc
@@ -383,6 +383,33 @@ void gnome_cmd_con_set_bookmarks (GnomeCmdCon *con, GnomeCmdBookmarkGroup *bookm
 }
 
 
+void gnome_cmd_con_add_bookmark (GnomeCmdCon *con, gchar *name, gchar *path)
+{
+    GnomeCmdBookmarkGroup *group = gnome_cmd_con_get_bookmarks (con);
+    GnomeCmdBookmark *bookmark = g_new (GnomeCmdBookmark, 1);
+    bookmark->name = name;
+    bookmark->path = path;
+    bookmark->group = group;
+    group->bookmarks = g_list_append (group->bookmarks, bookmark);
+}
+
+
+void gnome_cmd_con_erase_bookmark (GnomeCmdCon *con)
+{
+    GnomeCmdBookmarkGroup *group = con->priv->bookmarks;
+    for(GList *l = group->bookmarks; l; l = l->next)
+    {
+        GnomeCmdBookmark *bookmark = (GnomeCmdBookmark *) l->data;
+        g_free (bookmark->name);
+        g_free (bookmark->path);
+        g_free (bookmark);
+    }
+    g_list_free(group->bookmarks);
+    con->priv->bookmarks = g_new0 (GnomeCmdBookmarkGroup, 1);
+    con->priv->bookmarks->con = con;
+}
+
+
 void gnome_cmd_con_updated (GnomeCmdCon *con)
 {
     g_return_if_fail (GNOME_CMD_IS_CON (con));
diff --git a/src/gnome-cmd-con.h b/src/gnome-cmd-con.h
index 3ca4246..feeb03c 100644
--- a/src/gnome-cmd-con.h
+++ b/src/gnome-cmd-con.h
@@ -334,15 +334,9 @@ GnomeCmdBookmarkGroup *gnome_cmd_con_get_bookmarks (GnomeCmdCon *con);
 
 void gnome_cmd_con_set_bookmarks (GnomeCmdCon *con, GnomeCmdBookmarkGroup *bookmarks);
 
-inline void gnome_cmd_con_add_bookmark (GnomeCmdCon *con, gchar *name, gchar *path)
-{
-    GnomeCmdBookmarkGroup *group = gnome_cmd_con_get_bookmarks (con);
-    GnomeCmdBookmark *bookmark = g_new (GnomeCmdBookmark, 1);
-    bookmark->name = name;
-    bookmark->path = path;
-    bookmark->group = group;
-    group->bookmarks = g_list_append (group->bookmarks, bookmark);
-}
+void gnome_cmd_con_add_bookmark (GnomeCmdCon *con, gchar *name, gchar *path);
+
+void gnome_cmd_con_erase_bookmark (GnomeCmdCon *con);
 
 void gnome_cmd_con_updated (GnomeCmdCon *con);
 
diff --git a/src/gnome-cmd-data.cc b/src/gnome-cmd-data.cc
index 8e3c762..2e24f27 100644
--- a/src/gnome-cmd-data.cc
+++ b/src/gnome-cmd-data.cc
@@ -60,6 +60,9 @@ struct GnomeCmdData::Private
     gchar           *symlink_prefix;
 
     gchar           *ftp_anonymous_password;
+    
+    GFileMonitor    *settings_monitor;
+    gboolean         settings_monitor_enabled;
 };
 
 
@@ -534,7 +537,9 @@ inline gboolean load_connections (const gchar *fname)
                         gchar *alias = gnome_vfs_unescape_string (a[1].c_str(), NULL);
 
                         if (gnome_cmd_data.priv->con_list->has_alias(alias))
-                            g_warning ("%s: ignored duplicate entry: %s", path, alias);
+                        {
+                            gnome_cmd_con_erase_bookmark (gnome_cmd_data.priv->con_list->find_alias(alias));
+                        }
                         else
                         {
                             server = gnome_cmd_con_remote_new (alias, a[2]);
@@ -1328,11 +1333,42 @@ void GnomeCmdData::free()
         // free the anonymous password string
         g_free (priv->ftp_anonymous_password);
 
+        g_object_unref (priv->settings_monitor);
+
         g_free (priv);
     }
 }
 
 
+static void settings_file_changes (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent 
event_type, gpointer user_data)
+{
+    if (event_type == G_FILE_MONITOR_EVENT_CHANGED)
+    {
+        if (gnome_cmd_data.priv->settings_monitor_enabled)
+        {
+            gnome_cmd_data.priv->settings_monitor_enabled = false;
+        }
+        else
+        {
+            gnome_cmd_data.load ();
+            main_win->update_bookmarks ();
+        }
+    }
+}
+
+
+void GnomeCmdData::set_settings_monitor (const char *file_path)
+{
+    if (priv->settings_monitor) return;
+
+    GFile *file = g_file_new_for_path (file_path);
+    priv->settings_monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, NULL);
+    g_signal_connect (priv->settings_monitor, "changed", G_CALLBACK(settings_file_changes), NULL);
+
+    g_object_unref (file);
+}
+
+
 void GnomeCmdData::load()
 {
     gchar *xml_cfg_path = config_dir ? g_build_filename (config_dir, PACKAGE ".xml", NULL) : 
g_build_filename (g_get_home_dir (), "." PACKAGE, PACKAGE ".xml", NULL);
@@ -1340,7 +1376,8 @@ void GnomeCmdData::load()
     gchar *document_icon_dir = g_strconcat (GNOME_PREFIX, "/share/pixmaps/document-icons/", NULL);
     gchar *theme_icon_dir    = g_strconcat (PIXMAPS_DIR, "/mime-icons", NULL);
 
-    priv = g_new0 (Private, 1);
+    if (!priv)
+        priv = g_new0 (Private, 1);
 
     options.color_themes[GNOME_CMD_COLOR_CUSTOM].respect_theme = FALSE;
     options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg = gdk_color_new (0xffff,0xffff,0xffff);
@@ -1807,7 +1844,16 @@ void GnomeCmdData::load()
     load_cmdline_history();
     //load_dir_history ();
 
-    priv->con_list = gnome_cmd_con_list_new ();
+    if (!priv->con_list)
+        priv->con_list = gnome_cmd_con_list_new ();
+    else
+    {
+        gnome_cmd_con_erase_bookmark (priv->con_list->get_home());
+#ifdef HAVE_SAMBA
+        gnome_cmd_con_erase_bookmark (priv->con_list->get_smb());
+#endif
+        advrename_defaults.profiles.clear();
+    }
 
     priv->con_list->lock();
     if (load_devices_old ("devices") == FALSE)
@@ -1862,6 +1908,8 @@ void GnomeCmdData::load()
 
     set_vfs_volume_monitor ();
 
+    set_settings_monitor (xml_cfg_path);
+
     g_free (xml_cfg_path);
 }
 
@@ -1881,6 +1929,77 @@ void GnomeCmdData::load_more()
 }
 
 
+void GnomeCmdData::save_xml ()
+{
+    priv->settings_monitor_enabled = true;
+    
+    gchar *xml_cfg_path = config_dir ? g_build_filename (config_dir, PACKAGE ".xml", NULL) : 
g_build_filename (g_get_home_dir (), "." PACKAGE, PACKAGE ".xml", NULL);
+
+    ofstream f(xml_cfg_path);
+    XML::xstream xml(f);
+
+    xml << XML::comment("Created with GNOME Commander (http://gcmd.github.io/)");
+    xml << XML::tag("GnomeCommander") << XML::attr("version") << VERSION;
+
+    xml << *main_win;
+
+    xml << XML::tag("History");
+
+    if (options.save_dir_history_on_exit)
+    {
+        xml << XML::tag("Directories");
+
+        for (GList *i=gnome_cmd_con_get_dir_history (priv->con_list->get_home())->ents; i; i=i->next)
+            xml << XML::tag("Directory") << XML::attr("path") << XML::escape((const gchar *) i->data) << 
XML::endtag();
+
+        xml << XML::endtag("Directories");
+    }
+
+    xml << XML::endtag("History");
+
+    xml << advrename_defaults;
+    xml << search_defaults;
+    xml << bookmarks_defaults;
+
+    xml << XML::tag("Connections");
+
+    for (GList *i=gnome_cmd_con_list_get_all_remote (gnome_cmd_data.priv->con_list); i; i=i->next)
+    {
+        GnomeCmdCon *con = GNOME_CMD_CON (i->data);
+
+        if (con)
+            xml << *con;
+    }
+
+    xml << XML::endtag("Connections");
+
+    xml << XML::tag("Bookmarks");
+
+    write (xml, priv->con_list->get_home(), "Home");
+#ifdef HAVE_SAMBA
+    write (xml, priv->con_list->get_smb(), "SMB");
+#endif
+    for (GList *i=gnome_cmd_con_list_get_all_remote (gnome_cmd_data.priv->con_list); i; i=i->next)
+    {
+        GnomeCmdCon *con = GNOME_CMD_CON (i->data);
+        write (xml, con, XML::escape(gnome_cmd_con_get_alias (con)));
+    }
+
+    xml << XML::endtag("Bookmarks");
+
+    xml << XML::tag("Selections");
+    for (vector<Selection>::iterator i=selections.begin(); i!=selections.end(); ++i)
+        xml << *i;
+    xml << XML::endtag("Selections");
+
+    xml << gcmd_user_actions;
+
+    xml << XML::endtag("GnomeCommander");
+
+    g_free (xml_cfg_path);
+}
+
+
 void GnomeCmdData::save()
 {
     gnome_cmd_data_set_int    ("/options/size_disp_mode", options.size_disp_mode);
@@ -2034,72 +2153,7 @@ void GnomeCmdData::save()
     save_fav_apps ("fav-apps");
     save_intviewer_defaults();
 
-    {
-        gchar *xml_cfg_path = config_dir ? g_build_filename (config_dir, PACKAGE ".xml", NULL) : 
g_build_filename (g_get_home_dir (), "." PACKAGE, PACKAGE ".xml", NULL);
-
-        ofstream f(xml_cfg_path);
-        XML::xstream xml(f);
-
-        xml << XML::comment("Created with GNOME Commander (http://gcmd.github.io/)");
-        xml << XML::tag("GnomeCommander") << XML::attr("version") << VERSION;
-
-        xml << *main_win;
-
-        xml << XML::tag("History");
-
-        if (options.save_dir_history_on_exit)
-        {
-            xml << XML::tag("Directories");
-
-            for (GList *i=gnome_cmd_con_get_dir_history (priv->con_list->get_home())->ents; i; i=i->next)
-                xml << XML::tag("Directory") << XML::attr("path") << XML::escape((const gchar *) i->data) << 
XML::endtag();
-
-            xml << XML::endtag("Directories");
-        }
-
-        xml << XML::endtag("History");
-
-        xml << advrename_defaults;
-        xml << search_defaults;
-        xml << bookmarks_defaults;
-
-        xml << XML::tag("Connections");
-
-        for (GList *i=gnome_cmd_con_list_get_all_remote (gnome_cmd_data.priv->con_list); i; i=i->next)
-        {
-            GnomeCmdCon *con = GNOME_CMD_CON (i->data);
-
-            if (con)
-                xml << *con;
-        }
-
-        xml << XML::endtag("Connections");
-
-        xml << XML::tag("Bookmarks");
-
-        write (xml, priv->con_list->get_home(), "Home");
-#ifdef HAVE_SAMBA
-        write (xml, priv->con_list->get_smb(), "SMB");
-#endif
-        for (GList *i=gnome_cmd_con_list_get_all_remote (gnome_cmd_data.priv->con_list); i; i=i->next)
-        {
-            GnomeCmdCon *con = GNOME_CMD_CON (i->data);
-            write (xml, con, XML::escape(gnome_cmd_con_get_alias (con)));
-        }
-
-        xml << XML::endtag("Bookmarks");
-
-        xml << XML::tag("Selections");
-        for (vector<Selection>::iterator i=selections.begin(); i!=selections.end(); ++i)
-            xml << *i;
-        xml << XML::endtag("Selections");
-
-        xml << gcmd_user_actions;
-
-        xml << XML::endtag("GnomeCommander");
-
-        g_free (xml_cfg_path);
-    }
+    save_xml ();
 
     save_auto_load_plugins();
 
diff --git a/src/gnome-cmd-data.h b/src/gnome-cmd-data.h
index 5c4e5e5..a0d3fcf 100644
--- a/src/gnome-cmd-data.h
+++ b/src/gnome-cmd-data.h
@@ -425,6 +425,7 @@ struct GnomeCmdData
     void save_auto_load_plugins();
     void save_cmdline_history();
     void save_intviewer_defaults();
+       void set_settings_monitor (const char *file_path);
 
   public:
 
@@ -474,6 +475,8 @@ struct GnomeCmdData
     void load();
     void load_more();
     void save();
+       
+       void save_xml ();
 
     GnomeCmdConRemote *get_quick_connect() const       {  return quick_connect;                     }
 
diff --git a/src/gnome-cmd-dir-indicator.cc b/src/gnome-cmd-dir-indicator.cc
index 7694ffa..34a16df 100644
--- a/src/gnome-cmd-dir-indicator.cc
+++ b/src/gnome-cmd-dir-indicator.cc
@@ -29,6 +29,7 @@
 #include "gnome-cmd-main-win.h"
 #include "gnome-cmd-data.h"
 #include "gnome-cmd-user-actions.h"
+#include "dialogs/gnome-cmd-manage-bookmarks-dialog.h"
 #include "imageloader.h"
 #include "utils.h"
 
@@ -400,18 +401,7 @@ void gnome_cmd_dir_indicator_show_history (GnomeCmdDirIndicator *indicator)
 
 static void on_bookmarks_add_current (GtkMenuItem *item, GnomeCmdDirIndicator *indicator)
 {
-    GnomeCmdFile *f = GNOME_CMD_FILE (indicator->priv->fs->get_directory());
-    GnomeCmdCon *con = indicator->priv->fs->get_connection();
-    GnomeCmdBookmarkGroup *group = gnome_cmd_con_get_bookmarks (con);
-
-    GnomeCmdBookmark *bm = g_new0 (GnomeCmdBookmark, 1);
-
-    bm->name = g_strdup (f->get_name());
-    bm->path = f->get_path();
-    bm->group = group;
-
-    group->bookmarks = g_list_append (group->bookmarks, bm);
-    main_win->update_bookmarks();
+    gnome_cmd_bookmark_add_current (indicator->priv->fs->get_directory());
 }
 
 
diff --git a/src/gnome-cmd-xml-config.cc b/src/gnome-cmd-xml-config.cc
index e7d4d3c..b24dd81 100644
--- a/src/gnome-cmd-xml-config.cc
+++ b/src/gnome-cmd-xml-config.cc
@@ -528,7 +528,9 @@ static void xml_start(GMarkupParseContext *context,
                                              G_MARKUP_COLLECT_INVALID))
             {
                 if (gnome_cmd_con_list_get()->has_alias(param1))
-                    g_warning ("<Connections> duplicate entry: '%s' - ignored", param1);
+                {
+                    gnome_cmd_con_erase_bookmark (gnome_cmd_con_list_get()->find_alias(param1));
+                }
                 else
                 {
                     GnomeCmdConRemote *server = gnome_cmd_con_remote_new (param1, param2);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]