headless input: fix a crash when de-initialize itself 65/207165/1
authorSung-Jin Park <sj76.park@samsung.com>
Fri, 26 Apr 2019 07:01:59 +0000 (16:01 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 30 May 2019 08:33:37 +0000 (17:33 +0900)
Change-Id: I24379d1456f3ba61ac1c5f3a51026b3f3421abdc
Signed-off-by: Sung-Jin Park <sj76.park@samsung.com>
src/bin/headless/input.c

index 21b3d76..b74d8e1 100644 (file)
@@ -42,7 +42,6 @@ typedef struct
        pepper_event_listener_t *listener_seat_keyboard_add;
        pepper_event_listener_t *listener_seat_add;
        pepper_event_listener_t *listener_input_device_add;
-       pepper_event_listener_t *listener_input_device_remove;
 
        uint32_t ndevices;
 } headless_input_t;
@@ -96,23 +95,6 @@ _cb_handle_input_device_add(pepper_event_listener_t *listener, pepper_object_t *
                pepper_seat_add_input_device(hi->seat, device);
 }
 
-/* compositor input device remove event handler */
-static void
-_cb_handle_input_device_remove(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data)
-{
-       pepper_input_device_t *device = (pepper_input_device_t *)info;
-       headless_input_t *hi = (headless_input_t *)data;
-
-       /* temporary : only handle the removal of a keyboard device */
-       if (!(WL_SEAT_CAPABILITY_KEYBOARD & pepper_input_device_get_caps(device)))
-               return;
-
-       PEPPER_TRACE("[%s] input device removed.\n", __FUNCTION__);
-
-       if (hi->seat)
-               pepper_seat_remove_input_device(hi->seat, device);
-}
-
 /* seat add event handler */
 static void
 _cb_handle_seat_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data)
@@ -188,11 +170,6 @@ headless_input_init_event_listeners(headless_input_t *hi)
        PEPPER_CHECK(h, goto end, "Failed to add input device add listener.\n");
        hi->listener_input_device_add = h;
 
-       h = pepper_object_add_event_listener((pepper_object_t *)compositor,
-                                               PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_REMOVE, 0, _cb_handle_input_device_remove, hi);
-       PEPPER_CHECK(h, goto end, "Failed to add input device remove listener.\n");
-       hi->listener_input_device_remove = h;
-
        return;
 
 end:
@@ -207,17 +184,17 @@ headless_input_deinit_event_listeners(headless_input_t *hi)
        pepper_event_listener_remove(hi->listener_seat_keyboard_add);
        pepper_event_listener_remove(hi->listener_seat_add);
        pepper_event_listener_remove(hi->listener_input_device_add);
-       pepper_event_listener_remove(hi->listener_input_device_remove);
 
-       PEPPER_TRACE("[%s] event listeners have been removed.\n");
+       PEPPER_TRACE("[%s] event listeners have been removed.\n", __FUNCTION__);
 }
 
 static void
 headless_input_deinit_input(headless_input_t *hi)
 {
+       pepper_evdev_destroy(hi->evdev);
+
        if (hi->seat)
                pepper_seat_destroy(hi->seat);
-       pepper_evdev_destroy(hi->evdev);
 
        hi->seat = NULL;
        hi->evdev = NULL;
@@ -317,12 +294,13 @@ headless_input_deinit_modules(headless_input_t *hi)
        hi->keyrouter = NULL;
 }
 
-static void
-headless_input_deinit(void *data)
+PEPPER_API void
+headless_input_deinit(pepper_compositor_t * compositor)
 {
-       headless_input_t *hi = (headless_input_t*)data;
+       headless_input_t *hi = NULL;
 
-       if (!hi) return;
+       hi = (headless_input_t *)pepper_object_get_user_data((pepper_object_t *) compositor, &KEY_INPUT);
+       PEPPER_CHECK(hi, return, "Failed to get headless input instance.\n");
 
        headless_input_deinit_event_listeners(hi);
        headless_input_deinit_modules(hi);
@@ -347,12 +325,12 @@ headless_input_init(pepper_compositor_t *compositor)
        init = headless_input_init_input(hi);
        PEPPER_CHECK(init, goto error, "headless_input_init_input() failed\n");
 
-       pepper_object_set_user_data((pepper_object_t *)compositor, &KEY_INPUT, hi, headless_input_deinit);
+       pepper_object_set_user_data((pepper_object_t *)compositor, &KEY_INPUT, hi, NULL);
 
        return PEPPER_TRUE;
 
 error:
-       headless_input_deinit(hi);
+       headless_input_deinit(compositor);
 
        return PEPPER_FALSE;
 }