[PATCH weston GSoC v4] desktop-shell: make panel clock configurable
Bryce Harrington
bryce at osg.samsung.com
Thu Mar 10 23:40:26 UTC 2016
On Thu, Mar 10, 2016 at 06:02:34PM +0100, Armin Krezović wrote:
> 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 at fet.ba>
> Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
Reviewed-by: Bryce Harrington <bryce at osg.samsung.com>
Pushed:
To ssh://git.freedesktop.org/git/wayland/weston
0d1a622..c6a55db master -> master
> ---
> clients/desktop-shell.c | 58 +++++++++++++++++++++++++++++++++++++++++++------
> man/weston.ini.man | 7 ++++++
> weston.ini.in | 1 +
> 3 files changed, 59 insertions(+), 7 deletions(-)
>
> diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
> index 6ab76dc..30259c5 100644
> --- a/clients/desktop-shell.c
> +++ b/clients/desktop-shell.c
> @@ -49,6 +49,8 @@
>
> #include "weston-desktop-shell-client-protocol.h"
>
> +#define DEFAULT_CLOCK_FORMAT CLOCK_FORMAT_MINUTES
> +
> extern char **environ; /* defined by libc */
>
> struct desktop {
> @@ -83,6 +85,7 @@ struct panel {
> struct wl_list launcher_list;
> struct panel_clock *clock;
> int painted;
> + int clock_format;
> uint32_t color;
> };
>
> @@ -122,6 +125,8 @@ struct panel_clock {
> struct panel *panel;
> struct task clock_task;
> int clock_fd;
> + char *format_string;
> + time_t refresh_timer;
> };
>
> struct unlock_dialog {
> @@ -356,7 +361,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)
> @@ -385,9 +390,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");
> @@ -407,6 +412,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)
> {
> @@ -424,6 +435,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);
> @@ -450,8 +472,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,
> @@ -492,7 +519,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);
> @@ -508,6 +536,7 @@ panel_create(struct desktop *desktop)
> {
> struct panel *panel;
> struct weston_config_section *s;
> + char *clock_format_option = NULL;
>
> panel = xzalloc(sizeof *panel);
>
> @@ -522,7 +551,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 6e92066..8cdc837 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 dff9e94..14a4c0c 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
> --
> 2.7.2
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list