1*4882a593SmuzhiyunFrom a9aadf9c310805dd43866c494b01ce891158eedd 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 68/79] 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 6cf21da..a81eb0a 100644 18*4882a593Smuzhiyun--- a/clients/desktop-shell.c 19*4882a593Smuzhiyun+++ b/clients/desktop-shell.c 20*4882a593Smuzhiyun@@ -109,6 +109,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