ecore-wl2: more dnd v3 updates

ref d34b5958051c87fe491e358b24e9f25238fda10f

 #gladthiswasabetaapi
This commit is contained in:
Mike Blumenkrantz 2016-04-21 13:55:45 -04:00
parent 74ed3fbe74
commit d36c931fac
3 changed files with 90 additions and 26 deletions

View File

@ -44,6 +44,15 @@ typedef struct _Ecore_Wl2_Pointer Ecore_Wl2_Pointer;
typedef struct _Ecore_Wl2_Keyboard Ecore_Wl2_Keyboard;
typedef struct _Ecore_Wl2_Touch Ecore_Wl2_Touch;
/* matches protocol values */
typedef enum
{
ECORE_WL2_DRAG_ACTION_NONE = 0,
ECORE_WL2_DRAG_ACTION_COPY = 1,
ECORE_WL2_DRAG_ACTION_MOVE = 2,
ECORE_WL2_DRAG_ACTION_ASK = 4,
} Ecore_Wl2_Drag_Action;
typedef struct _Ecore_Wl2_Global
{
Eina_Stringshare *interface;
@ -99,10 +108,15 @@ typedef struct _Ecore_Wl2_Event_Dnd_End
unsigned int win, source;
} Ecore_Wl2_Event_Dnd_End;
typedef struct _Ecore_Wl2_Event_Data_Source_Cancelled
struct _Ecore_Wl2_Event_Data_Source_Event
{
unsigned int win, source;
} Ecore_Wl2_Event_Data_Source_Cancelled;
Ecore_Wl2_Drag_Action action;
};
typedef struct _Ecore_Wl2_Event_Data_Source_Event Ecore_Wl2_Event_Data_Source_End;
typedef struct _Ecore_Wl2_Event_Data_Source_Event Ecore_Wl2_Event_Data_Source_Drop;
typedef struct _Ecore_Wl2_Event_Data_Source_Event Ecore_Wl2_Event_Data_Source_Action;
typedef struct _Ecore_Wl2_Event_Data_Source_Target
{
@ -163,7 +177,9 @@ EAPI extern int ECORE_WL2_EVENT_DND_LEAVE; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DND_MOTION; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DND_DROP; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DND_END; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_CANCELLED; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_END; /** @since 1.18 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_DROP; /** @since 1.18 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_ACTION; /** @since 1.18 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_TARGET; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_DATA_SOURCE_SEND; /** @since 1.17 */
EAPI extern int ECORE_WL2_EVENT_SELECTION_DATA_READY; /** @since 1.17 */

View File

@ -20,7 +20,9 @@ EAPI int ECORE_WL2_EVENT_DND_LEAVE = 0;
EAPI int ECORE_WL2_EVENT_DND_MOTION = 0;
EAPI int ECORE_WL2_EVENT_DND_DROP = 0;
EAPI int ECORE_WL2_EVENT_DND_END = 0;
EAPI int ECORE_WL2_EVENT_DATA_SOURCE_CANCELLED = 0;
EAPI int ECORE_WL2_EVENT_DATA_SOURCE_END = 0;
EAPI int ECORE_WL2_EVENT_DATA_SOURCE_DROP = 0;
EAPI int ECORE_WL2_EVENT_DATA_SOURCE_ACTION = 0;
EAPI int ECORE_WL2_EVENT_DATA_SOURCE_TARGET = 0;
EAPI int ECORE_WL2_EVENT_DATA_SOURCE_SEND = 0;
EAPI int ECORE_WL2_EVENT_SELECTION_DATA_READY = 0;
@ -74,7 +76,9 @@ ecore_wl2_init(void)
ECORE_WL2_EVENT_DND_MOTION = ecore_event_type_new();
ECORE_WL2_EVENT_DND_DROP = ecore_event_type_new();
ECORE_WL2_EVENT_DND_END = ecore_event_type_new();
ECORE_WL2_EVENT_DATA_SOURCE_CANCELLED = ecore_event_type_new();
ECORE_WL2_EVENT_DATA_SOURCE_END = ecore_event_type_new();
ECORE_WL2_EVENT_DATA_SOURCE_DROP = ecore_event_type_new();
ECORE_WL2_EVENT_DATA_SOURCE_ACTION = ecore_event_type_new();
ECORE_WL2_EVENT_DATA_SOURCE_TARGET = ecore_event_type_new();
ECORE_WL2_EVENT_DATA_SOURCE_SEND = ecore_event_type_new();
ECORE_WL2_EVENT_SELECTION_DATA_READY = ecore_event_type_new();
@ -119,7 +123,9 @@ ecore_wl2_shutdown(void)
ECORE_WL2_EVENT_DND_MOTION = 0;
ECORE_WL2_EVENT_DND_DROP = 0;
ECORE_WL2_EVENT_DND_END = 0;
ECORE_WL2_EVENT_DATA_SOURCE_CANCELLED = 0;
ECORE_WL2_EVENT_DATA_SOURCE_END = 0;
ECORE_WL2_EVENT_DATA_SOURCE_DROP = 0;
ECORE_WL2_EVENT_DATA_SOURCE_ACTION = 0;
ECORE_WL2_EVENT_DATA_SOURCE_TARGET = 0;
ECORE_WL2_EVENT_DATA_SOURCE_SEND = 0;
ECORE_WL2_EVENT_SELECTION_DATA_READY = 0;

View File

@ -77,7 +77,7 @@ static const struct wl_data_offer_listener _offer_listener =
};
static void
_source_cb_target_free(void *data EINA_UNUSED, void *event)
data_source_target_free(void *data EINA_UNUSED, void *event)
{
Ecore_Wl2_Event_Data_Source_Target *ev;
@ -89,7 +89,7 @@ _source_cb_target_free(void *data EINA_UNUSED, void *event)
}
static void
_source_cb_target(void *data, struct wl_data_source *source EINA_UNUSED, const char *mime_type)
data_source_target(void *data, struct wl_data_source *source EINA_UNUSED, const char *mime_type)
{
Ecore_Wl2_Input *input;
Ecore_Wl2_Event_Data_Source_Target *ev;
@ -103,11 +103,11 @@ _source_cb_target(void *data, struct wl_data_source *source EINA_UNUSED, const c
if (mime_type) ev->type = strdup(mime_type);
ecore_event_add(ECORE_WL2_EVENT_DATA_SOURCE_TARGET, ev,
_source_cb_target_free, NULL);
data_source_target_free, NULL);
}
static void
_source_cb_send_free(void *data EINA_UNUSED, void *event)
data_source_send_free(void *data EINA_UNUSED, void *event)
{
Ecore_Wl2_Event_Data_Source_Send *ev;
@ -119,7 +119,7 @@ _source_cb_send_free(void *data EINA_UNUSED, void *event)
}
static void
_source_cb_send(void *data, struct wl_data_source *source EINA_UNUSED, const char *mime_type, int32_t fd)
data_source_send(void *data, struct wl_data_source *source EINA_UNUSED, const char *mime_type, int32_t fd)
{
Ecore_Wl2_Input *input;
Ecore_Wl2_Event_Data_Source_Send *ev;
@ -134,22 +134,15 @@ _source_cb_send(void *data, struct wl_data_source *source EINA_UNUSED, const cha
ev->type = strdup(mime_type);
ecore_event_add(ECORE_WL2_EVENT_DATA_SOURCE_SEND, ev,
_source_cb_send_free, NULL);
data_source_send_free, NULL);
}
static void
_source_cb_cancelled(void *data, struct wl_data_source *source)
data_source_event_emit(Ecore_Wl2_Input *input, int event)
{
Ecore_Wl2_Input *input;
Ecore_Wl2_Event_Data_Source_Cancelled *ev;
Ecore_Wl2_Event_Data_Source_End *ev;
input = data;
if (!input) return;
if (input->data.source == source) input->data.source = NULL;
wl_data_source_destroy(source);
ev = calloc(1, sizeof(Ecore_Wl2_Event_Data_Source_Cancelled));
ev = calloc(1, sizeof(Ecore_Wl2_Event_Data_Source_End));
if (!ev) return;
if (input->focus.pointer)
@ -158,15 +151,56 @@ _source_cb_cancelled(void *data, struct wl_data_source *source)
ev->source = input->focus.keyboard->id;
if (!ev->win) ev->win = ev->source;
ev->action = input->drag.source->dnd_action;
ecore_event_add(ECORE_WL2_EVENT_DATA_SOURCE_CANCELLED, ev, NULL, NULL);
ecore_event_add(event, ev, NULL, NULL);
}
static void
data_source_cancelled(void *data, struct wl_data_source *source)
{
Ecore_Wl2_Input *input = data;
if (input->data.source == source) input->data.source = NULL;
wl_data_source_destroy(source);
input->drag.source->dnd_action = 0;
data_source_event_emit(input, ECORE_WL2_EVENT_DATA_SOURCE_END);
}
static void
data_source_dnd_drop_performed(void *data, struct wl_data_source *source EINA_UNUSED)
{
Ecore_Wl2_Input *input = data;
data_source_event_emit(input, ECORE_WL2_EVENT_DATA_SOURCE_DROP);
}
static void
data_source_dnd_finished(void *data, struct wl_data_source *source)
{
Ecore_Wl2_Input *input = data;
if (input->data.source == source) input->data.source = NULL;
wl_data_source_destroy(source);
data_source_event_emit(input, ECORE_WL2_EVENT_DATA_SOURCE_END);
}
static void
data_source_action(void *data, struct wl_data_source *source EINA_UNUSED, uint32_t dnd_action)
{
Ecore_Wl2_Input *input = data;
input->drag.source->dnd_action = dnd_action;
data_source_event_emit(input, ECORE_WL2_EVENT_DATA_SOURCE_ACTION);
}
static const struct wl_data_source_listener _source_listener =
{
_source_cb_target,
_source_cb_send,
_source_cb_cancelled
data_source_target,
data_source_send,
data_source_cancelled,
data_source_dnd_drop_performed,
data_source_dnd_finished,
data_source_action,
};
static void
@ -197,6 +231,9 @@ _selection_data_read(void *data, Ecore_Fd_Handler *fdh)
if (len <= 0)
{
if (source->input->display->wl.data_device_manager_version >=
WL_DATA_OFFER_FINISH_SINCE_VERSION)
wl_data_offer_finish(source->offer);
if (source->input->selection.source == source)
source->input->selection.source = NULL;
_ecore_wl2_dnd_del(source);
@ -269,6 +306,7 @@ _ecore_wl2_dnd_enter(Ecore_Wl2_Input *input, struct wl_data_offer *offer, struct
if (offer)
{
input->drag.source = wl_data_offer_get_user_data(offer);
input->drag.source->dnd_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
num = (input->drag.source->types.size / sizeof(char *));
types = input->drag.source->types.data;
if (input->display->wl.data_device_manager_version >=
@ -461,6 +499,10 @@ ecore_wl2_dnd_drag_start(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, Ecore
osurface = ecore_wl2_window_surface_get(window);
if (osurface)
{
if (input->display->wl.data_device_manager_version >= WL_DATA_SOURCE_SET_ACTIONS_SINCE_VERSION)
wl_data_source_set_actions(input->data.source,
WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE | WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY);
wl_data_device_start_drag(input->data.device, input->data.source,
osurface, dsurface, input->display->serial);