|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * X keysym support
5: *
6: * Copyright 1995, 1996 Bernd Schmidt
7: * Copyright 1996 Ed Hanway, Andre Beck, Samuel Devulder, Bruno Coste
8: * Copyright 1998 Marcus Sundberg
9: * DGA support by Kai Kollmorgen
10: * X11/DGA merge, hotkeys and grabmouse by Marcus Sundberg
11: * Copyright 2003-2004 Richard Drummond
12: */
13:
14: #include "sysconfig.h"
15: #include "sysdeps.h"
16:
17: #include <X11/Xlib.h>
18: #include <X11/keysym.h>
19:
20: #include "options.h"
21: #include "inputdevice.h"
22: #include "keyboard.h"
23: #include "hotkeys.h"
24:
25:
26: /* Decode KeySyms. This function knows about all keys that are common
27: * between different keyboard languages. */
28: static int kc_decode (KeySym ks)
29: {
30: switch (ks) {
31: case XK_B: case XK_b: return AK_B;
32: case XK_C: case XK_c: return AK_C;
33: case XK_D: case XK_d: return AK_D;
34: case XK_E: case XK_e: return AK_E;
35: case XK_F: case XK_f: return AK_F;
36: case XK_G: case XK_g: return AK_G;
37: case XK_H: case XK_h: return AK_H;
38: case XK_I: case XK_i: return AK_I;
39: case XK_J: case XK_j: return AK_J;
40: case XK_K: case XK_k: return AK_K;
41: case XK_L: case XK_l: return AK_L;
42: case XK_N: case XK_n: return AK_N;
43: case XK_O: case XK_o: return AK_O;
44: case XK_P: case XK_p: return AK_P;
45: case XK_R: case XK_r: return AK_R;
46: case XK_S: case XK_s: return AK_S;
47: case XK_T: case XK_t: return AK_T;
48: case XK_U: case XK_u: return AK_U;
49: case XK_V: case XK_v: return AK_V;
50: case XK_X: case XK_x: return AK_X;
51:
52: case XK_0: return AK_0;
53: case XK_1: return AK_1;
54: case XK_2: return AK_2;
55: case XK_3: return AK_3;
56: case XK_4: return AK_4;
57: case XK_5: return AK_5;
58: case XK_6: return AK_6;
59: case XK_7: return AK_7;
60: case XK_8: return AK_8;
61: case XK_9: return AK_9;
62:
63: /* You never know which Keysyms might be missing on some workstation
64: * This #ifdef should be enough. */
65: #if defined(XK_KP_Prior) && defined(XK_KP_Left) && defined(XK_KP_Insert) && defined (XK_KP_End)
66: case XK_KP_0: case XK_KP_Insert: return AK_NP0;
67: case XK_KP_1: case XK_KP_End: return AK_NP1;
68: case XK_KP_2: case XK_KP_Down: return AK_NP2;
69: case XK_KP_3: case XK_KP_Next: return AK_NP3;
70: case XK_KP_4: case XK_KP_Left: return AK_NP4;
71: case XK_KP_5: case XK_KP_Begin: return AK_NP5;
72: case XK_KP_6: case XK_KP_Right: return AK_NP6;
73: case XK_KP_7: case XK_KP_Home: return AK_NP7;
74: case XK_KP_8: case XK_KP_Up: return AK_NP8;
75: case XK_KP_9: case XK_KP_Prior: return AK_NP9;
76: #else
77: case XK_KP_0: return AK_NP0;
78: case XK_KP_1: return AK_NP1;
79: case XK_KP_2: return AK_NP2;
80: case XK_KP_3: return AK_NP3;
81: case XK_KP_4: return AK_NP4;
82: case XK_KP_5: return AK_NP5;
83: case XK_KP_6: return AK_NP6;
84: case XK_KP_7: return AK_NP7;
85: case XK_KP_8: return AK_NP8;
86: case XK_KP_9: return AK_NP9;
87: #endif
88: case XK_KP_Divide: return AK_NPDIV;
89: case XK_KP_Multiply: return AK_NPMUL;
90: case XK_KP_Subtract: return AK_NPSUB;
91: case XK_KP_Add: return AK_NPADD;
92: case XK_KP_Decimal: return AK_NPDEL;
93: case XK_KP_Enter: return AK_ENT;
94:
95: case XK_F1: return AK_F1;
96: case XK_F2: return AK_F2;
97: case XK_F3: return AK_F3;
98: case XK_F4: return AK_F4;
99: case XK_F5: return AK_F5;
100: case XK_F6: return AK_F6;
101: case XK_F7: return AK_F7;
102: case XK_F8: return AK_F8;
103: case XK_F9: return AK_F9;
104: case XK_F10: return AK_F10;
105:
106: case XK_BackSpace: return AK_BS;
107: case XK_Delete: return AK_DEL;
108: case XK_Control_L: return AK_CTRL;
109: case XK_Control_R: return AK_RCTRL;
110: case XK_Tab: return AK_TAB;
111: case XK_Alt_L: return AK_LALT;
112: case XK_Alt_R: return AK_RALT;
113: case XK_Meta_R: case XK_Hyper_R: return AK_RAMI;
114: case XK_Meta_L: case XK_Hyper_L: return AK_LAMI;
115: case XK_Return: return AK_RET;
116: case XK_space: return AK_SPC;
117: case XK_Shift_L: return AK_LSH;
118: case XK_Shift_R: return AK_RSH;
119: case XK_Escape: return AK_ESC;
120:
121: case XK_Insert: return AK_HELP;
122: case XK_Home: return AK_NPLPAREN;
123: case XK_End: return AK_NPRPAREN;
124: case XK_Caps_Lock: return AK_CAPSLOCK;
125:
126: case XK_Up: return AK_UP;
127: case XK_Down: return AK_DN;
128: case XK_Left: return AK_LF;
129: case XK_Right: return AK_RT;
130:
131: #ifdef XK_Page_Up /* These are missing occasionally */
132: case XK_Page_Up: return AK_RAMI; /* PgUp mapped to right amiga */
133: case XK_Page_Down: return AK_LAMI; /* PgDn mapped to left amiga */
134: #endif
135:
136: #ifdef XK_Super_L
137: case XK_Super_L: return AK_LAMI;
138: case XK_Super_R: return AK_RAMI;
139: #endif
140: case XK_Scroll_Lock: return AKS_INHIBITSCREEN;
141: case XK_Print: return AKS_SCREENSHOT;
142: }
143: return -1;
144: }
145:
146: static int decode_fr (KeySym ks)
147: {
148: switch(ks) { /* FR specific */
149: case XK_A: case XK_a: return AK_Q;
150: case XK_M: case XK_m: return AK_SEMICOLON;
151: case XK_Q: case XK_q: return AK_A;
152: case XK_Y: case XK_y: return AK_Y;
153: case XK_W: case XK_w: return AK_Z;
154: case XK_Z: case XK_z: return AK_W;
155: #if 0
156: case XK_bracketleft: return AK_LBRACKET;
157: case XK_bracketright: return AK_RBRACKET;
158: case XK_comma: return AK_M;
159: case XK_less: case XK_greater: return AK_LTGT;
160: case XK_period: return AK_COMMA;
161: case XK_parenright: return AK_MINUS;
162: case XK_equal: return AK_SLASH;
163: case XK_numbersign: return AK_NUMBERSIGN;
164: case XK_slash: return AK_PERIOD;
165: case XK_minus: return AK_EQUAL;
166: case XK_backslash: return AK_BACKSLASH;
167: #else
168: /* not sure for this one: my X 3.3 server doesn't handle this key always
169: * correctly... But anyway, on new french keyboards, no more bracket key
170: * at this place.
171: */
172: case XK_dead_circumflex:
173: case XK_dead_diaeresis: return AK_LBRACKET;
174: case XK_dollar:
175: case XK_sterling: return AK_RBRACKET;
176: case XK_comma: case XK_question: return AK_M;
177: case XK_less: case XK_greater: return AK_LTGT;
178: case XK_semicolon: case XK_period: return AK_COMMA;
179: case XK_parenright: case XK_degree: return AK_MINUS;
180: case XK_equal: case XK_plus: return AK_SLASH;
181: case XK_numbersign: return AK_NUMBERSIGN;
182: case XK_colon: case XK_slash: return AK_PERIOD;
183: case XK_minus: case XK_6: return AK_6;
184: case XK_ugrave: case XK_percent: return AK_QUOTE;
185: /* found a spare key - I hope it deserves this place. */
186: case XK_asterisk: case XK_mu: return AK_BACKSLASH;
187: case XK_exclam: case XK_section: return AK_EQUAL;
188: case XK_twosuperior: case XK_asciitilde: return AK_BACKQUOTE;
189: case XK_Multi_key: return AK_RAMI;
190: case XK_Mode_switch: return AK_RALT;
191: #endif
192: }
193:
194: return -1;
195: }
196:
197: static int decode_us (KeySym ks)
198: {
199: switch(ks) { /* US specific */
200: case XK_A: case XK_a: return AK_A;
201: case XK_M: case XK_m: return AK_M;
202: case XK_Q: case XK_q: return AK_Q;
203: case XK_Y: case XK_y: return AK_Y;
204: case XK_W: case XK_w: return AK_W;
205: case XK_Z: case XK_z: return AK_Z;
206: case XK_bracketleft: return AK_LBRACKET;
207: case XK_bracketright: return AK_RBRACKET;
208: case XK_comma: return AK_COMMA;
209: case XK_period: return AK_PERIOD;
210: case XK_slash: return AK_SLASH;
211: case XK_semicolon: return AK_SEMICOLON;
212: case XK_minus: return AK_MINUS;
213: case XK_equal: return AK_EQUAL;
214: /* this doesn't work: */
215: case XK_quoteright: return AK_QUOTE;
216: case XK_quoteleft: return AK_BACKQUOTE;
217: case XK_backslash: return AK_BACKSLASH;
218: }
219:
220: return -1;
221: }
222:
223: static int decode_de (KeySym ks)
224: {
225: switch(ks) {
226: /* DE specific */
227: case XK_A: case XK_a: return AK_A;
228: case XK_M: case XK_m: return AK_M;
229: case XK_Q: case XK_q: return AK_Q;
230: case XK_W: case XK_w: return AK_W;
231: case XK_Y: case XK_y: return AK_Z;
232: case XK_Z: case XK_z: return AK_Y;
233: case XK_Odiaeresis: case XK_odiaeresis: return AK_SEMICOLON;
234: case XK_Adiaeresis: case XK_adiaeresis: return AK_QUOTE;
235: case XK_Udiaeresis: case XK_udiaeresis: return AK_LBRACKET;
236: case XK_plus: case XK_asterisk: return AK_RBRACKET;
237: case XK_comma: return AK_COMMA;
238: case XK_period: return AK_PERIOD;
239: case XK_less: case XK_greater: return AK_LTGT;
240: case XK_numbersign: return AK_NUMBERSIGN;
241: case XK_ssharp: return AK_MINUS;
242: case XK_apostrophe: return AK_EQUAL;
243: case XK_asciicircum: return AK_BACKQUOTE;
244: case XK_minus: return AK_SLASH;
245: }
246:
247: return -1;
248: }
249:
250: static int decode_dk (KeySym ks)
251: {
252: switch(ks) {
253: /* DK specific */
254: case XK_A: case XK_a: return AK_A;
255: case XK_M: case XK_m: return AK_M;
256: case XK_Q: case XK_q: return AK_Q;
257: case XK_W: case XK_w: return AK_W;
258: case XK_Y: case XK_y: return AK_Y;
259: case XK_Z: case XK_z: return AK_Z;
260: case XK_AE: case XK_ae: return AK_SEMICOLON;
261: case XK_Ooblique: case XK_oslash: return AK_QUOTE;
262: case XK_Aring: case XK_aring: return AK_LBRACKET;
263: case XK_apostrophe: case XK_asterisk: return AK_NUMBERSIGN;
264: case XK_dead_diaeresis: case XK_dead_circumflex: return AK_RBRACKET;
265: case XK_dead_acute: case XK_dead_grave: return AK_BACKSLASH;
266: case XK_onehalf: case XK_section: return AK_BACKQUOTE;
267: case XK_comma: return AK_COMMA;
268: case XK_period: return AK_PERIOD;
269: case XK_less: case XK_greater: return AK_LTGT;
270: case XK_numbersign: return AK_NUMBERSIGN;
271: case XK_plus: return AK_MINUS;
272: case XK_asciicircum: return AK_BACKQUOTE;
273: case XK_minus: return AK_SLASH;
274: }
275:
276: return -1;
277: }
278:
279: static int decode_se (KeySym ks)
280: {
281: switch(ks) {
282: /* SE specific */
283: case XK_A: case XK_a: return AK_A;
284: case XK_M: case XK_m: return AK_M;
285: case XK_Q: case XK_q: return AK_Q;
286: case XK_W: case XK_w: return AK_W;
287: case XK_Y: case XK_y: return AK_Y;
288: case XK_Z: case XK_z: return AK_Z;
289: case XK_Odiaeresis: case XK_odiaeresis: return AK_SEMICOLON;
290: case XK_Adiaeresis: case XK_adiaeresis: return AK_QUOTE;
291: case XK_Aring: case XK_aring: return AK_LBRACKET;
292: case XK_comma: return AK_COMMA;
293: case XK_period: return AK_PERIOD;
294: case XK_minus: return AK_SLASH;
295: case XK_less: case XK_greater: return AK_LTGT;
296: case XK_plus: case XK_question: return AK_EQUAL;
297: case XK_at: case XK_onehalf: return AK_BACKQUOTE;
298: case XK_asciitilde: case XK_asciicircum: return AK_RBRACKET;
299: case XK_backslash: case XK_bar: return AK_MINUS;
300:
301: case XK_numbersign: return AK_NUMBERSIGN;
302: }
303:
304: return -1;
305: }
306:
307: static int decode_it (KeySym ks)
308: {
309: switch(ks) {
310: /* IT specific */
311: case XK_A: case XK_a: return AK_A;
312: case XK_M: case XK_m: return AK_M;
313: case XK_Q: case XK_q: return AK_Q;
314: case XK_W: case XK_w: return AK_W;
315: case XK_Y: case XK_y: return AK_Y;
316: case XK_Z: case XK_z: return AK_Z;
317: case XK_Ograve: case XK_ograve: return AK_SEMICOLON;
318: case XK_Agrave: case XK_agrave: return AK_QUOTE;
319: case XK_Egrave: case XK_egrave: return AK_LBRACKET;
320: case XK_plus: case XK_asterisk: return AK_RBRACKET;
321: case XK_comma: return AK_COMMA;
322: case XK_period: return AK_PERIOD;
323: case XK_less: case XK_greater: return AK_LTGT;
324: case XK_backslash: case XK_bar: return AK_BACKQUOTE;
325: case XK_apostrophe: return AK_MINUS;
326: case XK_Igrave: case XK_igrave: return AK_EQUAL;
327: case XK_minus: return AK_SLASH;
328: case XK_numbersign: return AK_NUMBERSIGN;
329: }
330:
331: return -1;
332: }
333:
334: static int decode_es (KeySym ks)
335: {
336: switch(ks) {
337: /* ES specific */
338: case XK_A: case XK_a: return AK_A;
339: case XK_M: case XK_m: return AK_M;
340: case XK_Q: case XK_q: return AK_Q;
341: case XK_W: case XK_w: return AK_W;
342: case XK_Y: case XK_y: return AK_Y;
343: case XK_Z: case XK_z: return AK_Z;
344: case XK_ntilde: case XK_Ntilde: return AK_SEMICOLON;
345: #ifdef XK_dead_acute
346: case XK_dead_acute: case XK_dead_diaeresis: return AK_QUOTE;
347: case XK_dead_grave: case XK_dead_circumflex: return AK_LBRACKET;
348: #endif
349: case XK_plus: case XK_asterisk: return AK_RBRACKET;
350: case XK_comma: return AK_COMMA;
351: case XK_period: return AK_PERIOD;
352: case XK_less: case XK_greater: return AK_LTGT;
353: case XK_backslash: case XK_bar: return AK_BACKQUOTE;
354: case XK_apostrophe: return AK_MINUS;
355: case XK_Igrave: case XK_igrave: return AK_EQUAL;
356: case XK_minus: return AK_SLASH;
357: case XK_numbersign: return AK_NUMBERSIGN;
358: }
359:
360: return -1;
361: }
362:
363: int xkeysym2amiga (KeySym ks)
364: {
365: int as = kc_decode (ks);
366:
367: if (as == -1) {
368: switch (currprefs.keyboard_lang) {
369: case KBD_LANG_FR:
370: as = decode_fr (ks); break;
371: case KBD_LANG_US:
372: as = decode_us (ks); break;
373: case KBD_LANG_DE:
374: as = decode_de (ks); break;
375: case KBD_LANG_DK:
376: as = decode_dk (ks); break;
377: case KBD_LANG_SE:
378: as = decode_se (ks); break;
379: case KBD_LANG_IT:
380: as = decode_it (ks); break;
381: case KBD_LANG_ES:
382: as = decode_es (ks); break;
383: }
384: }
385: return as;
386: }
387:
388: /*
389: * Default hotkeys
390: *
391: * We need a better way of doing this. ;-)
392: */
393: static struct uae_hotkeyseq x11_hotkeys[] =
394: {
395: { MAKE_HOTKEYSEQ (XK_F12, XK_q, -1, -1, INPUTEVENT_SPC_QUIT) },
396: { MAKE_HOTKEYSEQ (XK_F12, XK_r, -1, -1, INPUTEVENT_SPC_SOFTRESET) },
397: { MAKE_HOTKEYSEQ (XK_F12, XK_Shift_L, XK_r, -1, INPUTEVENT_SPC_HARDRESET) },
398: { MAKE_HOTKEYSEQ (XK_F12, XK_d, -1, -1, INPUTEVENT_SPC_ENTERDEBUGGER) },
399: { MAKE_HOTKEYSEQ (XK_F12, XK_s, -1, -1, INPUTEVENT_SPC_TOGGLEFULLSCREEN) },
400: { MAKE_HOTKEYSEQ (XK_F12, XK_g, -1, -1, INPUTEVENT_SPC_TOGGLEMOUSEGRAB) },
401: { MAKE_HOTKEYSEQ (XK_F12, XK_i, -1, -1, INPUTEVENT_SPC_INHIBITSCREEN) },
402: { MAKE_HOTKEYSEQ (XK_F12, XK_p, -1, -1, INPUTEVENT_SPC_SCREENSHOT) },
403: { MAKE_HOTKEYSEQ (XK_F12, XK_a, -1, -1, INPUTEVENT_SPC_SWITCHINTERPOL) },
404: { MAKE_HOTKEYSEQ (XK_F12, XK_KP_Add, -1, -1, INPUTEVENT_SPC_INCREASE_REFRESHRATE) },
405: { MAKE_HOTKEYSEQ (XK_F12, XK_KP_Subtract, -1, -1, INPUTEVENT_SPC_DECREASE_REFRESHRATE) },
406: { MAKE_HOTKEYSEQ (XK_F12, XK_F1, -1, -1, INPUTEVENT_SPC_FLOPPY0) },
407: { MAKE_HOTKEYSEQ (XK_F12, XK_F2, -1, -1, INPUTEVENT_SPC_FLOPPY1) },
408: { MAKE_HOTKEYSEQ (XK_F12, XK_F3, -1, -1, INPUTEVENT_SPC_FLOPPY2) },
409: { MAKE_HOTKEYSEQ (XK_F12, XK_F4, -1, -1, INPUTEVENT_SPC_FLOPPY3) },
410: { MAKE_HOTKEYSEQ (XK_F12, XK_Shift_L, XK_F1, -1, INPUTEVENT_SPC_EFLOPPY0) },
411: { MAKE_HOTKEYSEQ (XK_F12, XK_Shift_L, XK_F2, -1, INPUTEVENT_SPC_EFLOPPY1) },
412: { MAKE_HOTKEYSEQ (XK_F12, XK_Shift_L, XK_F3, -1, INPUTEVENT_SPC_EFLOPPY2) },
413: { MAKE_HOTKEYSEQ (XK_F12, XK_Shift_L, XK_F4, -1, INPUTEVENT_SPC_EFLOPPY3) },
414: { MAKE_HOTKEYSEQ (XK_F12, XK_Return, -1, -1, INPUTEVENT_SPC_ENTERGUI) },
415: { MAKE_HOTKEYSEQ (XK_F12, XK_f, -1, -1, INPUTEVENT_SPC_FREEZEBUTTON) },
416: { HOTKEYS_END }
417: };
418:
419: struct uae_hotkeyseq *get_x11_default_hotkeys (void)
420: {
421: return x11_hotkeys;
422: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.