diff options
Diffstat (limited to '')
-rw-r--r-- | libraries/ecore/src/lib/ecore_x/xlib/ecore_x.c | 2098 |
1 files changed, 2098 insertions, 0 deletions
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x.c new file mode 100644 index 0000000..844ab04 --- /dev/null +++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x.c | |||
@@ -0,0 +1,2098 @@ | |||
1 | #ifdef HAVE_CONFIG_H | ||
2 | # include <config.h> | ||
3 | #endif /* ifdef HAVE_CONFIG_H */ | ||
4 | |||
5 | #include <stdlib.h> | ||
6 | #include <string.h> | ||
7 | #include <unistd.h> | ||
8 | |||
9 | //#define LOGRT 1 | ||
10 | |||
11 | #ifdef LOGRT | ||
12 | #include <dlfcn.h> | ||
13 | #endif /* ifdef LOGRT */ | ||
14 | |||
15 | #include "Ecore.h" | ||
16 | #include "ecore_private.h" | ||
17 | #include "ecore_x_private.h" | ||
18 | #include "Ecore_X.h" | ||
19 | #include "Ecore_X_Atoms.h" | ||
20 | #include "Ecore_Input.h" | ||
21 | |||
22 | static Eina_Bool _ecore_x_fd_handler(void *data, | ||
23 | Ecore_Fd_Handler *fd_handler); | ||
24 | static Eina_Bool _ecore_x_fd_handler_buf(void *data, | ||
25 | Ecore_Fd_Handler *fd_handler); | ||
26 | static int _ecore_x_key_mask_get(KeySym sym); | ||
27 | static int _ecore_x_event_modifier(unsigned int state); | ||
28 | |||
29 | static Ecore_Fd_Handler *_ecore_x_fd_handler_handle = NULL; | ||
30 | |||
31 | static const int AnyXEvent = 0; /* 0 can be used as there are no event types | ||
32 | * with index 0 and 1 as they are used for | ||
33 | * errors | ||
34 | */ | ||
35 | |||
36 | static int _ecore_x_event_shape_id = 0; | ||
37 | static int _ecore_x_event_screensaver_id = 0; | ||
38 | static int _ecore_x_event_sync_id = 0; | ||
39 | int _ecore_xlib_log_dom = -1; | ||
40 | |||
41 | #ifdef ECORE_XRANDR | ||
42 | static int _ecore_x_event_randr_id = 0; | ||
43 | #endif /* ifdef ECORE_XRANDR */ | ||
44 | #ifdef ECORE_XFIXES | ||
45 | static int _ecore_x_event_fixes_selection_id = 0; | ||
46 | #endif /* ifdef ECORE_XFIXES */ | ||
47 | #ifdef ECORE_XDAMAGE | ||
48 | static int _ecore_x_event_damage_id = 0; | ||
49 | #endif /* ifdef ECORE_XDAMAGE */ | ||
50 | #ifdef ECORE_XGESTURE | ||
51 | static int _ecore_x_event_gesture_id = 0; | ||
52 | #endif /* ifdef ECORE_XGESTURE */ | ||
53 | static int _ecore_x_event_handlers_num = 0; | ||
54 | static void (**_ecore_x_event_handlers) (XEvent * event) = NULL; | ||
55 | |||
56 | static int _ecore_x_init_count = 0; | ||
57 | static int _ecore_x_grab_count = 0; | ||
58 | |||
59 | Display *_ecore_x_disp = NULL; | ||
60 | double _ecore_x_double_click_time = 0.25; | ||
61 | Time _ecore_x_event_last_time = 0; | ||
62 | Window _ecore_x_event_last_win = 0; | ||
63 | int _ecore_x_event_last_root_x = 0; | ||
64 | int _ecore_x_event_last_root_y = 0; | ||
65 | Eina_Bool _ecore_x_xcursor = EINA_FALSE; | ||
66 | |||
67 | Ecore_X_Window _ecore_x_private_win = 0; | ||
68 | |||
69 | Ecore_X_Atom _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM]; | ||
70 | |||
71 | EAPI int ECORE_X_EVENT_ANY = 0; | ||
72 | EAPI int ECORE_X_EVENT_MOUSE_IN = 0; | ||
73 | EAPI int ECORE_X_EVENT_MOUSE_OUT = 0; | ||
74 | EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN = 0; | ||
75 | EAPI int ECORE_X_EVENT_WINDOW_FOCUS_OUT = 0; | ||
76 | EAPI int ECORE_X_EVENT_WINDOW_KEYMAP = 0; | ||
77 | EAPI int ECORE_X_EVENT_WINDOW_DAMAGE = 0; | ||
78 | EAPI int ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = 0; | ||
79 | EAPI int ECORE_X_EVENT_WINDOW_CREATE = 0; | ||
80 | EAPI int ECORE_X_EVENT_WINDOW_DESTROY = 0; | ||
81 | EAPI int ECORE_X_EVENT_WINDOW_HIDE = 0; | ||
82 | EAPI int ECORE_X_EVENT_WINDOW_SHOW = 0; | ||
83 | EAPI int ECORE_X_EVENT_WINDOW_SHOW_REQUEST = 0; | ||
84 | EAPI int ECORE_X_EVENT_WINDOW_REPARENT = 0; | ||
85 | EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE = 0; | ||
86 | EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = 0; | ||
87 | EAPI int ECORE_X_EVENT_WINDOW_GRAVITY = 0; | ||
88 | EAPI int ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = 0; | ||
89 | EAPI int ECORE_X_EVENT_WINDOW_STACK = 0; | ||
90 | EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST = 0; | ||
91 | EAPI int ECORE_X_EVENT_WINDOW_PROPERTY = 0; | ||
92 | EAPI int ECORE_X_EVENT_WINDOW_COLORMAP = 0; | ||
93 | EAPI int ECORE_X_EVENT_WINDOW_MAPPING = 0; | ||
94 | EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0; | ||
95 | EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0; | ||
96 | EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0; | ||
97 | EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0; | ||
98 | EAPI int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = 0; | ||
99 | EAPI int ECORE_X_EVENT_CLIENT_MESSAGE = 0; | ||
100 | EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0; | ||
101 | EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0; | ||
102 | EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_FLICK; | ||
103 | EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PAN; | ||
104 | EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION; | ||
105 | EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAP; | ||
106 | EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD; | ||
107 | EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_HOLD; | ||
108 | EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_GROUP; | ||
109 | EAPI int ECORE_X_EVENT_SYNC_COUNTER = 0; | ||
110 | EAPI int ECORE_X_EVENT_SYNC_ALARM = 0; | ||
111 | EAPI int ECORE_X_EVENT_SCREEN_CHANGE = 0; | ||
112 | EAPI int ECORE_X_EVENT_DAMAGE_NOTIFY = 0; | ||
113 | EAPI int ECORE_X_EVENT_RANDR_CRTC_CHANGE = 0; | ||
114 | EAPI int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = 0; | ||
115 | EAPI int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = 0; | ||
116 | EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST = 0; | ||
117 | EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0; | ||
118 | EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST = 0; | ||
119 | EAPI int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = 0; | ||
120 | EAPI int ECORE_X_EVENT_PING = 0; | ||
121 | EAPI int ECORE_X_EVENT_DESKTOP_CHANGE = 0; | ||
122 | |||
123 | EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = 0; | ||
124 | EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = 0; | ||
125 | EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = 0; | ||
126 | |||
127 | EAPI int ECORE_X_EVENT_GENERIC = 0; | ||
128 | |||
129 | int ECORE_X_MODIFIER_SHIFT = 0; | ||
130 | int ECORE_X_MODIFIER_CTRL = 0; | ||
131 | int ECORE_X_MODIFIER_ALT = 0; | ||
132 | int ECORE_X_MODIFIER_WIN = 0; | ||
133 | |||
134 | EAPI int ECORE_X_LOCK_SCROLL = 0; | ||
135 | EAPI int ECORE_X_LOCK_NUM = 0; | ||
136 | EAPI int ECORE_X_LOCK_CAPS = 0; | ||
137 | EAPI int ECORE_X_LOCK_SHIFT = 0; | ||
138 | |||
139 | #ifdef LOGRT | ||
140 | static double t0 = 0.0; | ||
141 | static Status (*_logrt_real_reply)(Display *disp, | ||
142 | void *rep, | ||
143 | int extra, | ||
144 | Bool discard) = NULL; | ||
145 | static void | ||
146 | _logrt_init(void) | ||
147 | { | ||
148 | void *lib; | ||
149 | |||
150 | lib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); | ||
151 | if (!lib) | ||
152 | lib = dlopen("libX11.so.6", RTLD_GLOBAL | RTLD_LAZY); | ||
153 | |||
154 | if (!lib) | ||
155 | lib = dlopen("libX11.so.6.3", RTLD_GLOBAL | RTLD_LAZY); | ||
156 | |||
157 | if (!lib) | ||
158 | lib = dlopen("libX11.so.6.3.0", RTLD_GLOBAL | RTLD_LAZY); | ||
159 | |||
160 | _logrt_real_reply = dlsym(lib, "_XReply"); | ||
161 | t0 = ecore_time_get(); | ||
162 | } /* _logrt_init */ | ||
163 | |||
164 | Status | ||
165 | _XReply(Display *disp, | ||
166 | void *rep, | ||
167 | int extra, | ||
168 | Bool discard) | ||
169 | { | ||
170 | void *bt[128]; | ||
171 | int i, n; | ||
172 | char **sym; | ||
173 | |||
174 | n = backtrace(bt, 128); | ||
175 | if (n > 0) | ||
176 | { | ||
177 | sym = backtrace_symbols(bt, n); | ||
178 | printf("ROUNDTRIP: %4.4f :", ecore_time_get() - t0); | ||
179 | if (sym) | ||
180 | { | ||
181 | for (i = n - 1; i > 0; i--) | ||
182 | { | ||
183 | char *fname = strchr(sym[i], '('); | ||
184 | if (fname) | ||
185 | { | ||
186 | char *tsym = alloca(strlen(fname) + 1); | ||
187 | char *end; | ||
188 | strcpy(tsym, fname + 1); | ||
189 | end = strchr(tsym, '+'); | ||
190 | if (end) | ||
191 | { | ||
192 | *end = 0; | ||
193 | printf("%s", tsym); | ||
194 | } | ||
195 | else | ||
196 | printf("???"); | ||
197 | } | ||
198 | else | ||
199 | printf("???"); | ||
200 | |||
201 | if (i > 1) | ||
202 | printf(" > "); | ||
203 | } | ||
204 | printf("\n"); | ||
205 | } | ||
206 | } | ||
207 | |||
208 | // fixme: logme | ||
209 | return _logrt_real_reply(disp, rep, extra, discard); | ||
210 | } /* _XReply */ | ||
211 | |||
212 | #endif /* ifdef LOGRT */ | ||
213 | |||
214 | void | ||
215 | _ecore_x_modifiers_get(void) | ||
216 | { | ||
217 | /* everything has these... unless its like a pda... :) */ | ||
218 | ECORE_X_MODIFIER_SHIFT = _ecore_x_key_mask_get(XK_Shift_L); | ||
219 | ECORE_X_MODIFIER_CTRL = _ecore_x_key_mask_get(XK_Control_L); | ||
220 | |||
221 | /* apple's xdarwin has no alt!!!! */ | ||
222 | ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Alt_L); | ||
223 | if (!ECORE_X_MODIFIER_ALT) | ||
224 | ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Meta_L); | ||
225 | |||
226 | if (!ECORE_X_MODIFIER_ALT) | ||
227 | ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Super_L); | ||
228 | |||
229 | /* the windows key... a valid modifier :) */ | ||
230 | ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Super_L); | ||
231 | if (!ECORE_X_MODIFIER_WIN) | ||
232 | ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Mode_switch); | ||
233 | |||
234 | if (!ECORE_X_MODIFIER_WIN) | ||
235 | ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Meta_L); | ||
236 | |||
237 | if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT) | ||
238 | ECORE_X_MODIFIER_WIN = 0; | ||
239 | |||
240 | if (ECORE_X_MODIFIER_ALT == ECORE_X_MODIFIER_CTRL) | ||
241 | ECORE_X_MODIFIER_ALT = 0; | ||
242 | |||
243 | ECORE_X_LOCK_SCROLL = _ecore_x_key_mask_get(XK_Scroll_Lock); | ||
244 | ECORE_X_LOCK_NUM = _ecore_x_key_mask_get(XK_Num_Lock); | ||
245 | ECORE_X_LOCK_CAPS = _ecore_x_key_mask_get(XK_Caps_Lock); | ||
246 | ECORE_X_LOCK_SHIFT = _ecore_x_key_mask_get(XK_Shift_Lock); | ||
247 | } | ||
248 | |||
249 | /** | ||
250 | * @defgroup Ecore_X_Init_Group X Library Init and Shutdown Functions | ||
251 | * | ||
252 | * Functions that start and shut down the Ecore X Library. | ||
253 | */ | ||
254 | |||
255 | /** | ||
256 | * Initialize the X display connection to the given display. | ||
257 | * | ||
258 | * @param name Display target name. If @c NULL, the default display is | ||
259 | * assumed. | ||
260 | * @return The number of times the library has been initialized without | ||
261 | * being shut down. 0 is returned if an error occurs. | ||
262 | * @ingroup Ecore_X_Init_Group | ||
263 | */ | ||
264 | EAPI int | ||
265 | ecore_x_init(const char *name) | ||
266 | { | ||
267 | int shape_base = 0; | ||
268 | int shape_err_base = 0; | ||
269 | #ifdef ECORE_XSS | ||
270 | int screensaver_base = 0; | ||
271 | int screensaver_err_base = 0; | ||
272 | #endif /* ifdef ECORE_XSS */ | ||
273 | int sync_base = 0; | ||
274 | int sync_err_base = 0; | ||
275 | #ifdef ECORE_XRANDR | ||
276 | int randr_base = 0; | ||
277 | int randr_err_base = 0; | ||
278 | #endif /* ifdef ECORE_XRANDR */ | ||
279 | #ifdef ECORE_XFIXES | ||
280 | int fixes_base = 0; | ||
281 | int fixes_err_base = 0; | ||
282 | #endif /* ifdef ECORE_XFIXES */ | ||
283 | #ifdef ECORE_XDAMAGE | ||
284 | int damage_base = 0; | ||
285 | int damage_err_base = 0; | ||
286 | #endif /* ifdef ECORE_XDAMAGE */ | ||
287 | #ifdef ECORE_XGESTURE | ||
288 | int gesture_base = 0; | ||
289 | int gesture_err_base = 0; | ||
290 | #endif /* ifdef ECORE_XGESTURE */ | ||
291 | |||
292 | if (++_ecore_x_init_count != 1) | ||
293 | return _ecore_x_init_count; | ||
294 | |||
295 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
296 | #ifdef LOGRT | ||
297 | _logrt_init(); | ||
298 | #endif /* ifdef LOGRT */ | ||
299 | |||
300 | eina_init(); | ||
301 | _ecore_xlib_log_dom = eina_log_domain_register | ||
302 | ("ecore_x", ECORE_XLIB_DEFAULT_LOG_COLOR); | ||
303 | if(_ecore_xlib_log_dom < 0) | ||
304 | { | ||
305 | EINA_LOG_ERR( | ||
306 | "Impossible to create a log domain for the Ecore Xlib module."); | ||
307 | return --_ecore_x_init_count; | ||
308 | } | ||
309 | |||
310 | if (!ecore_init()) | ||
311 | goto shutdown_eina; | ||
312 | if (!ecore_event_init()) | ||
313 | goto shutdown_ecore; | ||
314 | |||
315 | #ifdef EVAS_FRAME_QUEUING | ||
316 | XInitThreads(); | ||
317 | #endif /* ifdef EVAS_FRAME_QUEUING */ | ||
318 | _ecore_x_disp = XOpenDisplay((char *)name); | ||
319 | if (!_ecore_x_disp) | ||
320 | goto shutdown_ecore_event; | ||
321 | |||
322 | _ecore_x_error_handler_init(); | ||
323 | _ecore_x_event_handlers_num = LASTEvent; | ||
324 | |||
325 | #define ECORE_X_EVENT_HANDLERS_GROW(ext_base, ext_num_events) \ | ||
326 | do { \ | ||
327 | if (_ecore_x_event_handlers_num < (ext_base + ext_num_events)) { \ | ||
328 | _ecore_x_event_handlers_num = (ext_base + ext_num_events); } \ | ||
329 | } while (0) | ||
330 | |||
331 | if (XShapeQueryExtension(_ecore_x_disp, &shape_base, &shape_err_base)) | ||
332 | _ecore_x_event_shape_id = shape_base; | ||
333 | |||
334 | ECORE_X_EVENT_HANDLERS_GROW(shape_base, ShapeNumberEvents); | ||
335 | |||
336 | #ifdef ECORE_XSS | ||
337 | if (XScreenSaverQueryExtension(_ecore_x_disp, &screensaver_base, | ||
338 | &screensaver_err_base)) | ||
339 | _ecore_x_event_screensaver_id = screensaver_base; | ||
340 | |||
341 | ECORE_X_EVENT_HANDLERS_GROW(screensaver_base, ScreenSaverNumberEvents); | ||
342 | #endif /* ifdef ECORE_XSS */ | ||
343 | |||
344 | if (XSyncQueryExtension(_ecore_x_disp, &sync_base, &sync_err_base)) | ||
345 | { | ||
346 | int major, minor; | ||
347 | |||
348 | _ecore_x_event_sync_id = sync_base; | ||
349 | if (!XSyncInitialize(_ecore_x_disp, &major, &minor)) | ||
350 | _ecore_x_event_sync_id = 0; | ||
351 | } | ||
352 | |||
353 | ECORE_X_EVENT_HANDLERS_GROW(sync_base, XSyncNumberEvents); | ||
354 | |||
355 | #ifdef ECORE_XRANDR | ||
356 | if (XRRQueryExtension(_ecore_x_disp, &randr_base, &randr_err_base)) | ||
357 | _ecore_x_event_randr_id = randr_base; | ||
358 | |||
359 | ECORE_X_EVENT_HANDLERS_GROW(randr_base, RRNumberEvents); | ||
360 | #endif /* ifdef ECORE_XRANDR */ | ||
361 | |||
362 | #ifdef ECORE_XFIXES | ||
363 | if (XFixesQueryExtension(_ecore_x_disp, &fixes_base, &fixes_err_base)) | ||
364 | _ecore_x_event_fixes_selection_id = fixes_base; | ||
365 | |||
366 | ECORE_X_EVENT_HANDLERS_GROW(fixes_base, XFixesNumberEvents); | ||
367 | #endif /* ifdef ECORE_XFIXES */ | ||
368 | |||
369 | #ifdef ECORE_XDAMAGE | ||
370 | if (XDamageQueryExtension(_ecore_x_disp, &damage_base, &damage_err_base)) | ||
371 | _ecore_x_event_damage_id = damage_base; | ||
372 | |||
373 | ECORE_X_EVENT_HANDLERS_GROW(damage_base, XDamageNumberEvents); | ||
374 | #endif /* ifdef ECORE_XDAMAGE */ | ||
375 | |||
376 | #ifdef ECORE_XGESTURE | ||
377 | if (XGestureQueryExtension(_ecore_x_disp, &gesture_base, &gesture_err_base)) | ||
378 | _ecore_x_event_gesture_id = gesture_base; | ||
379 | |||
380 | ECORE_X_EVENT_HANDLERS_GROW(gesture_base, GestureNumberEvents); | ||
381 | #endif /* ifdef ECORE_XGESTURE */ | ||
382 | |||
383 | _ecore_x_event_handlers = calloc(_ecore_x_event_handlers_num, sizeof(void *)); | ||
384 | if (!_ecore_x_event_handlers) | ||
385 | goto close_display; | ||
386 | |||
387 | #ifdef ECORE_XCURSOR | ||
388 | _ecore_x_xcursor = XcursorSupportsARGB(_ecore_x_disp) ? EINA_TRUE : EINA_FALSE; | ||
389 | #endif /* ifdef ECORE_XCURSOR */ | ||
390 | _ecore_x_event_handlers[AnyXEvent] = _ecore_x_event_handle_any_event; | ||
391 | _ecore_x_event_handlers[KeyPress] = _ecore_x_event_handle_key_press; | ||
392 | _ecore_x_event_handlers[KeyRelease] = _ecore_x_event_handle_key_release; | ||
393 | _ecore_x_event_handlers[ButtonPress] = _ecore_x_event_handle_button_press; | ||
394 | _ecore_x_event_handlers[ButtonRelease] = | ||
395 | _ecore_x_event_handle_button_release; | ||
396 | _ecore_x_event_handlers[MotionNotify] = _ecore_x_event_handle_motion_notify; | ||
397 | _ecore_x_event_handlers[EnterNotify] = _ecore_x_event_handle_enter_notify; | ||
398 | _ecore_x_event_handlers[LeaveNotify] = _ecore_x_event_handle_leave_notify; | ||
399 | _ecore_x_event_handlers[FocusIn] = _ecore_x_event_handle_focus_in; | ||
400 | _ecore_x_event_handlers[FocusOut] = _ecore_x_event_handle_focus_out; | ||
401 | _ecore_x_event_handlers[KeymapNotify] = _ecore_x_event_handle_keymap_notify; | ||
402 | _ecore_x_event_handlers[Expose] = _ecore_x_event_handle_expose; | ||
403 | _ecore_x_event_handlers[GraphicsExpose] = | ||
404 | _ecore_x_event_handle_graphics_expose; | ||
405 | _ecore_x_event_handlers[VisibilityNotify] = | ||
406 | _ecore_x_event_handle_visibility_notify; | ||
407 | _ecore_x_event_handlers[CreateNotify] = _ecore_x_event_handle_create_notify; | ||
408 | _ecore_x_event_handlers[DestroyNotify] = | ||
409 | _ecore_x_event_handle_destroy_notify; | ||
410 | _ecore_x_event_handlers[UnmapNotify] = _ecore_x_event_handle_unmap_notify; | ||
411 | _ecore_x_event_handlers[MapNotify] = _ecore_x_event_handle_map_notify; | ||
412 | _ecore_x_event_handlers[MapRequest] = _ecore_x_event_handle_map_request; | ||
413 | _ecore_x_event_handlers[ReparentNotify] = | ||
414 | _ecore_x_event_handle_reparent_notify; | ||
415 | _ecore_x_event_handlers[ConfigureNotify] = | ||
416 | _ecore_x_event_handle_configure_notify; | ||
417 | _ecore_x_event_handlers[ConfigureRequest] = | ||
418 | _ecore_x_event_handle_configure_request; | ||
419 | _ecore_x_event_handlers[GravityNotify] = | ||
420 | _ecore_x_event_handle_gravity_notify; | ||
421 | _ecore_x_event_handlers[ResizeRequest] = | ||
422 | _ecore_x_event_handle_resize_request; | ||
423 | _ecore_x_event_handlers[CirculateNotify] = | ||
424 | _ecore_x_event_handle_circulate_notify; | ||
425 | _ecore_x_event_handlers[CirculateRequest] = | ||
426 | _ecore_x_event_handle_circulate_request; | ||
427 | _ecore_x_event_handlers[PropertyNotify] = | ||
428 | _ecore_x_event_handle_property_notify; | ||
429 | _ecore_x_event_handlers[SelectionClear] = | ||
430 | _ecore_x_event_handle_selection_clear; | ||
431 | _ecore_x_event_handlers[SelectionRequest] = | ||
432 | _ecore_x_event_handle_selection_request; | ||
433 | _ecore_x_event_handlers[SelectionNotify] = | ||
434 | _ecore_x_event_handle_selection_notify; | ||
435 | _ecore_x_event_handlers[ColormapNotify] = | ||
436 | _ecore_x_event_handle_colormap_notify; | ||
437 | _ecore_x_event_handlers[ClientMessage] = | ||
438 | _ecore_x_event_handle_client_message; | ||
439 | _ecore_x_event_handlers[MappingNotify] = | ||
440 | _ecore_x_event_handle_mapping_notify; | ||
441 | #ifdef GenericEvent | ||
442 | _ecore_x_event_handlers[GenericEvent] = _ecore_x_event_handle_generic_event; | ||
443 | #endif /* ifdef GenericEvent */ | ||
444 | |||
445 | if (_ecore_x_event_shape_id) | ||
446 | _ecore_x_event_handlers[_ecore_x_event_shape_id] = | ||
447 | _ecore_x_event_handle_shape_change; | ||
448 | |||
449 | if (_ecore_x_event_screensaver_id) | ||
450 | _ecore_x_event_handlers[_ecore_x_event_screensaver_id] = | ||
451 | _ecore_x_event_handle_screensaver_notify; | ||
452 | |||
453 | if (_ecore_x_event_sync_id) | ||
454 | { | ||
455 | _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncCounterNotify] = | ||
456 | _ecore_x_event_handle_sync_counter; | ||
457 | _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncAlarmNotify] = | ||
458 | _ecore_x_event_handle_sync_alarm; | ||
459 | } | ||
460 | |||
461 | #ifdef ECORE_XRANDR | ||
462 | if (_ecore_x_event_randr_id) | ||
463 | { | ||
464 | _ecore_x_event_handlers[_ecore_x_event_randr_id + | ||
465 | RRScreenChangeNotify] = | ||
466 | _ecore_x_event_handle_randr_change; | ||
467 | _ecore_x_event_handlers[_ecore_x_event_randr_id + | ||
468 | RRNotify] = _ecore_x_event_handle_randr_notify; | ||
469 | } | ||
470 | |||
471 | #endif /* ifdef ECORE_XRANDR */ | ||
472 | #ifdef ECORE_XFIXES | ||
473 | if (_ecore_x_event_fixes_selection_id) | ||
474 | _ecore_x_event_handlers[_ecore_x_event_fixes_selection_id] = | ||
475 | _ecore_x_event_handle_fixes_selection_notify; | ||
476 | |||
477 | #endif /* ifdef ECORE_XFIXES */ | ||
478 | #ifdef ECORE_XDAMAGE | ||
479 | if (_ecore_x_event_damage_id) | ||
480 | _ecore_x_event_handlers[_ecore_x_event_damage_id] = | ||
481 | _ecore_x_event_handle_damage_notify; | ||
482 | |||
483 | #endif /* ifdef ECORE_XDAMAGE */ | ||
484 | #ifdef ECORE_XKB | ||
485 | // set x autorepeat detection to on. that means instead of | ||
486 | // press-release-press-release-press-release | ||
487 | // you get | ||
488 | // press-press-press-press-press-release | ||
489 | do | ||
490 | { | ||
491 | Bool works = 0; | ||
492 | XkbSetDetectableAutoRepeat(_ecore_x_disp, 1, &works); | ||
493 | } | ||
494 | while (0); | ||
495 | #endif /* ifdef ECORE_XKB */ | ||
496 | |||
497 | #ifdef ECORE_XGESTURE | ||
498 | if (_ecore_x_event_gesture_id) | ||
499 | { | ||
500 | _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyFlick] = | ||
501 | _ecore_x_event_handle_gesture_notify_flick; | ||
502 | _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyPan] = | ||
503 | _ecore_x_event_handle_gesture_notify_pan; | ||
504 | _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyPinchRotation] = | ||
505 | _ecore_x_event_handle_gesture_notify_pinchrotation; | ||
506 | _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyTap] = | ||
507 | _ecore_x_event_handle_gesture_notify_tap; | ||
508 | _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyTapNHold] = | ||
509 | _ecore_x_event_handle_gesture_notify_tapnhold; | ||
510 | _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyHold] = | ||
511 | _ecore_x_event_handle_gesture_notify_hold; | ||
512 | _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyGroup] = | ||
513 | _ecore_x_event_handle_gesture_notify_group; | ||
514 | } | ||
515 | |||
516 | #endif /* ifdef ECORE_XGESTURE */ | ||
517 | |||
518 | if (!ECORE_X_EVENT_ANY) | ||
519 | { | ||
520 | ECORE_X_EVENT_ANY = ecore_event_type_new(); | ||
521 | ECORE_X_EVENT_MOUSE_IN = ecore_event_type_new(); | ||
522 | ECORE_X_EVENT_MOUSE_OUT = ecore_event_type_new(); | ||
523 | ECORE_X_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new(); | ||
524 | ECORE_X_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new(); | ||
525 | ECORE_X_EVENT_WINDOW_KEYMAP = ecore_event_type_new(); | ||
526 | ECORE_X_EVENT_WINDOW_DAMAGE = ecore_event_type_new(); | ||
527 | ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = ecore_event_type_new(); | ||
528 | ECORE_X_EVENT_WINDOW_CREATE = ecore_event_type_new(); | ||
529 | ECORE_X_EVENT_WINDOW_DESTROY = ecore_event_type_new(); | ||
530 | ECORE_X_EVENT_WINDOW_HIDE = ecore_event_type_new(); | ||
531 | ECORE_X_EVENT_WINDOW_SHOW = ecore_event_type_new(); | ||
532 | ECORE_X_EVENT_WINDOW_SHOW_REQUEST = ecore_event_type_new(); | ||
533 | ECORE_X_EVENT_WINDOW_REPARENT = ecore_event_type_new(); | ||
534 | ECORE_X_EVENT_WINDOW_CONFIGURE = ecore_event_type_new(); | ||
535 | ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = ecore_event_type_new(); | ||
536 | ECORE_X_EVENT_WINDOW_GRAVITY = ecore_event_type_new(); | ||
537 | ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = ecore_event_type_new(); | ||
538 | ECORE_X_EVENT_WINDOW_STACK = ecore_event_type_new(); | ||
539 | ECORE_X_EVENT_WINDOW_STACK_REQUEST = ecore_event_type_new(); | ||
540 | ECORE_X_EVENT_WINDOW_PROPERTY = ecore_event_type_new(); | ||
541 | ECORE_X_EVENT_WINDOW_COLORMAP = ecore_event_type_new(); | ||
542 | ECORE_X_EVENT_WINDOW_MAPPING = ecore_event_type_new(); | ||
543 | ECORE_X_EVENT_MAPPING_CHANGE = ecore_event_type_new(); | ||
544 | ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new(); | ||
545 | ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new(); | ||
546 | ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new(); | ||
547 | ECORE_X_EVENT_CLIENT_MESSAGE = ecore_event_type_new(); | ||
548 | ECORE_X_EVENT_WINDOW_SHAPE = ecore_event_type_new(); | ||
549 | ECORE_X_EVENT_SCREENSAVER_NOTIFY = ecore_event_type_new(); | ||
550 | ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = ecore_event_type_new(); | ||
551 | ECORE_X_EVENT_GESTURE_NOTIFY_PAN = ecore_event_type_new(); | ||
552 | ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = ecore_event_type_new(); | ||
553 | ECORE_X_EVENT_GESTURE_NOTIFY_TAP = ecore_event_type_new(); | ||
554 | ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = ecore_event_type_new(); | ||
555 | ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = ecore_event_type_new(); | ||
556 | ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = ecore_event_type_new(); | ||
557 | ECORE_X_EVENT_SYNC_COUNTER = ecore_event_type_new(); | ||
558 | ECORE_X_EVENT_SYNC_ALARM = ecore_event_type_new(); | ||
559 | ECORE_X_EVENT_SCREEN_CHANGE = ecore_event_type_new(); | ||
560 | ECORE_X_EVENT_RANDR_CRTC_CHANGE = ecore_event_type_new(); | ||
561 | ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = ecore_event_type_new(); | ||
562 | ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = ecore_event_type_new(); | ||
563 | ECORE_X_EVENT_DAMAGE_NOTIFY = ecore_event_type_new(); | ||
564 | |||
565 | ECORE_X_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new(); | ||
566 | |||
567 | ECORE_X_EVENT_DESKTOP_CHANGE = ecore_event_type_new(); | ||
568 | ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new(); | ||
569 | ECORE_X_EVENT_WINDOW_STATE_REQUEST = ecore_event_type_new(); | ||
570 | ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = ecore_event_type_new(); | ||
571 | ECORE_X_EVENT_PING = ecore_event_type_new(); | ||
572 | |||
573 | ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = ecore_event_type_new(); | ||
574 | ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = ecore_event_type_new(); | ||
575 | ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = ecore_event_type_new(); | ||
576 | |||
577 | ECORE_X_EVENT_GENERIC = ecore_event_type_new(); | ||
578 | } | ||
579 | |||
580 | _ecore_x_modifiers_get(); | ||
581 | |||
582 | _ecore_x_fd_handler_handle = | ||
583 | ecore_main_fd_handler_add(ConnectionNumber(_ecore_x_disp), | ||
584 | ECORE_FD_READ, | ||
585 | _ecore_x_fd_handler, _ecore_x_disp, | ||
586 | _ecore_x_fd_handler_buf, _ecore_x_disp); | ||
587 | if (!_ecore_x_fd_handler_handle) | ||
588 | goto free_event_handlers; | ||
589 | |||
590 | _ecore_x_atoms_init(); | ||
591 | |||
592 | /* Set up the ICCCM hints */ | ||
593 | ecore_x_icccm_init(); | ||
594 | |||
595 | /* Set up the _NET_... hints */ | ||
596 | ecore_x_netwm_init(); | ||
597 | |||
598 | /* old e hints init */ | ||
599 | ecore_x_e_init(); | ||
600 | |||
601 | /* This is just to be anal about naming conventions */ | ||
602 | |||
603 | _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] = | ||
604 | ECORE_X_ATOM_WM_DELETE_WINDOW; | ||
605 | _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] = | ||
606 | ECORE_X_ATOM_WM_TAKE_FOCUS; | ||
607 | _ecore_x_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_PING] = | ||
608 | ECORE_X_ATOM_NET_WM_PING; | ||
609 | _ecore_x_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] = | ||
610 | ECORE_X_ATOM_NET_WM_SYNC_REQUEST; | ||
611 | |||
612 | _ecore_x_selection_data_init(); | ||
613 | _ecore_x_dnd_init(); | ||
614 | _ecore_x_fixes_init(); | ||
615 | _ecore_x_damage_init(); | ||
616 | _ecore_x_composite_init(); | ||
617 | _ecore_x_dpms_init(); | ||
618 | _ecore_x_randr_init(); | ||
619 | _ecore_x_gesture_init(); | ||
620 | _ecore_x_input_init(); | ||
621 | _ecore_x_events_init(); | ||
622 | |||
623 | _ecore_x_private_win = ecore_x_window_override_new(0, -77, -777, 123, 456); | ||
624 | |||
625 | return _ecore_x_init_count; | ||
626 | |||
627 | free_event_handlers: | ||
628 | free(_ecore_x_event_handlers); | ||
629 | _ecore_x_event_handlers = NULL; | ||
630 | close_display: | ||
631 | XCloseDisplay(_ecore_x_disp); | ||
632 | _ecore_x_fd_handler_handle = NULL; | ||
633 | _ecore_x_disp = NULL; | ||
634 | shutdown_ecore_event: | ||
635 | ecore_event_shutdown(); | ||
636 | shutdown_ecore: | ||
637 | ecore_shutdown(); | ||
638 | shutdown_eina: | ||
639 | eina_log_domain_unregister(_ecore_xlib_log_dom); | ||
640 | _ecore_xlib_log_dom = -1; | ||
641 | eina_shutdown(); | ||
642 | |||
643 | return --_ecore_x_init_count; | ||
644 | } /* ecore_x_init */ | ||
645 | |||
646 | static int | ||
647 | _ecore_x_shutdown(int close_display) | ||
648 | { | ||
649 | if (--_ecore_x_init_count != 0) | ||
650 | return _ecore_x_init_count; | ||
651 | |||
652 | if (!_ecore_x_disp) | ||
653 | return _ecore_x_init_count; | ||
654 | |||
655 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
656 | |||
657 | ecore_main_fd_handler_del(_ecore_x_fd_handler_handle); | ||
658 | if (close_display) | ||
659 | XCloseDisplay(_ecore_x_disp); | ||
660 | else | ||
661 | { | ||
662 | close(ConnectionNumber(_ecore_x_disp)); | ||
663 | // FIXME: may have to clean up x display internal here | ||
664 | // getting segv here? hmmm. odd. disable | ||
665 | // XFree(_ecore_x_disp); | ||
666 | } | ||
667 | |||
668 | free(_ecore_x_event_handlers); | ||
669 | _ecore_x_fd_handler_handle = NULL; | ||
670 | _ecore_x_disp = NULL; | ||
671 | _ecore_x_event_handlers = NULL; | ||
672 | _ecore_x_events_shutdown(); | ||
673 | _ecore_x_input_shutdown(); | ||
674 | _ecore_x_selection_shutdown(); | ||
675 | _ecore_x_dnd_shutdown(); | ||
676 | ecore_x_netwm_shutdown(); | ||
677 | |||
678 | ecore_event_shutdown(); | ||
679 | ecore_shutdown(); | ||
680 | |||
681 | eina_log_domain_unregister(_ecore_xlib_log_dom); | ||
682 | _ecore_xlib_log_dom = -1; | ||
683 | eina_shutdown(); | ||
684 | |||
685 | return _ecore_x_init_count; | ||
686 | } /* _ecore_x_shutdown */ | ||
687 | |||
688 | /** | ||
689 | * Shuts down the Ecore X library. | ||
690 | * | ||
691 | * In shutting down the library, the X display connection is terminated | ||
692 | * and any event handlers for it are removed. | ||
693 | * | ||
694 | * @return The number of times the library has been initialized without | ||
695 | * being shut down. | ||
696 | * @ingroup Ecore_X_Init_Group | ||
697 | */ | ||
698 | EAPI int | ||
699 | ecore_x_shutdown(void) | ||
700 | { | ||
701 | return _ecore_x_shutdown(1); | ||
702 | } /* ecore_x_shutdown */ | ||
703 | |||
704 | /** | ||
705 | * Shuts down the Ecore X library. | ||
706 | * | ||
707 | * As ecore_x_shutdown, except do not close Display, only connection. | ||
708 | * | ||
709 | * @ingroup Ecore_X_Init_Group | ||
710 | */ | ||
711 | EAPI int | ||
712 | ecore_x_disconnect(void) | ||
713 | { | ||
714 | return _ecore_x_shutdown(0); | ||
715 | } /* ecore_x_disconnect */ | ||
716 | |||
717 | /** | ||
718 | * @defgroup Ecore_X_Display_Attr_Group X Display Attributes | ||
719 | * | ||
720 | * Functions that set and retrieve X display attributes. | ||
721 | */ | ||
722 | |||
723 | /** | ||
724 | * Retrieves the Ecore_X_Display handle used for the current X connection. | ||
725 | * @return The current X display. | ||
726 | * @ingroup Ecore_X_Display_Attr_Group | ||
727 | */ | ||
728 | EAPI Ecore_X_Display * | ||
729 | ecore_x_display_get(void) | ||
730 | { | ||
731 | return (Ecore_X_Display *)_ecore_x_disp; | ||
732 | } /* ecore_x_display_get */ | ||
733 | |||
734 | /** | ||
735 | * Retrieves the X display file descriptor. | ||
736 | * @return The current X display file descriptor. | ||
737 | * @ingroup Ecore_X_Display_Attr_Group | ||
738 | */ | ||
739 | EAPI int | ||
740 | ecore_x_fd_get(void) | ||
741 | { | ||
742 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
743 | return ConnectionNumber(_ecore_x_disp); | ||
744 | } /* ecore_x_fd_get */ | ||
745 | |||
746 | /** | ||
747 | * Retrieves the Ecore_X_Screen handle used for the current X connection. | ||
748 | * @return The current default screen. | ||
749 | * @ingroup Ecore_X_Display_Attr_Group | ||
750 | */ | ||
751 | EAPI Ecore_X_Screen * | ||
752 | ecore_x_default_screen_get(void) | ||
753 | { | ||
754 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
755 | return (Ecore_X_Screen *)DefaultScreenOfDisplay(_ecore_x_disp); | ||
756 | } /* ecore_x_default_screen_get */ | ||
757 | |||
758 | /** | ||
759 | * Retrieves the size of an Ecore_X_Screen. | ||
760 | * @param screen the handle to the screen to query. | ||
761 | * @param w where to return the width. May be NULL. Returns 0 on errors. | ||
762 | * @param h where to return the height. May be NULL. Returns 0 on errors. | ||
763 | * @ingroup Ecore_X_Display_Attr_Group | ||
764 | * @see ecore_x_default_screen_get() | ||
765 | * | ||
766 | * @since 1.1 | ||
767 | */ | ||
768 | EAPI void | ||
769 | ecore_x_screen_size_get(const Ecore_X_Screen *screen, | ||
770 | int *w, | ||
771 | int *h) | ||
772 | { | ||
773 | Screen *s = (Screen *)screen; | ||
774 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
775 | if (w) *w = 0; | ||
776 | if (h) *h = 0; | ||
777 | if (!s) return; | ||
778 | if (w) *w = s->width; | ||
779 | if (h) *h = s->height; | ||
780 | } | ||
781 | |||
782 | /** | ||
783 | * Retrieves the number of screens. | ||
784 | * | ||
785 | * @return The count of the number of screens. | ||
786 | * @ingroup Ecore_X_Display_Attr_Group | ||
787 | * | ||
788 | * @since 1.1 | ||
789 | */ | ||
790 | EAPI int | ||
791 | ecore_x_screen_count_get(void) | ||
792 | { | ||
793 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
794 | |||
795 | return ScreenCount(_ecore_x_disp); | ||
796 | } | ||
797 | |||
798 | /** | ||
799 | * Retrieves the index number of the given screen. | ||
800 | * | ||
801 | * @return The index number of the screen. | ||
802 | * @ingroup Ecore_X_Display_Attr_Group | ||
803 | * | ||
804 | * @since 1.1 | ||
805 | */ | ||
806 | EAPI int | ||
807 | ecore_x_screen_index_get(const Ecore_X_Screen *screen) | ||
808 | { | ||
809 | return XScreenNumberOfScreen((Screen *)screen); | ||
810 | } | ||
811 | |||
812 | /** | ||
813 | * Retrieves the screen based on index number. | ||
814 | * | ||
815 | * @return The Ecore_X_Screen at this index. | ||
816 | * @ingroup Ecore_X_Display_Attr_Group | ||
817 | * | ||
818 | * @since 1.1 | ||
819 | */ | ||
820 | EAPI Ecore_X_Screen * | ||
821 | ecore_x_screen_get(int idx) | ||
822 | { | ||
823 | return XScreenOfDisplay(_ecore_x_disp, idx); | ||
824 | } | ||
825 | |||
826 | /** | ||
827 | * Sets the timeout for a double and triple clicks to be flagged. | ||
828 | * | ||
829 | * This sets the time between clicks before the double_click flag is | ||
830 | * set in a button down event. If 3 clicks occur within double this | ||
831 | * time, the triple_click flag is also set. | ||
832 | * | ||
833 | * @param t The time in seconds | ||
834 | * @ingroup Ecore_X_Display_Attr_Group | ||
835 | */ | ||
836 | EAPI void | ||
837 | ecore_x_double_click_time_set(double t) | ||
838 | { | ||
839 | if (t < 0.0) | ||
840 | t = 0.0; | ||
841 | |||
842 | _ecore_x_double_click_time = t; | ||
843 | } /* ecore_x_double_click_time_set */ | ||
844 | |||
845 | /** | ||
846 | * Retrieves the double and triple click flag timeout. | ||
847 | * | ||
848 | * See @ref ecore_x_double_click_time_set for more information. | ||
849 | * | ||
850 | * @return The timeout for double clicks in seconds. | ||
851 | * @ingroup Ecore_X_Display_Attr_Group | ||
852 | */ | ||
853 | EAPI double | ||
854 | ecore_x_double_click_time_get(void) | ||
855 | { | ||
856 | return _ecore_x_double_click_time; | ||
857 | } /* ecore_x_double_click_time_get */ | ||
858 | |||
859 | /** | ||
860 | * @defgroup Ecore_X_Flush_Group X Synchronization Functions | ||
861 | * | ||
862 | * Functions that ensure that all commands that have been issued by the | ||
863 | * Ecore X library have been sent to the server. | ||
864 | */ | ||
865 | |||
866 | /** | ||
867 | * Sends all X commands in the X Display buffer. | ||
868 | * @ingroup Ecore_X_Flush_Group | ||
869 | */ | ||
870 | EAPI void | ||
871 | ecore_x_flush(void) | ||
872 | { | ||
873 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
874 | XFlush(_ecore_x_disp); | ||
875 | } /* ecore_x_flush */ | ||
876 | |||
877 | /** | ||
878 | * Flushes the command buffer and waits until all requests have been | ||
879 | * processed by the server. | ||
880 | * @ingroup Ecore_X_Flush_Group | ||
881 | */ | ||
882 | EAPI void | ||
883 | ecore_x_sync(void) | ||
884 | { | ||
885 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
886 | XSync(_ecore_x_disp, False); | ||
887 | } /* ecore_x_sync */ | ||
888 | |||
889 | /** | ||
890 | * Kill all clients with subwindows under a given window. | ||
891 | * | ||
892 | * You can kill all clients connected to the X server by using | ||
893 | * @ref ecore_x_window_root_list to get a list of root windows, and | ||
894 | * then passing each root window to this function. | ||
895 | * | ||
896 | * @param root The window whose children will be killed. | ||
897 | */ | ||
898 | EAPI void | ||
899 | ecore_x_killall(Ecore_X_Window root) | ||
900 | { | ||
901 | unsigned int j; | ||
902 | Window root_r; | ||
903 | Window parent_r; | ||
904 | Window *children_r = NULL; | ||
905 | unsigned int num_children = 0; | ||
906 | |||
907 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
908 | XGrabServer(_ecore_x_disp); | ||
909 | /* Tranverse window tree starting from root, and drag each | ||
910 | * before the firing squad */ | ||
911 | while (XQueryTree(_ecore_x_disp, root, &root_r, &parent_r, | ||
912 | &children_r, &num_children) && (num_children > 0)) | ||
913 | { | ||
914 | for (j = 0; j < num_children; ++j) | ||
915 | { | ||
916 | XKillClient(_ecore_x_disp, children_r[j]); | ||
917 | } | ||
918 | |||
919 | XFree(children_r); | ||
920 | } | ||
921 | XUngrabServer(_ecore_x_disp); | ||
922 | XSync(_ecore_x_disp, False); | ||
923 | } /* ecore_x_killall */ | ||
924 | |||
925 | /** | ||
926 | * Kill a specific client | ||
927 | * | ||
928 | * You can kill a specific client owning window @p win | ||
929 | * | ||
930 | * @param win Window of the client to be killed | ||
931 | */ | ||
932 | EAPI void | ||
933 | ecore_x_kill(Ecore_X_Window win) | ||
934 | { | ||
935 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
936 | XKillClient(_ecore_x_disp, win); | ||
937 | } /* ecore_x_kill */ | ||
938 | |||
939 | /** | ||
940 | * Return the last event time | ||
941 | */ | ||
942 | EAPI Ecore_X_Time | ||
943 | ecore_x_current_time_get(void) | ||
944 | { | ||
945 | return _ecore_x_event_last_time; | ||
946 | } /* ecore_x_current_time_get */ | ||
947 | |||
948 | /** | ||
949 | * Return the screen DPI | ||
950 | * | ||
951 | * This is a simplistic call to get DPI. It does not account for differing | ||
952 | * DPI in the x amd y axes nor does it accoutn for multihead or xinerama and | ||
953 | * xrander where different parts of the screen may have differen DPI etc. | ||
954 | * | ||
955 | * @return the general screen DPI (dots/pixels per inch). | ||
956 | */ | ||
957 | EAPI int | ||
958 | ecore_x_dpi_get(void) | ||
959 | { | ||
960 | Screen *s; | ||
961 | |||
962 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
963 | s = DefaultScreenOfDisplay(_ecore_x_disp); | ||
964 | if (s->mwidth <= 0) | ||
965 | return 75; | ||
966 | |||
967 | return (((s->width * 254) / s->mwidth) + 5) / 10; | ||
968 | } /* ecore_x_dpi_get */ | ||
969 | |||
970 | /** | ||
971 | * Invoke the standard system beep to alert users | ||
972 | * | ||
973 | * @param percent The volume at which the bell rings. Must be in the range | ||
974 | * [-100,+100]. If percent >= 0, the final volume will be: | ||
975 | * base - [(base * percent) / 100] + percent | ||
976 | * Otherwise, it's calculated as: | ||
977 | * base + [(base * percent) / 100] | ||
978 | * where @c base is the bell's base volume as set by XChangeKeyboardControl(3). | ||
979 | * | ||
980 | * @returns EINA_TRUE on success, EINA_FALSE otherwise. | ||
981 | */ | ||
982 | EAPI Eina_Bool | ||
983 | ecore_x_bell(int percent) | ||
984 | { | ||
985 | int ret; | ||
986 | |||
987 | ret = XBell(_ecore_x_disp, percent); | ||
988 | if (ret == BadValue) | ||
989 | return EINA_FALSE; | ||
990 | |||
991 | return EINA_TRUE; | ||
992 | } /* ecore_x_bell */ | ||
993 | |||
994 | static Eina_Bool | ||
995 | _ecore_x_fd_handler(void *data, | ||
996 | Ecore_Fd_Handler *fd_handler __UNUSED__) | ||
997 | { | ||
998 | Display *d; | ||
999 | |||
1000 | d = data; | ||
1001 | while (XPending(d)) | ||
1002 | { | ||
1003 | XEvent ev; | ||
1004 | |||
1005 | XNextEvent(d, &ev); | ||
1006 | |||
1007 | #ifdef ENABLE_XIM | ||
1008 | /* Filter event for XIM */ | ||
1009 | if (XFilterEvent(&ev, ev.xkey.window)) | ||
1010 | continue; | ||
1011 | |||
1012 | #endif /* ifdef ENABLE_XIM */ | ||
1013 | |||
1014 | if ((ev.type >= 0) && (ev.type < _ecore_x_event_handlers_num)) | ||
1015 | { | ||
1016 | if (_ecore_x_event_handlers[AnyXEvent]) | ||
1017 | _ecore_x_event_handlers[AnyXEvent] (&ev); | ||
1018 | |||
1019 | if (_ecore_x_event_handlers[ev.type]) | ||
1020 | _ecore_x_event_handlers[ev.type] (&ev); | ||
1021 | } | ||
1022 | } | ||
1023 | return ECORE_CALLBACK_RENEW; | ||
1024 | } /* _ecore_x_fd_handler */ | ||
1025 | |||
1026 | static Eina_Bool | ||
1027 | _ecore_x_fd_handler_buf(void *data, | ||
1028 | Ecore_Fd_Handler *fd_handler __UNUSED__) | ||
1029 | { | ||
1030 | Display *d; | ||
1031 | |||
1032 | d = data; | ||
1033 | if (XPending(d)) | ||
1034 | return ECORE_CALLBACK_RENEW; | ||
1035 | |||
1036 | return ECORE_CALLBACK_CANCEL; | ||
1037 | } /* _ecore_x_fd_handler_buf */ | ||
1038 | |||
1039 | static int | ||
1040 | _ecore_x_key_mask_get(KeySym sym) | ||
1041 | { | ||
1042 | XModifierKeymap *mod; | ||
1043 | KeySym sym2; | ||
1044 | int i, j; | ||
1045 | const int masks[8] = | ||
1046 | { | ||
1047 | ShiftMask, LockMask, ControlMask, | ||
1048 | Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask | ||
1049 | }; | ||
1050 | |||
1051 | mod = XGetModifierMapping(_ecore_x_disp); | ||
1052 | if ((mod) && (mod->max_keypermod > 0)) | ||
1053 | for (i = 0; i < (8 * mod->max_keypermod); i++) | ||
1054 | { | ||
1055 | for (j = 0; j < 8; j++) | ||
1056 | { | ||
1057 | sym2 = XKeycodeToKeysym(_ecore_x_disp, mod->modifiermap[i], j); | ||
1058 | if (sym2 != 0) | ||
1059 | break; | ||
1060 | } | ||
1061 | if (sym2 == sym) | ||
1062 | { | ||
1063 | int mask; | ||
1064 | |||
1065 | mask = masks[i / mod->max_keypermod]; | ||
1066 | if (mod->modifiermap) | ||
1067 | XFree(mod->modifiermap); | ||
1068 | |||
1069 | XFree(mod); | ||
1070 | return mask; | ||
1071 | } | ||
1072 | } | ||
1073 | |||
1074 | if (mod) | ||
1075 | { | ||
1076 | if (mod->modifiermap) | ||
1077 | XFree(mod->modifiermap); | ||
1078 | |||
1079 | XFree(mod); | ||
1080 | } | ||
1081 | |||
1082 | return 0; | ||
1083 | } /* _ecore_x_key_mask_get */ | ||
1084 | |||
1085 | /*****************************************************************************/ | ||
1086 | /*****************************************************************************/ | ||
1087 | /*****************************************************************************/ | ||
1088 | /* FIXME: these funcs need categorising */ | ||
1089 | /*****************************************************************************/ | ||
1090 | |||
1091 | /** | ||
1092 | * Get a list of all the root windows on the server. | ||
1093 | * | ||
1094 | * @note The returned array will need to be freed after use. | ||
1095 | * @param num_ret Pointer to integer to put number of windows returned in. | ||
1096 | * @return An array of all the root windows. @c NULL is returned if memory | ||
1097 | * could not be allocated for the list, or if @p num_ret is @c NULL. | ||
1098 | */ | ||
1099 | EAPI Ecore_X_Window * | ||
1100 | ecore_x_window_root_list(int *num_ret) | ||
1101 | { | ||
1102 | int num, i; | ||
1103 | Ecore_X_Window *roots; | ||
1104 | #ifdef ECORE_XPRINT | ||
1105 | int xp_base, xp_err_base; | ||
1106 | #endif /* ifdef ECORE_XPRINT */ | ||
1107 | |||
1108 | if (!num_ret) | ||
1109 | return NULL; | ||
1110 | |||
1111 | *num_ret = 0; | ||
1112 | |||
1113 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1114 | #ifdef ECORE_XPRINT | ||
1115 | num = ScreenCount(_ecore_x_disp); | ||
1116 | if (XpQueryExtension(_ecore_x_disp, &xp_base, &xp_err_base)) | ||
1117 | { | ||
1118 | Screen **ps = NULL; | ||
1119 | int psnum = 0; | ||
1120 | |||
1121 | ps = XpQueryScreens(_ecore_x_disp, &psnum); | ||
1122 | if (ps) | ||
1123 | { | ||
1124 | int overlap, j; | ||
1125 | |||
1126 | overlap = 0; | ||
1127 | for (i = 0; i < num; i++) | ||
1128 | { | ||
1129 | for (j = 0; j < psnum; j++) | ||
1130 | { | ||
1131 | if (ScreenOfDisplay(_ecore_x_disp, i) == ps[j]) | ||
1132 | overlap++; | ||
1133 | } | ||
1134 | } | ||
1135 | roots = malloc((num - overlap) * sizeof(Window)); | ||
1136 | if (roots) | ||
1137 | { | ||
1138 | int k; | ||
1139 | |||
1140 | k = 0; | ||
1141 | for (i = 0; i < num; i++) | ||
1142 | { | ||
1143 | int is_print; | ||
1144 | |||
1145 | is_print = 0; | ||
1146 | for (j = 0; j < psnum; j++) | ||
1147 | { | ||
1148 | if (ScreenOfDisplay(_ecore_x_disp, i) == ps[j]) | ||
1149 | { | ||
1150 | is_print = 1; | ||
1151 | break; | ||
1152 | } | ||
1153 | } | ||
1154 | if (!is_print) | ||
1155 | { | ||
1156 | roots[k] = RootWindow(_ecore_x_disp, i); | ||
1157 | k++; | ||
1158 | } | ||
1159 | } | ||
1160 | *num_ret = k; | ||
1161 | } | ||
1162 | |||
1163 | XFree(ps); | ||
1164 | } | ||
1165 | else | ||
1166 | { | ||
1167 | roots = malloc(num * sizeof(Window)); | ||
1168 | if (!roots) | ||
1169 | return NULL; | ||
1170 | |||
1171 | *num_ret = num; | ||
1172 | for (i = 0; i < num; i++) | ||
1173 | roots[i] = RootWindow(_ecore_x_disp, i); | ||
1174 | } | ||
1175 | } | ||
1176 | else | ||
1177 | { | ||
1178 | roots = malloc(num * sizeof(Window)); | ||
1179 | if (!roots) | ||
1180 | return NULL; | ||
1181 | |||
1182 | *num_ret = num; | ||
1183 | for (i = 0; i < num; i++) | ||
1184 | roots[i] = RootWindow(_ecore_x_disp, i); | ||
1185 | } | ||
1186 | |||
1187 | #else /* ifdef ECORE_XPRINT */ | ||
1188 | num = ScreenCount(_ecore_x_disp); | ||
1189 | roots = malloc(num * sizeof(Window)); | ||
1190 | if (!roots) | ||
1191 | return NULL; | ||
1192 | |||
1193 | *num_ret = num; | ||
1194 | for (i = 0; i < num; i++) | ||
1195 | roots[i] = RootWindow(_ecore_x_disp, i); | ||
1196 | #endif /* ifdef ECORE_XPRINT */ | ||
1197 | return roots; | ||
1198 | } /* ecore_x_window_root_list */ | ||
1199 | |||
1200 | EAPI Ecore_X_Window | ||
1201 | ecore_x_window_root_first_get(void) | ||
1202 | { | ||
1203 | return RootWindow(_ecore_x_disp, 0); | ||
1204 | /* | ||
1205 | int num; | ||
1206 | Ecore_X_Window root, *roots = NULL; | ||
1207 | |||
1208 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1209 | roots = ecore_x_window_root_list(&num); | ||
1210 | if (!(roots)) return 0; | ||
1211 | |||
1212 | if (num > 0) | ||
1213 | root = roots[0]; | ||
1214 | else | ||
1215 | root = 0; | ||
1216 | |||
1217 | free(roots); | ||
1218 | return root; | ||
1219 | */ | ||
1220 | } /* ecore_x_window_root_first_get */ | ||
1221 | |||
1222 | static void _ecore_x_window_manage_error(void *data); | ||
1223 | |||
1224 | static int _ecore_x_window_manage_failed = 0; | ||
1225 | static void | ||
1226 | _ecore_x_window_manage_error(void *data __UNUSED__) | ||
1227 | { | ||
1228 | if ((ecore_x_error_request_get() == X_ChangeWindowAttributes) && | ||
1229 | (ecore_x_error_code_get() == BadAccess)) | ||
1230 | _ecore_x_window_manage_failed = 1; | ||
1231 | } /* _ecore_x_window_manage_error */ | ||
1232 | |||
1233 | EAPI Eina_Bool | ||
1234 | ecore_x_window_manage(Ecore_X_Window win) | ||
1235 | { | ||
1236 | XWindowAttributes att; | ||
1237 | |||
1238 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1239 | if (XGetWindowAttributes(_ecore_x_disp, win, &att) != True) | ||
1240 | return EINA_FALSE; | ||
1241 | |||
1242 | ecore_x_sync(); | ||
1243 | _ecore_x_window_manage_failed = 0; | ||
1244 | ecore_x_error_handler_set(_ecore_x_window_manage_error, NULL); | ||
1245 | XSelectInput(_ecore_x_disp, win, | ||
1246 | EnterWindowMask | | ||
1247 | LeaveWindowMask | | ||
1248 | PropertyChangeMask | | ||
1249 | ResizeRedirectMask | | ||
1250 | SubstructureRedirectMask | | ||
1251 | SubstructureNotifyMask | | ||
1252 | StructureNotifyMask | | ||
1253 | KeyPressMask | | ||
1254 | KeyReleaseMask | | ||
1255 | att.your_event_mask); | ||
1256 | ecore_x_sync(); | ||
1257 | ecore_x_error_handler_set(NULL, NULL); | ||
1258 | if (_ecore_x_window_manage_failed) | ||
1259 | { | ||
1260 | _ecore_x_window_manage_failed = 0; | ||
1261 | return EINA_FALSE; | ||
1262 | } | ||
1263 | |||
1264 | return EINA_TRUE; | ||
1265 | } /* ecore_x_window_manage */ | ||
1266 | |||
1267 | EAPI void | ||
1268 | ecore_x_window_container_manage(Ecore_X_Window win) | ||
1269 | { | ||
1270 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1271 | XSelectInput(_ecore_x_disp, win, | ||
1272 | SubstructureRedirectMask | | ||
1273 | SubstructureNotifyMask); | ||
1274 | } /* ecore_x_window_container_manage */ | ||
1275 | |||
1276 | EAPI void | ||
1277 | ecore_x_window_client_manage(Ecore_X_Window win) | ||
1278 | { | ||
1279 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1280 | XSelectInput(_ecore_x_disp, win, | ||
1281 | PropertyChangeMask | | ||
1282 | // ResizeRedirectMask | | ||
1283 | FocusChangeMask | | ||
1284 | ColormapChangeMask | | ||
1285 | VisibilityChangeMask | | ||
1286 | StructureNotifyMask | | ||
1287 | SubstructureNotifyMask | ||
1288 | ); | ||
1289 | XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask); | ||
1290 | } /* ecore_x_window_client_manage */ | ||
1291 | |||
1292 | EAPI void | ||
1293 | ecore_x_window_sniff(Ecore_X_Window win) | ||
1294 | { | ||
1295 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1296 | XSelectInput(_ecore_x_disp, win, | ||
1297 | PropertyChangeMask | | ||
1298 | SubstructureNotifyMask); | ||
1299 | } /* ecore_x_window_sniff */ | ||
1300 | |||
1301 | EAPI void | ||
1302 | ecore_x_window_client_sniff(Ecore_X_Window win) | ||
1303 | { | ||
1304 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1305 | XSelectInput(_ecore_x_disp, win, | ||
1306 | PropertyChangeMask | | ||
1307 | FocusChangeMask | | ||
1308 | ColormapChangeMask | | ||
1309 | VisibilityChangeMask | | ||
1310 | StructureNotifyMask | | ||
1311 | SubstructureNotifyMask); | ||
1312 | XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask); | ||
1313 | } /* ecore_x_window_client_sniff */ | ||
1314 | |||
1315 | EAPI Eina_Bool | ||
1316 | ecore_x_window_attributes_get(Ecore_X_Window win, | ||
1317 | Ecore_X_Window_Attributes *att_ret) | ||
1318 | { | ||
1319 | XWindowAttributes att; | ||
1320 | |||
1321 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1322 | if (!XGetWindowAttributes(_ecore_x_disp, win, &att)) | ||
1323 | return EINA_FALSE; | ||
1324 | |||
1325 | memset(att_ret, 0, sizeof(Ecore_X_Window_Attributes)); | ||
1326 | att_ret->root = att.root; | ||
1327 | att_ret->x = att.x; | ||
1328 | att_ret->y = att.y; | ||
1329 | att_ret->w = att.width; | ||
1330 | att_ret->h = att.height; | ||
1331 | att_ret->border = att.border_width; | ||
1332 | att_ret->depth = att.depth; | ||
1333 | if (att.map_state != IsUnmapped) | ||
1334 | att_ret->visible = 1; | ||
1335 | |||
1336 | if (att.map_state == IsViewable) | ||
1337 | att_ret->viewable = 1; | ||
1338 | |||
1339 | if (att.override_redirect) | ||
1340 | att_ret->override = 1; | ||
1341 | |||
1342 | if (att.class == InputOnly) | ||
1343 | att_ret->input_only = 1; | ||
1344 | |||
1345 | if (att.save_under) | ||
1346 | att_ret->save_under = 1; | ||
1347 | |||
1348 | att_ret->event_mask.mine = att.your_event_mask; | ||
1349 | att_ret->event_mask.all = att.all_event_masks; | ||
1350 | att_ret->event_mask.no_propagate = att.do_not_propagate_mask; | ||
1351 | att_ret->window_gravity = att.win_gravity; | ||
1352 | att_ret->pixel_gravity = att.bit_gravity; | ||
1353 | att_ret->colormap = att.colormap; | ||
1354 | att_ret->visual = att.visual; | ||
1355 | return EINA_TRUE; | ||
1356 | } /* ecore_x_window_attributes_get */ | ||
1357 | |||
1358 | EAPI void | ||
1359 | ecore_x_window_save_set_add(Ecore_X_Window win) | ||
1360 | { | ||
1361 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1362 | XAddToSaveSet(_ecore_x_disp, win); | ||
1363 | } /* ecore_x_window_save_set_add */ | ||
1364 | |||
1365 | EAPI void | ||
1366 | ecore_x_window_save_set_del(Ecore_X_Window win) | ||
1367 | { | ||
1368 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1369 | XRemoveFromSaveSet(_ecore_x_disp, win); | ||
1370 | } /* ecore_x_window_save_set_del */ | ||
1371 | |||
1372 | EAPI Ecore_X_Window * | ||
1373 | ecore_x_window_children_get(Ecore_X_Window win, | ||
1374 | int *num) | ||
1375 | { | ||
1376 | Ecore_X_Window *windows = NULL; | ||
1377 | Window root_ret = 0, parent_ret = 0, *children_ret = NULL; | ||
1378 | unsigned int children_ret_num = 0; | ||
1379 | |||
1380 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1381 | if (!XQueryTree(_ecore_x_disp, win, &root_ret, &parent_ret, &children_ret, | ||
1382 | &children_ret_num)) | ||
1383 | return NULL; | ||
1384 | |||
1385 | if (children_ret) | ||
1386 | { | ||
1387 | windows = malloc(children_ret_num * sizeof(Ecore_X_Window)); | ||
1388 | if (windows) | ||
1389 | { | ||
1390 | unsigned int i; | ||
1391 | |||
1392 | for (i = 0; i < children_ret_num; i++) | ||
1393 | windows[i] = children_ret[i]; | ||
1394 | *num = children_ret_num; | ||
1395 | } | ||
1396 | |||
1397 | XFree(children_ret); | ||
1398 | } | ||
1399 | |||
1400 | return windows; | ||
1401 | } /* ecore_x_window_children_get */ | ||
1402 | |||
1403 | EAPI Eina_Bool | ||
1404 | ecore_x_pointer_control_set(int accel_num, | ||
1405 | int accel_denom, | ||
1406 | int threshold) | ||
1407 | { | ||
1408 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1409 | return XChangePointerControl(_ecore_x_disp, 1, 1, | ||
1410 | accel_num, accel_denom, threshold) ? EINA_TRUE : EINA_FALSE; | ||
1411 | } /* ecore_x_pointer_control_set */ | ||
1412 | |||
1413 | EAPI Eina_Bool | ||
1414 | ecore_x_pointer_control_get(int *accel_num, | ||
1415 | int *accel_denom, | ||
1416 | int *threshold) | ||
1417 | { | ||
1418 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1419 | return XGetPointerControl(_ecore_x_disp, | ||
1420 | accel_num, accel_denom, threshold) ? EINA_TRUE : EINA_FALSE; | ||
1421 | } /* ecore_x_pointer_control_get */ | ||
1422 | |||
1423 | EAPI Eina_Bool | ||
1424 | ecore_x_pointer_mapping_set(unsigned char *map, | ||
1425 | int nmap) | ||
1426 | { | ||
1427 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1428 | return XSetPointerMapping(_ecore_x_disp, map, nmap) ? EINA_TRUE : EINA_FALSE; | ||
1429 | } /* ecore_x_pointer_mapping_set */ | ||
1430 | |||
1431 | EAPI Eina_Bool | ||
1432 | ecore_x_pointer_mapping_get(unsigned char *map, | ||
1433 | int nmap) | ||
1434 | { | ||
1435 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1436 | return XGetPointerMapping(_ecore_x_disp, map, nmap) ? EINA_TRUE : EINA_FALSE; | ||
1437 | } /* ecore_x_pointer_mapping_get */ | ||
1438 | |||
1439 | EAPI Eina_Bool | ||
1440 | ecore_x_pointer_grab(Ecore_X_Window win) | ||
1441 | { | ||
1442 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1443 | if (XGrabPointer(_ecore_x_disp, win, False, | ||
1444 | ButtonPressMask | ButtonReleaseMask | | ||
1445 | EnterWindowMask | LeaveWindowMask | PointerMotionMask, | ||
1446 | GrabModeAsync, GrabModeAsync, | ||
1447 | None, None, CurrentTime) == GrabSuccess) | ||
1448 | return EINA_TRUE; | ||
1449 | |||
1450 | return EINA_FALSE; | ||
1451 | } /* ecore_x_pointer_grab */ | ||
1452 | |||
1453 | EAPI Eina_Bool | ||
1454 | ecore_x_pointer_confine_grab(Ecore_X_Window win) | ||
1455 | { | ||
1456 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1457 | if (XGrabPointer(_ecore_x_disp, win, False, | ||
1458 | ButtonPressMask | ButtonReleaseMask | | ||
1459 | EnterWindowMask | LeaveWindowMask | PointerMotionMask, | ||
1460 | GrabModeAsync, GrabModeAsync, | ||
1461 | win, None, CurrentTime) == GrabSuccess) | ||
1462 | return EINA_TRUE; | ||
1463 | |||
1464 | return EINA_FALSE; | ||
1465 | } /* ecore_x_pointer_confine_grab */ | ||
1466 | |||
1467 | EAPI void | ||
1468 | ecore_x_pointer_ungrab(void) | ||
1469 | { | ||
1470 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1471 | XUngrabPointer(_ecore_x_disp, CurrentTime); | ||
1472 | } /* ecore_x_pointer_ungrab */ | ||
1473 | |||
1474 | EAPI Eina_Bool | ||
1475 | ecore_x_pointer_warp(Ecore_X_Window win, | ||
1476 | int x, | ||
1477 | int y) | ||
1478 | { | ||
1479 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1480 | return XWarpPointer(_ecore_x_disp, None, win, 0, 0, 0, 0, x, y) ? EINA_TRUE : EINA_FALSE; | ||
1481 | } /* ecore_x_pointer_warp */ | ||
1482 | |||
1483 | EAPI Eina_Bool | ||
1484 | ecore_x_keyboard_grab(Ecore_X_Window win) | ||
1485 | { | ||
1486 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1487 | if (XGrabKeyboard(_ecore_x_disp, win, False, | ||
1488 | GrabModeAsync, GrabModeAsync, | ||
1489 | CurrentTime) == GrabSuccess) | ||
1490 | return EINA_TRUE; | ||
1491 | |||
1492 | return EINA_FALSE; | ||
1493 | } /* ecore_x_keyboard_grab */ | ||
1494 | |||
1495 | EAPI void | ||
1496 | ecore_x_keyboard_ungrab(void) | ||
1497 | { | ||
1498 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1499 | XUngrabKeyboard(_ecore_x_disp, CurrentTime); | ||
1500 | } /* ecore_x_keyboard_ungrab */ | ||
1501 | |||
1502 | EAPI void | ||
1503 | ecore_x_grab(void) | ||
1504 | { | ||
1505 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1506 | _ecore_x_grab_count++; | ||
1507 | if (_ecore_x_grab_count == 1) | ||
1508 | XGrabServer(_ecore_x_disp); | ||
1509 | } /* ecore_x_grab */ | ||
1510 | |||
1511 | EAPI void | ||
1512 | ecore_x_ungrab(void) | ||
1513 | { | ||
1514 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1515 | _ecore_x_grab_count--; | ||
1516 | if (_ecore_x_grab_count < 0) | ||
1517 | _ecore_x_grab_count = 0; | ||
1518 | |||
1519 | if (_ecore_x_grab_count == 0) | ||
1520 | XUngrabServer(_ecore_x_disp); | ||
1521 | } /* ecore_x_ungrab */ | ||
1522 | |||
1523 | int _ecore_window_grabs_num = 0; | ||
1524 | Window *_ecore_window_grabs = NULL; | ||
1525 | Eina_Bool (*_ecore_window_grab_replay_func)(void *data, | ||
1526 | int event_type, | ||
1527 | void *event); | ||
1528 | void *_ecore_window_grab_replay_data; | ||
1529 | |||
1530 | EAPI void | ||
1531 | ecore_x_passive_grab_replay_func_set(Eina_Bool (*func)(void *data, | ||
1532 | int event_type, | ||
1533 | void *event), | ||
1534 | void *data) | ||
1535 | { | ||
1536 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1537 | _ecore_window_grab_replay_func = func; | ||
1538 | _ecore_window_grab_replay_data = data; | ||
1539 | } /* ecore_x_passive_grab_replay_func_set */ | ||
1540 | |||
1541 | EAPI void | ||
1542 | ecore_x_window_button_grab(Ecore_X_Window win, | ||
1543 | int button, | ||
1544 | Ecore_X_Event_Mask event_mask, | ||
1545 | int mod, | ||
1546 | int any_mod) | ||
1547 | { | ||
1548 | unsigned int b; | ||
1549 | unsigned int m; | ||
1550 | unsigned int locks[8]; | ||
1551 | int i, ev; | ||
1552 | Window *t; | ||
1553 | |||
1554 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1555 | b = button; | ||
1556 | if (b == 0) | ||
1557 | b = AnyButton; | ||
1558 | |||
1559 | m = _ecore_x_event_modifier(mod); | ||
1560 | if (any_mod) | ||
1561 | m = AnyModifier; | ||
1562 | |||
1563 | locks[0] = 0; | ||
1564 | locks[1] = ECORE_X_LOCK_CAPS; | ||
1565 | locks[2] = ECORE_X_LOCK_NUM; | ||
1566 | locks[3] = ECORE_X_LOCK_SCROLL; | ||
1567 | locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM; | ||
1568 | locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL; | ||
1569 | locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL; | ||
1570 | locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL; | ||
1571 | ev = event_mask; | ||
1572 | for (i = 0; i < 8; i++) | ||
1573 | XGrabButton(_ecore_x_disp, b, m | locks[i], | ||
1574 | win, False, ev, GrabModeSync, GrabModeAsync, None, None); | ||
1575 | _ecore_window_grabs_num++; | ||
1576 | t = realloc(_ecore_window_grabs, | ||
1577 | _ecore_window_grabs_num * sizeof(Window)); | ||
1578 | if (!t) return; | ||
1579 | _ecore_window_grabs = t; | ||
1580 | _ecore_window_grabs[_ecore_window_grabs_num - 1] = win; | ||
1581 | } /* ecore_x_window_button_grab */ | ||
1582 | |||
1583 | void | ||
1584 | _ecore_x_sync_magic_send(int val, | ||
1585 | Ecore_X_Window swin) | ||
1586 | { | ||
1587 | XEvent xev; | ||
1588 | |||
1589 | xev.xclient.type = ClientMessage; | ||
1590 | xev.xclient.serial = 0; | ||
1591 | xev.xclient.send_event = True; | ||
1592 | xev.xclient.display = _ecore_x_disp; | ||
1593 | xev.xclient.window = _ecore_x_private_win; | ||
1594 | xev.xclient.format = 32; | ||
1595 | xev.xclient.message_type = 27777; | ||
1596 | xev.xclient.data.l[0] = 0x7162534; | ||
1597 | xev.xclient.data.l[1] = 0x10000000 + val; | ||
1598 | xev.xclient.data.l[2] = swin; | ||
1599 | XSendEvent(_ecore_x_disp, _ecore_x_private_win, False, NoEventMask, &xev); | ||
1600 | } /* _ecore_x_sync_magic_send */ | ||
1601 | |||
1602 | void | ||
1603 | _ecore_x_window_grab_remove(Ecore_X_Window win) | ||
1604 | { | ||
1605 | int i, shuffle = 0; | ||
1606 | Window *t; | ||
1607 | |||
1608 | if (_ecore_window_grabs_num > 0) | ||
1609 | { | ||
1610 | for (i = 0; i < _ecore_window_grabs_num; i++) | ||
1611 | { | ||
1612 | if (shuffle) | ||
1613 | _ecore_window_grabs[i - 1] = _ecore_window_grabs[i]; | ||
1614 | |||
1615 | if ((!shuffle) && (_ecore_window_grabs[i] == win)) | ||
1616 | shuffle = 1; | ||
1617 | } | ||
1618 | if (shuffle) | ||
1619 | { | ||
1620 | _ecore_window_grabs_num--; | ||
1621 | if (_ecore_window_grabs_num <= 0) | ||
1622 | { | ||
1623 | free(_ecore_window_grabs); | ||
1624 | _ecore_window_grabs = NULL; | ||
1625 | return; | ||
1626 | } | ||
1627 | t = realloc(_ecore_window_grabs, | ||
1628 | _ecore_window_grabs_num * | ||
1629 | sizeof(Window)); | ||
1630 | if (!t) return; | ||
1631 | _ecore_window_grabs = t; | ||
1632 | } | ||
1633 | } | ||
1634 | } /* _ecore_x_window_grab_remove */ | ||
1635 | |||
1636 | EAPI void | ||
1637 | ecore_x_window_button_ungrab(Ecore_X_Window win, | ||
1638 | int button, | ||
1639 | int mod, | ||
1640 | int any_mod) | ||
1641 | { | ||
1642 | unsigned int b; | ||
1643 | unsigned int m; | ||
1644 | unsigned int locks[8]; | ||
1645 | int i; | ||
1646 | |||
1647 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1648 | b = button; | ||
1649 | if (b == 0) | ||
1650 | b = AnyButton; | ||
1651 | |||
1652 | m = _ecore_x_event_modifier(mod); | ||
1653 | if (any_mod) | ||
1654 | m = AnyModifier; | ||
1655 | |||
1656 | locks[0] = 0; | ||
1657 | locks[1] = ECORE_X_LOCK_CAPS; | ||
1658 | locks[2] = ECORE_X_LOCK_NUM; | ||
1659 | locks[3] = ECORE_X_LOCK_SCROLL; | ||
1660 | locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM; | ||
1661 | locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL; | ||
1662 | locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL; | ||
1663 | locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL; | ||
1664 | for (i = 0; i < 8; i++) | ||
1665 | XUngrabButton(_ecore_x_disp, b, m | locks[i], win); | ||
1666 | _ecore_x_sync_magic_send(1, win); | ||
1667 | } /* ecore_x_window_button_ungrab */ | ||
1668 | |||
1669 | int _ecore_key_grabs_num = 0; | ||
1670 | Window *_ecore_key_grabs = NULL; | ||
1671 | |||
1672 | EAPI void | ||
1673 | ecore_x_window_key_grab(Ecore_X_Window win, | ||
1674 | const char *key, | ||
1675 | int mod, | ||
1676 | int any_mod) | ||
1677 | { | ||
1678 | KeyCode keycode = 0; | ||
1679 | KeySym keysym; | ||
1680 | unsigned int m; | ||
1681 | unsigned int locks[8]; | ||
1682 | int i; | ||
1683 | Window *t; | ||
1684 | |||
1685 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1686 | if (!strncmp(key, "Keycode-", 8)) | ||
1687 | keycode = atoi(key + 8); | ||
1688 | else | ||
1689 | { | ||
1690 | keysym = XStringToKeysym(key); | ||
1691 | if (keysym == NoSymbol) | ||
1692 | return; | ||
1693 | |||
1694 | keycode = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(key)); | ||
1695 | } | ||
1696 | |||
1697 | if (keycode == 0) | ||
1698 | return; | ||
1699 | |||
1700 | m = _ecore_x_event_modifier(mod); | ||
1701 | if (any_mod) | ||
1702 | m = AnyModifier; | ||
1703 | |||
1704 | locks[0] = 0; | ||
1705 | locks[1] = ECORE_X_LOCK_CAPS; | ||
1706 | locks[2] = ECORE_X_LOCK_NUM; | ||
1707 | locks[3] = ECORE_X_LOCK_SCROLL; | ||
1708 | locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM; | ||
1709 | locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL; | ||
1710 | locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL; | ||
1711 | locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL; | ||
1712 | for (i = 0; i < 8; i++) | ||
1713 | XGrabKey(_ecore_x_disp, keycode, m | locks[i], | ||
1714 | win, False, GrabModeSync, GrabModeAsync); | ||
1715 | _ecore_key_grabs_num++; | ||
1716 | t = realloc(_ecore_key_grabs, | ||
1717 | _ecore_key_grabs_num * sizeof(Window)); | ||
1718 | if (!t) return; | ||
1719 | _ecore_key_grabs = t; | ||
1720 | _ecore_key_grabs[_ecore_key_grabs_num - 1] = win; | ||
1721 | } /* ecore_x_window_key_grab */ | ||
1722 | |||
1723 | void | ||
1724 | _ecore_x_key_grab_remove(Ecore_X_Window win) | ||
1725 | { | ||
1726 | int i, shuffle = 0; | ||
1727 | Window *t; | ||
1728 | |||
1729 | if (_ecore_key_grabs_num > 0) | ||
1730 | { | ||
1731 | for (i = 0; i < _ecore_key_grabs_num; i++) | ||
1732 | { | ||
1733 | if (shuffle) | ||
1734 | _ecore_key_grabs[i - 1] = _ecore_key_grabs[i]; | ||
1735 | |||
1736 | if ((!shuffle) && (_ecore_key_grabs[i] == win)) | ||
1737 | shuffle = 1; | ||
1738 | } | ||
1739 | if (shuffle) | ||
1740 | { | ||
1741 | _ecore_key_grabs_num--; | ||
1742 | if (_ecore_key_grabs_num <= 0) | ||
1743 | { | ||
1744 | free(_ecore_key_grabs); | ||
1745 | _ecore_key_grabs = NULL; | ||
1746 | return; | ||
1747 | } | ||
1748 | t = realloc(_ecore_key_grabs, | ||
1749 | _ecore_key_grabs_num * sizeof(Window)); | ||
1750 | if (!t) return; | ||
1751 | _ecore_key_grabs = t; | ||
1752 | } | ||
1753 | } | ||
1754 | } /* _ecore_x_key_grab_remove */ | ||
1755 | |||
1756 | EAPI void | ||
1757 | ecore_x_window_key_ungrab(Ecore_X_Window win, | ||
1758 | const char *key, | ||
1759 | int mod, | ||
1760 | int any_mod) | ||
1761 | { | ||
1762 | KeyCode keycode = 0; | ||
1763 | KeySym keysym; | ||
1764 | unsigned int m; | ||
1765 | unsigned int locks[8]; | ||
1766 | int i; | ||
1767 | |||
1768 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1769 | if (!strncmp(key, "Keycode-", 8)) | ||
1770 | keycode = atoi(key + 8); | ||
1771 | else | ||
1772 | { | ||
1773 | keysym = XStringToKeysym(key); | ||
1774 | if (keysym == NoSymbol) | ||
1775 | return; | ||
1776 | |||
1777 | keycode = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(key)); | ||
1778 | } | ||
1779 | |||
1780 | if (keycode == 0) | ||
1781 | return; | ||
1782 | |||
1783 | m = _ecore_x_event_modifier(mod); | ||
1784 | if (any_mod) | ||
1785 | m = AnyModifier; | ||
1786 | |||
1787 | locks[0] = 0; | ||
1788 | locks[1] = ECORE_X_LOCK_CAPS; | ||
1789 | locks[2] = ECORE_X_LOCK_NUM; | ||
1790 | locks[3] = ECORE_X_LOCK_SCROLL; | ||
1791 | locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM; | ||
1792 | locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL; | ||
1793 | locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL; | ||
1794 | locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL; | ||
1795 | for (i = 0; i < 8; i++) | ||
1796 | XUngrabKey(_ecore_x_disp, keycode, m | locks[i], win); | ||
1797 | _ecore_x_sync_magic_send(2, win); | ||
1798 | } /* ecore_x_window_key_ungrab */ | ||
1799 | |||
1800 | /** | ||
1801 | * Send client message with given type and format 32. | ||
1802 | * | ||
1803 | * @param win The window the message is sent to. | ||
1804 | * @param type The client message type. | ||
1805 | * @param d0 The client message data item 1 | ||
1806 | * @param d1 The client message data item 2 | ||
1807 | * @param d2 The client message data item 3 | ||
1808 | * @param d3 The client message data item 4 | ||
1809 | * @param d4 The client message data item 5 | ||
1810 | * | ||
1811 | * @return EINA_TRUE on success EINA_FALSE otherwise. | ||
1812 | */ | ||
1813 | EAPI Eina_Bool | ||
1814 | ecore_x_client_message32_send(Ecore_X_Window win, | ||
1815 | Ecore_X_Atom type, | ||
1816 | Ecore_X_Event_Mask mask, | ||
1817 | long d0, | ||
1818 | long d1, | ||
1819 | long d2, | ||
1820 | long d3, | ||
1821 | long d4) | ||
1822 | { | ||
1823 | XEvent xev; | ||
1824 | |||
1825 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1826 | xev.xclient.window = win; | ||
1827 | xev.xclient.type = ClientMessage; | ||
1828 | xev.xclient.message_type = type; | ||
1829 | xev.xclient.format = 32; | ||
1830 | xev.xclient.data.l[0] = d0; | ||
1831 | xev.xclient.data.l[1] = d1; | ||
1832 | xev.xclient.data.l[2] = d2; | ||
1833 | xev.xclient.data.l[3] = d3; | ||
1834 | xev.xclient.data.l[4] = d4; | ||
1835 | |||
1836 | return XSendEvent(_ecore_x_disp, win, False, mask, &xev) ? EINA_TRUE : EINA_FALSE; | ||
1837 | } /* ecore_x_client_message32_send */ | ||
1838 | |||
1839 | /** | ||
1840 | * Send client message with given type and format 8. | ||
1841 | * | ||
1842 | * @param win The window the message is sent to. | ||
1843 | * @param type The client message type. | ||
1844 | * @param data Data to be sent. | ||
1845 | * @param len Number of data bytes, max 20. | ||
1846 | * | ||
1847 | * @return EINA_TRUE on success EINA_FALSE otherwise. | ||
1848 | */ | ||
1849 | EAPI Eina_Bool | ||
1850 | ecore_x_client_message8_send(Ecore_X_Window win, | ||
1851 | Ecore_X_Atom type, | ||
1852 | const void *data, | ||
1853 | int len) | ||
1854 | { | ||
1855 | XEvent xev; | ||
1856 | |||
1857 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1858 | xev.xclient.window = win; | ||
1859 | xev.xclient.type = ClientMessage; | ||
1860 | xev.xclient.message_type = type; | ||
1861 | xev.xclient.format = 8; | ||
1862 | if (len > 20) | ||
1863 | len = 20; | ||
1864 | |||
1865 | memcpy(xev.xclient.data.b, data, len); | ||
1866 | memset(xev.xclient.data.b + len, 0, 20 - len); | ||
1867 | |||
1868 | return XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev) ? EINA_TRUE : EINA_FALSE; | ||
1869 | } /* ecore_x_client_message8_send */ | ||
1870 | |||
1871 | EAPI Eina_Bool | ||
1872 | ecore_x_mouse_move_send(Ecore_X_Window win, | ||
1873 | int x, | ||
1874 | int y) | ||
1875 | { | ||
1876 | XEvent xev; | ||
1877 | XWindowAttributes att; | ||
1878 | Window tw; | ||
1879 | int rx, ry; | ||
1880 | |||
1881 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1882 | XGetWindowAttributes(_ecore_x_disp, win, &att); | ||
1883 | XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw); | ||
1884 | xev.xmotion.type = MotionNotify; | ||
1885 | xev.xmotion.window = win; | ||
1886 | xev.xmotion.root = att.root; | ||
1887 | xev.xmotion.subwindow = win; | ||
1888 | xev.xmotion.time = _ecore_x_event_last_time; | ||
1889 | xev.xmotion.x = x; | ||
1890 | xev.xmotion.y = y; | ||
1891 | xev.xmotion.x_root = rx; | ||
1892 | xev.xmotion.y_root = ry; | ||
1893 | xev.xmotion.state = 0; | ||
1894 | xev.xmotion.is_hint = 0; | ||
1895 | xev.xmotion.same_screen = 1; | ||
1896 | return XSendEvent(_ecore_x_disp, win, True, PointerMotionMask, &xev) ? EINA_TRUE : EINA_FALSE; | ||
1897 | } /* ecore_x_mouse_move_send */ | ||
1898 | |||
1899 | EAPI Eina_Bool | ||
1900 | ecore_x_mouse_down_send(Ecore_X_Window win, | ||
1901 | int x, | ||
1902 | int y, | ||
1903 | int b) | ||
1904 | { | ||
1905 | XEvent xev; | ||
1906 | XWindowAttributes att; | ||
1907 | Window tw; | ||
1908 | int rx, ry; | ||
1909 | |||
1910 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1911 | XGetWindowAttributes(_ecore_x_disp, win, &att); | ||
1912 | XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw); | ||
1913 | xev.xbutton.type = ButtonPress; | ||
1914 | xev.xbutton.window = win; | ||
1915 | xev.xbutton.root = att.root; | ||
1916 | xev.xbutton.subwindow = win; | ||
1917 | xev.xbutton.time = _ecore_x_event_last_time; | ||
1918 | xev.xbutton.x = x; | ||
1919 | xev.xbutton.y = y; | ||
1920 | xev.xbutton.x_root = rx; | ||
1921 | xev.xbutton.y_root = ry; | ||
1922 | xev.xbutton.state = 1 << b; | ||
1923 | xev.xbutton.button = b; | ||
1924 | xev.xbutton.same_screen = 1; | ||
1925 | return XSendEvent(_ecore_x_disp, win, True, ButtonPressMask, &xev) ? EINA_TRUE : EINA_FALSE; | ||
1926 | } /* ecore_x_mouse_down_send */ | ||
1927 | |||
1928 | EAPI Eina_Bool | ||
1929 | ecore_x_mouse_up_send(Ecore_X_Window win, | ||
1930 | int x, | ||
1931 | int y, | ||
1932 | int b) | ||
1933 | { | ||
1934 | XEvent xev; | ||
1935 | XWindowAttributes att; | ||
1936 | Window tw; | ||
1937 | int rx, ry; | ||
1938 | |||
1939 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1940 | XGetWindowAttributes(_ecore_x_disp, win, &att); | ||
1941 | XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw); | ||
1942 | xev.xbutton.type = ButtonRelease; | ||
1943 | xev.xbutton.window = win; | ||
1944 | xev.xbutton.root = att.root; | ||
1945 | xev.xbutton.subwindow = win; | ||
1946 | xev.xbutton.time = _ecore_x_event_last_time; | ||
1947 | xev.xbutton.x = x; | ||
1948 | xev.xbutton.y = y; | ||
1949 | xev.xbutton.x_root = rx; | ||
1950 | xev.xbutton.y_root = ry; | ||
1951 | xev.xbutton.state = 0; | ||
1952 | xev.xbutton.button = b; | ||
1953 | xev.xbutton.same_screen = 1; | ||
1954 | return XSendEvent(_ecore_x_disp, win, True, ButtonReleaseMask, &xev) ? EINA_TRUE : EINA_FALSE; | ||
1955 | } /* ecore_x_mouse_up_send */ | ||
1956 | |||
1957 | EAPI void | ||
1958 | ecore_x_focus_reset(void) | ||
1959 | { | ||
1960 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1961 | XSetInputFocus(_ecore_x_disp, PointerRoot, RevertToPointerRoot, CurrentTime); | ||
1962 | } /* ecore_x_focus_reset */ | ||
1963 | |||
1964 | EAPI void | ||
1965 | ecore_x_events_allow_all(void) | ||
1966 | { | ||
1967 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1968 | XAllowEvents(_ecore_x_disp, AsyncBoth, CurrentTime); | ||
1969 | } /* ecore_x_events_allow_all */ | ||
1970 | |||
1971 | EAPI void | ||
1972 | ecore_x_pointer_last_xy_get(int *x, | ||
1973 | int *y) | ||
1974 | { | ||
1975 | if (x) | ||
1976 | *x = _ecore_x_event_last_root_x; | ||
1977 | |||
1978 | if (y) | ||
1979 | *y = _ecore_x_event_last_root_y; | ||
1980 | } /* ecore_x_pointer_last_xy_get */ | ||
1981 | |||
1982 | EAPI void | ||
1983 | ecore_x_pointer_xy_get(Ecore_X_Window win, | ||
1984 | int *x, | ||
1985 | int *y) | ||
1986 | { | ||
1987 | Window rwin, cwin; | ||
1988 | int rx, ry, wx, wy, ret; | ||
1989 | unsigned int mask; | ||
1990 | |||
1991 | LOGFN(__FILE__, __LINE__, __FUNCTION__); | ||
1992 | ret = XQueryPointer(_ecore_x_disp, win, &rwin, &cwin, | ||
1993 | &rx, &ry, &wx, &wy, &mask); | ||
1994 | if (!ret) | ||
1995 | wx = wy = -1; | ||
1996 | |||
1997 | if (x) *x = wx; | ||
1998 | if (y) *y = wy; | ||
1999 | } /* ecore_x_pointer_xy_get */ | ||
2000 | |||
2001 | /** | ||
2002 | * Retrieve the Visual ID from a given Visual. | ||
2003 | * | ||
2004 | * @param visual The Visual to get the ID for. | ||
2005 | * | ||
2006 | * @return The visual id. | ||
2007 | * @since 1.1.0 | ||
2008 | */ | ||
2009 | EAPI unsigned int | ||
2010 | ecore_x_visual_id_get(Ecore_X_Visual visual) | ||
2011 | { | ||
2012 | return XVisualIDFromVisual(visual); | ||
2013 | } | ||
2014 | |||
2015 | /** | ||
2016 | * Retrieve the default Visual. | ||
2017 | * | ||
2018 | * @param disp The Display to get the Default Visual from | ||
2019 | * @param screen The Screen. | ||
2020 | * | ||
2021 | * @return The default visual. | ||
2022 | * @since 1.1.0 | ||
2023 | */ | ||
2024 | EAPI Ecore_X_Visual | ||
2025 | ecore_x_default_visual_get(Ecore_X_Display *disp, | ||
2026 | Ecore_X_Screen *screen) | ||
2027 | { | ||
2028 | return DefaultVisual(disp, ecore_x_screen_index_get(screen)); | ||
2029 | } | ||
2030 | |||
2031 | /** | ||
2032 | * Retrieve the default Colormap. | ||
2033 | * | ||
2034 | * @param disp The Display to get the Default Colormap from | ||
2035 | * @param screen The Screen. | ||
2036 | * | ||
2037 | * @return The default colormap. | ||
2038 | * @since 1.1.0 | ||
2039 | */ | ||
2040 | EAPI Ecore_X_Colormap | ||
2041 | ecore_x_default_colormap_get(Ecore_X_Display *disp, | ||
2042 | Ecore_X_Screen *screen) | ||
2043 | { | ||
2044 | return DefaultColormap(disp, ecore_x_screen_index_get(screen)); | ||
2045 | } | ||
2046 | |||
2047 | /** | ||
2048 | * Retrieve the default depth. | ||
2049 | * | ||
2050 | * @param disp The Display to get the Default Depth from | ||
2051 | * @param screen The Screen. | ||
2052 | * | ||
2053 | * @return The default depth. | ||
2054 | * @since 1.1.0 | ||
2055 | */ | ||
2056 | EAPI int | ||
2057 | ecore_x_default_depth_get(Ecore_X_Display *disp, | ||
2058 | Ecore_X_Screen *screen) | ||
2059 | { | ||
2060 | return DefaultDepth(disp, ecore_x_screen_index_get(screen)); | ||
2061 | } | ||
2062 | |||
2063 | /*****************************************************************************/ | ||
2064 | /*****************************************************************************/ | ||
2065 | /*****************************************************************************/ | ||
2066 | |||
2067 | static int | ||
2068 | _ecore_x_event_modifier(unsigned int state) | ||
2069 | { | ||
2070 | int xmodifiers = 0; | ||
2071 | |||
2072 | if (state & ECORE_EVENT_MODIFIER_SHIFT) | ||
2073 | xmodifiers |= ECORE_X_MODIFIER_SHIFT; | ||
2074 | |||
2075 | if (state & ECORE_EVENT_MODIFIER_CTRL) | ||
2076 | xmodifiers |= ECORE_X_MODIFIER_CTRL; | ||
2077 | |||
2078 | if (state & ECORE_EVENT_MODIFIER_ALT) | ||
2079 | xmodifiers |= ECORE_X_MODIFIER_ALT; | ||
2080 | |||
2081 | if (state & ECORE_EVENT_MODIFIER_WIN) | ||
2082 | xmodifiers |= ECORE_X_MODIFIER_WIN; | ||
2083 | |||
2084 | if (state & ECORE_EVENT_LOCK_SCROLL) | ||
2085 | xmodifiers |= ECORE_X_LOCK_SCROLL; | ||
2086 | |||
2087 | if (state & ECORE_EVENT_LOCK_NUM) | ||
2088 | xmodifiers |= ECORE_X_LOCK_NUM; | ||
2089 | |||
2090 | if (state & ECORE_EVENT_LOCK_CAPS) | ||
2091 | xmodifiers |= ECORE_X_LOCK_CAPS; | ||
2092 | |||
2093 | if (state & ECORE_EVENT_LOCK_SHIFT) | ||
2094 | xmodifiers |= ECORE_X_LOCK_SHIFT; | ||
2095 | |||
2096 | return xmodifiers; | ||
2097 | } /* _ecore_x_event_modifier */ | ||
2098 | |||