moved modifier detection to FbTk KeyUtil

This commit is contained in:
fluxgen 2003-09-06 13:58:06 +00:00
parent e67aa125ff
commit 85316137ba
2 changed files with 35 additions and 81 deletions

View file

@ -19,14 +19,16 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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 "Keys.hh"
#include "StringUtil.hh" #include "FbTk/StringUtil.hh"
#include "App.hh" #include "FbTk/App.hh"
#include "Command.hh" #include "FbTk/Command.hh"
#include "FbTk/KeyUtil.hh"
#include "CommandParser.hh" #include "CommandParser.hh"
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
@ -71,10 +73,6 @@
using namespace std; 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): Keys::Keys(const char *filename):
m_display(FbTk::App::instance()->display()), m_display(FbTk::App::instance()->display()),
m_modmap(0) { m_modmap(0) {
@ -86,9 +84,9 @@ Keys::Keys(const char *filename):
} }
Keys::~Keys() { Keys::~Keys() {
if (m_modmap) { if (m_modmap)
XFreeModifiermap(m_modmap); XFreeModifiermap(m_modmap);
}
ungrabKeys(); ungrabKeys();
deleteTree(); deleteTree();
} }
@ -223,11 +221,23 @@ bool Keys::load(const char *filename) {
return true; 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 Grabs a key with the modifier
and with numlock,capslock and scrollock and with numlock,capslock and scrollock
*/ */
void Keys::grabKey(unsigned int key, unsigned int mod) { 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++) { for (int screen=0; screen<ScreenCount(m_display); screen++) {
@ -240,35 +250,35 @@ void Keys::grabKey(unsigned int key, unsigned int mod) {
// Grab with numlock, capslock and scrlock // Grab with numlock, capslock and scrlock
//numlock //numlock
XGrabKey(m_display, key, mod|s_numlock_mod, XGrabKey(m_display, key, mod|nummod,
root, True, root, True,
GrabModeAsync, GrabModeAsync); GrabModeAsync, GrabModeAsync);
//scrolllock //scrolllock
XGrabKey(m_display, key, mod|s_scrolllock_mod, XGrabKey(m_display, key, mod|scrollmod,
root, True, root, True,
GrabModeAsync, GrabModeAsync); GrabModeAsync, GrabModeAsync);
//capslock //capslock
XGrabKey(m_display, key, mod|s_capslock_mod, XGrabKey(m_display, key, mod|capsmod,
root, True, root, True,
GrabModeAsync, GrabModeAsync); GrabModeAsync, GrabModeAsync);
//capslock+numlock //capslock+numlock
XGrabKey(m_display, key, mod|s_capslock_mod|s_numlock_mod, XGrabKey(m_display, key, mod|capsmod|nummod,
root, True, root, True,
GrabModeAsync, GrabModeAsync); GrabModeAsync, GrabModeAsync);
//capslock+scrolllock //capslock+scrolllock
XGrabKey(m_display, key, mod|s_capslock_mod|s_scrolllock_mod, XGrabKey(m_display, key, mod|capsmod|scrollmod,
root, True, root, True,
GrabModeAsync, GrabModeAsync); GrabModeAsync, GrabModeAsync);
//capslock+numlock+scrolllock //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, root, True,
GrabModeAsync, GrabModeAsync); GrabModeAsync, GrabModeAsync);
//numlock+scrollLock //numlock+scrollLock
XGrabKey(m_display, key, mod|s_numlock_mod|s_scrolllock_mod, XGrabKey(m_display, key, mod|nummod|scrollmod,
root, True, root, True,
GrabModeAsync, GrabModeAsync); GrabModeAsync, GrabModeAsync);
@ -325,7 +335,7 @@ unsigned int Keys::getKey(const char *keystr) {
void Keys::doAction(XKeyEvent &ke) { void Keys::doAction(XKeyEvent &ke) {
static t_key *next_key = 0; static t_key *next_key = 0;
// Remove numlock, capslock and scrolllock // Remove numlock, capslock and scrolllock
ke.state = cleanMods(ke.state); ke.state = FbTk::KeyUtil::cleanMods(ke.state);
if (!next_key) { 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) { unsigned int Keys::keycodeToModmask(unsigned int keycode) {
if (!m_modmap) return 0; if (!m_modmap) return 0;

View file

@ -19,7 +19,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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 #ifndef KEYS_HH
#define KEYS_HH #define KEYS_HH
@ -46,17 +46,9 @@ public:
/// destructor /// destructor
~Keys(); ~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); unsigned int keycodeToModmask(unsigned int keycode);
void loadModmap();
void loadModmap();
/** /**
Load configuration from file Load configuration from file
@return true on success, else false @return true on success, else false
@ -132,13 +124,11 @@ private:
*/ */
bool mergeTree(t_key *newtree, t_key *basetree=0); 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::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 Display *m_display; ///< display connection
XModifierKeymap *m_modmap; ///< Modifier->keycode mapping XModifierKeymap *m_modmap;
}; };
#endif // KEYS_HH #endif // KEYS_HH