Git init
[framework/uifw/e17-extra-modules.git] / keyrouter / src / e_mod_main.h
1 #ifndef __E_MOD_MAIN_H__
2 #define __E_MOD_MAIN_H__
3
4 #include <X11/Xlib.h>
5 #include <X11/Xatom.h>
6 #include <X11/extensions/XInput.h>
7 #include <X11/extensions/XInput2.h>
8 #include <X11/extensions/XI2.h>
9 #include <X11/extensions/XIproto.h>
10 #include <X11/extensions/XTest.h>
11 #include <utilX.h>
12
13 //maximum number of hardkeys
14 #define MAX_HARDKEYS    255
15
16 #define POPUP_MENU_WIDTH        95
17 #define POPUP_MENU_HEIGHT       120
18
19 //grab modes
20 #define NONE_GRAB_MODE  0
21 #define OR_EXCL_GRAB_MODE       1
22 #define EXCL_GRAB_MODE          2
23 #define TOP_GRAB_MODE           3
24 #define SHARED_GRAB_MODE        4
25 #define ALL_GRAB_MODE           10
26
27 #define STR_ATOM_DEVICE_STATUS          "_DEVICE_STATUS"
28 #define STR_ATOM_GRAB_STATUS                    "_GRAB_STATUS"
29 #define PROP_X_MOUSE_CURSOR_ENABLE      "X Mouse Cursor Enable"
30 #define PROP_X_MOUSE_EXIST                              "X Mouse Exist"
31 #define PROP_X_EXT_KEYBOARD_EXIST               "X External Keyboard Exist"
32 #define PROP_X_EVDEV_AXIS_LABELS                "Axis Labels"
33
34 //key composition for screen capture
35 #define NUM_COMPOSITION_KEY     2
36 #define KEY_COMPOSITION_TIME 300
37 #define STR_ATOM_XKEY_COMPOSITION       "_XKEY_COMPOSITION"
38
39 #define KEYROUTER_LOG_FILE              "/opt/var/log/keygrab_status.txt"
40
41 typedef struct _keylist_node
42 {
43         Window wid;
44         struct _keylist_node* next;
45 } keylist_node;
46
47 typedef struct
48 {
49         int keycode;
50         char* keyname;
51         E_Binding_Key *bind;
52         Window lastwid;
53         int lastmode;
54         keylist_node* or_excl_ptr;
55         keylist_node* excl_ptr;
56         keylist_node* top_ptr;
57         keylist_node* top_tail;
58         keylist_node* shared_ptr;
59         Window *shared_wins;
60         int num_shared_wins;
61 } GrabbedKey;
62
63 //Enumeration for getting KeyClass
64 enum
65 {
66         INPUTEVENT_KEY_PRESS,
67         INPUTEVENT_KEY_RELEASE,
68         INPUTEVENT_MAX
69 };
70
71 typedef struct _kinfo
72 {
73         KeySym keysym;
74         unsigned int keycode;
75 } kinfo;
76
77 typedef struct _ModifierKey
78 {
79         int set;
80         int composited;
81         int idx_mod;
82         int idx_comp;
83         Time time;
84         kinfo cancel_key;
85         kinfo keys[NUM_COMPOSITION_KEY];
86 } ModifierKey;
87
88 const char *btns_label[] = {
89         "Volume Up",
90         "Volume Down",
91         "Go Home",
92         "Rotate"
93 };
94
95 #define NUM_HWKEYS              17
96 const char *HWKeys[] = {
97         KEY_VOLUMEUP,
98         KEY_VOLUMEDOWN,
99         KEY_CAMERA,
100         KEY_CONFIG,
101         KEY_POWER,
102         KEY_PAUSE,
103         KEY_CANCEL,
104         KEY_SEND,
105         KEY_SELECT,
106         KEY_END,
107         KEY_PLAYCD,
108         KEY_STOPCD,
109         KEY_PAUSECD,
110         KEY_NEXTSONG,
111         KEY_PREVIOUSSONG,
112         KEY_REWIND,
113         KEY_FASTFORWARD
114 };
115
116 typedef enum
117 {
118         E_KEYROUTER_HWKEY= 1,
119         E_KEYROUTER_KEYBOARD,
120         E_KEYROUTER_MOUSE,
121         E_KEYROUTER_TOUCHSCREEN
122 } KeyrouterDeviceType;
123
124 typedef struct _E_Keyrouter_Device_Info E_Keyrouter_Device_Info;
125
126 struct _E_Keyrouter_Device_Info
127 {
128         int id;
129         const char *name;
130         KeyrouterDeviceType type;
131 };
132
133 //global variables will be the member variables of keyrouter structure
134 typedef struct _tag_keyrouter
135 {
136         Ecore_X_Display* disp;
137         Ecore_X_Window rootWin;
138
139         //screen capture related variables
140         ModifierKey modkey;
141
142         //mouse rbutton popup related variables
143         int toggle;
144         int rbutton_pressed_on_popup;
145         int popup_angle;
146         int popup_rootx;
147         int popup_rooty;
148
149         E_Zone *zone;
150         E_Popup     *popup;
151         Evas_Object *popup_btns[4];
152         Evas_Object* popup_bg;
153         unsigned int btn_keys[3];
154
155         //number of connected pointer and keyboard devices
156         int num_pointer_devices;
157         int num_keyboard_devices;
158         int num_hwkey_devices;
159
160         Eina_List *device_list;
161
162         //XInput extension 1 related variables
163         int DeviceKeyPress;
164         int DeviceKeyRelease;
165         int nInputEvent[INPUTEVENT_MAX];
166
167         //XInput extension 2 related variables
168         int xi2_opcode;
169         XIEventMask eventmask_all;
170         XIEventMask eventmask_part;
171         XIEventMask eventmask_0;
172
173         GrabbedKey HardKeys[MAX_HARDKEYS];
174         int isWindowStackChanged;
175         int resTopVisibleCheck;
176
177         struct FILE *fplog;
178
179         //atoms
180         Atom atomPointerType;
181         Atom atomXMouseExist;
182         Atom atomXMouseCursorEnable;
183         Atom atomXExtKeyboardExist;
184         Atom atomGrabKey;
185         Atom atomGrabStatus;
186         Atom atomDeviceStatus;
187         Atom atomGrabExclWin;
188         Atom atomGrabORExclWin;
189
190 #ifdef _F_USE_XI_GRABDEVICE_
191         XEvent *gev;
192         XGenericEventCookie *gcookie;
193 #endif
194
195         //event handlers
196         Ecore_Event_Handler *e_window_property_handler;
197         Ecore_Event_Handler *e_border_stack_handler;
198         Ecore_Event_Handler *e_border_remove_handler;
199         Ecore_Event_Handler *e_window_create_handler;
200         Ecore_Event_Handler *e_window_destroy_handler;
201         Ecore_Event_Handler *e_window_configure_handler;
202         Ecore_Event_Handler *e_window_stack_handler;
203 #ifdef _F_USE_XI_GRABDEVICE_
204         Ecore_Event_Handler *e_event_generic_handler;
205 #else//_F_USE_XI_GRABDEVICE_
206         Ecore_Event_Handler *e_event_generic_handler;
207         Ecore_Event_Handler *e_event_any_handler;
208 #endif//_F_USE_XI_GRABDEVICE_
209 } KeyRouter;
210
211 //function prototypes
212 EAPI extern E_Module_Api e_modapi;
213 EAPI void* e_modapi_init (E_Module* m);
214 EAPI int e_modapi_shutdown (E_Module* m);
215 EAPI int e_modapi_save (E_Module* m);
216
217 static int _e_keyrouter_init();
218 static void _e_keyrouter_fini();
219 static void _e_keyrouter_structure_init();
220 static void _e_keyrouter_bindings_init();
221 static void _e_keyrouter_x_input_init(void);
222
223 //event handlers
224 #ifdef _F_USE_XI_GRABDEVICE_
225 static int _e_keyrouter_cb_event_generic(void *data, int ev_type, void *ev);
226 #else//_F_USE_XI_GRABDEVICE_
227 static int _e_keyrouter_cb_event_generic(void *data, int ev_type, void *event);
228 static int _e_keyrouter_cb_event_any(void *data, int ev_type, void *ev);
229 #endif//_F_USE_XI_GRABDEVICE_
230 //static int _e_keyrouter_cb_e_border_add(void *data, int ev_type, void *ev);
231 static int _e_keyrouter_cb_window_property(void *data, int ev_type, void *ev);
232 static int _e_keyrouter_cb_e_border_stack(void *data, int ev_type, void *ev);
233 static int _e_keyrouter_cb_e_border_remove(void *data, int ev_type, void *ev);
234 static int _e_keyrouter_cb_window_create(void *data, int ev_type, void *ev);
235 static int _e_keyrouter_cb_window_destroy(void *data, int ev_type, void *ev);
236 static int _e_keyrouter_cb_window_configure(void *data, int ev_type, void *ev);
237 static int _e_keyrouter_cb_window_stack(void *data, int ev_type, void *ev);
238 static void _e_keyrouter_xi2_device_hierarchy_handler(XIHierarchyEvent *event);
239 static int _e_keyrouter_is_relative_device(int deviceid);
240 static void _e_keyrouter_device_add(int id, int type);
241 static void _e_keyrouter_device_remove(int id, int type);
242 static void _e_keyrouter_set_keyboard_exist(unsigned int val, int is_connected);
243 static void _e_keyrouter_set_mouse_exist(unsigned int val, int propset);
244 static void _e_keyrouter_mouse_cursor_enable(unsigned int val);
245
246 //e17 bindings functions and action callbacks
247 static int _e_keyrouter_modifiers(E_Binding_Modifier modifiers);
248 static void _e_keyrouter_do_bound_key_action(XEvent *xev);
249
250 #ifdef _F_USE_XI_GRABDEVICE_
251 static void DeliverKeyEvents(XEvent *xev, XGenericEventCookie *cookie);
252 #else//_F_USE_XI_GRABDEVICE_
253 //static void DeliverDeviceKeyEvents(XEvent *xev);
254 static void DeliverDeviceKeyEvents(XEvent *xev, int replace_key);
255 #endif//_F_USE_XI_GRABDEVICE_
256
257 static void InitGrabKeyDevices();
258 #ifdef _F_USE_XI_GRABDEVICE_
259 static int GrabXIKeyDevices();
260 static void UngrabXIKeyDevices();
261 #else//_F_USE_XI_GRABDEVICE_
262 static int GrabKeyDevices(Window win);
263 static void UngrabKeyDevices();
264 #endif//_F_USE_XI_GRABDEVICE_
265
266 //functions related to mouse rbutton popup
267 static void InitHardKeyCodes();
268 static E_Zone* _e_keyrouter_get_zone();
269 static void popup_update();
270 static void popup_show();
271 static void popup_destroy();
272 static void _e_keyrouter_do_hardkey_emulation(const char *label, unsigned int key_event, unsigned int on_release);
273
274 //functions related to key composition for screen capture
275 static void InitModKeys();
276 static void ResetModKeyInfo();
277 static int IsModKey(XEvent *ev);
278 static int IsCompKey(XEvent *ev);
279 static int IsKeyComposited(XEvent *ev);
280 static void DoKeyCompositionAction();
281
282 static void UnSetExclusiveGrabInfoToRootWindow(int keycode, int grab_mode);
283 static int AdjustTopPositionDeliveryList(Window win, int IsOnTop);
284 static int AddWindowToDeliveryList(Window win, int keycode, const int grab_mode, const int IsOnTop);
285 static int RemoveWindowDeliveryList(Window win, int isTopPositionMode, int UnSetExclusiveProperty);
286 static int GetItemFromWindow(Window win, const char* atom_name, unsigned int **key_list);
287
288 static int IsGrabbed(unsigned int keycode);
289 static void detachSlave(int DeviceID);
290 static void reattachSlave(int slave, int master);
291 static void Keygrab_Status(unsigned int val);
292 static void Device_Status(unsigned int val);
293 static void PrintKeyDeliveryList();
294 static void BuildKeyGrabList(Window root);
295 static int GrabKeyDevice(Window win, const char* DeviceName, const int DeviceID);
296
297 #endif//__E_MOD_MAIN_H__
298