aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/e_dnd.h
blob: bebd2ce4a859213eb0abb4aaa56d5ca1d640286f (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
#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;

#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_Container       *container;
   Ecore_Evas        *ecore_evas;
   Evas              *evas;
   Ecore_X_Window     evas_win;
   E_Container_Shape *shape;
   Evas_Object       *object;

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

   int                shape_rects_num;
   Ecore_X_Rectangle *shape_rects;

   E_Layer            layer;
   unsigned char      visible : 1;
   unsigned char      need_shape_export : 1;
   unsigned char      xy_update : 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;
   int           x, y, w, h;

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

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

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

struct _E_Event_Dnd_Leave
{
   int x, y;
};

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

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_Container *container, 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_idler_before(void);
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_X_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(Ecore_X_Atom action);
EAPI Ecore_X_Atom e_drop_handler_action_get(void);

EAPI Eina_List *e_dnd_util_text_uri_list_convert(char *data, int size);
#endif
#endif

#ifndef MIN
# define MIN(x, y) (((x) > (y)) ? (y) : (x))
#endif