xref: /minix3/external/bsd/tmux/dist/window-clock.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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