Compare commits

...

4 Commits

Author SHA1 Message Date
Marcel Hollerbach 139115fd90 elm_dnd: support target setting on none evas_objects
before this only worked for elm widgets. This however mirrored the
behaviour from efl_ui_selection_manager.c. So this restores the
behaviour prior to selection_manager.
2020-04-12 11:58:36 +02:00
Marcel Hollerbach b142fb0b32 ecore_evas_x: allow parsing of links form the link list
this is needed in order to return the data the same way the legacy impl
did. This however has the annoying sideeffect that ecore_evas_x now
depends on efreet, and we had to change the build order.
2020-04-12 11:54:41 +02:00
Marcel Hollerbach d1dc5badef elm_dnd: complete the list of causal text types
Differential Revision: https://phab.enlightenment.org/D11684
2020-04-11 19:13:22 +02:00
Marcel Hollerbach ff6b0eec83 elm_slider: create timer for hiding later
_popup_show deletes the hide timer, hence we need to create the timer
later on, or this will not automatically hide the indicator.

Differential Revision: https://phab.enlightenment.org/D11679
2020-04-11 11:11:20 +02:00
6 changed files with 88 additions and 20 deletions

View File

@ -317,11 +317,11 @@ subprojects = [
['ecore_drm2' ,['drm'] , false, true, false, false, false, false, ['ecore'], ['libdrm']],
['ecore_cocoa' ,['cocoa'] , false, true, false, false, false, false, ['eina'], []],
['evas' ,[] , true, true, false, false, true, true, ['eina', 'efl', 'eo'], ['vg_common', 'libunibreak']],
['efreet' ,[] , false, true, false, false, true, false, ['eina', 'efl', 'eo'], []],
['ecore_input_evas' ,[] , false, true, false, false, false, false, ['eina', 'evas'], []],
['ecore_evas' ,[] , true, true, true, false, false, false, ['evas', 'ector'], []],
['ecore_imf' ,[] , true, true, false, false, false, false, ['eina'], []],
['embryo' ,[] , false, true, true, false, false, false, ['eina', 'efl', 'eo'], []],
['efreet' ,[] , false, true, false, false, true, false, ['eina', 'efl', 'eo'], []],
['eio' ,[] , false, true, false, false, true, true, ['eina', 'eet'], []],
['efreet' ,[] , false, false, true, false, false, false, ['eina', 'efl', 'eo'], []],
['ecore_imf_evas' ,[] , false, true, false, false, false, false, ['eina', 'efl', 'eo'], []],

View File

@ -9398,12 +9398,29 @@ _remove(void *data, void *gdata)
return EINA_TRUE;
}
static Efl_Ui_Win_Data*
_fetch_win_data_from_arbitary_obj(Efl_Canvas_Object *obj)
{
Efl_Ui_Win *win = efl_provider_find(obj, MY_CLASS);
if (!win)
{
Evas *e = evas_object_evas_get(obj);
Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
win = ecore_evas_data_get(ee, "elm_win");
}
EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
Efl_Ui_Win_Data *pd = efl_data_scope_safe_get(win, MY_CLASS);
EINA_SAFETY_ON_NULL_RETURN_VAL(pd, NULL);
return pd;
}
void
_drop_event_register(Eo *obj)
{
Ui_Dnd_Target target = {obj, EINA_FALSE};
Efl_Ui_Win_Data *pd = efl_data_scope_safe_get(efl_provider_find(obj, MY_CLASS), MY_CLASS);
EINA_SAFETY_ON_NULL_RETURN(pd);
Efl_Ui_Win_Data *pd = _fetch_win_data_from_arbitary_obj(obj);
if (!pd) return;
eina_inarray_push(pd->drop_target, &target);
}
@ -9412,9 +9429,8 @@ void
_drop_event_unregister(Eo *obj)
{
int idx = -1;
Efl_Ui_Win_Data *pd;
pd = efl_data_scope_safe_get(efl_provider_find(obj, MY_CLASS), MY_CLASS);
Efl_Ui_Win_Data *pd = _fetch_win_data_from_arbitary_obj(obj);
if (!pd) return;
for (unsigned int i = 0; i < eina_inarray_count(pd->drop_target); ++i)
@ -9434,9 +9450,7 @@ _drop_event_unregister(Eo *obj)
void
_selection_changed_event_register(Eo *obj)
{
Efl_Ui_Win_Data *pd;
pd = efl_data_scope_safe_get(efl_provider_find(obj, MY_CLASS), MY_CLASS);
Efl_Ui_Win_Data *pd = _fetch_win_data_from_arbitary_obj(obj);
if (!pd) return;
eina_array_push(pd->selection_changed, obj);
@ -9444,9 +9458,7 @@ _selection_changed_event_register(Eo *obj)
void
_selection_changed_event_unregister(Eo *obj)
{
Efl_Ui_Win_Data *pd;
pd = efl_data_scope_safe_get(efl_provider_find(obj, MY_CLASS), MY_CLASS);
Efl_Ui_Win_Data *pd = _fetch_win_data_from_arbitary_obj(obj);
if (!pd) return;
eina_array_remove(pd->selection_changed, _remove, obj);

View File

@ -97,13 +97,30 @@ _deliver_content(Eo *obj, void *data, const Eina_Value value)
return EINA_VALUE_EMPTY;
}
static Efl_Ui_Win*
_fetch_win(Efl_Canvas_Object *obj)
{
Efl_Ui_Win *win = efl_provider_find(obj, EFL_UI_WIN_CLASS);
if (!win)
{
Evas *e = evas_object_evas_get(obj);
Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
win = ecore_evas_data_get(ee, "elm_win");
}
EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
return win;
}
static void
_drop_cb(void *data, const Efl_Event *ev)
{
Efl_Ui_Drop_Dropped_Event *event = ev->info;
Elm_Drop_Target *target = data;
target->action = _string_to_action(event->action);
efl_future_then(ev->object, efl_ui_dnd_drop_data_get(ev->object, _default_seat(ev->object), eina_array_iterator_new(target->mime_types)),
efl_future_then(ev->object, efl_ui_dnd_drop_data_get(elm_widget_is(ev->object) ? ev->object : _fetch_win(ev->object), _default_seat(ev->object), eina_array_iterator_new(target->mime_types)),
.success = _deliver_content,
.data = target
);
@ -133,7 +150,11 @@ _format_to_mime_array(Elm_Sel_Format format)
Eina_Array *ret = eina_array_new(10);
if (format & ELM_SEL_FORMAT_TEXT)
eina_array_push(ret, "text/plain;charset=utf-8");
{
eina_array_push(ret, "text/plain");
eina_array_push(ret, "text/plain;charset=utf-8");
eina_array_push(ret, "text/uri-list");
}
if (format & ELM_SEL_FORMAT_MARKUP)
eina_array_push(ret, "application/x-elementary-markup");
if (format & ELM_SEL_FORMAT_IMAGE)
@ -178,7 +199,7 @@ elm_drop_target_add(Evas_Object *obj, Elm_Sel_Format format,
target->format = format;
efl_event_callback_array_add(obj, drop_target_cb(), target);
_drop_event_register(obj); //this is ensuring that we are also supporting none widgets
if (!target_register)
target_register = eina_hash_pointer_new(NULL);
eina_hash_list_append(target_register, &obj, target);
@ -223,6 +244,7 @@ elm_drop_target_del(Evas_Object *obj, Elm_Sel_Format format,
efl_event_callback_array_del(obj, drop_target_cb(), eina_list_data_get(found));
eina_hash_list_remove(target_register, &obj, target);
eina_array_free(target->mime_types);
_drop_event_unregister(obj); //this is ensuring that we are also supporting none widgets
free(target);
}

View File

@ -630,9 +630,6 @@ _elm_slider_efl_ui_widget_widget_input_event_handler(Eo *obj, Elm_Slider_Data *s
else
_drag_down(obj, NULL, NULL, NULL);
efl_input_processed_set(ev, EINA_TRUE);
ELM_SAFE_FREE(sd->wheel_indicator_timer, ecore_timer_del);
sd->wheel_indicator_timer =
ecore_timer_add(0.5, _wheel_indicator_timer_cb, obj);
}
else return EINA_FALSE;
@ -640,6 +637,13 @@ _elm_slider_efl_ui_widget_widget_input_event_handler(Eo *obj, Elm_Slider_Data *s
_val_fetch(obj, EINA_TRUE);
evas_object_smart_changed(obj);
if (eo_event->desc == EFL_EVENT_POINTER_WHEEL)
{
ELM_SAFE_FREE(sd->wheel_indicator_timer, ecore_timer_del);
sd->wheel_indicator_timer =
ecore_timer_add(0.5, _wheel_indicator_timer_cb, obj);
}
return EINA_TRUE;
}

View File

@ -13,6 +13,7 @@
#include <Ecore_X.h>
#include <Ecore_X_Atoms.h>
#include <Efreet.h>
#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
# include <Evas_Engine_Software_X11.h>
@ -3858,12 +3859,39 @@ _create_deliveriy_content(unsigned long int size, const void *mem, const char *m
static void
_deliver_content(Ecore_Evas *ee, Ecore_Evas_Engine_Data_X11 *edata, Ecore_Evas_Selection_Buffer selection, Ecore_X_Event_Selection_Notify *ev)
{
Ecore_X_Selection_Data *x11_data = ev->data;
Eina_Content *result = NULL;
Eina_Stringshare *mime_type = _decrypt_type(edata->selection_data[selection].requested_type);
if (eina_str_has_prefix(mime_type,"text"))
if (eina_streq(mime_type, "text/uri-list"))
{
Ecore_X_Selection_Data_Files *files = ev->data;
Efreet_Uri *uri;
Eina_Strbuf *strbuf;
int i;
strbuf = eina_strbuf_new();
for (i = 0; i < files->num_files ; i++)
{
uri = efreet_uri_decode(files->files[i]);
if (uri)
{
eina_strbuf_append(strbuf, uri->path);
efreet_uri_free(uri);
}
else
{
eina_strbuf_append(strbuf, files->files[i]);
}
if (i < (files->num_files - 1))
eina_strbuf_append(strbuf, "\n");
}
result = _create_deliveriy_content(eina_strbuf_length_get(strbuf) + 1, eina_strbuf_string_get(strbuf), mime_type);
eina_strbuf_free(strbuf);
}
else if (eina_str_has_prefix(mime_type,"text"))
{
Ecore_X_Selection_Data *x11_data = ev->data;
//ensure that we always have a \0 at the end, there is no assertion that \0 is included here.
void *null_terminated = eina_memdup(x11_data->data, x11_data->length, EINA_TRUE);
@ -3872,6 +3900,7 @@ _deliver_content(Ecore_Evas *ee, Ecore_Evas_Engine_Data_X11 *edata, Ecore_Evas_S
}
else if (eina_str_has_prefix(mime_type,"image"))
{
Ecore_X_Selection_Data *x11_data = ev->data;
Eina_Content *tmp_container = eina_content_new((Eina_Slice){.len = x11_data->length, .mem = x11_data->data}, mime_type);
const char *file = eina_content_as_file(tmp_container);
@ -3880,6 +3909,7 @@ _deliver_content(Ecore_Evas *ee, Ecore_Evas_Engine_Data_X11 *edata, Ecore_Evas_S
}
else
{
Ecore_X_Selection_Data *x11_data = ev->data;
result = _create_deliveriy_content(x11_data->length, x11_data->data, mime_type);
}
EINA_SAFETY_ON_NULL_RETURN(result);

View File

@ -14,7 +14,7 @@ endif
shared_module(mod_full_name, engine_src,
include_directories : config_dir + [engine_include_dir],
dependencies : [eina, ecore_evas, ecore_input_evas] + engine_deps,
dependencies : [eina, ecore_evas, ecore_input_evas, efreet] + engine_deps,
install : true,
install_dir : mod_install_dir,
name_suffix : sys_mod_extension