From 725c549bf957d657faee743e921527880dc4722d Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Sat, 29 Oct 2022 12:22:47 +0900 Subject: [PATCH] examples: make tinyds-input-devicemgr files move the implementation of ds_tizen_input-devicemgr at tinyds-tdm.c to tinyds-input-devicemgr file. Change-Id: Icc37023b56d556932d5013d321f23f53050c4a6d --- examples/meson.build | 1 + examples/tinyds-input-devicemgr.c | 169 ++++++++++++++++++++++++++++++++++++++ examples/tinyds-input-devicemgr.h | 16 ++++ examples/tinyds-tdm.c | 164 +++++++++--------------------------- examples/tinyds-tdm.h | 12 ++- 5 files changed, 234 insertions(+), 128 deletions(-) create mode 100644 examples/tinyds-input-devicemgr.c create mode 100644 examples/tinyds-input-devicemgr.h diff --git a/examples/meson.build b/examples/meson.build index 9b12dd8..8de3845 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -24,6 +24,7 @@ tinyds_tdm_files = [ 'tinyds-policy.c', 'tinyds-dpms.c', 'tinyds-launch.c', + 'tinyds-input-devicemgr.c', ] executable('tinyds-tdm', diff --git a/examples/tinyds-input-devicemgr.c b/examples/tinyds-input-devicemgr.c new file mode 100644 index 0000000..c2e3b20 --- /dev/null +++ b/examples/tinyds-input-devicemgr.c @@ -0,0 +1,169 @@ +#include + +#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); +} diff --git a/examples/tinyds-input-devicemgr.h b/examples/tinyds-input-devicemgr.h new file mode 100644 index 0000000..ea40e82 --- /dev/null +++ b/examples/tinyds-input-devicemgr.h @@ -0,0 +1,16 @@ +#ifndef TINYDS_INPUT_DEVICEMGR_H +#define TINYDS_INPUT_DEVICEMGR_H + +typedef void (*input_devicemgr_free_cb)(void *data); + +struct tinyds_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); + +void tinyds_input_devicemgr_set_output_size( + struct tinyds_input_devicemgr *input_devicemgr, + uint32_t width, uint32_t height); + +#endif diff --git a/examples/tinyds-tdm.c b/examples/tinyds-tdm.c index 08084e3..31c1e2d 100644 --- a/examples/tinyds-tdm.c +++ b/examples/tinyds-tdm.c @@ -158,10 +158,6 @@ static void server_add_pointer(struct tinyds_server *server, 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( @@ -428,7 +424,7 @@ backend_handle_new_output(struct wl_listener *listener, void *data) 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; @@ -470,105 +466,6 @@ backend_handle_new_input(struct wl_listener *listener, void *data) } 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; @@ -592,6 +489,14 @@ launch_free_func(void *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) { @@ -654,22 +559,10 @@ 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; @@ -1286,8 +1179,8 @@ 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; @@ -1349,7 +1242,7 @@ touch_handle_down(struct wl_listener *listener, void *data) 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), @@ -1396,7 +1289,7 @@ touch_handle_motion(struct wl_listener *listener, void *data) 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, @@ -1506,7 +1399,7 @@ pointer_handle_motion(struct wl_listener *listener, void *data) 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) { @@ -2277,3 +2170,26 @@ add_new_input_method_context(struct tinyds_input_method *input_method, 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 diff --git a/examples/tinyds-tdm.h b/examples/tinyds-tdm.h index 0935b9b..95ff044 100644 --- a/examples/tinyds-tdm.h +++ b/examples/tinyds-tdm.h @@ -15,6 +15,7 @@ #include "tinyds-policy.h" #include "tinyds-dpms.h" #include "tinyds-launch.h" +#include "tinyds-input-devicemgr.h" struct tinyds_keyboard; struct tinyds_pointer; @@ -32,12 +33,12 @@ struct tinyds_server struct ds_seat *seat; uint32_t seat_caps; double output_x, output_y; - struct ds_tizen_input_devicemgr *devicemgr; struct tinyds_output *output; struct tinyds_dpms *dpms; struct tinyds_policy *policy; struct tinyds_launch *launch; + struct tinyds_input_devicemgr *input_devicemgr; struct wl_event_source *stdin_source; @@ -46,9 +47,6 @@ struct tinyds_server struct wl_listener new_output; struct wl_listener new_input; struct wl_listener new_xdg_surface; - struct wl_listener devicemgr_destroy; - struct wl_listener pointer_warp; - struct wl_list keyboards; struct wl_list pointers; @@ -79,4 +77,10 @@ struct tinyds_view int effect_type; }; +struct tinyds_view *tinyds_server_view_at(struct tinyds_server *server, + double lx, double ly, double *sx, double *sy); +struct tinyds_view *tinyds_server_get_focused_view(struct tinyds_server *server); +void tinyds_server_get_output_size(struct tinyds_server *server, + int *output_w, int *output_h); + #endif -- 2.7.4