moved modifier detection to FbTk KeyUtil
This commit is contained in:
parent
e67aa125ff
commit
85316137ba
2 changed files with 35 additions and 81 deletions
92
src/Keys.cc
92
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,11 +221,23 @@ 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++) {
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
|
20
src/Keys.hh
20
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
|
||||
XModifierKeymap *m_modmap;
|
||||
|
||||
};
|
||||
|
||||
#endif // KEYS_HH
|
||||
|
|
Loading…
Reference in a new issue