--- /dev/null
+#include <libds-tizen/input_devicemgr.h>
+
+#include "tinyds-common.h"
+#include "tinyds-input-devicemgr.h"
+#include "tinyds-tdm.h"
+
+struct tinyds_input_devicemgr
+{
+ input_devicemgr_free_cb free_cb;
+ void *data;
+
+ struct ds_tizen_input_devicemgr *devicemgr;
+ struct ds_seat *seat;
+
+ struct wl_listener destroy;
+ struct wl_listener pointer_warp;
+
+ struct tinyds_server *server;
+};
+
+static void
+devicemgr_add_keymap_data(struct wl_list *list, const char *name, int keycode)
+{
+ struct ds_tizen_input_devicemgr_keymap_data *data;
+
+ data = calloc(1, sizeof *data);
+ if (!data) {
+ ds_err("Failed to alloc memory");
+ return;
+ }
+
+ data->name = strdup(name);
+ data->keycode = keycode;
+
+ wl_list_insert(list, &data->link);
+}
+
+static void
+devicemgr_cleanup_keymap_list(struct wl_list *list)
+{
+ struct ds_tizen_input_devicemgr_keymap_data *data, *tmp;
+
+ wl_list_for_each_safe(data, tmp, list, link) {
+ wl_list_remove(&data->link);
+ free(data->name);
+ free(data);
+ }
+}
+
+static void
+devicemgr_set_keymap(struct ds_tizen_input_devicemgr *devicemgr)
+{
+ struct wl_list keymap_list;
+ bool res;
+
+ wl_list_init(&keymap_list);
+
+ devicemgr_add_keymap_data(&keymap_list, "XF86VolumeRaise", 455);
+ devicemgr_add_keymap_data(&keymap_list, "XF86VolumeLower", 456);
+ devicemgr_add_keymap_data(&keymap_list, "XF86LightOn", 457);
+ devicemgr_add_keymap_data(&keymap_list, "XF86LightOff", 458);
+
+ res = ds_tizen_input_devicemgr_set_keymap_list(devicemgr, &keymap_list);
+ if (!res)
+ ds_inf("Failed to set keymap");
+
+ devicemgr_cleanup_keymap_list(&keymap_list);
+}
+
+static void
+devicemgr_handle_pointer_warp(struct wl_listener *listener, void *data)
+{
+ struct ds_tizen_input_devicemgr_event_pointer_warp *event = data;
+ struct tinyds_input_devicemgr *input_devicemgr =
+ wl_container_of(listener, input_devicemgr, pointer_warp);
+ struct tinyds_server *server = input_devicemgr->server;
+ struct tinyds_view *view = NULL;
+ double sx = 0.f, sy = 0.f;
+ int output_w = 0, output_h = 0;
+
+ ds_inf("Pointer warp: surface(%p) x(%.2f) y(%.2f)", event->surface,
+ event->x, event->y);
+
+ view = tinyds_server_get_focused_view(server);
+ if (!view) return;
+
+ if (event->surface != ds_xdg_surface_get_surface(view->xdg_surface)) {
+ ds_inf("Pointer is not on the requested surface");
+ return;
+ }
+
+ tinyds_server_get_output_size(server, &output_w, &output_h);
+
+ server->output_x = view->x + (event->x * output_w);
+ server->output_y = view->y + (event->y * output_h);
+
+ tinyds_server_view_at(server, server->output_x, server->output_y, &sx, &sy);
+
+ ds_inf("notify motion: sx:%.2f sy:%.2f, output_x:%.1f, output_y:%.1f",
+ sx, sy, server->output_x, server->output_y);
+
+ ds_seat_pointer_notify_motion(input_devicemgr->seat, event->time_msec,
+ sx, sy);
+}
+
+static void
+devicemgr_handle_destroy(struct wl_listener *listener, void *data TINYDS_UNUSED)
+{
+ struct tinyds_input_devicemgr *input_devicemgr =
+ wl_container_of(listener, input_devicemgr, destroy);
+
+ ds_inf("input_devicemgr (%p) destroy", input_devicemgr);
+
+ input_devicemgr->free_cb(data);
+
+ wl_list_remove(&input_devicemgr->destroy.link);
+ wl_list_remove(&input_devicemgr->pointer_warp.link);
+
+ free(input_devicemgr);
+}
+
+struct tinyds_input_devicemgr *
+tinyds_input_devicemgr_init(struct ds_backend *input_backend,
+ struct ds_seat *seat, input_devicemgr_free_cb free_cb, void *data)
+{
+ struct tinyds_input_devicemgr *input_devicemgr;
+
+ input_devicemgr = calloc(1, sizeof *input_devicemgr);
+ if (!input_devicemgr)
+ return NULL;
+
+ input_devicemgr->free_cb = free_cb;
+ data = data;
+
+ input_devicemgr->devicemgr = ds_tizen_input_devicemgr_create(
+ input_backend, seat);
+ if (!input_devicemgr->devicemgr) {
+ free(input_devicemgr);
+ ds_err("Could not create ds_tizen_input_devicemgr");
+ return NULL;
+ }
+
+ input_devicemgr->seat = seat;
+
+ devicemgr_set_keymap(input_devicemgr->devicemgr);
+
+ input_devicemgr->destroy.notify = devicemgr_handle_destroy;
+ ds_tizen_input_devicemgr_add_destroy_listener(input_devicemgr->devicemgr,
+ &input_devicemgr->destroy);
+
+ input_devicemgr->pointer_warp.notify = devicemgr_handle_pointer_warp;
+ ds_tizen_input_devicemgr_add_pointer_warp_listener(input_devicemgr->devicemgr,
+ &input_devicemgr->pointer_warp);
+
+ input_devicemgr->server = (struct tinyds_server *)data;
+
+ ds_inf("Input Devicemgr (%p) created", input_devicemgr);
+
+ return input_devicemgr;
+}
+
+void
+tinyds_input_devicemgr_set_output_size(
+ struct tinyds_input_devicemgr *input_devicemgr,
+ uint32_t width, uint32_t height)
+{
+ ds_tizen_input_devicemgr_set_output_width_height(input_devicemgr->devicemgr,
+ width, height);
+}
struct ds_input_device *dev);
static void server_add_touch(struct tinyds_server *server,
struct ds_input_device *dev);
-static struct tinyds_view *
-server_view_at(struct tinyds_server *server, double lx, double ly,
- double *sx, double *sy);
-
static bool add_new_text_input(struct tinyds_server *server);
static bool add_new_input_method(struct tinyds_server *server);
static bool add_new_input_method_context(
output->output_frame.notify = output_handle_frame;
ds_output_add_frame_listener(ds_output, &output->output_frame);
- ds_tizen_input_devicemgr_set_output_width_height(server->devicemgr, (uint32_t)output->width, (uint32_t)output->height);
+ tinyds_input_devicemgr_set_output_size(server->input_devicemgr, (uint32_t)output->width, (uint32_t)output->height);
server->output = output;
server->output_x = (double)(output->width) / 2;
}
static void
-devicemgr_add_keymap_data(struct wl_list *list, const char *name, int keycode)
-{
- struct ds_tizen_input_devicemgr_keymap_data *data;
-
- data = calloc(1, sizeof *data);
- if (!data) {
- ds_err("Failed to alloc memory");
- return;
- }
-
- data->name = strdup(name);
- data->keycode = keycode;
-
- wl_list_insert(list, &data->link);
-}
-
-static void
-devicemgr_cleanup_keymap_list(struct wl_list *list)
-{
- struct ds_tizen_input_devicemgr_keymap_data *data, *tmp;
-
- wl_list_for_each_safe(data, tmp, list, link) {
- wl_list_remove(&data->link);
- free(data->name);
- free(data);
- }
-}
-
-static void
-devicemgr_set_keymap(struct ds_tizen_input_devicemgr *devicemgr)
-{
- struct wl_list keymap_list;
- bool res;
-
- wl_list_init(&keymap_list);
-
- devicemgr_add_keymap_data(&keymap_list, "XF86VolumeRaise", 455);
- devicemgr_add_keymap_data(&keymap_list, "XF86VolumeLower", 456);
- devicemgr_add_keymap_data(&keymap_list, "XF86LightOn", 457);
- devicemgr_add_keymap_data(&keymap_list, "XF86LightOff", 458);
-
- res = ds_tizen_input_devicemgr_set_keymap_list(devicemgr, &keymap_list);
- if (!res)
- ds_inf("Failed to set keymap");
-
- devicemgr_cleanup_keymap_list(&keymap_list);
-}
-
-static void
-devicemgr_handle_pointer_warp(struct wl_listener *listener, void *data)
-{
- struct tinyds_server *server;
- struct tinyds_pointer *pointer;
- struct ds_tizen_input_devicemgr_event_pointer_warp *event = data;
- double sx = 0.f, sy = 0.f;
- struct tinyds_view *view = NULL;
-
- server = wl_container_of(listener, server, pointer_warp);
-
- ds_inf("Pointer warp: surface(%p) x(%.2f) y(%.2f)", event->surface,
- event->x, event->y);
-
- wl_list_for_each(pointer, &server->pointers, link){
- if (!pointer->focused_view) continue;
- view = pointer->focused_view;
- }
- if (!view) return;
-
- if (event->surface != ds_xdg_surface_get_surface(view->xdg_surface)) {
- ds_inf("Pointer is not on the requested surface");
- return;
- }
-
- server->output_x = view->x + (event->x * server->output->width);
- server->output_y = view->y + (event->y * server->output->height);
-
- server_view_at(server, server->output_x, server->output_y, &sx, &sy);
-
- ds_inf("notify motion: sx:%.2f sy:%.2f, output_x:%.1f, output_y:%.1f",
- sx, sy, server->output_x, server->output_y);
-
- ds_seat_pointer_notify_motion(server->seat,
- event->time_msec, sx, sy);
-}
-
-static void
-devicemgr_handle_destroy(struct wl_listener *listener, void *data TINYDS_UNUSED)
-{
- struct tinyds_server *server =
- wl_container_of(listener, server, devicemgr_destroy);
-
- wl_list_remove(&server->devicemgr_destroy.link);
- wl_list_remove(&server->pointer_warp.link);
-
- server->devicemgr = NULL;
-}
-
-
-static void
dpms_free_func(void *data)
{
struct tinyds_server *server = (struct tinyds_server *)data;
server->launch = NULL;
}
+static void
+input_devicemgr_free_func(void *data)
+{
+ struct tinyds_server *server = (struct tinyds_server *)data;
+
+ server->input_devicemgr = NULL;
+}
+
static bool
init_server(struct tinyds_server *server, struct wl_display *display)
{
goto err;
server->seat_caps = 0;
- server->devicemgr = ds_tizen_input_devicemgr_create(
- server->input_backend, server->seat);
- if (!server->devicemgr) {
- ds_err("Could not create ds_tizen_input_devicemgr");
+ server->input_devicemgr = tinyds_input_devicemgr_init(server->input_backend,
+ server->seat, input_devicemgr_free_func, (void *)server);
+ if (!server->input_devicemgr)
goto err;
- }
-
- devicemgr_set_keymap(server->devicemgr);
-
- server->devicemgr_destroy.notify = devicemgr_handle_destroy;
- ds_tizen_input_devicemgr_add_destroy_listener(server->devicemgr,
- &server->devicemgr_destroy);
-
- server->pointer_warp.notify = devicemgr_handle_pointer_warp;
- ds_tizen_input_devicemgr_add_pointer_warp_listener(server->devicemgr,
- &server->pointer_warp);
if (!add_new_text_input(server))
goto err;
free(kbd);
}
-static struct tinyds_view *
-server_view_at(struct tinyds_server *server, double lx, double ly,
+struct tinyds_view *
+tinyds_server_view_at(struct tinyds_server *server, double lx, double ly,
double *sx, double *sy)
{
struct tinyds_view *view;
ds_inf("Touch(%p) event down: id(%d) x %.3f y %.3f output_x %.1f output_y %.1f",
touch->dev, event->id, event->x, event->y, server->output_x, server->output_y);
- view = server_view_at(server, server->output_x, server->output_y, &sx, &sy);
+ view = tinyds_server_view_at(server, server->output_x, server->output_y, &sx, &sy);
if (view) {
ds_seat_touch_notify_down(touch->server->seat, ds_xdg_surface_get_surface(view->xdg_surface),
ds_inf("Touch(%p) event motion: id(%d) x %.3f y %.3f output_x %.1f output_y %.1f",
touch->dev, event->id, event->x, event->y, server->output_x, server->output_y);
- view = server_view_at(server, server->output_x, server->output_y, &sx, &sy);
+ view = tinyds_server_view_at(server, server->output_x, server->output_y, &sx, &sy);
if (view) {
ds_seat_touch_notify_motion(server->seat, event->time_msec,
ds_inf("Pointer(%p) motion: (delta_x %.1f delta_y %.1f) output_x %.1f output_y %.1f",
pointer, event->delta_x, event->delta_y, server->output_x, server->output_y);
- view = server_view_at(pointer->server, server->output_x, server->output_y, &sx, &sy);
+ view = tinyds_server_view_at(pointer->server, server->output_x, server->output_y, &sx, &sy);
if (pointer->focused_view != view) {
if (pointer->focused_view) {
return true;
}
+
+struct tinyds_view *
+tinyds_server_get_focused_view(struct tinyds_server *server)
+{
+ struct tinyds_view *view = NULL;
+ struct tinyds_pointer *pointer;
+
+ wl_list_for_each(pointer, &server->pointers, link){
+ if (!pointer->focused_view) continue;
+
+ view = pointer->focused_view;
+ }
+
+ return view;
+}
+
+void
+tinyds_server_get_output_size(struct tinyds_server *server,
+ int *output_w, int *output_h)
+{
+ *output_w = server->output->width;
+ *output_h = server->output->height;
+}
\ No newline at end of file