[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