downstream: ivi-shell: Add keyboard grab 01/32701/1
authorJanos Kovacs <jankovac503@gmail.com>
Fri, 19 Dec 2014 11:55:31 +0000 (13:55 +0200)
committerJan Ekström <jan.ekstrom@intel.com>
Mon, 22 Dec 2014 13:23:17 +0000 (15:23 +0200)
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 <jonathan.maw@codethink.co.uk> on 24 of Oct 2014

Change-Id: I8d368df1f687a071e8a8876d391f8096bde7c78a

ivi-shell/ivi-layout-private.h
ivi-shell/ivi-layout.c

index 14d44db..899603c 100644 (file)
@@ -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;
index 40a70db..9814761 100644 (file)
@@ -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)