diff options
author | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2009-09-30 00:22:02 -0700 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2009-09-30 00:23:47 -0700 |
commit | 873467adad479be02cd9cc6b43685919f5612d91 (patch) | |
tree | 12ff4b3d61d42432afa57db06e4c3d89519bad57 | |
parent | 7bef78e199a4e4f7916be506807513efcd8fd4cb (diff) |
XQuartz: Set the proper bitmap for key repeats...
XkbSetRepeatKeys lies and doesn't do what it says it will...
-rw-r--r-- | hw/xquartz/quartzKeyboard.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c index ea0ebe5d8..06b981e02 100644 --- a/hw/xquartz/quartzKeyboard.c +++ b/hw/xquartz/quartzKeyboard.c @@ -304,19 +304,53 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) { /* Set the repeat rates based on global preferences and keycodes for modifiers. * Precondition: Has the keyInfo_mutex lock. */ -static void DarwinKeyboardSetRepeat(DeviceIntPtr pDev, CFIndex initialKeyRepeatValue, CFIndex keyRepeatValue) { +static void DarwinKeyboardSetRepeat(DeviceIntPtr pDev, int initialKeyRepeatValue, int keyRepeatValue) { if(initialKeyRepeatValue == 300000) { // off + /* Turn off repeats globally */ XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOff); } else { - pDev->key->xkbInfo->desc->ctrls->repeat_delay = initialKeyRepeatValue * 15; - pDev->key->xkbInfo->desc->ctrls->repeat_interval = keyRepeatValue * 15; + int i; + XkbControlsPtr ctrl; + XkbControlsRec old; + /* Turn on repeats globally */ XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOn); + + /* Setup the bit mask for individual key repeats */ + ctrl = pDev->key->xkbInfo->desc->ctrls; + old= *ctrl; + + ctrl->repeat_delay = initialKeyRepeatValue * 15; + ctrl->repeat_interval = keyRepeatValue * 15; + + /* Turn off key-repeat for modifier keys, on for others */ + /* First set them all on */ + for(i=0; i < XkbPerKeyBitArraySize; i++) + ctrl->per_key_repeat[i] = -1; + + /* Now turn off the modifiers */ + for(i=0; i < 32; i++) { + unsigned char keycode; + + keycode = keyInfo.modifierKeycodes[i][0]; + if(keycode) + ClearBit(ctrl->per_key_repeat, keycode + MIN_KEYCODE); + + keycode = keyInfo.modifierKeycodes[i][1]; + if(keycode) + ClearBit(ctrl->per_key_repeat, keycode + MIN_KEYCODE); + } + + /* Hurray for data duplication */ + if (pDev->kbdfeed) + memcpy(pDev->kbdfeed->ctrl.autoRepeats, ctrl->per_key_repeat, XkbPerKeyBitArraySize); + + //fprintf(stderr, "per_key_repeat =\n"); + //for(i=0; i < XkbPerKeyBitArraySize; i++) + // fprintf(stderr, "%02x%s", ctrl->per_key_repeat[i], (i + 1) & 7 ? "" : "\n"); - /* TODO: Turn off key-repeat for modifier keys, on for others */ - // Test: Shouldn't this turn off all the key repeats??? - //for(i=MIN_KEYCODE; i <= MAX_KEYCODE; i++) - // XkbSetRepeatKeys(pDev, i, AutoRepeatModeOff); + /* And now we notify the puppies about the changes */ + XkbDDXChangeControls(pDev, &old, ctrl); } } |