~ubuntu-branches/ubuntu/vivid/xorg-server/vivid

« back to all changes in this revision

Viewing changes to hw/xwin/winkeybd.c

  • Committer: Package Import Robot
  • Author(s): Maarten Lankhorst
  • Date: 2013-07-03 12:03:57 UTC
  • mfrom: (1.1.56)
  • Revision ID: package-import@ubuntu.com-20130703120357-caosebpn11zu2zj0
Tags: 2:1.14.1-0ubuntu0.8
Use correct version for libxfixes3.

Show diffs side-by-side

added added

removed removed

Lines of Context:
41
41
 
42
42
#include "xkbsrv.h"
43
43
 
 
44
/* C does not have a logical XOR operator, so we use a macro instead */
 
45
#define LOGICAL_XOR(a,b) ((!(a) && (b)) || ((a) && !(b)))
 
46
 
44
47
static Bool g_winKeyState[NUM_KEYCODES];
45
48
 
46
49
/*
53
56
static void
54
57
 winKeybdCtrl(DeviceIntPtr pDevice, KeybdCtrl * pCtrl);
55
58
 
56
 
/* 
 
59
/*
57
60
 * Translate a Windows WM_[SYS]KEY(UP/DOWN) message
58
61
 * into an ASCII scan code.
59
62
 *
131
134
{
132
135
}
133
136
 
134
 
/* 
 
137
/*
135
138
 * See Porting Layer Definition - p. 18
136
139
 * winKeybdProc is known as a DeviceProc.
137
140
 */
259
262
        XkbStateFieldFromRec(&inputInfo.keyboard->key->xkbInfo->state);
260
263
    winDebug("winRestoreModeKeyStates: state %d\n", internalKeyStates);
261
264
 
262
 
    /* 
263
 
     * NOTE: The C XOR operator, ^, will not work here because it is
264
 
     * a bitwise operator, not a logical operator.  C does not
265
 
     * have a logical XOR operator, so we use a macro instead.
266
 
     */
267
 
 
268
 
    /* Has the key state changed? */
 
265
    /* Check if modifier keys are pressed, and if so, fake a press */
 
266
    {
 
267
        BOOL ctrl = (GetAsyncKeyState(VK_CONTROL) < 0);
 
268
        BOOL shift = (GetAsyncKeyState(VK_SHIFT) < 0);
 
269
        BOOL alt = (GetAsyncKeyState(VK_LMENU) < 0);
 
270
        BOOL altgr = (GetAsyncKeyState(VK_RMENU) < 0);
 
271
 
 
272
        if (ctrl && altgr)
 
273
            ctrl = FALSE;
 
274
 
 
275
        if (LOGICAL_XOR(internalKeyStates & ControlMask, ctrl))
 
276
            winSendKeyEvent(KEY_LCtrl, ctrl);
 
277
 
 
278
        if (LOGICAL_XOR(internalKeyStates & ShiftMask, shift))
 
279
            winSendKeyEvent(KEY_ShiftL, shift);
 
280
 
 
281
        if (LOGICAL_XOR(internalKeyStates & Mod1Mask, alt))
 
282
            winSendKeyEvent(KEY_Alt, alt);
 
283
 
 
284
        if (LOGICAL_XOR(internalKeyStates & Mod5Mask, altgr))
 
285
            winSendKeyEvent(KEY_AltLang, altgr);
 
286
    }
 
287
 
 
288
    /*
 
289
       Check if latching modifier key states have changed, and if so,
 
290
       fake a press and a release to toggle the modifier to the correct
 
291
       state
 
292
    */
269
293
    dwKeyState = GetKeyState(VK_NUMLOCK) & 0x0001;
270
 
    if (WIN_XOR(internalKeyStates & NumLockMask, dwKeyState)) {
 
294
    if (LOGICAL_XOR(internalKeyStates & NumLockMask, dwKeyState)) {
271
295
        winSendKeyEvent(KEY_NumLock, TRUE);
272
296
        winSendKeyEvent(KEY_NumLock, FALSE);
273
297
    }
274
298
 
275
 
    /* Has the key state changed? */
276
299
    dwKeyState = GetKeyState(VK_CAPITAL) & 0x0001;
277
 
    if (WIN_XOR(internalKeyStates & LockMask, dwKeyState)) {
 
300
    if (LOGICAL_XOR(internalKeyStates & LockMask, dwKeyState)) {
278
301
        winSendKeyEvent(KEY_CapsLock, TRUE);
279
302
        winSendKeyEvent(KEY_CapsLock, FALSE);
280
303
    }
281
304
 
282
 
    /* Has the key state changed? */
283
305
    dwKeyState = GetKeyState(VK_SCROLL) & 0x0001;
284
 
    if (WIN_XOR(internalKeyStates & ScrollLockMask, dwKeyState)) {
 
306
    if (LOGICAL_XOR(internalKeyStates & ScrollLockMask, dwKeyState)) {
285
307
        winSendKeyEvent(KEY_ScrollLock, TRUE);
286
308
        winSendKeyEvent(KEY_ScrollLock, FALSE);
287
309
    }
288
310
 
289
 
    /* Has the key state changed? */
290
311
    dwKeyState = GetKeyState(VK_KANA) & 0x0001;
291
 
    if (WIN_XOR(internalKeyStates & KanaMask, dwKeyState)) {
 
312
    if (LOGICAL_XOR(internalKeyStates & KanaMask, dwKeyState)) {
292
313
        winSendKeyEvent(KEY_HKTG, TRUE);
293
314
        winSendKeyEvent(KEY_HKTG, FALSE);
294
315
    }
488
509
    return FALSE;
489
510
}
490
511
 
491
 
/* Only on shift release message is sent even if both are pressed.
492
 
 * Fix this here 
 
512
/* Only one shift release message is sent even if both are pressed.
 
513
 * Fix this here
493
514
 */
494
515
void
495
516
winFixShiftKeys(int iScanCode)