change wl_signal_emit_mutable into wl_signal_emit
[platform/core/uifw/libds-tizen.git] / examples / tinyds-input-devicemgr.c
1 #include <libds-tizen/input_devicemgr.h>
2
3 #include "tinyds-common.h"
4 #include "tinyds-input-devicemgr.h"
5 #include "tinyds-tdm.h"
6
7 struct tinyds_input_devicemgr
8 {
9     input_devicemgr_free_cb free_cb;
10     void *data;
11
12     struct ds_tizen_input_devicemgr *devicemgr;
13     struct ds_seat *seat;
14
15     struct wl_listener destroy;
16     struct wl_listener pointer_warp;
17
18     struct tinyds_server *server;
19 };
20
21 static void
22 devicemgr_add_keymap_data(struct wl_list *list, const char *name, int keycode)
23 {
24     struct ds_tizen_input_devicemgr_keymap_data *data;
25
26     data = calloc(1, sizeof *data);
27     if (!data) {
28         ds_err("Failed to alloc memory");
29         return;
30     }
31
32     data->name = strdup(name);
33     data->keycode = keycode;
34
35     wl_list_insert(list, &data->link);
36 }
37
38 static void
39 devicemgr_cleanup_keymap_list(struct wl_list *list)
40 {
41     struct ds_tizen_input_devicemgr_keymap_data *data, *tmp;
42
43     wl_list_for_each_safe(data, tmp, list, link) {
44         wl_list_remove(&data->link);
45         free(data->name);
46         free(data);
47     }
48 }
49
50 static void
51 devicemgr_set_keymap(struct ds_tizen_input_devicemgr *devicemgr)
52 {
53     struct wl_list keymap_list;
54     bool res;
55
56     wl_list_init(&keymap_list);
57
58     devicemgr_add_keymap_data(&keymap_list, "XF86VolumeRaise", 455);
59     devicemgr_add_keymap_data(&keymap_list, "XF86VolumeLower", 456);
60     devicemgr_add_keymap_data(&keymap_list, "XF86LightOn", 457);
61     devicemgr_add_keymap_data(&keymap_list, "XF86LightOff", 458);
62
63     res = ds_tizen_input_devicemgr_set_keymap_list(devicemgr, &keymap_list);
64     if (!res)
65         ds_inf("Failed to set keymap");
66
67     devicemgr_cleanup_keymap_list(&keymap_list);
68 }
69
70 static void
71 devicemgr_handle_pointer_warp(struct wl_listener *listener, void *data)
72 {
73     struct ds_tizen_input_devicemgr_event_pointer_warp *event = data;
74     struct tinyds_input_devicemgr *input_devicemgr =
75         wl_container_of(listener, input_devicemgr, pointer_warp);
76     struct tinyds_server *server = input_devicemgr->server;
77     struct tinyds_view *view = NULL;
78     double sx = 0.f, sy = 0.f;
79     int output_w = 0, output_h = 0;
80
81     ds_inf("Pointer warp: surface(%p) x(%.2f) y(%.2f)", event->surface,
82             event->x, event->y);
83
84     view = tinyds_server_get_focused_view(server);
85     if (!view) return;
86
87     if (event->surface != ds_xdg_surface_get_surface(view->xdg_surface)) {
88         ds_inf("Pointer is not on the requested surface");
89         return;
90     }
91
92     tinyds_server_get_output_size(server, &output_w, &output_h);
93
94     server->output_x = view->x + (event->x * output_w);
95     server->output_y = view->y + (event->y * output_h);
96
97     tinyds_server_view_at(server, server->output_x, server->output_y, &sx, &sy);
98
99     ds_inf("notify motion: sx:%.2f sy:%.2f, output_x:%.1f, output_y:%.1f",
100             sx, sy, server->output_x, server->output_y);
101
102     ds_seat_pointer_notify_motion(input_devicemgr->seat, event->time_msec,
103         sx, sy);
104 }
105
106 static void
107 devicemgr_handle_destroy(struct wl_listener *listener, void *data TINYDS_UNUSED)
108 {
109     struct tinyds_input_devicemgr *input_devicemgr =
110         wl_container_of(listener, input_devicemgr, destroy);
111
112     ds_inf("input_devicemgr (%p) destroy", input_devicemgr);
113
114     input_devicemgr->free_cb(data);
115
116     wl_list_remove(&input_devicemgr->destroy.link);
117     wl_list_remove(&input_devicemgr->pointer_warp.link);
118
119     free(input_devicemgr);
120 }
121
122 struct tinyds_input_devicemgr *
123 tinyds_input_devicemgr_init(struct ds_backend *input_backend,
124     struct ds_seat *seat, input_devicemgr_free_cb free_cb, void *data)
125 {
126     struct tinyds_input_devicemgr *input_devicemgr;
127
128     input_devicemgr = calloc(1, sizeof *input_devicemgr);
129     if (!input_devicemgr)
130         return NULL;
131
132     input_devicemgr->free_cb = free_cb;
133     data = data;
134
135     input_devicemgr->devicemgr = ds_tizen_input_devicemgr_create(
136             input_backend, seat);
137     if (!input_devicemgr->devicemgr) {
138         free(input_devicemgr);
139         ds_err("Could not create ds_tizen_input_devicemgr");
140         return NULL;
141     }
142
143     input_devicemgr->seat = seat;
144
145     devicemgr_set_keymap(input_devicemgr->devicemgr);
146
147     input_devicemgr->destroy.notify = devicemgr_handle_destroy;
148     ds_tizen_input_devicemgr_add_destroy_listener(input_devicemgr->devicemgr,
149             &input_devicemgr->destroy);
150
151     input_devicemgr->pointer_warp.notify = devicemgr_handle_pointer_warp;
152     ds_tizen_input_devicemgr_add_pointer_warp_listener(input_devicemgr->devicemgr,
153             &input_devicemgr->pointer_warp);
154
155     input_devicemgr->server = (struct tinyds_server *)data;
156
157     ds_inf("Input Devicemgr (%p) created", input_devicemgr);
158
159     return input_devicemgr;
160 }
161
162 void
163 tinyds_input_devicemgr_set_output_size(
164     struct tinyds_input_devicemgr *input_devicemgr,
165     uint32_t width, uint32_t height)
166 {
167     ds_tizen_input_devicemgr_set_output_width_height(input_devicemgr->devicemgr,
168         width, height);
169 }