ecore: Fix support for intl keyboards
[framework/uifw/ecore.git] / src / lib / ecore_x / xcb / ecore_xcb_private.h
1 #ifndef __ECORE_XCB_PRIVATE_H__
2 # define __ECORE_XCB_PRIVATE_H__
3
4 //# define LOGFNS 1
5
6 # ifdef HAVE_CONFIG_H
7 #  include "config.h"
8 # endif
9
10 # include <unistd.h> // included for close & gethostname functions
11
12 /* generic xcb includes */
13 # include <xcb/xcb.h>
14 # include <xcb/bigreq.h>
15 # include <xcb/shm.h>
16 # include <xcb/xcb_image.h>
17
18 /* EFL includes */
19 # include "Ecore.h"
20 # include "Ecore_Input.h"
21 # include "Ecore_X.h"
22
23 /* logging */
24 extern int _ecore_xcb_log_dom;
25
26 # ifdef ECORE_XCB_DEFAULT_LOG_COLOR
27 #  undef ECORE_XCB_DEFAULT_LOG_COLOR
28 # endif
29 # define ECORE_XCB_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
30
31 # ifdef ERR
32 #  undef ERR
33 # endif
34 # define ERR(...) EINA_LOG_DOM_ERR(_ecore_xcb_log_dom, __VA_ARGS__)
35
36 # ifdef DBG
37 #  undef DBG
38 # endif
39 # define DBG(...) EINA_LOG_DOM_DBG(_ecore_xcb_log_dom, __VA_ARGS__)
40
41 # ifdef INF
42 #  undef INF
43 # endif
44 # define INF(...) EINA_LOG_DOM_INFO(_ecore_xcb_log_dom, __VA_ARGS__)
45
46 # ifdef WRN
47 #  undef WRN
48 # endif
49 # define WRN(...) EINA_LOG_DOM_WARN(_ecore_xcb_log_dom, __VA_ARGS__)
50
51 # ifdef CRIT
52 #  undef CRIT
53 # endif
54 # define CRIT(...)          EINA_LOG_DOM_CRIT(_ecore_xcb_log_dom, __VA_ARGS__)
55
56 # ifdef LOGFNS
57 #  include <stdio.h>
58 #  define LOGFN(fl, ln, fn) printf("-ECORE-XCB: %25s: %5i - %s\n", fl, ln, fn);
59 # else
60 #  define LOGFN(fl, ln, fn)
61 # endif
62
63 # ifndef MAXHOSTNAMELEN
64 #  define MAXHOSTNAMELEN 256
65 # endif
66
67 # ifndef MIN
68 #  define MIN(x, y) (((x) > (y)) ? (y) : (x))
69 # endif
70
71 # ifndef MAX
72 #  define MAX(a, b) ((a < b) ? b : a)
73 # endif
74
75 #define CHECK_XCB_CONN                              \
76   {                                                 \
77      if (xcb_connection_has_error(_ecore_xcb_conn)) \
78        {                                            \
79           DBG("XCB Connection Has Error !!");       \
80           _ecore_xcb_io_error_handle(NULL);         \
81        }                                            \
82   }
83
84 /* enums */
85 typedef enum _Ecore_Xcb_Encoding_Style Ecore_Xcb_Encoding_Style;
86
87 enum _Ecore_Xcb_Encoding_Style
88 {
89    XcbStringStyle,
90    XcbCompoundTextStyle,
91    XcbTextStyle,
92    XcbStdICCTextStyle,
93    XcbUTF8StringStyle
94 };
95
96 /* structures */
97 typedef struct _Ecore_X_DND_Source          Ecore_X_DND_Source;
98 typedef struct _Ecore_X_DND_Target          Ecore_X_DND_Target;
99 typedef struct _Ecore_X_Selection_Intern    Ecore_X_Selection_Intern;
100 typedef struct _Ecore_X_Selection_Converter Ecore_X_Selection_Converter;
101 typedef struct _Ecore_X_Selection_Parser    Ecore_X_Selection_Parser;
102 typedef struct _Ecore_Xcb_Textproperty      Ecore_Xcb_Textproperty;
103
104 struct _Ecore_X_DND_Source
105 {
106    int            version;
107    Ecore_X_Window win, dest;
108
109    enum
110    {
111       ECORE_X_DND_SOURCE_IDLE,
112       ECORE_X_DND_SOURCE_DRAGGING,
113       ECORE_X_DND_SOURCE_DROPPED,
114       ECORE_X_DND_SOURCE_CONVERTING
115    } state;
116
117    struct
118    {
119       short          x, y;
120       unsigned short width, height;
121    } rectangle;
122
123    struct
124    {
125       Ecore_X_Window window;
126       int            x, y;
127    } prev;
128
129    Ecore_X_Time time;
130
131    Ecore_X_Atom action, accepted_action;
132
133    int          will_accept, suppress;
134    int          await_status;
135 };
136
137 struct _Ecore_X_DND_Target
138 {
139    int            version;
140    Ecore_X_Window win, source;
141
142    enum
143    {
144       ECORE_X_DND_TARGET_IDLE,
145       ECORE_X_DND_TARGET_ENTERED
146    } state;
147
148    struct
149    {
150       int x, y;
151    } pos;
152
153    Ecore_X_Time time;
154
155    Ecore_X_Atom action, accepted_action;
156    int          will_accept;
157 };
158
159 struct _Ecore_X_Selection_Intern
160 {
161    Ecore_X_Window win;
162    Ecore_X_Atom   selection;
163    unsigned char *data;
164    int            length;
165    Ecore_X_Time   time;
166 };
167
168 struct _Ecore_X_Selection_Converter
169 {
170    Ecore_X_Atom                 target;
171    Eina_Bool                    (*convert)(char *target,
172                                            void *data,
173                                            int size,
174                                            void **data_ret,
175                                            int *size_ret,
176                                            Ecore_X_Atom *type,
177                                            int *size_type);
178    Ecore_X_Selection_Converter *next;
179 };
180
181 struct _Ecore_X_Selection_Parser
182 {
183    char                     *target;
184    void                     *(*parse)(const char *target, void *data, int size, int format);
185    Ecore_X_Selection_Parser *next;
186 };
187
188 struct _Ecore_Xcb_Textproperty
189 {
190    char        *value;
191    Ecore_X_Atom encoding;
192    unsigned int format, nitems;
193 };
194
195 /* external variables */
196 extern Ecore_X_Connection *_ecore_xcb_conn;
197 extern Ecore_X_Screen *_ecore_xcb_screen;
198 extern double _ecore_xcb_double_click_time;
199 extern int16_t _ecore_xcb_event_last_root_x;
200 extern int16_t _ecore_xcb_event_last_root_y;
201
202 /* external variables for extension events */
203 extern int _ecore_xcb_event_damage;
204 extern int _ecore_xcb_event_randr;
205 extern int _ecore_xcb_event_screensaver;
206 extern int _ecore_xcb_event_shape;
207 extern int _ecore_xcb_event_sync;
208 extern int _ecore_xcb_event_xfixes;
209 extern int _ecore_xcb_event_input;
210 extern int _ecore_xcb_event_gesture;
211
212 extern int ECORE_X_MODIFIER_SHIFT;
213 extern int ECORE_X_MODIFIER_CTRL;
214 extern int ECORE_X_MODIFIER_ALT;
215 extern int ECORE_X_MODIFIER_WIN;
216 extern int ECORE_X_MODIFIER_MODE;
217 extern int ECORE_X_LOCK_SCROLL;
218 extern int ECORE_X_LOCK_NUM;
219 extern int ECORE_X_LOCK_CAPS;
220 extern int ECORE_X_LOCK_SHIFT;
221
222 extern Ecore_X_Atom _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_NUM];
223
224 extern int _ecore_xcb_button_grabs_num;
225 extern int _ecore_xcb_key_grabs_num;
226 extern Ecore_X_Window *_ecore_xcb_button_grabs;
227 extern Ecore_X_Window *_ecore_xcb_key_grabs;
228 extern Eina_Bool (*_ecore_xcb_window_grab_replay_func)(void *data,
229                                                        int type,
230                                                        void *event);
231 extern void *_ecore_xcb_window_grab_replay_data;
232
233 /* private function prototypes */
234 void _ecore_xcb_error_handler_init(void);
235 void _ecore_xcb_error_handler_shutdown(void);
236
237 void _ecore_xcb_atoms_init(void);
238 void _ecore_xcb_atoms_finalize(void);
239
240 void _ecore_xcb_extensions_init(void);
241 void _ecore_xcb_extensions_finalize(void);
242
243 void _ecore_xcb_shape_init(void);
244 void _ecore_xcb_shape_finalize(void);
245
246 void _ecore_xcb_screensaver_init(void);
247 void _ecore_xcb_screensaver_finalize(void);
248
249 void _ecore_xcb_sync_init(void);
250 void _ecore_xcb_sync_finalize(void);
251 void _ecore_xcb_sync_magic_send(int val,
252                                 Ecore_X_Window win);
253
254 void                _ecore_xcb_render_init(void);
255 void                _ecore_xcb_render_finalize(void);
256 Eina_Bool           _ecore_xcb_render_argb_get(void);
257 Eina_Bool           _ecore_xcb_render_anim_get(void);
258 Eina_Bool           _ecore_xcb_render_avail_get(void);
259
260 Eina_Bool           _ecore_xcb_render_visual_supports_alpha(Ecore_X_Visual visual);
261 uint32_t            _ecore_xcb_render_find_visual_id(int type,
262                                                      Eina_Bool check_alpha);
263 Ecore_X_Visual     *_ecore_xcb_render_visual_get(int visual_id);
264
265 void                _ecore_xcb_randr_init(void);
266 void                _ecore_xcb_randr_finalize(void);
267
268 void _ecore_xcb_gesture_init(void);
269 void _ecore_xcb_gesture_finalize(void);
270 void _ecore_xcb_gesture_shutdown(void);
271
272 void                _ecore_xcb_xfixes_init(void);
273 void                _ecore_xcb_xfixes_finalize(void);
274 Eina_Bool           _ecore_xcb_xfixes_avail_get(void);
275
276 void                _ecore_xcb_damage_init(void);
277 void                _ecore_xcb_damage_finalize(void);
278
279 void                _ecore_xcb_composite_init(void);
280 void                _ecore_xcb_composite_finalize(void);
281
282 void                _ecore_xcb_dpms_init(void);
283 void                _ecore_xcb_dpms_finalize(void);
284
285 void                _ecore_xcb_cursor_init(void);
286 void                _ecore_xcb_cursor_finalize(void);
287
288 void                _ecore_xcb_xinerama_init(void);
289 void                _ecore_xcb_xinerama_finalize(void);
290
291 void                _ecore_xcb_dnd_init(void);
292 void                _ecore_xcb_dnd_shutdown(void);
293 Ecore_X_DND_Source *_ecore_xcb_dnd_source_get(void);
294 Ecore_X_DND_Target *_ecore_xcb_dnd_target_get(void);
295 void                _ecore_xcb_dnd_drag(Ecore_X_Window root,
296                                         int x,
297                                         int y);
298
299 void  _ecore_xcb_selection_init(void);
300 void  _ecore_xcb_selection_shutdown(void);
301 void *_ecore_xcb_selection_parse(const char *target,
302                                  void *data,
303                                  int size,
304                                  int format);
305 char                     *_ecore_xcb_selection_target_get(Ecore_X_Atom target);
306 Ecore_X_Selection_Intern *_ecore_xcb_selection_get(Ecore_X_Atom selection);
307
308 # ifdef HAVE_ICONV
309 Eina_Bool _ecore_xcb_utf8_textlist_to_textproperty(char **list,
310                                                    int count,
311                                                    Ecore_Xcb_Encoding_Style style,
312                                                    Ecore_Xcb_Textproperty *ret);
313 # endif
314 Eina_Bool _ecore_xcb_mb_textlist_to_textproperty(char **list,
315                                                  int count,
316                                                  Ecore_Xcb_Encoding_Style style,
317                                                  Ecore_Xcb_Textproperty *ret);
318 Eina_Bool _ecore_xcb_textlist_to_textproperty(const char *type,
319                                               char **list,
320                                               int count,
321                                               Ecore_Xcb_Encoding_Style style,
322                                               Ecore_Xcb_Textproperty *ret);
323
324 # ifdef HAVE_ICONV
325 Eina_Bool _ecore_xcb_utf8_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
326                                                    char ***list_ret,
327                                                    int *count_ret);
328 # endif
329 Eina_Bool _ecore_xcb_mb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
330                                                  char ***list_ret,
331                                                  int *count_ret);
332 Eina_Bool _ecore_xcb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
333                                               const char *type,
334                                               char ***list_ret,
335                                               int *count_ret);
336
337 void         _ecore_xcb_events_init(void);
338 void         _ecore_xcb_events_shutdown(void);
339 void         _ecore_xcb_events_handle(xcb_generic_event_t *ev);
340 Ecore_X_Time _ecore_xcb_events_last_time_get(void);
341 unsigned int _ecore_xcb_events_modifiers_get(unsigned int state);
342 void         _ecore_xcb_event_mouse_move(uint16_t timestamp,
343                                          uint16_t modifiers,
344                                          int16_t x,
345                                          int16_t y,
346                                          int16_t root_x,
347                                          int16_t root_y,
348                                          xcb_window_t event_win,
349                                          xcb_window_t win,
350                                          xcb_window_t root_win,
351                                          uint8_t same_screen,
352                                          int dev,
353                                          double radx,
354                                          double rady,
355                                          double pressure,
356                                          double angle,
357                                          int16_t mx,
358                                          int16_t my,
359                                          int16_t mrx,
360                                          int16_t mry);
361 Ecore_Event_Mouse_Button *_ecore_xcb_event_mouse_button(int event,
362                                                         uint16_t timestamp,
363                                                         uint16_t modifiers,
364                                                         xcb_button_t buttons,
365                                                         int16_t x,
366                                                         int16_t y,
367                                                         int16_t root_x,
368                                                         int16_t root_y,
369                                                         xcb_window_t event_win,
370                                                         xcb_window_t win,
371                                                         xcb_window_t root_win,
372                                                         uint8_t same_screen,
373                                                         int dev,
374                                                         double radx,
375                                                         double rady,
376                                                         double pressure,
377                                                         double angle,
378                                                         int16_t mx,
379                                                         int16_t my,
380                                                         int16_t mrx,
381                                                         int16_t mry);
382
383 void           _ecore_xcb_keymap_init(void);
384 void           _ecore_xcb_keymap_finalize(void);
385 void           _ecore_xcb_keymap_shutdown(void);
386 void           _ecore_xcb_keymap_refresh(xcb_mapping_notify_event_t *event);
387 xcb_keysym_t   _ecore_xcb_keymap_keycode_to_keysym(xcb_keycode_t keycode,
388                                                    int col);
389 xcb_keycode_t *_ecore_xcb_keymap_keysym_to_keycode(xcb_keysym_t keysym);
390 char          *_ecore_xcb_keymap_keysym_to_string(xcb_keysym_t keysym);
391 xcb_keycode_t  _ecore_xcb_keymap_string_to_keycode(const char *key);
392 int            _ecore_xcb_keymap_lookup_string(xcb_keycode_t keycode,
393                                                int state,
394                                                char *buffer,
395                                                int bytes,
396                                                xcb_keysym_t *sym);
397
398 void _ecore_xcb_input_init(void);
399 void _ecore_xcb_input_finalize(void);
400 void _ecore_xcb_input_shutdown(void);
401 # ifdef ECORE_XCB_XINPUT
402 void _ecore_xcb_input_handle_event(xcb_generic_event_t *event);
403 # else
404 void _ecore_xcb_input_handle_event(xcb_generic_event_t *event __UNUSED__);
405 # endif
406
407 void           _ecore_xcb_dri_init(void);
408 void           _ecore_xcb_dri_finalize(void);
409
410 void           _ecore_xcb_xtest_init(void);
411 void           _ecore_xcb_xtest_finalize(void);
412
413 Ecore_X_Window _ecore_xcb_window_root_of_screen_get(int screen);
414 void           _ecore_xcb_window_prop_string_utf8_set(Ecore_X_Window win,
415                                                       Ecore_X_Atom atom,
416                                                       const char *str);
417 Ecore_X_Visual _ecore_xcb_window_visual_get(Ecore_X_Window win);
418 void           _ecore_xcb_window_button_grab_remove(Ecore_X_Window win);
419 void           _ecore_xcb_window_key_grab_remove(Ecore_X_Window win);
420 void           _ecore_xcb_window_grab_allow_events(Ecore_X_Window event_win,
421                                                    Ecore_X_Window child_win,
422                                                    int type,
423                                                    void *event,
424                                                    Ecore_X_Time timestamp);
425
426 int                  _ecore_xcb_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
427                                                          uint8_t data __UNUSED__);
428 int                  _ecore_xcb_netwm_startup_info(Ecore_X_Window win __UNUSED__,
429                                                    uint8_t data __UNUSED__);
430 Ecore_X_Window_State _ecore_xcb_netwm_window_state_get(Ecore_X_Atom atom);
431
432 int                  _ecore_xcb_error_handle(xcb_generic_error_t *err);
433 int                  _ecore_xcb_io_error_handle(xcb_generic_error_t *err);
434
435 xcb_image_t         *_ecore_xcb_image_create_native(int w,
436                                                     int h,
437                                                     xcb_image_format_t format,
438                                                     uint8_t depth,
439                                                     void *base,
440                                                     uint32_t bytes,
441                                                     uint8_t *data);
442
443 void  _ecore_xcb_xdefaults_init(void);
444 void  _ecore_xcb_xdefaults_shutdown(void);
445 char *_ecore_xcb_xdefaults_string_get(const char *prog,
446                                       const char *param);
447 int   _ecore_xcb_xdefaults_int_get(const char *prog,
448                                    const char *param);
449
450 void _ecore_xcb_modifiers_get(void);
451
452 #endif