From 85316137bacf8a5c8a3ee4b48e7b7253615ba60c Mon Sep 17 00:00:00 2001 From: fluxgen <fluxgen> Date: Sat, 6 Sep 2003 13:58:06 +0000 Subject: moved modifier detection to FbTk KeyUtil --- src/Keys.cc | 94 +++++++++++++++++++------------------------------------------ src/Keys.hh | 22 ++++----------- 2 files changed, 35 insertions(+), 81 deletions(-) diff --git a/src/Keys.cc b/src/Keys.cc index 196c5e0..1667f43 100644 --- a/src/Keys.cc +++ b/src/Keys.cc @@ -19,14 +19,16 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -//$Id: Keys.cc,v 1.36 2003/08/19 16:19:28 fluxgen Exp $ +//$Id: Keys.cc,v 1.37 2003/09/06 13:58:06 fluxgen Exp $ #include "Keys.hh" -#include "StringUtil.hh" -#include "App.hh" -#include "Command.hh" +#include "FbTk/StringUtil.hh" +#include "FbTk/App.hh" +#include "FbTk/Command.hh" +#include "FbTk/KeyUtil.hh" + #include "CommandParser.hh" #ifdef HAVE_CONFIG_H @@ -71,10 +73,6 @@ using namespace std; -int Keys::s_capslock_mod = 0; -int Keys::s_numlock_mod = 0; -int Keys::s_scrolllock_mod = 0; - Keys::Keys(const char *filename): m_display(FbTk::App::instance()->display()), m_modmap(0) { @@ -86,9 +84,9 @@ Keys::Keys(const char *filename): } Keys::~Keys() { - if (m_modmap) { + if (m_modmap) XFreeModifiermap(m_modmap); - } + ungrabKeys(); deleteTree(); } @@ -223,12 +221,24 @@ bool Keys::load(const char *filename) { return true; } +void Keys::loadModmap() { + if (m_modmap) + XFreeModifiermap(m_modmap); + + m_modmap = XGetModifierMapping(m_display); + // force reinit of modifiers + FbTk::KeyUtil::init(); +} + /** Grabs a key with the modifier and with numlock,capslock and scrollock */ void Keys::grabKey(unsigned int key, unsigned int mod) { - + const int capsmod = FbTk::KeyUtil::capslockMod(); + const int nummod = FbTk::KeyUtil::numlockMod(); + const int scrollmod = FbTk::KeyUtil::scrolllockMod(); + for (int screen=0; screen<ScreenCount(m_display); screen++) { Window root = RootWindow(m_display, screen); @@ -240,35 +250,35 @@ void Keys::grabKey(unsigned int key, unsigned int mod) { // Grab with numlock, capslock and scrlock //numlock - XGrabKey(m_display, key, mod|s_numlock_mod, + XGrabKey(m_display, key, mod|nummod, root, True, GrabModeAsync, GrabModeAsync); //scrolllock - XGrabKey(m_display, key, mod|s_scrolllock_mod, + XGrabKey(m_display, key, mod|scrollmod, root, True, GrabModeAsync, GrabModeAsync); //capslock - XGrabKey(m_display, key, mod|s_capslock_mod, + XGrabKey(m_display, key, mod|capsmod, root, True, GrabModeAsync, GrabModeAsync); //capslock+numlock - XGrabKey(m_display, key, mod|s_capslock_mod|s_numlock_mod, + XGrabKey(m_display, key, mod|capsmod|nummod, root, True, GrabModeAsync, GrabModeAsync); //capslock+scrolllock - XGrabKey(m_display, key, mod|s_capslock_mod|s_scrolllock_mod, + XGrabKey(m_display, key, mod|capsmod|scrollmod, root, True, GrabModeAsync, GrabModeAsync); //capslock+numlock+scrolllock - XGrabKey(m_display, key, mod|s_capslock_mod|s_scrolllock_mod|s_numlock_mod, + XGrabKey(m_display, key, mod|capsmod|scrollmod|nummod, root, True, GrabModeAsync, GrabModeAsync); //numlock+scrollLock - XGrabKey(m_display, key, mod|s_numlock_mod|s_scrolllock_mod, + XGrabKey(m_display, key, mod|nummod|scrollmod, root, True, GrabModeAsync, GrabModeAsync); @@ -325,7 +335,7 @@ unsigned int Keys::getKey(const char *keystr) { void Keys::doAction(XKeyEvent &ke) { static t_key *next_key = 0; // Remove numlock, capslock and scrolllock - ke.state = cleanMods(ke.state); + ke.state = FbTk::KeyUtil::cleanMods(ke.state); if (!next_key) { @@ -444,52 +454,6 @@ Keys::t_key::~t_key() { } -/** - * load state relating to the modifier map - */ -void Keys::loadModmap() { - if (m_modmap) { - XFreeModifiermap(m_modmap); - } - m_modmap = XGetModifierMapping(m_display); - - // mask to use for modifier - int mods[] = { - ShiftMask, - LockMask, - ControlMask, - Mod1Mask, - Mod2Mask, - Mod3Mask, - Mod4Mask, - Mod5Mask, - 0 - }; - - // find modifiers and set them - for (int i=0, realkey=0; i<8; ++i) { - for (int key=0; key<m_modmap->max_keypermod; ++key, ++realkey) { - - if (m_modmap->modifiermap[realkey] == 0) - continue; - - KeySym ks = XKeycodeToKeysym(m_display, m_modmap->modifiermap[realkey], 0); - - switch (ks) { - case XK_Caps_Lock: - s_capslock_mod = mods[i]; - break; - case XK_Scroll_Lock: - s_scrolllock_mod = mods[i]; - break; - case XK_Num_Lock: - s_numlock_mod = mods[i]; - break; - } - } - } -} - unsigned int Keys::keycodeToModmask(unsigned int keycode) { if (!m_modmap) return 0; diff --git a/src/Keys.hh b/src/Keys.hh index efd6331..f3a89bd 100644 --- a/src/Keys.hh +++ b/src/Keys.hh @@ -19,7 +19,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Keys.hh,v 1.27 2003/08/19 16:18:54 fluxgen Exp $ +// $Id: Keys.hh,v 1.28 2003/09/06 13:58:06 fluxgen Exp $ #ifndef KEYS_HH #define KEYS_HH @@ -46,17 +46,9 @@ public: /// destructor ~Keys(); - /** - Strip out modifiers we want to ignore - @return the cleaned state number - */ - static unsigned int cleanMods(unsigned int mods) - //remove numlock, capslock and scrolllock - { return mods & (~s_capslock_mod & ~s_numlock_mod & ~s_scrolllock_mod); } - unsigned int keycodeToModmask(unsigned int keycode); - void loadModmap(); + void loadModmap(); /** Load configuration from file @return true on success, else false @@ -132,13 +124,11 @@ private: */ bool mergeTree(t_key *newtree, t_key *basetree=0); - static int s_capslock_mod, s_numlock_mod, s_scrolllock_mod; ///< modifiers - std::vector<t_key *> m_keylist; - std::string m_execcmdstring; ///< copy of the execcommandstring - int m_param; ///< copy of the param argument - Display *m_display; ///< display connection - XModifierKeymap *m_modmap; ///< Modifier->keycode mapping + + Display *m_display; ///< display connection + XModifierKeymap *m_modmap; + }; #endif // KEYS_HH -- cgit v0.11.2