3 Copyright 1993 by Davor Matic
5 Permission to use, copy, modify, distribute, and sell this software
6 and its documentation for any purpose is hereby granted without fee,
7 provided that the above copyright notice appear in all copies and that
8 both that copyright notice and this permission notice appear in
9 supporting documentation. Davor Matic makes no representations about
10 the suitability of this software for any purpose. It is provided "as
11 is" without express or implied warranty.
15 #ifdef HAVE_XNEST_CONFIG_H
16 #include <xnest-config.h>
20 #include <X11/Xproto.h>
21 #include <X11/keysym.h>
22 #include "screenint.h"
25 #include "scrnintstr.h"
36 #include <X11/extensions/XKB.h>
38 #include <X11/extensions/XKBconfig.h>
41 XkbQueryExtension(Display
* /* dpy */ ,
42 int * /* opcodeReturn */ ,
43 int * /* eventBaseReturn */ ,
44 int * /* errorBaseReturn */ ,
45 int * /* majorRtrn */ ,
49 extern XkbDescPtr
XkbGetKeyboard(Display
* /* dpy */ ,
50 unsigned int /* which */ ,
51 unsigned int /* deviceSpec */
54 extern Status
XkbGetControls(Display
* /* dpy */ ,
55 unsigned long /* which */ ,
59 DeviceIntPtr xnestKeyboardDevice
= NULL
;
62 xnestBell(int volume
, DeviceIntPtr pDev
, pointer ctrl
, int cls
)
64 XBell(xnestDisplay
, volume
);
68 DDXRingBell(int volume
, int pitch
, int duration
)
70 XBell(xnestDisplay
, volume
);
74 xnestChangeKeyboardControl(DeviceIntPtr pDev
, KeybdCtrl
* ctrl
)
77 unsigned long value_mask
;
78 XKeyboardControl values
;
81 value_mask
= KBKeyClickPercent
|
82 KBBellPercent
| KBBellPitch
| KBBellDuration
| KBAutoRepeatMode
;
84 values
.key_click_percent
= ctrl
->click
;
85 values
.bell_percent
= ctrl
->bell
;
86 values
.bell_pitch
= ctrl
->bell_pitch
;
87 values
.bell_duration
= ctrl
->bell_duration
;
88 values
.auto_repeat_mode
= ctrl
->autoRepeat
?
89 AutoRepeatModeOn
: AutoRepeatModeOff
;
91 XChangeKeyboardControl(xnestDisplay
, value_mask
, &values
);
94 value_mask = KBKey | KBAutoRepeatMode;
95 At this point, we need to walk through the vector and compare it
96 to the current server vector. If there are differences, report them.
99 value_mask
= KBLed
| KBLedMode
;
100 for (i
= 1; i
<= 32; i
++) {
103 (ctrl
->leds
& (1 << (i
- 1))) ? LedModeOn
: LedModeOff
;
104 XChangeKeyboardControl(xnestDisplay
, value_mask
, &values
);
110 xnestKeyboardProc(DeviceIntPtr pDev
, int onoff
)
112 XModifierKeymap
*modifier_keymap
;
115 int min_keycode
, max_keycode
;
117 CARD8 modmap
[MAP_LENGTH
];
119 XKeyboardState values
;
121 int op
, event
, error
, major
, minor
;
125 XDisplayKeycodes(xnestDisplay
, &min_keycode
, &max_keycode
);
131 keymap64
= XGetKeyboardMapping(xnestDisplay
,
133 max_keycode
- min_keycode
+ 1,
135 len
= (max_keycode
- min_keycode
+ 1) * mapWidth
;
136 keymap
= (KeySym
*) malloc(len
* sizeof(KeySym
));
137 for (i
= 0; i
< len
; ++i
)
138 keymap
[i
] = keymap64
[i
];
142 keymap
= XGetKeyboardMapping(xnestDisplay
,
144 max_keycode
- min_keycode
+ 1, &mapWidth
);
147 memset(modmap
, 0, sizeof(modmap
));
148 modifier_keymap
= XGetModifierMapping(xnestDisplay
);
149 for (j
= 0; j
< 8; j
++)
150 for (i
= 0; i
< modifier_keymap
->max_keypermod
; i
++) {
154 modifier_keymap
->modifiermap
[j
*
157 modmap
[keycode
] |= 1 << j
;
159 XFreeModifiermap(modifier_keymap
);
161 keySyms
.minKeyCode
= min_keycode
;
162 keySyms
.maxKeyCode
= max_keycode
;
163 keySyms
.mapWidth
= mapWidth
;
164 keySyms
.map
= keymap
;
166 if (XkbQueryExtension(xnestDisplay
, &op
, &event
, &error
, &major
, &minor
)
168 ErrorF("Unable to initialize XKEYBOARD extension.\n");
172 XkbGetKeyboard(xnestDisplay
, XkbGBN_AllComponentsMask
,
174 if (xkb
== NULL
|| xkb
->geom
== NULL
) {
175 ErrorF("Couldn't get keyboard.\n");
178 XkbGetControls(xnestDisplay
, XkbAllControlsMask
, xkb
);
180 InitKeyboardDeviceStruct(pDev
, NULL
,
181 xnestBell
, xnestChangeKeyboardControl
);
183 XkbApplyMappingChange(pDev
, &keySyms
, keySyms
.minKeyCode
,
184 keySyms
.maxKeyCode
- keySyms
.minKeyCode
+ 1,
185 modmap
, serverClient
);
187 XkbDDXChangeControls(pDev
, xkb
->ctrls
, xkb
->ctrls
);
188 XkbFreeKeyboard(xkb
, 0, False
);
192 xnestEventMask
|= XNEST_KEYBOARD_EVENT_MASK
;
193 for (i
= 0; i
< xnestNumScreens
; i
++)
194 XSelectInput(xnestDisplay
, xnestDefaultWindows
[i
], xnestEventMask
);
197 xnestEventMask
&= ~XNEST_KEYBOARD_EVENT_MASK
;
198 for (i
= 0; i
< xnestNumScreens
; i
++)
199 XSelectInput(xnestDisplay
, xnestDefaultWindows
[i
], xnestEventMask
);
207 XGetKeyboardControl(xnestDisplay
, &values
);
208 memmove((char *) defaultKeyboardControl
.autoRepeats
,
209 (char *) values
.auto_repeats
, sizeof(values
.auto_repeats
));
211 InitKeyboardDeviceStruct(pDev
, NULL
, xnestBell
, xnestChangeKeyboardControl
);
217 LegalModifier(unsigned int key
, DeviceIntPtr pDev
)
223 xnestUpdateModifierState(unsigned int state
)
225 DeviceIntPtr pDev
= xnestKeyboardDevice
;
226 KeyClassPtr keyc
= pDev
->key
;
234 xkb_state
= XkbStateFieldFromRec(&pDev
->key
->xkbInfo
->state
);
235 state
= state
& 0xff;
237 if (xkb_state
== state
)
240 for (i
= 0, mask
= 1; i
< 8; i
++, mask
<<= 1) {
243 /* Modifier is down, but shouldn't be
245 if ((xkb_state
& mask
) && !(state
& mask
)) {
246 int count
= keyc
->modifierKeyCount
[i
];
248 for (key
= 0; key
< MAP_LENGTH
; key
++)
249 if (keyc
->xkbInfo
->desc
->map
->modmap
[key
] & mask
) {
250 if (key_is_down(pDev
, key
, KEY_PROCESSED
))
251 xnestQueueKeyEvent(KeyRelease
, key
);
258 /* Modifier shoud be down, but isn't
260 if (!(xkb_state
& mask
) && (state
& mask
))
261 for (key
= 0; key
< MAP_LENGTH
; key
++)
262 if (keyc
->xkbInfo
->desc
->map
->modmap
[key
] & mask
) {
263 xnestQueueKeyEvent(KeyPress
, key
);