From c003c0f060ec897405ec8ef54f9d4d051c0a5d86 Mon Sep 17 00:00:00 2001 From: Janos Kovacs Date: Fri, 19 Dec 2014 13:55:31 +0200 Subject: [PATCH] downstream: ivi-shell: Add keyboard grab This commit does not specify what the keyboard grabs do. That is implemented in a later commit. original patch backported to upstream Weston ivi-shell: da782dd by Jonathan Maw on 24 of Oct 2014 Change-Id: I8d368df1f687a071e8a8876d391f8096bde7c78a --- ivi-shell/ivi-layout-private.h | 2 ++ ivi-shell/ivi-layout.c | 80 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/ivi-shell/ivi-layout-private.h b/ivi-shell/ivi-layout-private.h index 14d44db..899603c 100644 --- a/ivi-shell/ivi-layout-private.h +++ b/ivi-shell/ivi-layout-private.h @@ -121,6 +121,8 @@ struct ivi_layout { struct ivi_layout_transition_set *transitions; struct wl_list pending_transition_list; + struct wl_listener seat_create_listener; + struct wl_list background_list; struct { float red, green, blue; diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index 40a70db..9814761 100644 --- a/ivi-shell/ivi-layout.c +++ b/ivi-shell/ivi-layout.c @@ -104,6 +104,12 @@ struct ivi_layout_screen { } order; }; +struct seat_ctx { + struct weston_keyboard_grab grab; + struct wl_listener updated_caps_listener; + struct wl_listener destroy_listener; +}; + struct ivi_layout_notification_callback { void *callback; void *data; @@ -2891,12 +2897,76 @@ static void parse_background_color(struct ivi_layout *layout) free(def); } +static void +keyboard_grab_key(struct weston_keyboard_grab *grab, uint32_t time, + uint32_t key, uint32_t state) +{ +} + +static void +keyboard_grab_modifiers(struct weston_keyboard_grab *grab, uint32_t serial, + uint32_t mods_depressed, uint32_t mods_latched, + uint32_t mods_locked, uint32_t group) +{ +} + +static void +keyboard_grab_cancel(struct weston_keyboard_grab *grab) +{ +} + +static struct weston_keyboard_grab_interface keyboard_grab_interface = { + keyboard_grab_key, + keyboard_grab_modifiers, + keyboard_grab_cancel +}; + +static void +handle_seat_updated_caps(struct wl_listener *listener, void *data) +{ + struct weston_seat *seat = data; + struct seat_ctx *ctx = wl_container_of(listener, ctx, + updated_caps_listener); + if (seat->keyboard && seat->keyboard != ctx->grab.keyboard) + weston_keyboard_start_grab(seat->keyboard, &ctx->grab); +} + +static void +handle_seat_destroy(struct wl_listener *listener, void *data) +{ + struct seat_ctx *ctx = wl_container_of(listener, ctx, destroy_listener); + if (ctx->grab.keyboard) + keyboard_grab_cancel(&ctx->grab); + + free(ctx); +} + +static void +handle_seat_create(struct wl_listener *listener, void *data) +{ + struct weston_seat *seat = data; + + struct seat_ctx *ctx = calloc(1, sizeof *ctx); + if (ctx == NULL) { + weston_log("%s: failed to allocate memory\n", __FUNCTION__); + return; + } + + ctx->grab.interface = &keyboard_grab_interface; + + ctx->destroy_listener.notify = &handle_seat_destroy; + wl_signal_add(&seat->destroy_signal, &ctx->destroy_listener); + + ctx->updated_caps_listener.notify = &handle_seat_updated_caps; + wl_signal_add(&seat->updated_caps_signal, &ctx->updated_caps_listener); +} static void ivi_layout_init_with_compositor(struct weston_compositor *ec) { struct ivi_layout *layout = get_layout_instance(); struct weston_output *output; + struct weston_seat *seat; layout->compositor = ec; @@ -2920,6 +2990,16 @@ ivi_layout_init_with_compositor(struct weston_compositor *ec) layout->transitions = ivi_layout_transition_set_create(ec); wl_list_init(&layout->pending_transition_list); + /* Listen to seat creation, for grab purposes */ + layout->seat_create_listener.notify = &handle_seat_create; + wl_signal_add(&ec->seat_created_signal, &layout->seat_create_listener); + + /* Handle existing seats */ + wl_list_for_each(seat, &ec->seat_list, link) { + handle_seat_create(NULL, seat); + wl_signal_emit(&seat->updated_caps_signal, seat); + } + wl_list_init(&layout->background_list); parse_background_color(layout); wl_list_for_each(output, &ec->output_list, link) -- 2.7.4