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 */
25 static Window _ecore_x_mouse_down_last_win = 0;
26 static Window _ecore_x_mouse_down_last_last_win = 0;
27 static Window _ecore_x_mouse_down_last_event_win = 0;
28 static Window _ecore_x_mouse_down_last_last_event_win = 0;
29 static Time _ecore_x_mouse_down_last_time = 0;
30 static Time _ecore_x_mouse_down_last_last_time = 0;
31 // static int _ecore_x_mouse_up_count = 0;
32 static int _ecore_x_mouse_down_did_double = 0;
33 static int _ecore_x_mouse_down_did_triple = 0;
34 static int _ecore_x_last_event_mouse_move = 0;
35 static Ecore_Event *_ecore_x_last_event_mouse_move_event = NULL;
38 _ecore_x_event_free_mouse_move(void *data __UNUSED__, void *ev)
40 Ecore_Event_Mouse_Move *e;
43 if (_ecore_x_last_event_mouse_move)
45 _ecore_x_last_event_mouse_move_event = NULL;
46 _ecore_x_last_event_mouse_move = 0;
50 } /* _ecore_x_event_free_mouse_move */
53 ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask)
55 XWindowAttributes attr;
56 XSetWindowAttributes s_attr;
58 LOGFN(__FILE__, __LINE__, __FUNCTION__);
60 w = DefaultRootWindow(_ecore_x_disp);
62 memset(&attr, 0, sizeof(XWindowAttributes));
63 XGetWindowAttributes(_ecore_x_disp, w, &attr);
64 s_attr.event_mask = mask | attr.your_event_mask;
65 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
66 } /* ecore_x_event_mask_set */
69 ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask)
71 XWindowAttributes attr;
72 XSetWindowAttributes s_attr;
74 LOGFN(__FILE__, __LINE__, __FUNCTION__);
76 w = DefaultRootWindow(_ecore_x_disp);
78 memset(&attr, 0, sizeof(XWindowAttributes));
79 XGetWindowAttributes(_ecore_x_disp, w, &attr);
80 s_attr.event_mask = attr.your_event_mask & ~mask;
81 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
82 } /* ecore_x_event_mask_unset */
85 _ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev)
87 Ecore_X_Event_Xdnd_Enter *e;
91 for (i = 0; i < e->num_types; i++)
95 } /* _ecore_x_event_free_xdnd_enter */
98 _ecore_x_event_free_selection_notify(void *data __UNUSED__, void *ev)
100 Ecore_X_Event_Selection_Notify *e;
101 Ecore_X_Selection_Data *sel;
110 } /* _ecore_x_event_free_selection_notify */
113 _ecore_x_event_modifiers(unsigned int state)
115 unsigned int modifiers = 0;
117 if (state & ECORE_X_MODIFIER_SHIFT)
118 modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
120 if (state & ECORE_X_MODIFIER_CTRL)
121 modifiers |= ECORE_EVENT_MODIFIER_CTRL;
123 if (state & ECORE_X_MODIFIER_ALT)
124 modifiers |= ECORE_EVENT_MODIFIER_ALT;
126 if (state & ECORE_X_MODIFIER_WIN)
127 modifiers |= ECORE_EVENT_MODIFIER_WIN;
129 if (state & ECORE_X_LOCK_SCROLL)
130 modifiers |= ECORE_EVENT_LOCK_SCROLL;
132 if (state & ECORE_X_LOCK_NUM)
133 modifiers |= ECORE_EVENT_LOCK_NUM;
135 if (state & ECORE_X_LOCK_CAPS)
136 modifiers |= ECORE_EVENT_LOCK_CAPS;
139 } /* _ecore_x_event_modifiers */
142 _ecore_mouse_move(unsigned int timestamp,
143 unsigned int xmodifiers,
148 unsigned int event_window,
150 unsigned int root_win,
162 Ecore_Event_Mouse_Move *e;
165 e = malloc(sizeof(Ecore_Event_Mouse_Move));
170 e->root_window = root_win;
171 e->timestamp = timestamp;
172 e->same_screen = same_screen;
173 e->event_window = event_window;
175 e->modifiers = _ecore_x_event_modifiers(xmodifiers);
181 e->multi.device = dev;
182 e->multi.radius = (radx + rady) / 2;
183 e->multi.radius_x = radx;
184 e->multi.radius_y = rady;
185 e->multi.pressure = pressure;
186 e->multi.angle = angle;
189 e->multi.root.x = mrx;
190 e->multi.root.y = mry;
192 event = ecore_event_add(ECORE_EVENT_MOUSE_MOVE,
194 _ecore_x_event_free_mouse_move,
197 _ecore_x_event_last_time = timestamp;
198 _ecore_x_event_last_win = window;
199 _ecore_x_event_last_root_x = x_root;
200 _ecore_x_event_last_root_y = y_root;
202 _ecore_x_last_event_mouse_move_event = event;
203 } /* _ecore_mouse_move */
206 _ecore_key_press(int event, XKeyEvent *xevent)
209 char *compose = NULL;
213 char keyname_buffer[256];
214 char compose_buffer[256];
216 XComposeStatus status;
219 _ecore_x_last_event_mouse_move = 0;
220 keyname = XKeysymToString(XKeycodeToKeysym(xevent->display,
221 xevent->keycode, 0));
224 snprintf(keyname_buffer,
225 sizeof(keyname_buffer),
228 keyname = keyname_buffer;
234 if ((_ecore_x_ic) && (event == ECORE_EVENT_KEY_DOWN))
237 #ifdef X_HAVE_UTF8_STRING
238 val = Xutf8LookupString(_ecore_x_ic,
241 sizeof(compose_buffer) - 1,
244 #else /* ifdef X_HAVE_UTF8_STRING */
245 val = XmbLookupString(_ecore_x_ic,
248 sizeof(compose_buffer) - 1,
251 #endif /* ifdef X_HAVE_UTF8_STRING */
252 if (mbstatus == XBufferOverflow)
254 tmp = malloc(sizeof (char) * (val + 1));
260 #ifdef X_HAVE_UTF8_STRING
261 val = Xutf8LookupString(_ecore_x_ic,
267 #else /* ifdef X_HAVE_UTF8_STRING */
268 val = XmbLookupString(_ecore_x_ic,
274 #endif /* ifdef X_HAVE_UTF8_STRING */
279 #ifndef X_HAVE_UTF8_STRING
280 compose = eina_str_convert(nl_langinfo(CODESET), "UTF-8", tmp);
283 #endif /* ifndef X_HAVE_UTF8_STRING */
291 compose_buffer[val] = 0;
292 #ifdef X_HAVE_UTF8_STRING
293 compose = compose_buffer;
294 #else /* ifdef X_HAVE_UTF8_STRING */
295 compose = eina_str_convert(nl_langinfo(
296 CODESET), "UTF-8", compose_buffer);
298 #endif /* ifdef X_HAVE_UTF8_STRING */
303 val = XLookupString(xevent,
305 sizeof(compose_buffer),
310 compose_buffer[val] = 0;
311 compose = eina_str_convert(nl_langinfo(
312 CODESET), "UTF-8", compose_buffer);
317 key = XKeysymToString(sym);
322 malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
323 (compose ? strlen(compose) : 0) + 3);
327 e->keyname = (char *)(e + 1);
328 e->key = e->keyname + strlen(keyname) + 1;
329 e->compose = (compose) ? e->key + strlen(key) + 1 : NULL;
330 e->string = e->compose;
332 strcpy((char *)e->keyname, keyname);
333 strcpy((char *)e->key, key);
335 strcpy((char *)e->compose, compose);
337 e->modifiers = _ecore_x_event_modifiers(xevent->state);
339 e->timestamp = xevent->time;
340 e->window = xevent->subwindow ? xevent->subwindow : xevent->window;
341 e->event_window = xevent->window;
342 e->same_screen = xevent->same_screen;
343 e->root_window = xevent->root;
345 ecore_event_add(event, e, NULL, NULL);
347 _ecore_x_event_last_time = e->timestamp;
352 } /* _ecore_key_press */
354 Ecore_Event_Mouse_Button *
355 _ecore_mouse_button(int event,
356 unsigned int timestamp,
357 unsigned int xmodifiers,
358 unsigned int buttons,
363 unsigned int event_window,
365 unsigned int root_win,
377 Ecore_Event_Mouse_Button *e;
379 e = malloc(sizeof(Ecore_Event_Mouse_Button));
384 e->root_window = root_win;
385 e->timestamp = timestamp;
386 e->same_screen = same_screen;
387 e->event_window = event_window;
389 e->buttons = buttons;
390 e->modifiers = _ecore_x_event_modifiers(xmodifiers);
398 if (event_window == window)
400 if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
402 if (((int)(timestamp - _ecore_x_mouse_down_last_time) <=
403 (int)(1000 * _ecore_x_double_click_time)) &&
404 (window == _ecore_x_mouse_down_last_win) &&
405 (event_window == _ecore_x_mouse_down_last_event_win)
409 _ecore_x_mouse_down_did_double = 1;
413 _ecore_x_mouse_down_did_double = 0;
414 _ecore_x_mouse_down_did_triple = 0;
417 if (((int)(timestamp - _ecore_x_mouse_down_last_last_time) <=
418 (int)(2 * 1000 * _ecore_x_double_click_time)) &&
419 (window == _ecore_x_mouse_down_last_win) &&
420 (window == _ecore_x_mouse_down_last_last_win) &&
421 (event_window == _ecore_x_mouse_down_last_event_win) &&
422 (event_window == _ecore_x_mouse_down_last_last_event_win)
426 _ecore_x_mouse_down_did_triple = 1;
430 _ecore_x_mouse_down_did_triple = 0;
435 if (_ecore_x_mouse_down_did_double)
437 if (_ecore_x_mouse_down_did_triple)
443 /* NB: Block commented out as _ecore_x_mouse_up_count appears to have
444 * no use. The variable is also commented out above. This code block is
445 * the only place that this variable is used, and appears to serve no
447 if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN
450 _ecore_x_mouse_up_count = 0;
453 e->multi.device = dev;
454 e->multi.radius = (radx + rady) / 2;
455 e->multi.radius_x = radx;
456 e->multi.radius_y = rady;
457 e->multi.pressure = pressure;
458 e->multi.angle = angle;
461 e->multi.root.x = mrx;
462 e->multi.root.y = mry;
464 _ecore_x_event_last_time = e->timestamp;
465 _ecore_x_event_last_win = e->window;
466 _ecore_x_event_last_root_x = x_root;
467 _ecore_x_event_last_root_y = y_root;
469 ecore_event_add(event, e, NULL, NULL);
472 } /* _ecore_mouse_button */
475 _ecore_x_event_handle_any_event(XEvent *xevent)
477 XEvent *ev = malloc(sizeof(XEvent));
479 memcpy(ev, xevent, sizeof(XEvent));
480 ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
481 } /* _ecore_x_event_handle_any_event */
484 _ecore_x_event_handle_key_press(XEvent *xevent)
486 _ecore_key_press(ECORE_EVENT_KEY_DOWN, (XKeyEvent *)xevent);
487 } /* _ecore_x_event_handle_key_press */
490 _ecore_x_event_handle_key_release(XEvent *xevent)
492 _ecore_key_press(ECORE_EVENT_KEY_UP, (XKeyEvent *)xevent);
493 } /* _ecore_x_event_handle_key_release */
496 _ecore_x_event_handle_button_press(XEvent *xevent)
500 _ecore_x_last_event_mouse_move = 0;
501 if ((xevent->xbutton.button > 3) && (xevent->xbutton.button < 8))
503 Ecore_Event_Mouse_Wheel *e;
505 e = malloc(sizeof(Ecore_Event_Mouse_Wheel));
509 e->timestamp = xevent->xbutton.time;
510 e->modifiers = _ecore_x_event_modifiers(xevent->xbutton.state);
511 switch (xevent->xbutton.button)
513 case 4: e->direction = 0; e->z = -1; break;
515 case 5: e->direction = 0; e->z = 1; break;
517 case 6: e->direction = 1; e->z = -1; break;
519 case 7: e->direction = 1; e->z = 1; break;
521 default: e->direction = 0; e->z = 0; break;
524 e->x = xevent->xbutton.x;
525 e->y = xevent->xbutton.y;
526 e->root.x = xevent->xbutton.x_root;
527 e->root.y = xevent->xbutton.y_root;
529 if (xevent->xbutton.subwindow)
530 e->window = xevent->xbutton.subwindow;
532 e->window = xevent->xbutton.window;
534 e->event_window = xevent->xbutton.window;
535 e->same_screen = xevent->xbutton.same_screen;
536 e->root_window = xevent->xbutton.root;
538 _ecore_x_event_last_time = e->timestamp;
539 _ecore_x_event_last_win = e->window;
540 _ecore_x_event_last_root_x = xevent->xbutton.x_root;
541 _ecore_x_event_last_root_y = xevent->xbutton.y_root;
542 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
544 for (i = 0; i < _ecore_window_grabs_num; i++)
546 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
547 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
549 Eina_Bool replay = EINA_FALSE;
551 if (_ecore_window_grab_replay_func)
552 replay = _ecore_window_grab_replay_func(
553 _ecore_window_grab_replay_data,
554 ECORE_EVENT_MOUSE_WHEEL,
558 XAllowEvents(xevent->xbutton.display,
559 ReplayPointer, xevent->xbutton.time);
561 XAllowEvents(xevent->xbutton.display,
562 AsyncPointer, xevent->xbutton.time);
571 _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
572 xevent->xbutton.x, xevent->xbutton.y,
573 xevent->xbutton.x_root, xevent->xbutton.y_root,
574 xevent->xbutton.window,
575 (xevent->xbutton.subwindow ? xevent->xbutton.
576 subwindow : xevent->xbutton.window),
577 xevent->xbutton.root,
578 xevent->xbutton.same_screen,
582 xevent->xbutton.x, xevent->xbutton.y,
583 xevent->xbutton.x_root, xevent->xbutton.y_root);
586 Ecore_Event_Mouse_Button *e;
590 if (_ecore_x_mouse_down_did_triple)
592 _ecore_x_mouse_down_last_win = 0;
593 _ecore_x_mouse_down_last_last_win = 0;
594 _ecore_x_mouse_down_last_event_win = 0;
595 _ecore_x_mouse_down_last_last_event_win = 0;
596 _ecore_x_mouse_down_last_time = 0;
597 _ecore_x_mouse_down_last_last_time = 0;
601 (xevent->xbutton.subwindow ? xevent->xbutton.subwindow : xevent->
603 event_window = xevent->xbutton.window;
605 e = _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
606 xevent->xbutton.time,
607 xevent->xbutton.state,
608 xevent->xbutton.button,
611 xevent->xbutton.x_root,
612 xevent->xbutton.y_root,
615 xevent->xbutton.root,
616 xevent->xbutton.same_screen,
626 xevent->xbutton.x_root,
627 xevent->xbutton.y_root);
629 for (i = 0; i < _ecore_window_grabs_num; i++)
631 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
632 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
634 Eina_Bool replay = EINA_FALSE;
636 if (_ecore_window_grab_replay_func)
637 replay = _ecore_window_grab_replay_func(
638 _ecore_window_grab_replay_data,
639 ECORE_EVENT_MOUSE_BUTTON_DOWN,
643 XAllowEvents(xevent->xbutton.display,
644 ReplayPointer, xevent->xbutton.time);
646 XAllowEvents(xevent->xbutton.display,
647 AsyncPointer, xevent->xbutton.time);
653 if (window == event_window)
654 if (!_ecore_x_mouse_down_did_triple)
656 _ecore_x_mouse_down_last_last_win =
657 _ecore_x_mouse_down_last_win;
658 if (xevent->xbutton.subwindow)
659 _ecore_x_mouse_down_last_win = xevent->xbutton.subwindow;
661 _ecore_x_mouse_down_last_win = xevent->xbutton.window;
663 _ecore_x_mouse_down_last_last_event_win =
664 _ecore_x_mouse_down_last_event_win;
665 _ecore_x_mouse_down_last_event_win = xevent->xbutton.window;
666 _ecore_x_mouse_down_last_last_time =
667 _ecore_x_mouse_down_last_time;
668 _ecore_x_mouse_down_last_time = xevent->xbutton.time;
673 } /* _ecore_x_event_handle_button_press */
676 _ecore_x_event_handle_button_release(XEvent *xevent)
678 _ecore_x_last_event_mouse_move = 0;
679 /* filter out wheel buttons */
680 if ((xevent->xbutton.button <= 3) || (xevent->xbutton.button > 7))
682 _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
683 xevent->xbutton.x, xevent->xbutton.y,
684 xevent->xbutton.x_root, xevent->xbutton.y_root,
685 xevent->xbutton.window,
686 (xevent->xbutton.subwindow ? xevent->xbutton.
687 subwindow : xevent->xbutton.window),
688 xevent->xbutton.root,
689 xevent->xbutton.same_screen,
693 xevent->xbutton.x, xevent->xbutton.y,
694 xevent->xbutton.x_root, xevent->xbutton.y_root);
696 _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
697 xevent->xbutton.time, xevent->xbutton.state,
698 xevent->xbutton.button,
699 xevent->xbutton.x, xevent->xbutton.y,
700 xevent->xbutton.x_root, xevent->xbutton.y_root,
701 xevent->xbutton.window,
702 (xevent->xbutton.subwindow ? xevent->xbutton.
703 subwindow : xevent->xbutton.window),
704 xevent->xbutton.root,
705 xevent->xbutton.same_screen,
709 xevent->xbutton.x, xevent->xbutton.y,
710 xevent->xbutton.x_root, xevent->xbutton.y_root);
712 } /* _ecore_x_event_handle_button_release */
715 _ecore_x_event_handle_motion_notify(XEvent *xevent)
718 if (_ecore_x_last_event_mouse_move)
720 ecore_event_del(_ecore_x_last_event_mouse_move_event);
721 _ecore_x_last_event_mouse_move = 0;
722 _ecore_x_last_event_mouse_move_event = NULL;
725 _ecore_mouse_move(xevent->xmotion.time, xevent->xmotion.state,
726 xevent->xmotion.x, xevent->xmotion.y,
727 xevent->xmotion.x_root, xevent->xmotion.y_root,
728 xevent->xmotion.window,
729 (xevent->xmotion.subwindow ? xevent->xmotion.subwindow :
730 xevent->xmotion.window),
731 xevent->xmotion.root,
732 xevent->xmotion.same_screen,
736 xevent->xmotion.x, xevent->xmotion.y,
737 xevent->xmotion.x_root, xevent->xmotion.y_root);
739 _ecore_x_last_event_mouse_move = 1;
742 _ecore_x_dnd_drag(xevent->xmotion.root,
743 xevent->xmotion.x_root,
744 xevent->xmotion.y_root);
745 } /* _ecore_x_event_handle_motion_notify */
748 _ecore_x_event_handle_enter_notify(XEvent *xevent)
750 _ecore_x_last_event_mouse_move = 0;
752 _ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
753 xevent->xcrossing.x, xevent->xcrossing.y,
754 xevent->xcrossing.x_root, xevent->xcrossing.y_root,
755 xevent->xcrossing.window,
756 (xevent->xcrossing.subwindow ? xevent->xcrossing.
757 subwindow : xevent->xcrossing.window),
758 xevent->xcrossing.root,
759 xevent->xcrossing.same_screen,
763 xevent->xcrossing.x, xevent->xcrossing.y,
764 xevent->xcrossing.x_root, xevent->xcrossing.y_root);
767 Ecore_X_Event_Mouse_In *e;
769 e = calloc(1, sizeof(Ecore_X_Event_Mouse_In));
773 e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
774 e->x = xevent->xcrossing.x;
775 e->y = xevent->xcrossing.y;
776 e->root.x = xevent->xcrossing.x_root;
777 e->root.y = xevent->xcrossing.y_root;
778 if (xevent->xcrossing.subwindow)
779 e->win = xevent->xcrossing.subwindow;
781 e->win = xevent->xcrossing.window;
783 e->same_screen = xevent->xcrossing.same_screen;
784 e->root_win = xevent->xcrossing.root;
785 e->event_win = xevent->xcrossing.window;
787 if (xevent->xcrossing.mode == NotifyNormal)
788 e->mode = ECORE_X_EVENT_MODE_NORMAL;
789 else if (xevent->xcrossing.mode == NotifyGrab)
790 e->mode = ECORE_X_EVENT_MODE_GRAB;
791 else if (xevent->xcrossing.mode == NotifyUngrab)
792 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
794 if (xevent->xcrossing.detail == NotifyAncestor)
795 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
796 else if (xevent->xcrossing.detail == NotifyVirtual)
797 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
798 else if (xevent->xcrossing.detail == NotifyInferior)
799 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
800 else if (xevent->xcrossing.detail == NotifyNonlinear)
801 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
802 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
803 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
805 e->time = xevent->xcrossing.time;
806 _ecore_x_event_last_time = e->time;
807 ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
809 } /* _ecore_x_event_handle_enter_notify */
812 _ecore_x_event_handle_leave_notify(XEvent *xevent)
814 _ecore_x_last_event_mouse_move = 0;
816 _ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
817 xevent->xcrossing.x, xevent->xcrossing.y,
818 xevent->xcrossing.x_root, xevent->xcrossing.y_root,
819 xevent->xcrossing.window,
820 (xevent->xcrossing.subwindow ? xevent->xcrossing.
821 subwindow : xevent->xcrossing.window),
822 xevent->xcrossing.root,
823 xevent->xcrossing.same_screen,
827 xevent->xcrossing.x, xevent->xcrossing.y,
828 xevent->xcrossing.x_root, xevent->xcrossing.y_root);
831 Ecore_X_Event_Mouse_Out *e;
833 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out));
837 e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
838 e->x = xevent->xcrossing.x;
839 e->y = xevent->xcrossing.y;
840 e->root.x = xevent->xcrossing.x_root;
841 e->root.y = xevent->xcrossing.y_root;
842 if (xevent->xcrossing.subwindow)
843 e->win = xevent->xcrossing.subwindow;
845 e->win = xevent->xcrossing.window;
847 e->same_screen = xevent->xcrossing.same_screen;
848 e->root_win = xevent->xcrossing.root;
849 e->event_win = xevent->xcrossing.window;
851 if (xevent->xcrossing.mode == NotifyNormal)
852 e->mode = ECORE_X_EVENT_MODE_NORMAL;
853 else if (xevent->xcrossing.mode == NotifyGrab)
854 e->mode = ECORE_X_EVENT_MODE_GRAB;
855 else if (xevent->xcrossing.mode == NotifyUngrab)
856 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
858 if (xevent->xcrossing.detail == NotifyAncestor)
859 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
860 else if (xevent->xcrossing.detail == NotifyVirtual)
861 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
862 else if (xevent->xcrossing.detail == NotifyInferior)
863 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
864 else if (xevent->xcrossing.detail == NotifyNonlinear)
865 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
866 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
867 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
869 e->time = xevent->xcrossing.time;
870 _ecore_x_event_last_time = e->time;
871 _ecore_x_event_last_win = e->win;
872 _ecore_x_event_last_root_x = e->root.x;
873 _ecore_x_event_last_root_y = e->root.y;
874 ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
876 } /* _ecore_x_event_handle_leave_notify */
879 _ecore_x_event_handle_focus_in(XEvent *xevent)
881 Ecore_X_Event_Window_Focus_In *e;
883 _ecore_x_last_event_mouse_move = 0;
888 XSetICValues(_ecore_x_ic, XNFocusWindow, xevent->xfocus.window, NULL);
889 if ((str = XmbResetIC(_ecore_x_ic)))
892 XSetICFocus(_ecore_x_ic);
895 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In));
899 e->win = xevent->xfocus.window;
901 if (xevent->xfocus.mode == NotifyNormal)
902 e->mode = ECORE_X_EVENT_MODE_NORMAL;
903 else if (xevent->xfocus.mode == NotifyWhileGrabbed)
904 e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
905 else if (xevent->xfocus.mode == NotifyGrab)
906 e->mode = ECORE_X_EVENT_MODE_GRAB;
907 else if (xevent->xfocus.mode == NotifyUngrab)
908 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
910 if (xevent->xfocus.detail == NotifyAncestor)
911 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
912 else if (xevent->xfocus.detail == NotifyVirtual)
913 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
914 else if (xevent->xfocus.detail == NotifyInferior)
915 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
916 else if (xevent->xfocus.detail == NotifyNonlinear)
917 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
918 else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
919 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
920 else if (xevent->xfocus.detail == NotifyPointer)
921 e->detail = ECORE_X_EVENT_DETAIL_POINTER;
922 else if (xevent->xfocus.detail == NotifyPointerRoot)
923 e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
924 else if (xevent->xfocus.detail == NotifyDetailNone)
925 e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
927 e->time = _ecore_x_event_last_time;
928 _ecore_x_event_last_time = e->time;
929 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
930 } /* _ecore_x_event_handle_focus_in */
933 _ecore_x_event_handle_focus_out(XEvent *xevent)
935 Ecore_X_Event_Window_Focus_Out *e;
937 _ecore_x_last_event_mouse_move = 0;
939 XUnsetICFocus(_ecore_x_ic);
941 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out));
945 e->win = xevent->xfocus.window;
947 if (xevent->xfocus.mode == NotifyNormal)
948 e->mode = ECORE_X_EVENT_MODE_NORMAL;
949 else if (xevent->xfocus.mode == NotifyWhileGrabbed)
950 e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
951 else if (xevent->xfocus.mode == NotifyGrab)
952 e->mode = ECORE_X_EVENT_MODE_GRAB;
953 else if (xevent->xfocus.mode == NotifyUngrab)
954 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
956 if (xevent->xfocus.detail == NotifyAncestor)
957 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
958 else if (xevent->xfocus.detail == NotifyVirtual)
959 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
960 else if (xevent->xfocus.detail == NotifyInferior)
961 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
962 else if (xevent->xfocus.detail == NotifyNonlinear)
963 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
964 else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
965 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
966 else if (xevent->xfocus.detail == NotifyPointer)
967 e->detail = ECORE_X_EVENT_DETAIL_POINTER;
968 else if (xevent->xfocus.detail == NotifyPointerRoot)
969 e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
970 else if (xevent->xfocus.detail == NotifyDetailNone)
971 e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
973 e->time = _ecore_x_event_last_time;
974 _ecore_x_event_last_time = e->time;
975 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
976 } /* _ecore_x_event_handle_focus_out */
979 _ecore_x_event_handle_keymap_notify(XEvent *xevent __UNUSED__)
981 _ecore_x_last_event_mouse_move = 0;
982 /* FIXME: handle this event type */
983 } /* _ecore_x_event_handle_keymap_notify */
986 _ecore_x_event_handle_expose(XEvent *xevent)
988 Ecore_X_Event_Window_Damage *e;
990 _ecore_x_last_event_mouse_move = 0;
991 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
995 e->win = xevent->xexpose.window;
996 e->time = _ecore_x_event_last_time;
997 e->x = xevent->xexpose.x;
998 e->y = xevent->xexpose.y;
999 e->w = xevent->xexpose.width;
1000 e->h = xevent->xexpose.height;
1001 e->count = xevent->xexpose.count;
1002 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
1003 } /* _ecore_x_event_handle_expose */
1006 _ecore_x_event_handle_graphics_expose(XEvent *xevent)
1008 Ecore_X_Event_Window_Damage *e;
1010 _ecore_x_last_event_mouse_move = 0;
1011 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
1015 e->win = xevent->xgraphicsexpose.drawable;
1016 e->time = _ecore_x_event_last_time;
1017 e->x = xevent->xgraphicsexpose.x;
1018 e->y = xevent->xgraphicsexpose.y;
1019 e->w = xevent->xgraphicsexpose.width;
1020 e->h = xevent->xgraphicsexpose.height;
1021 e->count = xevent->xgraphicsexpose.count;
1022 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
1023 } /* _ecore_x_event_handle_graphics_expose */
1026 _ecore_x_event_handle_visibility_notify(XEvent *xevent)
1028 _ecore_x_last_event_mouse_move = 0;
1029 // if (xevent->xvisibility.state != VisibilityPartiallyObscured)
1031 Ecore_X_Event_Window_Visibility_Change *e;
1033 e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change));
1037 e->win = xevent->xvisibility.window;
1038 e->time = _ecore_x_event_last_time;
1039 if (xevent->xvisibility.state == VisibilityFullyObscured)
1040 e->fully_obscured = 1;
1042 e->fully_obscured = 0;
1044 ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
1046 } /* _ecore_x_event_handle_visibility_notify */
1049 _ecore_x_event_handle_create_notify(XEvent *xevent)
1051 Ecore_X_Event_Window_Create *e;
1053 _ecore_x_last_event_mouse_move = 0;
1054 e = calloc(1, sizeof(Ecore_X_Event_Window_Create));
1058 e->win = xevent->xcreatewindow.window;
1059 e->parent = xevent->xcreatewindow.parent;
1060 if (xevent->xcreatewindow.override_redirect)
1065 e->x = xevent->xcreatewindow.x;
1066 e->y = xevent->xcreatewindow.y;
1067 e->w = xevent->xcreatewindow.width;
1068 e->h = xevent->xcreatewindow.height;
1069 e->border = xevent->xcreatewindow.border_width;
1070 e->time = _ecore_x_event_last_time;
1071 ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
1072 } /* _ecore_x_event_handle_create_notify */
1075 _ecore_x_event_handle_destroy_notify(XEvent *xevent)
1077 Ecore_X_Event_Window_Destroy *e;
1079 _ecore_x_last_event_mouse_move = 0;
1080 e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy));
1084 e->win = xevent->xdestroywindow.window;
1085 e->event_win = xevent->xdestroywindow.event;
1086 e->time = _ecore_x_event_last_time;
1087 if (e->win == _ecore_x_event_last_win)
1088 _ecore_x_event_last_win = 0;
1090 ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
1091 } /* _ecore_x_event_handle_destroy_notify */
1094 _ecore_x_event_handle_unmap_notify(XEvent *xevent)
1096 Ecore_X_Event_Window_Hide *e;
1098 _ecore_x_last_event_mouse_move = 0;
1099 e = calloc(1, sizeof(Ecore_X_Event_Window_Hide));
1103 e->win = xevent->xunmap.window;
1104 e->event_win = xevent->xunmap.event;
1105 e->time = _ecore_x_event_last_time;
1106 ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
1107 } /* _ecore_x_event_handle_unmap_notify */
1110 _ecore_x_event_handle_map_notify(XEvent *xevent)
1112 Ecore_X_Event_Window_Show *e;
1114 _ecore_x_last_event_mouse_move = 0;
1115 e = calloc(1, sizeof(Ecore_X_Event_Window_Show));
1119 e->win = xevent->xmap.window;
1120 e->event_win = xevent->xmap.event;
1121 e->time = _ecore_x_event_last_time;
1122 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
1123 } /* _ecore_x_event_handle_map_notify */
1126 _ecore_x_event_handle_map_request(XEvent *xevent)
1128 Ecore_X_Event_Window_Show_Request *e;
1130 _ecore_x_last_event_mouse_move = 0;
1131 e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request));
1135 e->win = xevent->xmaprequest.window;
1136 e->time = _ecore_x_event_last_time;
1137 e->parent = xevent->xmaprequest.parent;
1138 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, e, NULL, NULL);
1139 } /* _ecore_x_event_handle_map_request */
1142 _ecore_x_event_handle_reparent_notify(XEvent *xevent)
1144 Ecore_X_Event_Window_Reparent *e;
1146 _ecore_x_last_event_mouse_move = 0;
1147 e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent));
1151 e->win = xevent->xreparent.window;
1152 e->event_win = xevent->xreparent.event;
1153 e->parent = xevent->xreparent.parent;
1154 e->time = _ecore_x_event_last_time;
1155 ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
1156 } /* _ecore_x_event_handle_reparent_notify */
1159 _ecore_x_event_handle_configure_notify(XEvent *xevent)
1161 Ecore_X_Event_Window_Configure *e;
1163 _ecore_x_last_event_mouse_move = 0;
1164 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure));
1168 e->win = xevent->xconfigure.window;
1169 e->event_win = xevent->xconfigure.event;
1170 e->abovewin = xevent->xconfigure.above;
1171 e->x = xevent->xconfigure.x;
1172 e->y = xevent->xconfigure.y;
1173 e->w = xevent->xconfigure.width;
1174 e->h = xevent->xconfigure.height;
1175 e->border = xevent->xconfigure.border_width;
1176 e->override = xevent->xconfigure.override_redirect;
1177 e->from_wm = xevent->xconfigure.send_event;
1178 e->time = _ecore_x_event_last_time;
1179 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
1180 } /* _ecore_x_event_handle_configure_notify */
1183 _ecore_x_event_handle_configure_request(XEvent *xevent)
1185 Ecore_X_Event_Window_Configure_Request *e;
1187 _ecore_x_last_event_mouse_move = 0;
1188 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request));
1192 e->win = xevent->xconfigurerequest.window;
1193 e->parent_win = xevent->xconfigurerequest.parent;
1194 e->abovewin = xevent->xconfigurerequest.above;
1195 e->x = xevent->xconfigurerequest.x;
1196 e->y = xevent->xconfigurerequest.y;
1197 e->w = xevent->xconfigurerequest.width;
1198 e->h = xevent->xconfigurerequest.height;
1199 e->border = xevent->xconfigurerequest.border_width;
1200 e->value_mask = xevent->xconfigurerequest.value_mask;
1201 e->time = _ecore_x_event_last_time;
1203 if (xevent->xconfigurerequest.detail == Above)
1204 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1205 else if (xevent->xconfigurerequest.detail == Below)
1206 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1207 else if (xevent->xconfigurerequest.detail == TopIf)
1208 e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
1209 else if (xevent->xconfigurerequest.detail == BottomIf)
1210 e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
1211 else if (xevent->xconfigurerequest.detail == Opposite)
1212 e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
1214 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
1215 } /* _ecore_x_event_handle_configure_request */
1218 _ecore_x_event_handle_gravity_notify(XEvent *xevent __UNUSED__)
1220 _ecore_x_last_event_mouse_move = 0;
1221 /* FIXME: handle this event type */
1222 } /* _ecore_x_event_handle_gravity_notify */
1225 _ecore_x_event_handle_resize_request(XEvent *xevent)
1227 Ecore_X_Event_Window_Resize_Request *e;
1229 _ecore_x_last_event_mouse_move = 0;
1230 e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request));
1234 e->win = xevent->xresizerequest.window;
1235 e->w = xevent->xresizerequest.width;
1236 e->h = xevent->xresizerequest.height;
1237 e->time = _ecore_x_event_last_time;
1238 ecore_event_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, e, NULL, NULL);
1239 } /* _ecore_x_event_handle_resize_request */
1242 _ecore_x_event_handle_circulate_notify(XEvent *xevent)
1244 Ecore_X_Event_Window_Stack *e;
1246 _ecore_x_last_event_mouse_move = 0;
1247 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack));
1251 e->win = xevent->xcirculate.window;
1252 e->event_win = xevent->xcirculate.event;
1253 if (xevent->xcirculate.place == PlaceOnTop)
1254 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1256 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1258 e->time = _ecore_x_event_last_time;
1259 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
1260 } /* _ecore_x_event_handle_circulate_notify */
1263 _ecore_x_event_handle_circulate_request(XEvent *xevent)
1265 Ecore_X_Event_Window_Stack_Request *e;
1267 _ecore_x_last_event_mouse_move = 0;
1268 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request));
1272 e->win = xevent->xcirculaterequest.window;
1273 e->parent = xevent->xcirculaterequest.parent;
1274 if (xevent->xcirculaterequest.place == PlaceOnTop)
1275 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1277 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1279 e->time = _ecore_x_event_last_time;
1280 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
1281 } /* _ecore_x_event_handle_circulate_request */
1284 _ecore_x_event_handle_property_notify(XEvent *xevent)
1286 _ecore_x_last_event_mouse_move = 0;
1288 Ecore_X_Event_Window_Property *e;
1290 e = calloc(1, sizeof(Ecore_X_Event_Window_Property));
1294 e->win = xevent->xproperty.window;
1295 e->atom = xevent->xproperty.atom;
1296 e->time = xevent->xproperty.time;
1297 _ecore_x_event_last_time = e->time;
1298 ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
1300 } /* _ecore_x_event_handle_property_notify */
1303 _ecore_x_event_handle_selection_clear(XEvent *xevent)
1305 // Ecore_X_Selection_Intern *d;
1306 Ecore_X_Event_Selection_Clear *e;
1309 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1310 _ecore_x_last_event_mouse_move = 0;
1311 /* errr..... why? paranoia.
1312 d = _ecore_x_selection_get(xevent->xselectionclear.selection);
1313 if (d && (xevent->xselectionclear.time > d->time))
1315 _ecore_x_selection_set(None, NULL, 0,
1316 xevent->xselectionclear.selection);
1319 /* Generate event for app cleanup */
1320 e = malloc(sizeof(Ecore_X_Event_Selection_Clear));
1321 e->win = xevent->xselectionclear.window;
1322 e->time = xevent->xselectionclear.time;
1323 e->atom = sel = xevent->xselectionclear.selection;
1324 if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
1325 e->selection = ECORE_X_SELECTION_PRIMARY;
1326 else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
1327 e->selection = ECORE_X_SELECTION_SECONDARY;
1328 else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1329 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1331 e->selection = ECORE_X_SELECTION_OTHER;
1333 ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
1334 } /* _ecore_x_event_handle_selection_clear */
1337 _ecore_x_event_handle_selection_request(XEvent *xevent)
1339 Ecore_X_Event_Selection_Request *e;
1340 Ecore_X_Selection_Intern *sd;
1345 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1346 _ecore_x_last_event_mouse_move = 0;
1348 * Generate a selection request event.
1350 e = malloc(sizeof(Ecore_X_Event_Selection_Request));
1351 e->owner = xevent->xselectionrequest.owner;
1352 e->requestor = xevent->xselectionrequest.requestor;
1353 e->time = xevent->xselectionrequest.time;
1354 e->selection = xevent->xselectionrequest.selection;
1355 e->target = xevent->xselectionrequest.target;
1356 e->property = xevent->xselectionrequest.property;
1357 ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL);
1359 if ((sd = _ecore_x_selection_get(xevent->xselectionrequest.selection)) &&
1360 (sd->win == xevent->xselectionrequest.owner))
1362 Ecore_X_Selection_Intern *si;
1364 si = _ecore_x_selection_get(xevent->xselectionrequest.selection);
1367 Ecore_X_Atom property = None;
1370 /* Set up defaults for strings first */
1371 type = xevent->xselectionrequest.target;
1375 if (!ecore_x_selection_convert(xevent->xselectionrequest.selection,
1376 xevent->xselectionrequest.target,
1377 &data, &len, &type, &typesize))
1378 /* Refuse selection, conversion to requested target failed */
1382 /* FIXME: This does not properly handle large data transfers */
1383 ecore_x_window_prop_property_set(
1384 xevent->xselectionrequest.requestor,
1385 xevent->xselectionrequest.
1391 property = xevent->xselectionrequest.property;
1395 ecore_x_selection_notify_send(xevent->xselectionrequest.requestor,
1396 xevent->xselectionrequest.selection,
1397 xevent->xselectionrequest.target,
1399 xevent->xselectionrequest.time);
1402 } /* _ecore_x_event_handle_selection_request */
1405 _ecore_x_event_handle_selection_notify(XEvent *xevent)
1407 Ecore_X_Event_Selection_Notify *e;
1408 unsigned char *data = NULL;
1409 Ecore_X_Atom selection;
1410 int num_ret, format;
1412 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1413 _ecore_x_last_event_mouse_move = 0;
1414 selection = xevent->xselection.selection;
1416 if (xevent->xselection.target == ECORE_X_ATOM_SELECTION_TARGETS)
1418 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1419 xevent->xselection.property,
1420 XA_ATOM, 32, &data, &num_ret);
1426 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1427 xevent->xselection.property,
1428 AnyPropertyType, 8, &data,
1434 e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
1438 e->win = xevent->xselection.requestor;
1439 e->time = xevent->xselection.time;
1440 e->atom = selection;
1441 e->target = _ecore_x_selection_target_get(xevent->xselection.target);
1443 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
1444 e->selection = ECORE_X_SELECTION_PRIMARY;
1445 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
1446 e->selection = ECORE_X_SELECTION_SECONDARY;
1447 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
1448 e->selection = ECORE_X_SELECTION_XDND;
1449 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1450 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1452 e->selection = ECORE_X_SELECTION_OTHER;
1454 e->data = _ecore_x_selection_parse(e->target, data, num_ret, format);
1456 ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
1457 _ecore_x_event_free_selection_notify, NULL);
1458 } /* _ecore_x_event_handle_selection_notify */
1461 _ecore_x_event_handle_colormap_notify(XEvent *xevent)
1463 Ecore_X_Event_Window_Colormap *e;
1465 _ecore_x_last_event_mouse_move = 0;
1466 e = calloc(1,sizeof(Ecore_X_Event_Window_Colormap));
1470 e->win = xevent->xcolormap.window;
1471 e->cmap = xevent->xcolormap.colormap;
1472 e->time = _ecore_x_event_last_time;
1473 if (xevent->xcolormap.state == ColormapInstalled)
1474 e->installed = EINA_TRUE;
1476 e->installed = EINA_FALSE;
1478 ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
1479 } /* _ecore_x_event_handle_colormap_notify */
1482 _ecore_x_event_handle_client_message(XEvent *xevent)
1484 _ecore_x_last_event_mouse_move = 0;
1485 /* Special client message event handling here. need to put LOTS of if */
1486 /* checks here and generate synthetic events per special message known */
1487 /* otherwise generate generic client message event. this would handle*/
1488 /* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
1489 if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
1490 (xevent->xclient.format == 32) &&
1491 (xevent->xclient.data.l[0] == (long)ECORE_X_ATOM_WM_DELETE_WINDOW))
1493 Ecore_X_Event_Window_Delete_Request *e;
1495 e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
1499 e->win = xevent->xclient.window;
1500 e->time = _ecore_x_event_last_time;
1501 ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
1503 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
1504 (xevent->xclient.format == 32) &&
1505 /* Ignore move and resize with keyboard */
1506 (xevent->xclient.data.l[2] < 9))
1508 Ecore_X_Event_Window_Move_Resize_Request *e;
1510 e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request));
1514 e->win = xevent->xclient.window;
1515 e->x = xevent->xclient.data.l[0];
1516 e->y = xevent->xclient.data.l[1];
1517 e->direction = xevent->xclient.data.l[2];
1518 e->button = xevent->xclient.data.l[3];
1519 e->source = xevent->xclient.data.l[4];
1520 ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
1522 /* Xdnd Client Message Handling Begin */
1523 /* Message Type: XdndEnter target */
1524 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_ENTER)
1526 Ecore_X_Event_Xdnd_Enter *e;
1527 Ecore_X_DND_Target *target;
1529 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
1532 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1534 target = _ecore_x_dnd_target_get();
1535 target->state = ECORE_X_DND_TARGET_ENTERED;
1536 target->source = xevent->xclient.data.l[0];
1537 target->win = xevent->xclient.window;
1538 target->version = (int)(xevent->xclient.data.l[1] >> 24);
1539 if (target->version > ECORE_X_DND_VERSION)
1541 WRN("DND: Requested version %d, we only support up to %d",
1542 target->version, ECORE_X_DND_VERSION);
1547 if (xevent->xclient.data.l[1] & 0x1UL)
1549 /* source supports more than 3 types, fetch property */
1550 unsigned char *data;
1551 Ecore_X_Atom *types;
1554 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1555 if (!(ecore_x_window_prop_property_get(target->source,
1556 ECORE_X_ATOM_XDND_TYPE_LIST,
1558 32, &data, &num_ret)))
1561 "DND: Could not fetch data type list from source window, aborting.");
1566 types = (Ecore_X_Atom *)data;
1567 e->types = calloc(num_ret, sizeof(char *));
1570 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1571 for (i = 0; i < num_ret; i++)
1572 e->types[i] = XGetAtomName(_ecore_x_disp, types[i]);
1575 e->num_types = num_ret;
1581 e->types = calloc(3, sizeof(char *));
1584 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1585 while ((i < 3) && (xevent->xclient.data.l[i + 2]))
1587 e->types[i] = XGetAtomName(_ecore_x_disp,
1588 xevent->xclient.data.l[i + 2]);
1596 e->win = target->win;
1597 e->source = target->source;
1598 ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
1599 _ecore_x_event_free_xdnd_enter, NULL);
1601 /* Message Type: XdndPosition target */
1602 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_POSITION)
1604 Ecore_X_Event_Xdnd_Position *e;
1605 Ecore_X_DND_Target *target;
1607 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1609 target = _ecore_x_dnd_target_get();
1610 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1611 (target->win != xevent->xclient.window))
1614 target->pos.x = xevent->xclient.data.l[2] >> 16;
1615 target->pos.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1616 target->action = xevent->xclient.data.l[4]; /* Version 2 */
1618 target->time = (target->version >= 1) ?
1619 (Time)xevent->xclient.data.l[3] : CurrentTime;
1621 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
1624 e->win = target->win;
1625 e->source = target->source;
1626 e->position.x = target->pos.x;
1627 e->position.y = target->pos.y;
1628 e->action = target->action;
1629 ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
1631 /* Message Type: XdndStatus source */
1632 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_STATUS)
1634 Ecore_X_Event_Xdnd_Status *e;
1635 Ecore_X_DND_Source *source;
1637 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1639 source = _ecore_x_dnd_source_get();
1640 /* Make sure source/target match */
1641 if ((source->win != xevent->xclient.window) ||
1642 (source->dest != (Window)xevent->xclient.data.l[0]))
1645 source->await_status = 0;
1647 source->will_accept = xevent->xclient.data.l[1] & 0x1UL;
1648 source->suppress = (xevent->xclient.data.l[1] & 0x2UL) ? 0 : 1;
1650 source->rectangle.x = xevent->xclient.data.l[2] >> 16;
1651 source->rectangle.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1652 source->rectangle.width = xevent->xclient.data.l[3] >> 16;
1653 source->rectangle.height = xevent->xclient.data.l[3] & 0xFFFFUL;
1655 source->accepted_action = xevent->xclient.data.l[4];
1657 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
1660 e->win = source->win;
1661 e->target = source->dest;
1662 e->will_accept = source->will_accept;
1663 e->rectangle.x = source->rectangle.x;
1664 e->rectangle.y = source->rectangle.y;
1665 e->rectangle.width = source->rectangle.width;
1666 e->rectangle.height = source->rectangle.height;
1667 e->action = source->accepted_action;
1669 ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
1671 /* Message Type: XdndLeave target */
1672 /* Pretend the whole thing never happened, sort of */
1673 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_LEAVE)
1675 Ecore_X_Event_Xdnd_Leave *e;
1676 Ecore_X_DND_Target *target;
1678 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1680 target = _ecore_x_dnd_target_get();
1681 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1682 (target->win != xevent->xclient.window))
1685 target->state = ECORE_X_DND_TARGET_IDLE;
1687 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
1690 e->win = xevent->xclient.window;
1691 e->source = (Window)xevent->xclient.data.l[0];
1692 ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
1694 /* Message Type: XdndDrop target */
1695 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_DROP)
1697 Ecore_X_Event_Xdnd_Drop *e;
1698 Ecore_X_DND_Target *target;
1700 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1702 target = _ecore_x_dnd_target_get();
1703 /* Match source/target */
1704 if ((target->source != (Window)xevent->xclient.data.l[0]) ||
1705 (target->win != xevent->xclient.window))
1708 target->time = (target->version >= 1) ?
1709 (Time)xevent->xclient.data.l[2] : _ecore_x_event_last_time;
1711 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
1714 e->win = target->win;
1715 e->source = target->source;
1716 e->action = target->action;
1717 e->position.x = target->pos.x;
1718 e->position.y = target->pos.y;
1719 ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
1721 /* Message Type: XdndFinished source */
1722 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_FINISHED)
1724 Ecore_X_Event_Xdnd_Finished *e;
1725 Ecore_X_DND_Source *source;
1726 Eina_Bool completed = EINA_TRUE;
1728 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1730 source = _ecore_x_dnd_source_get();
1731 /* Match source/target */
1732 if ((source->win != xevent->xclient.window) ||
1733 (source->dest != (Window)xevent->xclient.data.l[0]))
1736 if ((source->version < 5) || (xevent->xclient.data.l[1] & 0x1UL))
1738 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1739 /* Target successfully performed drop action */
1740 ecore_x_selection_xdnd_clear();
1741 source->state = ECORE_X_DND_SOURCE_IDLE;
1743 else if (source->version >= 5)
1745 completed = EINA_FALSE;
1746 source->state = ECORE_X_DND_SOURCE_CONVERTING;
1748 /* FIXME: Probably need to add a timer to switch back to idle
1749 * and discard the selection data */
1752 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
1755 e->win = source->win;
1756 e->target = source->dest;
1757 e->completed = completed;
1758 if (source->version >= 5)
1760 source->accepted_action = xevent->xclient.data.l[2];
1761 e->action = source->accepted_action;
1765 source->accepted_action = 0;
1766 e->action = source->action;
1769 ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
1771 else if (xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_STATE)
1773 Ecore_X_Event_Window_State_Request *e;
1775 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1778 e->win = xevent->xclient.window;
1779 if (xevent->xclient.data.l[0] == 0)
1780 e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
1781 else if (xevent->xclient.data.l[0] == 1)
1782 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1783 else if (xevent->xclient.data.l[0] == 2)
1784 e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
1791 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1792 e->state[0] = _ecore_x_netwm_state_get(xevent->xclient.data.l[1]);
1793 if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
1796 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1798 // name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[1]);
1799 // if (name) ERR("Unknown state: %s", name);
1802 e->state[1] = _ecore_x_netwm_state_get(xevent->xclient.data.l[2]);
1803 if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
1806 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1808 // name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[2]);
1809 // if (name) ERR("Unknown state: %s", name);
1813 e->source = xevent->xclient.data.l[3];
1815 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1817 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_CHANGE_STATE)
1818 && (xevent->xclient.format == 32)
1819 && (xevent->xclient.data.l[0] == IconicState))
1821 Ecore_X_Event_Window_State_Request *e;
1823 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1827 e->win = xevent->xclient.window;
1828 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1829 e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
1831 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1833 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_DESKTOP)
1834 && (xevent->xclient.format == 32))
1836 Ecore_X_Event_Desktop_Change *e;
1838 e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change));
1842 e->win = xevent->xclient.window;
1843 e->desk = xevent->xclient.data.l[0];
1844 e->source = xevent->xclient.data.l[1];
1846 ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
1848 else if ((xevent->xclient.message_type ==
1849 ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS))
1851 Ecore_X_Event_Frame_Extents_Request *e;
1853 e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request));
1857 e->win = xevent->xclient.window;
1859 ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
1861 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS)
1862 && ((Ecore_X_Atom)xevent->xclient.data.l[0] ==
1863 ECORE_X_ATOM_NET_WM_PING)
1864 && (xevent->xclient.format == 32))
1866 Ecore_X_Event_Ping *e;
1867 Ecore_X_Window root = 0;
1869 e = calloc(1, sizeof(Ecore_X_Event_Ping));
1873 e->win = xevent->xclient.window;
1874 e->time = xevent->xclient.data.l[1];
1875 e->event_win = xevent->xclient.data.l[2];
1877 /* send a reply anyway - we are alive... eventloop at least */
1878 ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
1879 if (ScreenCount(_ecore_x_disp) > 1)
1881 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1882 root = ecore_x_window_root_get(e->win);
1885 root = DefaultRootWindow(_ecore_x_disp);
1887 if (xevent->xclient.window != root)
1889 xevent->xclient.window = root;
1890 XSendEvent(_ecore_x_disp, root, False,
1891 SubstructureRedirectMask | SubstructureNotifyMask,
1895 else if ((xevent->xclient.message_type ==
1896 ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
1897 (xevent->xclient.format == 8))
1898 _ecore_x_netwm_startup_info_begin(xevent->xclient.window,
1899 xevent->xclient.data.b);
1900 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO) &&
1901 (xevent->xclient.format == 8))
1902 _ecore_x_netwm_startup_info(xevent->xclient.window,
1903 xevent->xclient.data.b);
1904 else if ((xevent->xclient.message_type == 27777)
1905 && (xevent->xclient.data.l[0] == 0x7162534)
1906 && (xevent->xclient.format == 32)
1907 && (xevent->xclient.window == _ecore_x_private_win))
1909 /* a grab sync marker */
1910 if (xevent->xclient.data.l[1] == 0x10000001)
1911 _ecore_x_window_grab_remove(xevent->xclient.data.l[2]);
1912 else if (xevent->xclient.data.l[1] == 0x10000002)
1913 _ecore_x_key_grab_remove(xevent->xclient.data.l[2]);
1917 Ecore_X_Event_Client_Message *e;
1920 e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
1924 e->win = xevent->xclient.window;
1925 e->message_type = xevent->xclient.message_type;
1926 e->format = xevent->xclient.format;
1927 for (i = 0; i < 5; i++)
1928 e->data.l[i] = xevent->xclient.data.l[i];
1930 ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
1932 } /* _ecore_x_event_handle_client_message */
1935 _ecore_x_event_handle_mapping_notify(XEvent *xevent)
1937 Ecore_X_Event_Mapping_Change *e;
1939 _ecore_x_last_event_mouse_move = 0;
1940 XRefreshKeyboardMapping((XMappingEvent *)xevent);
1941 e = calloc(1, sizeof(Ecore_X_Event_Mapping_Change));
1943 switch (xevent->xmapping.request)
1945 case MappingModifier:
1946 e->type = ECORE_X_MAPPING_MODIFIER;
1948 case MappingKeyboard:
1949 e->type = ECORE_X_MAPPING_KEYBOARD;
1951 case MappingPointer:
1953 e->type = ECORE_X_MAPPING_MOUSE;
1956 e->keycode = xevent->xmapping.first_keycode;
1957 e->num = xevent->xmapping.count;
1958 ecore_event_add(ECORE_X_EVENT_MAPPING_CHANGE, e, NULL, NULL);
1959 } /* _ecore_x_event_handle_mapping_notify */
1962 _ecore_x_event_handle_shape_change(XEvent *xevent)
1964 XShapeEvent *shape_event;
1965 Ecore_X_Event_Window_Shape *e;
1967 _ecore_x_last_event_mouse_move = 0;
1968 shape_event = (XShapeEvent *)xevent;
1969 e = calloc(1, sizeof(Ecore_X_Event_Window_Shape));
1973 e->win = shape_event->window;
1974 e->time = shape_event->time;
1975 switch (shape_event->kind)
1978 e->type = ECORE_X_SHAPE_BOUNDING;
1981 e->type = ECORE_X_SHAPE_CLIP;
1984 e->type = ECORE_X_SHAPE_INPUT;
1989 e->x = shape_event->x;
1990 e->y = shape_event->y;
1991 e->w = shape_event->width;
1992 e->h = shape_event->height;
1993 e->shaped = shape_event->shaped;
1994 ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
1995 } /* _ecore_x_event_handle_shape_change */
1998 _ecore_x_event_handle_screensaver_notify(XEvent *xevent)
2001 XScreenSaverNotifyEvent *screensaver_event;
2002 Ecore_X_Event_Screensaver_Notify *e;
2004 _ecore_x_last_event_mouse_move = 0;
2005 screensaver_event = (XScreenSaverNotifyEvent *)xevent;
2006 e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify));
2010 e->win = screensaver_event->window;
2011 if (screensaver_event->state == ScreenSaverOn)
2016 e->time = screensaver_event->time;
2017 ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
2018 #else /* ifdef ECORE_XSS */
2020 #endif /* ifdef ECORE_XSS */
2021 } /* _ecore_x_event_handle_screensaver_notify */
2024 _ecore_x_event_handle_sync_counter(XEvent *xevent)
2026 XSyncCounterNotifyEvent *sync_counter_event;
2027 Ecore_X_Event_Sync_Counter *e;
2029 _ecore_x_last_event_mouse_move = 0;
2030 sync_counter_event = (XSyncCounterNotifyEvent *)xevent;
2031 e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter));
2035 e->time = sync_counter_event->time;
2036 ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
2037 } /* _ecore_x_event_handle_sync_counter */
2040 _ecore_x_event_handle_sync_alarm(XEvent *xevent)
2042 XSyncAlarmNotifyEvent *sync_alarm_event;
2043 Ecore_X_Event_Sync_Alarm *e;
2045 _ecore_x_last_event_mouse_move = 0;
2046 sync_alarm_event = (XSyncAlarmNotifyEvent *)xevent;
2048 e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm));
2052 e->time = sync_alarm_event->time;
2053 e->alarm = sync_alarm_event->alarm;
2054 ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
2055 } /* _ecore_x_event_handle_sync_alarm */
2059 _ecore_x_event_handle_randr_change(XEvent *xevent)
2061 XRRScreenChangeNotifyEvent *randr_event;
2062 Ecore_X_Event_Screen_Change *e;
2064 _ecore_x_last_event_mouse_move = 0;
2065 randr_event = (XRRScreenChangeNotifyEvent *)xevent;
2066 if (!XRRUpdateConfiguration(xevent))
2067 ERR("Can't update RR config!");
2069 e = calloc(1, sizeof(Ecore_X_Event_Screen_Change));
2073 e->win = randr_event->window;
2074 e->root = randr_event->root;
2075 e->size.width = randr_event->width;
2076 e->size.height = randr_event->height;
2077 e->time = randr_event->timestamp;
2078 e->config_time = randr_event->config_timestamp;
2079 e->size.width_mm = randr_event->mwidth;
2080 e->size.height_mm = randr_event->mheight;
2081 e->orientation = randr_event->rotation;
2082 e->subpixel_order = randr_event->subpixel_order;
2083 ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
2084 } /* _ecore_x_event_handle_randr_change */
2087 _ecore_x_event_handle_randr_notify_crtc_change(const XRRNotifyEvent *xevent)
2089 const XRRCrtcChangeNotifyEvent *randr_event;
2090 Ecore_X_Event_Randr_Crtc_Change *e;
2092 randr_event = (const XRRCrtcChangeNotifyEvent *)xevent;
2094 e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change));
2098 e->win = randr_event->window;
2099 e->crtc = randr_event->crtc;
2100 e->mode = randr_event->mode;
2101 e->orientation = randr_event->rotation;
2102 e->geo.x = randr_event->x;
2103 e->geo.y = randr_event->y;
2104 e->geo.w = randr_event->width;
2105 e->geo.h = randr_event->height;
2106 ecore_event_add(ECORE_X_EVENT_RANDR_CRTC_CHANGE, e, NULL, NULL);
2107 } /* _ecore_x_event_handle_randr_notify_crtc_change */
2110 _ecore_x_event_handle_randr_notify_output_change(const XRRNotifyEvent *xevent)
2112 const XRROutputChangeNotifyEvent *randr_event;
2113 Ecore_X_Event_Randr_Output_Change *e;
2115 randr_event = (const XRROutputChangeNotifyEvent *)xevent;
2117 e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Change));
2121 e->win = randr_event->window;
2122 e->output = randr_event->output;
2123 e->crtc = randr_event->crtc;
2124 e->mode = randr_event->mode;
2125 e->orientation = randr_event->rotation;
2126 e->connection = randr_event->connection;
2127 e->subpixel_order = randr_event->subpixel_order;
2128 ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_CHANGE, e, NULL, NULL);
2129 } /* _ecore_x_event_handle_randr_notify_output_change */
2132 _ecore_x_event_handle_randr_notify_output_property(const XRRNotifyEvent *xevent)
2134 const XRROutputPropertyNotifyEvent *randr_event;
2135 Ecore_X_Event_Randr_Output_Property_Notify *e;
2137 randr_event = (const XRROutputPropertyNotifyEvent *)xevent;
2139 e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Property_Notify));
2143 e->win = randr_event->window;
2144 e->output = randr_event->output;
2145 e->property = randr_event->property;
2146 e->time = randr_event->timestamp;
2147 if (randr_event->state == PropertyNewValue)
2148 e->state = ECORE_X_RANDR_PROPERTY_CHANGE_ADD;
2150 e->state = ECORE_X_RANDR_PROPERTY_CHANGE_DEL;
2151 ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, e, NULL, NULL);
2152 } /* _ecore_x_event_handle_randr_notify_output_property */
2155 _ecore_x_event_handle_randr_notify(XEvent *xevent)
2157 const XRRNotifyEvent *randr_event;
2159 _ecore_x_last_event_mouse_move = 0;
2160 randr_event = (const XRRNotifyEvent *)xevent;
2161 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2162 switch (randr_event->subtype)
2164 case RRNotify_CrtcChange:
2165 _ecore_x_event_handle_randr_notify_crtc_change(randr_event);
2168 case RRNotify_OutputChange:
2169 _ecore_x_event_handle_randr_notify_output_change(randr_event);
2172 case RRNotify_OutputProperty:
2173 _ecore_x_event_handle_randr_notify_output_property(randr_event);
2177 ERR("Unknown XRandR RRNotify subtype: %d.",
2178 randr_event->subtype);
2181 } /* _ecore_x_event_handle_randr_notify */
2183 #endif /* ifdef ECORE_XRANDR */
2187 _ecore_x_event_handle_fixes_selection_notify(XEvent *event)
2189 _ecore_x_last_event_mouse_move = 0;
2190 /* Nothing here yet */
2192 } /* _ecore_x_event_handle_fixes_selection_notify */
2194 #endif /* ifdef ECORE_XFIXES */
2196 #ifdef ECORE_XDAMAGE
2198 _ecore_x_event_handle_damage_notify(XEvent *event)
2200 XDamageNotifyEvent *damage_event;
2201 Ecore_X_Event_Damage *e;
2203 _ecore_x_last_event_mouse_move = 0;
2204 damage_event = (XDamageNotifyEvent *)event;
2206 e = calloc(1, sizeof(Ecore_X_Event_Damage));
2210 e->level = damage_event->level;
2211 e->drawable = damage_event->drawable;
2212 e->damage = damage_event->damage;
2213 e->more = damage_event->more;
2214 e->time = damage_event->timestamp;
2215 e->area.x = damage_event->area.x;
2216 e->area.y = damage_event->area.y;
2217 e->area.width = damage_event->area.width;
2218 e->area.height = damage_event->area.height;
2219 e->geometry.x = damage_event->geometry.x;
2220 e->geometry.y = damage_event->geometry.y;
2221 e->geometry.width = damage_event->geometry.width;
2222 e->geometry.height = damage_event->geometry.height;
2224 ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
2225 } /* _ecore_x_event_handle_damage_notify */
2227 #endif /* ifdef ECORE_XDAMAGE */
2230 _ecore_x_event_free_generic_event(void *data, void *ev)
2233 Ecore_X_Event_Generic *e = (Ecore_X_Event_Generic *)ev;
2236 XFreeEventData(_ecore_x_disp, (XGenericEventCookie *)data);
2238 #endif /* ifdef ECORE_XI2 */
2239 } /* _ecore_x_event_free_generic_event */
2242 _ecore_x_event_handle_generic_event(XEvent *event)
2245 XGenericEvent *generic_event;
2246 Ecore_X_Event_Generic *e;
2248 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2249 generic_event = (XGenericEvent *)event;
2251 e = calloc(1, sizeof(Ecore_X_Event_Generic));
2255 if (XGetEventData(_ecore_x_disp, &event->xcookie))
2257 e->cookie = event->xcookie.cookie;
2258 e->data = event->xcookie.data;
2266 e->extension = generic_event->extension;
2267 e->evtype = generic_event->evtype;
2269 if (e->extension == _ecore_x_xi2_opcode)
2270 _ecore_x_input_handler(event);
2272 ecore_event_add(ECORE_X_EVENT_GENERIC,
2274 _ecore_x_event_free_generic_event,
2276 #endif /* ifdef ECORE_XI2 */
2277 } /* _ecore_x_event_handle_generic_event */