[gnome-commander] XML config: write user actions bindings to XML::xstream



commit f1555f9eb23cbf611bb880521a2c9b926aea4399
Author: Piotr Eljasiak <epiotr src gnome org>
Date:   Mon Sep 7 18:02:35 2009 +0200

    XML config: write user actions bindings to XML::xstream

 src/gnome-cmd-data.cc         |    2 ++
 src/gnome-cmd-user-actions.cc |   37 ++++++++++++++++++++++++++++++++++++-
 src/gnome-cmd-user-actions.h  |    3 +++
 src/main.cc                   |    2 +-
 4 files changed, 42 insertions(+), 2 deletions(-)
---
diff --git a/src/gnome-cmd-data.cc b/src/gnome-cmd-data.cc
index deaed2f..14a11ba 100644
--- a/src/gnome-cmd-data.cc
+++ b/src/gnome-cmd-data.cc
@@ -1765,6 +1765,8 @@ void GnomeCmdData::save()
             xml << *i;
         xml << XML::endtag("Selections");
 
+        xml << gcmd_user_actions;
+
         xml << XML::endtag("GnomeCommander");
 
         g_free (xml_cfg_path);
diff --git a/src/gnome-cmd-user-actions.cc b/src/gnome-cmd-user-actions.cc
index b2c0b12..2f49443 100644
--- a/src/gnome-cmd-user-actions.cc
+++ b/src/gnome-cmd-user-actions.cc
@@ -362,7 +362,7 @@ void GnomeCmdUserActions::init()
 
 void GnomeCmdUserActions::shutdown()
 {
-    // don't write 'hardcoded' Fn actions to config file
+    // unregister Fn to avoid writing 'hardcoded' Fn actions to config file
 
     unregister(GDK_F3);
     unregister(GDK_F4);
@@ -547,6 +547,41 @@ gboolean GnomeCmdUserActions::handle_key_event(GnomeCmdMainWin *mw, GnomeCmdFile
     return TRUE;
 }
 
+XML::xstream &operator << (XML::xstream &xml, GnomeCmdUserActions &usr)
+{
+    xml << XML::tag("KeyBindings");
+    for (GnomeCmdUserActions::ACTIONS_COLL::const_iterator i=usr.action.begin(); i!=usr.action.end(); ++i)
+        if (!ascii_isupper (i->first))                                         // ignore lowercase keys as they duplicate uppercase ones
+        {
+            guint state = i->first.state;
+            guint key_val = i->first.keyval;
+
+            xml << XML::tag("Key") << XML::attr("name");
+            if (ascii_isalnum (key_val))
+                xml << (gchar) key_val;
+            else
+                xml << gdk_key_names[key_val];
+
+            if (state & GDK_SHIFT_MASK)    xml << XML::attr("shift") << 1;
+            if (state & GDK_CONTROL_MASK)  xml << XML::attr("control") << 1;
+            if (state & GDK_MOD1_MASK)     xml << XML::attr("alt") << 1;
+#if GTK_CHECK_VERSION (2, 10, 0)
+            if (state & GDK_SUPER_MASK)    xml << XML::attr("super") << 1;
+            if (state & GDK_HYPER_MASK)    xml << XML::attr("hyper") << 1;
+            if (state & GDK_META_MASK)     xml << XML::attr("meta") << 1;
+#else
+            if (state & GDK_MOD4_MASK)     xml << XML::attr("super") << 1;
+#endif
+
+            xml << XML::attr("action") << usr.action_func[i->second.func];
+            if (!i->second.user_data.empty())
+                xml << XML::attr("options") << XML::escape(i->second.user_data);
+
+            xml << XML::endtag();
+        }
+    xml << XML::endtag();
+}
+
 
 static int sort_by_description (const void *data1, const void *data2)
 {
diff --git a/src/gnome-cmd-user-actions.h b/src/gnome-cmd-user-actions.h
index 0af69f5..9f996eb 100644
--- a/src/gnome-cmd-user-actions.h
+++ b/src/gnome-cmd-user-actions.h
@@ -30,6 +30,7 @@
 #include "gnome-cmd-file-selector.h"
 #include "gnome-cmd-data.h"
 #include "gnome-cmd-main-win.h"
+#include "gnome-cmd-xml-config.h"
 #include "dict.h"
 
 #define GNOME_CMD_USER_ACTION(f)   void f(GtkMenuItem *menuitem=NULL, gpointer user_data=NULL)
@@ -195,6 +196,8 @@ class GnomeCmdUserActions
     const gchar *name(const std::string description)                        {  return action_func[action_name[description]].c_str();  }
     const gchar *description(const_iterator &i)                             {  return action_name[i->second.func].c_str();            }
     const gchar *options(const_iterator &i)                                 {  return i->second.user_data.c_str();                    }
+
+    friend XML::xstream &operator << (XML::xstream &xml, GnomeCmdUserActions &usr);
 };
 
 
diff --git a/src/main.cc b/src/main.cc
index d8be336..3552e41 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -151,8 +151,8 @@ int main (int argc, char *argv[])
 #endif
     plugin_manager_shutdown ();
     gcmd_tags_shutdown ();
-    gnome_cmd_data.save();
     gcmd_user_actions.shutdown();
+    gnome_cmd_data.save();
     gnome_vfs_shutdown ();
     IMAGE_free ();
 



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