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