diff options
author | Armin Krezović <armin.krezovic@fet.ba> | 2016-03-10 18:02:34 +0100 |
---|---|---|
committer | Bryce Harrington <bryce@osg.samsung.com> | 2016-03-10 14:58:16 -0800 |
commit | c6a55dbf0415963ee303d68b254020d5d04e05d2 (patch) | |
tree | f5c3d80f82d72df219b2d59943790d3e4685c2bc | |
parent | 0d1a6223751242387f1fe62c8da508d6035d7fbd (diff) |
desktop-shell: make panel clock configurable
This patch enhances the panel clock by adding a config file
option which can be used to either disable the clock or make
it also show seconds in the current clock format.
v2: Implement suggestions from Pekka:
- Include Signed-off-by
- Coding style fixes
- Implement clock widget allocation by using
width from cairo_text_extents
- Highlight config option values in man page
v3: Implement suggestions from Pekka and Bryce:
- Use CLOCK_FORMAT_* instead of FORMAT_* in the enum
- Switch to using fixed clock widget size instead
of one returned from cairo_text_extents
- Fixes to config option highlighting in the man page
v4: Implement more suggestions from Pekka and Bryce:
- Improve patch changelog
- Move the check for CLOCK_FORMAT_NONE into the
caller function
- Fix a memory leak in panel_create introduced by
previous revision of this patch
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=57583
Signed-off-by: Armin Krezović <armin.krezovic@fet.ba>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r-- | clients/desktop-shell.c | 58 | ||||
-rw-r--r-- | man/weston.ini.man | 7 | ||||
-rw-r--r-- | weston.ini.in | 1 |
3 files changed, 59 insertions, 7 deletions
diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 49a3077a..b9b9815f 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -50,6 +50,8 @@ #include "weston-desktop-shell-client-protocol.h" +#define DEFAULT_CLOCK_FORMAT CLOCK_FORMAT_MINUTES + extern char **environ; /* defined by libc */ struct desktop { @@ -84,6 +86,7 @@ struct panel { struct wl_list launcher_list; struct panel_clock *clock; int painted; + int clock_format; uint32_t color; }; @@ -123,6 +126,8 @@ struct panel_clock { struct panel *panel; struct task clock_task; int clock_fd; + char *format_string; + time_t refresh_timer; }; struct unlock_dialog { @@ -357,7 +362,7 @@ panel_clock_redraw_handler(struct widget *widget, void *data) time(&rawtime); timeinfo = localtime(&rawtime); - strftime(string, sizeof string, "%a %b %d, %I:%M %p", timeinfo); + strftime(string, sizeof string, clock->format_string, timeinfo); widget_get_allocation(widget, &allocation); if (allocation.width == 0) @@ -386,9 +391,9 @@ clock_timer_reset(struct panel_clock *clock) { struct itimerspec its; - its.it_interval.tv_sec = 60; + its.it_interval.tv_sec = clock->refresh_timer; its.it_interval.tv_nsec = 0; - its.it_value.tv_sec = 60; + its.it_value.tv_sec = clock->refresh_timer; its.it_value.tv_nsec = 0; if (timerfd_settime(clock->clock_fd, 0, &its, NULL) < 0) { fprintf(stderr, "could not set timerfd\n: %m"); @@ -408,6 +413,12 @@ panel_destroy_clock(struct panel_clock *clock) free(clock); } +enum { + CLOCK_FORMAT_MINUTES, + CLOCK_FORMAT_SECONDS, + CLOCK_FORMAT_NONE +}; + static void panel_add_clock(struct panel *panel) { @@ -425,6 +436,17 @@ panel_add_clock(struct panel *panel) panel->clock = clock; clock->clock_fd = timerfd; + switch (panel->clock_format) { + case CLOCK_FORMAT_MINUTES: + clock->format_string = "%a %b %d, %I:%M %p"; + clock->refresh_timer = 60; + break; + case CLOCK_FORMAT_SECONDS: + clock->format_string = "%a %b %d, %I:%M:%S %p"; + clock->refresh_timer = 1; + break; + } + clock->clock_task.run = clock_func; display_watch_fd(window_get_display(panel->window), clock->clock_fd, EPOLLIN, &clock->clock_task); @@ -451,8 +473,13 @@ panel_resize_handler(struct widget *widget, x, y - h / 2, w + 1, h + 1); x += w + 10; } - h=20; - w=170; + + h = 20; + + if (panel->clock_format == CLOCK_FORMAT_SECONDS) + w = 190; + else /* CLOCK_FORMAT_MINUTES */ + w = 170; if (panel->clock) widget_set_allocation(panel->clock->widget, @@ -493,7 +520,8 @@ panel_destroy(struct panel *panel) struct panel_launcher *tmp; struct panel_launcher *launcher; - panel_destroy_clock(panel->clock); + if (panel->clock) + panel_destroy_clock(panel->clock); wl_list_for_each_safe(launcher, tmp, &panel->launcher_list, link) panel_destroy_launcher(launcher); @@ -509,6 +537,7 @@ panel_create(struct desktop *desktop) { struct panel *panel; struct weston_config_section *s; + char *clock_format_option = NULL; panel = xzalloc(sizeof *panel); @@ -523,7 +552,22 @@ panel_create(struct desktop *desktop) widget_set_redraw_handler(panel->widget, panel_redraw_handler); widget_set_resize_handler(panel->widget, panel_resize_handler); - panel_add_clock(panel); + s = weston_config_get_section(desktop->config, "shell", NULL, NULL); + weston_config_section_get_string(s, "clock-format", &clock_format_option, ""); + + if (strcmp(clock_format_option, "minutes") == 0) + panel->clock_format = CLOCK_FORMAT_MINUTES; + else if (strcmp(clock_format_option, "seconds") == 0) + panel->clock_format = CLOCK_FORMAT_SECONDS; + else if (strcmp(clock_format_option, "none") == 0) + panel->clock_format = CLOCK_FORMAT_NONE; + else + panel->clock_format = DEFAULT_CLOCK_FORMAT; + + if (panel->clock_format != CLOCK_FORMAT_NONE) + panel_add_clock(panel); + + free (clock_format_option); s = weston_config_get_section(desktop->config, "shell", NULL, NULL); weston_config_section_get_uint(s, "panel-color", diff --git a/man/weston.ini.man b/man/weston.ini.man index 6e92066e..8cdc8379 100644 --- a/man/weston.ini.man +++ b/man/weston.ini.man @@ -212,6 +212,13 @@ output. Tile repeats the background image to fill the output. sets the color of the background (unsigned integer). The hexadecimal digit pairs are in order alpha, red, green, and blue. .TP 7 +.BI "clock-format=" format +sets the panel clock format (string). Can be +.BR "none" "," +.BR "minutes" "," +.BR "seconds" "." +By default, minutes format is used. +.TP 7 .BI "panel-color=" 0xAARRGGBB sets the color of the panel (unsigned integer). The hexadecimal digit pairs are in order transparency, red, green, and blue. Examples: diff --git a/weston.ini.in b/weston.ini.in index dff9e94f..14a4c0c9 100644 --- a/weston.ini.in +++ b/weston.ini.in @@ -7,6 +7,7 @@ background-image=/usr/share/backgrounds/gnome/Aqua.jpg background-color=0xff002244 background-type=tile +clock-format=minutes panel-color=0x90ff0000 locking=true animation=zoom |