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
|
// 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;
|
||||||
|
|
||||||
|
|
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
|
// 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
|
||||||
|
|
Loading…
Reference in a new issue