compositor-wayland: Handle window close events more gracefully
authorDima Ryazanov <dima@gmail.com>
Tue, 19 May 2015 06:14:16 +0000 (23:14 -0700)
committerBryce Harrington <bryce@osg.samsung.com>
Tue, 19 May 2015 23:42:53 +0000 (16:42 -0700)
When a compositor window is closed, remove the output instead of just exiting.

(The "if (!input->output)" checks are kind of ugly - but I couldn't find
a better way to handle the output going away.)

Signed-off-by: Dima Ryazanov <dima@gmail.com>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
src/compositor-wayland.c

index c9983e012fc33ca471d404b3d0eb500936e8d383..aaf205ba486ec10d94b032079cfcf894a7f7f4d1 100644 (file)
@@ -1307,6 +1307,9 @@ input_handle_pointer_leave(void *data, struct wl_pointer *pointer,
 {
        struct wayland_input *input = data;
 
+       if (!input->output)
+               return;
+
        if (input->output->frame) {
                frame_pointer_leave(input->output->frame, input);
 
@@ -1327,6 +1330,9 @@ input_handle_motion(void *data, struct wl_pointer *pointer,
        int32_t fx, fy;
        enum theme_location location;
 
+       if (!input->output)
+               return;
+
        if (input->output->frame) {
                location = frame_pointer_motion(input->output->frame, input,
                                                wl_fixed_to_int(x),
@@ -1368,6 +1374,9 @@ input_handle_button(void *data, struct wl_pointer *pointer,
        enum frame_button_state fstate;
        enum theme_location location;
 
+       if (!input->output)
+               return;
+
        if (input->output->frame) {
                fstate = state == WL_POINTER_BUTTON_STATE_PRESSED ?
                        FRAME_BUTTON_PRESSED : FRAME_BUTTON_RELEASED;
@@ -1384,8 +1393,15 @@ input_handle_button(void *data, struct wl_pointer *pointer,
                        return;
                }
 
-               if (frame_status(input->output->frame) & FRAME_STATUS_CLOSE)
-                       wl_display_terminate(input->compositor->base.wl_display);
+               if (frame_status(input->output->frame) & FRAME_STATUS_CLOSE) {
+                       wayland_output_destroy(&input->output->base);
+                       input->output = input->keyboard_focus = NULL;
+
+                       if (wl_list_empty(&input->compositor->base.output_list))
+                               wl_display_terminate(input->compositor->base.wl_display);
+
+                       return;
+               }
 
                if (frame_status(input->output->frame) & FRAME_STATUS_REPAINT)
                        weston_output_schedule_repaint(&input->output->base);
@@ -1521,7 +1537,7 @@ input_handle_keyboard_leave(void *data,
 
        focus = input->keyboard_focus;
        if (!focus)
-               return; /* This shouldn't happen */
+               return;
 
        focus->keyboard_count--;
        if (!focus->keyboard_count && focus->frame) {