wl_list_init(&server.views);
wl_signal_init(&server.events.focus_change);
+ wl_signal_init(&server.events.top_change);
server.compositor = ds_compositor_create(server.display);
HEADLESS_CHECK(server.compositor, goto end, "Failed to create ds_compositor");
{
ds_inf("view(%p) destroyed", view);
+ wl_signal_emit(&view->events.destroy, view);
+
wl_list_remove(&view->commit.link);
wl_list_remove(&view->map.link);
wl_list_remove(&view->unmap.link);
view = wl_container_of(listener, view, shell_surface_destroy);
server = view->server;
- if (server->top_view == view)
+ if (server->top_view == view) {
server->top_view = NULL;
+ wl_signal_emit(&server->events.top_change, NULL);
+ }
server_schedule_idle_task(server);
view->shell_surface = shell_surface;
view->surface = headless_shell_surface_get_surface(shell_surface);
+ wl_signal_init(&view->events.destroy);
+
view->shell_surface_destroy.notify = view_handle_shell_surface_destroy;
headless_shell_surface_add_destroy_listener(shell_surface,
&view->shell_surface_destroy);
}
server->top_view = view;
+
+ wl_signal_emit(&server->events.top_change, view);
}
static void
#include <libds/input_device.h>
#include <libds/keyboard.h>
#include <libds/seat.h>
+#include <libds-tizen/keyrouter.h>
#include <xkbcommon/xkbcommon.h>
#include "headless_server.h"
{
headless_server_t *server;
headless_keyboard_t *keyboard;
+ headless_view_t *top_view;
struct ds_backend *backend;
struct ds_seat *seat;
+ struct ds_tizen_keyrouter *keyrouter;
struct wl_listener new_input;
struct wl_listener focus_change;
+ struct wl_listener top_change;
+ struct wl_listener top_view_destroy;
};
struct headless_keyboard
struct wl_listener key;
};
-static void handle_focus_change(struct wl_listener *listener, void *data);
static void handle_new_input(struct wl_listener *listener, void *data);
+static void handle_focus_change(struct wl_listener *listener, void *data);
+static void handle_top_change(struct wl_listener *listener, void *data);
+static void handle_top_view_destroy(struct wl_listener *listener, void *data);
static headless_keyboard_t *create_keyboard(headless_input_t *input,
struct ds_input_device *dev);
static void keyboard_destroy(headless_keyboard_t *keyboard);
goto err_backend;
}
+ input->keyrouter = ds_tizen_keyrouter_create(server->display);
+ if (!input->keyrouter) {
+ ds_err("Could not create ds_tizen_keyrouter");
+ goto err_keyrouter;
+ }
+
input->seat = ds_seat_create(server->display, "seat0");
if (!input->seat) {
ds_err("Could not create ds_seat");
input->focus_change.notify = handle_focus_change;
wl_signal_add(&server->events.focus_change, &input->focus_change);
+ input->top_change.notify = handle_top_change;
+ wl_signal_add(&server->events.top_change, &input->top_change);
+
ds_backend_start(input->backend);
ds_inf("Created Headless input(%p)", input);
return input;
err_seat:
+err_keyrouter:
ds_backend_destroy(input->backend);
err_backend:
free(input);
if (input->keyboard)
keyboard_destroy(input->keyboard);
+ if (input->top_view_destroy.notify)
+ wl_list_remove(&input->top_view_destroy.link);
+
+ wl_list_remove(&input->top_change.link);
wl_list_remove(&input->focus_change.link);
wl_list_remove(&input->new_input.link);
}
static void
+handle_top_change(struct wl_listener *listener, void *data)
+{
+ headless_input_t *input;
+ headless_view_t *view = data;
+
+ input = wl_container_of(listener, input, top_change);
+
+ input->top_view = view;
+
+ if (input->top_view_destroy.notify)
+ wl_list_remove(&input->top_view_destroy.link);
+ else
+ input->top_view_destroy.notify = handle_top_view_destroy;
+
+ wl_signal_add(&view->events.destroy, &input->top_view_destroy);
+}
+
+static void
+handle_top_view_destroy(struct wl_listener *listener, void *data)
+{
+ headless_input_t *input;
+
+ input = wl_container_of(listener, input, top_view_destroy);
+
+ wl_list_remove(&input->top_view_destroy.link);
+
+ input->top_view_destroy.notify = NULL;
+ input->top_view = NULL;
+}
+
+static void
handle_new_input(struct wl_listener *listener, void *data)
{
headless_input_t *input;
context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
keymap = xkb_keymap_new_from_names(context, NULL,
XKB_KEYMAP_COMPILE_NO_FLAGS);
+
ds_keyboard_set_keymap(ds_keyboard, keymap);
xkb_keymap_unref(keymap);
xkb_context_unref(context);
static void
keyboard_handle_key(struct wl_listener *listener, void *data)
{
+ headless_input_t *input;
headless_keyboard_t *keyboard;
- struct ds_event_keyboard_key *event = data;
+ struct ds_event_keyboard_key *ev = data;
keyboard = wl_container_of(listener, keyboard, key);
+ input = keyboard->input;
- ds_inf("Keyboard(%p) key: keycode(%d), state(%d), time_msec(%d), "
- "update_state(%d)", keyboard, event->keycode, event->state,
- event->time_msec, event->update_state);
+ ds_dbg("Keyboard(%p) KEY(%d) %s time_msec(%d) update_state(%d)", keyboard,
+ ev->keycode, (ev->state == 0) ? "RELEASED" : "PRESSED",
+ ev->time_msec, ev->update_state);
- ds_seat_keyboard_notify_key(keyboard->input->seat, event->time_msec,
- event->keycode, event->state);
+ ds_tizen_keyrouter_notify_key(input->keyrouter, input->seat,
+ input->top_view ? input->top_view->surface : NULL,
+ ev->time_msec, ev->keycode, ev->state);
}
#else
#include <pepper-evdev.h>