- int days = 0, months = 0, years = 0;
- switch (key)
- {
- case 'k': days = -7; break;
- case 'j': days = 7; break;
- case 'h': days = -1; break;
- case 'l': days = 1; break;
- case 'i': years = -1; break;
- case 'o': years = 1; break;
+ int week = (start_of_month(y, m) + d) / 7;
+ int dir = 0;
+
+ /* Step years */
+ if (key == 'i')
+ YEAR--;
+ if (key == 'o')
+ YEAR++;
+
+ /* Get direction */
+ if (key == 'h' || key == 'k')
+ dir = -1;
+ if (key == 'j' || key == 'l')
+ dir = 1;
+
+ /* Step up/down */
+ if (key == 'j' || key == 'k') {
+ for (int i = 0; i < 90/7; i++) {
+ add_days(&y, &m, &d, dir*7);
+ if (day_of_week(y, m, d) == day &&
+ y == YEAR && m%3 == MONTH%3) {
+ MONTH = m;
+ DAY = d;
+ break;
+ }
+ }