diff options
Diffstat (limited to 'xkb/xkbEvents.c')
-rw-r--r-- | xkb/xkbEvents.c | 75 |
1 files changed, 48 insertions, 27 deletions
diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c index 5a0f1d54b..291674fcf 100644 --- a/xkb/xkbEvents.c +++ b/xkb/xkbEvents.c @@ -24,6 +24,7 @@ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ +/* $XFree86: xc/programs/Xserver/xkb/xkbEvents.c,v 3.10 2001/10/28 03:34:20 tsi Exp $ */ #include <stdio.h> #define NEED_EVENTS 1 @@ -35,8 +36,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "windowstr.h" #include "XKBsrv.h" -extern int (*InitialVector[3])(); - /***====================================================================***/ void @@ -51,7 +50,6 @@ XkbSendNewKeyboardNotify(kbd,pNKN) register int i; Time time; CARD16 changed; -XkbChangesRec changes; pNKN->type = XkbEventCode + XkbEventBase; pNKN->xkbType = XkbNewKeyboardNotify; @@ -181,7 +179,7 @@ XkbSendMapNotify(kbd,pMN) { int i; XkbSrvInfoPtr xkbi; -unsigned time,initialized; +unsigned time = 0,initialized; CARD16 changed; xkbi = kbd->key->xkbInfo; @@ -260,6 +258,10 @@ CARD32 changedControls; changedControls|= XkbMouseKeysAccelMask; if (old->ax_options!=new->ax_options) changedControls|= XkbAccessXKeysMask; + if ((old->ax_options^new->ax_options) & XkbAX_SKOptionsMask) + changedControls|= XkbStickyKeysMask; + if ((old->ax_options^new->ax_options) & XkbAX_FBOptionsMask) + changedControls|= XkbAccessXFeedbackMask; if ((old->ax_timeout!=new->ax_timeout)|| (old->axt_ctrls_mask!=new->axt_ctrls_mask)|| (old->axt_ctrls_values!=new->axt_ctrls_values)|| @@ -308,10 +310,10 @@ XkbSendControlsNotify(kbd,pCN) #endif { int initialized; -CARD32 changedControls,enabledControls,enabledChanges; +CARD32 changedControls, enabledControls, enabledChanges = 0; XkbSrvInfoPtr xkbi; XkbInterestPtr interest; -Time time; +Time time = 0; interest = kbd->xkb_interest; if (!interest) @@ -367,7 +369,7 @@ XkbSendIndicatorNotify(kbd,xkbType,pEv) { int initialized; XkbInterestPtr interest; -Time time; +Time time = 0; CARD32 state,changed; interest = kbd->xkb_interest; @@ -441,8 +443,8 @@ XkbSrvInfoPtr xkbi; XkbInterestPtr interest; CARD8 id; CARD16 pitch,duration; -Time time; -XID winID; +Time time = 0; +XID winID = 0; xkbi = kbd->key->xkbInfo; @@ -519,7 +521,7 @@ XkbSendAccessXNotify(kbd,pEv) { int initialized; XkbInterestPtr interest; -Time time; +Time time = 0; CARD16 sk_delay,db_delay; interest = kbd->xkb_interest; @@ -570,7 +572,7 @@ XkbSendNamesNotify(kbd,pEv) { int initialized; XkbInterestPtr interest; -Time time; +Time time = 0; CARD16 changed,changedVirtualMods; CARD32 changedIndicators; @@ -625,8 +627,8 @@ XkbSendCompatMapNotify(kbd,pEv) { int initialized; XkbInterestPtr interest; -Time time; -CARD16 firstSI,nSI,nTotalSI; +Time time = 0; +CARD16 firstSI = 0, nSI = 0, nTotalSI = 0; interest = kbd->xkb_interest; if (!interest) @@ -680,7 +682,7 @@ XkbSendActionMessage(kbd,pEv) int initialized; XkbSrvInfoPtr xkbi; XkbInterestPtr interest; -Time time; +Time time = 0; xkbi = kbd->key->xkbInfo; interest = kbd->xkb_interest; @@ -731,9 +733,9 @@ XkbSendExtensionDeviceNotify(dev,client,pEv) { int initialized; XkbInterestPtr interest; -Time time; -CARD32 defined,state; -CARD16 reason,supported; +Time time = 0; +CARD32 defined, state; +CARD16 reason, supported = 0; interest = dev->xkb_interest; if (!interest) @@ -894,7 +896,7 @@ XkbFilterEvents(pClient,nEvents,xE) xEvent *xE; #endif { -int i; +int i, button_mask; DeviceIntPtr pXDev = (DeviceIntPtr)LookupKeyboardDevice(); XkbSrvInfoPtr xkbi; @@ -920,7 +922,7 @@ XkbSrvInfoPtr xkbi; (_XkbIsReleaseEvent(xE[0].u.u.type)) ) { return False; } - if ((pXDev->grab != NullGrab) && + if ((pXDev->grab != NullGrab) && pXDev->fromPassiveGrab && ((xE[0].u.u.type==KeyPress)||(xE[0].u.u.type==KeyRelease))) { register unsigned state,flags; @@ -945,6 +947,19 @@ XkbSrvInfoPtr xkbi; state= xkbi->state.compat_lookup_mods; xE[0].u.keyButtonPointer.state= state; } + button_mask = 1 << xE[0].u.u.detail; + if (xE[0].u.u.type == ButtonPress && + ((xE[0].u.keyButtonPointer.state >> 7) & button_mask) == button_mask && + (xkbi->lockedPtrButtons & button_mask) == button_mask) { +#ifdef DEBUG + /* If the MouseKeys is pressed, and the "real" mouse is also pressed + * when the mouse is released, the server does not behave properly. + * Faking a release of the button here solves the problem. + */ + ErrorF("Faking release of button %d\n", xE[0].u.u.detail); +#endif + XkbDDXFakePointerButton(ButtonRelease, xE[0].u.u.detail); + } } else { register CARD8 type; @@ -979,6 +994,15 @@ XkbSrvInfoPtr xkbi; xE->u.enterLeave.state&= 0x1F00; xE->u.enterLeave.state|= xkbi->state.compat_grab_mods; } + button_mask = 1 << xE[i].u.u.detail; + if (type == ButtonPress && + ((xE[i].u.keyButtonPointer.state >> 7) & button_mask) == button_mask && + (xkbi->lockedPtrButtons & button_mask) == button_mask) { +#ifdef DEBUG + ErrorF("Faking release of button %d\n", xE[i].u.u.detail); +#endif + XkbDDXFakePointerButton(ButtonRelease, xE[i].u.u.detail); + } } } return True; @@ -1074,7 +1098,7 @@ Bool found; dev->xkb_interest = interest->next; autoCtrls= interest->autoCtrls; autoValues= interest->autoCtrlValues; - xfree(interest); + _XkbFree(interest); found= True; } while ((!found)&&(interest->next)) { @@ -1083,7 +1107,7 @@ Bool found; interest->next = victim->next; autoCtrls= victim->autoCtrls; autoValues= victim->autoCtrlValues; - xfree(victim); + _XkbFree(victim); found= True; } interest = interest->next; @@ -1113,7 +1137,7 @@ DeviceIntPtr dev = (DeviceIntPtr)inDev; XkbInterestPtr interest; Bool found; unsigned long autoCtrls,autoValues; -ClientPtr client; +ClientPtr client = NULL; found= False; autoCtrls= autoValues= 0; @@ -1124,7 +1148,7 @@ ClientPtr client; autoCtrls= interest->autoCtrls; autoValues= interest->autoCtrlValues; client= interest->client; - xfree(interest); + _XkbFree(interest); found= True; } while ((!found)&&(interest->next)) { @@ -1134,7 +1158,7 @@ ClientPtr client; autoCtrls= victim->autoCtrls; autoValues= victim->autoCtrlValues; client= victim->client; - xfree(victim); + _XkbFree(victim); found= True; } interest = interest->next; @@ -1149,6 +1173,3 @@ ClientPtr client; } return found; } - - - |