-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathkbdstate.c
99 lines (88 loc) · 1.9 KB
/
kbdstate.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
xrus - keyboard switcher/indicator
Copyright (c) 1996 Alexander V. Lukyanov
This is free software with no warranty.
See COPYING for details.
*/
#include <config.h>
#include <X11/Intrinsic.h>
#include "xrus.h"
#include "kbdstate.h"
static char key_vector[32];
int min_keycode,max_keycode;
KeySym *keymap;
int keysyms_per_keycode;
XModifierKeymap *modifiermap;
void KeyboardStateInit()
{
XDisplayKeycodes(disp,&min_keycode,&max_keycode);
XQueryKeymap(disp,key_vector);
}
void KeepTrackOfKeyboard(XEvent *ev)
{
switch(ev->type)
{
case KeyPress:
key_vector[ev->xkey.keycode/8]|=(1<<(ev->xkey.keycode%8));
break;
case KeyRelease:
key_vector[ev->xkey.keycode/8]&=~(1<<(ev->xkey.keycode%8));
break;
case KeymapNotify:
#ifdef DEBUG
printf("KeymapNotify\n");
#endif
memcpy(key_vector,ev->xkeymap.key_vector,32);
break;
case MappingNotify:
switch(ev->xmapping.request)
{
case MappingModifier:
if(modifiermap)
XFreeModifiermap(modifiermap);
modifiermap=NULL;
break;
case MappingKeyboard:
if(keymap)
XFree(keymap);
keymap=NULL;
break;
}
break;
}
}
int IsKeyCodePressed(KeyCode i)
{
return(key_vector[i/8]&(1<<(i%8)));
}
int IsKeySymPressed(KeySym ks)
{
return IsKeyCodePressed(XKeysymToKeycode(disp,ks));
}
KeySym *GetKeymap()
{
if(!keymap)
keymap=XGetKeyboardMapping(disp,min_keycode,
max_keycode-min_keycode+1,&keysyms_per_keycode);
return(keymap);
}
XModifierKeymap *GetModifiers()
{
if(!modifiermap)
modifiermap=XGetModifierMapping(disp);
return(modifiermap);
}
int IsModifierPressed(int n)
{
int i;
KeyCode *kc;
XModifierKeymap *mod=GetModifiers();
kc=mod->modifiermap+n*mod->max_keypermod;
for(i=0; i<mod->max_keypermod; i++)
{
if(*kc && IsKeyCodePressed(*kc))
return 1;
kc++;
}
return 0;
}