xkb: make XkbSetControls work on all core-sending devices

This commit is contained in:
Daniel Stone 2006-10-06 17:20:42 +03:00 committed by Daniel Stone
parent 7b4dc171b0
commit 3686cd0fbf

144
xkb/xkb.c
View File

@ -677,7 +677,7 @@ ProcXkbGetControls(ClientPtr client)
int int
ProcXkbSetControls(ClientPtr client) ProcXkbSetControls(ClientPtr client)
{ {
DeviceIntPtr dev; DeviceIntPtr dev, tmpd;
XkbSrvInfoPtr xkbi; XkbSrvInfoPtr xkbi;
XkbControlsPtr ctrl; XkbControlsPtr ctrl;
XkbControlsRec new,old; XkbControlsRec new,old;
@ -694,75 +694,108 @@ ProcXkbSetControls(ClientPtr client)
CHK_KBD_DEVICE(dev, stuff->deviceSpec); CHK_KBD_DEVICE(dev, stuff->deviceSpec);
CHK_MASK_LEGAL(0x01, stuff->changeCtrls, XkbAllControlsMask); CHK_MASK_LEGAL(0x01, stuff->changeCtrls, XkbAllControlsMask);
xkbi = dev->key->xkbInfo; for (tmpd = inputInfo.keyboard; tmpd; tmpd = tmpd->next) {
if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
tmpd == inputInfo.keyboard) {
xkbi = tmpd->key->xkbInfo;
ctrl = xkbi->desc->ctrls; ctrl = xkbi->desc->ctrls;
new = *ctrl; new = *ctrl;
XkbSetCauseXkbReq(&cause, X_kbSetControls, client); XkbSetCauseXkbReq(&cause, X_kbSetControls, client);
if (stuff->changeCtrls & XkbInternalModsMask) { if (stuff->changeCtrls & XkbInternalModsMask) {
CHK_MASK_MATCH(0x02,stuff->affectInternalMods,stuff->internalMods); CHK_MASK_MATCH(0x02, stuff->affectInternalMods,
CHK_MASK_MATCH(0x03,stuff->affectInternalVMods,stuff->internalVMods); stuff->internalMods);
new.internal.real_mods&=~stuff->affectInternalMods; CHK_MASK_MATCH(0x03, stuff->affectInternalVMods,
new.internal.real_mods|=(stuff->affectInternalMods&stuff->internalMods); stuff->internalVMods);
new.internal.vmods&=~stuff->affectInternalVMods;
new.internal.vmods|= (stuff->affectInternalVMods&stuff->internalVMods); new.internal.real_mods &= ~(stuff->affectInternalMods);
new.internal.real_mods |= (stuff->affectInternalMods &
stuff->internalMods);
new.internal.vmods &= ~(stuff->affectInternalVMods);
new.internal.vmods |= (stuff->affectInternalVMods &
stuff->internalVMods);
new.internal.mask = new.internal.real_mods | new.internal.mask = new.internal.real_mods |
XkbMaskForVMask(xkbi->desc,new.internal.vmods); XkbMaskForVMask(xkbi->desc,
new.internal.vmods);
} }
if (stuff->changeCtrls & XkbIgnoreLockModsMask) { if (stuff->changeCtrls & XkbIgnoreLockModsMask) {
CHK_MASK_MATCH(0x4,stuff->affectIgnoreLockMods,stuff->ignoreLockMods); CHK_MASK_MATCH(0x4, stuff->affectIgnoreLockMods,
CHK_MASK_MATCH(0x5,stuff->affectIgnoreLockVMods,stuff->ignoreLockVMods); stuff->ignoreLockMods);
new.ignore_lock.real_mods&=~stuff->affectIgnoreLockMods; CHK_MASK_MATCH(0x5, stuff->affectIgnoreLockVMods,
new.ignore_lock.real_mods|= stuff->ignoreLockVMods);
(stuff->affectIgnoreLockMods&stuff->ignoreLockMods);
new.ignore_lock.vmods&= ~stuff->affectIgnoreLockVMods; new.ignore_lock.real_mods &= ~(stuff->affectIgnoreLockMods);
new.ignore_lock.vmods|= new.ignore_lock.real_mods |= (stuff->affectIgnoreLockMods &
(stuff->affectIgnoreLockVMods&stuff->ignoreLockVMods); stuff->ignoreLockMods);
new.ignore_lock.vmods &= ~(stuff->affectIgnoreLockVMods);
new.ignore_lock.vmods |= (stuff->affectIgnoreLockVMods &
stuff->ignoreLockVMods);
new.ignore_lock.mask = new.ignore_lock.real_mods | new.ignore_lock.mask = new.ignore_lock.real_mods |
XkbMaskForVMask(xkbi->desc,new.ignore_lock.vmods); XkbMaskForVMask(xkbi->desc,
new.ignore_lock.vmods);
} }
CHK_MASK_MATCH(0x06,stuff->affectEnabledCtrls,stuff->enabledCtrls);
CHK_MASK_MATCH(0x06, stuff->affectEnabledCtrls,
stuff->enabledCtrls);
if (stuff->affectEnabledCtrls) { if (stuff->affectEnabledCtrls) {
CHK_MASK_LEGAL(0x07,stuff->affectEnabledCtrls,XkbAllBooleanCtrlsMask); CHK_MASK_LEGAL(0x07, stuff->affectEnabledCtrls,
new.enabled_ctrls&= ~stuff->affectEnabledCtrls; XkbAllBooleanCtrlsMask);
new.enabled_ctrls|= (stuff->affectEnabledCtrls&stuff->enabledCtrls);
new.enabled_ctrls &= ~(stuff->affectEnabledCtrls);
new.enabled_ctrls |= (stuff->affectEnabledCtrls &
stuff->enabledCtrls);
} }
if (stuff->changeCtrls & XkbRepeatKeysMask) { if (stuff->changeCtrls & XkbRepeatKeysMask) {
if ((stuff->repeatDelay<1)||(stuff->repeatInterval<1)) { if (stuff->repeatDelay < 1 || stuff->repeatInterval < 1) {
client->errorValue = _XkbErrCode3(0x08, stuff->repeatDelay, client->errorValue = _XkbErrCode3(0x08, stuff->repeatDelay,
stuff->repeatInterval); stuff->repeatInterval);
return BadValue; return BadValue;
} }
new.repeat_delay = stuff->repeatDelay; new.repeat_delay = stuff->repeatDelay;
new.repeat_interval = stuff->repeatInterval; new.repeat_interval = stuff->repeatInterval;
} }
if (stuff->changeCtrls & XkbSlowKeysMask) { if (stuff->changeCtrls & XkbSlowKeysMask) {
if (stuff->slowKeysDelay < 1) { if (stuff->slowKeysDelay < 1) {
client->errorValue = _XkbErrCode2(0x09,stuff->slowKeysDelay); client->errorValue = _XkbErrCode2(0x09,
stuff->slowKeysDelay);
return BadValue; return BadValue;
} }
new.slow_keys_delay = stuff->slowKeysDelay; new.slow_keys_delay = stuff->slowKeysDelay;
} }
if (stuff->changeCtrls & XkbBounceKeysMask) { if (stuff->changeCtrls & XkbBounceKeysMask) {
if (stuff->debounceDelay < 1) { if (stuff->debounceDelay < 1) {
client->errorValue = _XkbErrCode2(0x0A,stuff->debounceDelay); client->errorValue = _XkbErrCode2(0x0A,
stuff->debounceDelay);
return BadValue; return BadValue;
} }
new.debounce_delay = stuff->debounceDelay; new.debounce_delay = stuff->debounceDelay;
} }
if (stuff->changeCtrls & XkbMouseKeysMask) { if (stuff->changeCtrls & XkbMouseKeysMask) {
if (stuff->mkDfltBtn > XkbMaxMouseKeysBtn) { if (stuff->mkDfltBtn > XkbMaxMouseKeysBtn) {
client->errorValue = _XkbErrCode2(0x0B, stuff->mkDfltBtn); client->errorValue = _XkbErrCode2(0x0B, stuff->mkDfltBtn);
return BadValue; return BadValue;
} }
new.mk_dflt_btn = stuff->mkDfltBtn; new.mk_dflt_btn = stuff->mkDfltBtn;
} }
if (stuff->changeCtrls & XkbMouseKeysAccelMask) { if (stuff->changeCtrls & XkbMouseKeysAccelMask) {
if ((stuff->mkDelay<1) || (stuff->mkInterval<1) || if (stuff->mkDelay < 1 || stuff->mkInterval < 1 ||
(stuff->mkTimeToMax<1) || (stuff->mkMaxSpeed<1)|| stuff->mkTimeToMax < 1 || stuff->mkMaxSpeed < 1 ||
(stuff->mkCurve<-1000)) { stuff->mkCurve < -1000) {
client->errorValue = _XkbErrCode2(0x0C,0); client->errorValue = _XkbErrCode2(0x0C,0);
return BadValue; return BadValue;
} }
new.mk_delay = stuff->mkDelay; new.mk_delay = stuff->mkDelay;
new.mk_interval = stuff->mkInterval; new.mk_interval = stuff->mkInterval;
new.mk_time_to_max = stuff->mkTimeToMax; new.mk_time_to_max = stuff->mkTimeToMax;
@ -770,14 +803,17 @@ ProcXkbSetControls(ClientPtr client)
new.mk_curve = stuff->mkCurve; new.mk_curve = stuff->mkCurve;
AccessXComputeCurveFactor(xkbi, &new); AccessXComputeCurveFactor(xkbi, &new);
} }
if (stuff->changeCtrls & XkbGroupsWrapMask) { if (stuff->changeCtrls & XkbGroupsWrapMask) {
unsigned act, num; unsigned act, num;
act = XkbOutOfRangeGroupAction(stuff->groupsWrap); act = XkbOutOfRangeGroupAction(stuff->groupsWrap);
switch (act) { switch (act) {
case XkbRedirectIntoRange: case XkbRedirectIntoRange:
num = XkbOutOfRangeGroupNumber(stuff->groupsWrap); num = XkbOutOfRangeGroupNumber(stuff->groupsWrap);
if (num >= new.num_groups) { if (num >= new.num_groups) {
client->errorValue= _XkbErrCode3(0x0D,new.num_groups,num); client->errorValue = _XkbErrCode3(0x0D, new.num_groups,
num);
return BadValue; return BadValue;
} }
case XkbWrapIntoRange: case XkbWrapIntoRange:
@ -787,19 +823,23 @@ ProcXkbSetControls(ClientPtr client)
client->errorValue = _XkbErrCode2(0x0E, act); client->errorValue = _XkbErrCode2(0x0E, act);
return BadValue; return BadValue;
} }
new.groups_wrap= stuff->groupsWrap; new.groups_wrap= stuff->groupsWrap;
} }
CHK_MASK_LEGAL(0x0F, stuff->axOptions, XkbAX_AllOptionsMask); CHK_MASK_LEGAL(0x0F, stuff->axOptions, XkbAX_AllOptionsMask);
if (stuff->changeCtrls&XkbAccessXKeysMask) if (stuff->changeCtrls & XkbAccessXKeysMask) {
new.ax_options = stuff->axOptions & XkbAX_AllOptionsMask; new.ax_options = stuff->axOptions & XkbAX_AllOptionsMask;
}
else { else {
if (stuff->changeCtrls & XkbStickyKeysMask) { if (stuff->changeCtrls & XkbStickyKeysMask) {
new.ax_options&= ~XkbAX_SKOptionsMask; new.ax_options &= ~(XkbAX_SKOptionsMask);
new.ax_options|= stuff->axOptions&XkbAX_SKOptionsMask; new.ax_options |= (stuff->axOptions & XkbAX_SKOptionsMask);
} }
if (stuff->changeCtrls & XkbAccessXFeedbackMask) { if (stuff->changeCtrls & XkbAccessXFeedbackMask) {
new.ax_options&= ~XkbAX_FBOptionsMask; new.ax_options &= ~(XkbAX_FBOptionsMask);
new.ax_options|= stuff->axOptions&XkbAX_FBOptionsMask; new.ax_options |= (stuff->axOptions & XkbAX_FBOptionsMask);
} }
} }
@ -808,39 +848,47 @@ ProcXkbSetControls(ClientPtr client)
client->errorValue = _XkbErrCode2(0x10, stuff->axTimeout); client->errorValue = _XkbErrCode2(0x10, stuff->axTimeout);
return BadValue; return BadValue;
} }
CHK_MASK_MATCH(0x11,stuff->axtCtrlsMask,stuff->axtCtrlsValues); CHK_MASK_MATCH(0x11, stuff->axtCtrlsMask,
CHK_MASK_LEGAL(0x12,stuff->axtCtrlsMask,XkbAllBooleanCtrlsMask); stuff->axtCtrlsValues);
CHK_MASK_LEGAL(0x12, stuff->axtCtrlsMask,
XkbAllBooleanCtrlsMask);
CHK_MASK_MATCH(0x13, stuff->axtOptsMask, stuff->axtOptsValues); CHK_MASK_MATCH(0x13, stuff->axtOptsMask, stuff->axtOptsValues);
CHK_MASK_LEGAL(0x14, stuff->axtOptsMask, XkbAX_AllOptionsMask); CHK_MASK_LEGAL(0x14, stuff->axtOptsMask, XkbAX_AllOptionsMask);
new.ax_timeout = stuff->axTimeout; new.ax_timeout = stuff->axTimeout;
new.axt_ctrls_mask = stuff->axtCtrlsMask; new.axt_ctrls_mask = stuff->axtCtrlsMask;
new.axt_ctrls_values = (stuff->axtCtrlsValues&stuff->axtCtrlsMask); new.axt_ctrls_values = (stuff->axtCtrlsValues &
stuff->axtCtrlsMask);
new.axt_opts_mask = stuff->axtOptsMask; new.axt_opts_mask = stuff->axtOptsMask;
new.axt_opts_values= (stuff->axtOptsValues&stuff->axtOptsMask); new.axt_opts_values = (stuff->axtOptsValues &
} stuff->axtOptsMask);
if (stuff->changeCtrls&XkbPerKeyRepeatMask) {
memcpy(new.per_key_repeat,stuff->perKeyRepeat,XkbPerKeyBitArraySize);
} }
if (stuff->changeCtrls & XkbPerKeyRepeatMask)
memcpy(new.per_key_repeat, stuff->perKeyRepeat,
XkbPerKeyBitArraySize);
old= *ctrl; old= *ctrl;
*ctrl= new; *ctrl= new;
XkbDDXChangeControls(dev,&old,ctrl); XkbDDXChangeControls(tmpd, &old, ctrl);
if (XkbComputeControlsNotify(dev,&old,ctrl,&cn,False)) { if (XkbComputeControlsNotify(tmpd, &old, ctrl, &cn, False)) {
cn.keycode = 0; cn.keycode = 0;
cn.eventType = 0; cn.eventType = 0;
cn.requestMajor = XkbReqCode; cn.requestMajor = XkbReqCode;
cn.requestMinor = X_kbSetControls; cn.requestMinor = X_kbSetControls;
XkbSendControlsNotify(dev,&cn); XkbSendControlsNotify(tmpd, &cn);
} }
if ((sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0))!=NULL) sli = XkbFindSrvLedInfo(tmpd, XkbDfltXIClass, XkbDfltXIId, 0);
XkbUpdateIndicators(dev,sli->usesControls,True,NULL,&cause); if (sli)
XkbUpdateIndicators(tmpd, sli->usesControls, True, NULL,
&cause);
/* If sticky keys were disabled, clear all locks and latches */ /* If sticky keys were disabled, clear all locks and latches */
if ((old.enabled_ctrls & XkbStickyKeysMask) && if ((old.enabled_ctrls & XkbStickyKeysMask) &&
(!(ctrl->enabled_ctrls&XkbStickyKeysMask))) { !(ctrl->enabled_ctrls & XkbStickyKeysMask))
XkbClearAllLatchesAndLocks(dev,xkbi,True,&cause); XkbClearAllLatchesAndLocks(tmpd, xkbi, True, &cause);
}
} }
return client->noClientException; return client->noClientException;