efl/src/lib/elementary/efl_ui_selection_manager_pr...

324 lines
10 KiB
C

#ifndef EFL_UI_SELECTION_MANAGER_PRIVATE_H
#define EFL_UI_SELECTION_MANAGER_PRIVATE_H
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif
#include <Elementary.h>
#include "elm_priv.h"
enum
{
SELECTION_ATOM_TARGETS = 0,
SELECTION_ATOM_ATOM,
SELECTION_ATOM_LISTING_ATOMS = SELECTION_ATOM_ATOM,
SELECTION_ATOM_TEXT_URILIST,
SELECTION_ATOM_TEXT_X_VCARD,
SELECTION_ATOM_IMAGE_PNG,
SELECTION_ATOM_IMAGE_JPEG,
SELECTION_ATOM_IMAGE_BMP,
SELECTION_ATOM_IMAGE_GIF,
SELECTION_ATOM_IMAGE_TIFF,
SELECTION_ATOM_IMAGE_SVG,
SELECTION_ATOM_IMAGE_XPM,
SELECTION_ATOM_IMAGE_TGA,
SELECTION_ATOM_IMAGE_PPM,
SELECTION_ATOM_ELM,
SELECTION_ATOM_UTF8STRING,
SELECTION_ATOM_STRING,
SELECTION_ATOM_COMPOUND_TEXT,
SELECTION_ATOM_TEXT,
SELECTION_ATOM_TEXT_PLAIN_UTF8,
SELECTION_ATOM_TEXT_PLAIN,
SELECTION_N_ATOMS,
};
typedef struct _Efl_Ui_Selection_Manager_Data Efl_Ui_Selection_Manager_Data;
typedef struct _Sel_Manager_Seat_Selection Sel_Manager_Seat_Selection;
typedef struct _Sel_Manager_Atom Sel_Manager_Atom;
typedef struct _Sel_Manager_Dropable Sel_Manager_Dropable;
typedef struct _Anim_Icon Anim_Icon;
typedef struct _Sel_Manager_Drag_Container Sel_Manager_Drag_Container;
typedef struct _Drop_Format Drop_Format;
typedef struct _Item_Container_Drop_Info Item_Container_Drop_Info;
typedef struct _Sel_Manager_Selection Sel_Manager_Selection;
typedef struct _Tmp_Info Tmp_Info;
typedef struct _Saved_Type Saved_Type;
#ifdef HAVE_ELEMENTARY_X
typedef Eina_Bool (*X11_Converter_Fn_Cb) (char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize);
typedef int (*X11_Response_Handler_Cb) (Sel_Manager_Selection *sel, Ecore_X_Event_Selection_Notify *);
typedef Eina_Bool (*X11_Data_Preparer_Cb) (Sel_Manager_Seat_Selection *seat_sel, Ecore_X_Event_Selection_Notify *, Efl_Ui_Selection_Data *, Tmp_Info **);
#endif
#ifdef HAVE_ELEMENTARY_WL2
typedef Eina_Bool (*Wl_Converter_Fn_Cb) (char *target, Sel_Manager_Selection *sel, void *data, int size, void **data_ret, int *size_ret);
static Eina_Bool _wl_targets_converter(char *target, Sel_Manager_Selection *sel, void *data, int size, void **data_ret, int *size_ret);
static Eina_Bool _wl_general_converter(char *target, Sel_Manager_Selection *sel, void *data, int size, void **data_ret, int *size_ret);
static Eina_Bool _wl_text_converter(char *target, Sel_Manager_Selection *sel, void *data, int size, void **data_ret, int *size_ret);
typedef Eina_Bool (*Wl_Data_Preparer_Cb) (Sel_Manager_Selection *sel, Efl_Ui_Selection_Data *ddata, Ecore_Wl2_Event_Offer_Data_Ready *ev, Tmp_Info **tmp_info);
static Eina_Bool _wl_data_preparer_markup(Sel_Manager_Selection *sel, Efl_Ui_Selection_Data *ddata, Ecore_Wl2_Event_Offer_Data_Ready *ev, Tmp_Info **tmp_info);
static Eina_Bool _wl_data_preparer_uri(Sel_Manager_Selection *sel, Efl_Ui_Selection_Data *ddata, Ecore_Wl2_Event_Offer_Data_Ready *ev, Tmp_Info **tmp_info);
static Eina_Bool _wl_data_preparer_vcard(Sel_Manager_Selection *sel, Efl_Ui_Selection_Data *ddata, Ecore_Wl2_Event_Offer_Data_Ready *ev, Tmp_Info **tmp_info);
static Eina_Bool _wl_data_preparer_image(Sel_Manager_Selection *sel, Efl_Ui_Selection_Data *ddata, Ecore_Wl2_Event_Offer_Data_Ready *ev, Tmp_Info **tmp_info);
static Eina_Bool _wl_data_preparer_text(Sel_Manager_Selection *sel, Efl_Ui_Selection_Data *ddata, Ecore_Wl2_Event_Offer_Data_Ready *ev, Tmp_Info **tmp_info);
#endif
struct _Tmp_Info
{
char *filename;
void *map;
int fd;
int len;
};
struct _Saved_Type
{
const char **types;
char *imgfile;
int ntypes;
Eina_Position2D pos;
Eina_Bool textreq: 1;
};
struct _Sel_Manager_Selection
{
const char *debug;
Eina_Rw_Slice data;
Efl_Ui_Selection_Format request_format;
#ifdef HAVE_ELEMENTARY_X
Eina_Bool (*set) (Ecore_X_Window, const void *data, int size);
Eina_Bool (*clear) (void);
void (*request) (Ecore_X_Window, const char *target);
Ecore_X_Selection ecore_sel;
Ecore_X_Window xwin;
#endif
#ifdef HAVE_ELEMENTARY_WL2
uint32_t selection_serial;
uint32_t drag_serial;
Ecore_Wl2_Offer *sel_offer;
Ecore_Wl2_Offer *dnd_offer;
Ecore_Event_Handler *offer_handler;
Ecore_Wl2_Window *win;
#endif
#ifdef HAVE_ELEMENTARY_COCOA
Ecore_Cocoa_Window *win;
int pb_count;
#endif
#ifdef HAVE_ELEMENTARY_WIN32
Eina_Bool (*set)(const Ecore_Win32_Window *window, const void *data, int size);
Eina_Bool (*clear)(const Ecore_Win32_Window *window);
Eina_Bool (*get)(const Ecore_Win32_Window *window , void **data, int *size);
Ecore_Win32_Selection ecore_sel;
Ecore_Win32_Window *win;
#endif
Efl_Ui_Selection_Format want_format;
Efl_Ui_Selection_Format format;
Efl_Ui_Selection_Action action;
Eina_Bool active : 1;
unsigned char asked : 2;
Efl_Object *owner;
Efl_Object *request_obj;
void *data_func_data;
Efl_Ui_Selection_Data_Ready data_func;
Eina_Free_Cb data_func_free_cb;
Sel_Manager_Seat_Selection *seat_sel;
};
typedef struct _Sel_Manager_Selection_Lost Sel_Manager_Selection_Lost;
struct _Sel_Manager_Selection_Lost
{
Efl_Object *request;
Eina_Promise *promise;
Efl_Ui_Selection_Type type;
Sel_Manager_Seat_Selection *seat_sel;
};
struct _Sel_Manager_Seat_Selection
{
unsigned int seat;
#ifdef HAVE_ELEMENTARY_X
Sel_Manager_Selection *sel_list;
#endif
#ifdef HAVE_ELEMENTARY_WL2
Sel_Manager_Selection *sel;
#endif
#ifdef HAVE_ELEMENTARY_COCOA
Sel_Manager_Selection *sel;
#endif
#ifdef HAVE_ELEMENTARY_WIN32
Sel_Manager_Selection *sel_list;
#endif
Eina_List *sel_lost_list;
//drag
Eo *drag_obj;
Efl_Ui_Selection_Action drag_action;
Eo *drag_win;
Ecore_Event_Handler *mouse_up_handler, *dnd_status_handler;
Eina_Bool accept;
Ecore_X_Window xwin;
Eina_Position2D drag_pos;
Eina_Position2D drag_win_start;
Eina_Position2D drag_win_end;
Efl_Ui_Selection_Type active_type;
Saved_Type *saved_types;
Ecore_Event_Handler *enter_handler;
Ecore_Event_Handler *leave_handler;
Ecore_Event_Handler *pos_handler;
Ecore_Event_Handler *drop_handler;
Efl_Ui_Selection_Manager_Data *pd;
};
struct _Anim_Icon
{
Eina_Rectangle start;
Evas_Object *obj;
};
struct _Sel_Manager_Drag_Container
{
Evas *e;
Efl_Object *cont;
Efl_Ui_Selection_Format format;
Eina_Rw_Slice data;
Efl_Ui_Selection_Action action;
Eina_List *icons;
Eina_Size2D final_icon;
Eina_Position2D down;
Ecore_Timer *timer;
Ecore_Animator *animator;
double time_to_drag;
double anim_duration;
void *drag_data_func_data;
Efl_Dnd_Drag_Data_Get drag_data_func;
Eina_Free_Cb drag_data_func_free_cb;
void *item_get_func_data;
Efl_Dnd_Item_Get item_get_func;
Eina_Free_Cb item_get_func_free_cb;
void *icon_func_data;
Efl_Dnd_Drag_Icon_Create icon_func;
Eina_Free_Cb icon_func_free_cb;
void *icon_list_func_data;
Efl_Dnd_Drag_Icon_List_Create icon_list_func;
Eina_Free_Cb icon_list_func_free_cb;
unsigned int seat;
Efl_Ui_Selection_Manager_Data *pd;
};
struct _Sel_Manager_Atom
{
const char *name;
Efl_Ui_Selection_Format format;
#ifdef HAVE_ELEMENTARY_X
// Called by ecore to do conversion
X11_Converter_Fn_Cb x_converter;
X11_Data_Preparer_Cb x_data_preparer;
// Atom
Ecore_X_Atom x_atom;
#endif
#ifdef HAVE_ELEMENTARY_WL2
Wl_Converter_Fn_Cb wl_converter;
Wl_Data_Preparer_Cb wl_data_preparer;
#endif
void *_term;
};
struct _Drop_Format
{
EINA_INLIST;
Efl_Ui_Selection_Format format;
};
struct _Sel_Manager_Dropable
{
Evas_Object *obj;
Eina_Inlist *format_list;
unsigned int seat;
struct {
Eina_Position2D pos;
Eina_Bool in : 1;
const char *type;
Efl_Ui_Selection_Format format;
} last;
//for container
Efl_Dnd_Item_Get item_func;
void *item_func_data;
Eina_Bool is_container : 1;
};
struct _Item_Container_Drop_Info
{
Efl_Object *obj;
void *item_func_data;
Efl_Dnd_Item_Get item_func;
};
#ifdef HAVE_ELEMENTARY_WL2
typedef struct _Wl_Format_Translation
{
Efl_Ui_Selection_Format format;
char **translates;
} Sel_Manager_Wl_Format_Translation;
char *sm_wl_markup[] = {"application/x-elementary-markup", "", NULL};
char *sm_wl_text[] = {"text/plain;charset=utf-8", "text/plain", NULL};
char *sm_wl_html[] = {"text/html;charset=utf-8", "text/html", NULL};
char *sm_wl_vcard[] = {"text/x-vcard", NULL};
char *sm_wl_image[] = {"image/", "text/uri-list", NULL};
Sel_Manager_Wl_Format_Translation sm_wl_convertion[] = {
{EFL_UI_SELECTION_FORMAT_MARKUP | EFL_UI_SELECTION_FORMAT_TEXT, sm_wl_markup},
{EFL_UI_SELECTION_FORMAT_TEXT, sm_wl_text},
{EFL_UI_SELECTION_FORMAT_HTML, sm_wl_html},
{EFL_UI_SELECTION_FORMAT_VCARD, sm_wl_vcard},
{EFL_UI_SELECTION_FORMAT_IMAGE, sm_wl_image},
{EFL_UI_SELECTION_FORMAT_NONE, NULL},
};
#endif
struct _Efl_Ui_Selection_Manager_Data
{
Eo *sel_man;
#ifdef HAVE_ELEMENTARY_X
Ecore_Event_Handler *notify_handler;
Ecore_Event_Handler *clear_handler;
Ecore_Event_Handler *fix_handler;
#endif
#ifdef HAVE_ELEMENTARY_WL2
Ecore_Event_Handler *send_handler;
Ecore_Event_Handler *changed_handler;
Ecore_Event_Handler *end_handler;
Ecore_Wl2_Display *wl_display;
#endif
Efl_Ui_Selection_Type loss_type;
Sel_Manager_Atom *atom_list;
Eina_List *seat_list;
Eina_List *drag_cont_list;
//drop
Eina_List *drop_list;
Eina_Hash *type_hash;
const char *text_uri;
Eina_List *drop_cont_list;
};
#endif