[PATCH] Bug fix client apps because of output change

Wang, Quanxian quanxian.wang at intel.com
Thu Mar 6 18:44:03 PST 2014


Ignore this, I have found a bug. After bug fixing, I will resend the patch. Sorry about that.

I have two monitors. 
VGA1(left) + HDMI3(right)

The bug is shown when you set the mode of HDMI3 to 800x600, and then move layout as HDMI3(left) + VGA1(right), and then change to mode 1920x1200.
It will have some issue.

Sorry about that.

Regards

Quanxian Wang

>-----Original Message-----
>From: Wang, Quanxian
>Sent: Thursday, March 06, 2014 6:31 PM
>To: wayland-devel at lists.freedesktop.org
>Cc: ppaalanen at gmail.com; Wang, Quanxian
>Subject: [PATCH] Bug fix client apps because of output change
>
>1)
>Width and height of Panel and Background depend on output's, therefore they
>should be bound with output changes including mode, transform and scale.
>
>2)
>Update the min_allocation before resize the panel and background window. Add
>window_set_min_allocation function because it is invisible outside window.c.
>
>Signed-off-by: Quanxian Wang <quanxian.wang at intel.com>
>---
> clients/desktop-shell.c | 80
>+++++++++++++++++++++++++++++++++++++++++++++++--
> clients/window.c        |  7 +++++
> clients/window.h        |  2 ++
> 3 files changed, 87 insertions(+), 2 deletions(-)
>
>diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index
>a0c6b6d..4373448 100644
>--- a/clients/desktop-shell.c
>+++ b/clients/desktop-shell.c
>@@ -103,6 +103,15 @@ struct output {
>
> 	struct panel *panel;
> 	struct background *background;
>+	struct {
>+		int height;
>+		int width;
>+		uint32_t refresh;
>+	} mode;
>+
>+	uint32_t interface_version;
>+	uint32_t transform;
>+	uint32_t scale;
> };
>
> struct panel_launcher {
>@@ -1145,6 +1154,45 @@ desktop_destroy_outputs(struct desktop *desktop)  }
>
> static void
>+update_output(struct output *output)
>+{
>+	struct panel *panel = output->panel;
>+	struct background *background = output->background;
>+	int width, height;
>+
>+	if (!output)
>+		return;
>+
>+	width = output->mode.width;
>+	height = output->mode.height;
>+
>+	switch (output->transform) {
>+	case WL_OUTPUT_TRANSFORM_90:
>+	case WL_OUTPUT_TRANSFORM_270:
>+	case WL_OUTPUT_TRANSFORM_FLIPPED_90:
>+	case WL_OUTPUT_TRANSFORM_FLIPPED_270:
>+		/* Swap width and height */
>+		width = output->mode.height;
>+		height = output->mode.width;
>+		break;
>+	default:
>+		break;
>+	}
>+
>+	if (output->scale != 0) {
>+		width /= output->scale;
>+		height /= output->scale;
>+	}
>+
>+	/* Set min_allocation of panel */
>+	window_set_min_allocation(panel->window, width, 32);
>+	window_set_min_allocation(background->window, width, height);
>+
>+	window_schedule_resize(background->window, width, height);
>+	window_schedule_resize(panel->window, width, 32); }
>+
>+static void
> output_handle_geometry(void *data,
>                        struct wl_output *wl_output,
>                        int x, int y,
>@@ -1157,6 +1205,11 @@ output_handle_geometry(void *data,  {
> 	struct output *output = data;
>
>+	output->transform = transform;
>+
>+	if (output->interface_version < 2)
>+		update_output(output);
>+
> 	window_set_buffer_transform(output->panel->window, transform);
> 	window_set_buffer_transform(output->background->window,
>transform);  } @@ -1169,12 +1222,29 @@ output_handle_mode(void *data,
> 		   int height,
> 		   int refresh)
> {
>+	struct output *output = data;
>+
>+	if (flags & WL_OUTPUT_MODE_CURRENT) {
>+		if (!output)
>+			return;
>+
>+		output->mode.width = width;
>+		output->mode.height = height;
>+		output->mode.refresh = refresh;
>+
>+		if (output->interface_version < 2)
>+			update_output(output);
>+	}
> }
>
> static void
> output_handle_done(void *data,
>                    struct wl_output *wl_output)  {
>+	struct output *output = data;
>+
>+	if (output->interface_version >= 2)
>+		update_output(output);
> }
>
> static void
>@@ -1184,6 +1254,11 @@ output_handle_scale(void *data,  {
> 	struct output *output = data;
>
>+	output->scale  = scale;
>+
>+	if (output->interface_version < 2)
>+		update_output(output);
>+
> 	window_set_buffer_scale(output->panel->window, scale);
> 	window_set_buffer_scale(output->background->window, scale);  } @@
>-1212,7 +1287,7 @@ output_init(struct output *output, struct desktop
>*desktop)  }
>
> static void
>-create_output(struct desktop *desktop, uint32_t id)
>+create_output(struct desktop *desktop, uint32_t id, uint32_t version)
> {
> 	struct output *output;
>
>@@ -1223,6 +1298,7 @@ create_output(struct desktop *desktop, uint32_t id)
> 	output->output =
> 		display_bind(desktop->display, id, &wl_output_interface, 2);
> 	output->server_output_id = id;
>+	output->interface_version = version;
>
> 	wl_output_add_listener(output->output, &output_listener, output);
>
>@@ -1247,7 +1323,7 @@ global_handler(struct display *display, uint32_t id,
> 					      desktop->interface_version);
> 		desktop_shell_add_listener(desktop->shell, &listener, desktop);
> 	} else if (!strcmp(interface, "wl_output")) {
>-		create_output(desktop, id);
>+		create_output(desktop, id, version);
> 	}
> }
>
>diff --git a/clients/window.c b/clients/window.c index c8287e2..6c01222 100644
>--- a/clients/window.c
>+++ b/clients/window.c
>@@ -3839,6 +3839,13 @@ undo_resize(struct window *window)  }
>
> void
>+window_set_min_allocation(struct window *window, int width, int height)
>+{
>+	window->min_allocation.width = width;
>+	window->min_allocation.height = height; }
>+
>+void
> window_schedule_resize(struct window *window, int width, int height)  {
> 	/* We should probably get these numbers from the theme. */ diff --git
>a/clients/window.h b/clients/window.h index 54b848b..b221b76 100644
>--- a/clients/window.h
>+++ b/clients/window.h
>@@ -336,6 +336,8 @@ void
> window_schedule_redraw(struct window *window);  void
>window_schedule_resize(struct window *window, int width, int height);
>+void
>+window_set_min_allocation(struct window *window, int width, int
>+height);
>
> void
> window_damage(struct window *window, int32_t x, int32_t y,
>--
>1.8.1.2



More information about the wayland-devel mailing list