1*4882a593SmuzhiyunFrom a4e18a685595729f526a8cf4b45408c6622ff063 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Thu, 2 Jun 2022 19:00:40 +0800
4*4882a593SmuzhiyunSubject: [PATCH 69/93] desktop-shell: Support setting panel scale in
5*4882a593Smuzhiyun weston.ini
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunTested with:
8*4882a593Smuzhiyun[shell]
9*4882a593Smuzhiyunpanel-scale=2
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
12*4882a593Smuzhiyun---
13*4882a593Smuzhiyun clients/desktop-shell.c | 41 ++++++++++++++++++++++++++---------------
14*4882a593Smuzhiyun 1 file changed, 26 insertions(+), 15 deletions(-)
15*4882a593Smuzhiyun
16*4882a593Smuzhiyundiff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
17*4882a593Smuzhiyunindex a5d59a5..2a1e70e 100644
18*4882a593Smuzhiyun--- a/clients/desktop-shell.c
19*4882a593Smuzhiyun+++ b/clients/desktop-shell.c
20*4882a593Smuzhiyun@@ -110,6 +110,7 @@ struct panel {
21*4882a593Smuzhiyun 	enum weston_desktop_shell_panel_position panel_position;
22*4882a593Smuzhiyun 	enum clock_format clock_format;
23*4882a593Smuzhiyun 	uint32_t color;
24*4882a593Smuzhiyun+	double scale;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun struct background {
28*4882a593Smuzhiyun@@ -242,17 +243,18 @@ panel_launcher_redraw_handler(struct widget *widget, void *data)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun 	struct panel_launcher *launcher = data;
31*4882a593Smuzhiyun 	struct rectangle allocation;
32*4882a593Smuzhiyun+	double scale = launcher->panel->scale;
33*4882a593Smuzhiyun 	cairo_t *cr;
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun 	cr = widget_cairo_create(launcher->panel->widget);
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun 	widget_get_allocation(widget, &allocation);
38*4882a593Smuzhiyun 	allocation.x += allocation.width / 2 -
39*4882a593Smuzhiyun-		cairo_image_surface_get_width(launcher->icon) / 2;
40*4882a593Smuzhiyun+		cairo_image_surface_get_width(launcher->icon) * scale / 2;
41*4882a593Smuzhiyun 	if (allocation.width > allocation.height)
42*4882a593Smuzhiyun 		allocation.x += allocation.width / 2 - allocation.height / 2;
43*4882a593Smuzhiyun 	allocation.y += allocation.height / 2 -
44*4882a593Smuzhiyun-		cairo_image_surface_get_height(launcher->icon) / 2;
45*4882a593Smuzhiyun+		cairo_image_surface_get_height(launcher->icon) * scale / 2;
46*4882a593Smuzhiyun 	if (allocation.height > allocation.width)
47*4882a593Smuzhiyun 		allocation.y += allocation.height / 2 - allocation.width / 2;
48*4882a593Smuzhiyun 	if (launcher->pressed) {
49*4882a593Smuzhiyun@@ -260,14 +262,15 @@ panel_launcher_redraw_handler(struct widget *widget, void *data)
50*4882a593Smuzhiyun 		allocation.y++;
51*4882a593Smuzhiyun 	}
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun+	cairo_scale(cr, scale, scale);
54*4882a593Smuzhiyun 	cairo_set_source_surface(cr, launcher->icon,
55*4882a593Smuzhiyun-				 allocation.x, allocation.y);
56*4882a593Smuzhiyun+				 allocation.x / scale, allocation.y / scale);
57*4882a593Smuzhiyun 	cairo_paint(cr);
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun 	if (launcher->focused) {
60*4882a593Smuzhiyun 		cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.4);
61*4882a593Smuzhiyun 		cairo_mask_surface(cr, launcher->icon,
62*4882a593Smuzhiyun-				   allocation.x, allocation.y);
63*4882a593Smuzhiyun+				   allocation.x / scale, allocation.y / scale);
64*4882a593Smuzhiyun 	}
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun 	cairo_destroy(cr);
67*4882a593Smuzhiyun@@ -394,6 +397,8 @@ panel_clock_redraw_handler(struct widget *widget, void *data)
68*4882a593Smuzhiyun 	time_t rawtime;
69*4882a593Smuzhiyun 	struct tm * timeinfo;
70*4882a593Smuzhiyun 	char string[128];
71*4882a593Smuzhiyun+	double scale = clock->panel->scale;
72*4882a593Smuzhiyun+	int spacing = DEFAULT_SPACING * scale;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun 	time(&rawtime);
75*4882a593Smuzhiyun 	timeinfo = localtime(&rawtime);
76*4882a593Smuzhiyun@@ -404,11 +409,11 @@ panel_clock_redraw_handler(struct widget *widget, void *data)
77*4882a593Smuzhiyun 		return;
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun 	cr = widget_cairo_create(clock->panel->widget);
80*4882a593Smuzhiyun-	cairo_set_font_size(cr, 14);
81*4882a593Smuzhiyun+	cairo_set_font_size(cr, 14 * scale);
82*4882a593Smuzhiyun 	cairo_text_extents(cr, string, &extents);
83*4882a593Smuzhiyun 	if (allocation.x > 0)
84*4882a593Smuzhiyun 		allocation.x +=
85*4882a593Smuzhiyun-			allocation.width - DEFAULT_SPACING * 1.5 - extents.width;
86*4882a593Smuzhiyun+			allocation.width - spacing * 1.5 - extents.width;
87*4882a593Smuzhiyun 	else
88*4882a593Smuzhiyun 		allocation.x +=
89*4882a593Smuzhiyun 			allocation.width / 2 - extents.width / 2;
90*4882a593Smuzhiyun@@ -499,8 +504,10 @@ panel_resize_handler(struct widget *widget,
91*4882a593Smuzhiyun 	int w = height > width ? width : height;
92*4882a593Smuzhiyun 	int h = w;
93*4882a593Smuzhiyun 	int horizontal = panel->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_TOP || panel->panel_position == WESTON_DESKTOP_SHELL_PANEL_POSITION_BOTTOM;
94*4882a593Smuzhiyun-	int first_pad_h = horizontal ? 0 : DEFAULT_SPACING / 2;
95*4882a593Smuzhiyun-	int first_pad_w = horizontal ? DEFAULT_SPACING / 2 : 0;
96*4882a593Smuzhiyun+	double scale = panel->scale;
97*4882a593Smuzhiyun+	int spacing = DEFAULT_SPACING * scale;
98*4882a593Smuzhiyun+	int first_pad_h = horizontal ? 0 : spacing / 2;
99*4882a593Smuzhiyun+	int first_pad_w = horizontal ? spacing / 2 : 0;
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun 	wl_list_for_each(launcher, &panel->launcher_list, link) {
102*4882a593Smuzhiyun 		widget_set_allocation(launcher->widget, x, y,
103*4882a593Smuzhiyun@@ -513,14 +520,14 @@ panel_resize_handler(struct widget *widget,
104*4882a593Smuzhiyun 	}
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun 	if (panel->clock_format == CLOCK_FORMAT_SECONDS)
107*4882a593Smuzhiyun-		w = 170;
108*4882a593Smuzhiyun+		w = 170 * scale;
109*4882a593Smuzhiyun 	else /* CLOCK_FORMAT_MINUTES and 24H versions */
110*4882a593Smuzhiyun-		w = 150;
111*4882a593Smuzhiyun+		w = 150 * scale;
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun 	if (horizontal)
114*4882a593Smuzhiyun 		x = width - w;
115*4882a593Smuzhiyun 	else
116*4882a593Smuzhiyun-		y = height - (h = DEFAULT_SPACING * 3);
117*4882a593Smuzhiyun+		y = height - (h = spacing * 3);
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun 	if (panel->clock)
120*4882a593Smuzhiyun 		widget_set_allocation(panel->clock->widget,
121*4882a593Smuzhiyun@@ -552,21 +559,21 @@ panel_configure(void *data,
122*4882a593Smuzhiyun 	switch (desktop->panel_position) {
123*4882a593Smuzhiyun 	case WESTON_DESKTOP_SHELL_PANEL_POSITION_TOP:
124*4882a593Smuzhiyun 	case WESTON_DESKTOP_SHELL_PANEL_POSITION_BOTTOM:
125*4882a593Smuzhiyun-		height = 32;
126*4882a593Smuzhiyun+		height = 32 * panel->scale;
127*4882a593Smuzhiyun 		break;
128*4882a593Smuzhiyun 	case WESTON_DESKTOP_SHELL_PANEL_POSITION_LEFT:
129*4882a593Smuzhiyun 	case WESTON_DESKTOP_SHELL_PANEL_POSITION_RIGHT:
130*4882a593Smuzhiyun 		switch (desktop->clock_format) {
131*4882a593Smuzhiyun 		case CLOCK_FORMAT_NONE:
132*4882a593Smuzhiyun-			width = 32;
133*4882a593Smuzhiyun+			width = 32 * panel->scale;
134*4882a593Smuzhiyun 			break;
135*4882a593Smuzhiyun 		case CLOCK_FORMAT_MINUTES:
136*4882a593Smuzhiyun 		case CLOCK_FORMAT_MINUTES_24H:
137*4882a593Smuzhiyun 		case CLOCK_FORMAT_SECONDS_24H:
138*4882a593Smuzhiyun-			width = 150;
139*4882a593Smuzhiyun+			width = 150 * panel->scale;
140*4882a593Smuzhiyun 			break;
141*4882a593Smuzhiyun 		case CLOCK_FORMAT_SECONDS:
142*4882a593Smuzhiyun-			width = 170;
143*4882a593Smuzhiyun+			width = 170 * panel->scale;
144*4882a593Smuzhiyun 			break;
145*4882a593Smuzhiyun 		}
146*4882a593Smuzhiyun 		break;
147*4882a593Smuzhiyun@@ -636,6 +643,10 @@ panel_create(struct desktop *desktop, struct output *output)
148*4882a593Smuzhiyun 	s = weston_config_get_section(desktop->config, "shell", NULL, NULL);
149*4882a593Smuzhiyun 	weston_config_section_get_color(s, "panel-color",
150*4882a593Smuzhiyun 					&panel->color, 0xaa000000);
151*4882a593Smuzhiyun+	weston_config_section_get_double(s, "panel-scale",
152*4882a593Smuzhiyun+					 &panel->scale, 1.0f);
153*4882a593Smuzhiyun+	if (!panel->scale)
154*4882a593Smuzhiyun+		panel->scale = 1.0f;
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun 	panel_add_launchers(panel, desktop);
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun--
159*4882a593Smuzhiyun2.20.1
160*4882a593Smuzhiyun
161