3fb9b1aaa9232c886c94be4aa527f38e955f02df
[profile/ivi/ecore.git] / src / lib / ecore_x / xlib / ecore_x_test.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif /* ifdef HAVE_CONFIG_H */
4
5 #include <stdlib.h>
6
7 #ifdef ECORE_XTEST
8 # include <X11/extensions/XTest.h>
9 #endif /* ifdef ECORE_XTEST */
10
11 #include "ecore_x_private.h"
12 #include "Ecore_X.h"
13 #include <string.h>
14
15 EAPI int
16 ecore_x_test_fake_key_down(const char *key)
17 {
18 #ifdef ECORE_XTEST
19    KeyCode keycode = 0;
20    KeySym keysym;
21
22    LOGFN(__FILE__, __LINE__, __FUNCTION__);
23    if (!strncmp(key, "Keycode-", 8))
24       keycode = atoi(key + 8);
25    else
26      {
27         keysym = XStringToKeysym(key);
28         if (keysym == NoSymbol)
29            return 0;
30
31         keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
32      }
33
34    if (keycode == 0)
35       return 0;
36
37    return XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0);
38 #else /* ifdef ECORE_XTEST */
39    return 0;
40 #endif /* ifdef ECORE_XTEST */
41 } /* ecore_x_test_fake_key_down */
42
43 EAPI int
44 ecore_x_test_fake_key_up(const char *key)
45 {
46 #ifdef ECORE_XTEST
47    KeyCode keycode = 0;
48    KeySym keysym;
49
50    LOGFN(__FILE__, __LINE__, __FUNCTION__);
51    if (!strncmp(key, "Keycode-", 8))
52       keycode = atoi(key + 8);
53    else
54      {
55         keysym = XStringToKeysym(key);
56         if (keysym == NoSymbol)
57            return 0;
58
59         keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
60      }
61
62    if (keycode == 0)
63       return 0;
64
65    return XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0);
66 #else /* ifdef ECORE_XTEST */
67    return 0;
68 #endif /* ifdef ECORE_XTEST */
69 } /* ecore_x_test_fake_key_up */
70
71 EAPI int
72 ecore_x_test_fake_key_press(const char *key)
73 {
74 #ifdef ECORE_XTEST
75    KeyCode keycode = 0;
76    KeySym keysym = 0;
77    int shift = 0;
78
79    LOGFN(__FILE__, __LINE__, __FUNCTION__);
80    if (!strncmp(key, "Keycode-", 8))
81       keycode = atoi(key + 8);
82    else
83      {
84         keysym = XStringToKeysym(key);
85         if (keysym == NoSymbol)
86            return 0;
87
88         keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
89         if (XKeycodeToKeysym(_ecore_x_disp, keycode, 0) != keysym)
90           {
91              if (XKeycodeToKeysym(_ecore_x_disp, keycode, 1) == keysym)
92                 shift = 1;
93              else
94                 keycode = 0;
95           }
96         else
97            shift = 0;
98      }
99
100    if (keycode == 0)
101      {
102         static int mod = 0;
103         KeySym *keysyms;
104         int keycode_min, keycode_max, keycode_num;
105         int i;
106
107         XDisplayKeycodes(_ecore_x_disp, &keycode_min, &keycode_max);
108         keysyms = XGetKeyboardMapping(_ecore_x_disp, keycode_min,
109                                       keycode_max - keycode_min + 1,
110                                       &keycode_num);
111         mod = (mod + 1) & 0x7;
112         i = (keycode_max - keycode_min - mod - 1) * keycode_num;
113
114         keysyms[i] = keysym;
115         XChangeKeyboardMapping(_ecore_x_disp, keycode_min, keycode_num,
116                                keysyms, (keycode_max - keycode_min));
117         XFree(keysyms);
118         XSync(_ecore_x_disp, False);
119         keycode = keycode_max - mod - 1;
120      }
121
122    if (shift)
123       XTestFakeKeyEvent(_ecore_x_disp,
124                         XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 1, 0);
125
126    XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0);
127    XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0);
128    if (shift)
129       XTestFakeKeyEvent(_ecore_x_disp,
130                         XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 0, 0);
131
132    return 1;
133 #else /* ifdef ECORE_XTEST */
134    return 0;
135 #endif /* ifdef ECORE_XTEST */
136 } /* ecore_x_test_fake_key_press */
137
138 EAPI const char *
139 ecore_x_keysym_string_get(int keysym)
140 {
141    return XKeysymToString(keysym);
142 } /* ecore_x_keysym_string_get */
143