2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
6 #include "ecore_private.h"
8 #include "ecore_x_private.h"
10 #include "Ecore_X_Atoms.h"
12 /** OpenBSD does not define CODESET
17 #define CODESET "INVALID"
21 static void _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev);
22 static void _ecore_x_event_free_window_prop_title_change(void *data, void *ev);
23 static void _ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev);
24 static void _ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev);
25 static void _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev);
26 static void _ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev);
28 static void _ecore_x_event_free_key_down(void *data, void *ev);
29 static void _ecore_x_event_free_key_up(void *data, void *ev);
31 static Window _ecore_x_mouse_down_last_win = 0;
32 static Window _ecore_x_mouse_down_last_last_win = 0;
33 static Window _ecore_x_mouse_down_last_event_win = 0;
34 static Window _ecore_x_mouse_down_last_last_event_win = 0;
35 static Time _ecore_x_mouse_down_last_time = 0;
36 static Time _ecore_x_mouse_down_last_last_time = 0;
37 static int _ecore_x_mouse_up_count = 0;
38 static int _ecore_x_mouse_down_did_triple = 0;
41 ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask)
43 XWindowAttributes attr;
44 XSetWindowAttributes s_attr;
47 w = DefaultRootWindow(_ecore_x_disp);
49 memset(&attr, 0, sizeof(XWindowAttributes));
50 XGetWindowAttributes(_ecore_x_disp, w, &attr);
51 s_attr.event_mask = mask | attr.your_event_mask;
52 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
56 ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask)
58 XWindowAttributes attr;
59 XSetWindowAttributes s_attr;
62 w = DefaultRootWindow(_ecore_x_disp);
64 memset(&attr, 0, sizeof(XWindowAttributes));
65 XGetWindowAttributes(_ecore_x_disp, w, &attr);
66 s_attr.event_mask = attr.your_event_mask & ~mask;
67 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
72 _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev)
74 Ecore_X_Event_Window_Prop_Name_Class_Change *e;
77 if (e->name) free(e->name);
78 if (e->clas) free(e->clas);
83 _ecore_x_event_free_window_prop_title_change(void *data, void *ev)
85 Ecore_X_Event_Window_Prop_Title_Change *e;
88 if (e->title) free(e->title);
93 _ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev)
95 Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
98 if (e->title) free(e->title);
103 _ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev)
105 Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
108 if (e->name) free(e->name);
113 _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev)
115 Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
118 if (e->name) free(e->name);
123 _ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev)
125 Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
128 if (e->name) free(e->name);
134 _ecore_x_event_free_key_down(void *data __UNUSED__, void *ev)
136 Ecore_X_Event_Key_Down *e;
139 if (e->keyname) free(e->keyname);
140 if (e->keysymbol) free(e->keysymbol);
141 if (e->key_compose) free(e->key_compose);
146 _ecore_x_event_free_key_up(void *data __UNUSED__, void *ev)
148 Ecore_X_Event_Key_Up *e;
151 if (e->keyname) free(e->keyname);
152 if (e->keysymbol) free(e->keysymbol);
153 if (e->key_compose) free(e->key_compose);
158 _ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev)
160 Ecore_X_Event_Xdnd_Enter *e;
164 for (i = 0; i < e->num_types; i++)
171 _ecore_x_event_free_selection_notify(void *data __UNUSED__, void *ev)
173 Ecore_X_Event_Selection_Notify *e;
174 Ecore_X_Selection_Data *sel;
185 _ecore_x_event_handle_key_press(XEvent *xevent)
187 Ecore_X_Event_Key_Down *e;
192 XComposeStatus status;
194 e = calloc(1, sizeof(Ecore_X_Event_Key_Down));
196 keyname = XKeysymToString(XKeycodeToKeysym(xevent->xkey.display,
197 xevent->xkey.keycode, 0));
200 snprintf(buf, sizeof(buf), "Keycode-%i", xevent->xkey.keycode);
203 e->keyname = strdup(keyname);
209 val = XLookupString((XKeyEvent *)xevent, buf, sizeof(buf), &sym, &status);
213 e->key_compose = ecore_txt_convert(nl_langinfo(CODESET), "UTF-8", buf);
215 else e->key_compose = NULL;
216 keyname = XKeysymToString(sym);
217 if (keyname) e->keysymbol = strdup(keyname);
218 else e->keysymbol = strdup(e->keyname);
221 if (e->keyname) free(e->keyname);
222 if (e->key_compose) free(e->key_compose);
226 if (xevent->xkey.subwindow) e->win = xevent->xkey.subwindow;
227 else e->win = xevent->xkey.window;
228 e->event_win = xevent->xkey.window;
229 e->time = xevent->xkey.time;
230 e->modifiers = xevent->xkey.state;
231 e->same_screen = xevent->xkey.same_screen;
232 e->root_win = xevent->xkey.root;
233 _ecore_x_event_last_time = e->time;
234 ecore_event_add(ECORE_X_EVENT_KEY_DOWN, e, _ecore_x_event_free_key_down, NULL);
238 _ecore_x_event_handle_key_release(XEvent *xevent)
240 Ecore_X_Event_Key_Up *e;
245 XComposeStatus status;
247 e = calloc(1, sizeof(Ecore_X_Event_Key_Up));
249 keyname = XKeysymToString(XKeycodeToKeysym(xevent->xkey.display,
250 xevent->xkey.keycode, 0));
253 snprintf(buf, sizeof(buf), "Keycode-%i", xevent->xkey.keycode);
256 e->keyname = strdup(keyname);
262 val = XLookupString((XKeyEvent *)xevent, buf, sizeof(buf), &sym, &status);
266 e->key_compose = ecore_txt_convert("ISO8859-1", "UTF-8", buf);
268 else e->key_compose = NULL;
269 keyname = XKeysymToString(sym);
270 if (keyname) e->keysymbol = strdup(keyname);
271 else e->keysymbol = strdup(e->keyname);
274 if (e->keyname) free(e->keyname);
275 if (e->key_compose) free(e->key_compose);
279 if (xevent->xkey.subwindow) e->win = xevent->xkey.subwindow;
280 else e->win = xevent->xkey.window;
281 e->event_win = xevent->xkey.window;
282 e->time = xevent->xkey.time;
283 e->modifiers = xevent->xkey.state;
284 e->same_screen = xevent->xkey.same_screen;
285 e->root_win = xevent->xkey.root;
286 _ecore_x_event_last_time = e->time;
287 ecore_event_add(ECORE_X_EVENT_KEY_UP, e, _ecore_x_event_free_key_up, NULL);
291 _ecore_x_event_handle_button_press(XEvent *xevent)
295 if ((xevent->xbutton.button > 3) && (xevent->xbutton.button < 8))
297 Ecore_X_Event_Mouse_Wheel *e;
299 e = malloc(sizeof(Ecore_X_Event_Mouse_Wheel));
304 e->modifiers = xevent->xbutton.state;
307 if (xevent->xbutton.button == 4)
312 else if (xevent->xbutton.button == 5)
317 else if (xevent->xbutton.button == 6)
322 else if (xevent->xbutton.button == 7)
327 e->x = xevent->xbutton.x;
328 e->y = xevent->xbutton.y;
329 e->root.x = xevent->xbutton.x_root;
330 e->root.y = xevent->xbutton.y_root;
332 if (xevent->xbutton.subwindow)
333 e->win = xevent->xbutton.subwindow;
335 e->win = xevent->xbutton.window;
337 e->event_win = xevent->xbutton.window;
338 e->same_screen = xevent->xbutton.same_screen;
339 e->root_win = xevent->xbutton.root;
340 e->time = xevent->xbutton.time;
341 _ecore_x_event_last_time = e->time;
342 _ecore_x_event_last_win = e->win;
343 _ecore_x_event_last_root_x = e->root.x;
344 _ecore_x_event_last_root_y = e->root.y;
345 ecore_event_add(ECORE_X_EVENT_MOUSE_WHEEL, e, NULL, NULL);
346 for (i = 0; i < _ecore_window_grabs_num; i++)
348 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
349 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
353 if (_ecore_window_grab_replay_func)
354 replay = _ecore_window_grab_replay_func(_ecore_window_grab_replay_data,
355 ECORE_X_EVENT_MOUSE_WHEEL,
358 XAllowEvents(xevent->xbutton.display,
360 xevent->xbutton.time);
362 XAllowEvents(xevent->xbutton.display,
364 xevent->xbutton.time);
372 Ecore_X_Event_Mouse_Move *e;
374 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
376 e->modifiers = xevent->xbutton.state;
377 e->x = xevent->xbutton.x;
378 e->y = xevent->xbutton.y;
379 e->root.x = xevent->xbutton.x_root;
380 e->root.y = xevent->xbutton.y_root;
381 if (xevent->xbutton.subwindow) e->win = xevent->xbutton.subwindow;
382 else e->win = xevent->xbutton.window;
383 e->same_screen = xevent->xbutton.same_screen;
384 e->root_win = xevent->xbutton.root;
385 e->event_win = xevent->xbutton.window;
386 e->time = xevent->xbutton.time;
387 _ecore_x_event_last_time = e->time;
388 _ecore_x_event_last_win = e->win;
389 _ecore_x_event_last_root_x = e->root.x;
390 _ecore_x_event_last_root_y = e->root.y;
391 ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
394 Ecore_X_Event_Mouse_Button_Down *e;
396 if (_ecore_x_mouse_down_did_triple)
398 _ecore_x_mouse_down_last_win = 0;
399 _ecore_x_mouse_down_last_last_win = 0;
400 _ecore_x_mouse_down_last_event_win = 0;
401 _ecore_x_mouse_down_last_last_event_win = 0;
402 _ecore_x_mouse_down_last_time = 0;
403 _ecore_x_mouse_down_last_last_time = 0;
406 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Button_Down));
408 e->button = xevent->xbutton.button;
409 e->modifiers = xevent->xbutton.state;
410 e->x = xevent->xbutton.x;
411 e->y = xevent->xbutton.y;
412 e->root.x = xevent->xbutton.x_root;
413 e->root.y = xevent->xbutton.y_root;
414 if (xevent->xbutton.subwindow) e->win = xevent->xbutton.subwindow;
415 else e->win = xevent->xbutton.window;
416 e->same_screen = xevent->xbutton.same_screen;
417 e->root_win = xevent->xbutton.root;
418 e->event_win = xevent->xbutton.window;
419 e->time = xevent->xbutton.time;
420 if (e->win == e->event_win)
422 if (((int)(e->time - _ecore_x_mouse_down_last_time) <=
423 (int)(1000 * _ecore_x_double_click_time)) &&
424 (e->win == _ecore_x_mouse_down_last_win) &&
425 (e->event_win == _ecore_x_mouse_down_last_event_win)
428 if (((int)(e->time - _ecore_x_mouse_down_last_last_time) <=
429 (int)(2 * 1000 * _ecore_x_double_click_time)) &&
430 (e->win == _ecore_x_mouse_down_last_win) &&
431 (e->win == _ecore_x_mouse_down_last_last_win) &&
432 (e->event_win == _ecore_x_mouse_down_last_event_win) &&
433 (e->event_win == _ecore_x_mouse_down_last_last_event_win)
437 _ecore_x_mouse_down_did_triple = 1;
440 _ecore_x_mouse_down_did_triple = 0;
442 if (!e->double_click && !e->triple_click)
443 _ecore_x_mouse_up_count = 0;
444 _ecore_x_event_last_time = e->time;
445 _ecore_x_event_last_win = e->win;
446 _ecore_x_event_last_root_x = e->root.x;
447 _ecore_x_event_last_root_y = e->root.y;
448 ecore_event_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
449 for (i = 0; i < _ecore_window_grabs_num; i++)
451 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
452 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
456 if (_ecore_window_grab_replay_func)
457 replay = _ecore_window_grab_replay_func(_ecore_window_grab_replay_data,
458 ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
461 XAllowEvents(xevent->xbutton.display,
463 xevent->xbutton.time);
465 XAllowEvents(xevent->xbutton.display,
467 xevent->xbutton.time);
471 if (e->win == e->event_win)
473 if (!_ecore_x_mouse_down_did_triple)
475 _ecore_x_mouse_down_last_last_win = _ecore_x_mouse_down_last_win;
476 if (xevent->xbutton.subwindow)
477 _ecore_x_mouse_down_last_win = xevent->xbutton.subwindow;
479 _ecore_x_mouse_down_last_win = xevent->xbutton.window;
480 _ecore_x_mouse_down_last_last_event_win = _ecore_x_mouse_down_last_event_win;
481 _ecore_x_mouse_down_last_event_win = xevent->xbutton.window;
482 _ecore_x_mouse_down_last_last_time = _ecore_x_mouse_down_last_time;
483 _ecore_x_mouse_down_last_time = xevent->xbutton.time;
491 _ecore_x_event_handle_button_release(XEvent *xevent)
493 /* filter out wheel buttons */
494 if ((xevent->xbutton.button <= 3) || (xevent->xbutton.button > 7))
497 Ecore_X_Event_Mouse_Move *e;
499 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
501 e->modifiers = xevent->xbutton.state;
502 e->x = xevent->xbutton.x;
503 e->y = xevent->xbutton.y;
504 e->root.x = xevent->xbutton.x_root;
505 e->root.y = xevent->xbutton.y_root;
506 if (xevent->xbutton.subwindow) e->win = xevent->xbutton.subwindow;
507 else e->win = xevent->xbutton.window;
508 e->same_screen = xevent->xbutton.same_screen;
509 e->root_win = xevent->xbutton.root;
510 e->event_win = xevent->xbutton.window;
511 e->time = xevent->xbutton.time;
512 _ecore_x_event_last_time = e->time;
513 _ecore_x_event_last_win = e->win;
514 _ecore_x_event_last_root_x = e->root.x;
515 _ecore_x_event_last_root_y = e->root.y;
516 ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
519 Ecore_X_Event_Mouse_Button_Up *e;
521 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Button_Up));
523 e->button = xevent->xbutton.button;
524 e->modifiers = xevent->xbutton.state;
525 e->x = xevent->xbutton.x;
526 e->y = xevent->xbutton.y;
527 e->root.x = xevent->xbutton.x_root;
528 e->root.y = xevent->xbutton.y_root;
529 if (xevent->xbutton.subwindow) e->win = xevent->xbutton.subwindow;
530 else e->win = xevent->xbutton.window;
531 e->same_screen = xevent->xbutton.same_screen;
532 e->root_win = xevent->xbutton.root;
533 e->event_win = xevent->xbutton.window;
534 e->time = xevent->xbutton.time;
535 _ecore_x_mouse_up_count++;
536 if (e->win == e->event_win)
538 if ((_ecore_x_mouse_up_count >= 2) &&
539 ((int)(e->time - _ecore_x_mouse_down_last_time) <=
540 (int)(1000 * _ecore_x_double_click_time)) &&
541 (e->win == _ecore_x_mouse_down_last_win) &&
542 (e->event_win == _ecore_x_mouse_down_last_event_win)
545 if ((_ecore_x_mouse_up_count >= 3) &&
546 ((int)(e->time - _ecore_x_mouse_down_last_last_time) <=
547 (int)(2 * 1000 * _ecore_x_double_click_time)) &&
548 (e->win == _ecore_x_mouse_down_last_win) &&
549 (e->win == _ecore_x_mouse_down_last_last_win) &&
550 (e->event_win == _ecore_x_mouse_down_last_event_win) &&
551 (e->event_win == _ecore_x_mouse_down_last_last_event_win)
555 _ecore_x_event_last_time = e->time;
556 _ecore_x_event_last_win = e->win;
557 _ecore_x_event_last_root_x = e->root.x;
558 _ecore_x_event_last_root_y = e->root.y;
559 ecore_event_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
565 _ecore_x_event_handle_motion_notify(XEvent *xevent)
567 Ecore_X_Event_Mouse_Move *e;
569 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
571 e->modifiers = xevent->xmotion.state;
572 e->x = xevent->xmotion.x;
573 e->y = xevent->xmotion.y;
574 e->root.x = xevent->xmotion.x_root;
575 e->root.y = xevent->xmotion.y_root;
576 if (xevent->xmotion.subwindow) e->win = xevent->xmotion.subwindow;
577 else e->win = xevent->xmotion.window;
578 e->same_screen = xevent->xmotion.same_screen;
579 e->root_win = xevent->xmotion.root;
580 e->event_win = xevent->xmotion.window;
581 e->time = xevent->xmotion.time;
582 _ecore_x_event_last_time = e->time;
583 _ecore_x_event_last_win = e->win;
584 _ecore_x_event_last_root_x = e->root.x;
585 _ecore_x_event_last_root_y = e->root.y;
588 _ecore_x_dnd_drag(xevent->xmotion.root, e->root.x, e->root.y);
590 ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
594 _ecore_x_event_handle_enter_notify(XEvent *xevent)
597 Ecore_X_Event_Mouse_Move *e;
599 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
601 e->modifiers = xevent->xcrossing.state;
602 e->x = xevent->xcrossing.x;
603 e->y = xevent->xcrossing.y;
604 e->root.x = xevent->xcrossing.x_root;
605 e->root.y = xevent->xcrossing.y_root;
606 if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
607 else e->win = xevent->xcrossing.window;
608 e->same_screen = xevent->xcrossing.same_screen;
609 e->root_win = xevent->xcrossing.root;
610 e->event_win = xevent->xcrossing.window;
611 e->time = xevent->xcrossing.time;
612 _ecore_x_event_last_time = e->time;
613 _ecore_x_event_last_win = e->win;
614 _ecore_x_event_last_root_x = e->root.x;
615 _ecore_x_event_last_root_y = e->root.y;
616 ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
619 Ecore_X_Event_Mouse_In *e;
621 e = calloc(1, sizeof(Ecore_X_Event_Mouse_In));
623 e->modifiers = xevent->xcrossing.state;
624 e->x = xevent->xcrossing.x;
625 e->y = xevent->xcrossing.y;
626 e->root.x = xevent->xcrossing.x_root;
627 e->root.y = xevent->xcrossing.y_root;
628 if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
629 else e->win = xevent->xcrossing.window;
630 e->same_screen = xevent->xcrossing.same_screen;
631 e->root_win = xevent->xcrossing.root;
632 e->event_win = xevent->xcrossing.window;
633 if (xevent->xcrossing.mode == NotifyNormal) e->mode = ECORE_X_EVENT_MODE_NORMAL;
634 else if (xevent->xcrossing.mode == NotifyGrab) e->mode = ECORE_X_EVENT_MODE_GRAB;
635 else if (xevent->xcrossing.mode == NotifyUngrab) e->mode = ECORE_X_EVENT_MODE_UNGRAB;
636 if (xevent->xcrossing.detail == NotifyAncestor) e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
637 else if (xevent->xcrossing.detail == NotifyVirtual) e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
638 else if (xevent->xcrossing.detail == NotifyInferior) e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
639 else if (xevent->xcrossing.detail == NotifyNonlinear) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
640 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
641 e->time = xevent->xcrossing.time;
642 _ecore_x_event_last_time = e->time;
643 ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
648 _ecore_x_event_handle_leave_notify(XEvent *xevent)
651 Ecore_X_Event_Mouse_Move *e;
653 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move));
655 e->modifiers = xevent->xcrossing.state;
656 e->x = xevent->xcrossing.x;
657 e->y = xevent->xcrossing.y;
658 e->root.x = xevent->xcrossing.x_root;
659 e->root.y = xevent->xcrossing.y_root;
660 if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
661 else e->win = xevent->xcrossing.window;
662 e->same_screen = xevent->xcrossing.same_screen;
663 e->root_win = xevent->xcrossing.root;
664 e->event_win = xevent->xcrossing.window;
665 e->time = xevent->xcrossing.time;
666 _ecore_x_event_last_time = e->time;
667 _ecore_x_event_last_win = e->win;
668 _ecore_x_event_last_root_x = e->root.x;
669 _ecore_x_event_last_root_y = e->root.y;
670 ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL);
673 Ecore_X_Event_Mouse_Out *e;
675 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out));
677 e->modifiers = xevent->xcrossing.state;
678 e->x = xevent->xcrossing.x;
679 e->y = xevent->xcrossing.y;
680 e->root.x = xevent->xcrossing.x_root;
681 e->root.y = xevent->xcrossing.y_root;
682 if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
683 else e->win = xevent->xcrossing.window;
684 e->same_screen = xevent->xcrossing.same_screen;
685 e->root_win = xevent->xcrossing.root;
686 e->event_win = xevent->xcrossing.window;
687 if (xevent->xcrossing.mode == NotifyNormal) e->mode = ECORE_X_EVENT_MODE_NORMAL;
688 else if (xevent->xcrossing.mode == NotifyGrab) e->mode = ECORE_X_EVENT_MODE_GRAB;
689 else if (xevent->xcrossing.mode == NotifyUngrab) e->mode = ECORE_X_EVENT_MODE_UNGRAB;
690 if (xevent->xcrossing.detail == NotifyAncestor) e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
691 else if (xevent->xcrossing.detail == NotifyVirtual) e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
692 else if (xevent->xcrossing.detail == NotifyInferior) e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
693 else if (xevent->xcrossing.detail == NotifyNonlinear) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
694 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
695 e->time = xevent->xcrossing.time;
696 _ecore_x_event_last_time = e->time;
697 _ecore_x_event_last_win = e->win;
698 _ecore_x_event_last_root_x = e->root.x;
699 _ecore_x_event_last_root_y = e->root.y;
700 ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
705 _ecore_x_event_handle_focus_in(XEvent *xevent)
707 Ecore_X_Event_Window_Focus_In *e;
709 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In));
711 e->win = xevent->xfocus.window;
712 if (xevent->xfocus.mode == NotifyNormal) e->mode = ECORE_X_EVENT_MODE_NORMAL;
713 else if (xevent->xfocus.mode == NotifyWhileGrabbed) e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
714 else if (xevent->xfocus.mode == NotifyGrab) e->mode = ECORE_X_EVENT_MODE_GRAB;
715 else if (xevent->xfocus.mode == NotifyUngrab) e->mode = ECORE_X_EVENT_MODE_UNGRAB;
716 if (xevent->xfocus.detail == NotifyAncestor) e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
717 else if (xevent->xfocus.detail == NotifyVirtual) e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
718 else if (xevent->xfocus.detail == NotifyInferior) e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
719 else if (xevent->xfocus.detail == NotifyNonlinear) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
720 else if (xevent->xfocus.detail == NotifyNonlinearVirtual) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
721 else if (xevent->xfocus.detail == NotifyPointer) e->detail = ECORE_X_EVENT_DETAIL_POINTER;
722 else if (xevent->xfocus.detail == NotifyPointerRoot) e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
723 else if (xevent->xfocus.detail == NotifyDetailNone) e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
724 e->time = _ecore_x_event_last_time;
725 _ecore_x_event_last_time = e->time;
726 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
730 _ecore_x_event_handle_focus_out(XEvent *xevent)
732 Ecore_X_Event_Window_Focus_Out *e;
734 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out));
736 e->win = xevent->xfocus.window;
737 if (xevent->xfocus.mode == NotifyNormal) e->mode = ECORE_X_EVENT_MODE_NORMAL;
738 else if (xevent->xfocus.mode == NotifyWhileGrabbed) e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
739 else if (xevent->xfocus.mode == NotifyGrab) e->mode = ECORE_X_EVENT_MODE_GRAB;
740 else if (xevent->xfocus.mode == NotifyUngrab) e->mode = ECORE_X_EVENT_MODE_UNGRAB;
741 if (xevent->xfocus.detail == NotifyAncestor) e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
742 else if (xevent->xfocus.detail == NotifyVirtual) e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
743 else if (xevent->xfocus.detail == NotifyInferior) e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
744 else if (xevent->xfocus.detail == NotifyNonlinear) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
745 else if (xevent->xfocus.detail == NotifyNonlinearVirtual) e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
746 else if (xevent->xfocus.detail == NotifyPointer) e->detail = ECORE_X_EVENT_DETAIL_POINTER;
747 else if (xevent->xfocus.detail == NotifyPointerRoot) e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
748 else if (xevent->xfocus.detail == NotifyDetailNone) e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
749 e->time = _ecore_x_event_last_time;
750 _ecore_x_event_last_time = e->time;
751 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
755 _ecore_x_event_handle_keymap_notify(XEvent *xevent __UNUSED__)
757 /* FIXME: handle this event type */
761 _ecore_x_event_handle_expose(XEvent *xevent)
763 Ecore_X_Event_Window_Damage *e;
765 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
767 e->win = xevent->xexpose.window;
768 e->time = _ecore_x_event_last_time;
769 e->x = xevent->xexpose.x;
770 e->y = xevent->xexpose.y;
771 e->w = xevent->xexpose.width;
772 e->h = xevent->xexpose.height;
773 e->count = xevent->xexpose.count;
774 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
778 _ecore_x_event_handle_graphics_expose(XEvent *xevent)
780 Ecore_X_Event_Window_Damage *e;
782 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
784 e->win = xevent->xgraphicsexpose.drawable;
785 e->time = _ecore_x_event_last_time;
786 e->x = xevent->xgraphicsexpose.x;
787 e->y = xevent->xgraphicsexpose.y;
788 e->w = xevent->xgraphicsexpose.width;
789 e->h = xevent->xgraphicsexpose.height;
790 e->count = xevent->xgraphicsexpose.count;
791 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
795 _ecore_x_event_handle_visibility_notify(XEvent *xevent)
797 // if (xevent->xvisibility.state != VisibilityPartiallyObscured)
799 Ecore_X_Event_Window_Visibility_Change *e;
801 e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change));
803 e->win = xevent->xvisibility.window;
804 e->time = _ecore_x_event_last_time;
805 if (xevent->xvisibility.state == VisibilityFullyObscured)
806 e->fully_obscured = 1;
808 e->fully_obscured = 0;
809 ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
814 _ecore_x_event_handle_create_notify(XEvent *xevent)
816 Ecore_X_Event_Window_Create *e;
818 e = calloc(1, sizeof(Ecore_X_Event_Window_Create));
820 e->win = xevent->xcreatewindow.window;
821 if (xevent->xcreatewindow.override_redirect)
825 e->time = _ecore_x_event_last_time;
826 ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
830 _ecore_x_event_handle_destroy_notify(XEvent *xevent)
832 Ecore_X_Event_Window_Destroy *e;
834 e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy));
836 e->win = xevent->xdestroywindow.window;
837 e->event_win = xevent->xdestroywindow.event;
838 e->time = _ecore_x_event_last_time;
839 if (e->win == _ecore_x_event_last_win) _ecore_x_event_last_win = 0;
840 ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
844 _ecore_x_event_handle_unmap_notify(XEvent *xevent)
846 Ecore_X_Event_Window_Hide *e;
848 e = calloc(1, sizeof(Ecore_X_Event_Window_Hide));
850 e->win = xevent->xunmap.window;
851 e->event_win = xevent->xunmap.event;
852 e->time = _ecore_x_event_last_time;
853 ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
857 _ecore_x_event_handle_map_notify(XEvent *xevent)
859 Ecore_X_Event_Window_Show *e;
861 e = calloc(1, sizeof(Ecore_X_Event_Window_Show));
863 e->win = xevent->xmap.window;
864 e->event_win = xevent->xmap.event;
865 e->time = _ecore_x_event_last_time;
866 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
870 _ecore_x_event_handle_map_request(XEvent *xevent)
872 Ecore_X_Event_Window_Show_Request *e;
874 e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request));
876 e->win = xevent->xmaprequest.window;
877 e->time = _ecore_x_event_last_time;
878 e->parent = xevent->xmaprequest.parent;
879 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, e, NULL, NULL);
883 _ecore_x_event_handle_reparent_notify(XEvent *xevent)
885 Ecore_X_Event_Window_Reparent *e;
887 e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent));
889 e->win = xevent->xreparent.window;
890 e->event_win = xevent->xreparent.event;
891 e->parent = xevent->xreparent.parent;
892 e->time = _ecore_x_event_last_time;
893 ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
897 _ecore_x_event_handle_configure_notify(XEvent *xevent)
899 Ecore_X_Event_Window_Configure *e;
901 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure));
903 e->win = xevent->xconfigure.window;
904 e->event_win = xevent->xconfigure.event;
905 e->abovewin = xevent->xconfigure.above;
906 e->x = xevent->xconfigure.x;
907 e->y = xevent->xconfigure.y;
908 e->w = xevent->xconfigure.width;
909 e->h = xevent->xconfigure.height;
910 e->border = xevent->xconfigure.border_width;
911 e->override = xevent->xconfigure.override_redirect;
912 e->from_wm = xevent->xconfigure.send_event;
913 e->time = _ecore_x_event_last_time;
914 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
918 _ecore_x_event_handle_configure_request(XEvent *xevent)
920 Ecore_X_Event_Window_Configure_Request *e;
922 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request));
924 e->win = xevent->xconfigurerequest.window;
925 e->parent_win = xevent->xconfigurerequest.parent;
926 e->abovewin = xevent->xconfigurerequest.above;
927 e->x = xevent->xconfigurerequest.x;
928 e->y = xevent->xconfigurerequest.y;
929 e->w = xevent->xconfigurerequest.width;
930 e->h = xevent->xconfigurerequest.height;
931 e->border = xevent->xconfigurerequest.border_width;
932 e->value_mask = xevent->xconfigurerequest.value_mask;
933 e->time = _ecore_x_event_last_time;
934 if (xevent->xconfigurerequest.detail == Above)
935 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
936 else if (xevent->xconfigurerequest.detail == Below)
937 e->detail = ECORE_X_WINDOW_STACK_BELOW;
938 else if (xevent->xconfigurerequest.detail == TopIf)
939 e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
940 else if (xevent->xconfigurerequest.detail == BottomIf)
941 e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
942 else if (xevent->xconfigurerequest.detail == Opposite)
943 e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
944 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
948 _ecore_x_event_handle_gravity_notify(XEvent *xevent __UNUSED__)
950 /* FIXME: handle this event type */
954 _ecore_x_event_handle_resize_request(XEvent *xevent)
956 Ecore_X_Event_Window_Resize_Request *e;
958 e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request));
960 e->win = xevent->xresizerequest.window;
961 e->w = xevent->xresizerequest.width;
962 e->h = xevent->xresizerequest.height;
963 e->time = _ecore_x_event_last_time;
964 ecore_event_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, e, NULL, NULL);
968 _ecore_x_event_handle_circulate_notify(XEvent *xevent)
970 Ecore_X_Event_Window_Stack *e;
972 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack));
974 e->win = xevent->xcirculate.window;
975 e->event_win = xevent->xcirculate.event;
976 if (xevent->xcirculate.place == PlaceOnTop)
977 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
979 e->detail = ECORE_X_WINDOW_STACK_BELOW;
980 e->time = _ecore_x_event_last_time;
981 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
985 _ecore_x_event_handle_circulate_request(XEvent *xevent)
987 Ecore_X_Event_Window_Stack_Request *e;
989 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request));
991 e->win = xevent->xcirculaterequest.window;
992 e->parent = xevent->xcirculaterequest.parent;
993 if (xevent->xcirculaterequest.place == PlaceOnTop)
994 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
996 e->detail = ECORE_X_WINDOW_STACK_BELOW;
997 e->time = _ecore_x_event_last_time;
998 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
1002 _ecore_x_event_handle_property_notify(XEvent *xevent)
1004 #if 0 /* for now i disabled this. nice idea though this is - it leaves a lot
1005 * to be desired for efficiency that is better left to the app layer
1007 if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLASS)
1009 Ecore_X_Event_Window_Prop_Name_Class_Change *e;
1011 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Name_Class_Change));
1013 ecore_x_window_prop_name_class_get(xevent->xproperty.window,
1014 &(e->name), &(e->clas));
1015 e->time = xevent->xproperty.time;
1016 _ecore_x_event_last_time = e->time;
1017 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE, e, _ecore_x_event_free_window_prop_name_class_change, NULL);
1019 else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_NAME) || (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_NAME))
1021 Ecore_X_Event_Window_Prop_Title_Change *e;
1023 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Title_Change));
1025 e->title = ecore_x_window_prop_title_get(xevent->xproperty.window);
1026 e->time = xevent->xproperty.time;
1027 _ecore_x_event_last_time = e->time;
1028 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE, e, _ecore_x_event_free_window_prop_title_change, NULL);
1030 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_NAME)
1032 Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
1034 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Title_Change));
1036 e->title = ecore_x_window_prop_visible_title_get(xevent->xproperty.window);
1037 e->time = xevent->xproperty.time;
1038 _ecore_x_event_last_time = e->time;
1039 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE, e, _ecore_x_event_free_window_prop_visible_title_change, NULL);
1041 else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_ICON_NAME) || (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_ICON_NAME))
1043 Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
1045 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Icon_Name_Change));
1047 e->name = ecore_x_window_prop_icon_name_get(xevent->xproperty.window);
1048 e->time = xevent->xproperty.time;
1049 _ecore_x_event_last_time = e->time;
1050 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE, e, _ecore_x_event_free_window_prop_icon_name_change, NULL);
1052 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME)
1054 Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
1056 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change));
1058 e->name = ecore_x_window_prop_visible_icon_name_get(xevent->xproperty.window);
1059 e->time = xevent->xproperty.time;
1060 _ecore_x_event_last_time = e->time;
1061 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE, e, _ecore_x_event_free_window_prop_visible_icon_name_change, NULL);
1063 else if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLIENT_MACHINE)
1065 Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
1067 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Client_Machine_Change));
1069 e->name = ecore_x_window_prop_client_machine_get(xevent->xproperty.window);
1070 e->time = xevent->xproperty.time;
1071 _ecore_x_event_last_time = e->time;
1072 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE, e, _ecore_x_event_free_window_prop_client_machine_change, NULL);
1074 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_PID)
1076 Ecore_X_Event_Window_Prop_Pid_Change *e;
1078 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Pid_Change));
1080 e->pid = ecore_x_window_prop_pid_get(xevent->xproperty.window);
1081 e->time = xevent->xproperty.time;
1082 _ecore_x_event_last_time = e->time;
1083 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
1085 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_DESKTOP)
1087 Ecore_X_Event_Window_Prop_Desktop_Change *e;
1089 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Desktop_Change));
1091 e->desktop = ecore_x_window_prop_desktop_get(xevent->xproperty.window);
1092 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
1097 Ecore_X_Event_Window_Property *e;
1099 e = calloc(1,sizeof(Ecore_X_Event_Window_Property));
1101 e->win = xevent->xproperty.window;
1102 e->atom = xevent->xproperty.atom;
1103 e->time = xevent->xproperty.time;
1104 _ecore_x_event_last_time = e->time;
1105 ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
1110 _ecore_x_event_handle_selection_clear(XEvent *xevent)
1112 Ecore_X_Selection_Intern *d;
1113 Ecore_X_Event_Selection_Clear *e;
1116 if (!(d = _ecore_x_selection_get(xevent->xselectionclear.selection)))
1118 if (xevent->xselectionclear.time > d->time)
1120 _ecore_x_selection_set(None, NULL, 0,
1121 xevent->xselectionclear.selection);
1124 /* Generate event for app cleanup */
1125 e = malloc(sizeof(Ecore_X_Event_Selection_Clear));
1126 e->win = xevent->xselectionclear.window;
1127 e->time = xevent->xselectionclear.time;
1128 sel = xevent->xselectionclear.selection;
1129 if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
1130 e->selection = ECORE_X_SELECTION_PRIMARY;
1131 else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
1132 e->selection = ECORE_X_SELECTION_SECONDARY;
1134 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1135 ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
1140 _ecore_x_event_handle_selection_request(XEvent *xevent)
1142 Ecore_X_Event_Selection_Request *e;
1143 Ecore_X_Selection_Intern *sd;
1147 * Generate a selection request event.
1149 e = malloc(sizeof(Ecore_X_Event_Selection_Request));
1150 e->owner = xevent->xselectionrequest.owner;
1151 e->requestor = xevent->xselectionrequest.requestor;
1152 e->time = xevent->xselectionrequest.time;
1153 e->selection = xevent->xselectionrequest.selection;
1154 e->target = xevent->xselectionrequest.target;
1155 e->property = xevent->xselectionrequest.property;
1156 ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL);
1158 if ((sd = _ecore_x_selection_get(xevent->xselectionrequest.selection)) &&
1159 (sd->win == xevent->xselectionrequest.owner))
1161 Ecore_X_Selection_Intern *si;
1163 si = _ecore_x_selection_get(xevent->xselectionrequest.selection);
1166 Ecore_X_Atom property;
1168 if (!ecore_x_selection_convert(xevent->xselectionrequest.selection,
1169 xevent->xselectionrequest.target,
1172 /* Refuse selection, conversion to requested target failed */
1177 /* FIXME: This does not properly handle large data transfers */
1178 ecore_x_window_prop_property_set(xevent->xselectionrequest.requestor,
1179 xevent->xselectionrequest.property,
1180 xevent->xselectionrequest.target,
1181 8, data, sd->length);
1182 property = xevent->xselectionrequest.property;
1186 ecore_x_selection_notify_send(xevent->xselectionrequest.requestor,
1187 xevent->xselectionrequest.selection,
1188 xevent->xselectionrequest.target,
1190 xevent->xselectionrequest.time);
1197 _ecore_x_event_handle_selection_notify(XEvent *xevent)
1199 Ecore_X_Event_Selection_Notify *e;
1200 unsigned char *data = NULL;
1201 Ecore_X_Atom selection;
1205 selection = xevent->xselection.selection;
1207 if (xevent->xselection.target == ECORE_X_ATOM_SELECTION_TARGETS)
1209 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1210 xevent->xselection.property,
1211 XA_ATOM, 32, &data, &num_ret);
1217 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1218 xevent->xselection.property,
1219 AnyPropertyType, 8, &data,
1225 e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
1227 e->win = xevent->xselection.requestor;
1228 e->time = xevent->xselection.time;
1229 e->target = _ecore_x_selection_target_get(xevent->xselection.target);
1231 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
1232 e->selection = ECORE_X_SELECTION_PRIMARY;
1233 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
1234 e->selection = ECORE_X_SELECTION_SECONDARY;
1235 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
1236 e->selection = ECORE_X_SELECTION_XDND;
1237 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1238 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1244 e->data = _ecore_x_selection_parse(e->target, data, num_ret, format);
1246 ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e, _ecore_x_event_free_selection_notify, NULL);
1250 _ecore_x_event_handle_colormap_notify(XEvent *xevent)
1252 Ecore_X_Event_Window_Colormap *e;
1254 e = calloc(1,sizeof(Ecore_X_Event_Window_Colormap));
1256 e->win = xevent->xcolormap.window;
1257 e->cmap = xevent->xcolormap.colormap;
1258 e->time = _ecore_x_event_last_time;
1259 if (xevent->xcolormap.state == ColormapInstalled)
1263 ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
1267 _ecore_x_event_handle_client_message(XEvent *xevent)
1269 /* Special client message event handling here. need to put LOTS of if */
1270 /* checks here and generate synthetic events per special message known */
1271 /* otherwise generate generic client message event. this would handle*/
1272 /* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
1273 if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
1274 (xevent->xclient.format == 32) &&
1275 (xevent->xclient.data.l[0] == (long)ECORE_X_ATOM_WM_DELETE_WINDOW))
1277 Ecore_X_Event_Window_Delete_Request *e;
1279 e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
1281 e->win = xevent->xclient.window;
1282 e->time = _ecore_x_event_last_time;
1283 ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
1286 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
1287 (xevent->xclient.format == 32) &&
1288 /* Ignore move and resize with keyboard */
1289 (xevent->xclient.data.l[2] < 9))
1291 Ecore_X_Event_Window_Move_Resize_Request *e;
1293 e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request));
1295 e->win = xevent->xclient.window;
1296 e->x = xevent->xclient.data.l[0];
1297 e->y = xevent->xclient.data.l[1];
1298 e->direction = xevent->xclient.data.l[2];
1299 e->button = xevent->xclient.data.l[3];
1300 e->source = xevent->xclient.data.l[4];
1301 ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
1304 /* Xdnd Client Message Handling Begin */
1305 /* Message Type: XdndEnter target */
1306 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_ENTER)
1308 Ecore_X_Event_Xdnd_Enter *e;
1309 Ecore_X_DND_Target *target;
1310 unsigned long three;
1312 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
1315 target = _ecore_x_dnd_target_get();
1316 target->state = ECORE_X_DND_TARGET_ENTERED;
1317 target->source = xevent->xclient.data.l[0];
1318 target->win = xevent->xclient.window;
1319 target->version = (int) (xevent->xclient.data.l[1] >> 24);
1320 if (target->version > ECORE_X_DND_VERSION)
1322 printf("DND: Requested version %d, we only support up to %d\n", target->version,
1323 ECORE_X_DND_VERSION);
1327 if ((three = xevent->xclient.data.l[1] & 0x1UL))
1329 /* source supports more than 3 types, fetch property */
1330 unsigned char *data;
1331 Ecore_X_Atom *types;
1333 if (!(ecore_x_window_prop_property_get(target->source,
1334 ECORE_X_ATOM_XDND_TYPE_LIST,
1340 printf("DND: Could not fetch data type list from source window, aborting.\n");
1343 types = (Ecore_X_Atom *)data;
1344 e->types = calloc(num_ret, sizeof(char *));
1347 for (i = 0; i < num_ret; i++)
1348 e->types[i] = XGetAtomName(_ecore_x_disp, types[i]);
1350 e->num_types = num_ret;
1356 e->types = calloc(3, sizeof(char *));
1359 while ((i < 3) && (xevent->xclient.data.l[i + 2]))
1361 e->types[i] = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[i + 2]);
1368 e->win = target->win;
1369 e->source = target->source;
1370 ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e, _ecore_x_event_free_xdnd_enter, NULL);
1373 /* Message Type: XdndPosition target */
1374 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_POSITION)
1376 Ecore_X_Event_Xdnd_Position *e;
1377 Ecore_X_DND_Target *target;
1379 target = _ecore_x_dnd_target_get();
1380 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1381 (target->win != xevent->xclient.window))
1384 target->pos.x = xevent->xclient.data.l[2] >> 16;
1385 target->pos.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1386 target->action = xevent->xclient.data.l[4]; /* Version 2 */
1388 target->time = (target->version >= 1) ?
1389 (Time)xevent->xclient.data.l[3] : CurrentTime;
1391 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
1393 e->win = target->win;
1394 e->source = target->source;
1395 e->position.x = target->pos.x;
1396 e->position.y = target->pos.y;
1397 e->action = target->action;
1398 ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
1401 /* Message Type: XdndStatus source */
1402 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_STATUS)
1404 Ecore_X_Event_Xdnd_Status *e;
1405 Ecore_X_DND_Source *source;
1407 source = _ecore_x_dnd_source_get();
1408 /* Make sure source/target match */
1409 if ((source->win != xevent->xclient.window ) ||
1410 (source->dest != (Window)xevent->xclient.data.l[0]))
1413 source->await_status = 0;
1415 source->will_accept = xevent->xclient.data.l[1] & 0x1UL;
1416 source->suppress = (xevent->xclient.data.l[1] & 0x2UL) ? 0 : 1;
1418 source->rectangle.x = xevent->xclient.data.l[2] >> 16;
1419 source->rectangle.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1420 source->rectangle.width = xevent->xclient.data.l[3] >> 16;
1421 source->rectangle.height = xevent->xclient.data.l[3] & 0xFFFFUL;
1423 source->accepted_action = xevent->xclient.data.l[4];
1425 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
1427 e->win = source->win;
1428 e->target = source->dest;
1429 e->will_accept = source->will_accept;
1430 e->rectangle.x = source->rectangle.x;
1431 e->rectangle.y = source->rectangle.y;
1432 e->rectangle.width = source->rectangle.width;
1433 e->rectangle.height = source->rectangle.height;
1434 e->action = source->accepted_action;
1436 ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
1439 /* Message Type: XdndLeave target */
1440 /* Pretend the whole thing never happened, sort of */
1441 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_LEAVE)
1443 Ecore_X_Event_Xdnd_Leave *e;
1444 Ecore_X_DND_Target *target;
1446 target = _ecore_x_dnd_target_get();
1447 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1448 (target->win != xevent->xclient.window))
1451 target->state = ECORE_X_DND_TARGET_IDLE;
1453 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
1455 e->win = xevent->xclient.window;
1456 e->source = (Window)xevent->xclient.data.l[0];
1457 ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
1460 /* Message Type: XdndDrop target */
1461 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_DROP)
1463 Ecore_X_Event_Xdnd_Drop *e;
1464 Ecore_X_DND_Target *target;
1466 target = _ecore_x_dnd_target_get();
1467 /* Match source/target */
1468 if ((target->source != (Window)xevent->xclient.data.l[0]) ||
1469 (target->win != xevent->xclient.window))
1472 target->time = (target->version >= 1) ?
1473 (Time)xevent->xclient.data.l[2] : _ecore_x_event_last_time;
1475 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
1477 e->win = target->win;
1478 e->source = target->source;
1479 e->action = target->action;
1480 e->position.x = target->pos.x;
1481 e->position.y = target->pos.y;
1482 ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
1485 /* Message Type: XdndFinished source */
1486 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_FINISHED)
1488 Ecore_X_Event_Xdnd_Finished *e;
1489 Ecore_X_DND_Source *source;
1492 source = _ecore_x_dnd_source_get();
1493 /* Match source/target */
1494 if ((source->win != xevent->xclient.window) ||
1495 (source->dest != (Window)xevent->xclient.data.l[0]))
1498 if ((source->version < 5) || (xevent->xclient.data.l[1] & 0x1UL))
1500 /* Target successfully performed drop action */
1501 ecore_x_selection_xdnd_clear();
1502 source->state = ECORE_X_DND_SOURCE_IDLE;
1504 else if (source->version >= 5)
1507 source->state = ECORE_X_DND_SOURCE_CONVERTING;
1509 /* FIXME: Probably need to add a timer to switch back to idle
1510 * and discard the selection data */
1513 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
1515 e->win = source->win;
1516 e->target = source->dest;
1517 e->completed = completed;
1518 if (source->version >= 5)
1520 source->accepted_action = xevent->xclient.data.l[2];
1521 e->action = source->accepted_action;
1525 source->accepted_action = 0;
1526 e->action = source->action;
1529 ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
1531 else if (xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_STATE)
1533 Ecore_X_Event_Window_State_Request *e;
1535 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1537 e->win = xevent->xclient.window;
1538 if (xevent->xclient.data.l[0] == 0)
1539 e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
1540 else if (xevent->xclient.data.l[0] == 1)
1541 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1542 else if (xevent->xclient.data.l[0] == 2)
1543 e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
1549 e->state[0] = _ecore_x_netwm_state_get(xevent->xclient.data.l[1]);
1550 if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
1553 name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[1]);
1555 printf("Unknown state: %s\n", name);
1558 e->state[1] = _ecore_x_netwm_state_get(xevent->xclient.data.l[2]);
1559 if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
1562 name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[2]);
1564 printf("Unknown state: %s\n", name);
1567 e->source = xevent->xclient.data.l[3];
1569 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1571 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_CHANGE_STATE)
1572 && (xevent->xclient.format == 32)
1573 && (xevent->xclient.data.l[0] == IconicState))
1575 Ecore_X_Event_Window_State_Request *e;
1577 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1579 e->win = xevent->xclient.window;
1580 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1581 e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
1583 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1585 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_DESKTOP)
1586 && (xevent->xclient.format == 32))
1588 Ecore_X_Event_Desktop_Change *e;
1590 e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change));
1592 e->win = xevent->xclient.window;
1593 e->desk = xevent->xclient.data.l[0];
1594 e->source = xevent->xclient.data.l[1];
1596 ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
1598 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS))
1600 Ecore_X_Event_Frame_Extents_Request *e;
1602 e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request));
1604 e->win = xevent->xclient.window;
1606 ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
1608 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS)
1609 && ((Ecore_X_Atom)xevent->xclient.data.l[0] == ECORE_X_ATOM_NET_WM_PING)
1610 && (xevent->xclient.format == 32))
1612 Ecore_X_Event_Ping *e;
1614 e = calloc(1, sizeof(Ecore_X_Event_Ping));
1616 e->win = xevent->xclient.window;
1617 e->time = xevent->xclient.data.l[1];
1618 e->event_win = xevent->xclient.data.l[2];
1620 ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
1622 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
1623 (xevent->xclient.format == 8))
1625 _ecore_x_netwm_startup_info_begin(xevent->xclient.window, xevent->xclient.data.b);
1627 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO) &&
1628 (xevent->xclient.format == 8))
1630 _ecore_x_netwm_startup_info(xevent->xclient.window, xevent->xclient.data.b);
1632 else if ((xevent->xclient.message_type == 27777)
1633 && (xevent->xclient.data.l[0] == 0x7162534)
1634 && (xevent->xclient.format == 32)
1635 && (xevent->xclient.window == _ecore_x_private_win))
1637 /* a grab sync marker */
1638 if (xevent->xclient.data.l[1] == 0x10000001)
1639 _ecore_x_window_grab_remove(xevent->xclient.data.l[2]);
1640 else if (xevent->xclient.data.l[1] == 0x10000002)
1641 _ecore_x_key_grab_remove(xevent->xclient.data.l[2]);
1645 Ecore_X_Event_Client_Message *e;
1648 e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
1650 e->win = xevent->xclient.window;
1651 e->message_type = xevent->xclient.message_type;
1652 e->format = xevent->xclient.format;
1653 for (i = 0; i < 5; i++)
1654 e->data.l[i] = xevent->xclient.data.l[i];
1656 ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
1661 _ecore_x_event_handle_mapping_notify(XEvent *xevent __UNUSED__)
1663 /* FIXME: handle this event type */
1667 _ecore_x_event_handle_shape_change(XEvent *xevent)
1669 XShapeEvent *shape_event;
1670 Ecore_X_Event_Window_Shape *e;
1672 shape_event = (XShapeEvent *)xevent;
1673 e = calloc(1, sizeof(Ecore_X_Event_Window_Shape));
1675 e->win = shape_event->window;
1676 e->time = shape_event->time;
1677 ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
1681 _ecore_x_event_handle_screensaver_notify(XEvent *xevent)
1684 XScreenSaverNotifyEvent *screensaver_event;
1685 Ecore_X_Event_Screensaver_Notify *e;
1687 screensaver_event = (XScreenSaverNotifyEvent *)xevent;
1688 e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify));
1690 e->win = screensaver_event->window;
1691 if (screensaver_event->state == ScreenSaverOn)
1695 e->time = screensaver_event->time;
1696 ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
1703 _ecore_x_event_handle_sync_counter(XEvent *xevent)
1705 XSyncCounterNotifyEvent *sync_counter_event;
1706 Ecore_X_Event_Sync_Counter *e;
1708 sync_counter_event = (XSyncCounterNotifyEvent *)xevent;
1709 e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter));
1711 e->time = sync_counter_event->time;
1712 ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
1716 _ecore_x_event_handle_sync_alarm(XEvent *xevent)
1718 XSyncAlarmNotifyEvent *sync_alarm_event;
1719 Ecore_X_Event_Sync_Alarm *e;
1721 sync_alarm_event = (XSyncAlarmNotifyEvent *)xevent;
1723 e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm));
1725 e->time = sync_alarm_event->time;
1726 e->alarm = sync_alarm_event->alarm;
1727 ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
1732 _ecore_x_event_handle_randr_change(XEvent *xevent)
1734 XRRScreenChangeNotifyEvent *randr_event;
1735 Ecore_X_Event_Screen_Change *e;
1737 randr_event = (XRRScreenChangeNotifyEvent *)xevent;
1738 if (!XRRUpdateConfiguration(xevent))
1739 printf("ERROR: Can't update RR config!\n");
1741 e = calloc(1, sizeof(Ecore_X_Event_Screen_Change));
1743 e->win = randr_event->window;
1744 e->root = randr_event->root;
1745 e->width = randr_event->width;
1746 e->height = randr_event->height;
1747 ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
1753 _ecore_x_event_handle_fixes_selection_notify(XEvent *event)
1755 /* Nothing here yet */
1760 #ifdef ECORE_XDAMAGE
1762 _ecore_x_event_handle_damage_notify(XEvent *event)
1764 XDamageNotifyEvent *damage_event;
1765 Ecore_X_Event_Damage *e;
1767 damage_event = (XDamageNotifyEvent *)event;
1769 e = calloc(1, sizeof(Ecore_X_Event_Damage));
1772 e->level = damage_event->level;
1773 e->drawable = damage_event->drawable;
1774 e->damage = damage_event->damage;
1775 e->more = damage_event->more;
1776 e->time = damage_event->timestamp;
1777 e->area.x = damage_event->area.x;
1778 e->area.y = damage_event->area.y;
1779 e->area.width = damage_event->area.width;
1780 e->area.height = damage_event->area.height;
1781 e->geometry.x = damage_event->geometry.x;
1782 e->geometry.y = damage_event->geometry.y;
1783 e->geometry.width = damage_event->geometry.width;
1784 e->geometry.height = damage_event->geometry.height;
1786 ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);