From c797d028eea09c4922ae0a73e09c805c3f041ff4 Mon Sep 17 00:00:00 2001
From: Ingo Ruhnke <grumbel@gmx.de>
Date: Thu, 27 Jan 2011 17:51:21 +0100
Subject: [PATCH] Turned x11keysym_names into a singleton

---
 TODO                 | 7 ++-----
 src/evdev_helper.cpp | 9 +++++++--
 src/evdev_helper.hpp | 8 ++++----
 src/xboxdrv.cpp      | 4 ++--
 4 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/TODO b/TODO
index 366adc4..2f98da5 100644
--- a/TODO
+++ b/TODO
@@ -46,15 +46,12 @@ List Output
 ===========
 
 * update docu on force feedback for multi controller
-
-* turn EnumBox into singleton
-
-* Keysym2Keycode is currently always constructed at startup, even when
-  not used, construct it on demand to avoid X11 server connection
 
 Stuff to do before 0.7.1 release:
 =================================
 
+* turn EnumBox into singleton
+
 * allow --modifier help, --ui-buttonmap X2^help
 
 * cleanup device_id, don't manually do (slot<<16) | devid (only an
diff --git a/src/evdev_helper.cpp b/src/evdev_helper.cpp
index 6c3e704..1685ac5 100644
--- a/src/evdev_helper.cpp
+++ b/src/evdev_helper.cpp
@@ -25,7 +25,12 @@
 EvDevRelEnum evdev_rel_names;
 EvDevKeyEnum evdev_key_names;
 EvDevAbsEnum evdev_abs_names;
-X11KeysymEnum x11keysym_names;
+
+const X11KeysymEnum& get_x11keysym_names()
+{
+  static X11KeysymEnum x11keysym_names;
+  return x11keysym_names;
+}
 
 EvDevRelEnum::EvDevRelEnum() :
   EnumBox<int>("EV_REL")
@@ -103,7 +108,7 @@ X11KeysymEnum::process_keymap(Display* dpy)
 
 int xkeysym2keycode(const std::string& name)
 {
-  return x11keysym_names[name];
+  return get_x11keysym_names()[name];
 }
 
 void str2event(const std::string& name, int& type, int& code)
diff --git a/src/evdev_helper.hpp b/src/evdev_helper.hpp
index fde4795..d3979b2 100644
--- a/src/evdev_helper.hpp
+++ b/src/evdev_helper.hpp
@@ -66,10 +66,10 @@ private:
   void process_keymap(Display* dpy);
 };
 
-extern EvDevRelEnum evdev_rel_names;
-extern EvDevKeyEnum evdev_key_names;
-extern EvDevAbsEnum evdev_abs_names;
-extern X11KeysymEnum x11keysym_names;
+extern EvDevRelEnum  evdev_rel_names;
+extern EvDevKeyEnum  evdev_key_names;
+extern EvDevAbsEnum  evdev_abs_names;
+const X11KeysymEnum& get_x11keysym_names();
 
 #endif
 
diff --git a/src/xboxdrv.cpp b/src/xboxdrv.cpp
index 2fe85f5..2e9669a 100644
--- a/src/xboxdrv.cpp
+++ b/src/xboxdrv.cpp
@@ -675,8 +675,8 @@ Xboxdrv::run_list_enums(uint32_t enums)
   if (enums & Options::LIST_X11KEYSYM)
   {
     std::vector<std::string> lst;  
-    for(X11KeysymEnum::const_iterator i = x11keysym_names.begin();
-        i != x11keysym_names.end(); ++i)
+    for(X11KeysymEnum::const_iterator i = get_x11keysym_names().begin();
+        i != get_x11keysym_names().end(); ++i)
     {
       lst.push_back(i->second);
     }