upload tizen1.0 source
[framework/uifw/e17.git] / src / modules / comp / e_mod_comp_wl_input.c
1 #include "e.h"
2 #include "e_mod_main.h"
3 #ifdef HAVE_WAYLAND_CLIENTS
4 # include "e_mod_comp_wl.h"
5 # include "e_mod_comp_wl_input.h"
6 #endif
7
8 /* local function prototypes */
9 static void _e_mod_comp_wl_input_bind(struct wl_client *client, void *data, uint32_t version __UNUSED__, uint32_t id);
10 static void _e_mod_comp_wl_input_unbind(struct wl_resource *resource);
11 static void _e_mod_comp_wl_input_attach(struct wl_client *client, struct wl_resource *resource, uint32_t timestamp, struct wl_resource *buffer_resource __UNUSED__, int32_t x, int32_t y);
12
13 /* wayland interfaces */
14 static const struct wl_input_device_interface _wl_input_interface = 
15 {
16    _e_mod_comp_wl_input_attach,
17 };
18
19 /* private variables */
20 static Wayland_Input *_wl_input;
21
22 Eina_Bool 
23 e_mod_comp_wl_input_init(void)
24 {
25    LOGFN(__FILE__, __LINE__, __FUNCTION__);
26
27    if (!(_wl_input = malloc(sizeof(Wayland_Input))))
28      {
29         EINA_LOG_ERR("Could not allocate space for input\n");
30         return EINA_FALSE;
31      }
32
33    memset(_wl_input, 0, sizeof(*_wl_input));
34
35    wl_input_device_init(&_wl_input->input_device);
36    if (!wl_display_add_global(_wl_disp, &wl_input_device_interface, _wl_input, 
37                          _e_mod_comp_wl_input_bind))
38      {
39         EINA_LOG_ERR("Failed to add input to wayland\n");
40         free(_wl_input);
41         return EINA_FALSE;
42      }
43
44    _wl_input->hotspot_x = 16;
45    _wl_input->hotspot_y = 16;
46
47    return EINA_TRUE;
48 }
49
50 void 
51 e_mod_comp_wl_input_shutdown(void)
52 {
53    LOGFN(__FILE__, __LINE__, __FUNCTION__);
54
55    if (!_wl_input) return;
56    wl_input_device_release(&_wl_input->input_device);
57    free(_wl_input);
58 }
59
60 Wayland_Input *
61 e_mod_comp_wl_input_get(void)
62 {
63    return _wl_input;
64 }
65
66 /* local functions */
67 static void 
68 _e_mod_comp_wl_input_bind(struct wl_client *client, void *data, uint32_t version __UNUSED__, uint32_t id)
69 {
70    struct wl_input_device *device;
71    struct wl_resource *resource;
72
73    LOGFN(__FILE__, __LINE__, __FUNCTION__);
74
75    device = data;
76    resource = 
77      wl_client_add_object(client, &wl_input_device_interface, 
78                           &_wl_input_interface, id, data);
79    wl_list_insert(&device->resource_list, &resource->link);
80    resource->destroy = _e_mod_comp_wl_input_unbind;
81 }
82
83 static void 
84 _e_mod_comp_wl_input_unbind(struct wl_resource *resource)
85 {
86    LOGFN(__FILE__, __LINE__, __FUNCTION__);
87
88    wl_list_remove(&resource->link);
89    free(resource);
90 }
91
92 static void 
93 _e_mod_comp_wl_input_attach(struct wl_client *client, struct wl_resource *resource, uint32_t timestamp, struct wl_resource *buffer_resource __UNUSED__, int32_t x, int32_t y)
94 {
95    Wayland_Input *wi;
96
97    LOGFN(__FILE__, __LINE__, __FUNCTION__);
98
99    wi = resource->data;
100    if (timestamp < wi->input_device.pointer_focus_time) return;
101    if (!wi->input_device.pointer_focus) return;
102    if (wi->input_device.pointer_focus->resource.client != client) return;
103    wi->hotspot_x = x;
104    wi->hotspot_y = y;
105 }