 #define WATCH_COLOR        (COLOR_BLUE)
 
 typedef struct {
-  uint16_t next_second_millis;
+  millis_t next_second_millis;
   uint8_t seconds;
   uint8_t minutes;
   uint8_t hours;
   uint8_t month;
   uint8_t day;
+
+  uint16_t year;
+  // set to 1 if year is a leap year, 0 otherwise
+  uint8_t leapyear;
+
+  // set this when we need to redraw everything regardless of what
+  // watch_tick returns.
+  uint8_t needs_redraw;
 } Watch_t;
 
 uint8_t _watch_days_per_month[] = {

Note that this kind of time keeping on the Xadow has an error of about 1000 ppm, which
is around 30 seconds over 8 hours.
*/
uint8_t watch_tick (uint16_t now) {
  int16_t elapsed = now - Watch.next_second_millis;

  if (elapsed > 0) {
    Watch.next_second_millis += 1000;

    uint8_t seconds = Watch.seconds;
    uint8_t minutes = Watch.minutes;
    uint8_t hours = Watch.hours;
    uint8_t day = Watch.day;
    uint8_t month = Watch.month;

    uint8_t changes = 1;

    seconds += 1;
    if (seconds >= 60) {
      seconds = 0;
      minutes += 1;
      changes += 1;
    }

    if (minutes >= 60) {
      minutes = 0;
      hours += 1;
      changes += 1;
    }

    if (hours >= 24) {
      hours = 0;
      day += 1;
      changes += 1;
    }

    if (day >= _watch_days_per_month[month]) {
      day = 0;
      month += 1;
      changes += 1;
    }

    if (month >= 12) {
      month = 0;
      changes += 1;
    }

    Watch.seconds = seconds;
    Watch.minutes = minutes;
    Watch.hours = hours;
    Watch.day = day;
    Watch.month = month;

    return changes;
  } else return 0;
}

Watch_t Watch = {0};

void watch_init(millis_t now) {
  Watch.next_second_millis = now;
  Watch.needs_redraw = 1;
}

/**
