3 #endif /* ifdef HAVE_CONFIG_H */
12 #include "ecore_private.h"
13 #include "ecore_x_private.h"
15 #include "Ecore_X_Atoms.h"
17 /** OpenBSD does not define CODESET
22 #define CODESET "INVALID"
23 #endif /* ifndef CODESET */
26 static void _ecore_x_event_free_window_prop_name_class_change(void *data,
28 static void _ecore_x_event_free_window_prop_title_change(void *data, void *ev);
29 static void _ecore_x_event_free_window_prop_visible_title_change(void *data,
31 static void _ecore_x_event_free_window_prop_icon_name_change(void *data,
33 static void _ecore_x_event_free_window_prop_visible_icon_name_change(void *data,
35 static void _ecore_x_event_free_window_prop_client_machine_change(void *data,
39 static Window _ecore_x_mouse_down_last_win = 0;
40 static Window _ecore_x_mouse_down_last_last_win = 0;
41 static Window _ecore_x_mouse_down_last_event_win = 0;
42 static Window _ecore_x_mouse_down_last_last_event_win = 0;
43 static Time _ecore_x_mouse_down_last_time = 0;
44 static Time _ecore_x_mouse_down_last_last_time = 0;
45 static int _ecore_x_mouse_up_count = 0;
46 static int _ecore_x_mouse_down_did_double = 0;
47 static int _ecore_x_mouse_down_did_triple = 0;
48 static int _ecore_x_last_event_mouse_move = 0;
49 static Ecore_Event *_ecore_x_last_event_mouse_move_event = NULL;
52 _ecore_x_event_free_mouse_move(void *data __UNUSED__, void *ev)
54 Ecore_Event_Mouse_Move *e;
57 if (_ecore_x_last_event_mouse_move)
59 _ecore_x_last_event_mouse_move_event = NULL;
60 _ecore_x_last_event_mouse_move = 0;
64 } /* _ecore_x_event_free_mouse_move */
67 ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask)
69 XWindowAttributes attr;
70 XSetWindowAttributes s_attr;
72 LOGFN(__FILE__, __LINE__, __FUNCTION__);
74 w = DefaultRootWindow(_ecore_x_disp);
76 memset(&attr, 0, sizeof(XWindowAttributes));
77 XGetWindowAttributes(_ecore_x_disp, w, &attr);
78 s_attr.event_mask = mask | attr.your_event_mask;
79 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
80 } /* ecore_x_event_mask_set */
83 ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask)
85 XWindowAttributes attr;
86 XSetWindowAttributes s_attr;
88 LOGFN(__FILE__, __LINE__, __FUNCTION__);
90 w = DefaultRootWindow(_ecore_x_disp);
92 memset(&attr, 0, sizeof(XWindowAttributes));
93 XGetWindowAttributes(_ecore_x_disp, w, &attr);
94 s_attr.event_mask = attr.your_event_mask & ~mask;
95 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
96 } /* ecore_x_event_mask_unset */
100 _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev)
102 Ecore_X_Event_Window_Prop_Name_Class_Change *e;
112 } /* _ecore_x_event_free_window_prop_name_class_change */
115 _ecore_x_event_free_window_prop_title_change(void *data, void *ev)
117 Ecore_X_Event_Window_Prop_Title_Change *e;
124 } /* _ecore_x_event_free_window_prop_title_change */
127 _ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev)
129 Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
136 } /* _ecore_x_event_free_window_prop_visible_title_change */
139 _ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev)
141 Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
148 } /* _ecore_x_event_free_window_prop_icon_name_change */
151 _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev)
153 Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
160 } /* _ecore_x_event_free_window_prop_visible_icon_name_change */
163 _ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev)
165 Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
172 } /* _ecore_x_event_free_window_prop_client_machine_change */
177 _ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev)
179 Ecore_X_Event_Xdnd_Enter *e;
183 for (i = 0; i < e->num_types; i++)
187 } /* _ecore_x_event_free_xdnd_enter */
190 _ecore_x_event_free_selection_notify(void *data __UNUSED__, void *ev)
192 Ecore_X_Event_Selection_Notify *e;
193 Ecore_X_Selection_Data *sel;
202 } /* _ecore_x_event_free_selection_notify */
205 _ecore_x_event_modifiers(unsigned int state)
207 unsigned int modifiers = 0;
209 if (state & ECORE_X_MODIFIER_SHIFT)
210 modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
212 if (state & ECORE_X_MODIFIER_CTRL)
213 modifiers |= ECORE_EVENT_MODIFIER_CTRL;
215 if (state & ECORE_X_MODIFIER_ALT)
216 modifiers |= ECORE_EVENT_MODIFIER_ALT;
218 if (state & ECORE_X_MODIFIER_WIN)
219 modifiers |= ECORE_EVENT_MODIFIER_WIN;
221 if (state & ECORE_X_LOCK_SCROLL)
222 modifiers |= ECORE_EVENT_LOCK_SCROLL;
224 if (state & ECORE_X_LOCK_NUM)
225 modifiers |= ECORE_EVENT_LOCK_NUM;
227 if (state & ECORE_X_LOCK_CAPS)
228 modifiers |= ECORE_EVENT_LOCK_CAPS;
231 } /* _ecore_x_event_modifiers */
234 _ecore_mouse_move(unsigned int timestamp,
235 unsigned int xmodifiers,
240 unsigned int event_window,
242 unsigned int root_win,
254 Ecore_Event_Mouse_Move *e;
257 e = malloc(sizeof(Ecore_Event_Mouse_Move));
262 e->root_window = root_win;
263 e->timestamp = timestamp;
264 e->same_screen = same_screen;
265 e->event_window = event_window;
267 e->modifiers = _ecore_x_event_modifiers(xmodifiers);
273 e->multi.device = dev;
274 e->multi.radius = (radx + rady) / 2;
275 e->multi.radius_x = radx;
276 e->multi.radius_y = rady;
277 e->multi.pressure = pressure;
278 e->multi.angle = angle;
281 e->multi.root.x = mrx;
282 e->multi.root.y = mry;
284 event = ecore_event_add(ECORE_EVENT_MOUSE_MOVE,
286 _ecore_x_event_free_mouse_move,
289 _ecore_x_event_last_time = timestamp;
290 _ecore_x_event_last_win = window;
291 _ecore_x_event_last_root_x = x_root;
292 _ecore_x_event_last_root_y = y_root;
294 _ecore_x_last_event_mouse_move_event = event;
295 } /* _ecore_mouse_move */
298 _ecore_key_press(int event, XKeyEvent *xevent)
301 char *compose = NULL;
305 char keyname_buffer[256];
306 char compose_buffer[256];
308 XComposeStatus status;
311 _ecore_x_last_event_mouse_move = 0;
312 keyname = XKeysymToString(XKeycodeToKeysym(xevent->display,
313 xevent->keycode, 0));
316 snprintf(keyname_buffer,
317 sizeof(keyname_buffer),
320 keyname = keyname_buffer;
331 #ifdef X_HAVE_UTF8_STRING
332 val = Xutf8LookupString(_ecore_x_ic,
335 sizeof(compose_buffer) - 1,
338 #else /* ifdef X_HAVE_UTF8_STRING */
339 val = XmbLookupString(_ecore_x_ic,
342 sizeof(compose_buffer) - 1,
345 #endif /* ifdef X_HAVE_UTF8_STRING */
346 if (mbstatus == XBufferOverflow)
348 tmp = malloc(sizeof (char) * (val + 1));
354 #ifdef X_HAVE_UTF8_STRING
355 val = Xutf8LookupString(_ecore_x_ic,
361 #else /* ifdef X_HAVE_UTF8_STRING */
362 val = XmbLookupString(_ecore_x_ic,
368 #endif /* ifdef X_HAVE_UTF8_STRING */
373 #ifndef X_HAVE_UTF8_STRING
374 compose = eina_str_convert(nl_langinfo(CODESET), "UTF-8", tmp);
377 #endif /* ifndef X_HAVE_UTF8_STRING */
385 compose_buffer[val] = 0;
386 #ifdef X_HAVE_UTF8_STRING
387 compose = compose_buffer;
388 #else /* ifdef X_HAVE_UTF8_STRING */
389 compose = eina_str_convert(nl_langinfo(
390 CODESET), "UTF-8", compose_buffer);
392 #endif /* ifdef X_HAVE_UTF8_STRING */
397 val = XLookupString(xevent,
399 sizeof(compose_buffer),
404 compose_buffer[val] = 0;
405 compose = eina_str_convert(nl_langinfo(
406 CODESET), "UTF-8", compose_buffer);
411 key = XKeysymToString(sym);
419 malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
420 (compose ? strlen(compose) : 0) + 3);
424 e->keyname = (char *)(e + 1);
425 e->key = e->keyname + strlen(keyname) + 1;
426 e->compose = (compose) ? e->key + strlen(key) + 1 : NULL;
427 e->string = e->compose;
429 strcpy((char *)e->keyname, keyname);
430 strcpy((char *)e->key, key);
432 strcpy((char *)e->compose, compose);
434 e->modifiers = _ecore_x_event_modifiers(xevent->state);
436 e->timestamp = xevent->time;
437 e->window = xevent->subwindow ? xevent->subwindow : xevent->window;
438 e->event_window = xevent->window;
439 e->same_screen = xevent->same_screen;
440 e->root_window = xevent->root;
442 ecore_event_add(event, e, NULL, NULL);
444 _ecore_x_event_last_time = e->timestamp;
449 } /* _ecore_key_press */
451 Ecore_Event_Mouse_Button *
452 _ecore_mouse_button(int event,
453 unsigned int timestamp,
454 unsigned int xmodifiers,
455 unsigned int buttons,
460 unsigned int event_window,
462 unsigned int root_win,
474 Ecore_Event_Mouse_Button *e;
476 e = malloc(sizeof(Ecore_Event_Mouse_Button));
481 e->root_window = root_win;
482 e->timestamp = timestamp;
483 e->same_screen = same_screen;
484 e->event_window = event_window;
486 e->buttons = buttons;
487 e->modifiers = _ecore_x_event_modifiers(xmodifiers);
495 if (event_window == window)
497 if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
499 if (((int)(timestamp - _ecore_x_mouse_down_last_time) <=
500 (int)(1000 * _ecore_x_double_click_time)) &&
501 (window == _ecore_x_mouse_down_last_win) &&
502 (event_window == _ecore_x_mouse_down_last_event_win)
506 _ecore_x_mouse_down_did_double = 1;
510 _ecore_x_mouse_down_did_double = 0;
511 _ecore_x_mouse_down_did_triple = 0;
514 if (((int)(timestamp - _ecore_x_mouse_down_last_last_time) <=
515 (int)(2 * 1000 * _ecore_x_double_click_time)) &&
516 (window == _ecore_x_mouse_down_last_win) &&
517 (window == _ecore_x_mouse_down_last_last_win) &&
518 (event_window == _ecore_x_mouse_down_last_event_win) &&
519 (event_window == _ecore_x_mouse_down_last_last_event_win)
523 _ecore_x_mouse_down_did_triple = 1;
527 _ecore_x_mouse_down_did_triple = 0;
532 if (_ecore_x_mouse_down_did_double)
534 if (_ecore_x_mouse_down_did_triple)
540 if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN
543 _ecore_x_mouse_up_count = 0;
545 e->multi.device = dev;
546 e->multi.radius = (radx + rady) / 2;
547 e->multi.radius_x = radx;
548 e->multi.radius_y = rady;
549 e->multi.pressure = pressure;
550 e->multi.angle = angle;
553 e->multi.root.x = mrx;
554 e->multi.root.y = mry;
556 _ecore_x_event_last_time = e->timestamp;
557 _ecore_x_event_last_win = e->window;
558 _ecore_x_event_last_root_x = x_root;
559 _ecore_x_event_last_root_y = y_root;
561 ecore_event_add(event, e, NULL, NULL);
564 } /* _ecore_mouse_button */
567 _ecore_x_event_handle_any_event(XEvent *xevent)
569 XEvent *ev = malloc(sizeof(XEvent));
571 memcpy(ev, xevent, sizeof(XEvent));
572 ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
573 } /* _ecore_x_event_handle_any_event */
576 _ecore_x_event_handle_key_press(XEvent *xevent)
578 _ecore_key_press(ECORE_EVENT_KEY_DOWN, (XKeyEvent *)xevent);
579 } /* _ecore_x_event_handle_key_press */
582 _ecore_x_event_handle_key_release(XEvent *xevent)
584 _ecore_key_press(ECORE_EVENT_KEY_UP, (XKeyEvent *)xevent);
585 } /* _ecore_x_event_handle_key_release */
588 _ecore_x_event_handle_button_press(XEvent *xevent)
592 _ecore_x_last_event_mouse_move = 0;
593 if ((xevent->xbutton.button > 3) && (xevent->xbutton.button < 8))
595 Ecore_Event_Mouse_Wheel *e;
597 e = malloc(sizeof(Ecore_Event_Mouse_Wheel));
601 e->timestamp = xevent->xbutton.time;
602 e->modifiers = _ecore_x_event_modifiers(xevent->xbutton.state);
603 switch (xevent->xbutton.button)
605 case 4: e->direction = 0; e->z = -1; break;
607 case 5: e->direction = 0; e->z = 1; break;
609 case 6: e->direction = 1; e->z = -1; break;
611 case 7: e->direction = 1; e->z = 1; break;
613 default: e->direction = 0; e->z = 0; break;
616 e->x = xevent->xbutton.x;
617 e->y = xevent->xbutton.y;
618 e->root.x = xevent->xbutton.x_root;
619 e->root.y = xevent->xbutton.y_root;
621 if (xevent->xbutton.subwindow)
622 e->window = xevent->xbutton.subwindow;
624 e->window = xevent->xbutton.window;
626 e->event_window = xevent->xbutton.window;
627 e->same_screen = xevent->xbutton.same_screen;
628 e->root_window = xevent->xbutton.root;
630 _ecore_x_event_last_time = e->timestamp;
631 _ecore_x_event_last_win = e->window;
632 _ecore_x_event_last_root_x = xevent->xbutton.x_root;
633 _ecore_x_event_last_root_y = xevent->xbutton.y_root;
634 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
636 for (i = 0; i < _ecore_window_grabs_num; i++)
638 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
639 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
641 Eina_Bool replay = EINA_FALSE;
643 if (_ecore_window_grab_replay_func)
644 replay = _ecore_window_grab_replay_func(
645 _ecore_window_grab_replay_data,
646 ECORE_EVENT_MOUSE_WHEEL,
650 XAllowEvents(xevent->xbutton.display,
651 ReplayPointer, xevent->xbutton.time);
653 XAllowEvents(xevent->xbutton.display,
654 AsyncPointer, xevent->xbutton.time);
663 _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
664 xevent->xbutton.x, xevent->xbutton.y,
665 xevent->xbutton.x_root, xevent->xbutton.y_root,
666 xevent->xbutton.window,
667 (xevent->xbutton.subwindow ? xevent->xbutton.
668 subwindow : xevent->xbutton.window),
669 xevent->xbutton.root,
670 xevent->xbutton.same_screen,
674 xevent->xbutton.x, xevent->xbutton.y,
675 xevent->xbutton.x_root, xevent->xbutton.y_root);
678 Ecore_Event_Mouse_Button *e;
682 if (_ecore_x_mouse_down_did_triple)
684 _ecore_x_mouse_down_last_win = 0;
685 _ecore_x_mouse_down_last_last_win = 0;
686 _ecore_x_mouse_down_last_event_win = 0;
687 _ecore_x_mouse_down_last_last_event_win = 0;
688 _ecore_x_mouse_down_last_time = 0;
689 _ecore_x_mouse_down_last_last_time = 0;
693 (xevent->xbutton.subwindow ? xevent->xbutton.subwindow : xevent->
695 event_window = xevent->xbutton.window;
697 e = _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
698 xevent->xbutton.time,
699 xevent->xbutton.state,
700 xevent->xbutton.button,
703 xevent->xbutton.x_root,
704 xevent->xbutton.y_root,
707 xevent->xbutton.root,
708 xevent->xbutton.same_screen,
718 xevent->xbutton.x_root,
719 xevent->xbutton.y_root);
721 for (i = 0; i < _ecore_window_grabs_num; i++)
723 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
724 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
726 Eina_Bool replay = EINA_FALSE;
728 if (_ecore_window_grab_replay_func)
729 replay = _ecore_window_grab_replay_func(
730 _ecore_window_grab_replay_data,
731 ECORE_EVENT_MOUSE_BUTTON_DOWN,
735 XAllowEvents(xevent->xbutton.display,
736 ReplayPointer, xevent->xbutton.time);
738 XAllowEvents(xevent->xbutton.display,
739 AsyncPointer, xevent->xbutton.time);
745 if (window == event_window)
746 if (!_ecore_x_mouse_down_did_triple)
748 _ecore_x_mouse_down_last_last_win =
749 _ecore_x_mouse_down_last_win;
750 if (xevent->xbutton.subwindow)
751 _ecore_x_mouse_down_last_win = xevent->xbutton.subwindow;
753 _ecore_x_mouse_down_last_win = xevent->xbutton.window;
755 _ecore_x_mouse_down_last_last_event_win =
756 _ecore_x_mouse_down_last_event_win;
757 _ecore_x_mouse_down_last_event_win = xevent->xbutton.window;
758 _ecore_x_mouse_down_last_last_time =
759 _ecore_x_mouse_down_last_time;
760 _ecore_x_mouse_down_last_time = xevent->xbutton.time;
765 } /* _ecore_x_event_handle_button_press */
768 _ecore_x_event_handle_button_release(XEvent *xevent)
770 _ecore_x_last_event_mouse_move = 0;
771 /* filter out wheel buttons */
772 if ((xevent->xbutton.button <= 3) || (xevent->xbutton.button > 7))
774 _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
775 xevent->xbutton.x, xevent->xbutton.y,
776 xevent->xbutton.x_root, xevent->xbutton.y_root,
777 xevent->xbutton.window,
778 (xevent->xbutton.subwindow ? xevent->xbutton.
779 subwindow : xevent->xbutton.window),
780 xevent->xbutton.root,
781 xevent->xbutton.same_screen,
785 xevent->xbutton.x, xevent->xbutton.y,
786 xevent->xbutton.x_root, xevent->xbutton.y_root);
788 _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
789 xevent->xbutton.time, xevent->xbutton.state,
790 xevent->xbutton.button,
791 xevent->xbutton.x, xevent->xbutton.y,
792 xevent->xbutton.x_root, xevent->xbutton.y_root,
793 xevent->xbutton.window,
794 (xevent->xbutton.subwindow ? xevent->xbutton.
795 subwindow : xevent->xbutton.window),
796 xevent->xbutton.root,
797 xevent->xbutton.same_screen,
801 xevent->xbutton.x, xevent->xbutton.y,
802 xevent->xbutton.x_root, xevent->xbutton.y_root);
804 } /* _ecore_x_event_handle_button_release */
807 _ecore_x_event_handle_motion_notify(XEvent *xevent)
810 if (_ecore_x_last_event_mouse_move)
812 ecore_event_del(_ecore_x_last_event_mouse_move_event);
813 _ecore_x_last_event_mouse_move = 0;
814 _ecore_x_last_event_mouse_move_event = NULL;
817 _ecore_mouse_move(xevent->xmotion.time, xevent->xmotion.state,
818 xevent->xmotion.x, xevent->xmotion.y,
819 xevent->xmotion.x_root, xevent->xmotion.y_root,
820 xevent->xmotion.window,
821 (xevent->xmotion.subwindow ? xevent->xmotion.subwindow :
822 xevent->xmotion.window),
823 xevent->xmotion.root,
824 xevent->xmotion.same_screen,
828 xevent->xmotion.x, xevent->xmotion.y,
829 xevent->xmotion.x_root, xevent->xmotion.y_root);
831 _ecore_x_last_event_mouse_move = 1;
834 _ecore_x_dnd_drag(xevent->xmotion.root,
835 xevent->xmotion.x_root,
836 xevent->xmotion.y_root);
837 } /* _ecore_x_event_handle_motion_notify */
840 _ecore_x_event_handle_enter_notify(XEvent *xevent)
842 _ecore_x_last_event_mouse_move = 0;
844 _ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
845 xevent->xcrossing.x, xevent->xcrossing.y,
846 xevent->xcrossing.x_root, xevent->xcrossing.y_root,
847 xevent->xcrossing.window,
848 (xevent->xcrossing.subwindow ? xevent->xcrossing.
849 subwindow : xevent->xcrossing.window),
850 xevent->xcrossing.root,
851 xevent->xcrossing.same_screen,
855 xevent->xcrossing.x, xevent->xcrossing.y,
856 xevent->xcrossing.x_root, xevent->xcrossing.y_root);
859 Ecore_X_Event_Mouse_In *e;
861 e = calloc(1, sizeof(Ecore_X_Event_Mouse_In));
865 e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
866 e->x = xevent->xcrossing.x;
867 e->y = xevent->xcrossing.y;
868 e->root.x = xevent->xcrossing.x_root;
869 e->root.y = xevent->xcrossing.y_root;
870 if (xevent->xcrossing.subwindow)
871 e->win = xevent->xcrossing.subwindow;
873 e->win = xevent->xcrossing.window;
875 e->same_screen = xevent->xcrossing.same_screen;
876 e->root_win = xevent->xcrossing.root;
877 e->event_win = xevent->xcrossing.window;
879 if (xevent->xcrossing.mode == NotifyNormal)
880 e->mode = ECORE_X_EVENT_MODE_NORMAL;
881 else if (xevent->xcrossing.mode == NotifyGrab)
882 e->mode = ECORE_X_EVENT_MODE_GRAB;
883 else if (xevent->xcrossing.mode == NotifyUngrab)
884 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
886 if (xevent->xcrossing.detail == NotifyAncestor)
887 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
888 else if (xevent->xcrossing.detail == NotifyVirtual)
889 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
890 else if (xevent->xcrossing.detail == NotifyInferior)
891 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
892 else if (xevent->xcrossing.detail == NotifyNonlinear)
893 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
894 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
895 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
897 e->time = xevent->xcrossing.time;
898 _ecore_x_event_last_time = e->time;
899 ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
901 } /* _ecore_x_event_handle_enter_notify */
904 _ecore_x_event_handle_leave_notify(XEvent *xevent)
906 _ecore_x_last_event_mouse_move = 0;
908 _ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
909 xevent->xcrossing.x, xevent->xcrossing.y,
910 xevent->xcrossing.x_root, xevent->xcrossing.y_root,
911 xevent->xcrossing.window,
912 (xevent->xcrossing.subwindow ? xevent->xcrossing.
913 subwindow : xevent->xcrossing.window),
914 xevent->xcrossing.root,
915 xevent->xcrossing.same_screen,
919 xevent->xcrossing.x, xevent->xcrossing.y,
920 xevent->xcrossing.x_root, xevent->xcrossing.y_root);
923 Ecore_X_Event_Mouse_Out *e;
925 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out));
929 e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
930 e->x = xevent->xcrossing.x;
931 e->y = xevent->xcrossing.y;
932 e->root.x = xevent->xcrossing.x_root;
933 e->root.y = xevent->xcrossing.y_root;
934 if (xevent->xcrossing.subwindow)
935 e->win = xevent->xcrossing.subwindow;
937 e->win = xevent->xcrossing.window;
939 e->same_screen = xevent->xcrossing.same_screen;
940 e->root_win = xevent->xcrossing.root;
941 e->event_win = xevent->xcrossing.window;
943 if (xevent->xcrossing.mode == NotifyNormal)
944 e->mode = ECORE_X_EVENT_MODE_NORMAL;
945 else if (xevent->xcrossing.mode == NotifyGrab)
946 e->mode = ECORE_X_EVENT_MODE_GRAB;
947 else if (xevent->xcrossing.mode == NotifyUngrab)
948 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
950 if (xevent->xcrossing.detail == NotifyAncestor)
951 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
952 else if (xevent->xcrossing.detail == NotifyVirtual)
953 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
954 else if (xevent->xcrossing.detail == NotifyInferior)
955 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
956 else if (xevent->xcrossing.detail == NotifyNonlinear)
957 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
958 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
959 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
961 e->time = xevent->xcrossing.time;
962 _ecore_x_event_last_time = e->time;
963 _ecore_x_event_last_win = e->win;
964 _ecore_x_event_last_root_x = e->root.x;
965 _ecore_x_event_last_root_y = e->root.y;
966 ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
968 } /* _ecore_x_event_handle_leave_notify */
971 _ecore_x_event_handle_focus_in(XEvent *xevent)
973 Ecore_X_Event_Window_Focus_In *e;
975 _ecore_x_last_event_mouse_move = 0;
980 XSetICValues(_ecore_x_ic, XNFocusWindow, xevent->xfocus.window, NULL);
981 if ((str = XmbResetIC(_ecore_x_ic)))
984 XSetICFocus(_ecore_x_ic);
987 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In));
991 e->win = xevent->xfocus.window;
993 if (xevent->xfocus.mode == NotifyNormal)
994 e->mode = ECORE_X_EVENT_MODE_NORMAL;
995 else if (xevent->xfocus.mode == NotifyWhileGrabbed)
996 e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
997 else if (xevent->xfocus.mode == NotifyGrab)
998 e->mode = ECORE_X_EVENT_MODE_GRAB;
999 else if (xevent->xfocus.mode == NotifyUngrab)
1000 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
1002 if (xevent->xfocus.detail == NotifyAncestor)
1003 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
1004 else if (xevent->xfocus.detail == NotifyVirtual)
1005 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
1006 else if (xevent->xfocus.detail == NotifyInferior)
1007 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
1008 else if (xevent->xfocus.detail == NotifyNonlinear)
1009 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
1010 else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
1011 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
1012 else if (xevent->xfocus.detail == NotifyPointer)
1013 e->detail = ECORE_X_EVENT_DETAIL_POINTER;
1014 else if (xevent->xfocus.detail == NotifyPointerRoot)
1015 e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
1016 else if (xevent->xfocus.detail == NotifyDetailNone)
1017 e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
1019 e->time = _ecore_x_event_last_time;
1020 _ecore_x_event_last_time = e->time;
1021 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
1022 } /* _ecore_x_event_handle_focus_in */
1025 _ecore_x_event_handle_focus_out(XEvent *xevent)
1027 Ecore_X_Event_Window_Focus_Out *e;
1029 _ecore_x_last_event_mouse_move = 0;
1031 XUnsetICFocus(_ecore_x_ic);
1033 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out));
1037 e->win = xevent->xfocus.window;
1039 if (xevent->xfocus.mode == NotifyNormal)
1040 e->mode = ECORE_X_EVENT_MODE_NORMAL;
1041 else if (xevent->xfocus.mode == NotifyWhileGrabbed)
1042 e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
1043 else if (xevent->xfocus.mode == NotifyGrab)
1044 e->mode = ECORE_X_EVENT_MODE_GRAB;
1045 else if (xevent->xfocus.mode == NotifyUngrab)
1046 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
1048 if (xevent->xfocus.detail == NotifyAncestor)
1049 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
1050 else if (xevent->xfocus.detail == NotifyVirtual)
1051 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
1052 else if (xevent->xfocus.detail == NotifyInferior)
1053 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
1054 else if (xevent->xfocus.detail == NotifyNonlinear)
1055 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
1056 else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
1057 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
1058 else if (xevent->xfocus.detail == NotifyPointer)
1059 e->detail = ECORE_X_EVENT_DETAIL_POINTER;
1060 else if (xevent->xfocus.detail == NotifyPointerRoot)
1061 e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
1062 else if (xevent->xfocus.detail == NotifyDetailNone)
1063 e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
1065 e->time = _ecore_x_event_last_time;
1066 _ecore_x_event_last_time = e->time;
1067 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
1068 } /* _ecore_x_event_handle_focus_out */
1071 _ecore_x_event_handle_keymap_notify(XEvent *xevent __UNUSED__)
1073 _ecore_x_last_event_mouse_move = 0;
1074 /* FIXME: handle this event type */
1075 } /* _ecore_x_event_handle_keymap_notify */
1078 _ecore_x_event_handle_expose(XEvent *xevent)
1080 Ecore_X_Event_Window_Damage *e;
1082 _ecore_x_last_event_mouse_move = 0;
1083 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
1087 e->win = xevent->xexpose.window;
1088 e->time = _ecore_x_event_last_time;
1089 e->x = xevent->xexpose.x;
1090 e->y = xevent->xexpose.y;
1091 e->w = xevent->xexpose.width;
1092 e->h = xevent->xexpose.height;
1093 e->count = xevent->xexpose.count;
1094 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
1095 } /* _ecore_x_event_handle_expose */
1098 _ecore_x_event_handle_graphics_expose(XEvent *xevent)
1100 Ecore_X_Event_Window_Damage *e;
1102 _ecore_x_last_event_mouse_move = 0;
1103 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
1107 e->win = xevent->xgraphicsexpose.drawable;
1108 e->time = _ecore_x_event_last_time;
1109 e->x = xevent->xgraphicsexpose.x;
1110 e->y = xevent->xgraphicsexpose.y;
1111 e->w = xevent->xgraphicsexpose.width;
1112 e->h = xevent->xgraphicsexpose.height;
1113 e->count = xevent->xgraphicsexpose.count;
1114 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
1115 } /* _ecore_x_event_handle_graphics_expose */
1118 _ecore_x_event_handle_visibility_notify(XEvent *xevent)
1120 _ecore_x_last_event_mouse_move = 0;
1121 // if (xevent->xvisibility.state != VisibilityPartiallyObscured)
1123 Ecore_X_Event_Window_Visibility_Change *e;
1125 e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change));
1129 e->win = xevent->xvisibility.window;
1130 e->time = _ecore_x_event_last_time;
1131 if (xevent->xvisibility.state == VisibilityFullyObscured)
1132 e->fully_obscured = 1;
1134 e->fully_obscured = 0;
1136 ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
1138 } /* _ecore_x_event_handle_visibility_notify */
1141 _ecore_x_event_handle_create_notify(XEvent *xevent)
1143 Ecore_X_Event_Window_Create *e;
1145 _ecore_x_last_event_mouse_move = 0;
1146 e = calloc(1, sizeof(Ecore_X_Event_Window_Create));
1150 e->win = xevent->xcreatewindow.window;
1151 e->parent = xevent->xcreatewindow.parent;
1152 if (xevent->xcreatewindow.override_redirect)
1157 e->x = xevent->xcreatewindow.x;
1158 e->y = xevent->xcreatewindow.y;
1159 e->w = xevent->xcreatewindow.width;
1160 e->h = xevent->xcreatewindow.height;
1161 e->border = xevent->xcreatewindow.border_width;
1162 e->time = _ecore_x_event_last_time;
1163 ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
1164 } /* _ecore_x_event_handle_create_notify */
1167 _ecore_x_event_handle_destroy_notify(XEvent *xevent)
1169 Ecore_X_Event_Window_Destroy *e;
1171 _ecore_x_last_event_mouse_move = 0;
1172 e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy));
1176 e->win = xevent->xdestroywindow.window;
1177 e->event_win = xevent->xdestroywindow.event;
1178 e->time = _ecore_x_event_last_time;
1179 if (e->win == _ecore_x_event_last_win)
1180 _ecore_x_event_last_win = 0;
1182 ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
1183 } /* _ecore_x_event_handle_destroy_notify */
1186 _ecore_x_event_handle_unmap_notify(XEvent *xevent)
1188 Ecore_X_Event_Window_Hide *e;
1190 _ecore_x_last_event_mouse_move = 0;
1191 e = calloc(1, sizeof(Ecore_X_Event_Window_Hide));
1195 e->win = xevent->xunmap.window;
1196 e->event_win = xevent->xunmap.event;
1197 e->time = _ecore_x_event_last_time;
1198 ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
1199 } /* _ecore_x_event_handle_unmap_notify */
1202 _ecore_x_event_handle_map_notify(XEvent *xevent)
1204 Ecore_X_Event_Window_Show *e;
1206 _ecore_x_last_event_mouse_move = 0;
1207 e = calloc(1, sizeof(Ecore_X_Event_Window_Show));
1211 e->win = xevent->xmap.window;
1212 e->event_win = xevent->xmap.event;
1213 e->time = _ecore_x_event_last_time;
1214 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
1215 } /* _ecore_x_event_handle_map_notify */
1218 _ecore_x_event_handle_map_request(XEvent *xevent)
1220 Ecore_X_Event_Window_Show_Request *e;
1222 _ecore_x_last_event_mouse_move = 0;
1223 e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request));
1227 e->win = xevent->xmaprequest.window;
1228 e->time = _ecore_x_event_last_time;
1229 e->parent = xevent->xmaprequest.parent;
1230 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, e, NULL, NULL);
1231 } /* _ecore_x_event_handle_map_request */
1234 _ecore_x_event_handle_reparent_notify(XEvent *xevent)
1236 Ecore_X_Event_Window_Reparent *e;
1238 _ecore_x_last_event_mouse_move = 0;
1239 e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent));
1243 e->win = xevent->xreparent.window;
1244 e->event_win = xevent->xreparent.event;
1245 e->parent = xevent->xreparent.parent;
1246 e->time = _ecore_x_event_last_time;
1247 ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
1248 } /* _ecore_x_event_handle_reparent_notify */
1251 _ecore_x_event_handle_configure_notify(XEvent *xevent)
1253 Ecore_X_Event_Window_Configure *e;
1255 _ecore_x_last_event_mouse_move = 0;
1256 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure));
1260 e->win = xevent->xconfigure.window;
1261 e->event_win = xevent->xconfigure.event;
1262 e->abovewin = xevent->xconfigure.above;
1263 e->x = xevent->xconfigure.x;
1264 e->y = xevent->xconfigure.y;
1265 e->w = xevent->xconfigure.width;
1266 e->h = xevent->xconfigure.height;
1267 e->border = xevent->xconfigure.border_width;
1268 e->override = xevent->xconfigure.override_redirect;
1269 e->from_wm = xevent->xconfigure.send_event;
1270 e->time = _ecore_x_event_last_time;
1271 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
1272 } /* _ecore_x_event_handle_configure_notify */
1275 _ecore_x_event_handle_configure_request(XEvent *xevent)
1277 Ecore_X_Event_Window_Configure_Request *e;
1279 _ecore_x_last_event_mouse_move = 0;
1280 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request));
1284 e->win = xevent->xconfigurerequest.window;
1285 e->parent_win = xevent->xconfigurerequest.parent;
1286 e->abovewin = xevent->xconfigurerequest.above;
1287 e->x = xevent->xconfigurerequest.x;
1288 e->y = xevent->xconfigurerequest.y;
1289 e->w = xevent->xconfigurerequest.width;
1290 e->h = xevent->xconfigurerequest.height;
1291 e->border = xevent->xconfigurerequest.border_width;
1292 e->value_mask = xevent->xconfigurerequest.value_mask;
1293 e->time = _ecore_x_event_last_time;
1295 if (xevent->xconfigurerequest.detail == Above)
1296 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1297 else if (xevent->xconfigurerequest.detail == Below)
1298 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1299 else if (xevent->xconfigurerequest.detail == TopIf)
1300 e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
1301 else if (xevent->xconfigurerequest.detail == BottomIf)
1302 e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
1303 else if (xevent->xconfigurerequest.detail == Opposite)
1304 e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
1306 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
1307 } /* _ecore_x_event_handle_configure_request */
1310 _ecore_x_event_handle_gravity_notify(XEvent *xevent __UNUSED__)
1312 _ecore_x_last_event_mouse_move = 0;
1313 /* FIXME: handle this event type */
1314 } /* _ecore_x_event_handle_gravity_notify */
1317 _ecore_x_event_handle_resize_request(XEvent *xevent)
1319 Ecore_X_Event_Window_Resize_Request *e;
1321 _ecore_x_last_event_mouse_move = 0;
1322 e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request));
1326 e->win = xevent->xresizerequest.window;
1327 e->w = xevent->xresizerequest.width;
1328 e->h = xevent->xresizerequest.height;
1329 e->time = _ecore_x_event_last_time;
1330 ecore_event_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, e, NULL, NULL);
1331 } /* _ecore_x_event_handle_resize_request */
1334 _ecore_x_event_handle_circulate_notify(XEvent *xevent)
1336 Ecore_X_Event_Window_Stack *e;
1338 _ecore_x_last_event_mouse_move = 0;
1339 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack));
1343 e->win = xevent->xcirculate.window;
1344 e->event_win = xevent->xcirculate.event;
1345 if (xevent->xcirculate.place == PlaceOnTop)
1346 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1348 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1350 e->time = _ecore_x_event_last_time;
1351 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
1352 } /* _ecore_x_event_handle_circulate_notify */
1355 _ecore_x_event_handle_circulate_request(XEvent *xevent)
1357 Ecore_X_Event_Window_Stack_Request *e;
1359 _ecore_x_last_event_mouse_move = 0;
1360 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request));
1364 e->win = xevent->xcirculaterequest.window;
1365 e->parent = xevent->xcirculaterequest.parent;
1366 if (xevent->xcirculaterequest.place == PlaceOnTop)
1367 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1369 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1371 e->time = _ecore_x_event_last_time;
1372 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
1373 } /* _ecore_x_event_handle_circulate_request */
1376 _ecore_x_event_handle_property_notify(XEvent *xevent)
1378 _ecore_x_last_event_mouse_move = 0;
1379 #if 0 /* for now i disabled this. nice idea though this is - it leaves a lot
1380 * to be desired for efficiency that is better left to the app layer
1382 if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLASS)
1384 Ecore_X_Event_Window_Prop_Name_Class_Change *e;
1386 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Name_Class_Change));
1390 ecore_x_window_prop_name_class_get(xevent->xproperty.window,
1391 &(e->name), &(e->clas));
1392 e->time = xevent->xproperty.time;
1393 _ecore_x_event_last_time = e->time;
1394 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE, e,
1395 _ecore_x_event_free_window_prop_name_class_change, NULL);
1397 else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_NAME) ||
1398 (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_NAME))
1400 Ecore_X_Event_Window_Prop_Title_Change *e;
1402 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Title_Change));
1406 e->title = ecore_x_window_prop_title_get(xevent->xproperty.window);
1407 e->time = xevent->xproperty.time;
1408 _ecore_x_event_last_time = e->time;
1409 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE, e,
1410 _ecore_x_event_free_window_prop_title_change, NULL);
1412 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_NAME)
1414 Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
1416 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Title_Change));
1420 e->title = ecore_x_window_prop_visible_title_get(
1421 xevent->xproperty.window);
1422 e->time = xevent->xproperty.time;
1423 _ecore_x_event_last_time = e->time;
1424 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE,
1426 _ecore_x_event_free_window_prop_visible_title_change,
1429 else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_ICON_NAME) ||
1430 (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_ICON_NAME))
1432 Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
1434 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Icon_Name_Change));
1438 e->name = ecore_x_window_prop_icon_name_get(xevent->xproperty.window);
1439 e->time = xevent->xproperty.time;
1440 _ecore_x_event_last_time = e->time;
1441 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE, e,
1442 _ecore_x_event_free_window_prop_icon_name_change, NULL);
1444 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME)
1446 Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
1448 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change));
1452 e->name = ecore_x_window_prop_visible_icon_name_get(
1453 xevent->xproperty.window);
1454 e->time = xevent->xproperty.time;
1455 _ecore_x_event_last_time = e->time;
1457 ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE,
1459 _ecore_x_event_free_window_prop_visible_icon_name_change,
1462 else if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLIENT_MACHINE)
1464 Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
1466 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Client_Machine_Change));
1470 e->name = ecore_x_window_prop_client_machine_get(
1471 xevent->xproperty.window);
1472 e->time = xevent->xproperty.time;
1473 _ecore_x_event_last_time = e->time;
1474 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE,
1476 _ecore_x_event_free_window_prop_client_machine_change,
1479 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_PID)
1481 Ecore_X_Event_Window_Prop_Pid_Change *e;
1483 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Pid_Change));
1487 e->pid = ecore_x_window_prop_pid_get(xevent->xproperty.window);
1488 e->time = xevent->xproperty.time;
1489 _ecore_x_event_last_time = e->time;
1490 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
1492 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_DESKTOP)
1494 Ecore_X_Event_Window_Prop_Desktop_Change *e;
1496 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Desktop_Change));
1500 e->desktop = ecore_x_window_prop_desktop_get(xevent->xproperty.window);
1501 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
1506 Ecore_X_Event_Window_Property *e;
1508 e = calloc(1, sizeof(Ecore_X_Event_Window_Property));
1512 e->win = xevent->xproperty.window;
1513 e->atom = xevent->xproperty.atom;
1514 e->time = xevent->xproperty.time;
1515 _ecore_x_event_last_time = e->time;
1516 ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
1518 } /* _ecore_x_event_handle_property_notify */
1521 _ecore_x_event_handle_selection_clear(XEvent *xevent)
1523 Ecore_X_Selection_Intern *d;
1524 Ecore_X_Event_Selection_Clear *e;
1527 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1528 _ecore_x_last_event_mouse_move = 0;
1529 d = _ecore_x_selection_get(xevent->xselectionclear.selection);
1530 /* errr..... why? paranoia.
1531 if (d && (xevent->xselectionclear.time > d->time))
1533 _ecore_x_selection_set(None, NULL, 0,
1534 xevent->xselectionclear.selection);
1537 /* Generate event for app cleanup */
1538 e = malloc(sizeof(Ecore_X_Event_Selection_Clear));
1539 e->win = xevent->xselectionclear.window;
1540 e->time = xevent->xselectionclear.time;
1541 e->atom = sel = xevent->xselectionclear.selection;
1542 if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
1543 e->selection = ECORE_X_SELECTION_PRIMARY;
1544 else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
1545 e->selection = ECORE_X_SELECTION_SECONDARY;
1546 else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1547 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1549 e->selection = ECORE_X_SELECTION_OTHER;
1551 ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
1552 } /* _ecore_x_event_handle_selection_clear */
1555 _ecore_x_event_handle_selection_request(XEvent *xevent)
1557 Ecore_X_Event_Selection_Request *e;
1558 Ecore_X_Selection_Intern *sd;
1563 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1564 _ecore_x_last_event_mouse_move = 0;
1566 * Generate a selection request event.
1568 e = malloc(sizeof(Ecore_X_Event_Selection_Request));
1569 e->owner = xevent->xselectionrequest.owner;
1570 e->requestor = xevent->xselectionrequest.requestor;
1571 e->time = xevent->xselectionrequest.time;
1572 e->selection = xevent->xselectionrequest.selection;
1573 e->target = xevent->xselectionrequest.target;
1574 e->property = xevent->xselectionrequest.property;
1575 ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL);
1577 if ((sd = _ecore_x_selection_get(xevent->xselectionrequest.selection)) &&
1578 (sd->win == xevent->xselectionrequest.owner))
1580 Ecore_X_Selection_Intern *si;
1582 si = _ecore_x_selection_get(xevent->xselectionrequest.selection);
1585 Ecore_X_Atom property;
1588 /* Set up defaults for strings first */
1589 type = xevent->xselectionrequest.target;
1593 if (!ecore_x_selection_convert(xevent->xselectionrequest.selection,
1594 xevent->xselectionrequest.target,
1595 &data, &len, &type, &typesize))
1596 /* Refuse selection, conversion to requested target failed */
1600 /* FIXME: This does not properly handle large data transfers */
1601 ecore_x_window_prop_property_set(
1602 xevent->xselectionrequest.requestor,
1603 xevent->xselectionrequest.
1609 property = xevent->xselectionrequest.property;
1613 ecore_x_selection_notify_send(xevent->xselectionrequest.requestor,
1614 xevent->xselectionrequest.selection,
1615 xevent->xselectionrequest.target,
1617 xevent->xselectionrequest.time);
1622 } /* _ecore_x_event_handle_selection_request */
1625 _ecore_x_event_handle_selection_notify(XEvent *xevent)
1627 Ecore_X_Event_Selection_Notify *e;
1628 unsigned char *data = NULL;
1629 Ecore_X_Atom selection;
1630 int num_ret, format;
1632 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1633 _ecore_x_last_event_mouse_move = 0;
1634 selection = xevent->xselection.selection;
1636 if (xevent->xselection.target == ECORE_X_ATOM_SELECTION_TARGETS)
1638 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1639 xevent->xselection.property,
1640 XA_ATOM, 32, &data, &num_ret);
1646 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1647 xevent->xselection.property,
1648 AnyPropertyType, 8, &data,
1654 e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
1658 e->win = xevent->xselection.requestor;
1659 e->time = xevent->xselection.time;
1660 e->atom = selection;
1661 e->target = _ecore_x_selection_target_get(xevent->xselection.target);
1663 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
1664 e->selection = ECORE_X_SELECTION_PRIMARY;
1665 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
1666 e->selection = ECORE_X_SELECTION_SECONDARY;
1667 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
1668 e->selection = ECORE_X_SELECTION_XDND;
1669 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1670 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1672 e->selection = ECORE_X_SELECTION_OTHER;
1674 e->data = _ecore_x_selection_parse(e->target, data, num_ret, format);
1676 ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
1677 _ecore_x_event_free_selection_notify, NULL);
1678 } /* _ecore_x_event_handle_selection_notify */
1681 _ecore_x_event_handle_colormap_notify(XEvent *xevent)
1683 Ecore_X_Event_Window_Colormap *e;
1685 _ecore_x_last_event_mouse_move = 0;
1686 e = calloc(1,sizeof(Ecore_X_Event_Window_Colormap));
1690 e->win = xevent->xcolormap.window;
1691 e->cmap = xevent->xcolormap.colormap;
1692 e->time = _ecore_x_event_last_time;
1693 if (xevent->xcolormap.state == ColormapInstalled)
1698 ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
1699 } /* _ecore_x_event_handle_colormap_notify */
1702 _ecore_x_event_handle_client_message(XEvent *xevent)
1704 _ecore_x_last_event_mouse_move = 0;
1705 /* Special client message event handling here. need to put LOTS of if */
1706 /* checks here and generate synthetic events per special message known */
1707 /* otherwise generate generic client message event. this would handle*/
1708 /* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
1709 if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
1710 (xevent->xclient.format == 32) &&
1711 (xevent->xclient.data.l[0] == (long)ECORE_X_ATOM_WM_DELETE_WINDOW))
1713 Ecore_X_Event_Window_Delete_Request *e;
1715 e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
1719 e->win = xevent->xclient.window;
1720 e->time = _ecore_x_event_last_time;
1721 ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
1723 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
1724 (xevent->xclient.format == 32) &&
1725 /* Ignore move and resize with keyboard */
1726 (xevent->xclient.data.l[2] < 9))
1728 Ecore_X_Event_Window_Move_Resize_Request *e;
1730 e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request));
1734 e->win = xevent->xclient.window;
1735 e->x = xevent->xclient.data.l[0];
1736 e->y = xevent->xclient.data.l[1];
1737 e->direction = xevent->xclient.data.l[2];
1738 e->button = xevent->xclient.data.l[3];
1739 e->source = xevent->xclient.data.l[4];
1740 ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
1742 /* Xdnd Client Message Handling Begin */
1743 /* Message Type: XdndEnter target */
1744 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_ENTER)
1746 Ecore_X_Event_Xdnd_Enter *e;
1747 Ecore_X_DND_Target *target;
1749 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
1753 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1754 target = _ecore_x_dnd_target_get();
1755 target->state = ECORE_X_DND_TARGET_ENTERED;
1756 target->source = xevent->xclient.data.l[0];
1757 target->win = xevent->xclient.window;
1758 target->version = (int)(xevent->xclient.data.l[1] >> 24);
1759 if (target->version > ECORE_X_DND_VERSION)
1761 WRN("DND: Requested version %d, we only support up to %d",
1762 target->version, ECORE_X_DND_VERSION);
1766 if (xevent->xclient.data.l[1] & 0x1UL)
1768 /* source supports more than 3 types, fetch property */
1769 unsigned char *data;
1770 Ecore_X_Atom *types;
1773 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1774 if (!(ecore_x_window_prop_property_get(target->source,
1775 ECORE_X_ATOM_XDND_TYPE_LIST,
1777 32, &data, &num_ret)))
1780 "DND: Could not fetch data type list from source window, aborting.");
1784 types = (Ecore_X_Atom *)data;
1785 e->types = calloc(num_ret, sizeof(char *));
1788 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1789 for (i = 0; i < num_ret; i++)
1790 e->types[i] = XGetAtomName(_ecore_x_disp, types[i]);
1793 e->num_types = num_ret;
1799 e->types = calloc(3, sizeof(char *));
1802 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1803 while ((i < 3) && (xevent->xclient.data.l[i + 2]))
1805 e->types[i] = XGetAtomName(_ecore_x_disp,
1806 xevent->xclient.data.l[i + 2]);
1814 e->win = target->win;
1815 e->source = target->source;
1816 ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
1817 _ecore_x_event_free_xdnd_enter, NULL);
1819 /* Message Type: XdndPosition target */
1820 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_POSITION)
1822 Ecore_X_Event_Xdnd_Position *e;
1823 Ecore_X_DND_Target *target;
1825 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1826 target = _ecore_x_dnd_target_get();
1827 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1828 (target->win != xevent->xclient.window))
1831 target->pos.x = xevent->xclient.data.l[2] >> 16;
1832 target->pos.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1833 target->action = xevent->xclient.data.l[4]; /* Version 2 */
1835 target->time = (target->version >= 1) ?
1836 (Time)xevent->xclient.data.l[3] : CurrentTime;
1838 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
1842 e->win = target->win;
1843 e->source = target->source;
1844 e->position.x = target->pos.x;
1845 e->position.y = target->pos.y;
1846 e->action = target->action;
1847 ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
1849 /* Message Type: XdndStatus source */
1850 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_STATUS)
1852 Ecore_X_Event_Xdnd_Status *e;
1853 Ecore_X_DND_Source *source;
1855 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1856 source = _ecore_x_dnd_source_get();
1857 /* Make sure source/target match */
1858 if ((source->win != xevent->xclient.window) ||
1859 (source->dest != (Window)xevent->xclient.data.l[0]))
1862 source->await_status = 0;
1864 source->will_accept = xevent->xclient.data.l[1] & 0x1UL;
1865 source->suppress = (xevent->xclient.data.l[1] & 0x2UL) ? 0 : 1;
1867 source->rectangle.x = xevent->xclient.data.l[2] >> 16;
1868 source->rectangle.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1869 source->rectangle.width = xevent->xclient.data.l[3] >> 16;
1870 source->rectangle.height = xevent->xclient.data.l[3] & 0xFFFFUL;
1872 source->accepted_action = xevent->xclient.data.l[4];
1874 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
1878 e->win = source->win;
1879 e->target = source->dest;
1880 e->will_accept = source->will_accept;
1881 e->rectangle.x = source->rectangle.x;
1882 e->rectangle.y = source->rectangle.y;
1883 e->rectangle.width = source->rectangle.width;
1884 e->rectangle.height = source->rectangle.height;
1885 e->action = source->accepted_action;
1887 ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
1889 /* Message Type: XdndLeave target */
1890 /* Pretend the whole thing never happened, sort of */
1891 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_LEAVE)
1893 Ecore_X_Event_Xdnd_Leave *e;
1894 Ecore_X_DND_Target *target;
1896 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1897 target = _ecore_x_dnd_target_get();
1898 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1899 (target->win != xevent->xclient.window))
1902 target->state = ECORE_X_DND_TARGET_IDLE;
1904 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
1908 e->win = xevent->xclient.window;
1909 e->source = (Window)xevent->xclient.data.l[0];
1910 ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
1912 /* Message Type: XdndDrop target */
1913 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_DROP)
1915 Ecore_X_Event_Xdnd_Drop *e;
1916 Ecore_X_DND_Target *target;
1918 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1919 target = _ecore_x_dnd_target_get();
1920 /* Match source/target */
1921 if ((target->source != (Window)xevent->xclient.data.l[0]) ||
1922 (target->win != xevent->xclient.window))
1925 target->time = (target->version >= 1) ?
1926 (Time)xevent->xclient.data.l[2] : _ecore_x_event_last_time;
1928 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
1932 e->win = target->win;
1933 e->source = target->source;
1934 e->action = target->action;
1935 e->position.x = target->pos.x;
1936 e->position.y = target->pos.y;
1937 ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
1939 /* Message Type: XdndFinished source */
1940 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_FINISHED)
1942 Ecore_X_Event_Xdnd_Finished *e;
1943 Ecore_X_DND_Source *source;
1946 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1947 source = _ecore_x_dnd_source_get();
1948 /* Match source/target */
1949 if ((source->win != xevent->xclient.window) ||
1950 (source->dest != (Window)xevent->xclient.data.l[0]))
1953 if ((source->version < 5) || (xevent->xclient.data.l[1] & 0x1UL))
1955 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1956 /* Target successfully performed drop action */
1957 ecore_x_selection_xdnd_clear();
1958 source->state = ECORE_X_DND_SOURCE_IDLE;
1960 else if (source->version >= 5)
1963 source->state = ECORE_X_DND_SOURCE_CONVERTING;
1965 /* FIXME: Probably need to add a timer to switch back to idle
1966 * and discard the selection data */
1969 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
1973 e->win = source->win;
1974 e->target = source->dest;
1975 e->completed = completed;
1976 if (source->version >= 5)
1978 source->accepted_action = xevent->xclient.data.l[2];
1979 e->action = source->accepted_action;
1983 source->accepted_action = 0;
1984 e->action = source->action;
1987 ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
1989 else if (xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_STATE)
1991 Ecore_X_Event_Window_State_Request *e;
1993 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1997 e->win = xevent->xclient.window;
1998 if (xevent->xclient.data.l[0] == 0)
1999 e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
2000 else if (xevent->xclient.data.l[0] == 1)
2001 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
2002 else if (xevent->xclient.data.l[0] == 2)
2003 e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
2010 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2011 e->state[0] = _ecore_x_netwm_state_get(xevent->xclient.data.l[1]);
2012 if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
2015 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2017 // name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[1]);
2018 // if (name) ERR("Unknown state: %s", name);
2021 e->state[1] = _ecore_x_netwm_state_get(xevent->xclient.data.l[2]);
2022 if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
2025 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2027 // name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[2]);
2028 // if (name) ERR("Unknown state: %s", name);
2032 e->source = xevent->xclient.data.l[3];
2034 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
2036 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_CHANGE_STATE)
2037 && (xevent->xclient.format == 32)
2038 && (xevent->xclient.data.l[0] == IconicState))
2040 Ecore_X_Event_Window_State_Request *e;
2042 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
2046 e->win = xevent->xclient.window;
2047 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
2048 e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
2050 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
2052 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_DESKTOP)
2053 && (xevent->xclient.format == 32))
2055 Ecore_X_Event_Desktop_Change *e;
2057 e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change));
2061 e->win = xevent->xclient.window;
2062 e->desk = xevent->xclient.data.l[0];
2063 e->source = xevent->xclient.data.l[1];
2065 ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
2067 else if ((xevent->xclient.message_type ==
2068 ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS))
2070 Ecore_X_Event_Frame_Extents_Request *e;
2072 e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request));
2076 e->win = xevent->xclient.window;
2078 ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
2080 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS)
2081 && ((Ecore_X_Atom)xevent->xclient.data.l[0] ==
2082 ECORE_X_ATOM_NET_WM_PING)
2083 && (xevent->xclient.format == 32))
2085 Ecore_X_Event_Ping *e;
2086 Ecore_X_Window root = 0;
2088 e = calloc(1, sizeof(Ecore_X_Event_Ping));
2092 e->win = xevent->xclient.window;
2093 e->time = xevent->xclient.data.l[1];
2094 e->event_win = xevent->xclient.data.l[2];
2096 /* send a reply anyway - we are alive... eventloop at least */
2097 ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
2098 if (ScreenCount(_ecore_x_disp) > 1)
2100 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2101 root = ecore_x_window_root_get(e->win);
2104 root = DefaultRootWindow(_ecore_x_disp);
2106 if (xevent->xclient.window != root)
2108 xevent->xclient.window = root;
2109 XSendEvent(_ecore_x_disp, root, False,
2110 SubstructureRedirectMask | SubstructureNotifyMask,
2114 else if ((xevent->xclient.message_type ==
2115 ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
2116 (xevent->xclient.format == 8))
2117 _ecore_x_netwm_startup_info_begin(xevent->xclient.window,
2118 xevent->xclient.data.b);
2119 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO) &&
2120 (xevent->xclient.format == 8))
2121 _ecore_x_netwm_startup_info(xevent->xclient.window,
2122 xevent->xclient.data.b);
2123 else if ((xevent->xclient.message_type == 27777)
2124 && (xevent->xclient.data.l[0] == 0x7162534)
2125 && (xevent->xclient.format == 32)
2126 && (xevent->xclient.window == _ecore_x_private_win))
2128 /* a grab sync marker */
2129 if (xevent->xclient.data.l[1] == 0x10000001)
2130 _ecore_x_window_grab_remove(xevent->xclient.data.l[2]);
2131 else if (xevent->xclient.data.l[1] == 0x10000002)
2132 _ecore_x_key_grab_remove(xevent->xclient.data.l[2]);
2136 Ecore_X_Event_Client_Message *e;
2139 e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
2143 e->win = xevent->xclient.window;
2144 e->message_type = xevent->xclient.message_type;
2145 e->format = xevent->xclient.format;
2146 for (i = 0; i < 5; i++)
2147 e->data.l[i] = xevent->xclient.data.l[i];
2149 ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
2151 } /* _ecore_x_event_handle_client_message */
2154 _ecore_x_event_handle_mapping_notify(XEvent *xevent)
2156 _ecore_x_last_event_mouse_move = 0;
2157 XRefreshKeyboardMapping((XMappingEvent *)xevent);
2158 } /* _ecore_x_event_handle_mapping_notify */
2161 _ecore_x_event_handle_shape_change(XEvent *xevent)
2163 XShapeEvent *shape_event;
2164 Ecore_X_Event_Window_Shape *e;
2166 _ecore_x_last_event_mouse_move = 0;
2167 shape_event = (XShapeEvent *)xevent;
2168 e = calloc(1, sizeof(Ecore_X_Event_Window_Shape));
2172 e->win = shape_event->window;
2173 e->time = shape_event->time;
2174 switch (shape_event->kind)
2177 e->type = ECORE_X_SHAPE_BOUNDING;
2180 e->type = ECORE_X_SHAPE_CLIP;
2183 e->type = ECORE_X_SHAPE_INPUT;
2188 e->x = shape_event->x;
2189 e->y = shape_event->y;
2190 e->w = shape_event->width;
2191 e->h = shape_event->height;
2192 e->shaped = shape_event->shaped;
2193 ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
2194 } /* _ecore_x_event_handle_shape_change */
2197 _ecore_x_event_handle_screensaver_notify(XEvent *xevent)
2200 XScreenSaverNotifyEvent *screensaver_event;
2201 Ecore_X_Event_Screensaver_Notify *e;
2203 _ecore_x_last_event_mouse_move = 0;
2204 screensaver_event = (XScreenSaverNotifyEvent *)xevent;
2205 e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify));
2209 e->win = screensaver_event->window;
2210 if (screensaver_event->state == ScreenSaverOn)
2215 e->time = screensaver_event->time;
2216 ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
2217 #else /* ifdef ECORE_XSS */
2219 #endif /* ifdef ECORE_XSS */
2220 } /* _ecore_x_event_handle_screensaver_notify */
2223 _ecore_x_event_handle_sync_counter(XEvent *xevent)
2225 XSyncCounterNotifyEvent *sync_counter_event;
2226 Ecore_X_Event_Sync_Counter *e;
2228 _ecore_x_last_event_mouse_move = 0;
2229 sync_counter_event = (XSyncCounterNotifyEvent *)xevent;
2230 e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter));
2234 e->time = sync_counter_event->time;
2235 ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
2236 } /* _ecore_x_event_handle_sync_counter */
2239 _ecore_x_event_handle_sync_alarm(XEvent *xevent)
2241 XSyncAlarmNotifyEvent *sync_alarm_event;
2242 Ecore_X_Event_Sync_Alarm *e;
2244 _ecore_x_last_event_mouse_move = 0;
2245 sync_alarm_event = (XSyncAlarmNotifyEvent *)xevent;
2247 e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm));
2251 e->time = sync_alarm_event->time;
2252 e->alarm = sync_alarm_event->alarm;
2253 ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
2254 } /* _ecore_x_event_handle_sync_alarm */
2258 _ecore_x_event_handle_randr_change(XEvent *xevent)
2260 XRRScreenChangeNotifyEvent *randr_event;
2261 Ecore_X_Event_Screen_Change *e;
2263 _ecore_x_last_event_mouse_move = 0;
2264 randr_event = (XRRScreenChangeNotifyEvent *)xevent;
2265 if (!XRRUpdateConfiguration(xevent))
2266 ERR("Can't update RR config!");
2268 e = calloc(1, sizeof(Ecore_X_Event_Screen_Change));
2272 e->win = randr_event->window;
2273 e->root = randr_event->root;
2274 e->size.width = randr_event->width;
2275 e->size.height = randr_event->height;
2276 e->time = randr_event->timestamp;
2277 e->config_time = randr_event->config_timestamp;
2278 e->size.width_mm = randr_event->mwidth;
2279 e->size.height_mm = randr_event->mheight;
2280 e->orientation = randr_event->rotation;
2281 e->subpixel_order = randr_event->subpixel_order;
2282 ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
2283 } /* _ecore_x_event_handle_randr_change */
2286 _ecore_x_event_handle_randr_notify_crtc_change(const XRRNotifyEvent *xevent)
2288 const XRRCrtcChangeNotifyEvent *randr_event;
2289 Ecore_X_Event_Randr_Crtc_Change *e;
2291 randr_event = (const XRRCrtcChangeNotifyEvent *)xevent;
2293 e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change));
2297 e->win = randr_event->window;
2298 e->crtc = randr_event->crtc;
2299 e->mode = randr_event->mode;
2300 e->orientation = randr_event->rotation;
2301 e->geo.x = randr_event->x;
2302 e->geo.y = randr_event->y;
2303 e->geo.w = randr_event->width;
2304 e->geo.h = randr_event->height;
2305 ecore_event_add(ECORE_X_EVENT_RANDR_CRTC_CHANGE, e, NULL, NULL);
2306 } /* _ecore_x_event_handle_randr_notify_crtc_change */
2309 _ecore_x_event_handle_randr_notify_output_change(const XRRNotifyEvent *xevent)
2311 const XRROutputChangeNotifyEvent *randr_event;
2312 Ecore_X_Event_Randr_Output_Change *e;
2314 randr_event = (const XRROutputChangeNotifyEvent *)xevent;
2316 e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Change));
2320 e->win = randr_event->window;
2321 e->output = randr_event->output;
2322 e->crtc = randr_event->crtc;
2323 e->mode = randr_event->mode;
2324 e->orientation = randr_event->rotation;
2325 e->connection = randr_event->connection;
2326 e->subpixel_order = randr_event->subpixel_order;
2327 ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_CHANGE, e, NULL, NULL);
2328 } /* _ecore_x_event_handle_randr_notify_output_change */
2331 _ecore_x_event_handle_randr_notify_output_property(const XRRNotifyEvent *xevent)
2333 const XRROutputPropertyNotifyEvent *randr_event;
2334 Ecore_X_Event_Randr_Output_Property_Notify *e;
2336 randr_event = (const XRROutputPropertyNotifyEvent *)xevent;
2338 e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Property_Notify));
2342 e->win = randr_event->window;
2343 e->output = randr_event->output;
2344 e->property = randr_event->property;
2345 e->time = randr_event->timestamp;
2346 e->state = randr_event->state;
2347 ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, e, NULL, NULL);
2348 } /* _ecore_x_event_handle_randr_notify_output_property */
2351 _ecore_x_event_handle_randr_notify(XEvent *xevent)
2353 const XRRNotifyEvent *randr_event;
2355 _ecore_x_last_event_mouse_move = 0;
2356 randr_event = (const XRRNotifyEvent *)xevent;
2357 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2358 switch (randr_event->subtype)
2360 case RRNotify_CrtcChange:
2361 _ecore_x_event_handle_randr_notify_crtc_change(randr_event);
2364 case RRNotify_OutputChange:
2365 _ecore_x_event_handle_randr_notify_output_change(randr_event);
2368 case RRNotify_OutputProperty:
2369 _ecore_x_event_handle_randr_notify_output_property(randr_event);
2373 ERR("Unknown XRandR RRNotify subtype: %d.",
2374 randr_event->subtype);
2377 } /* _ecore_x_event_handle_randr_notify */
2379 #endif /* ifdef ECORE_XRANDR */
2383 _ecore_x_event_handle_fixes_selection_notify(XEvent *event)
2385 _ecore_x_last_event_mouse_move = 0;
2386 /* Nothing here yet */
2388 } /* _ecore_x_event_handle_fixes_selection_notify */
2390 #endif /* ifdef ECORE_XFIXES */
2392 #ifdef ECORE_XDAMAGE
2394 _ecore_x_event_handle_damage_notify(XEvent *event)
2396 XDamageNotifyEvent *damage_event;
2397 Ecore_X_Event_Damage *e;
2399 _ecore_x_last_event_mouse_move = 0;
2400 damage_event = (XDamageNotifyEvent *)event;
2402 e = calloc(1, sizeof(Ecore_X_Event_Damage));
2406 e->level = damage_event->level;
2407 e->drawable = damage_event->drawable;
2408 e->damage = damage_event->damage;
2409 e->more = damage_event->more;
2410 e->time = damage_event->timestamp;
2411 e->area.x = damage_event->area.x;
2412 e->area.y = damage_event->area.y;
2413 e->area.width = damage_event->area.width;
2414 e->area.height = damage_event->area.height;
2415 e->geometry.x = damage_event->geometry.x;
2416 e->geometry.y = damage_event->geometry.y;
2417 e->geometry.width = damage_event->geometry.width;
2418 e->geometry.height = damage_event->geometry.height;
2420 ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
2421 } /* _ecore_x_event_handle_damage_notify */
2423 #endif /* ifdef ECORE_XDAMAGE */
2426 _ecore_x_event_free_generic_event(void *data, void *ev)
2429 Ecore_X_Event_Generic *e = (Ecore_X_Event_Generic *)ev;
2432 XFreeEventData(_ecore_x_disp, (XGenericEventCookie *)data);
2434 #endif /* ifdef ECORE_XI2 */
2435 } /* _ecore_x_event_free_generic_event */
2438 _ecore_x_event_handle_generic_event(XEvent *event)
2441 XGenericEvent *generic_event;
2442 Ecore_X_Event_Generic *e;
2444 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2445 generic_event = (XGenericEvent *)event;
2447 e = calloc(1, sizeof(Ecore_X_Event_Generic));
2451 if (XGetEventData(_ecore_x_disp, &event->xcookie))
2453 e->cookie = event->xcookie.cookie;
2454 e->data = event->xcookie.data;
2462 e->extension = generic_event->extension;
2463 e->evtype = generic_event->evtype;
2465 if (e->extension == _ecore_x_xi2_opcode)
2466 _ecore_x_input_handler(event);
2468 ecore_event_add(ECORE_X_EVENT_GENERIC,
2470 _ecore_x_event_free_generic_event,
2472 #endif /* ifdef ECORE_XI2 */
2473 } /* _ecore_x_event_handle_generic_event */