determine lock masks
This commit is contained in:
parent
353c08f1c0
commit
598ff7125d
2 changed files with 59 additions and 11 deletions
60
src/Keys.cc
60
src/Keys.cc
|
@ -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.cc,v 1.19 2002/08/28 20:25:15 fluxgen Exp $
|
//$Id: Keys.cc,v 1.20 2002/11/13 14:34:24 fluxgen Exp $
|
||||||
|
|
||||||
|
|
||||||
#include "Keys.hh"
|
#include "Keys.hh"
|
||||||
|
@ -126,9 +126,13 @@ Keys::t_actionstr Keys::m_actionlist[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
Keys::Keys(Display *display, const char *filename):
|
Keys::Keys(Display *display, const char *filename):
|
||||||
|
m_capslock_mod(0),
|
||||||
|
m_numlock_mod(0),
|
||||||
|
m_scrolllock_mod(0),
|
||||||
m_abortkey(0),
|
m_abortkey(0),
|
||||||
m_display(display)
|
m_display(display)
|
||||||
{
|
{
|
||||||
|
determineModmap();
|
||||||
assert(display);
|
assert(display);
|
||||||
if (filename != 0)
|
if (filename != 0)
|
||||||
load(filename);
|
load(filename);
|
||||||
|
@ -363,35 +367,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|Mod2Mask,
|
XGrabKey(m_display, key, mod|m_numlock_mod,
|
||||||
root, True,
|
root, True,
|
||||||
GrabModeAsync, GrabModeAsync);
|
GrabModeAsync, GrabModeAsync);
|
||||||
//scrolllock
|
//scrolllock
|
||||||
XGrabKey(m_display, key, mod|Mod5Mask,
|
XGrabKey(m_display, key, mod|m_scrolllock_mod,
|
||||||
root, True,
|
root, True,
|
||||||
GrabModeAsync, GrabModeAsync);
|
GrabModeAsync, GrabModeAsync);
|
||||||
//capslock
|
//capslock
|
||||||
XGrabKey(m_display, key, mod|LockMask,
|
XGrabKey(m_display, key, mod|m_capslock_mod,
|
||||||
root, True,
|
root, True,
|
||||||
GrabModeAsync, GrabModeAsync);
|
GrabModeAsync, GrabModeAsync);
|
||||||
|
|
||||||
//capslock+numlock
|
//capslock+numlock
|
||||||
XGrabKey(m_display, key, mod|LockMask|Mod2Mask,
|
XGrabKey(m_display, key, mod|m_capslock_mod|m_numlock_mod,
|
||||||
root, True,
|
root, True,
|
||||||
GrabModeAsync, GrabModeAsync);
|
GrabModeAsync, GrabModeAsync);
|
||||||
|
|
||||||
//capslock+scrolllock
|
//capslock+scrolllock
|
||||||
XGrabKey(m_display, key, mod|LockMask|Mod5Mask,
|
XGrabKey(m_display, key, mod|m_capslock_mod|m_scrolllock_mod,
|
||||||
root, True,
|
root, True,
|
||||||
GrabModeAsync, GrabModeAsync);
|
GrabModeAsync, GrabModeAsync);
|
||||||
|
|
||||||
//capslock+numlock+scrolllock
|
//capslock+numlock+scrolllock
|
||||||
XGrabKey(m_display, key, mod|Mod2Mask|Mod5Mask|LockMask,
|
XGrabKey(m_display, key, mod|m_capslock_mod|m_scrolllock_mod|m_numlock_mod,
|
||||||
root, True,
|
root, True,
|
||||||
GrabModeAsync, GrabModeAsync);
|
GrabModeAsync, GrabModeAsync);
|
||||||
|
|
||||||
//numlock+scrollLock
|
//numlock+scrollLock
|
||||||
XGrabKey(m_display, key, mod|Mod2Mask|Mod5Mask,
|
XGrabKey(m_display, key, mod|m_numlock_mod|m_scrolllock_mod,
|
||||||
root, True,
|
root, True,
|
||||||
GrabModeAsync, GrabModeAsync);
|
GrabModeAsync, GrabModeAsync);
|
||||||
|
|
||||||
|
@ -628,3 +632,43 @@ Keys::t_key::~t_key() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Keys::determineModmap() {
|
||||||
|
// mask to use for modifier
|
||||||
|
int mods[] = {
|
||||||
|
ShiftMask,
|
||||||
|
LockMask,
|
||||||
|
ControlMask,
|
||||||
|
Mod1Mask,
|
||||||
|
Mod2Mask,
|
||||||
|
Mod3Mask,
|
||||||
|
Mod4Mask,
|
||||||
|
Mod5Mask,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
XModifierKeymap *map = XGetModifierMapping(m_display);
|
||||||
|
// find modifiers and set them
|
||||||
|
for (int i=0, realkey=0; i<8; ++i) {
|
||||||
|
for (int key=0; key<map->max_keypermod; ++key, ++realkey) {
|
||||||
|
|
||||||
|
if (map->modifiermap[realkey] == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
KeySym ks = XKeycodeToKeysym(m_display, map->modifiermap[realkey], 0);
|
||||||
|
|
||||||
|
switch (ks) {
|
||||||
|
case XK_Caps_Lock:
|
||||||
|
m_capslock_mod = mods[i];
|
||||||
|
break;
|
||||||
|
case XK_Scroll_Lock:
|
||||||
|
m_scrolllock_mod = mods[i];
|
||||||
|
break;
|
||||||
|
case XK_Num_Lock:
|
||||||
|
m_numlock_mod = mods[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
XFreeModifiermap(map);
|
||||||
|
}
|
||||||
|
|
10
src/Keys.hh
10
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.15 2002/08/04 15:55:13 fluxgen Exp $
|
// $Id: Keys.hh,v 1.16 2002/11/13 14:35:01 fluxgen Exp $
|
||||||
|
|
||||||
#ifndef KEYS_HH
|
#ifndef KEYS_HH
|
||||||
#define KEYS_HH
|
#define KEYS_HH
|
||||||
|
@ -165,12 +165,16 @@ private:
|
||||||
/// debug function
|
/// debug function
|
||||||
void showKeyTree(t_key *key, unsigned int w=0);
|
void showKeyTree(t_key *key, unsigned int w=0);
|
||||||
#endif //DEBUG
|
#endif //DEBUG
|
||||||
|
/// determine key modifier maps for caps-, num- and scrolllock
|
||||||
|
void determineModmap();
|
||||||
|
|
||||||
struct t_actionstr{
|
struct t_actionstr{
|
||||||
const char *string;
|
const char *string;
|
||||||
KeyAction action;
|
KeyAction action;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int m_capslock_mod, m_numlock_mod, m_scrolllock_mod; ///< modifiers
|
||||||
|
|
||||||
static t_actionstr m_actionlist[];
|
static t_actionstr m_actionlist[];
|
||||||
|
|
||||||
std::vector<t_key *> m_keylist;
|
std::vector<t_key *> m_keylist;
|
||||||
|
|
Loading…
Reference in a new issue