[PATCH weston 7/7] desktop-shell/client: Add left/right panel position (basic) support

Quentin Glidic sardemff7+wayland at sardemff7.net
Thu Jun 23 16:55:24 UTC 2016


From: Quentin Glidic <sardemff7+git at sardemff7.net>

Signed-off-by: Quentin Glidic <sardemff7+git at sardemff7.net>
---
 clients/desktop-shell.c | 42 ++++++++++++++++++++++++++++++++++++++----
 1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
index 0f2af73..1886ebc 100644
--- a/clients/desktop-shell.c
+++ b/clients/desktop-shell.c
@@ -98,6 +98,7 @@ struct panel {
 	struct wl_list launcher_list;
 	struct panel_clock *clock;
 	int painted;
+	enum weston_desktop_shell_panel_position panel_position;
 	enum clock_format clock_format;
 	uint32_t color;
 };
@@ -470,20 +471,28 @@ panel_resize_handler(struct widget *widget,
 {
 	struct panel_launcher *launcher;
 	struct panel *panel = data;
+	int bx = width / 2;
 	int by = height / 2;
 	int spacing = 10;
 	int x = spacing;
 	int y = spacing;
 	int w, h;
+	int horizontal = panel->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_TOP || panel->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_BOTTOM;
 
 	wl_list_for_each(launcher, &panel->launcher_list, link) {
 		w = cairo_image_surface_get_width(launcher->icon);
 		h = cairo_image_surface_get_height(launcher->icon);
 
+		if (horizontal)
 			y = by - h / 2;
+		else
+			x = bx - w / 2;
 		widget_set_allocation(launcher->widget,
 				      x, y, w + 1, h + 1);
+		if (horizontal)
 			x += w + spacing;
+		else
+			y += h + spacing;
 	}
 
 	h = 20;
@@ -493,8 +502,13 @@ panel_resize_handler(struct widget *widget,
 	else /* CLOCK_FORMAT_MINUTES */
 		w = 170;
 
+	if (horizontal) {
 		x = width - w - spacing;
 		y = by - h / 2;
+	} else {
+		x = bx - w / 2;
+		y = height - h - spacing;
+	}
 
 	if (panel->clock)
 		widget_set_allocation(panel->clock->widget,
@@ -507,10 +521,30 @@ panel_configure(void *data,
 		uint32_t edges, struct window *window,
 		int32_t width, int32_t height)
 {
+	struct desktop *desktop = data;
 	struct surface *surface = window_get_user_data(window);
 	struct panel *panel = container_of(surface, struct panel, base);
 
+	switch (desktop->panel_position) {
+	case WESTON_DESKTOP_SHELL_PANEL_POSITION_TOP:
+	case WESTON_DESKTOP_SHELL_PANEL_POSITION_BOTTOM:
 		height = 32;
+		break;
+	case WESTON_DESKTOP_SHELL_PANEL_POSITION_LEFT:
+	case WESTON_DESKTOP_SHELL_PANEL_POSITION_RIGHT:
+		switch (desktop->clock_format) {
+		case CLOCK_FORMAT_NONE:
+			width = 32;
+			break;
+		case CLOCK_FORMAT_MINUTES:
+			width = 170;
+			break;
+		case CLOCK_FORMAT_SECONDS:
+			width = 190;
+			break;
+		}
+		break;
+	}
 	window_schedule_resize(panel->window, width, height);
 }
 
@@ -568,6 +602,7 @@ panel_create(struct desktop *desktop)
 	widget_set_redraw_handler(panel->widget, panel_redraw_handler);
 	widget_set_resize_handler(panel->widget, panel_resize_handler);
 
+	panel->panel_position = desktop->panel_position;
 	panel->clock_format = desktop->clock_format;
 	if (panel->clock_format != CLOCK_FORMAT_NONE)
 		panel_add_clock(panel);
@@ -1343,11 +1378,10 @@ parse_panel_position(struct desktop *desktop, struct weston_config_section *s)
 	free(position);
 
 	if (desktop->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_TOP
-	    || desktop->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_BOTTOM) {
+	    || desktop->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_BOTTOM
+	    || desktop->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_LEFT
+	    || desktop->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_RIGHT) {
 		desktop->want_panel = 1;
-	} else if (desktop->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_LEFT
-		   || desktop->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_RIGHT) {
-		fprintf(stderr, "Unsupported panel position\n");
 	}
 }
 
-- 
2.9.0



More information about the wayland-devel mailing list