compositor-wayland: Handle window close events more gracefully

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>
dev
Dima Ryazanov 10 years ago committed by Bryce Harrington
parent 7dd12ec713
commit 01d5c02c04
  1. 20
      src/compositor-wayland.c

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

Loading…
Cancel
Save