2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
16 #include "ecore_private.h"
17 #include "ecore_x_private.h"
19 #include "Ecore_X_Atoms.h"
20 #include "Ecore_Input.h"
22 /** OpenBSD does not define CODESET
27 #define CODESET "INVALID"
31 static void _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev);
32 static void _ecore_x_event_free_window_prop_title_change(void *data, void *ev);
33 static void _ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev);
34 static void _ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev);
35 static void _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev);
36 static void _ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev);
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_triple = 0;
47 static int _ecore_x_last_event_mouse_move = 0;
48 static Ecore_Event *_ecore_x_last_event_mouse_move_event = NULL;
51 _ecore_x_event_free_mouse_move(void *data __UNUSED__, void *ev)
53 Ecore_Event_Mouse_Move *e;
56 if (_ecore_x_last_event_mouse_move)
58 _ecore_x_last_event_mouse_move_event = NULL;
59 _ecore_x_last_event_mouse_move = 0;
65 ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask)
67 XWindowAttributes attr;
68 XSetWindowAttributes s_attr;
70 if (!w) w = DefaultRootWindow(_ecore_x_disp);
71 memset(&attr, 0, sizeof(XWindowAttributes));
72 XGetWindowAttributes(_ecore_x_disp, w, &attr);
73 s_attr.event_mask = mask | attr.your_event_mask;
74 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
78 ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask)
80 XWindowAttributes attr;
81 XSetWindowAttributes s_attr;
83 if (!w) w = DefaultRootWindow(_ecore_x_disp);
84 memset(&attr, 0, sizeof(XWindowAttributes));
85 XGetWindowAttributes(_ecore_x_disp, w, &attr);
86 s_attr.event_mask = attr.your_event_mask & ~mask;
87 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
92 _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev)
94 Ecore_X_Event_Window_Prop_Name_Class_Change *e;
97 if (e->name) free(e->name);
98 if (e->clas) free(e->clas);
103 _ecore_x_event_free_window_prop_title_change(void *data, void *ev)
105 Ecore_X_Event_Window_Prop_Title_Change *e;
108 if (e->title) free(e->title);
113 _ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev)
115 Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
118 if (e->title) free(e->title);
123 _ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev)
125 Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
128 if (e->name) free(e->name);
133 _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev)
135 Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
138 if (e->name) free(e->name);
143 _ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev)
145 Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
148 if (e->name) free(e->name);
154 _ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev)
156 Ecore_X_Event_Xdnd_Enter *e;
160 for (i = 0; i < e->num_types; i++)
167 _ecore_x_event_free_selection_notify(void *data __UNUSED__, void *ev)
169 Ecore_X_Event_Selection_Notify *e;
170 Ecore_X_Selection_Data *sel;
174 if (sel->free) sel->free(sel);
180 _ecore_x_event_modifiers(unsigned int state)
182 unsigned int modifiers = 0;
184 if (state & ECORE_X_MODIFIER_SHIFT) modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
185 if (state & ECORE_X_MODIFIER_CTRL) modifiers |= ECORE_EVENT_MODIFIER_CTRL;
186 if (state & ECORE_X_MODIFIER_ALT) modifiers |= ECORE_EVENT_MODIFIER_ALT;
187 if (state & ECORE_X_MODIFIER_WIN) modifiers |= ECORE_EVENT_MODIFIER_WIN;
188 if (state & ECORE_X_LOCK_SCROLL) modifiers |= ECORE_EVENT_LOCK_SCROLL;
189 if (state & ECORE_X_LOCK_NUM) modifiers |= ECORE_EVENT_LOCK_NUM;
190 if (state & ECORE_X_LOCK_CAPS) modifiers |= ECORE_EVENT_LOCK_CAPS;
196 _ecore_mouse_move(unsigned int timestamp, unsigned int xmodifiers,
198 int x_root, int y_root,
199 unsigned int event_window,
201 unsigned int root_win,
204 Ecore_Event_Mouse_Move *e;
207 e = malloc(sizeof(Ecore_Event_Mouse_Move));
211 e->root_window = root_win;
212 e->timestamp = timestamp;
213 e->same_screen = same_screen;
214 e->event_window = event_window;
216 e->modifiers = _ecore_x_event_modifiers(xmodifiers);
222 event = ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, _ecore_x_event_free_mouse_move, NULL);
224 _ecore_x_event_last_time = timestamp;
225 _ecore_x_event_last_win = window;
226 _ecore_x_event_last_root_x = x_root;
227 _ecore_x_event_last_root_y = y_root;
229 _ecore_x_last_event_mouse_move_event = event;
233 _ecore_key_press(int event,
237 char *compose = NULL;
241 char keyname_buffer[256];
242 char compose_buffer[256];
244 XComposeStatus status;
247 _ecore_x_last_event_mouse_move = 0;
248 keyname = XKeysymToString(XKeycodeToKeysym(xevent->display,
249 xevent->keycode, 0));
252 snprintf(keyname_buffer, sizeof(keyname_buffer), "Keycode-%i", xevent->keycode);
253 keyname = keyname_buffer;
254 if (!keyname) return ;
263 #ifdef X_HAVE_UTF8_STRING
264 val = Xutf8LookupString(_ecore_x_ic, (XKeyEvent *)xevent, compose_buffer, sizeof(compose_buffer) - 1, &sym, &mbstatus);
266 val = XmbLookupString(_ecore_x_ic, (XKeyEvent *)xevent, compose_buffer, sizeof(compose_buffer) - 1, &sym, &mbstatus);
268 if (mbstatus == XBufferOverflow)
270 tmp = malloc(sizeof (char) * (val + 1));
275 #ifdef X_HAVE_UTF8_STRING
276 val = Xutf8LookupString(_ecore_x_ic, (XKeyEvent *)xevent, tmp, val, &sym, &mbstatus);
278 val = XmbLookupString(_ecore_x_ic, (XKeyEvent *)xevent, tmp, val, &sym, &mbstatus);
284 #ifndef X_HAVE_UTF8_STRING
285 compose = ecore_txt_convert(nl_langinfo(CODESET), "UTF-8", tmp);
295 compose_buffer[val] = 0;
296 #ifdef X_HAVE_UTF8_STRING
297 compose = compose_buffer;
299 compose = ecore_txt_convert(nl_langinfo(CODESET), "UTF-8", compose_buffer);
306 val = XLookupString(xevent, compose_buffer, sizeof(compose_buffer), &sym, &status);
309 compose_buffer[val] = 0;
310 compose = ecore_txt_convert(nl_langinfo(CODESET), "UTF-8", compose_buffer);
315 key = XKeysymToString(sym);
316 if (!key) key = keyname;
317 if (!key) goto on_error;
319 e = malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) + (compose ? strlen(compose) : 0) + 3);
320 if (!e) goto on_error;
322 e->keyname = (char*) (e + 1);
323 e->key = e->keyname + strlen(keyname) + 1;
324 e->compose = (compose) ? e->key + strlen(key) + 1 : NULL;
325 e->string = e->compose;
327 strcpy((char *) e->keyname, keyname);
328 strcpy((char *) e->key, key);
329 if (compose) strcpy((char *) e->compose, compose);
331 e->modifiers = _ecore_x_event_modifiers(xevent->state);
333 e->timestamp = xevent->time;
334 e->window = xevent->subwindow ? xevent->subwindow : xevent->window;
335 e->event_window = xevent->window;
336 e->same_screen = xevent->same_screen;
337 e->root_window = xevent->root;
339 ecore_event_add(event, e, NULL, NULL);
341 _ecore_x_event_last_time = e->timestamp;
347 static Ecore_Event_Mouse_Button*
348 _ecore_mouse_button(int event,
349 unsigned int timestamp, unsigned int xmodifiers,
350 unsigned int buttons,
352 int x_root, int y_root,
353 unsigned int event_window,
355 unsigned int root_win,
358 Ecore_Event_Mouse_Button *e;
360 e = malloc(sizeof(Ecore_Event_Mouse_Button));
364 e->root_window = root_win;
365 e->timestamp = timestamp;
366 e->same_screen = same_screen;
367 e->event_window = event_window;
369 e->buttons = buttons;
370 e->modifiers = _ecore_x_event_modifiers(xmodifiers);
378 if (event_window == window)
380 if (((int)(timestamp - _ecore_x_mouse_down_last_time) <=
381 (int)(1000 * _ecore_x_double_click_time)) &&
382 (window == _ecore_x_mouse_down_last_win) &&
383 (event_window == _ecore_x_mouse_down_last_event_win)
386 if (((int)(timestamp - _ecore_x_mouse_down_last_last_time) <=
387 (int)(2 * 1000 * _ecore_x_double_click_time)) &&
388 (window == _ecore_x_mouse_down_last_win) &&
389 (window == _ecore_x_mouse_down_last_last_win) &&
390 (event_window == _ecore_x_mouse_down_last_event_win) &&
391 (event_window == _ecore_x_mouse_down_last_last_event_win)
395 _ecore_x_mouse_down_did_triple = 1;
398 _ecore_x_mouse_down_did_triple = 0;
401 if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN
404 _ecore_x_mouse_up_count = 0;
406 _ecore_x_event_last_time = e->timestamp;
407 _ecore_x_event_last_win = e->window;
408 _ecore_x_event_last_root_x = x_root;
409 _ecore_x_event_last_root_y = y_root;
411 ecore_event_add(event, e, NULL, NULL);
417 _ecore_x_event_handle_any_event(XEvent *xevent)
419 XEvent* ev = malloc(sizeof(XEvent));
420 memcpy(ev, xevent, sizeof(XEvent));
422 ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
426 _ecore_x_event_handle_key_press(XEvent *xevent)
428 _ecore_key_press(ECORE_EVENT_KEY_DOWN, (XKeyEvent *) xevent);
432 _ecore_x_event_handle_key_release(XEvent *xevent)
434 _ecore_key_press(ECORE_EVENT_KEY_UP, (XKeyEvent *) xevent);
438 _ecore_x_event_handle_button_press(XEvent *xevent)
442 _ecore_x_last_event_mouse_move = 0;
443 if ((xevent->xbutton.button > 3) && (xevent->xbutton.button < 8))
445 Ecore_Event_Mouse_Wheel *e;
447 e = malloc(sizeof(Ecore_Event_Mouse_Wheel));
450 e->timestamp = xevent->xbutton.time;
451 e->modifiers = _ecore_x_event_modifiers(xevent->xbutton.state);
452 switch (xevent->xbutton.button)
454 case 4: e->direction = 0; e->z = -1; break;
455 case 5: e->direction = 0; e->z = 1; break;
456 case 6: e->direction = 1; e->z = -1; break;
457 case 7: e->direction = 1; e->z = 1; break;
458 default: e->direction = 0; e->z = 0; break;
461 e->x = xevent->xbutton.x;
462 e->y = xevent->xbutton.y;
463 e->root.x = xevent->xbutton.x_root;
464 e->root.y = xevent->xbutton.y_root;
466 if (xevent->xbutton.subwindow) e->window = xevent->xbutton.subwindow;
467 else e->window = xevent->xbutton.window;
468 e->event_window = xevent->xbutton.window;
469 e->same_screen = xevent->xbutton.same_screen;
470 e->root_window = xevent->xbutton.root;
472 _ecore_x_event_last_time = e->timestamp;
473 _ecore_x_event_last_win = e->window;
474 _ecore_x_event_last_root_x = xevent->xbutton.x_root;
475 _ecore_x_event_last_root_y = xevent->xbutton.y_root;
476 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
478 for (i = 0; i < _ecore_window_grabs_num; i++)
480 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
481 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
485 if (_ecore_window_grab_replay_func)
486 replay = _ecore_window_grab_replay_func(_ecore_window_grab_replay_data,
487 ECORE_EVENT_MOUSE_WHEEL,
490 XAllowEvents(xevent->xbutton.display,
491 ReplayPointer, xevent->xbutton.time);
493 XAllowEvents(xevent->xbutton.display,
494 AsyncPointer, xevent->xbutton.time);
502 _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
503 xevent->xbutton.x, xevent->xbutton.y,
504 xevent->xbutton.x_root, xevent->xbutton.y_root,
505 xevent->xbutton.window,
506 (xevent->xbutton.subwindow ? xevent->xbutton.subwindow : xevent->xbutton.window),
507 xevent->xbutton.root,
508 xevent->xbutton.same_screen);
511 Ecore_Event_Mouse_Button *e;
515 if (_ecore_x_mouse_down_did_triple)
517 _ecore_x_mouse_down_last_win = 0;
518 _ecore_x_mouse_down_last_last_win = 0;
519 _ecore_x_mouse_down_last_event_win = 0;
520 _ecore_x_mouse_down_last_last_event_win = 0;
521 _ecore_x_mouse_down_last_time = 0;
522 _ecore_x_mouse_down_last_last_time = 0;
525 window = (xevent->xbutton.subwindow ? xevent->xbutton.subwindow : xevent->xbutton.window);
526 event_window = xevent->xbutton.window;
528 e = _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
529 xevent->xbutton.time, xevent->xbutton.state,
530 xevent->xbutton.button,
531 xevent->xbutton.x, xevent->xbutton.y,
532 xevent->xbutton.x_root, xevent->xbutton.y_root,
533 event_window, window,
534 xevent->xbutton.root, xevent->xbutton.same_screen);
536 for (i = 0; i < _ecore_window_grabs_num; i++)
538 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
539 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
543 if (_ecore_window_grab_replay_func)
544 replay = _ecore_window_grab_replay_func(_ecore_window_grab_replay_data,
545 ECORE_EVENT_MOUSE_BUTTON_DOWN,
548 XAllowEvents(xevent->xbutton.display,
549 ReplayPointer, xevent->xbutton.time);
551 XAllowEvents(xevent->xbutton.display,
552 AsyncPointer, xevent->xbutton.time);
557 if (window == event_window)
559 if (!_ecore_x_mouse_down_did_triple)
561 _ecore_x_mouse_down_last_last_win = _ecore_x_mouse_down_last_win;
562 if (xevent->xbutton.subwindow)
563 _ecore_x_mouse_down_last_win = xevent->xbutton.subwindow;
565 _ecore_x_mouse_down_last_win = xevent->xbutton.window;
566 _ecore_x_mouse_down_last_last_event_win = _ecore_x_mouse_down_last_event_win;
567 _ecore_x_mouse_down_last_event_win = xevent->xbutton.window;
568 _ecore_x_mouse_down_last_last_time = _ecore_x_mouse_down_last_time;
569 _ecore_x_mouse_down_last_time = xevent->xbutton.time;
577 _ecore_x_event_handle_button_release(XEvent *xevent)
579 _ecore_x_last_event_mouse_move = 0;
580 /* filter out wheel buttons */
581 if ((xevent->xbutton.button <= 3) || (xevent->xbutton.button > 7))
583 _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
584 xevent->xbutton.x, xevent->xbutton.y,
585 xevent->xbutton.x_root, xevent->xbutton.y_root,
586 xevent->xbutton.window,
587 (xevent->xbutton.subwindow ? xevent->xbutton.subwindow : xevent->xbutton.window),
588 xevent->xbutton.root,
589 xevent->xbutton.same_screen);
591 _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
592 xevent->xbutton.time, xevent->xbutton.state,
593 xevent->xbutton.button,
594 xevent->xbutton.x, xevent->xbutton.y,
595 xevent->xbutton.x_root, xevent->xbutton.y_root,
596 xevent->xbutton.window,
597 (xevent->xbutton.subwindow ? xevent->xbutton.subwindow : xevent->xbutton.window),
598 xevent->xbutton.root,
599 xevent->xbutton.same_screen);
604 _ecore_x_event_handle_motion_notify(XEvent *xevent)
607 if (_ecore_x_last_event_mouse_move)
609 ecore_event_del(_ecore_x_last_event_mouse_move_event);
610 _ecore_x_last_event_mouse_move = 0;
611 _ecore_x_last_event_mouse_move_event = NULL;
614 _ecore_mouse_move(xevent->xmotion.time, xevent->xmotion.state,
615 xevent->xmotion.x, xevent->xmotion.y,
616 xevent->xmotion.x_root, xevent->xmotion.y_root,
617 xevent->xmotion.window,
618 (xevent->xmotion.subwindow ? xevent->xmotion.subwindow : xevent->xmotion.window),
619 xevent->xmotion.root,
620 xevent->xmotion.same_screen);
622 _ecore_x_last_event_mouse_move = 1;
625 _ecore_x_dnd_drag(xevent->xmotion.root, xevent->xmotion.x_root, xevent->xmotion.y_root);
629 _ecore_x_event_handle_enter_notify(XEvent *xevent)
631 _ecore_x_last_event_mouse_move = 0;
633 _ecore_mouse_move(xevent->xmotion.time, xevent->xcrossing.state,
634 xevent->xcrossing.x, xevent->xcrossing.y,
635 xevent->xcrossing.x_root, xevent->xcrossing.y_root,
636 xevent->xcrossing.window,
637 (xevent->xcrossing.subwindow ? xevent->xcrossing.subwindow : xevent->xcrossing.window),
638 xevent->xcrossing.root,
639 xevent->xcrossing.same_screen);
642 Ecore_X_Event_Mouse_In *e;
644 e = calloc(1, sizeof(Ecore_X_Event_Mouse_In));
646 e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
647 e->x = xevent->xcrossing.x;
648 e->y = xevent->xcrossing.y;
649 e->root.x = xevent->xcrossing.x_root;
650 e->root.y = xevent->xcrossing.y_root;
651 if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
652 else e->win = xevent->xcrossing.window;
653 e->same_screen = xevent->xcrossing.same_screen;
654 e->root_win = xevent->xcrossing.root;
655 e->event_win = xevent->xcrossing.window;
657 if (xevent->xcrossing.mode == NotifyNormal)
658 e->mode = ECORE_X_EVENT_MODE_NORMAL;
659 else if (xevent->xcrossing.mode == NotifyGrab)
660 e->mode = ECORE_X_EVENT_MODE_GRAB;
661 else if (xevent->xcrossing.mode == NotifyUngrab)
662 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
664 if (xevent->xcrossing.detail == NotifyAncestor)
665 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
666 else if (xevent->xcrossing.detail == NotifyVirtual)
667 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
668 else if (xevent->xcrossing.detail == NotifyInferior)
669 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
670 else if (xevent->xcrossing.detail == NotifyNonlinear)
671 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
672 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
673 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
675 e->time = xevent->xcrossing.time;
676 _ecore_x_event_last_time = e->time;
677 ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
682 _ecore_x_event_handle_leave_notify(XEvent *xevent)
684 _ecore_x_last_event_mouse_move = 0;
686 _ecore_mouse_move(xevent->xmotion.time, xevent->xcrossing.state,
687 xevent->xcrossing.x, xevent->xcrossing.y,
688 xevent->xcrossing.x_root, xevent->xcrossing.y_root,
689 xevent->xcrossing.window,
690 (xevent->xcrossing.subwindow ? xevent->xcrossing.subwindow : xevent->xcrossing.window),
691 xevent->xcrossing.root,
692 xevent->xcrossing.same_screen);
695 Ecore_X_Event_Mouse_Out *e;
697 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out));
699 e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
700 e->x = xevent->xcrossing.x;
701 e->y = xevent->xcrossing.y;
702 e->root.x = xevent->xcrossing.x_root;
703 e->root.y = xevent->xcrossing.y_root;
704 if (xevent->xcrossing.subwindow) e->win = xevent->xcrossing.subwindow;
705 else e->win = xevent->xcrossing.window;
706 e->same_screen = xevent->xcrossing.same_screen;
707 e->root_win = xevent->xcrossing.root;
708 e->event_win = xevent->xcrossing.window;
710 if (xevent->xcrossing.mode == NotifyNormal)
711 e->mode = ECORE_X_EVENT_MODE_NORMAL;
712 else if (xevent->xcrossing.mode == NotifyGrab)
713 e->mode = ECORE_X_EVENT_MODE_GRAB;
714 else if (xevent->xcrossing.mode == NotifyUngrab)
715 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
717 if (xevent->xcrossing.detail == NotifyAncestor)
718 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
719 else if (xevent->xcrossing.detail == NotifyVirtual)
720 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
721 else if (xevent->xcrossing.detail == NotifyInferior)
722 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
723 else if (xevent->xcrossing.detail == NotifyNonlinear)
724 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
725 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
726 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
728 e->time = xevent->xcrossing.time;
729 _ecore_x_event_last_time = e->time;
730 _ecore_x_event_last_win = e->win;
731 _ecore_x_event_last_root_x = e->root.x;
732 _ecore_x_event_last_root_y = e->root.y;
733 ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
738 _ecore_x_event_handle_focus_in(XEvent *xevent)
740 Ecore_X_Event_Window_Focus_In *e;
742 _ecore_x_last_event_mouse_move = 0;
747 XSetICValues(_ecore_x_ic, XNFocusWindow, xevent->xfocus.window, NULL);
748 if ((str = XmbResetIC(_ecore_x_ic)))
750 XSetICFocus(_ecore_x_ic);
752 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In));
754 e->win = xevent->xfocus.window;
756 if (xevent->xfocus.mode == NotifyNormal)
757 e->mode = ECORE_X_EVENT_MODE_NORMAL;
758 else if (xevent->xfocus.mode == NotifyWhileGrabbed)
759 e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
760 else if (xevent->xfocus.mode == NotifyGrab)
761 e->mode = ECORE_X_EVENT_MODE_GRAB;
762 else if (xevent->xfocus.mode == NotifyUngrab)
763 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
765 if (xevent->xfocus.detail == NotifyAncestor)
766 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
767 else if (xevent->xfocus.detail == NotifyVirtual)
768 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
769 else if (xevent->xfocus.detail == NotifyInferior)
770 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
771 else if (xevent->xfocus.detail == NotifyNonlinear)
772 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
773 else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
774 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
775 else if (xevent->xfocus.detail == NotifyPointer)
776 e->detail = ECORE_X_EVENT_DETAIL_POINTER;
777 else if (xevent->xfocus.detail == NotifyPointerRoot)
778 e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
779 else if (xevent->xfocus.detail == NotifyDetailNone)
780 e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
782 e->time = _ecore_x_event_last_time;
783 _ecore_x_event_last_time = e->time;
784 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
788 _ecore_x_event_handle_focus_out(XEvent *xevent)
790 Ecore_X_Event_Window_Focus_Out *e;
792 _ecore_x_last_event_mouse_move = 0;
793 if (_ecore_x_ic) XUnsetICFocus(_ecore_x_ic);
794 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out));
796 e->win = xevent->xfocus.window;
798 if (xevent->xfocus.mode == NotifyNormal)
799 e->mode = ECORE_X_EVENT_MODE_NORMAL;
800 else if (xevent->xfocus.mode == NotifyWhileGrabbed)
801 e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
802 else if (xevent->xfocus.mode == NotifyGrab)
803 e->mode = ECORE_X_EVENT_MODE_GRAB;
804 else if (xevent->xfocus.mode == NotifyUngrab)
805 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
807 if (xevent->xfocus.detail == NotifyAncestor)
808 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
809 else if (xevent->xfocus.detail == NotifyVirtual)
810 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
811 else if (xevent->xfocus.detail == NotifyInferior)
812 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
813 else if (xevent->xfocus.detail == NotifyNonlinear)
814 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
815 else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
816 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
817 else if (xevent->xfocus.detail == NotifyPointer)
818 e->detail = ECORE_X_EVENT_DETAIL_POINTER;
819 else if (xevent->xfocus.detail == NotifyPointerRoot)
820 e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
821 else if (xevent->xfocus.detail == NotifyDetailNone)
822 e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
824 e->time = _ecore_x_event_last_time;
825 _ecore_x_event_last_time = e->time;
826 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
830 _ecore_x_event_handle_keymap_notify(XEvent *xevent __UNUSED__)
832 _ecore_x_last_event_mouse_move = 0;
833 /* FIXME: handle this event type */
837 _ecore_x_event_handle_expose(XEvent *xevent)
839 Ecore_X_Event_Window_Damage *e;
841 _ecore_x_last_event_mouse_move = 0;
842 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
844 e->win = xevent->xexpose.window;
845 e->time = _ecore_x_event_last_time;
846 e->x = xevent->xexpose.x;
847 e->y = xevent->xexpose.y;
848 e->w = xevent->xexpose.width;
849 e->h = xevent->xexpose.height;
850 e->count = xevent->xexpose.count;
851 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
855 _ecore_x_event_handle_graphics_expose(XEvent *xevent)
857 Ecore_X_Event_Window_Damage *e;
859 _ecore_x_last_event_mouse_move = 0;
860 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
862 e->win = xevent->xgraphicsexpose.drawable;
863 e->time = _ecore_x_event_last_time;
864 e->x = xevent->xgraphicsexpose.x;
865 e->y = xevent->xgraphicsexpose.y;
866 e->w = xevent->xgraphicsexpose.width;
867 e->h = xevent->xgraphicsexpose.height;
868 e->count = xevent->xgraphicsexpose.count;
869 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
873 _ecore_x_event_handle_visibility_notify(XEvent *xevent)
875 _ecore_x_last_event_mouse_move = 0;
876 // if (xevent->xvisibility.state != VisibilityPartiallyObscured)
878 Ecore_X_Event_Window_Visibility_Change *e;
880 e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change));
882 e->win = xevent->xvisibility.window;
883 e->time = _ecore_x_event_last_time;
884 if (xevent->xvisibility.state == VisibilityFullyObscured)
885 e->fully_obscured = 1;
887 e->fully_obscured = 0;
888 ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
893 _ecore_x_event_handle_create_notify(XEvent *xevent)
895 Ecore_X_Event_Window_Create *e;
897 _ecore_x_last_event_mouse_move = 0;
898 e = calloc(1, sizeof(Ecore_X_Event_Window_Create));
900 e->win = xevent->xcreatewindow.window;
901 e->parent = xevent->xcreatewindow.parent;
902 if (xevent->xcreatewindow.override_redirect)
906 e->x = xevent->xcreatewindow.x;
907 e->y = xevent->xcreatewindow.y;
908 e->w = xevent->xcreatewindow.width;
909 e->h = xevent->xcreatewindow.height;
910 e->border = xevent->xcreatewindow.border_width;
911 e->time = _ecore_x_event_last_time;
912 ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
916 _ecore_x_event_handle_destroy_notify(XEvent *xevent)
918 Ecore_X_Event_Window_Destroy *e;
920 _ecore_x_last_event_mouse_move = 0;
921 e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy));
923 e->win = xevent->xdestroywindow.window;
924 e->event_win = xevent->xdestroywindow.event;
925 e->time = _ecore_x_event_last_time;
926 if (e->win == _ecore_x_event_last_win) _ecore_x_event_last_win = 0;
927 ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
931 _ecore_x_event_handle_unmap_notify(XEvent *xevent)
933 Ecore_X_Event_Window_Hide *e;
935 _ecore_x_last_event_mouse_move = 0;
936 e = calloc(1, sizeof(Ecore_X_Event_Window_Hide));
938 e->win = xevent->xunmap.window;
939 e->event_win = xevent->xunmap.event;
940 e->time = _ecore_x_event_last_time;
941 ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
945 _ecore_x_event_handle_map_notify(XEvent *xevent)
947 Ecore_X_Event_Window_Show *e;
949 _ecore_x_last_event_mouse_move = 0;
950 e = calloc(1, sizeof(Ecore_X_Event_Window_Show));
952 e->win = xevent->xmap.window;
953 e->event_win = xevent->xmap.event;
954 e->time = _ecore_x_event_last_time;
955 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
959 _ecore_x_event_handle_map_request(XEvent *xevent)
961 Ecore_X_Event_Window_Show_Request *e;
963 _ecore_x_last_event_mouse_move = 0;
964 e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request));
966 e->win = xevent->xmaprequest.window;
967 e->time = _ecore_x_event_last_time;
968 e->parent = xevent->xmaprequest.parent;
969 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, e, NULL, NULL);
973 _ecore_x_event_handle_reparent_notify(XEvent *xevent)
975 Ecore_X_Event_Window_Reparent *e;
977 _ecore_x_last_event_mouse_move = 0;
978 e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent));
980 e->win = xevent->xreparent.window;
981 e->event_win = xevent->xreparent.event;
982 e->parent = xevent->xreparent.parent;
983 e->time = _ecore_x_event_last_time;
984 ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
988 _ecore_x_event_handle_configure_notify(XEvent *xevent)
990 Ecore_X_Event_Window_Configure *e;
992 _ecore_x_last_event_mouse_move = 0;
993 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure));
995 e->win = xevent->xconfigure.window;
996 e->event_win = xevent->xconfigure.event;
997 e->abovewin = xevent->xconfigure.above;
998 e->x = xevent->xconfigure.x;
999 e->y = xevent->xconfigure.y;
1000 e->w = xevent->xconfigure.width;
1001 e->h = xevent->xconfigure.height;
1002 e->border = xevent->xconfigure.border_width;
1003 e->override = xevent->xconfigure.override_redirect;
1004 e->from_wm = xevent->xconfigure.send_event;
1005 e->time = _ecore_x_event_last_time;
1006 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
1010 _ecore_x_event_handle_configure_request(XEvent *xevent)
1012 Ecore_X_Event_Window_Configure_Request *e;
1014 _ecore_x_last_event_mouse_move = 0;
1015 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request));
1017 e->win = xevent->xconfigurerequest.window;
1018 e->parent_win = xevent->xconfigurerequest.parent;
1019 e->abovewin = xevent->xconfigurerequest.above;
1020 e->x = xevent->xconfigurerequest.x;
1021 e->y = xevent->xconfigurerequest.y;
1022 e->w = xevent->xconfigurerequest.width;
1023 e->h = xevent->xconfigurerequest.height;
1024 e->border = xevent->xconfigurerequest.border_width;
1025 e->value_mask = xevent->xconfigurerequest.value_mask;
1026 e->time = _ecore_x_event_last_time;
1028 if (xevent->xconfigurerequest.detail == Above)
1029 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1030 else if (xevent->xconfigurerequest.detail == Below)
1031 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1032 else if (xevent->xconfigurerequest.detail == TopIf)
1033 e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
1034 else if (xevent->xconfigurerequest.detail == BottomIf)
1035 e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
1036 else if (xevent->xconfigurerequest.detail == Opposite)
1037 e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
1039 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
1043 _ecore_x_event_handle_gravity_notify(XEvent *xevent __UNUSED__)
1045 _ecore_x_last_event_mouse_move = 0;
1046 /* FIXME: handle this event type */
1050 _ecore_x_event_handle_resize_request(XEvent *xevent)
1052 Ecore_X_Event_Window_Resize_Request *e;
1054 _ecore_x_last_event_mouse_move = 0;
1055 e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request));
1057 e->win = xevent->xresizerequest.window;
1058 e->w = xevent->xresizerequest.width;
1059 e->h = xevent->xresizerequest.height;
1060 e->time = _ecore_x_event_last_time;
1061 ecore_event_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, e, NULL, NULL);
1065 _ecore_x_event_handle_circulate_notify(XEvent *xevent)
1067 Ecore_X_Event_Window_Stack *e;
1069 _ecore_x_last_event_mouse_move = 0;
1070 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack));
1072 e->win = xevent->xcirculate.window;
1073 e->event_win = xevent->xcirculate.event;
1074 if (xevent->xcirculate.place == PlaceOnTop)
1075 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1077 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1078 e->time = _ecore_x_event_last_time;
1079 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
1083 _ecore_x_event_handle_circulate_request(XEvent *xevent)
1085 Ecore_X_Event_Window_Stack_Request *e;
1087 _ecore_x_last_event_mouse_move = 0;
1088 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request));
1090 e->win = xevent->xcirculaterequest.window;
1091 e->parent = xevent->xcirculaterequest.parent;
1092 if (xevent->xcirculaterequest.place == PlaceOnTop)
1093 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1095 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1096 e->time = _ecore_x_event_last_time;
1097 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
1101 _ecore_x_event_handle_property_notify(XEvent *xevent)
1103 _ecore_x_last_event_mouse_move = 0;
1104 #if 0 /* for now i disabled this. nice idea though this is - it leaves a lot
1105 * to be desired for efficiency that is better left to the app layer
1107 if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLASS)
1109 Ecore_X_Event_Window_Prop_Name_Class_Change *e;
1111 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Name_Class_Change));
1113 ecore_x_window_prop_name_class_get(xevent->xproperty.window,
1114 &(e->name), &(e->clas));
1115 e->time = xevent->xproperty.time;
1116 _ecore_x_event_last_time = e->time;
1117 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE, e,
1118 _ecore_x_event_free_window_prop_name_class_change, NULL);
1120 else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_NAME) ||
1121 (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_NAME))
1123 Ecore_X_Event_Window_Prop_Title_Change *e;
1125 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Title_Change));
1127 e->title = ecore_x_window_prop_title_get(xevent->xproperty.window);
1128 e->time = xevent->xproperty.time;
1129 _ecore_x_event_last_time = e->time;
1130 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE, e,
1131 _ecore_x_event_free_window_prop_title_change, NULL);
1133 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_NAME)
1135 Ecore_X_Event_Window_Prop_Visible_Title_Change *e;
1137 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Title_Change));
1139 e->title = ecore_x_window_prop_visible_title_get(xevent->xproperty.window);
1140 e->time = xevent->xproperty.time;
1141 _ecore_x_event_last_time = e->time;
1142 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE, e,
1143 _ecore_x_event_free_window_prop_visible_title_change, NULL);
1145 else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_ICON_NAME) ||
1146 (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_ICON_NAME))
1148 Ecore_X_Event_Window_Prop_Icon_Name_Change *e;
1150 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Icon_Name_Change));
1152 e->name = ecore_x_window_prop_icon_name_get(xevent->xproperty.window);
1153 e->time = xevent->xproperty.time;
1154 _ecore_x_event_last_time = e->time;
1155 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE, e,
1156 _ecore_x_event_free_window_prop_icon_name_change, NULL);
1158 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME)
1160 Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e;
1162 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change));
1164 e->name = ecore_x_window_prop_visible_icon_name_get(xevent->xproperty.window);
1165 e->time = xevent->xproperty.time;
1166 _ecore_x_event_last_time = e->time;
1167 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE, e,
1168 _ecore_x_event_free_window_prop_visible_icon_name_change, NULL);
1170 else if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLIENT_MACHINE)
1172 Ecore_X_Event_Window_Prop_Client_Machine_Change *e;
1174 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Client_Machine_Change));
1176 e->name = ecore_x_window_prop_client_machine_get(xevent->xproperty.window);
1177 e->time = xevent->xproperty.time;
1178 _ecore_x_event_last_time = e->time;
1179 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE, e,
1180 _ecore_x_event_free_window_prop_client_machine_change, NULL);
1182 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_PID)
1184 Ecore_X_Event_Window_Prop_Pid_Change *e;
1186 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Pid_Change));
1188 e->pid = ecore_x_window_prop_pid_get(xevent->xproperty.window);
1189 e->time = xevent->xproperty.time;
1190 _ecore_x_event_last_time = e->time;
1191 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
1193 else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_DESKTOP)
1195 Ecore_X_Event_Window_Prop_Desktop_Change *e;
1197 e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Desktop_Change));
1199 e->desktop = ecore_x_window_prop_desktop_get(xevent->xproperty.window);
1200 ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL);
1205 Ecore_X_Event_Window_Property *e;
1207 e = calloc(1,sizeof(Ecore_X_Event_Window_Property));
1209 e->win = xevent->xproperty.window;
1210 e->atom = xevent->xproperty.atom;
1211 e->time = xevent->xproperty.time;
1212 _ecore_x_event_last_time = e->time;
1213 ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
1218 _ecore_x_event_handle_selection_clear(XEvent *xevent)
1220 Ecore_X_Selection_Intern *d;
1221 Ecore_X_Event_Selection_Clear *e;
1224 _ecore_x_last_event_mouse_move = 0;
1225 d = _ecore_x_selection_get(xevent->xselectionclear.selection);
1226 if (d && (xevent->xselectionclear.time > d->time))
1228 _ecore_x_selection_set(None, NULL, 0,
1229 xevent->xselectionclear.selection);
1232 /* Generate event for app cleanup */
1233 e = malloc(sizeof(Ecore_X_Event_Selection_Clear));
1234 e->win = xevent->xselectionclear.window;
1235 e->time = xevent->xselectionclear.time;
1236 e->atom = sel = xevent->xselectionclear.selection;
1237 if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
1238 e->selection = ECORE_X_SELECTION_PRIMARY;
1239 else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
1240 e->selection = ECORE_X_SELECTION_SECONDARY;
1241 else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1242 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1244 e->selection = ECORE_X_SELECTION_OTHER;
1245 ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
1249 _ecore_x_event_handle_selection_request(XEvent *xevent)
1251 Ecore_X_Event_Selection_Request *e;
1252 Ecore_X_Selection_Intern *sd;
1255 _ecore_x_last_event_mouse_move = 0;
1257 * Generate a selection request event.
1259 e = malloc(sizeof(Ecore_X_Event_Selection_Request));
1260 e->owner = xevent->xselectionrequest.owner;
1261 e->requestor = xevent->xselectionrequest.requestor;
1262 e->time = xevent->xselectionrequest.time;
1263 e->selection = xevent->xselectionrequest.selection;
1264 e->target = xevent->xselectionrequest.target;
1265 e->property = xevent->xselectionrequest.property;
1266 ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL);
1268 if ((sd = _ecore_x_selection_get(xevent->xselectionrequest.selection)) &&
1269 (sd->win == xevent->xselectionrequest.owner))
1271 Ecore_X_Selection_Intern *si;
1273 si = _ecore_x_selection_get(xevent->xselectionrequest.selection);
1276 Ecore_X_Atom property;
1278 if (!ecore_x_selection_convert(xevent->xselectionrequest.selection,
1279 xevent->xselectionrequest.target,
1282 /* Refuse selection, conversion to requested target failed */
1287 /* FIXME: This does not properly handle large data transfers */
1288 ecore_x_window_prop_property_set(xevent->xselectionrequest.requestor,
1289 xevent->xselectionrequest.property,
1290 xevent->xselectionrequest.target,
1291 8, data, sd->length);
1292 property = xevent->xselectionrequest.property;
1296 ecore_x_selection_notify_send(xevent->xselectionrequest.requestor,
1297 xevent->xselectionrequest.selection,
1298 xevent->xselectionrequest.target,
1300 xevent->xselectionrequest.time);
1307 _ecore_x_event_handle_selection_notify(XEvent *xevent)
1309 Ecore_X_Event_Selection_Notify *e;
1310 unsigned char *data = NULL;
1311 Ecore_X_Atom selection;
1312 int num_ret, format;
1314 _ecore_x_last_event_mouse_move = 0;
1315 selection = xevent->xselection.selection;
1317 if (xevent->xselection.target == ECORE_X_ATOM_SELECTION_TARGETS)
1319 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1320 xevent->xselection.property,
1321 XA_ATOM, 32, &data, &num_ret);
1322 if (!format) return;
1326 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1327 xevent->xselection.property,
1328 AnyPropertyType, 8, &data,
1330 if (!format) return;
1333 e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
1335 e->win = xevent->xselection.requestor;
1336 e->time = xevent->xselection.time;
1337 e->atom = selection;
1338 e->target = _ecore_x_selection_target_get(xevent->xselection.target);
1340 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
1341 e->selection = ECORE_X_SELECTION_PRIMARY;
1342 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
1343 e->selection = ECORE_X_SELECTION_SECONDARY;
1344 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
1345 e->selection = ECORE_X_SELECTION_XDND;
1346 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1347 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1349 e->selection = ECORE_X_SELECTION_OTHER;
1351 e->data = _ecore_x_selection_parse(e->target, data, num_ret, format);
1353 ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
1354 _ecore_x_event_free_selection_notify, NULL);
1358 _ecore_x_event_handle_colormap_notify(XEvent *xevent)
1360 Ecore_X_Event_Window_Colormap *e;
1362 _ecore_x_last_event_mouse_move = 0;
1363 e = calloc(1,sizeof(Ecore_X_Event_Window_Colormap));
1365 e->win = xevent->xcolormap.window;
1366 e->cmap = xevent->xcolormap.colormap;
1367 e->time = _ecore_x_event_last_time;
1368 if (xevent->xcolormap.state == ColormapInstalled)
1372 ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
1376 _ecore_x_event_handle_client_message(XEvent *xevent)
1378 _ecore_x_last_event_mouse_move = 0;
1379 /* Special client message event handling here. need to put LOTS of if */
1380 /* checks here and generate synthetic events per special message known */
1381 /* otherwise generate generic client message event. this would handle*/
1382 /* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
1383 if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
1384 (xevent->xclient.format == 32) &&
1385 (xevent->xclient.data.l[0] == (long)ECORE_X_ATOM_WM_DELETE_WINDOW))
1387 Ecore_X_Event_Window_Delete_Request *e;
1389 e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
1391 e->win = xevent->xclient.window;
1392 e->time = _ecore_x_event_last_time;
1393 ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
1396 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
1397 (xevent->xclient.format == 32) &&
1398 /* Ignore move and resize with keyboard */
1399 (xevent->xclient.data.l[2] < 9))
1401 Ecore_X_Event_Window_Move_Resize_Request *e;
1403 e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request));
1405 e->win = xevent->xclient.window;
1406 e->x = xevent->xclient.data.l[0];
1407 e->y = xevent->xclient.data.l[1];
1408 e->direction = xevent->xclient.data.l[2];
1409 e->button = xevent->xclient.data.l[3];
1410 e->source = xevent->xclient.data.l[4];
1411 ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
1414 /* Xdnd Client Message Handling Begin */
1415 /* Message Type: XdndEnter target */
1416 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_ENTER)
1418 Ecore_X_Event_Xdnd_Enter *e;
1419 Ecore_X_DND_Target *target;
1421 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
1424 target = _ecore_x_dnd_target_get();
1425 target->state = ECORE_X_DND_TARGET_ENTERED;
1426 target->source = xevent->xclient.data.l[0];
1427 target->win = xevent->xclient.window;
1428 target->version = (int) (xevent->xclient.data.l[1] >> 24);
1429 if (target->version > ECORE_X_DND_VERSION)
1431 WRN("DND: Requested version %d, we only support up to %d",
1432 target->version, ECORE_X_DND_VERSION);
1436 if (xevent->xclient.data.l[1] & 0x1UL)
1438 /* source supports more than 3 types, fetch property */
1439 unsigned char *data;
1440 Ecore_X_Atom *types;
1443 if (!(ecore_x_window_prop_property_get(target->source,
1444 ECORE_X_ATOM_XDND_TYPE_LIST,
1446 32, &data, &num_ret)))
1448 WRN("DND: Could not fetch data type list from source window, aborting.");
1451 types = (Ecore_X_Atom *)data;
1452 e->types = calloc(num_ret, sizeof(char *));
1455 for (i = 0; i < num_ret; i++)
1456 e->types[i] = XGetAtomName(_ecore_x_disp, types[i]);
1458 e->num_types = num_ret;
1464 e->types = calloc(3, sizeof(char *));
1467 while ((i < 3) && (xevent->xclient.data.l[i + 2]))
1469 e->types[i] = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[i + 2]);
1476 e->win = target->win;
1477 e->source = target->source;
1478 ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
1479 _ecore_x_event_free_xdnd_enter, NULL);
1482 /* Message Type: XdndPosition target */
1483 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_POSITION)
1485 Ecore_X_Event_Xdnd_Position *e;
1486 Ecore_X_DND_Target *target;
1488 target = _ecore_x_dnd_target_get();
1489 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1490 (target->win != xevent->xclient.window))
1493 target->pos.x = xevent->xclient.data.l[2] >> 16;
1494 target->pos.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1495 target->action = xevent->xclient.data.l[4]; /* Version 2 */
1497 target->time = (target->version >= 1) ?
1498 (Time)xevent->xclient.data.l[3] : CurrentTime;
1500 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
1502 e->win = target->win;
1503 e->source = target->source;
1504 e->position.x = target->pos.x;
1505 e->position.y = target->pos.y;
1506 e->action = target->action;
1507 ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
1510 /* Message Type: XdndStatus source */
1511 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_STATUS)
1513 Ecore_X_Event_Xdnd_Status *e;
1514 Ecore_X_DND_Source *source;
1516 source = _ecore_x_dnd_source_get();
1517 /* Make sure source/target match */
1518 if ((source->win != xevent->xclient.window ) ||
1519 (source->dest != (Window)xevent->xclient.data.l[0]))
1522 source->await_status = 0;
1524 source->will_accept = xevent->xclient.data.l[1] & 0x1UL;
1525 source->suppress = (xevent->xclient.data.l[1] & 0x2UL) ? 0 : 1;
1527 source->rectangle.x = xevent->xclient.data.l[2] >> 16;
1528 source->rectangle.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1529 source->rectangle.width = xevent->xclient.data.l[3] >> 16;
1530 source->rectangle.height = xevent->xclient.data.l[3] & 0xFFFFUL;
1532 source->accepted_action = xevent->xclient.data.l[4];
1534 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
1536 e->win = source->win;
1537 e->target = source->dest;
1538 e->will_accept = source->will_accept;
1539 e->rectangle.x = source->rectangle.x;
1540 e->rectangle.y = source->rectangle.y;
1541 e->rectangle.width = source->rectangle.width;
1542 e->rectangle.height = source->rectangle.height;
1543 e->action = source->accepted_action;
1545 ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
1548 /* Message Type: XdndLeave target */
1549 /* Pretend the whole thing never happened, sort of */
1550 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_LEAVE)
1552 Ecore_X_Event_Xdnd_Leave *e;
1553 Ecore_X_DND_Target *target;
1555 target = _ecore_x_dnd_target_get();
1556 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1557 (target->win != xevent->xclient.window))
1560 target->state = ECORE_X_DND_TARGET_IDLE;
1562 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
1564 e->win = xevent->xclient.window;
1565 e->source = (Window)xevent->xclient.data.l[0];
1566 ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
1569 /* Message Type: XdndDrop target */
1570 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_DROP)
1572 Ecore_X_Event_Xdnd_Drop *e;
1573 Ecore_X_DND_Target *target;
1575 target = _ecore_x_dnd_target_get();
1576 /* Match source/target */
1577 if ((target->source != (Window)xevent->xclient.data.l[0]) ||
1578 (target->win != xevent->xclient.window))
1581 target->time = (target->version >= 1) ?
1582 (Time)xevent->xclient.data.l[2] : _ecore_x_event_last_time;
1584 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
1586 e->win = target->win;
1587 e->source = target->source;
1588 e->action = target->action;
1589 e->position.x = target->pos.x;
1590 e->position.y = target->pos.y;
1591 ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
1594 /* Message Type: XdndFinished source */
1595 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_FINISHED)
1597 Ecore_X_Event_Xdnd_Finished *e;
1598 Ecore_X_DND_Source *source;
1601 source = _ecore_x_dnd_source_get();
1602 /* Match source/target */
1603 if ((source->win != xevent->xclient.window) ||
1604 (source->dest != (Window)xevent->xclient.data.l[0]))
1607 if ((source->version < 5) || (xevent->xclient.data.l[1] & 0x1UL))
1609 /* Target successfully performed drop action */
1610 ecore_x_selection_xdnd_clear();
1611 source->state = ECORE_X_DND_SOURCE_IDLE;
1613 else if (source->version >= 5)
1616 source->state = ECORE_X_DND_SOURCE_CONVERTING;
1618 /* FIXME: Probably need to add a timer to switch back to idle
1619 * and discard the selection data */
1622 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
1624 e->win = source->win;
1625 e->target = source->dest;
1626 e->completed = completed;
1627 if (source->version >= 5)
1629 source->accepted_action = xevent->xclient.data.l[2];
1630 e->action = source->accepted_action;
1634 source->accepted_action = 0;
1635 e->action = source->action;
1638 ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
1640 else if (xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_STATE)
1642 Ecore_X_Event_Window_State_Request *e;
1644 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1646 e->win = xevent->xclient.window;
1647 if (xevent->xclient.data.l[0] == 0)
1648 e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
1649 else if (xevent->xclient.data.l[0] == 1)
1650 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1651 else if (xevent->xclient.data.l[0] == 2)
1652 e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
1658 e->state[0] = _ecore_x_netwm_state_get(xevent->xclient.data.l[1]);
1659 if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
1663 name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[1]);
1664 if (name) ERR("Unknown state: %s", name);
1667 e->state[1] = _ecore_x_netwm_state_get(xevent->xclient.data.l[2]);
1668 if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
1672 name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[2]);
1673 if (name) ERR("Unknown state: %s", name);
1676 e->source = xevent->xclient.data.l[3];
1678 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1680 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_CHANGE_STATE)
1681 && (xevent->xclient.format == 32)
1682 && (xevent->xclient.data.l[0] == IconicState))
1684 Ecore_X_Event_Window_State_Request *e;
1686 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1688 e->win = xevent->xclient.window;
1689 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1690 e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
1692 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1694 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_DESKTOP)
1695 && (xevent->xclient.format == 32))
1697 Ecore_X_Event_Desktop_Change *e;
1699 e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change));
1701 e->win = xevent->xclient.window;
1702 e->desk = xevent->xclient.data.l[0];
1703 e->source = xevent->xclient.data.l[1];
1705 ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
1707 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS))
1709 Ecore_X_Event_Frame_Extents_Request *e;
1711 e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request));
1713 e->win = xevent->xclient.window;
1715 ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
1717 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS)
1718 && ((Ecore_X_Atom)xevent->xclient.data.l[0] == ECORE_X_ATOM_NET_WM_PING)
1719 && (xevent->xclient.format == 32))
1721 Ecore_X_Event_Ping *e;
1723 e = calloc(1, sizeof(Ecore_X_Event_Ping));
1725 e->win = xevent->xclient.window;
1726 e->time = xevent->xclient.data.l[1];
1727 e->event_win = xevent->xclient.data.l[2];
1729 ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
1731 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
1732 (xevent->xclient.format == 8))
1734 _ecore_x_netwm_startup_info_begin(xevent->xclient.window, xevent->xclient.data.b);
1736 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO) &&
1737 (xevent->xclient.format == 8))
1739 _ecore_x_netwm_startup_info(xevent->xclient.window, xevent->xclient.data.b);
1741 else if ((xevent->xclient.message_type == 27777)
1742 && (xevent->xclient.data.l[0] == 0x7162534)
1743 && (xevent->xclient.format == 32)
1744 && (xevent->xclient.window == _ecore_x_private_win))
1746 /* a grab sync marker */
1747 if (xevent->xclient.data.l[1] == 0x10000001)
1748 _ecore_x_window_grab_remove(xevent->xclient.data.l[2]);
1749 else if (xevent->xclient.data.l[1] == 0x10000002)
1750 _ecore_x_key_grab_remove(xevent->xclient.data.l[2]);
1754 Ecore_X_Event_Client_Message *e;
1757 e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
1759 e->win = xevent->xclient.window;
1760 e->message_type = xevent->xclient.message_type;
1761 e->format = xevent->xclient.format;
1762 for (i = 0; i < 5; i++)
1763 e->data.l[i] = xevent->xclient.data.l[i];
1765 ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
1770 _ecore_x_event_handle_mapping_notify(XEvent *xevent)
1772 _ecore_x_last_event_mouse_move = 0;
1773 XRefreshKeyboardMapping((XMappingEvent *)xevent);
1777 _ecore_x_event_handle_shape_change(XEvent *xevent)
1779 XShapeEvent *shape_event;
1780 Ecore_X_Event_Window_Shape *e;
1782 _ecore_x_last_event_mouse_move = 0;
1783 shape_event = (XShapeEvent *)xevent;
1784 e = calloc(1, sizeof(Ecore_X_Event_Window_Shape));
1786 e->win = shape_event->window;
1787 e->time = shape_event->time;
1788 ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
1792 _ecore_x_event_handle_screensaver_notify(XEvent *xevent)
1795 XScreenSaverNotifyEvent *screensaver_event;
1796 Ecore_X_Event_Screensaver_Notify *e;
1798 _ecore_x_last_event_mouse_move = 0;
1799 screensaver_event = (XScreenSaverNotifyEvent *)xevent;
1800 e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify));
1802 e->win = screensaver_event->window;
1803 if (screensaver_event->state == ScreenSaverOn)
1807 e->time = screensaver_event->time;
1808 ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
1815 _ecore_x_event_handle_sync_counter(XEvent *xevent)
1817 XSyncCounterNotifyEvent *sync_counter_event;
1818 Ecore_X_Event_Sync_Counter *e;
1820 _ecore_x_last_event_mouse_move = 0;
1821 sync_counter_event = (XSyncCounterNotifyEvent *)xevent;
1822 e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter));
1824 e->time = sync_counter_event->time;
1825 ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
1829 _ecore_x_event_handle_sync_alarm(XEvent *xevent)
1831 XSyncAlarmNotifyEvent *sync_alarm_event;
1832 Ecore_X_Event_Sync_Alarm *e;
1834 _ecore_x_last_event_mouse_move = 0;
1835 sync_alarm_event = (XSyncAlarmNotifyEvent *)xevent;
1837 e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm));
1839 e->time = sync_alarm_event->time;
1840 e->alarm = sync_alarm_event->alarm;
1841 ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
1846 _ecore_x_event_handle_randr_change(XEvent *xevent)
1848 XRRScreenChangeNotifyEvent *randr_event;
1849 Ecore_X_Event_Screen_Change *e;
1851 _ecore_x_last_event_mouse_move = 0;
1852 randr_event = (XRRScreenChangeNotifyEvent *)xevent;
1853 if (!XRRUpdateConfiguration(xevent))
1854 ERR("Can't update RR config!");
1856 e = calloc(1, sizeof(Ecore_X_Event_Screen_Change));
1858 e->win = randr_event->window;
1859 e->root = randr_event->root;
1860 e->width = randr_event->width;
1861 e->height = randr_event->height;
1862 e->time = randr_event->timestamp;
1863 e->config_time = randr_event->config_timestamp;
1864 e->mm_width = randr_event->mwidth;
1865 e->mm_height = randr_event->mheight;
1866 e->rotation = randr_event->rotation;
1867 e->subpixel_order = randr_event->subpixel_order;
1868 ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
1872 _ecore_x_event_handle_randr_notify_crtc_change(const XRRNotifyEvent *xevent)
1874 const XRRCrtcChangeNotifyEvent *randr_event;
1875 Ecore_X_Event_Randr_Crtc_Change *e;
1877 randr_event = (const XRRCrtcChangeNotifyEvent *)xevent;
1879 e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change));
1881 e->win = randr_event->window;
1882 e->crtc = randr_event->crtc;
1883 e->mode = randr_event->mode;
1884 e->rotation = randr_event->rotation;
1885 e->x = randr_event->x;
1886 e->y = randr_event->y;
1887 e->width = randr_event->width;
1888 e->height = randr_event->height;
1889 ecore_event_add(ECORE_X_EVENT_RANDR_CRTC_CHANGE, e, NULL, NULL);
1893 _ecore_x_event_handle_randr_notify_output_change(const XRRNotifyEvent *xevent)
1895 const XRROutputChangeNotifyEvent *randr_event;
1896 Ecore_X_Event_Randr_Output_Change *e;
1898 randr_event = (const XRROutputChangeNotifyEvent *)xevent;
1900 e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Change));
1902 e->win = randr_event->window;
1903 e->output = randr_event->output;
1904 e->crtc = randr_event->crtc;
1905 e->mode = randr_event->mode;
1906 e->rotation = randr_event->rotation;
1907 e->connection = randr_event->connection;
1908 e->subpixel_order = randr_event->subpixel_order;
1912 _ecore_x_event_handle_randr_notify_output_property(const XRRNotifyEvent *xevent)
1914 const XRROutputPropertyNotifyEvent *randr_event;
1915 Ecore_X_Event_Randr_Output_Property_Notify *e;
1917 randr_event = (const XRROutputPropertyNotifyEvent *)xevent;
1919 e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Property_Notify));
1921 e->win = randr_event->window;
1922 e->output = randr_event->output;
1923 e->property = randr_event->property;
1924 e->time = randr_event->timestamp;
1925 e->state = randr_event->state;
1929 _ecore_x_event_handle_randr_notify(XEvent *xevent)
1931 const XRRNotifyEvent *randr_event;
1933 _ecore_x_last_event_mouse_move = 0;
1934 randr_event = (const XRRNotifyEvent *)xevent;
1935 switch (randr_event->subtype)
1937 case RRNotify_CrtcChange:
1938 _ecore_x_event_handle_randr_notify_crtc_change(randr_event);
1940 case RRNotify_OutputChange:
1941 _ecore_x_event_handle_randr_notify_output_change(randr_event);
1943 case RRNotify_OutputProperty:
1944 _ecore_x_event_handle_randr_notify_output_property(randr_event);
1947 ERR("Unknown XRandR RRNotify subtype: %d.",
1948 randr_event->subtype);
1956 _ecore_x_event_handle_fixes_selection_notify(XEvent *event)
1958 _ecore_x_last_event_mouse_move = 0;
1959 /* Nothing here yet */
1964 #ifdef ECORE_XDAMAGE
1966 _ecore_x_event_handle_damage_notify(XEvent *event)
1968 XDamageNotifyEvent *damage_event;
1969 Ecore_X_Event_Damage *e;
1971 _ecore_x_last_event_mouse_move = 0;
1972 damage_event = (XDamageNotifyEvent *)event;
1974 e = calloc(1, sizeof(Ecore_X_Event_Damage));
1977 e->level = damage_event->level;
1978 e->drawable = damage_event->drawable;
1979 e->damage = damage_event->damage;
1980 e->more = damage_event->more;
1981 e->time = damage_event->timestamp;
1982 e->area.x = damage_event->area.x;
1983 e->area.y = damage_event->area.y;
1984 e->area.width = damage_event->area.width;
1985 e->area.height = damage_event->area.height;
1986 e->geometry.x = damage_event->geometry.x;
1987 e->geometry.y = damage_event->geometry.y;
1988 e->geometry.width = damage_event->geometry.width;
1989 e->geometry.height = damage_event->geometry.height;
1991 ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);