1 #include <libds-tizen/input_devicemgr.h>
3 #include "tinyds-common.h"
4 #include "tinyds-input-devicemgr.h"
5 #include "tinyds-tdm.h"
7 struct tinyds_input_devicemgr
9 input_devicemgr_free_cb free_cb;
12 struct ds_tizen_input_devicemgr *devicemgr;
15 struct wl_listener destroy;
16 struct wl_listener pointer_warp;
18 struct tinyds_server *server;
22 devicemgr_add_keymap_data(struct wl_list *list, const char *name, int keycode)
24 struct ds_tizen_input_devicemgr_keymap_data *data;
26 data = calloc(1, sizeof *data);
28 ds_err("Failed to alloc memory");
32 data->name = strdup(name);
33 data->keycode = keycode;
35 wl_list_insert(list, &data->link);
39 devicemgr_cleanup_keymap_list(struct wl_list *list)
41 struct ds_tizen_input_devicemgr_keymap_data *data, *tmp;
43 wl_list_for_each_safe(data, tmp, list, link) {
44 wl_list_remove(&data->link);
51 devicemgr_set_keymap(struct ds_tizen_input_devicemgr *devicemgr)
53 struct wl_list keymap_list;
56 wl_list_init(&keymap_list);
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);
63 res = ds_tizen_input_devicemgr_set_keymap_list(devicemgr, &keymap_list);
65 ds_inf("Failed to set keymap");
67 devicemgr_cleanup_keymap_list(&keymap_list);
71 devicemgr_handle_pointer_warp(struct wl_listener *listener, void *data)
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;
81 ds_inf("Pointer warp: surface(%p) x(%.2f) y(%.2f)", event->surface,
84 view = tinyds_server_get_focused_view(server);
87 if (event->surface != ds_xdg_surface_get_surface(view->xdg_surface)) {
88 ds_inf("Pointer is not on the requested surface");
92 tinyds_server_get_output_size(server, &output_w, &output_h);
94 server->output_x = view->x + (event->x * output_w);
95 server->output_y = view->y + (event->y * output_h);
97 tinyds_server_view_at(server, server->output_x, server->output_y, &sx, &sy);
99 ds_inf("notify motion: sx:%.2f sy:%.2f, output_x:%.1f, output_y:%.1f",
100 sx, sy, server->output_x, server->output_y);
102 ds_seat_pointer_notify_motion(input_devicemgr->seat, event->time_msec,
107 devicemgr_handle_destroy(struct wl_listener *listener, void *data TINYDS_UNUSED)
109 struct tinyds_input_devicemgr *input_devicemgr =
110 wl_container_of(listener, input_devicemgr, destroy);
112 ds_inf("input_devicemgr (%p) destroy", input_devicemgr);
114 input_devicemgr->free_cb(data);
116 wl_list_remove(&input_devicemgr->destroy.link);
117 wl_list_remove(&input_devicemgr->pointer_warp.link);
119 free(input_devicemgr);
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)
126 struct tinyds_input_devicemgr *input_devicemgr;
128 input_devicemgr = calloc(1, sizeof *input_devicemgr);
129 if (!input_devicemgr)
132 input_devicemgr->free_cb = free_cb;
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");
143 input_devicemgr->seat = seat;
145 devicemgr_set_keymap(input_devicemgr->devicemgr);
147 input_devicemgr->destroy.notify = devicemgr_handle_destroy;
148 ds_tizen_input_devicemgr_add_destroy_listener(input_devicemgr->devicemgr,
149 &input_devicemgr->destroy);
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);
155 input_devicemgr->server = (struct tinyds_server *)data;
157 ds_inf("Input Devicemgr (%p) created", input_devicemgr);
159 return input_devicemgr;
163 tinyds_input_devicemgr_set_output_size(
164 struct tinyds_input_devicemgr *input_devicemgr,
165 uint32_t width, uint32_t height)
167 ds_tizen_input_devicemgr_set_output_width_height(input_devicemgr->devicemgr,