efl/src/lib/ecore_evas/ecore_evas_fallback_selecti...

116 lines
3.6 KiB
C

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <Ecore.h>
#include "ecore_private.h"
#include "Ecore_Evas.h"
#include "ecore_evas_private.h"
#include <Efl_Core.h>
typedef struct {
Ecore_Evas_Selection_Callbacks callbacks[ECORE_EVAS_SELECTION_BUFFER_LAST];
int seat;
} Ecore_Evas_Fallback_Selection_Data;
static Ecore_Evas_Fallback_Selection_Data data[ECORE_EVAS_SELECTION_BUFFER_LAST];
void
fallback_selection_shutdown(Ecore_Evas *ee)
{
for (int i = 0; i < ECORE_EVAS_SELECTION_BUFFER_LAST; ++i)
{
if (data->callbacks[i].cancel)
data->callbacks[i].cancel(ee, data->seat, i);
}
}
Eina_Bool
fallback_selection_claim(Ecore_Evas *ee, unsigned int seat, Ecore_Evas_Selection_Buffer selection, Eina_Array *available_types, Ecore_Evas_Internal_Delivery delivery, Ecore_Evas_Internal_Cancel cancel)
{
Ecore_Evas_Selection_Callbacks *callbacks = &data->callbacks[selection];
if (callbacks->cancel)
{
callbacks->cancel(ee, data->seat, selection);
eina_array_free(callbacks->available_types);
}
callbacks->delivery = delivery;
callbacks->cancel = cancel;
callbacks->available_types = available_types;
data->seat = seat;
if (ee->func.fn_selection_changed)
ee->func.fn_selection_changed(ee, seat, selection);
return EINA_TRUE;
}
Eina_Bool
fallback_selection_has_owner(Ecore_Evas *ee EINA_UNUSED, unsigned int seat EINA_UNUSED, Ecore_Evas_Selection_Buffer selection EINA_UNUSED)
{
return EINA_FALSE; //if the real selection buffer does not contain it, then we dont know it either.
}
Eina_Stringshare*
available_types(Eina_Array *acceptable_types, Eina_Array *available_types)
{
unsigned int found_type_id = INT_MAX;
Eina_Stringshare *found_type = NULL;
Eina_Stringshare *type;
for (unsigned int i = 0; i < eina_array_count_get(acceptable_types); ++i)
{
unsigned int out = -1;
type = eina_array_data_get(acceptable_types, i);
if (!eina_array_find(available_types, type, &out))
continue;
if (out >= found_type_id)
continue;
found_type_id = out;
found_type = type;
eina_stringshare_del(type);
}
eina_array_free(acceptable_types);
return found_type;
}
Eina_Future*
fallback_selection_request(Ecore_Evas *ee EINA_UNUSED, unsigned int seat, Ecore_Evas_Selection_Buffer selection, Eina_Array *acceptable_type)
{
Ecore_Evas_Selection_Callbacks callbacks = data->callbacks[selection];
Eina_Content *result;
Eina_Stringshare *serving_type;
Eina_Rw_Slice slice_data;
Eina_Value value;
if (!callbacks.delivery)
return eina_future_resolved(efl_loop_future_scheduler_get(efl_main_loop_get()), eina_value_int_init(0));
serving_type = available_types(acceptable_type, callbacks.available_types);
if (!serving_type)
return NULL; //Silent return cause we cannot deliver a good type
EINA_SAFETY_ON_FALSE_RETURN_VAL(callbacks.delivery(ee, seat, selection, serving_type, &slice_data), NULL);
result = eina_content_new(eina_rw_slice_slice_get(slice_data), serving_type);
value = eina_value_content_init(result);
eina_content_free(result);
return eina_future_resolved(efl_loop_future_scheduler_get(efl_main_loop_get()), value);
}
Eina_Bool
fallback_dnd_start(Ecore_Evas *ee EINA_UNUSED, unsigned int seat EINA_UNUSED, Eina_Array *available_types EINA_UNUSED, Ecore_Evas *drag_rep EINA_UNUSED, Ecore_Evas_Internal_Delivery delivery EINA_UNUSED, Ecore_Evas_Internal_Cancel cancel EINA_UNUSED, const char* action EINA_UNUSED)
{
return EINA_FALSE;
}
Eina_Bool
fallback_dnd_stop(Ecore_Evas *ee EINA_UNUSED, unsigned int seat EINA_UNUSED)
{
return EINA_FALSE;
}