efl/src/lib/ecore_x/xcb/ecore_xcb_events.c

2803 lines
93 KiB
C

#include "ecore_xcb_private.h"
//#include "Ecore_X_Atoms.h"
#include <langinfo.h>
#include <xcb/xcb_icccm.h>
#include <xcb/xcb_event.h>
# ifdef ECORE_XCB_DAMAGE
# include <xcb/damage.h>
# endif
# ifdef ECORE_XCB_RANDR
# include <xcb/randr.h>
# endif
# ifdef ECORE_XCB_SCREENSAVER
# include <xcb/screensaver.h>
# endif
# ifdef ECORE_XCB_SYNC
# include <xcb/sync.h>
# endif
# ifdef ECORE_XCB_XFIXES
# include <xcb/xfixes.h>
# endif
# ifdef ECORE_XCB_XGESTURE
# include <xcb/gesture.h>
# endif
#ifndef CODESET
# define CODESET "INVALID"
#endif
typedef struct _Ecore_X_Mouse_Down_Info
{
EINA_INLIST;
int dev;
Ecore_X_Time last_time;
Ecore_X_Time last_last_time;
Ecore_X_Window last_win;
Ecore_X_Window last_last_win;
Ecore_X_Window last_event_win;
Ecore_X_Window last_last_event_win;
Eina_Bool did_double : 1;
Eina_Bool did_triple : 1;
} Ecore_X_Mouse_Down_Info;
/* local function prototypes */
static void _ecore_xcb_event_handle_any_event(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_key_press(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_key_release(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_button_press(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_button_release(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_motion_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_enter_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_leave_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_keymap_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_focus_in(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_focus_out(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_expose(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_graphics_exposure(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_visibility_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_create_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_destroy_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_map_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_unmap_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_map_request(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_reparent_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_configure_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_configure_request(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_gravity_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_resize_request(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_circulate_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_circulate_request(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_property_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_selection_clear(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_selection_request(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_selection_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_colormap_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_client_message(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_mapping_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_damage_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_randr_change(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_randr_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_randr_crtc_change(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_randr_output_change(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_randr_output_property_change(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_screensaver_notify(xcb_generic_event_t *event);
#ifdef ECORE_XCB_XGESTURE
static void _ecore_xcb_event_handle_gesture_notify_flick(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_gesture_notify_pan(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_gesture_notify_pinchrotation(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_gesture_notify_tap(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_gesture_notify_tapnhold(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_gesture_notify_hold(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_gesture_notify_group(xcb_generic_event_t *event);
#endif
#ifdef ECORE_XCB_SHAPE
static void _ecore_xcb_event_handle_shape_change(xcb_generic_event_t *event);
#endif
static void _ecore_xcb_event_handle_sync_counter(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_sync_alarm(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_xfixes_selection_notify(xcb_generic_event_t *event EINA_UNUSED);
static void _ecore_xcb_event_handle_xfixes_cursor_notify(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_generic_event(xcb_generic_event_t *event);
static void _ecore_xcb_event_handle_input_event(xcb_generic_event_t *event);
static void _ecore_xcb_event_key_press(xcb_generic_event_t *event);
static void _ecore_xcb_event_key_release(xcb_generic_event_t *event);
static void _ecore_xcb_event_mouse_move_free(void *data EINA_UNUSED,
void *event);
static Ecore_X_Event_Mode _ecore_xcb_event_mode_get(uint8_t mode);
static Ecore_X_Event_Detail _ecore_xcb_event_detail_get(uint8_t detail);
static void _ecore_xcb_event_xdnd_enter_free(void *data EINA_UNUSED,
void *event);
static void _ecore_xcb_event_selection_notify_free(void *data EINA_UNUSED,
void *event);
static void _ecore_xcb_event_generic_event_free(void *data,
void *event);
static void _ecore_xcb_event_mouse_down_info_clear(void);
static Ecore_X_Mouse_Down_Info *_ecore_xcb_event_mouse_down_info_get(int dev);
/* local variables */
static Eina_Bool _ecore_xcb_event_last_mouse_move = EINA_FALSE;
//static Ecore_Event *_ecore_xcb_event_last_mouse_move_event = NULL;
static Eina_Inlist *_ecore_xcb_mouse_down_info_list = NULL;
static Ecore_X_Time _ecore_xcb_event_last_time;
static Ecore_X_Window _ecore_xcb_event_last_window = 0;
/* public variables */
int16_t _ecore_xcb_event_last_root_x = 0;
int16_t _ecore_xcb_event_last_root_y = 0;
EAPI int ECORE_X_EVENT_ANY = 0;
EAPI int ECORE_X_EVENT_MOUSE_IN = 0;
EAPI int ECORE_X_EVENT_MOUSE_OUT = 0;
EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN = 0;
EAPI int ECORE_X_EVENT_WINDOW_FOCUS_OUT = 0;
EAPI int ECORE_X_EVENT_WINDOW_KEYMAP = 0;
EAPI int ECORE_X_EVENT_WINDOW_DAMAGE = 0;
EAPI int ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = 0;
EAPI int ECORE_X_EVENT_WINDOW_CREATE = 0;
EAPI int ECORE_X_EVENT_WINDOW_DESTROY = 0;
EAPI int ECORE_X_EVENT_WINDOW_HIDE = 0;
EAPI int ECORE_X_EVENT_WINDOW_SHOW = 0;
EAPI int ECORE_X_EVENT_WINDOW_SHOW_REQUEST = 0;
EAPI int ECORE_X_EVENT_WINDOW_REPARENT = 0;
EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE = 0;
EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = 0;
EAPI int ECORE_X_EVENT_WINDOW_GRAVITY = 0;
EAPI int ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = 0;
EAPI int ECORE_X_EVENT_WINDOW_STACK = 0;
EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST = 0;
EAPI int ECORE_X_EVENT_WINDOW_PROPERTY = 0;
EAPI int ECORE_X_EVENT_WINDOW_COLORMAP = 0;
EAPI int ECORE_X_EVENT_WINDOW_MAPPING = 0;
EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0;
EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0;
EAPI int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = 0;
EAPI int ECORE_X_EVENT_CLIENT_MESSAGE = 0;
EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = 0;
EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PAN = 0;
EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = 0;
EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAP = 0;
EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = 0;
EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = 0;
EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = 0;
EAPI int ECORE_X_EVENT_SYNC_COUNTER = 0;
EAPI int ECORE_X_EVENT_SYNC_ALARM = 0;
EAPI int ECORE_X_EVENT_SCREEN_CHANGE = 0;
EAPI int ECORE_X_EVENT_DAMAGE_NOTIFY = 0;
EAPI int ECORE_X_EVENT_RANDR_CRTC_CHANGE = 0;
EAPI int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = 0;
EAPI int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = 0;
EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST = 0;
EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0;
EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST = 0;
EAPI int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = 0;
EAPI int ECORE_X_EVENT_PING = 0;
EAPI int ECORE_X_EVENT_DESKTOP_CHANGE = 0;
EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = 0;
EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = 0;
EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = 0;
EAPI int ECORE_X_EVENT_XKB_STATE_NOTIFY = 0;
EAPI int ECORE_X_EVENT_XKB_NEWKBD_NOTIFY = 0;
EAPI int ECORE_X_EVENT_GENERIC = 0;
EAPI int ECORE_X_RAW_BUTTON_PRESS = 0;
EAPI int ECORE_X_RAW_BUTTON_RELEASE = 0;
EAPI int ECORE_X_RAW_MOTION = 0;
void
_ecore_xcb_events_init(void)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!ECORE_X_EVENT_ANY)
{
ECORE_X_EVENT_ANY = ecore_event_type_new();
ECORE_X_EVENT_MOUSE_IN = ecore_event_type_new();
ECORE_X_EVENT_MOUSE_OUT = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_KEYMAP = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_DAMAGE = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_CREATE = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_DESTROY = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_HIDE = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_SHOW = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_SHOW_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_REPARENT = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_GRAVITY = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_STACK = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_STACK_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_PROPERTY = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_COLORMAP = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_MAPPING = ecore_event_type_new();
ECORE_X_EVENT_MAPPING_CHANGE = ecore_event_type_new();
ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new();
ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new();
ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = ecore_event_type_new();
ECORE_X_EVENT_CLIENT_MESSAGE = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_SHAPE = ecore_event_type_new();
ECORE_X_EVENT_SCREENSAVER_NOTIFY = ecore_event_type_new();
ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = ecore_event_type_new();
ECORE_X_EVENT_GESTURE_NOTIFY_PAN = ecore_event_type_new();
ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = ecore_event_type_new();
ECORE_X_EVENT_GESTURE_NOTIFY_TAP = ecore_event_type_new();
ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = ecore_event_type_new();
ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = ecore_event_type_new();
ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = ecore_event_type_new();
ECORE_X_EVENT_SYNC_COUNTER = ecore_event_type_new();
ECORE_X_EVENT_SYNC_ALARM = ecore_event_type_new();
ECORE_X_EVENT_SCREEN_CHANGE = ecore_event_type_new();
ECORE_X_EVENT_RANDR_CRTC_CHANGE = ecore_event_type_new();
ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = ecore_event_type_new();
ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = ecore_event_type_new();
ECORE_X_EVENT_DAMAGE_NOTIFY = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_DESKTOP_CHANGE = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_WINDOW_STATE_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = ecore_event_type_new();
ECORE_X_EVENT_PING = ecore_event_type_new();
ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = ecore_event_type_new();
ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = ecore_event_type_new();
ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = ecore_event_type_new();
ECORE_X_EVENT_XKB_STATE_NOTIFY = ecore_event_type_new();
ECORE_X_EVENT_XKB_NEWKBD_NOTIFY = ecore_event_type_new();
ECORE_X_EVENT_GENERIC = ecore_event_type_new();
ECORE_X_RAW_BUTTON_PRESS = ecore_event_type_new();
ECORE_X_RAW_BUTTON_RELEASE = ecore_event_type_new();
ECORE_X_RAW_MOTION = ecore_event_type_new();
}
}
void
_ecore_xcb_events_shutdown(void)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_mouse_down_info_clear();
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
// if (_ecore_xcb_event_last_mouse_move_event)
// {
// ecore_event_del(_ecore_xcb_event_last_mouse_move_event);
// _ecore_xcb_event_last_mouse_move_event = NULL;
// }
}
void
_ecore_xcb_events_handle(xcb_generic_event_t *ev)
{
uint8_t response = 0;
// LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
/* strip highest bit (set if event is generated) */
response = (ev->response_type & ~0x80);
if (response == 0)
{
xcb_generic_error_t *err;
err = (xcb_generic_error_t *)ev;
/* NB: There is no way to check access of destroyed windows,
* so trap those cases and ignore. We also ignore BadValue from
* xcb_grab/ungrab_button (happens when we are using any_mod)
* and a few others */
if (err->error_code == XCB_WINDOW) return;
else if (err->error_code == XCB_MATCH)
{
if ((err->major_code == XCB_SET_INPUT_FOCUS) ||
(err->major_code == XCB_CONFIGURE_WINDOW))
return;
}
else if (err->error_code == XCB_VALUE)
{
if ((err->major_code == XCB_KILL_CLIENT) ||
(err->major_code == XCB_GRAB_BUTTON) ||
(err->major_code == XCB_UNGRAB_BUTTON))
return;
}
WRN("Got Event Error:");
WRN("\tMajor Code: %d", err->major_code);
WRN("\tMinor Code: %d", err->minor_code);
WRN("\tRequest: %s", xcb_event_get_request_label(err->major_code));
WRN("\tError: %s", xcb_event_get_error_label(err->error_code));
if (err->error_code == 2) // bad value
WRN("\tValue: %d", ((xcb_value_error_t *)err)->bad_value);
else if (err->error_code == 8) // bad match
WRN("\tMatch: %d", ((xcb_match_error_t *)err)->bad_value);
if (err->major_code == XCB_SEND_EVENT)
{
WRN("\tSend Event Error");
WRN("\t\tSeq: %d", ev->sequence);
WRN("\t\tFull Seq: %d", ev->full_sequence);
WRN("\t\tType: %d", ev->response_type);
}
/* if (err->major_code == 148) */
/* { */
/* printf("GOT 148 Error\n"); */
/* } */
return;
}
/* FIXME: Filter event for xim when xcb supports xim */
_ecore_xcb_event_handle_any_event(ev);
if (response == XCB_KEY_PRESS)
_ecore_xcb_event_handle_key_press(ev);
else if (response == XCB_KEY_RELEASE)
_ecore_xcb_event_handle_key_release(ev);
else if (response == XCB_BUTTON_PRESS)
_ecore_xcb_event_handle_button_press(ev);
else if (response == XCB_BUTTON_RELEASE)
_ecore_xcb_event_handle_button_release(ev);
else if (response == XCB_MOTION_NOTIFY)
_ecore_xcb_event_handle_motion_notify(ev);
else if (response == XCB_ENTER_NOTIFY)
_ecore_xcb_event_handle_enter_notify(ev);
else if (response == XCB_LEAVE_NOTIFY)
_ecore_xcb_event_handle_leave_notify(ev);
else if (response == XCB_KEYMAP_NOTIFY)
_ecore_xcb_event_handle_keymap_notify(ev);
else if (response == XCB_FOCUS_IN)
_ecore_xcb_event_handle_focus_in(ev);
else if (response == XCB_FOCUS_OUT)
_ecore_xcb_event_handle_focus_out(ev);
else if (response == XCB_EXPOSE)
_ecore_xcb_event_handle_expose(ev);
else if (response == XCB_GRAPHICS_EXPOSURE)
_ecore_xcb_event_handle_graphics_exposure(ev);
else if (response == XCB_VISIBILITY_NOTIFY)
_ecore_xcb_event_handle_visibility_notify(ev);
else if (response == XCB_CREATE_NOTIFY)
_ecore_xcb_event_handle_create_notify(ev);
else if (response == XCB_DESTROY_NOTIFY)
_ecore_xcb_event_handle_destroy_notify(ev);
else if (response == XCB_MAP_NOTIFY)
_ecore_xcb_event_handle_map_notify(ev);
else if (response == XCB_UNMAP_NOTIFY)
_ecore_xcb_event_handle_unmap_notify(ev);
else if (response == XCB_MAP_REQUEST)
_ecore_xcb_event_handle_map_request(ev);
else if (response == XCB_REPARENT_NOTIFY)
_ecore_xcb_event_handle_reparent_notify(ev);
else if (response == XCB_CONFIGURE_NOTIFY)
_ecore_xcb_event_handle_configure_notify(ev);
else if (response == XCB_CONFIGURE_REQUEST)
_ecore_xcb_event_handle_configure_request(ev);
else if (response == XCB_GRAVITY_NOTIFY)
_ecore_xcb_event_handle_gravity_notify(ev);
else if (response == XCB_RESIZE_REQUEST)
_ecore_xcb_event_handle_resize_request(ev);
else if (response == XCB_CIRCULATE_NOTIFY)
_ecore_xcb_event_handle_circulate_notify(ev);
else if (response == XCB_CIRCULATE_REQUEST)
_ecore_xcb_event_handle_circulate_request(ev);
else if (response == XCB_PROPERTY_NOTIFY)
_ecore_xcb_event_handle_property_notify(ev);
else if (response == XCB_SELECTION_CLEAR)
_ecore_xcb_event_handle_selection_clear(ev);
else if (response == XCB_SELECTION_REQUEST)
_ecore_xcb_event_handle_selection_request(ev);
else if (response == XCB_SELECTION_NOTIFY)
_ecore_xcb_event_handle_selection_notify(ev);
else if (response == XCB_COLORMAP_NOTIFY)
_ecore_xcb_event_handle_colormap_notify(ev);
else if (response == XCB_CLIENT_MESSAGE)
_ecore_xcb_event_handle_client_message(ev);
else if (response == XCB_MAPPING_NOTIFY)
_ecore_xcb_event_handle_mapping_notify(ev);
else if (response == 35) /* GenericEvent == 35 */
_ecore_xcb_event_handle_generic_event(ev);
#ifdef ECORE_XCB_DAMAGE
else if ((_ecore_xcb_event_damage >= 0) &&
(response == (_ecore_xcb_event_damage + XCB_DAMAGE_NOTIFY)))
_ecore_xcb_event_handle_damage_notify(ev);
#endif
#ifdef ECORE_XCB_RANDR
else if ((_ecore_xcb_event_randr >= 0) &&
(response ==
_ecore_xcb_event_randr + XCB_RANDR_SCREEN_CHANGE_NOTIFY))
_ecore_xcb_event_handle_randr_change(ev);
else if ((_ecore_xcb_event_randr >= 0) &&
(response == (_ecore_xcb_event_randr + XCB_RANDR_NOTIFY)))
_ecore_xcb_event_handle_randr_notify(ev);
#endif
#ifdef ECORE_XCB_SCREENSAVER
else if ((_ecore_xcb_event_screensaver >= 0) &&
(response ==
_ecore_xcb_event_screensaver + XCB_SCREENSAVER_NOTIFY))
_ecore_xcb_event_handle_screensaver_notify(ev);
#endif
#ifdef ECORE_XCB_XGESTURE
else if ((_ecore_xcb_event_gesture >= 0) &&
(response ==
_ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_FLICK))
_ecore_xcb_event_handle_gesture_notify_flick(ev);
else if ((_ecore_xcb_event_gesture >= 0) &&
(response ==
_ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_PAN))
_ecore_xcb_event_handle_gesture_notify_pan(ev);
else if ((_ecore_xcb_event_gesture >= 0) &&
(response ==
_ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_PINCH_ROTATION))
_ecore_xcb_event_handle_gesture_notify_pinchrotation(ev);
else if ((_ecore_xcb_event_gesture >= 0) &&
(response ==
_ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_TAP))
_ecore_xcb_event_handle_gesture_notify_tap(ev);
else if ((_ecore_xcb_event_gesture >= 0) &&
(response ==
_ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_TAP_N_HOLD))
_ecore_xcb_event_handle_gesture_notify_tapnhold(ev);
else if ((_ecore_xcb_event_gesture >= 0) &&
(response ==
_ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_HOLD))
_ecore_xcb_event_handle_gesture_notify_hold(ev);
else if ((_ecore_xcb_event_gesture >= 0) &&
(response ==
_ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_GROUP))
_ecore_xcb_event_handle_gesture_notify_group(ev);
#endif
#ifdef ECORE_XCB_SHAPE
else if ((_ecore_xcb_event_shape >= 0) &&
(response == (_ecore_xcb_event_shape + XCB_SHAPE_NOTIFY)))
_ecore_xcb_event_handle_shape_change(ev);
#endif
#ifdef ECORE_XCB_SYNC
else if ((_ecore_xcb_event_sync >= 0) &&
(response == (_ecore_xcb_event_sync + XCB_SYNC_COUNTER_NOTIFY)))
_ecore_xcb_event_handle_sync_counter(ev);
else if ((_ecore_xcb_event_sync >= 0) &&
(response == (_ecore_xcb_event_sync + XCB_SYNC_ALARM_NOTIFY)))
_ecore_xcb_event_handle_sync_alarm(ev);
#endif
#ifdef ECORE_XCB_XFIXES
else if ((_ecore_xcb_event_xfixes >= 0) &&
(response ==
_ecore_xcb_event_xfixes + XCB_XFIXES_SELECTION_NOTIFY))
_ecore_xcb_event_handle_xfixes_selection_notify(ev);
else if ((_ecore_xcb_event_xfixes >= 0) &&
(response == (_ecore_xcb_event_xfixes + XCB_XFIXES_CURSOR_NOTIFY)))
_ecore_xcb_event_handle_xfixes_cursor_notify(ev);
#endif
}
Ecore_X_Time
_ecore_xcb_events_last_time_get(void)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
return _ecore_xcb_event_last_time;
}
EAPI void
ecore_x_event_mask_set(Ecore_X_Window win,
Ecore_X_Event_Mask mask)
{
xcb_get_window_attributes_cookie_t cookie;
xcb_get_window_attributes_reply_t *reply;
uint32_t list;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
if (!reply) return;
list = (mask | reply->your_event_mask);
free(reply);
xcb_change_window_attributes(_ecore_xcb_conn, win,
XCB_CW_EVENT_MASK, &list);
// ecore_x_flush();
}
EAPI void
ecore_x_event_mask_unset(Ecore_X_Window win,
Ecore_X_Event_Mask mask)
{
xcb_get_window_attributes_cookie_t cookie;
xcb_get_window_attributes_reply_t *reply;
uint32_t list;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
CHECK_XCB_CONN;
if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
if (!reply) return;
list = (reply->your_event_mask & ~mask);
free(reply);
xcb_change_window_attributes(_ecore_xcb_conn, win,
XCB_CW_EVENT_MASK, &list);
// ecore_x_flush();
}
unsigned int
_ecore_xcb_events_modifiers_get(unsigned int state)
{
unsigned int modifiers = 0;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (state & ECORE_X_MODIFIER_SHIFT)
modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
if (state & ECORE_X_MODIFIER_CTRL)
modifiers |= ECORE_EVENT_MODIFIER_CTRL;
if (state & ECORE_X_MODIFIER_ALT)
modifiers |= ECORE_EVENT_MODIFIER_ALT;
if (state & ECORE_X_MODIFIER_WIN)
modifiers |= ECORE_EVENT_MODIFIER_WIN;
if (state & ECORE_X_MODIFIER_ALTGR)
modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
if (state & ECORE_X_LOCK_SCROLL)
modifiers |= ECORE_EVENT_LOCK_SCROLL;
if (state & ECORE_X_LOCK_CAPS)
modifiers |= ECORE_EVENT_LOCK_CAPS;
if (state & ECORE_X_LOCK_NUM)
modifiers |= ECORE_EVENT_LOCK_NUM;
if (state & ECORE_X_LOCK_SHIFT)
modifiers |= ECORE_EVENT_LOCK_SHIFT;
return modifiers;
}
/* local functions */
static void
_ecore_xcb_event_handle_any_event(xcb_generic_event_t *event)
{
xcb_generic_event_t *ev;
// LOGFN(__FILE__, __LINE__, __FUNCTION__);
ev = malloc(sizeof(xcb_generic_event_t));
if (!ev) return;
memcpy(ev, event, sizeof(xcb_generic_event_t));
ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
}
static void
_ecore_xcb_event_handle_key_press(xcb_generic_event_t *event)
{
_ecore_xcb_event_key_press(event);
}
static void
_ecore_xcb_event_handle_key_release(xcb_generic_event_t *event)
{
_ecore_xcb_event_key_release(event);
}
static void
_ecore_xcb_event_handle_button_press(xcb_generic_event_t *event)
{
xcb_button_press_event_t *ev;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_button_press_event_t *)event;
if ((ev->detail > 3) && (ev->detail < 8))
{
Ecore_Event_Mouse_Wheel *e;
if (!(e = malloc(sizeof(Ecore_Event_Mouse_Wheel)))) return;
e->timestamp = ev->time;
e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
switch (ev->detail)
{
case 4:
e->direction = 0;
e->z = -1;
break;
case 5:
e->direction = 0;
e->z = 1;
break;
case 6:
e->direction = 1;
e->z = -1;
break;
case 7:
e->direction = 1;
e->z = 1;
break;
default:
e->direction = 0;
e->z = 0;
break;
}
e->x = ev->event_x;
e->y = ev->event_y;
e->root.x = ev->root_x;
e->root.y = ev->root_y;
if (ev->child)
e->window = ev->child;
else
e->window = ev->event;
e->event_window = ev->event;
e->same_screen = ev->same_screen;
e->root_window = ev->root;
_ecore_xcb_event_last_time = e->timestamp;
_ecore_xcb_event_last_window = e->window;
_ecore_xcb_event_last_root_x = e->root.x;
_ecore_xcb_event_last_root_y = e->root.y;
ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
_ecore_xcb_window_grab_allow_events(ev->event, ev->child,
ECORE_EVENT_MOUSE_WHEEL,
e, ev->time);
}
else
{
Ecore_Event_Mouse_Button *e;
unsigned int child_win = 0;
child_win = (ev->child ? ev->child : ev->event);
_ecore_xcb_event_mouse_move(ev->time, ev->state,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y,
ev->event, child_win,
ev->root, ev->same_screen,
0, 1, 1, 1.0, 0.0,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y);
e = _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
ev->time,
ev->state, ev->detail,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y, ev->event,
child_win,
ev->root, ev->same_screen,
0, 1, 1, 1.0, 0.0,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y);
if (e)
_ecore_xcb_window_grab_allow_events(ev->event, ev->child,
ECORE_EVENT_MOUSE_BUTTON_DOWN,
e, ev->time);
}
}
static void
_ecore_xcb_event_handle_button_release(xcb_generic_event_t *event)
{
xcb_button_release_event_t *ev;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_button_release_event_t *)event;
if ((ev->detail <= 3) || (ev->detail > 7))
{
_ecore_xcb_event_mouse_move(ev->time, ev->state,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y,
ev->event,
(ev->child ? ev->child : ev->event),
ev->root, ev->same_screen,
0, 1, 1, 1.0, 0.0,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y);
_ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP, ev->time,
ev->state, ev->detail,
ev->event_x, ev->event_y, ev->root_x,
ev->root_y, ev->event,
(ev->child ? ev->child : ev->event),
ev->root, ev->same_screen,
0, 1, 1, 1.0, 0.0,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y);
}
}
static void
_ecore_xcb_event_handle_motion_notify(xcb_generic_event_t *event)
{
xcb_motion_notify_event_t *ev;
ev = (xcb_motion_notify_event_t *)event;
/* if (_ecore_xcb_event_last_mouse_move_event) */
/* { */
/* ecore_event_del(_ecore_xcb_event_last_mouse_move_event); */
/* _ecore_xcb_event_last_mouse_move = EINA_FALSE; */
/* _ecore_xcb_event_last_mouse_move_event = NULL; */
/* } */
_ecore_xcb_event_mouse_move(ev->time, ev->state,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y,
ev->event,
(ev->child ? ev->child : ev->event),
ev->root, ev->same_screen,
0, 1, 1, 1.0, 0.0,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y);
_ecore_xcb_event_last_mouse_move = EINA_TRUE;
_ecore_xcb_dnd_drag(ev->root, ev->root_x, ev->root_y);
}
static void
_ecore_xcb_event_handle_enter_notify(xcb_generic_event_t *event)
{
xcb_enter_notify_event_t *ev;
Ecore_X_Event_Mouse_In *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_enter_notify_event_t *)event;
_ecore_xcb_event_mouse_move(ev->time, ev->state,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y,
ev->event,
(ev->child ? ev->child : ev->event),
ev->root, ev->same_screen_focus,
0, 1, 1, 1.0, 0.0,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y);
if (!(e = calloc(1, sizeof(Ecore_X_Event_Mouse_In)))) return;
e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
e->x = ev->event_x;
e->y = ev->event_y;
e->root.x = ev->root_x;
e->root.y = ev->root_y;
if (ev->child)
e->win = ev->child;
else
e->win = ev->event;
e->event_win = ev->event;
e->same_screen = ev->same_screen_focus;
e->root_win = ev->root;
e->mode = _ecore_xcb_event_mode_get(ev->mode);
e->detail = _ecore_xcb_event_detail_get(ev->detail);
e->time = ev->time;
_ecore_xcb_event_last_time = e->time;
ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_leave_notify(xcb_generic_event_t *event)
{
xcb_leave_notify_event_t *ev;
Ecore_X_Event_Mouse_Out *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_enter_notify_event_t *)event;
_ecore_xcb_event_mouse_move(ev->time, ev->state,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y,
ev->event,
(ev->child ? ev->child : ev->event),
ev->root, ev->same_screen_focus,
0, 1, 1, 1.0, 0.0,
ev->event_x, ev->event_y,
ev->root_x, ev->root_y);
if (!(e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out)))) return;
e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
e->x = ev->event_x;
e->y = ev->event_y;
e->root.x = ev->root_x;
e->root.y = ev->root_y;
if (ev->child)
e->win = ev->child;
else
e->win = ev->event;
e->event_win = ev->event;
e->same_screen = ev->same_screen_focus;
e->root_win = ev->root;
e->mode = _ecore_xcb_event_mode_get(ev->mode);
e->detail = _ecore_xcb_event_detail_get(ev->detail);
e->time = ev->time;
_ecore_xcb_event_last_time = e->time;
_ecore_xcb_event_last_window = e->win;
_ecore_xcb_event_last_root_x = e->root.x;
_ecore_xcb_event_last_root_y = e->root.y;
ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_keymap_notify(xcb_generic_event_t *event EINA_UNUSED)
{
// LOGFN(__FILE__, __LINE__, __FUNCTION__);
// FIXME: handle this event type
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
}
static void
_ecore_xcb_event_handle_focus_in(xcb_generic_event_t *event)
{
xcb_focus_in_event_t *ev;
Ecore_X_Event_Window_Focus_In *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_focus_in_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In)))) return;
e->win = ev->event;
e->mode = _ecore_xcb_event_mode_get(ev->mode);
e->detail = _ecore_xcb_event_detail_get(ev->detail);
e->time = _ecore_xcb_event_last_time;
_ecore_xcb_event_last_time = e->time;
ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_focus_out(xcb_generic_event_t *event)
{
xcb_focus_out_event_t *ev;
Ecore_X_Event_Window_Focus_Out *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_focus_out_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out)))) return;
e->win = ev->event;
e->mode = _ecore_xcb_event_mode_get(ev->mode);
e->detail = _ecore_xcb_event_detail_get(ev->detail);
e->time = _ecore_xcb_event_last_time;
_ecore_xcb_event_last_time = e->time;
ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_expose(xcb_generic_event_t *event)
{
xcb_expose_event_t *ev;
Ecore_X_Event_Window_Damage *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_expose_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Damage)))) return;
e->win = ev->window;
e->time = _ecore_xcb_event_last_time;
e->x = ev->x;
e->y = ev->y;
e->w = ev->width;
e->h = ev->height;
e->count = ev->count;
ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_graphics_exposure(xcb_generic_event_t *event)
{
xcb_graphics_exposure_event_t *ev;
Ecore_X_Event_Window_Damage *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_graphics_exposure_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Damage)))) return;
e->win = ev->drawable;
e->x = ev->x;
e->y = ev->y;
e->w = ev->width;
e->h = ev->height;
e->count = ev->count;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_visibility_notify(xcb_generic_event_t *event)
{
xcb_visibility_notify_event_t *ev;
Ecore_X_Event_Window_Visibility_Change *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_visibility_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change))))
return;
e->win = ev->window;
e->time = _ecore_xcb_event_last_time;
if (ev->state == XCB_VISIBILITY_FULLY_OBSCURED)
e->fully_obscured = 1;
else
e->fully_obscured = 0;
ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_create_notify(xcb_generic_event_t *event)
{
xcb_create_notify_event_t *ev;
Ecore_X_Event_Window_Create *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_create_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Create)))) return;
e->win = ev->window;
e->parent = ev->parent;
if (ev->override_redirect)
e->override = 1;
else
e->override = 0;
e->x = ev->x;
e->y = ev->y;
e->w = ev->width;
e->h = ev->height;
e->border = ev->border_width;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_destroy_notify(xcb_generic_event_t *event)
{
xcb_destroy_notify_event_t *ev;
Ecore_X_Event_Window_Destroy *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_destroy_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy)))) return;
e->win = ev->window;
e->event_win = ev->event;
if (e->win == _ecore_xcb_event_last_window)
_ecore_xcb_event_last_window = 0;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_map_notify(xcb_generic_event_t *event)
{
xcb_map_notify_event_t *ev;
Ecore_X_Event_Window_Show *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_map_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Show)))) return;
e->win = ev->window;
e->event_win = ev->event;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_unmap_notify(xcb_generic_event_t *event)
{
xcb_unmap_notify_event_t *ev;
Ecore_X_Event_Window_Hide *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_unmap_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Hide)))) return;
e->win = ev->window;
e->event_win = ev->event;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_map_request(xcb_generic_event_t *event)
{
xcb_map_request_event_t *ev;
Ecore_X_Event_Window_Show_Request *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_map_request_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request)))) return;
e->win = ev->window;
e->parent = ev->parent;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_reparent_notify(xcb_generic_event_t *event)
{
xcb_reparent_notify_event_t *ev;
Ecore_X_Event_Window_Reparent *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_reparent_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent)))) return;
e->win = ev->window;
e->event_win = ev->event;
e->parent = ev->parent;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_configure_notify(xcb_generic_event_t *event)
{
xcb_configure_notify_event_t *ev;
Ecore_X_Event_Window_Configure *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_configure_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Configure)))) return;
e->win = ev->window;
e->event_win = ev->event;
e->abovewin = ev->above_sibling;
e->x = ev->x;
e->y = ev->y;
e->w = ev->width;
e->h = ev->height;
e->border = ev->border_width;
e->override = ev->override_redirect;
/* send_event is bit 7 (0x80) of response_type */
e->from_wm = ((ev->response_type & 0x80) ? 1 : 0);
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_configure_request(xcb_generic_event_t *event)
{
xcb_configure_request_event_t *ev;
Ecore_X_Event_Window_Configure_Request *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_configure_request_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request))))
return;
e->win = ev->window;
e->parent_win = ev->parent;
e->abovewin = ev->sibling;
e->x = ev->x;
e->y = ev->y;
e->w = ev->width;
e->h = ev->height;
e->border = ev->border_width;
e->value_mask = ev->value_mask;
switch (ev->stack_mode)
{
case XCB_STACK_MODE_ABOVE:
e->detail = ECORE_X_WINDOW_STACK_ABOVE;
break;
case XCB_STACK_MODE_BELOW:
e->detail = ECORE_X_WINDOW_STACK_BELOW;
break;
case XCB_STACK_MODE_TOP_IF:
e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
break;
case XCB_STACK_MODE_BOTTOM_IF:
e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
break;
case XCB_STACK_MODE_OPPOSITE:
e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
break;
}
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_gravity_notify(xcb_generic_event_t *event EINA_UNUSED)
{
/*
xcb_gravity_notify_event_t *ev;
Ecore_X_Event_Window_Gravity *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_gravity_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Gravity)))) return;
e->win = ev->window;
e->event_win = ev->event;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_GRAVITY, e, NULL, NULL);
*/
}
static void
_ecore_xcb_event_handle_resize_request(xcb_generic_event_t *event)
{
xcb_resize_request_event_t *ev;
Ecore_X_Event_Window_Resize_Request *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_resize_request_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request)))) return;
e->win = ev->window;
e->w = ev->width;
e->h = ev->height;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_circulate_notify(xcb_generic_event_t *event)
{
xcb_circulate_notify_event_t *ev;
Ecore_X_Event_Window_Stack *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_circulate_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Stack)))) return;
e->win = ev->window;
e->event_win = ev->event;
if (ev->place == XCB_PLACE_ON_TOP)
e->detail = ECORE_X_WINDOW_STACK_ABOVE;
else
e->detail = ECORE_X_WINDOW_STACK_BELOW;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_circulate_request(xcb_generic_event_t *event)
{
xcb_circulate_request_event_t *ev;
Ecore_X_Event_Window_Stack_Request *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_circulate_request_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request)))) return;
e->win = ev->window;
e->parent = ev->event;
if (ev->place == XCB_PLACE_ON_TOP)
e->detail = ECORE_X_WINDOW_STACK_ABOVE;
else
e->detail = ECORE_X_WINDOW_STACK_BELOW;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_property_notify(xcb_generic_event_t *event)
{
xcb_property_notify_event_t *ev;
Ecore_X_Event_Window_Property *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_property_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Property)))) return;
e->win = ev->window;
e->atom = ev->atom;
e->time = ev->time;
_ecore_xcb_event_last_time = e->time;
ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_selection_clear(xcb_generic_event_t *event)
{
xcb_selection_clear_event_t *ev;
Ecore_X_Event_Selection_Clear *e;
Ecore_X_Atom sel;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_selection_clear_event_t *)event;
if (!(e = malloc(sizeof(Ecore_X_Event_Selection_Clear)))) return;
e->win = ev->owner;
e->atom = sel = ev->selection;
if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
e->selection = ECORE_X_SELECTION_PRIMARY;
else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
e->selection = ECORE_X_SELECTION_SECONDARY;
else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
e->selection = ECORE_X_SELECTION_CLIPBOARD;
else
e->selection = ECORE_X_SELECTION_OTHER;
e->time = ev->time;
ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_selection_request(xcb_generic_event_t *event)
{
xcb_selection_request_event_t *ev;
Ecore_X_Event_Selection_Request *e;
Ecore_X_Selection_Intern *sd;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_selection_request_event_t *)event;
if (!(e = malloc(sizeof(Ecore_X_Event_Selection_Request)))) return;
e->owner = ev->owner;
e->requestor = ev->requestor;
e->selection = ev->selection;
e->target = ev->target;
e->property = ev->property;
e->time = ev->time;
ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL);
if ((sd = _ecore_xcb_selection_get(ev->selection)) &&
(sd->win == ev->owner))
{
Ecore_X_Selection_Intern *si;
si = _ecore_xcb_selection_get(ev->selection);
if (si->data)
{
Ecore_X_Atom property = XCB_NONE, type;
void *data = NULL;
int len = 0, typesize = 0;
type = ev->target;
typesize = 8;
len = sd->length;
if (!ecore_x_selection_convert(ev->selection, ev->target,
&data, &len, &type, &typesize))
property = XCB_NONE;
else if (data)
{
ecore_x_window_prop_property_set(ev->requestor, ev->property,
type, typesize, data, len);
property = ev->property;
free(data);
}
ecore_x_selection_notify_send(ev->requestor, ev->selection,
ev->target, property, ev->time);
}
}
}
static void
_ecore_xcb_event_handle_selection_notify(xcb_generic_event_t *event)
{
xcb_selection_notify_event_t *ev;
Ecore_X_Event_Selection_Notify *e;
unsigned char *data = NULL;
Ecore_X_Atom selection;
int num = 0, format = 0;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_selection_notify_event_t *)event;
selection = ev->selection;
if (ev->target == ECORE_X_ATOM_SELECTION_TARGETS)
{
format =
ecore_x_window_prop_property_get(ev->requestor, ev->property,
XCB_ATOM_ATOM, 32, &data, &num);
if (!format)
{
/* fallback if targets handling is not working and try get the
* selection directly */
xcb_convert_selection(_ecore_xcb_conn, ev->requestor,
selection, selection,
ECORE_X_ATOM_UTF8_STRING, XCB_CURRENT_TIME);
return;
}
}
else
format = ecore_x_window_prop_property_get(ev->requestor, ev->property,
XCB_GET_PROPERTY_TYPE_ANY, 8,
&data, &num);
e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
if (!e) return;
e->win = ev->requestor;
e->time = ev->time;
e->atom = selection;
e->target = _ecore_xcb_selection_target_get(ev->target);
if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
e->selection = ECORE_X_SELECTION_PRIMARY;
else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
e->selection = ECORE_X_SELECTION_SECONDARY;
else if (selection == ECORE_X_ATOM_SELECTION_XDND)
e->selection = ECORE_X_SELECTION_XDND;
else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
e->selection = ECORE_X_SELECTION_CLIPBOARD;
else
e->selection = ECORE_X_SELECTION_OTHER;
e->data = _ecore_xcb_selection_parse(e->target, data, num, format);
ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
_ecore_xcb_event_selection_notify_free, NULL);
}
static void
_ecore_xcb_event_handle_colormap_notify(xcb_generic_event_t *event)
{
xcb_colormap_notify_event_t *ev;
Ecore_X_Event_Window_Colormap *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_colormap_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Colormap)))) return;
e->win = ev->window;
e->cmap = ev->colormap;
if (ev->state == XCB_COLORMAP_STATE_INSTALLED)
e->installed = 1;
else
e->installed = 0;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_client_message(xcb_generic_event_t *event)
{
xcb_client_message_event_t *ev;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_client_message_event_t *)event;
/* Special client message event handling here. need to put LOTS of if */
/* checks here and generate synthetic events per special message known */
/* otherwise generate generic client message event. this would handle*/
/* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
if ((ev->type == ECORE_X_ATOM_WM_PROTOCOLS) && (ev->format == 32) &&
(ev->data.data32[0] == ECORE_X_ATOM_WM_DELETE_WINDOW))
{
Ecore_X_Event_Window_Delete_Request *e;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request))))
return;
e->win = ev->window;
e->time = _ecore_xcb_event_last_time;
ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
}
else if ((ev->type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
(ev->format == 32) && (ev->data.data32[2] < 9))
{
Ecore_X_Event_Window_Move_Resize_Request *e;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request))))
return;
e->win = ev->window;
e->x = ev->data.data32[0];
e->y = ev->data.data32[1];
e->direction = ev->data.data32[2];
e->button = ev->data.data32[3];
e->source = ev->data.data32[4];
ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
}
else if (ev->type == ECORE_X_ATOM_XDND_ENTER)
{
Ecore_X_Event_Xdnd_Enter *e;
Ecore_X_DND_Target *target;
DBG("Got Xdnd Enter Event");
if (!(e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter)))) return;
target = _ecore_xcb_dnd_target_get();
target->state = ECORE_X_DND_TARGET_ENTERED;
target->source = ev->data.data32[0];
target->win = ev->window;
target->version = (int)(ev->data.data32[1] >> 24);
if (target->version > ECORE_X_DND_VERSION)
{
WRN("DND: Requested version %d but we only support up to %d",
target->version, ECORE_X_DND_VERSION);
free(e);
return;
}
if (ev->data.data32[1] & 0x1UL)
{
unsigned char *data;
Ecore_X_Atom *types;
int num_ret = 0;
if (!ecore_x_window_prop_property_get(target->source,
ECORE_X_ATOM_XDND_TYPE_LIST,
ECORE_X_ATOM_ATOM, 32,
&data, &num_ret))
{
WRN("DND: Could not fetch data type list from source window");
free(e);
return;
}
types = (Ecore_X_Atom *)data;
e->types = calloc(num_ret, sizeof(char *));
if (e->types)
{
int i = 0;
for (i = 0; i < num_ret; i++)
e->types[i] = ecore_x_atom_name_get(types[i]);
}
e->num_types = num_ret;
}
else
{
int i = 0;
e->types = calloc(3, sizeof(char *));
if (e->types)
{
while ((i < 3) && (ev->data.data32[i + 2]))
{
e->types[i] =
ecore_x_atom_name_get(ev->data.data32[i + 2]);
i++;
}
}
e->num_types = i;
}
e->win = target->win;
e->source = target->source;
ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
_ecore_xcb_event_xdnd_enter_free, NULL);
}
else if (ev->type == ECORE_X_ATOM_XDND_POSITION)
{
Ecore_X_Event_Xdnd_Position *e;
Ecore_X_DND_Target *target;
DBG("Got Xdnd Position Event");
target = _ecore_xcb_dnd_target_get();
if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
(target->win != ev->window)) return;
target->pos.x = ev->data.data32[2] >> 16;
target->pos.y = ev->data.data32[2] & 0xFFFFUL;
target->action = ev->data.data32[4];
target->time = (target->version >= 1) ?
(Ecore_X_Time)ev->data.data32[3] : XCB_CURRENT_TIME;
e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
if (!e) return;
e->win = target->win;
e->source = target->source;
e->position.x = target->pos.x;
e->position.y = target->pos.y;
e->action = target->action;
ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
}
else if (ev->type == ECORE_X_ATOM_XDND_STATUS)
{
Ecore_X_Event_Xdnd_Status *e;
Ecore_X_DND_Source *source;
DBG("Got Xdnd Status Event");
source = _ecore_xcb_dnd_source_get();
if ((source->win != ev->window) ||
(source->dest != (Ecore_X_Window)ev->data.data32[0]))
return;
source->await_status = 0;
source->will_accept = ev->data.data32[1] & 0x1UL;
source->suppress = (ev->data.data32[1] & 0x2UL) ? 0 : 1;
source->rectangle.x = ev->data.data32[2] >> 16;
source->rectangle.y = ev->data.data32[2] & 0xFFFFUL;
source->rectangle.width = ev->data.data32[3] >> 16;
source->rectangle.height = ev->data.data32[3] & 0xFFFFUL;
source->accepted_action = ev->data.data32[4];
e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
if (!e) return;
e->win = source->win;
e->target = source->dest;
e->will_accept = source->will_accept;
e->rectangle.x = source->rectangle.x;
e->rectangle.y = source->rectangle.y;
e->rectangle.width = source->rectangle.width;
e->rectangle.height = source->rectangle.height;
e->action = source->accepted_action;
ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
}
else if (ev->type == ECORE_X_ATOM_XDND_LEAVE)
{
Ecore_X_Event_Xdnd_Leave *e;
Ecore_X_DND_Target *target;
DBG("Got Xdnd Leave Event");
target = _ecore_xcb_dnd_target_get();
if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
(target->win != ev->window))
return;
target->state = ECORE_X_DND_TARGET_IDLE;
e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
if (!e) return;
e->win = ev->window;
e->source = (Ecore_X_Window)ev->data.data32[0];
ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
}
else if (ev->type == ECORE_X_ATOM_XDND_DROP)
{
Ecore_X_Event_Xdnd_Drop *e;
Ecore_X_DND_Target *target;
DBG("Got Xdnd Drop Event");
target = _ecore_xcb_dnd_target_get();
if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
(target->win != ev->window))
return;
target->time = (target->version >= 1) ?
(Ecore_X_Time)ev->data.data32[2] : _ecore_xcb_event_last_time;
e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
if (!e) return;
e->win = target->win;
e->source = target->source;
e->action = target->action;
e->position.x = target->pos.x;
e->position.y = target->pos.y;
ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
}
else if (ev->type == ECORE_X_ATOM_XDND_FINISHED)
{
Ecore_X_Event_Xdnd_Finished *e;
Ecore_X_DND_Source *source;
Eina_Bool completed = EINA_TRUE;
DBG("Got Xdnd Finished Event");
source = _ecore_xcb_dnd_source_get();
if ((source->win != ev->window) ||
(source->dest != (Ecore_X_Window)ev->data.data32[0]))
return;
if ((source->version < 5) || (ev->data.data32[1] & 0x1UL))
{
ecore_x_selection_xdnd_clear();
source->state = ECORE_X_DND_SOURCE_IDLE;
}
else if (source->version >= 5)
{
completed = EINA_FALSE;
source->state = ECORE_X_DND_SOURCE_CONVERTING;
/* FIXME: Probably need to add a timer to switch back to idle
* and discard the selection data */
}
if (!(e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished))))
return;
e->win = source->win;
e->target = source->dest;
e->completed = completed;
if (source->version >= 5)
{
source->accepted_action = ev->data.data32[2];
e->action = source->accepted_action;
}
else
{
source->accepted_action = 0;
e->action = source->action;
}
ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
}
else if (ev->type == ECORE_X_ATOM_NET_WM_STATE)
{
Ecore_X_Event_Window_State_Request *e;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request))))
return;
e->win = ev->window;
if (ev->data.data32[0] == 0)
e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
else if (ev->data.data32[0] == 1)
e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
else if (ev->data.data32[0] == 2)
e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
else
{
free(e);
return;
}
e->state[0] = _ecore_xcb_netwm_window_state_get(ev->data.data32[1]);
if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
{
/* FIXME */
}
e->state[1] = _ecore_xcb_netwm_window_state_get(ev->data.data32[2]);
if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
{
/* FIXME */
}
e->source = ev->data.data32[3];
ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
}
else if ((ev->type == ECORE_X_ATOM_WM_CHANGE_STATE) && (ev->format == 32) &&
(ev->data.data32[0] == XCB_ICCCM_WM_STATE_ICONIC))
{
Ecore_X_Event_Window_State_Request *e;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request))))
return;
e->win = ev->window;
e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
}
else if ((ev->type == ECORE_X_ATOM_NET_WM_DESKTOP) && (ev->format == 32))
{
Ecore_X_Event_Desktop_Change *e;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change))))
return;
e->win = ev->window;
e->desk = ev->data.data32[0];
e->source = ev->data.data32[1];
ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
}
else if (ev->type == ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS)
{
Ecore_X_Event_Frame_Extents_Request *e;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request))))
return;
e->win = ev->window;
ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
}
else if ((ev->type == ECORE_X_ATOM_WM_PROTOCOLS) &&
((Ecore_X_Atom)ev->data.data32[0] == ECORE_X_ATOM_NET_WM_PING) &&
(ev->format == 32))
{
Ecore_X_Event_Ping *e;
Ecore_X_Window root = 0;
int count = 0;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Ping)))) return;
e->win = ev->window;
e->time = ev->data.data32[1];
e->event_win = ev->data.data32[2];
ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
CHECK_XCB_CONN;
count = xcb_setup_roots_length(xcb_get_setup(_ecore_xcb_conn));
if (count > 1)
root = ecore_x_window_root_get(e->win);
else
root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
if (ev->window != root)
{
ev->window = root;
xcb_send_event(_ecore_xcb_conn, 0, root,
(XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY),
(const char *)&ev);
// ecore_x_flush();
}
}
else if ((ev->type == ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
(ev->format == 8))
{
_ecore_xcb_netwm_startup_info_begin(ev->window, ev->data.data8[0]);
}
else if ((ev->type == ECORE_X_ATOM_NET_STARTUP_INFO) && (ev->format == 8))
{
_ecore_xcb_netwm_startup_info(ev->window, ev->data.data8[0]);
}
else if ((ev->type == 27777) && (ev->data.data32[0] == 0x7162534) &&
(ev->format == 32)) // && (ev->window = _private_window))
{
if (ev->data.data32[1] == 0x10000001)
_ecore_xcb_window_button_grab_remove(ev->data.data32[2]);
else if (ev->data.data32[1] == 0x10000002)
_ecore_xcb_window_key_grab_remove(ev->data.data32[2]);
}
else
{
Ecore_X_Event_Client_Message *e;
int i = 0;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Client_Message))))
return;
e->win = ev->window;
e->message_type = ev->type;
e->format = ev->format;
for (i = 0; i < 5; i++)
e->data.l[i] = ev->data.data32[i];
ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
}
}
static void
_ecore_xcb_event_handle_mapping_notify(xcb_generic_event_t *event)
{
xcb_mapping_notify_event_t *ev;
Ecore_X_Event_Mapping_Change *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_mapping_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Mapping_Change)))) return;
_ecore_xcb_keymap_refresh(ev);
_ecore_xcb_modifiers_get();
switch (ev->request)
{
case XCB_MAPPING_MODIFIER:
e->type = ECORE_X_MAPPING_MODIFIER;
break;
case XCB_MAPPING_KEYBOARD:
e->type = ECORE_X_MAPPING_KEYBOARD;
break;
case XCB_MAPPING_POINTER:
default:
e->type = ECORE_X_MAPPING_MOUSE;
break;
}
e->keycode = ev->first_keycode;
e->num = ev->count;
ecore_event_add(ECORE_X_EVENT_MAPPING_CHANGE, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_damage_notify(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_DAMAGE
xcb_damage_notify_event_t *ev;
Ecore_X_Event_Damage *e;
#endif
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
#ifdef ECORE_XCB_DAMAGE
ev = (xcb_damage_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Damage)))) return;
e->level = ev->level;
e->drawable = ev->drawable;
e->damage = ev->damage;
e->time = ev->timestamp;
e->area.x = ev->area.x;
e->area.y = ev->area.y;
e->area.width = ev->area.width;
e->area.height = ev->area.height;
e->geometry.x = ev->geometry.x;
e->geometry.y = ev->geometry.y;
e->geometry.width = ev->geometry.width;
e->geometry.height = ev->geometry.height;
ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
#endif
}
static void
_ecore_xcb_event_handle_randr_change(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_RANDR
xcb_randr_screen_change_notify_event_t *ev;
Ecore_X_Event_Screen_Change *e;
#endif
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
#ifdef ECORE_XCB_RANDR
ev = (xcb_randr_screen_change_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Screen_Change)))) return;
e->win = ev->request_window;
e->root = ev->root;
e->size.width = ev->width;
e->size.height = ev->height;
e->time = ev->timestamp;
e->config_time = ev->config_timestamp;
e->size.width_mm = ev->mwidth;
e->size.height_mm = ev->mheight;
e->orientation = ev->rotation;
e->subpixel_order = ev->subpixel_order;
ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
#endif
}
static void
_ecore_xcb_event_handle_randr_notify(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_RANDR
xcb_randr_notify_event_t *ev;
#endif
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
#ifdef ECORE_XCB_RANDR
ev = (xcb_randr_notify_event_t *)event;
switch (ev->subCode)
{
case XCB_RANDR_NOTIFY_CRTC_CHANGE:
_ecore_xcb_event_handle_randr_crtc_change(event);
break;
case XCB_RANDR_NOTIFY_OUTPUT_CHANGE:
_ecore_xcb_event_handle_randr_output_change(event);
break;
case XCB_RANDR_NOTIFY_OUTPUT_PROPERTY:
_ecore_xcb_event_handle_randr_output_property_change(event);
break;
default:
break;
}
#endif
}
static void
_ecore_xcb_event_handle_randr_crtc_change(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_RANDR
xcb_randr_notify_event_t *ev;
Ecore_X_Event_Randr_Crtc_Change *e;
#endif
#ifdef ECORE_XCB_RANDR
ev = (xcb_randr_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change))))
return;
e->win = ev->u.cc.window;
e->crtc = ev->u.cc.crtc;
e->mode = ev->u.cc.mode;
e->orientation = ev->u.cc.rotation;
e->geo.x = ev->u.cc.x;
e->geo.y = ev->u.cc.y;
e->geo.w = ev->u.cc.width;
e->geo.h = ev->u.cc.height;
ecore_event_add(ECORE_X_EVENT_RANDR_CRTC_CHANGE, e, NULL, NULL);
#endif
}
static void
_ecore_xcb_event_handle_randr_output_change(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_RANDR
xcb_randr_notify_event_t *ev;
Ecore_X_Event_Randr_Output_Change *e;
#endif
#ifdef ECORE_XCB_RANDR
ev = (xcb_randr_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Change))))
return;
e->win = ev->u.oc.window;
e->output = ev->u.oc.output;
e->crtc = ev->u.oc.crtc;
e->mode = ev->u.oc.mode;
e->orientation = ev->u.oc.rotation;
e->connection = ev->u.oc.connection;
e->subpixel_order = ev->u.oc.subpixel_order;
ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_CHANGE, e, NULL, NULL);
#endif
}
static void
_ecore_xcb_event_handle_randr_output_property_change(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_RANDR
xcb_randr_notify_event_t *ev;
Ecore_X_Event_Randr_Output_Property_Notify *e;
#endif
#ifdef ECORE_XCB_RANDR
ev = (xcb_randr_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Property_Notify))))
return;
e->win = ev->u.op.window;
e->output = ev->u.op.output;
e->property = ev->u.op.atom;
e->time = ev->u.op.timestamp;
if (ev->u.op.status == XCB_PROPERTY_NEW_VALUE)
e->state = ECORE_X_RANDR_PROPERTY_CHANGE_ADD;
else
e->state = ECORE_X_RANDR_PROPERTY_CHANGE_DEL;
ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, e, NULL, NULL);
#endif
}
static void
_ecore_xcb_event_handle_screensaver_notify(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_SCREENSAVER
xcb_screensaver_notify_event_t *ev;
Ecore_X_Event_Screensaver_Notify *e;
#endif
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
#ifdef ECORE_XCB_SCREENSAVER
ev = (xcb_screensaver_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify)))) return;
e->win = ev->window;
e->on = EINA_FALSE;
if ((ev->state == XCB_SCREENSAVER_STATE_ON) ||
(ev->state == XCB_SCREENSAVER_STATE_CYCLE)) e->on = EINA_TRUE;
e->time = ev->time;
ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
#endif
}
#ifdef ECORE_XCB_XGESTURE
static void
_ecore_xcb_event_handle_gesture_notify_flick(xcb_generic_event_t *event)
{
xcb_gesture_notify_flick_event_t *ev;
Ecore_X_Event_Gesture_Notify_Flick *e;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
ev = (xcb_gesture_notify_flick_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Flick)))) return;
e->win = ev->window;
e->time = ev->time;
e->subtype = ev->kind;
e->num_fingers = ev->num_finger;
e->distance = ev->distance;
e->duration = ev->duration;
e->direction = ev->direction;
e->angle = XFixedToDouble(ev->angle);
ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_FLICK, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_gesture_notify_pan(xcb_generic_event_t *event)
{
xcb_gesture_notify_pan_event_t *ev;
Ecore_X_Event_Gesture_Notify_Pan *e;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
ev = (xcb_gesture_notify_pan_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Pan)))) return;
e->win = ev->window;
e->time = ev->time;
e->subtype = ev->kind;
e->num_fingers = ev->num_finger;
e->dx = ev->dx;
e->dy = ev->dy;
e->distance = ev->distance;
e->duration = ev->duration;
e->direction = ev->direction;
ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PAN, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_gesture_notify_pinchrotation(xcb_generic_event_t *event)
{
xcb_gesture_notify_pinch_rotation_event_t *ev;
Ecore_X_Event_Gesture_Notify_PinchRotation *e;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
ev = (xcb_gesture_notify_pinch_rotation_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_PinchRotation)))) return;
e->win = ev->window;
e->time = ev->time;
e->subtype = ev->kind;
e->num_fingers = ev->num_finger;
e->distance = ev->distance;
e->cx = ev->cx;
e->cy = ev->cy;
e->zoom = XFixedToDouble(ev->zoom);
e->angle = XFixedToDouble(ev->angle);
ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_gesture_notify_tap(xcb_generic_event_t *event)
{
xcb_gesture_notify_tap_event_t *ev;
Ecore_X_Event_Gesture_Notify_Tap *e;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
ev = (xcb_gesture_notify_tap_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Tap)))) return;
e->win = ev->window;
e->time = ev->time;
e->subtype = ev->kind;
e->num_fingers = ev->num_finger;
e->cx = ev->cx;
e->cy = ev->cy;
e->tap_repeat = ev->tap_repeat;
e->interval = ev->interval;
ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAP, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_gesture_notify_tapnhold(xcb_generic_event_t *event)
{
xcb_gesture_notify_tap_n_hold_event_t *ev;
Ecore_X_Event_Gesture_Notify_TapNHold *e;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
ev = (xcb_gesture_notify_tap_n_hold_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_TapNHold)))) return;
e->win = ev->window;
e->time = ev->time;
e->subtype = ev->kind;
e->num_fingers = ev->num_finger;
e->cx = ev->cx;
e->cy = ev->cy;
e->interval = ev->interval;
e->hold_time = ev->holdtime;
ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_gesture_notify_hold(xcb_generic_event_t *event)
{
xcb_gesture_notify_hold_event_t *ev;
Ecore_X_Event_Gesture_Notify_Hold *e;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
ev = (xcb_gesture_notify_hold_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Hold)))) return;
e->win = ev->window;
e->time = ev->time;
e->subtype = ev->kind;
e->num_fingers = ev->num_finger;
e->cx = ev->cx;
e->cy = ev->cy;
e->hold_time = ev->holdtime;
ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_HOLD, e, NULL, NULL);
}
static void
_ecore_xcb_event_handle_gesture_notify_group(xcb_generic_event_t *event)
{
xcb_gesture_notify_group_event_t *ev;
Ecore_X_Event_Gesture_Notify_Group *e;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
ev = (xcb_gesture_notify_group_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Group)))) return;
e->win = ev->window;
e->time = ev->time;
e->subtype = ev->kind;
e->num_groups = ev->num_group;
e->group_id = ev->groupid;
ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_GROUP, e, NULL, NULL);
}
#endif
#ifdef ECORE_XCB_SHAPE
static void
_ecore_xcb_event_handle_shape_change(xcb_generic_event_t *event)
{
xcb_shape_notify_event_t *ev;
Ecore_X_Event_Window_Shape *e;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
ev = (xcb_shape_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Shape)))) return;
e->win = ev->affected_window;
e->time = ev->server_time;
switch (ev->shape_kind)
{
case XCB_SHAPE_SK_BOUNDING:
e->type = ECORE_X_SHAPE_BOUNDING;
break;
case XCB_SHAPE_SK_CLIP:
e->type = ECORE_X_SHAPE_CLIP;
break;
case XCB_SHAPE_SK_INPUT:
e->type = ECORE_X_SHAPE_INPUT;
break;
default:
break;
}
e->x = ev->extents_x;
e->y = ev->extents_y;
e->w = ev->extents_width;
e->h = ev->extents_height;
e->shaped = ev->shaped;
ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
}
#endif
static void
_ecore_xcb_event_handle_sync_counter(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_SYNC
xcb_sync_counter_notify_event_t *ev;
Ecore_X_Event_Sync_Counter *e;
#endif
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
#ifdef ECORE_XCB_SYNC
ev = (xcb_sync_counter_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter)))) return;
e->time = ev->timestamp;
ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
#endif
}
static void
_ecore_xcb_event_handle_sync_alarm(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_SYNC
xcb_sync_alarm_notify_event_t *ev;
Ecore_X_Event_Sync_Alarm *e;
#endif
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
#ifdef ECORE_XCB_SYNC
ev = (xcb_sync_alarm_notify_event_t *)event;
if (!(e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm)))) return;
e->time = ev->timestamp;
e->alarm = ev->alarm;
ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
#endif
}
static void
_ecore_xcb_event_handle_xfixes_selection_notify(xcb_generic_event_t *event)
{
#ifdef ECORE_XCB_XFIXES
Ecore_X_Event_Fixes_Selection_Notify *e;
Ecore_X_Atom sel;
xcb_xfixes_selection_notify_event_t *ev;
#endif
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
#ifdef ECORE_XCB_XFIXES
ev = (xcb_xfixes_selection_notify_event_t *)event;
if (!(e = calloc(1, sizeof(*e)))) return;
e->win = ev->window;
e->owner = ev->owner;
e->time = ev->timestamp;
e->selection_time = ev->selection_timestamp;
e->atom = sel = ev->selection;
if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
e->selection = ECORE_X_SELECTION_PRIMARY;
else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
e->selection = ECORE_X_SELECTION_SECONDARY;
else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
e->selection = ECORE_X_SELECTION_CLIPBOARD;
else
e->selection = ECORE_X_SELECTION_OTHER;
e->reason = ev->subtype;
ecore_event_add(ECORE_X_EVENT_FIXES_SELECTION_NOTIFY, e, NULL, NULL);
#endif
}
static void
_ecore_xcb_event_handle_xfixes_cursor_notify(xcb_generic_event_t *event EINA_UNUSED)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
// FIXME: TBD
}
static void
_ecore_xcb_event_handle_generic_event(xcb_generic_event_t *event)
{
xcb_ge_event_t *ev;
Ecore_X_Event_Generic *e;
ev = (xcb_ge_event_t *)event;
/* pad0 *IS* extension - bug in xcb */
if (ev->pad0 == _ecore_xcb_event_input)
{
_ecore_xcb_event_handle_input_event(event);
// FIXME: should we generate generic events as WELL as input events?
// return;
}
if (!(e = calloc(1, sizeof(Ecore_X_Event_Generic))))
return;
DBG("Handle Generic Event: %d", ev->event_type);
e->cookie = ev->sequence;
/* NB: These are bugs in xcb ge_event structure. The struct should have a
* field for extension & data, but does not.
*
* XCB people have been notified of this issue */
e->extension = ev->pad0;
/* e->data = ev->pad1; */
if (ev->length > 0)
{
int len = ev->length * sizeof(int);
e->data = malloc(len);
if (e->data) memcpy(e->data, &(event[1]), len);
}
e->evtype = ev->event_type;
ecore_event_add(ECORE_X_EVENT_GENERIC, e,
_ecore_xcb_event_generic_event_free, e->data);
}
static void
_ecore_xcb_event_handle_input_event(xcb_generic_event_t *event)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_xcb_input_handle_event(event);
}
static void
_ecore_xcb_event_key_press(xcb_generic_event_t *event)
{
Ecore_Event_Key *e;
xcb_keysym_t sym = XCB_NO_SYMBOL;
xcb_keycode_t keycode = 0;
xcb_key_press_event_t *xevent;
char *keyname = NULL, *key = NULL;
char *compose = NULL;
char compose_buffer[256];
int val = 0;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
xevent = (xcb_key_press_event_t *)event;
keycode = xevent->detail;
sym = _ecore_xcb_keymap_keycode_to_keysym(keycode, xevent->state);
keyname = _ecore_xcb_keymap_keysym_to_string(sym);
if (!keyname)
{
char buff[256];
snprintf(buff, sizeof(buff), "Keycode-%i", keycode);
keyname = buff;
}
val =
_ecore_xcb_keymap_lookup_string(keycode, xevent->state, compose_buffer,
sizeof(compose_buffer), &sym);
if (val > 0)
{
compose_buffer[val] = 0;
compose =
eina_str_convert(nl_langinfo(CODESET), "UTF-8", compose_buffer);
if (!compose)
ERR("Ecore_X cannot convert input key string '%s' to UTF-8. "
"Is Eina built with iconv support?", compose_buffer);
}
key = _ecore_xcb_keymap_keysym_to_string(sym);
if (!key) key = keyname;
e = malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
(compose ? strlen(compose) : 0) + 3);
if (e)
{
e->keyname = (char *)(e + 1);
e->key = e->keyname + strlen(keyname) + 1;
e->compose = NULL;
if (compose) e->compose = (e->key + strlen(key) + 1);
e->string = e->compose;
strcpy((char *)e->keyname, keyname);
strcpy((char *)e->key, key);
if (compose) strcpy((char *)e->compose, compose);
e->modifiers = _ecore_xcb_events_modifiers_get(xevent->state);
e->timestamp = xevent->time;
e->window = xevent->child ? xevent->child : xevent->event;
e->event_window = xevent->event;
e->same_screen = xevent->same_screen;
e->root_window = xevent->root;
DBG("Sending Key Down Event: %s", e->keyname);
ecore_event_add(ECORE_EVENT_KEY_DOWN, e, NULL, NULL);
}
_ecore_xcb_event_last_time = xevent->time;
}
static void
_ecore_xcb_event_key_release(xcb_generic_event_t *event)
{
Ecore_Event_Key *e;
xcb_keysym_t sym = XCB_NO_SYMBOL;
xcb_keycode_t keycode = 0;
xcb_key_release_event_t *xevent;
char *keyname = NULL, *key = NULL;
char *compose = NULL;
char compose_buffer[256];
int val = 0;
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
xevent = (xcb_key_release_event_t *)event;
keycode = xevent->detail;
sym = _ecore_xcb_keymap_keycode_to_keysym(keycode, xevent->state);
keyname = _ecore_xcb_keymap_keysym_to_string(sym);
if (!keyname)
{
char buff[256];
snprintf(buff, sizeof(buff), "Keycode-%i", keycode);
keyname = buff;
}
val =
_ecore_xcb_keymap_lookup_string(keycode, xevent->state, compose_buffer,
sizeof(compose_buffer), &sym);
if (val > 0)
{
compose_buffer[val] = 0;
compose =
eina_str_convert(nl_langinfo(CODESET), "UTF-8", compose_buffer);
// tmp = compose;
}
key = _ecore_xcb_keymap_keysym_to_string(sym);
if (!key) key = keyname;
e = malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
(compose ? strlen(compose) : 0) + 3);
if (e)
{
e->keyname = (char *)(e + 1);
e->key = e->keyname + strlen(keyname) + 1;
e->compose = NULL;
if (compose) e->compose = (e->key + strlen(key) + 1);
e->string = e->compose;
strcpy((char *)e->keyname, keyname);
strcpy((char *)e->key, key);
if (compose) strcpy((char *)e->compose, compose);
e->modifiers = _ecore_xcb_events_modifiers_get(xevent->state);
e->timestamp = xevent->time;
e->window = xevent->child ? xevent->child : xevent->event;
e->event_window = xevent->event;
e->same_screen = xevent->same_screen;
e->root_window = xevent->root;
ecore_event_add(ECORE_EVENT_KEY_UP, e, NULL, NULL);
}
_ecore_xcb_event_last_time = xevent->time;
}
void
_ecore_xcb_event_mouse_move(uint16_t timestamp,
uint16_t modifiers,
int16_t x,
int16_t y,
int16_t root_x,
int16_t root_y,
xcb_window_t event_win,
xcb_window_t win,
xcb_window_t root_win,
uint8_t same_screen,
int dev,
double radx,
double rady,
double pressure,
double angle,
int16_t mx,
int16_t my,
int16_t mrx,
int16_t mry)
{
Ecore_Event_Mouse_Move *e;
Ecore_Event *event;
if (!(e = malloc(sizeof(Ecore_Event_Mouse_Move)))) return;
e->window = win;
e->root_window = root_win;
e->timestamp = timestamp;
e->same_screen = same_screen;
e->event_window = event_win;
e->modifiers = _ecore_xcb_events_modifiers_get(modifiers);
e->x = x;
e->y = y;
e->root.x = root_x;
e->root.y = root_y;
e->multi.device = dev;
e->multi.radius = ((radx + rady) / 2);
e->multi.radius_x = radx;
e->multi.radius_y = rady;
e->multi.pressure = pressure;
e->multi.angle = angle;
e->multi.x = mx;
e->multi.y = my;
e->multi.root.x = mrx;
e->multi.root.y = mry;
event = ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e,
_ecore_xcb_event_mouse_move_free, NULL);
_ecore_xcb_event_last_time = e->timestamp;
_ecore_xcb_event_last_window = e->window;
_ecore_xcb_event_last_root_x = root_x;
_ecore_xcb_event_last_root_y = root_y;
// _ecore_xcb_event_last_mouse_move_event = event;
}
static void
_ecore_xcb_event_mouse_move_free(void *data EINA_UNUSED,
void *event)
{
Ecore_Event_Mouse_Move *ev;
ev = event;
// if (_ecore_xcb_event_last_mouse_move_event)
// {
// _ecore_xcb_event_last_mouse_move = EINA_FALSE;
// _ecore_xcb_event_last_mouse_move_event = NULL;
// }
if (ev) free(ev);
}
Ecore_Event_Mouse_Button *
_ecore_xcb_event_mouse_button(int event,
uint16_t timestamp,
uint16_t modifiers,
xcb_button_t buttons,
int16_t x,
int16_t y,
int16_t root_x,
int16_t root_y,
xcb_window_t event_win,
xcb_window_t win,
xcb_window_t root_win,
uint8_t same_screen,
int dev,
double radx,
double rady,
double pressure,
double angle,
int16_t mx,
int16_t my,
int16_t mrx,
int16_t mry)
{
Ecore_Event_Mouse_Button *e;
Ecore_X_Mouse_Down_Info *info = NULL;
if (!(e = malloc(sizeof(Ecore_Event_Mouse_Button)))) return NULL;
e->window = win;
e->root_window = root_win;
e->timestamp = timestamp;
e->same_screen = same_screen;
e->event_window = event_win;
e->buttons = buttons;
e->modifiers = _ecore_xcb_events_modifiers_get(modifiers);
e->double_click = 0;
e->triple_click = 0;
e->x = x;
e->y = y;
e->root.x = root_x;
e->root.y = root_y;
if ((info = _ecore_xcb_event_mouse_down_info_get(dev)))
{
if ((event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
(info->did_triple))
{
info->last_win = 0;
info->last_last_win = 0;
info->last_event_win = 0;
info->last_time = 0;
info->last_last_time = 0;
}
if (event_win == win)
{
if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
{
if (((int)(timestamp - info->last_time) <=
(int)(1000 * _ecore_xcb_double_click_time)) &&
(win == info->last_win) &&
(event_win == info->last_event_win))
{
e->double_click = 1;
info->did_double = EINA_TRUE;
}
else
{
info->did_double = EINA_FALSE;
info->did_triple = EINA_FALSE;
}
if (((int)(timestamp - info->last_last_time) <=
(int)(2 * 1000 * _ecore_xcb_double_click_time)) &&
(win == info->last_win) &&
(win == info->last_last_win) &&
(event_win == info->last_event_win) &&
(event_win == info->last_last_event_win))
{
e->triple_click = 1;
info->did_triple = EINA_TRUE;
}
else
info->did_triple = EINA_FALSE;
}
else
{
if (info->did_double) e->double_click = 1;
if (info->did_triple) e->triple_click = 1;
}
}
}
/* NB: Comment out right now because _ecore_xcb_mouse_up_count is
* only used here...nowhere else in the code */
/* if ((event == ECORE_EVENT_MOUSE_BUTTON_DOWN) && */
/* (!e->double_click) && (!e->triple_click)) */
/* _ecore_xcb_mouse_up_count = 0; */
e->multi.device = dev;
e->multi.radius = ((radx + rady) / 2);
e->multi.radius_x = radx;
e->multi.radius_y = rady;
e->multi.pressure = pressure;
e->multi.angle = angle;
e->multi.x = mx;
e->multi.y = my;
e->multi.root.x = mrx;
e->multi.root.y = mry;
_ecore_xcb_event_last_time = e->timestamp;
_ecore_xcb_event_last_window = e->window;
_ecore_xcb_event_last_root_x = root_x;
_ecore_xcb_event_last_root_y = root_y;
ecore_event_add(event, e, NULL, NULL);
if ((info) && (event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
(win == event_win) && (!info->did_triple))
{
info->last_last_win = info->last_win;
info->last_win = win;
info->last_last_event_win = info->last_event_win;
info->last_event_win = event_win;
info->last_last_time = info->last_time;
info->last_time = timestamp;
}
return e;
}
static Ecore_X_Event_Mode
_ecore_xcb_event_mode_get(uint8_t mode)
{
switch (mode)
{
case XCB_NOTIFY_MODE_NORMAL:
return ECORE_X_EVENT_MODE_NORMAL;
case XCB_NOTIFY_MODE_WHILE_GRABBED:
return ECORE_X_EVENT_MODE_WHILE_GRABBED;
case XCB_NOTIFY_MODE_GRAB:
return ECORE_X_EVENT_MODE_GRAB;
case XCB_NOTIFY_MODE_UNGRAB:
return ECORE_X_EVENT_MODE_UNGRAB;
default:
return ECORE_X_EVENT_MODE_NORMAL;
}
}
static Ecore_X_Event_Detail
_ecore_xcb_event_detail_get(uint8_t detail)
{
switch (detail)
{
case XCB_NOTIFY_DETAIL_ANCESTOR:
return ECORE_X_EVENT_DETAIL_ANCESTOR;
case XCB_NOTIFY_DETAIL_VIRTUAL:
return ECORE_X_EVENT_DETAIL_VIRTUAL;
case XCB_NOTIFY_DETAIL_INFERIOR:
return ECORE_X_EVENT_DETAIL_INFERIOR;
case XCB_NOTIFY_DETAIL_NONLINEAR:
return ECORE_X_EVENT_DETAIL_NON_LINEAR;
case XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL:
return ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
case XCB_NOTIFY_DETAIL_POINTER:
return ECORE_X_EVENT_DETAIL_POINTER;
case XCB_NOTIFY_DETAIL_POINTER_ROOT:
return ECORE_X_EVENT_DETAIL_POINTER_ROOT;
case XCB_NOTIFY_DETAIL_NONE:
default:
return ECORE_X_EVENT_DETAIL_ANCESTOR;
}
}
static void
_ecore_xcb_event_xdnd_enter_free(void *data EINA_UNUSED,
void *event)
{
Ecore_X_Event_Xdnd_Enter *e;
int i = 0;
e = event;
for (i = 0; i < e->num_types; i++)
free(e->types[i]);
free(e->types);
free(e);
}
static void
_ecore_xcb_event_selection_notify_free(void *data EINA_UNUSED,
void *event)
{
Ecore_X_Event_Selection_Notify *e;
Ecore_X_Selection_Data *sel;
e = event;
if (!(sel = e->data)) return;
if (sel->free) sel->free(sel);
free(e->target);
free(e);
}
static void
_ecore_xcb_event_generic_event_free(void *data,
void *event)
{
Ecore_X_Event_Generic *e;
e = (Ecore_X_Event_Generic *)event;
if (e->data) free(data);
free(e);
}
static void
_ecore_xcb_event_mouse_down_info_clear(void)
{
Eina_Inlist *l;
Ecore_X_Mouse_Down_Info *info = NULL;
l = _ecore_xcb_mouse_down_info_list;
while (l)
{
info = EINA_INLIST_CONTAINER_GET(l, Ecore_X_Mouse_Down_Info);
l = eina_inlist_remove(l, l);
free(info);
}
_ecore_xcb_mouse_down_info_list = NULL;
}
static Ecore_X_Mouse_Down_Info *
_ecore_xcb_event_mouse_down_info_get(int dev)
{
Eina_Inlist *l;
Ecore_X_Mouse_Down_Info *info = NULL;
l = _ecore_xcb_mouse_down_info_list;
EINA_INLIST_FOREACH(l, info)
if (info->dev == dev) return info;
if (!(info = calloc(1, sizeof(Ecore_X_Mouse_Down_Info)))) return NULL;
info->dev = dev;
l = eina_inlist_append(l, (Eina_Inlist *)info);
_ecore_xcb_mouse_down_info_list = l;
return info;
}