|
|
1.1 root 1: #define NEED_EVENTS
2: #include "sun.h"
3: #include <stdio.h>
4: #include <sys/ioctl.h>
5: #include "Xproto.h"
6: #include "keysym.h"
7:
8: extern CARD8 *sunModMap[];
9: extern KeySymsRec sunKeySyms[];
10:
11: static void sunBell();
12: static void sunKbdCtrl();
13:
14: int sunKbdfd = -1;
15: static struct sgttyb sttymodes;
16: static struct ttydevb devmodes;
17: static struct tchars tcharmodes;
18: #define MAXNLINED 10
19: static int sunnld, linedstack[MAXNLINED];
20:
21: static void
22: sunsavemodes()
23: {
24: char filename[256], *p;
25: char *getenv();
26: int fd;
27:
28: if((p=getenv("HOME")) == 0)
29: return;
30: strcpy(filename, p);
31: strcat(filename, "/.sttymodes");
32: if ((fd = creat(filename, 0644)) < 0)
33: return;
34: ioctl(sunKbdfd, TIOCGETP, &sttymodes);
35: ioctl(sunKbdfd, TIOCGDEV, &devmodes);
36: ioctl(sunKbdfd, TIOCGETC, &tcharmodes);
37: write(fd, &sttymodes, sizeof(struct sgttyb));
38: write(fd, &devmodes, sizeof(struct ttydevb));
39: write(fd, &tcharmodes, sizeof(struct tchars));
40: close(fd);
41: sunnld = 0;
42: while ((linedstack[sunnld] = ioctl(sunKbdfd, FIOLOOKLD, 0)) >= 0) {
43: ioctl(sunKbdfd, FIOPOPLD, 0);
44: sunnld++;
45: }
46: }
47:
48: static void
49: sunresetmodes()
50: {
51: for (sunnld--; sunnld >= 0; sunnld--)
52: ioctl(sunKbdfd, FIOPUSHLD, &linedstack[sunnld]);
53: ioctl(sunKbdfd, TIOCSETP, &sttymodes);
54: ioctl(sunKbdfd, TIOCSDEV, &devmodes);
55: ioctl(sunKbdfd, TIOCSETC, &tcharmodes);
56: }
57:
58: int
59: sunKbdProc (pKeyboard, what)
60: DevicePtr pKeyboard; /* Keyboard to manipulate */
61: int what; /* What to do to it */
62: {
63: register int kbdFd;
64:
65: switch (what) {
66: case DEVICE_INIT:
67: if (pKeyboard != LookupKeyboardDevice()) {
68: ErrorF ("Cannot open non-system keyboard");
69: return (!Success);
70: }
71: if (sunKbdfd >= 0)
72: kbdFd = sunKbdfd;
73: else {
74: kbdFd = open ("/dev/console", 2);
75: if (kbdFd < 0) {
76: Error ("Opening /dev/console");
77: return (!Success);
78: }
79: sunKbdfd = kbdFd;
80: sunsavemodes();
81: }
82:
83: pKeyboard->on = FALSE;
84: InitKeyboardDeviceStruct(
85: pKeyboard, sunKeySyms, sunModMap[0], sunBell, sunKbdCtrl);
86: break;
87:
88: case DEVICE_ON:
89: AddEnabledDevice(sunKbdfd);
90: pKeyboard->on = TRUE;
91: break;
92:
93: case DEVICE_CLOSE:
94: case DEVICE_OFF:
95: sunresetmodes();
96: RemoveEnabledDevice(sunKbdfd);
97: pKeyboard->on = FALSE;
98: break;
99: }
100: return (Success);
101: }
102:
103: static void
104: sunBell (loudness, pKeyboard)
105: int loudness; /* Percentage of full volume */
106: DevicePtr pKeyboard; /* Keyboard to ring */
107: {
108: #define KBD_CMD_BELL 0x02 /* Turn on the bell */
109: #define KBD_CMD_NOBELL 0x03 /* Turn off the bell */
110: static char c[2] = { KBD_CMD_BELL, KBD_CMD_NOBELL};
111:
112: if (loudness)
113: write(sunKbdfd, c, 2);
114: }
115:
116: void
117: sunKbdEvent(pKeyboard)
118: DevicePtr pKeyboard;
119: {
120: register char c, *cp;
121: register i;
122: char *tail;
123: static char rbuf[512];
124:
125: if ((i = read (sunKbdfd, rbuf, sizeof(rbuf))) < 0)
126: FatalError ("Could not read from keyboard");
127:
128: tail = &rbuf[i];
129: for (cp = rbuf; cp != tail; ) {
130: c = *cp++;
131: /*
132: * Eat the idle key messages
133: */
134: if (c == 0x7f)
135: continue;
136: if (c & 0x80)
137: sunmkX(pKeyboard, KeyRelease, c & 0x7F);
138: else
139: sunmkX(pKeyboard, KeyPress, c & 0x7F);
140: }
141:
142: }
143:
144: static void
145: sunKbdCtrl (pKeyboard, ctrl)
146: DevicePtr pKeyboard; /* Keyboard to alter */
147: KeybdCtrl *ctrl;
148: {
149: char c;
150:
151: #define KBD_CMD_CLICK 0x0A /* Turn on the click annunciator */
152: #define KBD_CMD_NOCLICK 0x0B /* Turn off the click annunciator */
153: if (ctrl->click == 0) { /* turn click off */
154: c = KBD_CMD_NOCLICK;
155: write(sunKbdfd, &c, 1);
156: } else {
157: c = KBD_CMD_CLICK;
158: write(sunKbdfd, &c, 1);
159: }
160: }
161:
162: Bool
163: LegalModifier(key)
164: {
165: return (TRUE);
166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.