1 /*
2  * Copyright (c) 2014 Jared Gonzalez
3  *
4  * Permission is hereby granted, free of charge, to any
5  * person obtaining a copy of this software and associated
6  * documentation files (the "Software"), to deal in the
7  * Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the
10  * Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice
14  * shall be included in all copies or substantial portions of
15  * the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
18  * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
19  * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
20  * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
21  * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  * File:   com_jarego_jayatana_jkey2xkey.c
27  * Author: Jared Gonzalez
28  */
29 #include "com_jarego_jayatana_jkey2xkey.h"
30 
31 #include <stdlib.h>
32 #include <string.h>
33 #include <xkbcommon/xkbcommon.h>
34 /**
35  * Convertir acelerador de menu Java aun acelerador X
36  */
jkeycode_to_xkey_map(int keycode)37 int jkeycode_to_xkey_map(int keycode)
38 {
39 	switch (keycode)
40 	{
41 	case JK_ENTER:
42 		return XKB_KEY_Return;
43 	case JK_BACK_SPACE:
44 		return XKB_KEY_BackSpace;
45 	case JK_TAB:
46 		return XKB_KEY_Tab;
47 	case JK_CANCEL:
48 		return XKB_KEY_Cancel;
49 	case JK_CLEAR:
50 		return XKB_KEY_Clear;
51 	/*case JK_SHIFT: return XKB_KEY_;
52 	 case JK_CONTROL: return XKB_KEY_;
53 	 case JK_ALT: return XKB_KEY_;*/
54 	case JK_PAUSE:
55 		return XKB_KEY_Pause;
56 	case JK_CAPS_LOCK:
57 		return XKB_KEY_Caps_Lock;
58 	case JK_ESCAPE:
59 		return XKB_KEY_Escape;
60 	case JK_SPACE:
61 		return XKB_KEY_space;
62 	case JK_PAGE_UP:
63 		return XKB_KEY_Page_Up;
64 	case JK_PAGE_DOWN:
65 		return XKB_KEY_Page_Down;
66 	case JK_END:
67 		return XKB_KEY_End;
68 	case JK_HOME:
69 		return XKB_KEY_Home;
70 	case JK_LEFT:
71 		return XKB_KEY_Left;
72 	case JK_UP:
73 		return XKB_KEY_Up;
74 	case JK_RIGHT:
75 		return XKB_KEY_Right;
76 	case JK_DOWN:
77 		return XKB_KEY_Down;
78 	case JK_COMMA:
79 		return XKB_KEY_comma;
80 	case JK_MINUS:
81 		return XKB_KEY_minus;
82 	case JK_PERIOD:
83 		return XKB_KEY_period;
84 	case JK_SLASH:
85 		return XKB_KEY_slash;
86 	/*case JK_0: return XKB_KEY_;
87 	 case JK_1: return XKB_KEY_;
88 	 case JK_2: return XKB_KEY_;
89 	 case JK_3: return XKB_KEY_;
90 	 case JK_4: return XKB_KEY_;
91 	 case JK_5: return XKB_KEY_;
92 	 case JK_6: return XKB_KEY_;
93 	 case JK_7: return XKB_KEY_;
94 	 case JK_8: return XKB_KEY_;
95 	 case JK_9: return XKB_KEY_;*/
96 	case JK_SEMICOLON:
97 		return XKB_KEY_semicolon;
98 	case JK_EQUALS:
99 		return XKB_KEY_equal;
100 	/*case JK_A: return XKB_KEY_;
101 	 case JK_B: return XKB_KEY_;
102 	 case JK_C: return XKB_KEY_;
103 	 case JK_D: return XKB_KEY_;
104 	 case JK_E: return XKB_KEY_;
105 	 case JK_F: return XKB_KEY_;
106 	 case JK_G: return XKB_KEY_;
107 	 case JK_H: return XKB_KEY_;
108 	 case JK_I: return XKB_KEY_;
109 	 case JK_J: return XKB_KEY_;
110 	 case JK_K: return XKB_KEY_;
111 	 case JK_L: return XKB_KEY_;
112 	 case JK_M: return XKB_KEY_;
113 	 case JK_N: return XKB_KEY_;
114 	 case JK_O: return XKB_KEY_;
115 	 case JK_P: return XKB_KEY_;
116 	 case JK_Q: return XKB_KEY_;
117 	 case JK_R: return XKB_KEY_;
118 	 case JK_S: return XKB_KEY_;
119 	 case JK_T: return XKB_KEY_;
120 	 case JK_U: return XKB_KEY_;
121 	 case JK_V: return XKB_KEY_;
122 	 case JK_W: return XKB_KEY_;
123 	 case JK_X: return XKB_KEY_;
124 	 case JK_Y: return XKB_KEY_;
125 	 case JK_Z: return XKB_KEY_;*/
126 	case JK_OPEN_BRACKET:
127 		return XKB_KEY_bracketleft;
128 	case JK_BACK_SLASH:
129 		return XKB_KEY_backslash;
130 	case JK_CLOSE_BRACKET:
131 		return XKB_KEY_bracketright;
132 	/*case JK_NUMPAD0: return XKB_KEY_;
133 	 case JK_NUMPAD1: return XKB_KEY_;
134 	 case JK_NUMPAD2: return XKB_KEY_;
135 	 case JK_NUMPAD3: return XKB_KEY_;
136 	 case JK_NUMPAD4: return XKB_KEY_;
137 	 case JK_NUMPAD5: return XKB_KEY_;
138 	 case JK_NUMPAD6: return XKB_KEY_;
139 	 case JK_NUMPAD7: return XKB_KEY_;
140 	 case JK_NUMPAD8: return XKB_KEY_;
141 	 case JK_NUMPAD9: return XKB_KEY_;*/
142 	case JK_MULTIPLY:
143 		return XKB_KEY_multiply;
144 	/*case JK_ADD: return XKB_KEY_;
145 	 case JK_SEPARATER: return XKB_KEY_;
146 	 case JK_SEPARATOR: return XKB_KEY_;
147 	 case JK_SUBTRACT: return XKB_KEY_;
148 	 case JK_DECIMAL: return XKB_KEY_; */
149 	case JK_DIVIDE:
150 		return XKB_KEY_division;
151 	case JK_DELETE:
152 		return XKB_KEY_Delete;
153 	case JK_NUM_LOCK:
154 		return XKB_KEY_Num_Lock;
155 	case JK_SCROLL_LOCK:
156 		return XKB_KEY_Scroll_Lock;
157 	/*case JK_F1: return XKB_KEY_;
158 	 case JK_F2: return XKB_KEY_;
159 	 case JK_F3: return XKB_KEY_;
160 	 case JK_F4: return XKB_KEY_;
161 	 case JK_F5: return XKB_KEY_;
162 	 case JK_F6: return XKB_KEY_;
163 	 case JK_F7: return XKB_KEY_;
164 	 case JK_F8: return XKB_KEY_;
165 	 case JK_F9: return XKB_KEY_;
166 	 case JK_F10: return XKB_KEY_;
167 	 case JK_F11: return XKB_KEY_;
168 	 case JK_F12: return XKB_KEY_;
169 	 case JK_F13: return XKB_KEY_;
170 	 case JK_F14: return XKB_KEY_;
171 	 case JK_F15: return XKB_KEY_;
172 	 case JK_F16: return XKB_KEY_;
173 	 case JK_F17: return XKB_KEY_;
174 	 case JK_F18: return XKB_KEY_;
175 	 case JK_F19: return XKB_KEY_;
176 	 case JK_F20: return XKB_KEY_;
177 	 case JK_F21: return XKB_KEY_;
178 	 case JK_F22: return XKB_KEY_;
179 	 case JK_F23: return XKB_KEY_;
180 	 case JK_F24: return XKB_KEY_;*/
181 	case JK_PRINTSCREEN:
182 		return XKB_KEY_Print;
183 	case JK_INSERT:
184 		return XKB_KEY_Insert;
185 	case JK_HELP:
186 		return XKB_KEY_Help;
187 	case JK_META:
188 		return XKB_KEY_Meta_R;
189 	case JK_BACK_QUOTE:
190 		return XKB_KEY_quoteright;
191 	case JK_QUOTE:
192 		return XKB_KEY_quoteleft;
193 	case JK_KP_UP:
194 		return XKB_KEY_KP_Up;
195 	case JK_KP_DOWN:
196 		return XKB_KEY_KP_Down;
197 	case JK_KP_LEFT:
198 		return XKB_KEY_KP_Left;
199 	case JK_KP_RIGHT:
200 		return XKB_KEY_KP_Right;
201 	case JK_DEAD_GRAVE:
202 		return XKB_KEY_dead_grave;
203 	case JK_DEAD_ACUTE:
204 		return XKB_KEY_dead_acute;
205 	case JK_DEAD_CIRCUMFLEX:
206 		return XKB_KEY_dead_circumflex;
207 	case JK_DEAD_TILDE:
208 		return XKB_KEY_dead_tilde;
209 	case JK_DEAD_MACRON:
210 		return XKB_KEY_dead_macron;
211 	case JK_DEAD_BREVE:
212 		return XKB_KEY_dead_breve;
213 	case JK_DEAD_ABOVEDOT:
214 		return XKB_KEY_dead_abovedot;
215 	case JK_DEAD_DIAERESIS:
216 		return XKB_KEY_dead_diaeresis;
217 	case JK_DEAD_ABOVERING:
218 		return XKB_KEY_dead_abovering;
219 	case JK_DEAD_DOUBLEACUTE:
220 		return XKB_KEY_dead_doubleacute;
221 	case JK_DEAD_CARON:
222 		return XKB_KEY_dead_caron;
223 	case JK_DEAD_CEDILLA:
224 		return XKB_KEY_dead_cedilla;
225 	case JK_DEAD_OGONEK:
226 		return XKB_KEY_dead_ogonek;
227 	case JK_DEAD_IOTA:
228 		return XKB_KEY_dead_iota;
229 	case JK_DEAD_VOICED_SOUND:
230 		return XKB_KEY_dead_voiced_sound;
231 	case JK_DEAD_SEMIVOICED_SOUND:
232 		return XKB_KEY_dead_semivoiced_sound;
233 	case JK_AMPERSAND:
234 		return XKB_KEY_ampersand;
235 	case JK_ASTERISK:
236 		return XKB_KEY_asterisk;
237 	case JK_QUOTEDBL:
238 		return XKB_KEY_quotedbl;
239 	case JK_LESS:
240 		return XKB_KEY_less;
241 	case JK_GREATER:
242 		return XKB_KEY_greater;
243 	case JK_BRACELEFT:
244 		return XKB_KEY_braceleft;
245 	case JK_BRACERIGHT:
246 		return XKB_KEY_braceright;
247 	case JK_AT:
248 		return XKB_KEY_at;
249 	case JK_COLON:
250 		return XKB_KEY_colon;
251 	/* case JK_CIRCUMFLEX: return XKB_KEY_; */
252 	case JK_DOLLAR:
253 		return XKB_KEY_dollar;
254 	case JK_EURO_SIGN:
255 		return XKB_KEY_EuroSign;
256 	case JK_EXCLAMATION_MARK:
257 		return XKB_KEY_exclamdown;
258 	case JK_INVERTED_EXCLAMATION_MARK:
259 		return XKB_KEY_exclam;
260 	case JK_LEFT_PARENTHESIS:
261 		return XKB_KEY_parenleft;
262 	case JK_NUMBER_SIGN:
263 		return XKB_KEY_numbersign;
264 	case JK_PLUS:
265 		return XKB_KEY_plus;
266 	case JK_RIGHT_PARENTHESIS:
267 		return XKB_KEY_parenright;
268 	case JK_UNDERSCORE:
269 		return XKB_KEY_underscore;
270 	case JK_WINDOWS:
271 		return XKB_KEY_Super_L;
272 	/* case JK_CONTEXT_MENU: return XKB_KEY_;
273 	 case K_FINAL: return XKB_KEY_;
274 	 case JK_CONVERT: return XKB_KEY_;
275 	 case JK_NONCONVERT: return XKB_KEY_;
276 	 case JK_ACCEPT: return XKB_KEY_;
277 	 case JK_MODECHANGE: return XKB_KEY_;
278 	 case JK_KANA: return XKB_KEY; */
279 	case JK_KANJI:
280 		return XKB_KEY_Kanji;
281 	/* case JK_ALPHANUMERIC: return XKB_KEY_; */
282 	// case JK_KATAKANA: return XKB_KEY_KATAKANA;
283 	case JK_HIRAGANA:
284 		return XKB_KEY_Hiragana;
285 	/*case JK_FULL_WIDTH: return XKB_KEY_;
286 	 case JK_HALF_WIDTH: return XKB_KEY_;
287 	 case JK_ROMAN_CHARACTERS: return XKB_KEY_;
288 	 case JK_ALL_CANDIDATES: return XKB_KEY_;
289 	 case JK_PREVIOUS_CANDIDATE: return XKB_KEY_; */
290 	case JK_CODE_INPUT:
291 		return XKB_KEY_Codeinput;
292 	// case JK_JAPANESE_KATAKANA: return XKB_KEY_KATAKANA;
293 	case JK_JAPANESE_HIRAGANA:
294 		return XKB_KEY_Hiragana;
295 	/*case JK_JAPANESE_ROMAN: return XKB_KEY_; */
296 	case JK_KANA_LOCK:
297 		return XKB_KEY_Kana_Lock;
298 	/*case JK_INPUT_METHOD_ON_OFF: return XKB_KEY_;
299 	 case JK_CUT: return XKB_KEY_;
300 	 case JK_COPY: return XKB_KEY_;
301 	 case JK_PASTE: return XKB_KEY_;
302 	 case JK_UNDO: return XKB_KEY_;
303 	 case JK_AGAIN: return XKB_KEY_;*/
304 	case JK_FIND:
305 		return XKB_KEY_Find;
306 	/*case JK_PROPS: return XKB_KEY_;
307 	 case JK_STOP: return XKB_KEY_;
308 	 case JK_COMPOSE: return XKB_KEY_;
309 	 case JK_ALT_GRAPH: return XKB_KEY_;*/
310 	case JK_BEGIN:
311 		return XKB_KEY_Begin;
312 	default:
313 		return 0;
314 	}
315 }
316 
317 /**
318  * Convertir acelerador de menu Java aun acelerador X
319  */
jkeycode_to_xkey(int keycode)320 char *jkeycode_to_xkey(int keycode)
321 {
322 	int code = 0;
323 
324 	if (keycode >= JK_A && keycode <= JK_Z)
325 		code = keycode - JK_A + XKB_KEY_A;
326 	else if (keycode >= JK_F1 && keycode <= JK_F12)
327 		code = keycode - JK_F1 + XKB_KEY_F1;
328 	else if (keycode >= JK_0 && keycode <= JK_9)
329 		code = keycode - JK_0 + XKB_KEY_0;
330 	else
331 		code = jkeycode_to_xkey_map(keycode);
332 
333 	if (code == 0)
334 		return NULL;
335 
336 	char ret[40];
337 	size_t rets = xkb_keysym_to_utf8(code, ret, 1024);
338 	char *retf  = (char *)calloc((rets + 1), sizeof(char));
339 	strncpy(retf, ret, rets);
340 	return retf;
341 }
342