aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/e_dnd.h
blob: 3456830d3a0d70e5cc758a89df8352f0631d885e (plain) (blame)
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
167
168
169
#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;

   Evas              *evas;
   Evas_Object       *comp_object;
   Evas_Object       *object;

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

   E_Layer            layer;
   unsigned char      visible E_BITFIELD;
   Eina_Bool          ended E_BITFIELD;

   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 *win;
   Evas_Object *base;
   int           x, y, w, h;

   const char   *active_type;
   Eina_Bool active E_BITFIELD;
   Eina_Bool entered E_BITFIELD;
   Eina_Bool hidden E_BITFIELD;
   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);

E_API int             e_dnd_active(void);

E_API E_Drag         *e_drag_current_get(void);
/* x and y are the top left coords of the object that is to be dragged */
E_API E_Drag         *e_drag_new(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));
E_API Evas           *e_drag_evas_get(const E_Drag *drag);
E_API void            e_drag_object_set(E_Drag *drag, Evas_Object *object);
E_API void            e_drag_move(E_Drag *drag, int x, int y);
E_API void            e_drag_resize(E_Drag *drag, int w, int h);
E_API void            e_drag_key_down_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_Event_Key *e));
E_API 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 */
E_API int             e_drag_start(E_Drag *drag, int x, int y);
E_API int             e_drag_xdnd_start(E_Drag *drag, int x, int y);

E_API void e_drop_xds_update(Eina_Bool enable, const char *value);
E_API void e_drop_handler_xds_set(E_Drop_Handler *handler, Eina_Bool (*cb)(void *data, const char *type));
E_API E_Drop_Handler *e_drop_handler_add(E_Object *obj, Evas_Object *win,
                                        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);
E_API void         e_drop_handler_geometry_set(E_Drop_Handler *handler, int x, int y, int w, int h);
E_API int          e_drop_inside(const E_Drop_Handler *handler, int x, int y);
E_API void         e_drop_handler_del(E_Drop_Handler *handler);
E_API int          e_drop_xdnd_register_set(Ecore_Window win, int reg);
E_API void         e_drop_handler_responsive_set(E_Drop_Handler *handler);
E_API int          e_drop_handler_responsive_get(const E_Drop_Handler *handler);
E_API void         e_drop_handler_action_set(unsigned int action);
E_API unsigned int e_drop_handler_action_get(void);
E_API 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