2803 lines
93 KiB
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;
|
|
}
|
|
|