Lines Matching +full:misc +full:- +full:latch
28 #include <dix-config.h>
36 #include "misc.h"
59 if (xkbPrivPtr->unwrapProc) in xkbUnwrapProc()
60 xkbPrivPtr->unwrapProc = NULL; in xkbUnwrapProc()
90 (!(xkb->ctrls->enabled_ctrls & XkbMouseKeysMask))) { in _FixUpAction()
94 if (xkb->ctrls->enabled_ctrls & XkbStickyKeysMask) { in _FixUpAction()
95 if (act->any.type == XkbSA_SetMods) { in _FixUpAction()
97 fake.mods.mask = act->mods.mask; in _FixUpAction()
98 if (XkbAX_NeedOption(xkb->ctrls, XkbAX_LatchToLockMask)) in _FixUpAction()
104 if (act->any.type == XkbSA_SetGroup) { in _FixUpAction()
106 if (XkbAX_NeedOption(xkb->ctrls, XkbAX_LatchToLockMask)) in _FixUpAction()
110 XkbSASetGroup(&fake.group, XkbSAGroup(&act->group)); in _FixUpAction()
127 xkb = xkbi->desc; in XkbGetKeyAction()
140 if (type->map != NULL) { in XkbGetKeyAction()
144 mods = xkbState->mods & type->mods.mask; in XkbGetKeyAction()
145 for (entry = type->map, i = 0; i < type->map_count; i++, entry++) { in XkbGetKeyAction()
146 if ((entry->active) && (entry->mods.mask == mods)) { in XkbGetKeyAction()
147 col += entry->level; in XkbGetKeyAction()
163 if ((dev->button) && (dev->button->xkb_acts)) { in XkbGetButtonAction()
164 if (dev->button->xkb_acts[button - 1].any.type != XkbSA_NoAction) { in XkbGetButtonAction()
165 fake = _FixUpAction(kbd->key->xkbInfo->desc, in XkbGetButtonAction()
166 &dev->button->xkb_acts[button - 1]); in XkbGetButtonAction()
183 if (filter->keycode == 0) { /* initial press */ in _XkbFilterSetState()
185 filter->keycode = keycode; in _XkbFilterSetState()
186 filter->active = 1; in _XkbFilterSetState()
187 filter->filterOthers = ((pAction->mods.mask & XkbSA_ClearLocks) != 0); in _XkbFilterSetState()
188 filter->priv = 0; in _XkbFilterSetState()
189 filter->filter = _XkbFilterSetState; in _XkbFilterSetState()
190 if (pAction->type == XkbSA_SetMods) { in _XkbFilterSetState()
191 filter->upAction = *pAction; in _XkbFilterSetState()
192 xkbi->setMods = pAction->mods.mask; in _XkbFilterSetState()
195 xkbi->groupChange = XkbSAGroup(&pAction->group); in _XkbFilterSetState()
196 if (pAction->group.flags & XkbSA_GroupAbsolute) in _XkbFilterSetState()
197 xkbi->groupChange -= xkbi->state.base_group; in _XkbFilterSetState()
198 filter->upAction = *pAction; in _XkbFilterSetState()
199 XkbSASetGroup(&filter->upAction.group, xkbi->groupChange); in _XkbFilterSetState()
202 else if (filter->keycode == keycode) { in _XkbFilterSetState()
203 if (filter->upAction.type == XkbSA_SetMods) { in _XkbFilterSetState()
204 xkbi->clearMods = filter->upAction.mods.mask; in _XkbFilterSetState()
205 if (filter->upAction.mods.flags & XkbSA_ClearLocks) { in _XkbFilterSetState()
206 xkbi->state.locked_mods &= ~filter->upAction.mods.mask; in _XkbFilterSetState()
210 if (filter->upAction.group.flags & XkbSA_ClearLocks) { in _XkbFilterSetState()
211 xkbi->state.locked_group = 0; in _XkbFilterSetState()
213 xkbi->groupChange = -XkbSAGroup(&filter->upAction.group); in _XkbFilterSetState()
215 filter->active = 0; in _XkbFilterSetState()
218 filter->upAction.mods.flags &= ~XkbSA_ClearLocks; in _XkbFilterSetState()
219 filter->filterOthers = 0; in _XkbFilterSetState()
232 if (filter->keycode == 0) { /* initial press */ in _XkbFilterLatchState()
234 filter->keycode = keycode; in _XkbFilterLatchState()
235 filter->active = 1; in _XkbFilterLatchState()
236 filter->filterOthers = 1; in _XkbFilterLatchState()
237 filter->priv = LATCH_KEY_DOWN; in _XkbFilterLatchState()
238 filter->filter = _XkbFilterLatchState; in _XkbFilterLatchState()
239 if (pAction->type == XkbSA_LatchMods) { in _XkbFilterLatchState()
240 filter->upAction = *pAction; in _XkbFilterLatchState()
241 xkbi->setMods = pAction->mods.mask; in _XkbFilterLatchState()
244 xkbi->groupChange = XkbSAGroup(&pAction->group); in _XkbFilterLatchState()
245 if (pAction->group.flags & XkbSA_GroupAbsolute) in _XkbFilterLatchState()
246 xkbi->groupChange -= xkbi->state.base_group; in _XkbFilterLatchState()
247 filter->upAction = *pAction; in _XkbFilterLatchState()
248 XkbSASetGroup(&filter->upAction.group, xkbi->groupChange); in _XkbFilterLatchState()
251 else if (pAction && (filter->priv == LATCH_PENDING)) { in _XkbFilterLatchState()
252 if (((1 << pAction->type) & XkbSA_BreakLatch) != 0) { in _XkbFilterLatchState()
253 filter->active = 0; in _XkbFilterLatchState()
254 /* If one latch is broken, all latches are broken, so it's no use in _XkbFilterLatchState()
255 to find out which particular latch this filter tracks. */ in _XkbFilterLatchState()
256 xkbi->state.latched_mods = 0; in _XkbFilterLatchState()
257 xkbi->state.latched_group = 0; in _XkbFilterLatchState()
260 else if (filter->keycode == keycode && filter->priv != LATCH_PENDING){ in _XkbFilterLatchState()
262 key after it has been released first time and the latch became in _XkbFilterLatchState()
264 XkbControlsPtr ctrls = xkbi->desc->ctrls; in _XkbFilterLatchState()
265 int needBeep = ((ctrls->enabled_ctrls & XkbStickyKeysMask) && in _XkbFilterLatchState()
268 if (filter->upAction.type == XkbSA_LatchMods) { in _XkbFilterLatchState()
269 unsigned char mask = filter->upAction.mods.mask; in _XkbFilterLatchState()
272 xkbi->clearMods = mask; in _XkbFilterLatchState()
275 common = mask & xkbi->state.locked_mods; in _XkbFilterLatchState()
276 if ((filter->upAction.mods.flags & XkbSA_ClearLocks) && common) { in _XkbFilterLatchState()
278 xkbi->state.locked_mods &= ~common; in _XkbFilterLatchState()
280 XkbDDXAccessXBeep(xkbi->device, _BEEP_STICKY_UNLOCK, in _XkbFilterLatchState()
284 common = mask & xkbi->state.latched_mods; in _XkbFilterLatchState()
285 if ((filter->upAction.mods.flags & XkbSA_LatchToLock) && common) { in _XkbFilterLatchState()
289 newlocked = common & ~xkbi->state.locked_mods; in _XkbFilterLatchState()
291 xkbi->state.locked_mods |= newlocked; in _XkbFilterLatchState()
293 XkbDDXAccessXBeep(xkbi->device, _BEEP_STICKY_LOCK, in _XkbFilterLatchState()
297 xkbi->state.latched_mods &= ~common; in _XkbFilterLatchState()
299 /* Latch remaining modifiers, if any. */ in _XkbFilterLatchState()
301 xkbi->state.latched_mods |= mask; in _XkbFilterLatchState()
302 filter->priv = LATCH_PENDING; in _XkbFilterLatchState()
304 XkbDDXAccessXBeep(xkbi->device, _BEEP_STICKY_LATCH, in _XkbFilterLatchState()
309 xkbi->groupChange = -XkbSAGroup(&filter->upAction.group); in _XkbFilterLatchState()
311 if ((filter->upAction.group.flags & XkbSA_ClearLocks) && in _XkbFilterLatchState()
312 (xkbi->state.locked_group)) { in _XkbFilterLatchState()
313 xkbi->state.locked_group = 0; in _XkbFilterLatchState()
315 XkbDDXAccessXBeep(xkbi->device, _BEEP_STICKY_UNLOCK, in _XkbFilterLatchState()
319 else if ((filter->upAction.group.flags & XkbSA_LatchToLock) in _XkbFilterLatchState()
320 && (xkbi->state.latched_group)) { in _XkbFilterLatchState()
321 xkbi->state.locked_group += XkbSAGroup(&filter->upAction.group); in _XkbFilterLatchState()
322 xkbi->state.latched_group -= XkbSAGroup(&filter->upAction.group); in _XkbFilterLatchState()
323 if(XkbSAGroup(&filter->upAction.group) && needBeep) in _XkbFilterLatchState()
324 XkbDDXAccessXBeep(xkbi->device, _BEEP_STICKY_LOCK, in _XkbFilterLatchState()
327 /* Latch group */ in _XkbFilterLatchState()
328 else if(XkbSAGroup(&filter->upAction.group)){ in _XkbFilterLatchState()
329 xkbi->state.latched_group += XkbSAGroup(&filter->upAction.group); in _XkbFilterLatchState()
330 filter->priv = LATCH_PENDING; in _XkbFilterLatchState()
332 XkbDDXAccessXBeep(xkbi->device, _BEEP_STICKY_LATCH, in _XkbFilterLatchState()
337 if (filter->priv != LATCH_PENDING) in _XkbFilterLatchState()
338 filter->active = 0; in _XkbFilterLatchState()
340 else if (pAction && (filter->priv == LATCH_KEY_DOWN)) { in _XkbFilterLatchState()
341 /* Latch was broken before it became pending: degrade to a in _XkbFilterLatchState()
343 if (filter->upAction.type == XkbSA_LatchMods) in _XkbFilterLatchState()
344 filter->upAction.type = XkbSA_SetMods; in _XkbFilterLatchState()
346 filter->upAction.type = XkbSA_SetGroup; in _XkbFilterLatchState()
347 filter->filter = _XkbFilterSetState; in _XkbFilterLatchState()
348 filter->priv = 0; in _XkbFilterLatchState()
349 return filter->filter(xkbi, filter, keycode, pAction); in _XkbFilterLatchState()
358 if (filter->keycode == 0) /* initial press */ in _XkbFilterLockState()
361 if (pAction && (pAction->type == XkbSA_LockGroup)) { in _XkbFilterLockState()
362 if (pAction->group.flags & XkbSA_GroupAbsolute) in _XkbFilterLockState()
363 xkbi->state.locked_group = XkbSAGroup(&pAction->group); in _XkbFilterLockState()
365 xkbi->state.locked_group += XkbSAGroup(&pAction->group); in _XkbFilterLockState()
368 if (filter->keycode == 0) { /* initial press */ in _XkbFilterLockState()
369 filter->keycode = keycode; in _XkbFilterLockState()
370 filter->active = 1; in _XkbFilterLockState()
371 filter->filterOthers = 0; in _XkbFilterLockState()
372 filter->priv = xkbi->state.locked_mods & pAction->mods.mask; in _XkbFilterLockState()
373 filter->filter = _XkbFilterLockState; in _XkbFilterLockState()
374 filter->upAction = *pAction; in _XkbFilterLockState()
375 if (!(filter->upAction.mods.flags & XkbSA_LockNoLock)) in _XkbFilterLockState()
376 xkbi->state.locked_mods |= pAction->mods.mask; in _XkbFilterLockState()
377 xkbi->setMods = pAction->mods.mask; in _XkbFilterLockState()
379 else if (filter->keycode == keycode) { in _XkbFilterLockState()
380 filter->active = 0; in _XkbFilterLockState()
381 xkbi->clearMods = filter->upAction.mods.mask; in _XkbFilterLockState()
382 if (!(filter->upAction.mods.flags & XkbSA_LockNoUnlock)) in _XkbFilterLockState()
383 xkbi->state.locked_mods &= ~filter->priv; in _XkbFilterLockState()
396 if (filter->keycode == 0) { /* initial press */ in _XkbFilterISOLock()
397 CARD8 flags = pAction->iso.flags; in _XkbFilterISOLock()
399 filter->keycode = keycode; in _XkbFilterISOLock()
400 filter->active = 1; in _XkbFilterISOLock()
401 filter->filterOthers = 1; in _XkbFilterISOLock()
402 filter->priv = ISO_KEY_DOWN; in _XkbFilterISOLock()
403 filter->upAction = *pAction; in _XkbFilterISOLock()
404 filter->filter = _XkbFilterISOLock; in _XkbFilterISOLock()
406 xkbi->groupChange = XkbSAGroup(&pAction->iso); in _XkbFilterISOLock()
407 xkbi->setMods = 0; in _XkbFilterISOLock()
410 xkbi->setMods = pAction->iso.mask; in _XkbFilterISOLock()
411 xkbi->groupChange = 0; in _XkbFilterISOLock()
413 if ((!(flags & XkbSA_ISONoAffectMods)) && (xkbi->state.base_mods)) { in _XkbFilterISOLock()
414 filter->priv = NO_ISO_LOCK; in _XkbFilterISOLock()
415 xkbi->state.locked_mods ^= xkbi->state.base_mods; in _XkbFilterISOLock()
417 if ((!(flags & XkbSA_ISONoAffectGroup)) && (xkbi->state.base_group)) { in _XkbFilterISOLock()
418 /* 6/22/93 (ef) -- lock groups if group key is down first */ in _XkbFilterISOLock()
421 /* 6/22/93 (ef) -- lock mouse buttons if they're down */ in _XkbFilterISOLock()
424 else if (filter->keycode == keycode) { in _XkbFilterISOLock()
425 CARD8 flags = filter->upAction.iso.flags; in _XkbFilterISOLock()
428 xkbi->groupChange = -XkbSAGroup(&filter->upAction.iso); in _XkbFilterISOLock()
429 xkbi->clearMods = 0; in _XkbFilterISOLock()
430 if (filter->priv == ISO_KEY_DOWN) in _XkbFilterISOLock()
431 xkbi->state.locked_group += XkbSAGroup(&filter->upAction.iso); in _XkbFilterISOLock()
434 xkbi->clearMods = filter->upAction.iso.mask; in _XkbFilterISOLock()
435 xkbi->groupChange = 0; in _XkbFilterISOLock()
436 if (filter->priv == ISO_KEY_DOWN) in _XkbFilterISOLock()
437 xkbi->state.locked_mods ^= filter->upAction.iso.mask; in _XkbFilterISOLock()
439 filter->active = 0; in _XkbFilterISOLock()
442 CARD8 flags = filter->upAction.iso.flags; in _XkbFilterISOLock()
444 switch (pAction->type) { in _XkbFilterISOLock()
448 pAction->type = XkbSA_LockMods; in _XkbFilterISOLock()
449 filter->priv = NO_ISO_LOCK; in _XkbFilterISOLock()
455 pAction->type = XkbSA_LockGroup; in _XkbFilterISOLock()
456 filter->priv = NO_ISO_LOCK; in _XkbFilterISOLock()
461 pAction->type = XkbSA_LockPtrBtn; in _XkbFilterISOLock()
462 filter->priv = NO_ISO_LOCK; in _XkbFilterISOLock()
467 pAction->type = XkbSA_LockControls; in _XkbFilterISOLock()
468 filter->priv = NO_ISO_LOCK; in _XkbFilterISOLock()
480 XkbControlsPtr ctrls = xkbi->desc->ctrls; in _XkbPtrAccelExpire()
483 if (xkbi->mouseKey == 0) in _XkbPtrAccelExpire()
486 if (xkbi->mouseKeysAccel) { in _XkbPtrAccelExpire()
487 if ((xkbi->mouseKeysCounter) < ctrls->mk_time_to_max) { in _XkbPtrAccelExpire()
490 xkbi->mouseKeysCounter++; in _XkbPtrAccelExpire()
491 step = xkbi->mouseKeysCurveFactor * in _XkbPtrAccelExpire()
492 pow((double) xkbi->mouseKeysCounter, xkbi->mouseKeysCurve); in _XkbPtrAccelExpire()
493 if (xkbi->mouseKeysDX < 0) in _XkbPtrAccelExpire()
494 dx = floor(((double) xkbi->mouseKeysDX) * step); in _XkbPtrAccelExpire()
496 dx = ceil(((double) xkbi->mouseKeysDX) * step); in _XkbPtrAccelExpire()
497 if (xkbi->mouseKeysDY < 0) in _XkbPtrAccelExpire()
498 dy = floor(((double) xkbi->mouseKeysDY) * step); in _XkbPtrAccelExpire()
500 dy = ceil(((double) xkbi->mouseKeysDY) * step); in _XkbPtrAccelExpire()
503 dx = xkbi->mouseKeysDX * ctrls->mk_max_speed; in _XkbPtrAccelExpire()
504 dy = xkbi->mouseKeysDY * ctrls->mk_max_speed; in _XkbPtrAccelExpire()
506 if (xkbi->mouseKeysFlags & XkbSA_MoveAbsoluteX) in _XkbPtrAccelExpire()
507 dx = xkbi->mouseKeysDX; in _XkbPtrAccelExpire()
508 if (xkbi->mouseKeysFlags & XkbSA_MoveAbsoluteY) in _XkbPtrAccelExpire()
509 dy = xkbi->mouseKeysDY; in _XkbPtrAccelExpire()
512 dx = xkbi->mouseKeysDX; in _XkbPtrAccelExpire()
513 dy = xkbi->mouseKeysDY; in _XkbPtrAccelExpire()
515 XkbFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags, dx, dy); in _XkbPtrAccelExpire()
516 return xkbi->desc->ctrls->mk_interval; in _XkbPtrAccelExpire()
526 if (filter->keycode == 0) { /* initial press */ in _XkbFilterPointerMove()
527 filter->keycode = keycode; in _XkbFilterPointerMove()
528 filter->active = 1; in _XkbFilterPointerMove()
529 filter->filterOthers = 0; in _XkbFilterPointerMove()
530 filter->priv = 0; in _XkbFilterPointerMove()
531 filter->filter = _XkbFilterPointerMove; in _XkbFilterPointerMove()
532 filter->upAction = *pAction; in _XkbFilterPointerMove()
533 xkbi->mouseKeysCounter = 0; in _XkbFilterPointerMove()
534 xkbi->mouseKey = keycode; in _XkbFilterPointerMove()
535 accel = ((pAction->ptr.flags & XkbSA_NoAcceleration) == 0); in _XkbFilterPointerMove()
536 x = XkbPtrActionX(&pAction->ptr); in _XkbFilterPointerMove()
537 y = XkbPtrActionY(&pAction->ptr); in _XkbFilterPointerMove()
538 XkbFakePointerMotion(xkbi->device, pAction->ptr.flags, x, y); in _XkbFilterPointerMove()
540 xkbi->mouseKeysAccel = accel && in _XkbFilterPointerMove()
541 (xkbi->desc->ctrls->enabled_ctrls & XkbMouseKeysAccelMask); in _XkbFilterPointerMove()
542 xkbi->mouseKeysFlags = pAction->ptr.flags; in _XkbFilterPointerMove()
543 xkbi->mouseKeysDX = XkbPtrActionX(&pAction->ptr); in _XkbFilterPointerMove()
544 xkbi->mouseKeysDY = XkbPtrActionY(&pAction->ptr); in _XkbFilterPointerMove()
545 xkbi->mouseKeyTimer = TimerSet(xkbi->mouseKeyTimer, 0, in _XkbFilterPointerMove()
546 xkbi->desc->ctrls->mk_delay, in _XkbFilterPointerMove()
549 else if (filter->keycode == keycode) { in _XkbFilterPointerMove()
550 filter->active = 0; in _XkbFilterPointerMove()
551 if (xkbi->mouseKey == keycode) { in _XkbFilterPointerMove()
552 xkbi->mouseKey = 0; in _XkbFilterPointerMove()
553 xkbi->mouseKeyTimer = TimerSet(xkbi->mouseKeyTimer, 0, 0, in _XkbFilterPointerMove()
564 if (filter->keycode == 0) { /* initial press */ in _XkbFilterPointerBtn()
565 int button = pAction->btn.button; in _XkbFilterPointerBtn()
568 button = xkbi->desc->ctrls->mk_dflt_btn; in _XkbFilterPointerBtn()
570 filter->keycode = keycode; in _XkbFilterPointerBtn()
571 filter->active = 1; in _XkbFilterPointerBtn()
572 filter->filterOthers = 0; in _XkbFilterPointerBtn()
573 filter->priv = 0; in _XkbFilterPointerBtn()
574 filter->filter = _XkbFilterPointerBtn; in _XkbFilterPointerBtn()
575 filter->upAction = *pAction; in _XkbFilterPointerBtn()
576 filter->upAction.btn.button = button; in _XkbFilterPointerBtn()
577 switch (pAction->type) { in _XkbFilterPointerBtn()
579 if (((xkbi->lockedPtrButtons & (1 << button)) == 0) && in _XkbFilterPointerBtn()
580 ((pAction->btn.flags & XkbSA_LockNoLock) == 0)) { in _XkbFilterPointerBtn()
581 xkbi->lockedPtrButtons |= (1 << button); in _XkbFilterPointerBtn()
583 XkbFakeDeviceButton(xkbi->device, 1, button); in _XkbFilterPointerBtn()
584 filter->upAction.type = XkbSA_NoAction; in _XkbFilterPointerBtn()
592 if (pAction->btn.count > 0) { in _XkbFilterPointerBtn()
593 nClicks = pAction->btn.count; in _XkbFilterPointerBtn()
595 XkbFakeDeviceButton(xkbi->device, 1, button); in _XkbFilterPointerBtn()
596 XkbFakeDeviceButton(xkbi->device, 0, button); in _XkbFilterPointerBtn()
598 filter->upAction.type = XkbSA_NoAction; in _XkbFilterPointerBtn()
601 XkbFakeDeviceButton(xkbi->device, 1, button); in _XkbFilterPointerBtn()
606 XkbControlsPtr ctrls = xkbi->desc->ctrls; in _XkbFilterPointerBtn()
612 switch (pAction->dflt.affect) { in _XkbFilterPointerBtn()
614 if (pAction->dflt.flags & XkbSA_DfltBtnAbsolute) in _XkbFilterPointerBtn()
615 ctrls->mk_dflt_btn = XkbSAPtrDfltValue(&pAction->dflt); in _XkbFilterPointerBtn()
617 ctrls->mk_dflt_btn += XkbSAPtrDfltValue(&pAction->dflt); in _XkbFilterPointerBtn()
618 if (ctrls->mk_dflt_btn > 5) in _XkbFilterPointerBtn()
619 ctrls->mk_dflt_btn = 5; in _XkbFilterPointerBtn()
620 else if (ctrls->mk_dflt_btn < 1) in _XkbFilterPointerBtn()
621 ctrls->mk_dflt_btn = 1; in _XkbFilterPointerBtn()
627 pAction->dflt.affect); in _XkbFilterPointerBtn()
630 if (XkbComputeControlsNotify(xkbi->device, in _XkbFilterPointerBtn()
631 &old, xkbi->desc->ctrls, &cn, FALSE)) { in _XkbFilterPointerBtn()
637 XkbSendControlsNotify(xkbi->device, &cn); in _XkbFilterPointerBtn()
644 else if (filter->keycode == keycode) { in _XkbFilterPointerBtn()
645 int button = filter->upAction.btn.button; in _XkbFilterPointerBtn()
647 switch (filter->upAction.type) { in _XkbFilterPointerBtn()
649 if (((filter->upAction.btn.flags & XkbSA_LockNoUnlock) != 0) || in _XkbFilterPointerBtn()
650 ((xkbi->lockedPtrButtons & (1 << button)) == 0)) { in _XkbFilterPointerBtn()
653 xkbi->lockedPtrButtons &= ~(1 << button); in _XkbFilterPointerBtn()
655 if (IsMaster(xkbi->device)) { in _XkbFilterPointerBtn()
656 XkbMergeLockedPtrBtns(xkbi->device); in _XkbFilterPointerBtn()
658 if ((xkbi->lockedPtrButtons & (1 << button)) != 0) in _XkbFilterPointerBtn()
664 XkbFakeDeviceButton(xkbi->device, 0, button); in _XkbFilterPointerBtn()
667 filter->active = 0; in _XkbFilterPointerBtn()
683 kbd = xkbi->device; in _XkbFilterControls()
684 ctrls = xkbi->desc->ctrls; in _XkbFilterControls()
686 if (filter->keycode == 0) { /* initial press */ in _XkbFilterControls()
688 filter->keycode = keycode; in _XkbFilterControls()
689 filter->active = 1; in _XkbFilterControls()
690 filter->filterOthers = 0; in _XkbFilterControls()
691 change = XkbActionCtrls(&pAction->ctrls); in _XkbFilterControls()
692 filter->priv = change; in _XkbFilterControls()
693 filter->filter = _XkbFilterControls; in _XkbFilterControls()
694 filter->upAction = *pAction; in _XkbFilterControls()
696 if (pAction->type == XkbSA_LockControls) { in _XkbFilterControls()
697 filter->priv = (ctrls->enabled_ctrls & change); in _XkbFilterControls()
698 change &= ~ctrls->enabled_ctrls; in _XkbFilterControls()
705 ctrls->enabled_ctrls |= change; in _XkbFilterControls()
719 (!(ctrls->enabled_ctrls & XkbStickyKeysMask))) { in _XkbFilterControls()
723 XkbUpdateIndicators(kbd, sli->usesControls, TRUE, NULL, &cause); in _XkbFilterControls()
728 else if (filter->keycode == keycode) { in _XkbFilterControls()
729 change = filter->priv; in _XkbFilterControls()
734 ctrls->enabled_ctrls &= ~change; in _XkbFilterControls()
746 (!(ctrls->enabled_ctrls & XkbStickyKeysMask))) { in _XkbFilterControls()
750 XkbUpdateIndicators(kbd, sli->usesControls, TRUE, NULL, &cause); in _XkbFilterControls()
754 filter->keycode = 0; in _XkbFilterControls()
755 filter->active = 0; in _XkbFilterControls()
768 if ((filter->keycode != 0) && (filter->keycode != keycode)) in _XkbFilterActionMessage()
773 if ((filter->keycode == keycode) && pAction && in _XkbFilterActionMessage()
774 (pAction->type != XkbSA_ActionMessage)) in _XkbFilterActionMessage()
777 kbd = xkbi->device; in _XkbFilterActionMessage()
778 if (filter->keycode == 0) { /* initial press */ in _XkbFilterActionMessage()
779 pMsg = &pAction->msg; in _XkbFilterActionMessage()
780 if ((pMsg->flags & XkbSA_MessageOnRelease) || in _XkbFilterActionMessage()
781 ((pMsg->flags & XkbSA_MessageGenKeyEvent) == 0)) { in _XkbFilterActionMessage()
782 filter->keycode = keycode; in _XkbFilterActionMessage()
783 filter->active = 1; in _XkbFilterActionMessage()
784 filter->filterOthers = 0; in _XkbFilterActionMessage()
785 filter->priv = 0; in _XkbFilterActionMessage()
786 filter->filter = _XkbFilterActionMessage; in _XkbFilterActionMessage()
787 filter->upAction = *pAction; in _XkbFilterActionMessage()
789 if (pMsg->flags & XkbSA_MessageOnPress) { in _XkbFilterActionMessage()
795 ((pMsg->flags & XkbSA_MessageGenKeyEvent) != 0); in _XkbFilterActionMessage()
796 memcpy((char *) msg.message, (char *) pMsg->message, in _XkbFilterActionMessage()
800 return ((pAction->msg.flags & XkbSA_MessageGenKeyEvent) != 0); in _XkbFilterActionMessage()
802 else if (filter->keycode == keycode) { in _XkbFilterActionMessage()
803 pMsg = &filter->upAction.msg; in _XkbFilterActionMessage()
805 if (pMsg->flags & XkbSA_MessageOnRelease) { in _XkbFilterActionMessage()
811 ((pMsg->flags & XkbSA_MessageGenKeyEvent) != 0); in _XkbFilterActionMessage()
812 memcpy((char *) msg.message, (char *) pMsg->message, in _XkbFilterActionMessage()
816 filter->keycode = 0; in _XkbFilterActionMessage()
817 filter->active = 0; in _XkbFilterActionMessage()
818 return ((pMsg->flags & XkbSA_MessageGenKeyEvent) != 0); in _XkbFilterActionMessage()
822 filter->keycode = 0; in _XkbFilterActionMessage()
823 filter->active = 0; in _XkbFilterActionMessage()
837 xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device); in _XkbFilterRedirectKey()
840 if ((filter->keycode != 0) && (filter->keycode != keycode)) in _XkbFilterRedirectKey()
845 if ((filter->keycode == keycode) && pAction && in _XkbFilterRedirectKey()
846 (pAction->type != XkbSA_RedirectKey)) in _XkbFilterRedirectKey()
855 GetSpritePosition(xkbi->device, &x, &y); in _XkbFilterRedirectKey()
863 ev.deviceid = xkbi->device->id; in _XkbFilterRedirectKey()
864 /* filter->priv must be set up by the caller for the initial press. */ in _XkbFilterRedirectKey()
865 ev.sourceid = filter->priv; in _XkbFilterRedirectKey()
867 if (filter->keycode == 0) { /* initial press */ in _XkbFilterRedirectKey()
868 if ((pAction->redirect.new_key < xkbi->desc->min_key_code) || in _XkbFilterRedirectKey()
869 (pAction->redirect.new_key > xkbi->desc->max_key_code)) { in _XkbFilterRedirectKey()
872 filter->keycode = keycode; in _XkbFilterRedirectKey()
873 filter->active = 1; in _XkbFilterRedirectKey()
874 filter->filterOthers = 0; in _XkbFilterRedirectKey()
875 filter->filter = _XkbFilterRedirectKey; in _XkbFilterRedirectKey()
876 filter->upAction = *pAction; in _XkbFilterRedirectKey()
879 ev.detail.key = pAction->redirect.new_key; in _XkbFilterRedirectKey()
881 mask = XkbSARedirectVModsMask(&pAction->redirect); in _XkbFilterRedirectKey()
882 mods = XkbSARedirectVMods(&pAction->redirect); in _XkbFilterRedirectKey()
884 XkbVirtualModsToReal(xkbi->desc, mask, &mask); in _XkbFilterRedirectKey()
886 XkbVirtualModsToReal(xkbi->desc, mods, &mods); in _XkbFilterRedirectKey()
887 mask |= pAction->redirect.mods_mask; in _XkbFilterRedirectKey()
888 mods |= pAction->redirect.mods; in _XkbFilterRedirectKey()
891 old = xkbi->state; in _XkbFilterRedirectKey()
892 old_prev = xkbi->prev_state; in _XkbFilterRedirectKey()
893 xkbi->state.base_mods &= ~mask; in _XkbFilterRedirectKey()
894 xkbi->state.base_mods |= (mods & mask); in _XkbFilterRedirectKey()
895 xkbi->state.latched_mods &= ~mask; in _XkbFilterRedirectKey()
896 xkbi->state.latched_mods |= (mods & mask); in _XkbFilterRedirectKey()
897 xkbi->state.locked_mods &= ~mask; in _XkbFilterRedirectKey()
898 xkbi->state.locked_mods |= (mods & mask); in _XkbFilterRedirectKey()
900 xkbi->prev_state = xkbi->state; in _XkbFilterRedirectKey()
903 UNWRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, backupproc); in _XkbFilterRedirectKey()
904 xkbi->device->public.processInputProc((InternalEvent *) &ev, in _XkbFilterRedirectKey()
905 xkbi->device); in _XkbFilterRedirectKey()
906 COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, backupproc, in _XkbFilterRedirectKey()
910 xkbi->state = old; in _XkbFilterRedirectKey()
911 xkbi->prev_state = old_prev; in _XkbFilterRedirectKey()
918 ev.detail.key = filter->upAction.redirect.new_key; in _XkbFilterRedirectKey()
919 if (pAction == NULL || ev.detail.key != pAction->redirect.new_key) { in _XkbFilterRedirectKey()
921 filter->active = 0; in _XkbFilterRedirectKey()
928 mask = XkbSARedirectVModsMask(&filter->upAction.redirect); in _XkbFilterRedirectKey()
929 mods = XkbSARedirectVMods(&filter->upAction.redirect); in _XkbFilterRedirectKey()
931 XkbVirtualModsToReal(xkbi->desc, mask, &mask); in _XkbFilterRedirectKey()
933 XkbVirtualModsToReal(xkbi->desc, mods, &mods); in _XkbFilterRedirectKey()
934 mask |= filter->upAction.redirect.mods_mask; in _XkbFilterRedirectKey()
935 mods |= filter->upAction.redirect.mods; in _XkbFilterRedirectKey()
938 old = xkbi->state; in _XkbFilterRedirectKey()
939 old_prev = xkbi->prev_state; in _XkbFilterRedirectKey()
940 xkbi->state.base_mods &= ~mask; in _XkbFilterRedirectKey()
941 xkbi->state.base_mods |= (mods & mask); in _XkbFilterRedirectKey()
942 xkbi->state.latched_mods &= ~mask; in _XkbFilterRedirectKey()
943 xkbi->state.latched_mods |= (mods & mask); in _XkbFilterRedirectKey()
944 xkbi->state.locked_mods &= ~mask; in _XkbFilterRedirectKey()
945 xkbi->state.locked_mods |= (mods & mask); in _XkbFilterRedirectKey()
947 xkbi->prev_state = xkbi->state; in _XkbFilterRedirectKey()
950 UNWRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, backupproc); in _XkbFilterRedirectKey()
951 xkbi->device->public.processInputProc((InternalEvent *) &ev, in _XkbFilterRedirectKey()
952 xkbi->device); in _XkbFilterRedirectKey()
953 COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr, backupproc, in _XkbFilterRedirectKey()
957 xkbi->state = old; in _XkbFilterRedirectKey()
958 xkbi->prev_state = old_prev; in _XkbFilterRedirectKey()
965 return (pAction && ev.detail.key != pAction->redirect.new_key); in _XkbFilterRedirectKey()
974 DeviceIntPtr dev = xkbi->device; in _XkbFilterSwitchScreen()
979 if (filter->keycode == 0) { /* initial press */ in _XkbFilterSwitchScreen()
980 filter->keycode = keycode; in _XkbFilterSwitchScreen()
981 filter->active = 1; in _XkbFilterSwitchScreen()
982 filter->filterOthers = 0; in _XkbFilterSwitchScreen()
983 filter->filter = _XkbFilterSwitchScreen; in _XkbFilterSwitchScreen()
988 else if (filter->keycode == keycode) { in _XkbFilterSwitchScreen()
989 filter->active = 0; in _XkbFilterSwitchScreen()
999 DeviceIntPtr dev = xkbi->device; in _XkbFilterXF86Private()
1004 if (filter->keycode == 0) { /* initial press */ in _XkbFilterXF86Private()
1005 filter->keycode = keycode; in _XkbFilterXF86Private()
1006 filter->active = 1; in _XkbFilterXF86Private()
1007 filter->filterOthers = 0; in _XkbFilterXF86Private()
1008 filter->filter = _XkbFilterXF86Private; in _XkbFilterXF86Private()
1012 else if (filter->keycode == keycode) { in _XkbFilterXF86Private()
1013 filter->active = 0; in _XkbFilterXF86Private()
1023 if (xkbi->device == inputInfo.keyboard) in _XkbFilterDeviceBtn()
1026 if (filter->keycode == 0) { /* initial press */ in _XkbFilterDeviceBtn()
1030 _XkbLookupButtonDevice(&dev, pAction->devbtn.device, serverClient, in _XkbFilterDeviceBtn()
1032 if (!dev || !dev->public.on) in _XkbFilterDeviceBtn()
1035 button = pAction->devbtn.button; in _XkbFilterDeviceBtn()
1036 if ((button < 1) || (button > dev->button->numButtons)) in _XkbFilterDeviceBtn()
1039 filter->keycode = keycode; in _XkbFilterDeviceBtn()
1040 filter->active = 1; in _XkbFilterDeviceBtn()
1041 filter->filterOthers = 0; in _XkbFilterDeviceBtn()
1042 filter->priv = 0; in _XkbFilterDeviceBtn()
1043 filter->filter = _XkbFilterDeviceBtn; in _XkbFilterDeviceBtn()
1044 filter->upAction = *pAction; in _XkbFilterDeviceBtn()
1045 switch (pAction->type) { in _XkbFilterDeviceBtn()
1047 if ((pAction->devbtn.flags & XkbSA_LockNoLock) || in _XkbFilterDeviceBtn()
1048 BitIsOn(dev->button->down, button)) in _XkbFilterDeviceBtn()
1051 filter->upAction.type = XkbSA_NoAction; in _XkbFilterDeviceBtn()
1054 if (pAction->devbtn.count > 0) { in _XkbFilterDeviceBtn()
1057 nClicks = pAction->btn.count; in _XkbFilterDeviceBtn()
1062 filter->upAction.type = XkbSA_NoAction; in _XkbFilterDeviceBtn()
1069 else if (filter->keycode == keycode) { in _XkbFilterDeviceBtn()
1073 filter->active = 0; in _XkbFilterDeviceBtn()
1074 _XkbLookupButtonDevice(&dev, filter->upAction.devbtn.device, in _XkbFilterDeviceBtn()
1076 if (!dev || !dev->public.on) in _XkbFilterDeviceBtn()
1079 button = filter->upAction.btn.button; in _XkbFilterDeviceBtn()
1080 switch (filter->upAction.type) { in _XkbFilterDeviceBtn()
1082 if ((filter->upAction.devbtn.flags & XkbSA_LockNoUnlock) || in _XkbFilterDeviceBtn()
1083 !BitIsOn(dev->button->down, button)) in _XkbFilterDeviceBtn()
1091 filter->active = 0; in _XkbFilterDeviceBtn()
1101 if (xkbi->szFilters == 0) { in _XkbNextFreeFilter()
1102 xkbi->szFilters = 4; in _XkbNextFreeFilter()
1103 xkbi->filters = calloc(xkbi->szFilters, sizeof(XkbFilterRec)); in _XkbNextFreeFilter()
1104 /* 6/21/93 (ef) -- XXX! deal with allocation failure */ in _XkbNextFreeFilter()
1106 for (i = 0; i < xkbi->szFilters; i++) { in _XkbNextFreeFilter()
1107 if (!xkbi->filters[i].active) { in _XkbNextFreeFilter()
1108 xkbi->filters[i].keycode = 0; in _XkbNextFreeFilter()
1109 return &xkbi->filters[i]; in _XkbNextFreeFilter()
1112 xkbi->szFilters *= 2; in _XkbNextFreeFilter()
1113 xkbi->filters = reallocarray(xkbi->filters, in _XkbNextFreeFilter()
1114 xkbi->szFilters, sizeof(XkbFilterRec)); in _XkbNextFreeFilter()
1115 /* 6/21/93 (ef) -- XXX! deal with allocation failure */ in _XkbNextFreeFilter()
1116 memset(&xkbi->filters[xkbi->szFilters / 2], 0, in _XkbNextFreeFilter()
1117 (xkbi->szFilters / 2) * sizeof(XkbFilterRec)); in _XkbNextFreeFilter()
1118 return &xkbi->filters[xkbi->szFilters / 2]; in _XkbNextFreeFilter()
1127 for (i = 0; i < xkbi->szFilters; i++) { in _XkbApplyFilters()
1128 if ((xkbi->filters[i].active) && (xkbi->filters[i].filter)) in _XkbApplyFilters()
1130 ((*xkbi->filters[i].filter) (xkbi, &xkbi->filters[i], kc, in _XkbApplyFilters()
1144 if ((xkbi->flags & _XkbStateNotifyInProgress) == 0) { in _XkbEnsureStateChange()
1145 xkbi->prev_state = xkbi->state; in _XkbEnsureStateChange()
1146 xkbi->flags |= _XkbStateNotifyInProgress; in _XkbEnsureStateChange()
1156 XkbSrvInfoPtr xkbi = dev->key->xkbInfo; in _XkbApplyState()
1161 changed = XkbStateChangedFlags(&xkbi->prev_state, &xkbi->state); in _XkbApplyState()
1172 xkbi->flags &= ~_XkbStateNotifyInProgress; in _XkbApplyState()
1190 if (!dev->key || GetMaster(dev, MASTER_KEYBOARD) != master) in XkbPushLockedStateToSlaves()
1193 genStateNotify = _XkbEnsureStateChange(dev->key->xkbInfo); in XkbPushLockedStateToSlaves()
1195 dev->key->xkbInfo->state.locked_mods = in XkbPushLockedStateToSlaves()
1196 master->key->xkbInfo->state.locked_mods; in XkbPushLockedStateToSlaves()
1206 XkbSrvInfoPtr xkbi = dev->key->xkbInfo; in XkbActionGetFilter()
1220 if (event->source_type == EVENT_SOURCE_FOCUS) { in XkbActionGetFilter()
1221 switch (act->type) { in XkbActionGetFilter()
1235 switch (act->type) { in XkbActionGetFilter()
1286 * equals to xkbi->device->id. */ in XkbActionGetFilter()
1287 filter->priv = event->sourceid; in XkbActionGetFilter()
1317 keyc = kbd->key; in XkbHandleActions()
1318 xkbi = keyc->xkbInfo; in XkbHandleActions()
1319 key = event->detail.key; in XkbHandleActions()
1323 xkbi->clearMods = xkbi->setMods = 0; in XkbHandleActions()
1324 xkbi->groupChange = 0; in XkbHandleActions()
1327 keyEvent = ((event->type == ET_KeyPress) || (event->type == ET_KeyRelease)); in XkbHandleActions()
1328 pressEvent = ((event->type == ET_KeyPress) || in XkbHandleActions()
1329 (event->type == ET_ButtonPress)); in XkbHandleActions()
1333 act = XkbGetKeyAction(xkbi, &xkbi->state, key); in XkbHandleActions()
1349 if (xkbi->groupChange != 0) in XkbHandleActions()
1350 xkbi->state.base_group += xkbi->groupChange; in XkbHandleActions()
1351 if (xkbi->setMods) { in XkbHandleActions()
1352 for (i = 0, bit = 1; xkbi->setMods; i++, bit <<= 1) { in XkbHandleActions()
1353 if (xkbi->setMods & bit) { in XkbHandleActions()
1354 keyc->modifierKeyCount[i]++; in XkbHandleActions()
1355 xkbi->state.base_mods |= bit; in XkbHandleActions()
1356 xkbi->setMods &= ~bit; in XkbHandleActions()
1360 if (xkbi->clearMods) { in XkbHandleActions()
1361 for (i = 0, bit = 1; xkbi->clearMods; i++, bit <<= 1) { in XkbHandleActions()
1362 if (xkbi->clearMods & bit) { in XkbHandleActions()
1363 keyc->modifierKeyCount[i]--; in XkbHandleActions()
1364 if (keyc->modifierKeyCount[i] <= 0) { in XkbHandleActions()
1365 xkbi->state.base_mods &= ~bit; in XkbHandleActions()
1366 keyc->modifierKeyCount[i] = 0; in XkbHandleActions()
1368 xkbi->clearMods &= ~bit; in XkbHandleActions()
1382 dev->public.processInputProc((InternalEvent *) event, tmpdev); in XkbHandleActions()
1390 _XkbApplyState(dev, genStateNotify, event->type, key); in XkbHandleActions()
1391 XkbPushLockedStateToSlaves(dev, event->type, key); in XkbHandleActions()
1402 if (pXDev && pXDev->key && pXDev->key->xkbInfo) { in XkbLatchModifiers()
1403 xkbi = pXDev->key->xkbInfo; in XkbLatchModifiers()
1405 xkbi->state.latched_mods &= ~clear; in XkbLatchModifiers()
1406 /* Clear any pending latch to locks. in XkbLatchModifiers()
1429 if (pXDev && pXDev->key && pXDev->key->xkbInfo) { in XkbLatchGroup()
1430 xkbi = pXDev->key->xkbInfo; in XkbLatchGroup()
1454 os = xkbi->state; in XkbClearAllLatchesAndLocks()
1464 xkbi->state.locked_mods = 0; in XkbClearAllLatchesAndLocks()
1468 xkbi->state.locked_group = 0; in XkbClearAllLatchesAndLocks()
1475 sn.keycode = cause->kc; in XkbClearAllLatchesAndLocks()
1476 sn.eventType = cause->event; in XkbClearAllLatchesAndLocks()
1477 sn.requestMajor = cause->mjr; in XkbClearAllLatchesAndLocks()
1478 sn.requestMinor = cause->mnr; in XkbClearAllLatchesAndLocks()
1479 sn.changed = XkbStateChangedFlags(&os, &xkbi->state); in XkbClearAllLatchesAndLocks()
1504 * So we post-fix the event list we get from GPE with a DCE back to the
1521 lastSlave = mpointer->lastSlave; in InjectPointerKeyEvents()