1*0a6a1f1dSLionel Sambuc /* Id */
2eda6f593SDavid van Moolenbroek
3eda6f593SDavid van Moolenbroek /*
4eda6f593SDavid van Moolenbroek * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
5eda6f593SDavid van Moolenbroek *
6eda6f593SDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any
7eda6f593SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8eda6f593SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9eda6f593SDavid van Moolenbroek *
10eda6f593SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11eda6f593SDavid van Moolenbroek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12eda6f593SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13eda6f593SDavid van Moolenbroek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14eda6f593SDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15eda6f593SDavid van Moolenbroek * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16eda6f593SDavid van Moolenbroek * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17eda6f593SDavid van Moolenbroek */
18eda6f593SDavid van Moolenbroek
19eda6f593SDavid van Moolenbroek #include <sys/types.h>
20eda6f593SDavid van Moolenbroek
21*0a6a1f1dSLionel Sambuc #include <stdlib.h>
22eda6f593SDavid van Moolenbroek #include <string.h>
23eda6f593SDavid van Moolenbroek #include <time.h>
24eda6f593SDavid van Moolenbroek
25eda6f593SDavid van Moolenbroek #include "tmux.h"
26eda6f593SDavid van Moolenbroek
27eda6f593SDavid van Moolenbroek struct screen *window_clock_init(struct window_pane *);
28eda6f593SDavid van Moolenbroek void window_clock_free(struct window_pane *);
29eda6f593SDavid van Moolenbroek void window_clock_resize(struct window_pane *, u_int, u_int);
30eda6f593SDavid van Moolenbroek void window_clock_key(struct window_pane *, struct session *, int);
31eda6f593SDavid van Moolenbroek void window_clock_timer(struct window_pane *);
32eda6f593SDavid van Moolenbroek
33eda6f593SDavid van Moolenbroek void window_clock_draw_screen(struct window_pane *);
34eda6f593SDavid van Moolenbroek
35eda6f593SDavid van Moolenbroek const struct window_mode window_clock_mode = {
36eda6f593SDavid van Moolenbroek window_clock_init,
37eda6f593SDavid van Moolenbroek window_clock_free,
38eda6f593SDavid van Moolenbroek window_clock_resize,
39eda6f593SDavid van Moolenbroek window_clock_key,
40eda6f593SDavid van Moolenbroek NULL,
41eda6f593SDavid van Moolenbroek window_clock_timer,
42eda6f593SDavid van Moolenbroek };
43eda6f593SDavid van Moolenbroek
44eda6f593SDavid van Moolenbroek struct window_clock_mode_data {
45eda6f593SDavid van Moolenbroek struct screen screen;
46eda6f593SDavid van Moolenbroek time_t tim;
47eda6f593SDavid van Moolenbroek };
48eda6f593SDavid van Moolenbroek
49eda6f593SDavid van Moolenbroek struct screen *
window_clock_init(struct window_pane * wp)50eda6f593SDavid van Moolenbroek window_clock_init(struct window_pane *wp)
51eda6f593SDavid van Moolenbroek {
52eda6f593SDavid van Moolenbroek struct window_clock_mode_data *data;
53eda6f593SDavid van Moolenbroek struct screen *s;
54eda6f593SDavid van Moolenbroek
55eda6f593SDavid van Moolenbroek wp->modedata = data = xmalloc(sizeof *data);
56eda6f593SDavid van Moolenbroek data->tim = time(NULL);
57eda6f593SDavid van Moolenbroek
58eda6f593SDavid van Moolenbroek s = &data->screen;
59eda6f593SDavid van Moolenbroek screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
60eda6f593SDavid van Moolenbroek s->mode &= ~MODE_CURSOR;
61eda6f593SDavid van Moolenbroek
62eda6f593SDavid van Moolenbroek window_clock_draw_screen(wp);
63eda6f593SDavid van Moolenbroek
64eda6f593SDavid van Moolenbroek return (s);
65eda6f593SDavid van Moolenbroek }
66eda6f593SDavid van Moolenbroek
67eda6f593SDavid van Moolenbroek void
window_clock_free(struct window_pane * wp)68eda6f593SDavid van Moolenbroek window_clock_free(struct window_pane *wp)
69eda6f593SDavid van Moolenbroek {
70eda6f593SDavid van Moolenbroek struct window_clock_mode_data *data = wp->modedata;
71eda6f593SDavid van Moolenbroek
72eda6f593SDavid van Moolenbroek screen_free(&data->screen);
73*0a6a1f1dSLionel Sambuc free(data);
74eda6f593SDavid van Moolenbroek }
75eda6f593SDavid van Moolenbroek
76eda6f593SDavid van Moolenbroek void
window_clock_resize(struct window_pane * wp,u_int sx,u_int sy)77eda6f593SDavid van Moolenbroek window_clock_resize(struct window_pane *wp, u_int sx, u_int sy)
78eda6f593SDavid van Moolenbroek {
79eda6f593SDavid van Moolenbroek struct window_clock_mode_data *data = wp->modedata;
80eda6f593SDavid van Moolenbroek struct screen *s = &data->screen;
81eda6f593SDavid van Moolenbroek
82*0a6a1f1dSLionel Sambuc screen_resize(s, sx, sy, 0);
83eda6f593SDavid van Moolenbroek window_clock_draw_screen(wp);
84eda6f593SDavid van Moolenbroek }
85eda6f593SDavid van Moolenbroek
86eda6f593SDavid van Moolenbroek void
window_clock_key(struct window_pane * wp,unused struct session * sess,unused int key)87eda6f593SDavid van Moolenbroek window_clock_key(
88eda6f593SDavid van Moolenbroek struct window_pane *wp, unused struct session *sess, unused int key)
89eda6f593SDavid van Moolenbroek {
90eda6f593SDavid van Moolenbroek window_pane_reset_mode(wp);
91eda6f593SDavid van Moolenbroek }
92eda6f593SDavid van Moolenbroek
93eda6f593SDavid van Moolenbroek void
window_clock_timer(struct window_pane * wp)94eda6f593SDavid van Moolenbroek window_clock_timer(struct window_pane *wp)
95eda6f593SDavid van Moolenbroek {
96eda6f593SDavid van Moolenbroek struct window_clock_mode_data *data = wp->modedata;
97eda6f593SDavid van Moolenbroek struct tm now, then;
98eda6f593SDavid van Moolenbroek time_t t;
99eda6f593SDavid van Moolenbroek
100eda6f593SDavid van Moolenbroek t = time(NULL);
101eda6f593SDavid van Moolenbroek gmtime_r(&t, &now);
102eda6f593SDavid van Moolenbroek gmtime_r(&data->tim, &then);
103eda6f593SDavid van Moolenbroek if (now.tm_min == then.tm_min)
104eda6f593SDavid van Moolenbroek return;
105eda6f593SDavid van Moolenbroek data->tim = t;
106eda6f593SDavid van Moolenbroek
107eda6f593SDavid van Moolenbroek window_clock_draw_screen(wp);
108eda6f593SDavid van Moolenbroek server_redraw_window(wp->window);
109eda6f593SDavid van Moolenbroek }
110eda6f593SDavid van Moolenbroek
111eda6f593SDavid van Moolenbroek void
window_clock_draw_screen(struct window_pane * wp)112eda6f593SDavid van Moolenbroek window_clock_draw_screen(struct window_pane *wp)
113eda6f593SDavid van Moolenbroek {
114eda6f593SDavid van Moolenbroek struct window_clock_mode_data *data = wp->modedata;
115eda6f593SDavid van Moolenbroek struct screen_write_ctx ctx;
116eda6f593SDavid van Moolenbroek int colour, style;
117eda6f593SDavid van Moolenbroek
118eda6f593SDavid van Moolenbroek colour = options_get_number(&wp->window->options, "clock-mode-colour");
119eda6f593SDavid van Moolenbroek style = options_get_number(&wp->window->options, "clock-mode-style");
120eda6f593SDavid van Moolenbroek
121eda6f593SDavid van Moolenbroek screen_write_start(&ctx, NULL, &data->screen);
122eda6f593SDavid van Moolenbroek clock_draw(&ctx, colour, style);
123eda6f593SDavid van Moolenbroek screen_write_stop(&ctx);
124eda6f593SDavid van Moolenbroek }
125