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.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=57583
---
 clients/desktop-shell.c | 71 ++++++++++++++++++++++++++++++++++++++++++-------
 man/weston.ini.man      |  3 +++
 weston.ini.in           |  1 +
 3 files changed, 66 insertions(+), 9 deletions(-)

diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
index 6ab76dc..8aa7a99 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 FORMAT_MINUTES
+
 extern char **environ; /* defined by libc */
 
 struct desktop {
@@ -82,6 +84,7 @@ struct panel {
        struct widget *widget;
        struct wl_list launcher_list;
        struct panel_clock *clock;
+       struct weston_config *config;
        int painted;
        uint32_t color;
 };
@@ -122,6 +125,9 @@ struct panel_clock {
        struct panel *panel;
        struct task clock_task;
        int clock_fd;
+       int format;
+       char *format_string;
+       time_t refresh_timer;
 };
 
 struct unlock_dialog {
@@ -330,6 +336,30 @@ panel_launcher_touch_up_handler(struct widget *widget, 
struct input *input,
        panel_launcher_activate(launcher);
 }
 
+enum {
+       FORMAT_MINUTES,
+       FORMAT_SECONDS,
+       FORMAT_NONE
+};
+
+static int
+panel_clock_get_format(struct panel *panel) {
+       struct weston_config_section *s;
+       char *clock_format = NULL;
+
+       s = weston_config_get_section(panel->config, "shell", NULL, NULL);
+       weston_config_section_get_string(s, "clock-format", &clock_format, "");
+
+       if(strcmp(clock_format, "minutes") == 0)
+               return FORMAT_MINUTES;
+       else if(strcmp(clock_format, "seconds") == 0)
+               return FORMAT_SECONDS;
+       else if(strcmp(clock_format, "none") == 0)
+               return FORMAT_NONE;
+
+       return DEFAULT_CLOCK_FORMAT;
+}
+
 static void
 clock_func(struct task *task, uint32_t events)
 {
@@ -356,7 +386,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)
@@ -369,12 +399,14 @@ panel_clock_redraw_handler(struct widget *widget, void 
*data)
        cairo_set_font_size(cr, 14);
        cairo_text_extents(cr, string, &extents);
        cairo_font_extents (cr, &font_extents);
-       cairo_move_to(cr, allocation.x + 5,
-                     allocation.y + 3 * (allocation.height >> 2) + 1);
+       cairo_move_to(cr, clock->format == FORMAT_MINUTES ? allocation.x + 10 :
+                     allocation.x - 10, allocation.y + 3 *
+                     (allocation.height >> 2) + 1);
        cairo_set_source_rgb(cr, 0, 0, 0);
        cairo_show_text(cr, string);
-       cairo_move_to(cr, allocation.x + 4,
-                     allocation.y + 3 * (allocation.height >> 2));
+       cairo_move_to(cr, clock->format == FORMAT_MINUTES ? allocation.x + 10 :
+                     allocation.x - 10, allocation.y + 3 *
+                     (allocation.height >> 2));
        cairo_set_source_rgb(cr, 1, 1, 1);
        cairo_show_text(cr, string);
        cairo_destroy(cr);
@@ -385,9 +417,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");
@@ -423,6 +455,21 @@ panel_add_clock(struct panel *panel)
        clock->panel = panel;
        panel->clock = clock;
        clock->clock_fd = timerfd;
+       clock->format = panel_clock_get_format(panel);
+
+       switch(clock->format) {
+               case FORMAT_MINUTES:
+                       clock->format_string = "%a %b %d, %I:%M %p";
+                       clock->refresh_timer = 60;
+                       break;
+               case FORMAT_SECONDS:
+                       clock->format_string = "%a %b %d, %I:%M:%S %p";
+                       clock->refresh_timer = 1;
+                       break;
+               case FORMAT_NONE:
+                       /* Silence a compiler warning */
+                       break;
+       }
 
        clock->clock_task.run = clock_func;
        display_watch_fd(window_get_display(panel->window), clock->clock_fd,
@@ -492,7 +539,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,10 +556,12 @@ panel_create(struct desktop *desktop)
 {
        struct panel *panel;
        struct weston_config_section *s;
+       int clock_format;
 
        panel = xzalloc(sizeof *panel);
 
        panel->base.configure = panel_configure;
+       panel->config = desktop->config;
        panel->window = window_create_custom(desktop->display);
        panel->widget = window_add_widget(panel->window, panel);
        wl_list_init(&panel->launcher_list);
@@ -522,7 +572,10 @@ 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);
+       clock_format = panel_clock_get_format(panel);
+
+       if(clock_format != FORMAT_NONE)
+               panel_add_clock(panel);
 
        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..053eb7f 100644
--- a/man/weston.ini.man
+++ b/man/weston.ini.man
@@ -212,6 +212,9 @@ 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 none, minutes (default) or 
seconds.
+.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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to