[PATCH weston] compositor-wayland: Handle window close events more gracefully

Bryce Harrington bryce at osg.samsung.com
Tue May 19 16:41:19 PDT 2015


On Mon, May 18, 2015 at 11:14:16PM -0700, Dima Ryazanov wrote:
> 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 at gmail.com>
Reviewed-by: Bryce Harrington <bryce at osg.samsung.com>

> ---
>  src/compositor-wayland.c | 22 +++++++++++++++++++---
>  1 file changed, 19 insertions(+), 3 deletions(-)
> 
> diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
> index c9983e0..aaf205b 100644
> --- a/src/compositor-wayland.c
> +++ b/src/compositor-wayland.c
> @@ -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) {
> -- 
> 2.4.1
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list