svn update: 48958 (latest:48959)
[framework/uifw/ecore.git] / src / lib / ecore_x / xlib / ecore_x_test.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif
8
9 #include <stdlib.h>
10
11 #ifdef ECORE_XTEST
12 # include <X11/extensions/XTest.h>
13 #endif
14
15 #include "ecore_x_private.h"
16 #include "Ecore_X.h"
17 #include <string.h>
18
19
20 EAPI int
21 ecore_x_test_fake_key_down(const char *key)
22 {
23 #ifdef ECORE_XTEST
24    KeyCode             keycode = 0;
25    KeySym              keysym;
26    
27    LOGFN(__FILE__, __LINE__, __FUNCTION__);
28    if (!strncmp(key, "Keycode-", 8))
29      keycode = atoi(key + 8);
30    else
31      {
32         keysym = XStringToKeysym(key);
33         if (keysym == NoSymbol) return 0;
34         keycode  = XKeysymToKeycode(_ecore_x_disp, keysym);
35      }
36    if (keycode == 0) return 0;
37    return XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0);
38 #else
39    return 0;
40 #endif
41 }
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) return 0;
57         keycode  = XKeysymToKeycode(_ecore_x_disp, keysym);
58      }
59    if (keycode == 0) return 0;
60    return XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0);
61 #else
62    return 0;
63 #endif
64 }
65
66 EAPI int
67 ecore_x_test_fake_key_press(const char *key)
68 {
69 #ifdef ECORE_XTEST
70    KeyCode             keycode = 0;
71    KeySym              keysym = 0;
72    int                 shift = 0;
73    
74    LOGFN(__FILE__, __LINE__, __FUNCTION__);
75    if (!strncmp(key, "Keycode-", 8))
76      keycode = atoi(key + 8);
77    else
78      {
79         keysym = XStringToKeysym(key);
80         if (keysym == NoSymbol) return 0;
81         keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
82         if (XKeycodeToKeysym(_ecore_x_disp, keycode, 0) != keysym)
83           {  
84              if (XKeycodeToKeysym(_ecore_x_disp, keycode, 1) == keysym)
85                shift = 1;
86              else
87                keycode = 0;
88           }
89         else
90           shift = 0;
91      }
92    if (keycode == 0)
93      {
94         static int mod = 0;
95         KeySym *keysyms;
96         int keycode_min, keycode_max, keycode_num;
97         int i;  
98
99         XDisplayKeycodes(_ecore_x_disp, &keycode_min, &keycode_max);
100         keysyms = XGetKeyboardMapping(_ecore_x_disp, keycode_min,
101                                       keycode_max - keycode_min + 1,
102                                       &keycode_num);
103         mod = (mod + 1) & 0x7;
104         i = (keycode_max - keycode_min - mod - 1) * keycode_num;
105         
106         keysyms[i] = keysym;
107         XChangeKeyboardMapping(_ecore_x_disp, keycode_min, keycode_num,
108                                keysyms, (keycode_max - keycode_min));
109         XFree(keysyms);
110         XSync(_ecore_x_disp, False);
111         keycode = keycode_max - mod - 1;
112      }
113    if (shift)
114      XTestFakeKeyEvent(_ecore_x_disp, 
115                        XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 1, 0);
116    XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0);
117    XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0);
118    if (shift)
119      XTestFakeKeyEvent(_ecore_x_disp, 
120                        XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 0, 0);
121    return 1;
122 #else
123    return 0;
124 #endif
125 }
126
127 EAPI const char *
128 ecore_x_keysym_string_get(int keysym)
129 {
130    return XKeysymToString(keysym);
131 }