CT: handle Control-Tab at run time, not only at start time. This should

silence a few bug reports from Emacs users

svn path=/trunk/kdebase/kwin/; revision=75146
This commit is contained in:
Cristian Tibirna 2000-12-17 21:57:52 +00:00
parent e3c32ea0d4
commit 37ef0caae2
2 changed files with 1089 additions and 1041 deletions

View file

@ -264,10 +264,7 @@ Workspace::Workspace( bool restore )
grabKey(XK_Tab, Mod1Mask | ShiftMask);
// Do this unless the user disabled it...
if (options->useControlTab) {
grabKey(XK_Tab, ControlMask);
grabKey(XK_Tab, ControlMask | ShiftMask);
}
grabControlTab(options->useControlTab);
createKeybindings();
tab_box = new TabBox( this );
@ -707,7 +704,7 @@ bool Workspace::keyPress(XKeyEvent key)
}
}
if (!tab_grab){
if (!tab_grab && options->useControlTab){
if( (kc == XK_Tab) &&
@ -777,7 +774,7 @@ bool Workspace::keyRelease(XKeyEvent key)
}
XFreeModifiermap(xmk);
}
if (control_grab){
if (control_grab && options->useControlTab){
XModifierKeymap* xmk = XGetModifierMapping(qt_xdisplay());
for (i=0; i<xmk->max_keypermod; i++)
if (xmk->modifiermap[xmk->max_keypermod * ControlMapIndex + i]
@ -916,6 +913,38 @@ void Workspace::grabKey(KeySym keysym, unsigned int mod){
}
/*
Ungrabs the keysymbol \a keysym with the given modifiers \a mod
plus all possibile combinations of Lock and NumLock
*/
void Workspace::ungrabKey(KeySym keysym, unsigned int mod){
static int NumLockMask = 0;
if (!keysym||!XKeysymToKeycode(qt_xdisplay(), keysym)) return;
if (!NumLockMask){
XModifierKeymap* xmk = XGetModifierMapping(qt_xdisplay());
int i;
for (i=0; i<8; i++){
if (xmk->modifiermap[xmk->max_keypermod * i] ==
XKeysymToKeycode(qt_xdisplay(), XK_Num_Lock))
NumLockMask = (1<<i);
}
XFreeModifiermap(xmk);
}
XUngrabKey(qt_xdisplay(),
XKeysymToKeycode(qt_xdisplay(), keysym), mod,
qt_xrootwin());
XUngrabKey(qt_xdisplay(),
XKeysymToKeycode(qt_xdisplay(), keysym), mod | LockMask,
qt_xrootwin());
XUngrabKey(qt_xdisplay(),
XKeysymToKeycode(qt_xdisplay(), keysym), mod | NumLockMask,
qt_xrootwin());
XUngrabKey(qt_xdisplay(),
XKeysymToKeycode(qt_xdisplay(), keysym), mod | LockMask | NumLockMask,
qt_xrootwin());
}
/*!
Informs the workspace about the active client, i.e. the client that
has the focus (or None if no client has the focus). This functions
@ -1555,6 +1584,22 @@ void Workspace::reconfigure()
KGlobal::config()->reparseConfiguration();
options->reload();
keys->readSettings();
grabControlTab(options->useControlTab);
}
/*!
Grab/Ungrab the Control key dynamically
*/
void Workspace::grabControlTab(bool grab)
{
if (grab) {
grabKey(XK_Tab, ControlMask);
grabKey(XK_Tab, ControlMask | ShiftMask);
}
else {
ungrabKey(XK_Tab,ControlMask);
ungrabKey(XK_Tab, ControlMask | ShiftMask);
}
}

View file

@ -140,6 +140,9 @@ public:
QWidget* desktopWidget();
void grabKey(KeySym keysym, unsigned int mod);
void ungrabKey(KeySym keysym, unsigned int mod);
void grabControlTab(bool grab);
Client* nextClient(Client*) const;
Client* previousClient(Client*) const;