1 #ifndef __E_MOD_MAIN_H__
2 #define __E_MOD_MAIN_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>
13 //maximum number of hardkeys
14 #define MAX_HARDKEYS 255
16 #define POPUP_MENU_WIDTH 95
17 #define POPUP_MENU_HEIGHT 120
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
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"
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"
39 #define KEYROUTER_LOG_FILE "/opt/var/log/keygrab_status.txt"
41 typedef struct _keylist_node
44 struct _keylist_node* next;
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;
63 //Enumeration for getting KeyClass
67 INPUTEVENT_KEY_RELEASE,
77 typedef struct _ModifierKey
85 kinfo keys[NUM_COMPOSITION_KEY];
88 const char *btns_label[] = {
96 const char *HWKeys[] = {
118 E_KEYROUTER_HWKEY= 1,
119 E_KEYROUTER_KEYBOARD,
121 E_KEYROUTER_TOUCHSCREEN
122 } KeyrouterDeviceType;
124 typedef struct _E_Keyrouter_Device_Info E_Keyrouter_Device_Info;
126 struct _E_Keyrouter_Device_Info
130 KeyrouterDeviceType type;
133 //global variables will be the member variables of keyrouter structure
134 typedef struct _tag_keyrouter
136 Ecore_X_Display* disp;
137 Ecore_X_Window rootWin;
139 //screen capture related variables
142 //mouse rbutton popup related variables
144 int rbutton_pressed_on_popup;
151 Evas_Object *popup_btns[4];
152 Evas_Object* popup_bg;
153 unsigned int btn_keys[3];
155 //number of connected pointer and keyboard devices
156 int num_pointer_devices;
157 int num_keyboard_devices;
158 int num_hwkey_devices;
160 Eina_List *device_list;
162 //XInput extension 1 related variables
164 int DeviceKeyRelease;
165 int nInputEvent[INPUTEVENT_MAX];
167 //XInput extension 2 related variables
169 XIEventMask eventmask_all;
170 XIEventMask eventmask_part;
171 XIEventMask eventmask_0;
173 GrabbedKey HardKeys[MAX_HARDKEYS];
174 int isWindowStackChanged;
175 int resTopVisibleCheck;
180 Atom atomPointerType;
181 Atom atomXMouseExist;
182 Atom atomXMouseCursorEnable;
183 Atom atomXExtKeyboardExist;
186 Atom atomDeviceStatus;
187 Atom atomGrabExclWin;
188 Atom atomGrabORExclWin;
190 #ifdef _F_USE_XI_GRABDEVICE_
192 XGenericEventCookie *gcookie;
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_
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);
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);
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);
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);
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_
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_
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);
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();
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);
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);
297 #endif//__E_MOD_MAIN_H__