summaryrefslogtreecommitdiff
path: root/src/bin/e_dnd.h
blob: f88317b1d11bb24c370d731e684d04caa16e3e42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#ifdef E_TYPEDEFS

typedef enum _E_Drag_Type
{
   E_DRAG_NONE,
   E_DRAG_INTERNAL,
   E_DRAG_XDND
} E_Drag_Type;

typedef struct _E_Drag            E_Drag;
typedef struct _E_Drop_Handler    E_Drop_Handler;
typedef struct _E_Event_Dnd_Enter E_Event_Dnd_Enter;
typedef struct _E_Event_Dnd_Move  E_Event_Dnd_Move;
typedef struct _E_Event_Dnd_Leave E_Event_Dnd_Leave;
typedef struct _E_Event_Dnd_Drop  E_Event_Dnd_Drop;
typedef struct E_Dnd_X_Moz_Url    E_Dnd_X_Moz_Url;

#else
#ifndef E_DND_H
#define E_DND_H

#define E_DRAG_TYPE 0xE0b0100f

struct _E_Drag
{
   E_Object           e_obj_inherit;

   void              *data;
   int                data_size;

   E_Drag_Type        type;

   struct
   {
      void *(*convert)(E_Drag * drag, const char *type);
      void  (*finished)(E_Drag *drag, int dropped);
      void  (*key_down)(E_Drag *drag, Ecore_Event_Key *e);
      void  (*key_up)(E_Drag *drag, Ecore_Event_Key *e);
   } cb;

   E_Comp           *comp;
   Evas              *evas;
   Evas_Object       *comp_object;
   Evas_Object       *object;

   int                x, y, w, h;
   int                dx, dy;

   E_Layer            layer;
   unsigned char      visible : 1;

   unsigned int       num_types;
   const char        *types[];
};

struct _E_Drop_Handler
{
   struct
   {
      void  (*enter)(void *data, const char *type, void *event);
      void  (*move)(void *data, const char *type, void *event);
      void  (*leave)(void *data, const char *type, void *event);
      void  (*drop)(void *data, const char *type, void *event);
      Eina_Bool (*xds)(void *data, const char *type);
      void *data;
   } cb;

   E_Object     *obj;
   Evas_Object *base;
   int           x, y, w, h;

   const char   *active_type;
   Eina_Bool active : 1;
   Eina_Bool entered : 1;
   Eina_Bool hidden : 1;
   unsigned int  num_types;
   Eina_Stringshare *types[];
};

struct _E_Event_Dnd_Enter
{
   void        *data;
   int          x, y;
   unsigned int action;
};

struct _E_Event_Dnd_Move
{
   int          x, y;
   unsigned int action;
};

struct _E_Event_Dnd_Leave
{
   int x, y;
};

struct _E_Event_Dnd_Drop
{
   void *data;
   int   x, y;
};

struct E_Dnd_X_Moz_Url
{
   Eina_Inarray *links;
   Eina_Inarray *link_names;
};

EINTERN int          e_dnd_init(void);
EINTERN int          e_dnd_shutdown(void);

EAPI int             e_dnd_active(void);

/* x and y are the top left coords of the object that is to be dragged */
EAPI E_Drag         *e_drag_new(E_Comp *comp, int x, int y,
                                const char **types, unsigned int num_types,
                                void *data, int size,
                                void *(*convert_cb)(E_Drag * drag, const char *type),
                                void (*finished_cb)(E_Drag *drag, int dropped));
EAPI Evas           *e_drag_evas_get(const E_Drag *drag);
EAPI void            e_drag_object_set(E_Drag *drag, Evas_Object *object);
EAPI void            e_drag_move(E_Drag *drag, int x, int y);
EAPI void            e_drag_resize(E_Drag *drag, int w, int h);
EAPI void            e_drag_key_down_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_Event_Key *e));
EAPI void            e_drag_key_up_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_Event_Key *e));

/* x and y are the coords where the mouse is when dragging starts */
EAPI int             e_drag_start(E_Drag *drag, int x, int y);
EAPI int             e_drag_xdnd_start(E_Drag *drag, int x, int y);

EAPI void e_drop_xds_update(Eina_Bool enable, const char *value);
EAPI void e_drop_handler_xds_set(E_Drop_Handler *handler, Eina_Bool (*cb)(void *data, const char *type));
EAPI E_Drop_Handler *e_drop_handler_add(E_Object *obj,
                                        void *data,
                                        void (*enter_cb)(void *data, const char *type, void *event),
                                        void (*move_cb)(void *data, const char *type, void *event),
                                        void (*leave_cb)(void *data, const char *type, void *event),
                                        void (*drop_cb)(void *data, const char *type, void *event),
                                        const char **types, unsigned int num_types,
                                        int x, int y, int w, int h);
EAPI void         e_drop_handler_geometry_set(E_Drop_Handler *handler, int x, int y, int w, int h);
EAPI int          e_drop_inside(const E_Drop_Handler *handler, int x, int y);
EAPI void         e_drop_handler_del(E_Drop_Handler *handler);
EAPI int          e_drop_xdnd_register_set(Ecore_Window win, int reg);
EAPI void         e_drop_handler_responsive_set(E_Drop_Handler *handler);
EAPI int          e_drop_handler_responsive_get(const E_Drop_Handler *handler);
EAPI void         e_drop_handler_action_set(unsigned int action);
EAPI unsigned int e_drop_handler_action_get(void);
EAPI Eina_List *e_dnd_util_text_uri_list_convert(char *data, int size);


static inline void
e_drag_show(E_Drag *drag)
{
   drag->visible = 1;
}

static inline void
e_drag_hide(E_Drag *drag)
{
   drag->visible = 0;
}

#endif
#endif