summaryrefslogtreecommitdiff
path: root/src/lib/elementary/efl_ui_selection.c
blob: d67d1f3fef0ce0c0ff894e5b2933cd038b90db68 (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
#ifdef HAVE_CONFIG_H
# include "elementary_config.h"
#endif


#include <Elementary.h>
#include "elm_priv.h"

#define MY_CLASS EFL_UI_SELECTION_MIXIN
#define MY_CLASS_NAME "Efl.Ui.Selection"

typedef struct {
   Ecore_Evas *ee;
   Eina_Bool registered : 1;
} Efl_Ui_Selection_Data;

static inline Ecore_Evas_Selection_Buffer
_ee_buffer_get(Efl_Ui_Cnp_Buffer buffer)
{
   if (buffer == EFL_UI_CNP_BUFFER_SELECTION)
     return ECORE_EVAS_SELECTION_BUFFER_SELECTION_BUFFER;
   else
     return ECORE_EVAS_SELECTION_BUFFER_COPY_AND_PASTE_BUFFER;
}

EOLIAN static Eina_Future*
_efl_ui_selection_selection_get(Eo *obj EINA_UNUSED, Efl_Ui_Selection_Data *pd, Efl_Ui_Cnp_Buffer buffer, unsigned int seat, Eina_Iterator *acceptable_types)
{
   return ecore_evas_selection_get(pd->ee, seat, _ee_buffer_get(buffer), acceptable_types);
}

EOLIAN static void
_efl_ui_selection_selection_set(Eo *obj, Efl_Ui_Selection_Data *pd, Efl_Ui_Cnp_Buffer buffer, Eina_Content *content, unsigned int seat)
{
   _register_selection_changed(obj);
   ecore_evas_selection_set(pd->ee, seat, _ee_buffer_get(buffer), content);
}

EOLIAN static void
_efl_ui_selection_selection_clear(Eo *obj EINA_UNUSED, Efl_Ui_Selection_Data *pd, Efl_Ui_Cnp_Buffer buffer, unsigned int seat)
{
   ecore_evas_selection_set(pd->ee, seat, _ee_buffer_get(buffer), NULL);
}

EOLIAN static Eina_Bool
_efl_ui_selection_has_selection(Eo *obj EINA_UNUSED, Efl_Ui_Selection_Data *pd, Efl_Ui_Cnp_Buffer buffer, unsigned int seat)
{
   return ecore_evas_selection_exists(pd->ee, seat, _ee_buffer_get(buffer));
}

EOLIAN static Efl_Object*
_efl_ui_selection_efl_object_constructor(Eo *obj, Efl_Ui_Selection_Data *pd)
{
  if (!efl_constructor(efl_super(obj, EFL_UI_SELECTION_MIXIN)))
    return NULL;

  pd->ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));

  return obj;
}

EOLIAN static void
_efl_ui_selection_efl_object_invalidate(Eo *obj, Efl_Ui_Selection_Data *pd)
{
   if (pd->registered)
     {
        _selection_changed_event_unregister(obj);
     }
   efl_invalidate(efl_super(obj, EFL_UI_SELECTION_MIXIN));
}

EOLIAN static Eina_Bool
_efl_ui_selection_efl_object_event_callback_priority_add(Eo *obj, Efl_Ui_Selection_Data *pd,
                                        const Efl_Event_Description *desc,
                                        Efl_Callback_Priority priority,
                                        Efl_Event_Cb func,
                                        const void *user_data)
{
  if (desc == EFL_UI_SELECTION_EVENT_WM_SELECTION_CHANGED && !pd->registered)
    {

       pd->registered = EINA_TRUE;
       if (efl_finalized_get(obj))
         _selection_changed_event_register(obj);
    }

  return efl_event_callback_priority_add(efl_super(obj, EFL_UI_SELECTION_MIXIN), desc, priority, func, user_data);
}

EOLIAN static Eina_Bool
_efl_ui_selection_efl_object_event_callback_array_priority_add(Eo *obj, Efl_Ui_Selection_Data *pd,
                                              const Efl_Callback_Array_Item *array,
                                              Efl_Callback_Priority priority,
                                              const void *user_data)
{
   for (int i = 0; array[i].desc; ++i)
     {
        if (array[i].desc == EFL_UI_SELECTION_EVENT_WM_SELECTION_CHANGED && !pd->registered)
          {
             pd->registered = EINA_TRUE;
             if (efl_finalized_get(obj))
               _selection_changed_event_register(obj);
          }
     }
   return efl_event_callback_array_priority_add(efl_super(obj, EFL_UI_SELECTION_MIXIN), array, priority, user_data);
}


EOLIAN static Efl_Object*
_efl_ui_selection_efl_object_finalize(Eo *obj, Efl_Ui_Selection_Data *pd)
{
   if (pd->registered)
     _selection_changed_event_register(obj);

   return efl_finalize(efl_super(obj, MY_CLASS));
}


#define EFL_UI_SELECTION_EXTRA_OPS \
   EFL_OBJECT_OP_FUNC(efl_event_callback_priority_add, _efl_ui_selection_efl_object_event_callback_priority_add), \
   EFL_OBJECT_OP_FUNC(efl_event_callback_array_priority_add, _efl_ui_selection_efl_object_event_callback_array_priority_add), \

#include "efl_ui_selection.eo.c"