From 0a8bed1b668197c27eb50819bec11e08f822aa8e Mon Sep 17 00:00:00 2001 From: Michal Pakula vel Rutka Date: Wed, 10 Oct 2012 09:17:21 +0000 Subject: [PATCH] From: Michal Pakula vel Rutka Subject: [E-devel] [Patch] [Ecore] Allow to send SelectionNotify event if there is no data from XGetWindowProperty. The issue I want to fix is that elementary clipboard does not return paste callback if selection does not contain any data. Currently when ecore_x_window_prop_property_get function is called asking for AnyProperty it returns 0 if there is no data (number of items stored equals 0). This causes ecore_x_event_handle_selection _notify to exit before SelectionNotify event is added and eventually elementary paste callback is not fired. My patch removes this condition and changes behaviour of this function by allowing to add SelectionNotify event even if data returned is empty. SVN revision: 77732 --- legacy/ecore/AUTHORS | 1 + legacy/ecore/ChangeLog | 4 ++++ legacy/ecore/NEWS | 1 + legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c | 10 +++------- .../ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c | 4 ++-- legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c | 12 ++++-------- .../ecore/src/lib/ecore_x/xlib/ecore_x_selection.c | 4 ++-- 7 files changed, 17 insertions(+), 19 deletions(-) diff --git a/legacy/ecore/AUTHORS b/legacy/ecore/AUTHORS index ff9f752f4c..2de0ab8794 100644 --- a/legacy/ecore/AUTHORS +++ b/legacy/ecore/AUTHORS @@ -55,3 +55,4 @@ Vikram Narayanan Seong-ho Cho (DarkCircle) Patryk Kaczmarek Daniel Willmann +Michal Pakula vel Rutka diff --git a/legacy/ecore/ChangeLog b/legacy/ecore/ChangeLog index e1db999616..3a94577a0a 100644 --- a/legacy/ecore/ChangeLog +++ b/legacy/ecore/ChangeLog @@ -998,3 +998,7 @@ * Wayland SHM now features a mechanism to synchronize rendering with the compositor, removing tearing effect in animations when using that engine. + +2012-10-10 Michal Pakula vel Rutka + + * Fix: Send ECORE_X_EVENT_SELECTION_NOTIFY even if there is no data. diff --git a/legacy/ecore/NEWS b/legacy/ecore/NEWS index a34205f14f..b98676bb85 100644 --- a/legacy/ecore/NEWS +++ b/legacy/ecore/NEWS @@ -37,6 +37,7 @@ Fixes: - ecore_x_randr to actually return crtcs properly. - ecore_x_randr to actually return crtcs possible outputs properly. - ecore_x_randr to actually return crtcs outputs properly. + - send ECORE_X_EVENT_SELECTION_NOTIFY even if there is no data. Improvements: diff --git a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c index 1763397a26..b9acccebf4 100644 --- a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c +++ b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c @@ -1356,13 +1356,9 @@ _ecore_xcb_event_handle_selection_notify(xcb_generic_event_t *event) } } else - { - format = - ecore_x_window_prop_property_get(ev->requestor, ev->property, - XCB_GET_PROPERTY_TYPE_ANY, 8, - &data, &num); - if (!format) return; - } + 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; diff --git a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c index 2fe148ba5e..d7fbf05982 100644 --- a/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c +++ b/legacy/ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c @@ -748,7 +748,7 @@ _ecore_xcb_selection_parser_text(const char *target __UNUSED__, sel = calloc(1, sizeof(Ecore_X_Selection_Data_Text)); if (!sel) return NULL; - if (_data[size - 1]) + if (data && data[size - 1]) { size++; t = realloc(_data, size); @@ -790,7 +790,7 @@ _ecore_xcb_selection_parser_files(const char *target, ECORE_XCB_SELECTION_DATA(sel)->free = _ecore_xcb_selection_data_files_free; - if (_data[size - 1]) + if (data && data[size - 1]) { size++; t = realloc(_data, size); diff --git a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c index 7d685cf83f..2e780aa19b 100644 --- a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c +++ b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_events.c @@ -1415,14 +1415,10 @@ _ecore_x_event_handle_selection_notify(XEvent *xevent) } } else - { - format = ecore_x_window_prop_property_get(xevent->xselection.requestor, - xevent->xselection.property, - AnyPropertyType, 8, &data, - &num_ret); - if (!format) - return; - } + format = ecore_x_window_prop_property_get(xevent->xselection.requestor, + xevent->xselection.property, + AnyPropertyType, 8, &data, + &num_ret); e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify)); if (!e) diff --git a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c index e94d5a3a14..476621a289 100644 --- a/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c +++ b/legacy/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c @@ -810,7 +810,7 @@ _ecore_x_selection_parser_files(const char *target, if (!sel) return NULL; ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_files_free; - if (data[size - 1]) + if (data && data[size - 1]) { /* Isn't nul terminated */ size++; @@ -909,7 +909,7 @@ _ecore_x_selection_parser_text(const char *target __UNUSED__, sel = calloc(1, sizeof(Ecore_X_Selection_Data_Text)); if (!sel) return NULL; - if (data[size - 1]) + if (data && data[size - 1]) { /* Isn't nul terminated */ size++;