typedef unsigned int Ecore_X_ID;
-# ifndef _ECORE_X_WINDOW_PREDEF
+#ifndef _ECORE_X_WINDOW_PREDEF
typedef Ecore_X_ID Ecore_X_Window;
-# endif
+#endif
#ifdef HAVE_ECORE_X_XCB
typedef Ecore_X_ID Ecore_X_Visual;
#else
typedef struct _Ecore_X_Event_Sync_Counter Ecore_X_Event_Sync_Counter;
typedef struct _Ecore_X_Event_Sync_Alarm Ecore_X_Event_Sync_Alarm;
typedef struct _Ecore_X_Event_Screen_Change Ecore_X_Event_Screen_Change;
-typedef struct _Ecore_X_Event_Randr_Crtc_Change Ecore_X_Event_Randr_Crtc_Change;
-typedef struct _Ecore_X_Event_Randr_Output_Change Ecore_X_Event_Randr_Output_Change;
+typedef struct _Ecore_X_Event_Randr_Crtc_Change Ecore_X_Event_Randr_Crtc_Change;
+typedef struct _Ecore_X_Event_Randr_Output_Change Ecore_X_Event_Randr_Output_Change;
typedef struct _Ecore_X_Event_Randr_Output_Property_Notify Ecore_X_Event_Randr_Output_Property_Notify;
typedef struct _Ecore_X_Event_Window_Delete_Request Ecore_X_Event_Window_Delete_Request;
typedef struct _Ecore_X_Event_Startup_Sequence Ecore_X_Event_Startup_Sequence;
+typedef struct _Ecore_X_Event_Generic Ecore_X_Event_Generic;
+
struct _Ecore_X_Event_Mouse_In
{
int modifiers;
int source;
};
+struct _Ecore_X_Event_Generic
+{
+ int extension;
+ int evtype;
+ unsigned int cookie;
+ void *data;
+};
+
EAPI extern int ECORE_X_EVENT_ANY; /**< low level event dependent on
backend in use, if Xlib will be XEvent,
if XCB will be xcb_generic_event_t.
-
@warning avoid using it.
*/
EAPI extern int ECORE_X_EVENT_MOUSE_IN;
EAPI extern int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
EAPI extern int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
+EAPI extern int ECORE_X_EVENT_GENERIC;
+
EAPI extern int ECORE_X_EVENT_XDND_ENTER;
EAPI extern int ECORE_X_EVENT_XDND_POSITION;
EAPI extern int ECORE_X_EVENT_XDND_STATUS;
EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = 0;
EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = 0;
+#if 1 //def USE_XI
+EAPI int ECORE_X_EVENT_GENERIC = 0;
+#endif
+
int ECORE_X_MODIFIER_SHIFT = 0;
int ECORE_X_MODIFIER_CTRL = 0;
int ECORE_X_MODIFIER_ALT = 0;
_ecore_x_event_handlers[ColormapNotify] = _ecore_x_event_handle_colormap_notify;
_ecore_x_event_handlers[ClientMessage] = _ecore_x_event_handle_client_message;
_ecore_x_event_handlers[MappingNotify] = _ecore_x_event_handle_mapping_notify;
+#if 1 //def USE_XI
+ _ecore_x_event_handlers[GenericEvent] = _ecore_x_event_handle_generic_event;
+#endif
if (_ecore_x_event_shape_id)
_ecore_x_event_handlers[_ecore_x_event_shape_id] = _ecore_x_event_handle_shape_change;
if (_ecore_x_event_screensaver_id)
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();
+
+#if 1 //def USE_XI
+ ECORE_X_EVENT_GENERIC = ecore_event_type_new();
+#endif
}
/* everything has these... unless its like a pda... :) */
#include "ecore_x_private.h"
#include "Ecore_X.h"
#include "Ecore_X_Atoms.h"
-#include "Ecore_Input.h"
/** OpenBSD does not define CODESET
* FIXME ??
return modifiers;
}
-static void
+void
_ecore_mouse_move(unsigned int timestamp, unsigned int xmodifiers,
int x, int y,
int x_root, int y_root,
}
static void
-_ecore_key_press(int event,
- XKeyEvent *xevent)
+_ecore_key_press(int event, XKeyEvent *xevent)
{
Ecore_Event_Key *e;
char *compose = NULL;
if (tmp) free(tmp);
}
-static Ecore_Event_Mouse_Button*
+Ecore_Event_Mouse_Button *
_ecore_mouse_button(int event,
unsigned int timestamp, unsigned int xmodifiers,
unsigned int buttons,
return e;
}
-#ifdef ECORE_XI2
-extern int _ecore_x_xi2_opcode;
-#endif
-
void
_ecore_x_event_handle_any_event(XEvent *xevent)
{
XEvent* ev = malloc(sizeof(XEvent));
+
memcpy(ev, xevent, sizeof(XEvent));
-
ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
-
-#ifdef ECORE_XI2
- if (xevent->xcookie.type == GenericEvent &&
- xevent->xcookie.extension == _ecore_x_xi2_opcode)
- {
- if (XGetEventData(_ecore_x_disp, &(xevent->xcookie)))
- {
- XIDeviceEvent *evd = (XIDeviceEvent *)(xevent->xcookie.data);
- int devid = evd->deviceid;
-
- //printf("deviceID = %d\n", devid);
- switch (xevent->xcookie.evtype)
- {
- case XI_Motion:
- _ecore_mouse_move
- (evd->time,
- 0, // state
- evd->event_x, evd->event_y,
- evd->root_x, evd->root_y,
- evd->event,
- (evd->child ? evd->child : evd->event),
- evd->root,
- 1, // same_screen
- devid, 1, 1,
- 1.0, // pressure
- 0.0, // angle
- evd->event_x, evd->event_y,
- evd->root_x, evd->root_y);
- //printf("motion\n");
- printf("=");
- break;
- case XI_ButtonPress:
- _ecore_mouse_button
- (ECORE_EVENT_MOUSE_BUTTON_DOWN,
- evd->time,
- 0, // state
- 0, // button
- evd->event_x, evd->event_y,
- evd->root_x, evd->root_y,
- evd->event,
- (evd->child ? evd->child : evd->event),
- evd->root,
- 1, // same_screen
- devid, 1, 1,
- 1.0, // pressure
- 0.0, // angle
- evd->event_x, evd->event_y,
- evd->root_x, evd->root_y);
- //printf("abs X:%f Y:%f - ", evd->root_x, evd->root_y);
- //printf("win X:%f Y:%f\n", evd->event_x, evd->event_y);
- printf("[[");
- break;
- case XI_ButtonRelease:
- _ecore_mouse_button
- (ECORE_EVENT_MOUSE_BUTTON_UP,
- evd->time,
- 0, // state
- 0, // button
- evd->event_x, evd->event_y,
- evd->root_x, evd->root_y,
- evd->event,
- (evd->child ? evd->child : evd->event),
- evd->root,
- 1, // same_screen
- devid, 1, 1,
- 1.0, // pressure
- 0.0, // angle
- evd->event_x, evd->event_y,
- evd->root_x, evd->root_y);
- //printf("unclick\n");
- printf("]]\n");
- break;
- }
- }
- }
- XFreeEventData(_ecore_x_disp, &(xevent->xcookie));
-#endif
}
void
ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
}
#endif
+
+static void
+_ecore_x_event_free_generic_event(void *data, void *ev)
+{
+#ifdef ECORE_XI2
+ Ecore_X_Event_Generic *e = (Ecore_X_Event_Generic*)ev;
+
+ if (e->data)
+ {
+ XFreeEventData(_ecore_x_disp, (XGenericEventCookie *)data);
+ }
+#endif
+}
+
+void
+_ecore_x_event_handle_generic_event(XEvent *event)
+{
+#ifdef ECORE_XI2
+ XGenericEvent *generic_event;
+ Ecore_X_Event_Generic *e;
+
+ generic_event = (XGenericEvent *)event;
+
+ e = calloc(1, sizeof(Ecore_X_Event_Generic));
+ if (!e) return;
+
+ if (XGetEventData(_ecore_x_disp, &event->xcookie))
+ {
+ e->cookie = event->xcookie.cookie;
+ e->data = event->xcookie.data;
+ }
+ else
+ {
+ e->cookie = 0;
+ e->data = NULL;
+ }
+
+ e->extension = generic_event->extension;
+ e->evtype = generic_event->evtype;
+
+ if (e->extension == _ecore_x_xi2_opcode)
+ {
+ _ecore_x_input_handler(event);
+ }
+
+ ecore_event_add(ECORE_X_EVENT_GENERIC, e, _ecore_x_event_free_generic_event, event);
+#endif
+}
#include "Ecore.h"
#include "ecore_private.h"
#include "Ecore_X.h"
+#include "Ecore_Input.h"
/* FIXME: this is for simulation only */
#include "Ecore_Txt.h"
#ifdef ECORE_XDAMAGE
void _ecore_x_event_handle_damage_notify(XEvent *xevent);
#endif
+void _ecore_x_event_handle_generic_event(XEvent *xevent);
void _ecore_x_selection_data_init(void);
void _ecore_x_selection_shutdown(void);
void _ecore_x_atoms_init(void);
+extern int _ecore_x_xi2_opcode;
+
void _ecore_x_input_init(void);
void _ecore_x_input_shutdown(void);
-
+void _ecore_x_input_handler(XEvent* xevent);
/* from sync */
+void _ecore_mouse_move(unsigned int timestamp, unsigned int xmodifiers, int x, int y, int x_root, int y_root, unsigned int event_window, unsigned int window, unsigned int root_win, int same_screen, int dev, double radx, double rady, double pressure, double angle, double mx, double my, double mrx, double mry);
+Ecore_Event_Mouse_Button *_ecore_mouse_button(int event, unsigned int timestamp, unsigned int xmodifiers, unsigned int buttons, int x, int y, int x_root, int y_root, unsigned int event_window, unsigned int window, unsigned int root_win, int same_screen, int dev, double radx, double rady, double pressure, double angle, double mx, double my, double mrx, double mry);
+
#endif
#include "Ecore_X.h"
#ifdef ECORE_XI2
+#include "Ecore_Input.h"
+#endif
+
int _ecore_x_xi2_opcode = -1;
+#ifdef ECORE_XI2
static XIDeviceInfo *_ecore_x_xi2_devs = NULL;
static int _ecore_x_xi2_num = 0;
#endif
#endif
}
+void
+_ecore_x_input_handler(XEvent* xevent)
+{
+#ifdef ECORE_XI2
+ XIDeviceEvent *evd = (XIDeviceEvent *)(xevent->xcookie.data);
+ int devid = evd->deviceid;
+
+ //printf("deviceID = %d\n", devid);
+ switch (xevent->xcookie.evtype)
+ {
+ case XI_Motion:
+ _ecore_mouse_move
+ (evd->time,
+ 0, // state
+ evd->event_x, evd->event_y,
+ evd->root_x, evd->root_y,
+ evd->event,
+ (evd->child ? evd->child : evd->event),
+ evd->root,
+ 1, // same_screen
+ devid, 1, 1,
+ 1.0, // pressure
+ 0.0, // angle
+ evd->event_x, evd->event_y,
+ evd->root_x, evd->root_y);
+ break;
+ case XI_ButtonPress:
+ _ecore_mouse_button
+ (ECORE_EVENT_MOUSE_BUTTON_DOWN,
+ evd->time,
+ 0, // state
+ 0, // button
+ evd->event_x, evd->event_y,
+ evd->root_x, evd->root_y,
+ evd->event,
+ (evd->child ? evd->child : evd->event),
+ evd->root,
+ 1, // same_screen
+ devid, 1, 1,
+ 1.0, // pressure
+ 0.0, // angle
+ evd->event_x, evd->event_y,
+ evd->root_x, evd->root_y);
+ break;
+ case XI_ButtonRelease:
+ _ecore_mouse_button
+ (ECORE_EVENT_MOUSE_BUTTON_UP,
+ evd->time,
+ 0, // state
+ 0, // button
+ evd->event_x, evd->event_y,
+ evd->root_x, evd->root_y,
+ evd->event,
+ (evd->child ? evd->child : evd->event),
+ evd->root,
+ 1, // same_screen
+ devid, 1, 1,
+ 1.0, // pressure
+ 0.0, // angle
+ evd->event_x, evd->event_y,
+ evd->root_x, evd->root_y);
+ break;
+ }
+#endif
+}
+
EAPI Eina_Bool
ecore_x_input_multi_select(Ecore_X_Window win)
{