Ecore X: Added Xfixes selection notification support.
Now we can get notifications for changes in X selection. This is very useful for text editors that want to disable their "paste" button when there's nothing to paste. SVN revision: 62205
This commit is contained in:
parent
b72850a06d
commit
6a2929e448
|
@ -371,6 +371,7 @@ typedef struct _Ecore_X_Event_Window_Mapping Ecore_X_Event_Window_Mapping;
|
||||||
typedef struct _Ecore_X_Event_Selection_Clear Ecore_X_Event_Selection_Clear;
|
typedef struct _Ecore_X_Event_Selection_Clear Ecore_X_Event_Selection_Clear;
|
||||||
typedef struct _Ecore_X_Event_Selection_Request Ecore_X_Event_Selection_Request;
|
typedef struct _Ecore_X_Event_Selection_Request Ecore_X_Event_Selection_Request;
|
||||||
typedef struct _Ecore_X_Event_Selection_Notify Ecore_X_Event_Selection_Notify;
|
typedef struct _Ecore_X_Event_Selection_Notify Ecore_X_Event_Selection_Notify;
|
||||||
|
typedef struct _Ecore_X_Event_Fixes_Selection_Notify Ecore_X_Event_Fixes_Selection_Notify;
|
||||||
typedef struct _Ecore_X_Selection_Data Ecore_X_Selection_Data;
|
typedef struct _Ecore_X_Selection_Data Ecore_X_Selection_Data;
|
||||||
typedef struct _Ecore_X_Selection_Data_Files Ecore_X_Selection_Data_Files;
|
typedef struct _Ecore_X_Selection_Data_Files Ecore_X_Selection_Data_Files;
|
||||||
typedef struct _Ecore_X_Selection_Data_Text Ecore_X_Selection_Data_Text;
|
typedef struct _Ecore_X_Selection_Data_Text Ecore_X_Selection_Data_Text;
|
||||||
|
@ -617,6 +618,24 @@ struct _Ecore_X_Event_Selection_Request
|
||||||
Ecore_X_Atom property;
|
Ecore_X_Atom property;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ECORE_X_OWNER_CHANGE_REASON_NEW_OWNER,
|
||||||
|
ECORE_X_OWNER_CHANGE_REASON_DESTROY,
|
||||||
|
ECORE_X_OWNER_CHANGE_REASON_CLOSE
|
||||||
|
} Ecore_X_Owner_Change_Reason;
|
||||||
|
|
||||||
|
struct _Ecore_X_Event_Fixes_Selection_Notify
|
||||||
|
{
|
||||||
|
Ecore_X_Window win;
|
||||||
|
Ecore_X_Window owner;
|
||||||
|
Ecore_X_Time time;
|
||||||
|
Ecore_X_Time selection_time;
|
||||||
|
Ecore_X_Selection selection;
|
||||||
|
Ecore_X_Atom atom;
|
||||||
|
Ecore_X_Owner_Change_Reason reason;
|
||||||
|
};
|
||||||
|
|
||||||
struct _Ecore_X_Event_Selection_Notify
|
struct _Ecore_X_Event_Selection_Notify
|
||||||
{
|
{
|
||||||
Ecore_X_Window win;
|
Ecore_X_Window win;
|
||||||
|
@ -898,6 +917,7 @@ EAPI extern int ECORE_X_EVENT_MAPPING_CHANGE;
|
||||||
EAPI extern int ECORE_X_EVENT_SELECTION_CLEAR;
|
EAPI extern int ECORE_X_EVENT_SELECTION_CLEAR;
|
||||||
EAPI extern int ECORE_X_EVENT_SELECTION_REQUEST;
|
EAPI extern int ECORE_X_EVENT_SELECTION_REQUEST;
|
||||||
EAPI extern int ECORE_X_EVENT_SELECTION_NOTIFY;
|
EAPI extern int ECORE_X_EVENT_SELECTION_NOTIFY;
|
||||||
|
EAPI extern int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY;
|
||||||
EAPI extern int ECORE_X_EVENT_CLIENT_MESSAGE;
|
EAPI extern int ECORE_X_EVENT_CLIENT_MESSAGE;
|
||||||
EAPI extern int ECORE_X_EVENT_WINDOW_SHAPE;
|
EAPI extern int ECORE_X_EVENT_WINDOW_SHAPE;
|
||||||
EAPI extern int ECORE_X_EVENT_SCREENSAVER_NOTIFY;
|
EAPI extern int ECORE_X_EVENT_SCREENSAVER_NOTIFY;
|
||||||
|
@ -3002,6 +3022,16 @@ EAPI void ecore_x_region_picture_clip_set(Ecore_X_Region regi
|
||||||
int x_origin,
|
int x_origin,
|
||||||
int y_origin);
|
int y_origin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xfixes selection notification request.
|
||||||
|
*
|
||||||
|
* This lets you choose which selections you want to get notifications for.
|
||||||
|
* @param selection the selection atom.
|
||||||
|
* @return EINA_TRUE on success, EINA_FALSE otherwise.
|
||||||
|
* @since 1.1.0
|
||||||
|
*/
|
||||||
|
EAPI Eina_Bool ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection);
|
||||||
|
|
||||||
/* XComposite Extension Support */
|
/* XComposite Extension Support */
|
||||||
EAPI Eina_Bool ecore_x_composite_query(void);
|
EAPI Eina_Bool ecore_x_composite_query(void);
|
||||||
EAPI void ecore_x_composite_redirect_window(Ecore_X_Window win,
|
EAPI void ecore_x_composite_redirect_window(Ecore_X_Window win,
|
||||||
|
|
|
@ -130,6 +130,7 @@ EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0;
|
||||||
EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
|
EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
|
||||||
EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
|
EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
|
||||||
EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 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_CLIENT_MESSAGE = 0;
|
||||||
EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
|
EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
|
||||||
EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
|
EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
|
||||||
|
@ -2059,14 +2060,37 @@ _ecore_xcb_event_handle_sync_alarm(xcb_generic_event_t *event)
|
||||||
static void
|
static void
|
||||||
_ecore_xcb_event_handle_xfixes_selection_notify(xcb_generic_event_t *event __UNUSED__)
|
_ecore_xcb_event_handle_xfixes_selection_notify(xcb_generic_event_t *event __UNUSED__)
|
||||||
{
|
{
|
||||||
// xcb_xfixes_selection_notify_event_t *ev;
|
Ecore_X_Event_Fixes_Selection_Notify *e;
|
||||||
|
Ecore_X_Atom sel;
|
||||||
|
xcb_xfixes_selection_notify_event_t *ev;
|
||||||
|
|
||||||
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
|
|
||||||
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
|
_ecore_xcb_event_last_mouse_move = EINA_FALSE;
|
||||||
// ev = (xcb_xfixes_selection_notify_event_t *)event;
|
ev = (xcb_xfixes_selection_notify_event_t *)event;
|
||||||
|
|
||||||
|
e = calloc(1, sizeof(*e));
|
||||||
|
if (!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);
|
||||||
|
} /* _ecore_x_event_handle_fixes_selection_notify */
|
||||||
|
|
||||||
// FIXME: TBD
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -47,7 +47,10 @@ _ecore_xcb_xfixes_finalize(void)
|
||||||
if (reply)
|
if (reply)
|
||||||
{
|
{
|
||||||
if (reply->major_version >= 3)
|
if (reply->major_version >= 3)
|
||||||
_xfixes_avail = EINA_TRUE;
|
{
|
||||||
|
_xfixes_avail = EINA_TRUE;
|
||||||
|
ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = ecore_event_type_new();
|
||||||
|
}
|
||||||
free(reply);
|
free(reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,6 +60,25 @@ _ecore_xcb_xfixes_finalize(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EAPI Eina_Bool
|
||||||
|
ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection)
|
||||||
|
{
|
||||||
|
#ifdef ECORE_XCB_XFIXES
|
||||||
|
if (_xfixes_avail)
|
||||||
|
{
|
||||||
|
xcb_xfixes_select_selection_input_checked(_ecore_xcb_conn,
|
||||||
|
/* FIXME: We need a way to know the root window. */
|
||||||
|
NULL,
|
||||||
|
selection,
|
||||||
|
XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER |
|
||||||
|
XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_WINDOW_DESTROY |
|
||||||
|
XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_CLIENT_CLOSE);
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
Eina_Bool
|
Eina_Bool
|
||||||
_ecore_xcb_xfixes_avail_get(void)
|
_ecore_xcb_xfixes_avail_get(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,6 +91,7 @@ EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0;
|
||||||
EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
|
EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
|
||||||
EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
|
EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
|
||||||
EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 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_CLIENT_MESSAGE = 0;
|
||||||
EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
|
EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
|
||||||
EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
|
EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
|
||||||
|
|
|
@ -2107,9 +2107,34 @@ _ecore_x_event_handle_randr_notify(XEvent *xevent)
|
||||||
void
|
void
|
||||||
_ecore_x_event_handle_fixes_selection_notify(XEvent *event)
|
_ecore_x_event_handle_fixes_selection_notify(XEvent *event)
|
||||||
{
|
{
|
||||||
|
XFixesSelectionNotifyEvent *notify_event =
|
||||||
|
(XFixesSelectionNotifyEvent *) event;
|
||||||
|
Ecore_X_Event_Fixes_Selection_Notify *e;
|
||||||
|
Ecore_X_Atom sel;
|
||||||
|
|
||||||
_ecore_x_last_event_mouse_move = 0;
|
_ecore_x_last_event_mouse_move = 0;
|
||||||
/* Nothing here yet */
|
/* Nothing here yet */
|
||||||
event = NULL;
|
|
||||||
|
e = calloc(1, sizeof(*e));
|
||||||
|
if (!e)
|
||||||
|
return;
|
||||||
|
|
||||||
|
e->win = notify_event->window;
|
||||||
|
e->owner = notify_event->owner;
|
||||||
|
e->time = notify_event->timestamp;
|
||||||
|
e->selection_time = notify_event->selection_timestamp;
|
||||||
|
e->atom = sel = notify_event->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 = notify_event->subtype;
|
||||||
|
|
||||||
|
ecore_event_add(ECORE_X_EVENT_FIXES_SELECTION_NOTIFY, e, NULL, NULL);
|
||||||
} /* _ecore_x_event_handle_fixes_selection_notify */
|
} /* _ecore_x_event_handle_fixes_selection_notify */
|
||||||
|
|
||||||
#endif /* ifdef ECORE_XFIXES */
|
#endif /* ifdef ECORE_XFIXES */
|
||||||
|
|
|
@ -21,7 +21,11 @@ _ecore_x_fixes_init(void)
|
||||||
|
|
||||||
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
if (XFixesQueryVersion(_ecore_x_disp, &_fixes_major, &_fixes_minor))
|
if (XFixesQueryVersion(_ecore_x_disp, &_fixes_major, &_fixes_minor))
|
||||||
_fixes_available = 1;
|
{
|
||||||
|
_fixes_available = 1;
|
||||||
|
|
||||||
|
ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = ecore_event_type_new();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
_fixes_available = 0;
|
_fixes_available = 0;
|
||||||
|
|
||||||
|
@ -80,6 +84,24 @@ _ecore_x_rectangle_x_to_ecore(XRectangle *xrect, int num)
|
||||||
|
|
||||||
#endif /* ifdef ECORE_XFIXES */
|
#endif /* ifdef ECORE_XFIXES */
|
||||||
|
|
||||||
|
EAPI Eina_Bool
|
||||||
|
ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection)
|
||||||
|
{
|
||||||
|
#ifdef ECORE_XFIXES
|
||||||
|
if (_fixes_available)
|
||||||
|
{
|
||||||
|
XFixesSelectSelectionInput (_ecore_x_disp,
|
||||||
|
DefaultRootWindow(_ecore_x_disp),
|
||||||
|
selection,
|
||||||
|
XFixesSetSelectionOwnerNotifyMask |
|
||||||
|
XFixesSelectionWindowDestroyNotifyMask |
|
||||||
|
XFixesSelectionClientCloseNotifyMask);
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
EAPI Ecore_X_Region
|
EAPI Ecore_X_Region
|
||||||
ecore_x_region_new(Ecore_X_Rectangle *rects, int num)
|
ecore_x_region_new(Ecore_X_Rectangle *rects, int num)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue