[gnome-commander] Sync bookmarks between all instances of gnome-commander
- From: Uwe Scholz <uwescholz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-commander] Sync bookmarks between all instances of gnome-commander
- Date: Tue, 2 Aug 2016 19:49:28 +0000 (UTC)
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]