1*4882a593SmuzhiyunFrom 51d94d3310b0ced9a57b99ba7f2d64f114413f1f Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Wed, 15 Jun 2022 11:02:44 +0800 4*4882a593SmuzhiyunSubject: [PATCH 70/92] desktop-shell: Support clock without date 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunTested with: 7*4882a593Smuzhiyun[shell] 8*4882a593Smuzhiyunclock-with-date=false 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 11*4882a593Smuzhiyun--- 12*4882a593Smuzhiyun clients/desktop-shell.c | 73 ++++++++++++++++++++++++++++------------- 13*4882a593Smuzhiyun 1 file changed, 50 insertions(+), 23 deletions(-) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyundiff --git a/clients/desktop-shell.c b/clients/desktop-shell.c 16*4882a593Smuzhiyunindex 2a1e70e..0ce571a 100644 17*4882a593Smuzhiyun--- a/clients/desktop-shell.c 18*4882a593Smuzhiyun+++ b/clients/desktop-shell.c 19*4882a593Smuzhiyun@@ -76,6 +76,7 @@ struct desktop { 20*4882a593Smuzhiyun int want_panel; 21*4882a593Smuzhiyun enum weston_desktop_shell_panel_position panel_position; 22*4882a593Smuzhiyun enum clock_format clock_format; 23*4882a593Smuzhiyun+ bool clock_with_date; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct window *grab_window; 26*4882a593Smuzhiyun struct widget *grab_widget; 27*4882a593Smuzhiyun@@ -109,6 +110,7 @@ struct panel { 28*4882a593Smuzhiyun int painted; 29*4882a593Smuzhiyun enum weston_desktop_shell_panel_position panel_position; 30*4882a593Smuzhiyun enum clock_format clock_format; 31*4882a593Smuzhiyun+ bool clock_with_date; 32*4882a593Smuzhiyun uint32_t color; 33*4882a593Smuzhiyun double scale; 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun@@ -157,7 +159,7 @@ struct panel_clock { 36*4882a593Smuzhiyun struct widget *widget; 37*4882a593Smuzhiyun struct panel *panel; 38*4882a593Smuzhiyun struct toytimer timer; 39*4882a593Smuzhiyun- char *format_string; 40*4882a593Smuzhiyun+ char format_string[128]; 41*4882a593Smuzhiyun time_t refresh_timer; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun@@ -170,6 +172,36 @@ struct unlock_dialog { 45*4882a593Smuzhiyun struct desktop *desktop; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun+static int 49*4882a593Smuzhiyun+clock_get_preferred_width(enum clock_format clock_format, bool with_date) 50*4882a593Smuzhiyun+{ 51*4882a593Smuzhiyun+ int width; 52*4882a593Smuzhiyun+ 53*4882a593Smuzhiyun+ switch (clock_format) { 54*4882a593Smuzhiyun+ case CLOCK_FORMAT_NONE: 55*4882a593Smuzhiyun+ return 0; 56*4882a593Smuzhiyun+ case CLOCK_FORMAT_MINUTES: 57*4882a593Smuzhiyun+ width = 160; 58*4882a593Smuzhiyun+ break; 59*4882a593Smuzhiyun+ case CLOCK_FORMAT_MINUTES_24H: 60*4882a593Smuzhiyun+ width = 130; 61*4882a593Smuzhiyun+ break; 62*4882a593Smuzhiyun+ case CLOCK_FORMAT_SECONDS: 63*4882a593Smuzhiyun+ width = 180; 64*4882a593Smuzhiyun+ break; 65*4882a593Smuzhiyun+ case CLOCK_FORMAT_SECONDS_24H: 66*4882a593Smuzhiyun+ width = 160; 67*4882a593Smuzhiyun+ break; 68*4882a593Smuzhiyun+ default: 69*4882a593Smuzhiyun+ assert(!"not reached"); 70*4882a593Smuzhiyun+ } 71*4882a593Smuzhiyun+ 72*4882a593Smuzhiyun+ if (!with_date) 73*4882a593Smuzhiyun+ width -= 80; 74*4882a593Smuzhiyun+ 75*4882a593Smuzhiyun+ return width; 76*4882a593Smuzhiyun+} 77*4882a593Smuzhiyun+ 78*4882a593Smuzhiyun static void 79*4882a593Smuzhiyun panel_add_launchers(struct panel *panel, struct desktop *desktop); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun@@ -413,7 +445,7 @@ panel_clock_redraw_handler(struct widget *widget, void *data) 82*4882a593Smuzhiyun cairo_text_extents(cr, string, &extents); 83*4882a593Smuzhiyun if (allocation.x > 0) 84*4882a593Smuzhiyun allocation.x += 85*4882a593Smuzhiyun- allocation.width - spacing * 1.5 - extents.width; 86*4882a593Smuzhiyun+ allocation.width - spacing - extents.width; 87*4882a593Smuzhiyun else 88*4882a593Smuzhiyun allocation.x += 89*4882a593Smuzhiyun allocation.width / 2 - extents.width / 2; 90*4882a593Smuzhiyun@@ -464,21 +496,24 @@ panel_add_clock(struct panel *panel) 91*4882a593Smuzhiyun clock->panel = panel; 92*4882a593Smuzhiyun panel->clock = clock; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun+ if (panel->clock_with_date) 95*4882a593Smuzhiyun+ strcpy(clock->format_string, "%a %b %d, "); 96*4882a593Smuzhiyun+ 97*4882a593Smuzhiyun switch (panel->clock_format) { 98*4882a593Smuzhiyun case CLOCK_FORMAT_MINUTES: 99*4882a593Smuzhiyun- clock->format_string = "%a %b %d, %I:%M %p"; 100*4882a593Smuzhiyun+ strcat(clock->format_string, "%I:%M %p"); 101*4882a593Smuzhiyun clock->refresh_timer = 60; 102*4882a593Smuzhiyun break; 103*4882a593Smuzhiyun case CLOCK_FORMAT_SECONDS: 104*4882a593Smuzhiyun- clock->format_string = "%a %b %d, %I:%M:%S %p"; 105*4882a593Smuzhiyun+ strcat(clock->format_string, "%I:%M:%S %p"); 106*4882a593Smuzhiyun clock->refresh_timer = 1; 107*4882a593Smuzhiyun break; 108*4882a593Smuzhiyun case CLOCK_FORMAT_MINUTES_24H: 109*4882a593Smuzhiyun- clock->format_string = "%a %b %d, %H:%M"; 110*4882a593Smuzhiyun+ strcat(clock->format_string, "%H:%M"); 111*4882a593Smuzhiyun clock->refresh_timer = 60; 112*4882a593Smuzhiyun break; 113*4882a593Smuzhiyun case CLOCK_FORMAT_SECONDS_24H: 114*4882a593Smuzhiyun- clock->format_string = "%a %b %d, %H:%M:%S"; 115*4882a593Smuzhiyun+ strcat(clock->format_string, "%H:%M:%S"); 116*4882a593Smuzhiyun clock->refresh_timer = 1; 117*4882a593Smuzhiyun break; 118*4882a593Smuzhiyun case CLOCK_FORMAT_NONE: 119*4882a593Smuzhiyun@@ -519,10 +554,8 @@ panel_resize_handler(struct widget *widget, 120*4882a593Smuzhiyun first_pad_h = first_pad_w = 0; 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun- if (panel->clock_format == CLOCK_FORMAT_SECONDS) 124*4882a593Smuzhiyun- w = 170 * scale; 125*4882a593Smuzhiyun- else /* CLOCK_FORMAT_MINUTES and 24H versions */ 126*4882a593Smuzhiyun- w = 150 * scale; 127*4882a593Smuzhiyun+ w = clock_get_preferred_width(panel->clock_format, 128*4882a593Smuzhiyun+ panel->clock_with_date) * scale; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun if (horizontal) 131*4882a593Smuzhiyun x = width - w; 132*4882a593Smuzhiyun@@ -563,19 +596,9 @@ panel_configure(void *data, 133*4882a593Smuzhiyun break; 134*4882a593Smuzhiyun case WESTON_DESKTOP_SHELL_PANEL_POSITION_LEFT: 135*4882a593Smuzhiyun case WESTON_DESKTOP_SHELL_PANEL_POSITION_RIGHT: 136*4882a593Smuzhiyun- switch (desktop->clock_format) { 137*4882a593Smuzhiyun- case CLOCK_FORMAT_NONE: 138*4882a593Smuzhiyun- width = 32 * panel->scale; 139*4882a593Smuzhiyun- break; 140*4882a593Smuzhiyun- case CLOCK_FORMAT_MINUTES: 141*4882a593Smuzhiyun- case CLOCK_FORMAT_MINUTES_24H: 142*4882a593Smuzhiyun- case CLOCK_FORMAT_SECONDS_24H: 143*4882a593Smuzhiyun- width = 150 * panel->scale; 144*4882a593Smuzhiyun- break; 145*4882a593Smuzhiyun- case CLOCK_FORMAT_SECONDS: 146*4882a593Smuzhiyun- width = 170 * panel->scale; 147*4882a593Smuzhiyun- break; 148*4882a593Smuzhiyun- } 149*4882a593Smuzhiyun+ width = clock_get_preferred_width(desktop->clock_format, 150*4882a593Smuzhiyun+ desktop->clock_with_date); 151*4882a593Smuzhiyun+ width = MAX(32, width) * panel->scale; 152*4882a593Smuzhiyun break; 153*4882a593Smuzhiyun } 154*4882a593Smuzhiyun window_schedule_resize(panel->window, width, height); 155*4882a593Smuzhiyun@@ -637,6 +660,7 @@ panel_create(struct desktop *desktop, struct output *output) 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun panel->panel_position = desktop->panel_position; 158*4882a593Smuzhiyun panel->clock_format = desktop->clock_format; 159*4882a593Smuzhiyun+ panel->clock_with_date = desktop->clock_with_date; 160*4882a593Smuzhiyun if (panel->clock_format != CLOCK_FORMAT_NONE) 161*4882a593Smuzhiyun panel_add_clock(panel); 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun@@ -1522,6 +1546,9 @@ parse_clock_format(struct desktop *desktop, struct weston_config_section *s) 164*4882a593Smuzhiyun else 165*4882a593Smuzhiyun desktop->clock_format = DEFAULT_CLOCK_FORMAT; 166*4882a593Smuzhiyun free(clock_format); 167*4882a593Smuzhiyun+ 168*4882a593Smuzhiyun+ weston_config_section_get_bool(s, "clock-with-date", 169*4882a593Smuzhiyun+ &desktop->clock_with_date, true); 170*4882a593Smuzhiyun } 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun int main(int argc, char *argv[]) 173*4882a593Smuzhiyun-- 174*4882a593Smuzhiyun2.20.1 175*4882a593Smuzhiyun 176