mirror of
https://github.com/tmux/tmux.git
synced 2025-03-28 09:38:50 +00:00
Merge branch 'obsd-master'
This commit is contained in:
commit
84eabb2658
@ -133,6 +133,7 @@ cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag,
|
|||||||
}
|
}
|
||||||
|
|
||||||
c->session = s;
|
c->session = s;
|
||||||
|
status_timer_start(c);
|
||||||
notify_attached_session_changed(c);
|
notify_attached_session_changed(c);
|
||||||
session_update_activity(s);
|
session_update_activity(s);
|
||||||
server_redraw_client(c);
|
server_redraw_client(c);
|
||||||
@ -177,6 +178,7 @@ cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag,
|
|||||||
}
|
}
|
||||||
|
|
||||||
c->session = s;
|
c->session = s;
|
||||||
|
status_timer_start(c);
|
||||||
notify_attached_session_changed(c);
|
notify_attached_session_changed(c);
|
||||||
session_update_activity(s);
|
session_update_activity(s);
|
||||||
server_redraw_client(c);
|
server_redraw_client(c);
|
||||||
|
@ -275,6 +275,7 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
|
|||||||
else if (c->session != NULL)
|
else if (c->session != NULL)
|
||||||
c->last_session = c->session;
|
c->last_session = c->session;
|
||||||
c->session = s;
|
c->session = s;
|
||||||
|
status_timer_start(c);
|
||||||
notify_attached_session_changed(c);
|
notify_attached_session_changed(c);
|
||||||
session_update_activity(s);
|
session_update_activity(s);
|
||||||
server_redraw_client(c);
|
server_redraw_client(c);
|
||||||
|
@ -176,7 +176,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
|
|||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start or stop timers when automatic-rename changed. */
|
/* Start or stop timers when name or status options changed. */
|
||||||
if (strcmp(oe->name, "automatic-rename") == 0) {
|
if (strcmp(oe->name, "automatic-rename") == 0) {
|
||||||
RB_FOREACH(w, windows, &windows) {
|
RB_FOREACH(w, windows, &windows) {
|
||||||
if (options_get_number(&w->options, "automatic-rename"))
|
if (options_get_number(&w->options, "automatic-rename"))
|
||||||
@ -185,6 +185,9 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
|
|||||||
evtimer_del(&w->name_timer);
|
evtimer_del(&w->name_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (strcmp(oe->name, "status") == 0 ||
|
||||||
|
strcmp(oe->name, "status-interval") == 0)
|
||||||
|
status_timer_start_all();
|
||||||
|
|
||||||
/* Update sizes and redraw. May not need it but meh. */
|
/* Update sizes and redraw. May not need it but meh. */
|
||||||
recalculate_sizes();
|
recalculate_sizes();
|
||||||
|
@ -127,6 +127,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
|
|||||||
if (c->session != NULL)
|
if (c->session != NULL)
|
||||||
c->last_session = c->session;
|
c->last_session = c->session;
|
||||||
c->session = s;
|
c->session = s;
|
||||||
|
status_timer_start(c);
|
||||||
session_update_activity(s);
|
session_update_activity(s);
|
||||||
|
|
||||||
recalculate_sizes();
|
recalculate_sizes();
|
||||||
|
19
format.c
19
format.c
@ -38,6 +38,7 @@
|
|||||||
|
|
||||||
void format_job_callback(struct job *);
|
void format_job_callback(struct job *);
|
||||||
const char *format_job_get(struct format_tree *, const char *);
|
const char *format_job_get(struct format_tree *, const char *);
|
||||||
|
void format_job_timer(int, short, void *);
|
||||||
|
|
||||||
int format_replace(struct format_tree *, const char *, size_t, char **,
|
int format_replace(struct format_tree *, const char *, size_t, char **,
|
||||||
size_t *, size_t *);
|
size_t *, size_t *);
|
||||||
@ -64,6 +65,7 @@ struct format_job {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Format job tree. */
|
/* Format job tree. */
|
||||||
|
struct event format_job_event;
|
||||||
int format_job_cmp(struct format_job *, struct format_job *);
|
int format_job_cmp(struct format_job *, struct format_job *);
|
||||||
RB_HEAD(format_job_tree, format_job) format_jobs = RB_INITIALIZER();
|
RB_HEAD(format_job_tree, format_job) format_jobs = RB_INITIALIZER();
|
||||||
RB_PROTOTYPE(format_job_tree, format_job, entry, format_job_cmp);
|
RB_PROTOTYPE(format_job_tree, format_job, entry, format_job_cmp);
|
||||||
@ -192,6 +194,8 @@ format_job_callback(struct job *job)
|
|||||||
server_status_client(c);
|
server_status_client(c);
|
||||||
fj->status = 0;
|
fj->status = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_debug("%s: %s: %s", __func__, fj->cmd, fj->out);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find a job. */
|
/* Find a job. */
|
||||||
@ -227,10 +231,11 @@ format_job_get(struct format_tree *ft, const char *cmd)
|
|||||||
|
|
||||||
/* Remove old jobs. */
|
/* Remove old jobs. */
|
||||||
void
|
void
|
||||||
format_clean(void)
|
format_job_timer(unused int fd, unused short events, unused void *arg)
|
||||||
{
|
{
|
||||||
struct format_job *fj, *fj1;
|
struct format_job *fj, *fj1;
|
||||||
time_t now;
|
time_t now;
|
||||||
|
struct timeval tv = { .tv_sec = 60 };
|
||||||
|
|
||||||
now = time(NULL);
|
now = time(NULL);
|
||||||
RB_FOREACH_SAFE(fj, format_job_tree, &format_jobs, fj1) {
|
RB_FOREACH_SAFE(fj, format_job_tree, &format_jobs, fj1) {
|
||||||
@ -238,14 +243,19 @@ format_clean(void)
|
|||||||
continue;
|
continue;
|
||||||
RB_REMOVE(format_job_tree, &format_jobs, fj);
|
RB_REMOVE(format_job_tree, &format_jobs, fj);
|
||||||
|
|
||||||
|
log_debug("%s: %s", __func__, fj->cmd);
|
||||||
|
|
||||||
if (fj->job != NULL)
|
if (fj->job != NULL)
|
||||||
job_free(fj->job);
|
job_free(fj->job);
|
||||||
|
|
||||||
free((void*)fj->cmd);
|
free((void *)fj->cmd);
|
||||||
free(fj->out);
|
free(fj->out);
|
||||||
|
|
||||||
free(fj);
|
free(fj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
evtimer_del(&format_job_event);
|
||||||
|
evtimer_add(&format_job_event, &tv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a new tree. */
|
/* Create a new tree. */
|
||||||
@ -262,6 +272,11 @@ format_create_status(int status)
|
|||||||
struct format_tree *ft;
|
struct format_tree *ft;
|
||||||
char host[HOST_NAME_MAX + 1], *ptr;
|
char host[HOST_NAME_MAX + 1], *ptr;
|
||||||
|
|
||||||
|
if (!event_initialized(&format_job_event)) {
|
||||||
|
evtimer_set(&format_job_event, format_job_timer, NULL);
|
||||||
|
format_job_timer(-1, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
ft = xcalloc(1, sizeof *ft);
|
ft = xcalloc(1, sizeof *ft);
|
||||||
RB_INIT(&ft->tree);
|
RB_INIT(&ft->tree);
|
||||||
ft->status = status;
|
ft->status = status;
|
||||||
|
4
log.c
4
log.c
@ -68,11 +68,13 @@ void
|
|||||||
log_vwrite(const char *msg, va_list ap)
|
log_vwrite(const char *msg, va_list ap)
|
||||||
{
|
{
|
||||||
char *fmt;
|
char *fmt;
|
||||||
|
time_t t;
|
||||||
|
|
||||||
if (log_file == NULL)
|
if (log_file == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (asprintf(&fmt, "%s\n", msg) == -1)
|
t = time(NULL);
|
||||||
|
if (asprintf(&fmt, "%lld %s\n", (long long)t, msg) == -1)
|
||||||
exit(1);
|
exit(1);
|
||||||
if (vfprintf(log_file, fmt, ap) == -1)
|
if (vfprintf(log_file, fmt, ap) == -1)
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -205,11 +205,6 @@ const struct options_table_entry session_options_table[] = {
|
|||||||
.default_str = "lock -np"
|
.default_str = "lock -np"
|
||||||
},
|
},
|
||||||
|
|
||||||
{ .name = "lock-server",
|
|
||||||
.type = OPTIONS_TABLE_FLAG,
|
|
||||||
.default_num = 1
|
|
||||||
},
|
|
||||||
|
|
||||||
{ .name = "message-attr",
|
{ .name = "message-attr",
|
||||||
.type = OPTIONS_TABLE_ATTRIBUTES,
|
.type = OPTIONS_TABLE_ATTRIBUTES,
|
||||||
.default_num = 0,
|
.default_num = 0,
|
||||||
|
@ -187,6 +187,8 @@ server_client_lost(struct client *c)
|
|||||||
if (c->stderr_data != c->stdout_data)
|
if (c->stderr_data != c->stdout_data)
|
||||||
evbuffer_free(c->stderr_data);
|
evbuffer_free(c->stderr_data);
|
||||||
|
|
||||||
|
if (event_initialized(&c->status_timer))
|
||||||
|
evtimer_del(&c->status_timer);
|
||||||
screen_free(&c->status);
|
screen_free(&c->status);
|
||||||
|
|
||||||
free(c->title);
|
free(c->title);
|
||||||
@ -288,42 +290,6 @@ client_lost:
|
|||||||
server_client_lost(c);
|
server_client_lost(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle client status timer. */
|
|
||||||
void
|
|
||||||
server_client_status_timer(void)
|
|
||||||
{
|
|
||||||
struct client *c;
|
|
||||||
struct session *s;
|
|
||||||
struct timeval tv;
|
|
||||||
int interval;
|
|
||||||
time_t difference;
|
|
||||||
|
|
||||||
if (gettimeofday(&tv, NULL) != 0)
|
|
||||||
fatal("gettimeofday failed");
|
|
||||||
|
|
||||||
TAILQ_FOREACH(c, &clients, entry) {
|
|
||||||
if (c->session == NULL)
|
|
||||||
continue;
|
|
||||||
if (c->message_string != NULL || c->prompt_string != NULL) {
|
|
||||||
/*
|
|
||||||
* Don't need timed redraw for messages/prompts so bail
|
|
||||||
* now. The status timer isn't reset when they are
|
|
||||||
* redrawn anyway.
|
|
||||||
*/
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
s = c->session;
|
|
||||||
|
|
||||||
if (!options_get_number(&s->options, "status"))
|
|
||||||
continue;
|
|
||||||
interval = options_get_number(&s->options, "status-interval");
|
|
||||||
|
|
||||||
difference = tv.tv_sec - c->status_timer.tv_sec;
|
|
||||||
if (interval != 0 && difference >= interval)
|
|
||||||
c->flags |= CLIENT_STATUS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check for mouse keys. */
|
/* Check for mouse keys. */
|
||||||
int
|
int
|
||||||
server_client_check_mouse(struct client *c)
|
server_client_check_mouse(struct client *c)
|
||||||
|
@ -422,6 +422,7 @@ server_destroy_session(struct session *s)
|
|||||||
} else {
|
} else {
|
||||||
c->last_session = NULL;
|
c->last_session = NULL;
|
||||||
c->session = s_new;
|
c->session = s_new;
|
||||||
|
status_timer_start(c);
|
||||||
notify_attached_session_changed(c);
|
notify_attached_session_changed(c);
|
||||||
session_update_activity(s_new);
|
session_update_activity(s_new);
|
||||||
server_redraw_client(c);
|
server_redraw_client(c);
|
||||||
|
40
server.c
40
server.c
@ -63,7 +63,6 @@ void server_child_signal(void);
|
|||||||
void server_child_exited(pid_t, int);
|
void server_child_exited(pid_t, int);
|
||||||
void server_child_stopped(pid_t, int);
|
void server_child_stopped(pid_t, int);
|
||||||
void server_second_callback(int, short, void *);
|
void server_second_callback(int, short, void *);
|
||||||
void server_lock_server(void);
|
|
||||||
void server_lock_sessions(void);
|
void server_lock_sessions(void);
|
||||||
|
|
||||||
/* Set marked pane. */
|
/* Set marked pane. */
|
||||||
@ -505,25 +504,9 @@ server_child_stopped(pid_t pid, int status)
|
|||||||
void
|
void
|
||||||
server_second_callback(unused int fd, unused short events, unused void *arg)
|
server_second_callback(unused int fd, unused short events, unused void *arg)
|
||||||
{
|
{
|
||||||
struct window *w;
|
|
||||||
struct window_pane *wp;
|
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
if (options_get_number(&global_s_options, "lock-server"))
|
server_lock_sessions();
|
||||||
server_lock_server();
|
|
||||||
else
|
|
||||||
server_lock_sessions();
|
|
||||||
|
|
||||||
RB_FOREACH(w, windows, &windows) {
|
|
||||||
TAILQ_FOREACH(wp, &w->panes, entry) {
|
|
||||||
if (wp->mode != NULL && wp->mode->timer != NULL)
|
|
||||||
wp->mode->timer(wp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
server_client_status_timer();
|
|
||||||
|
|
||||||
format_clean();
|
|
||||||
|
|
||||||
evtimer_del(&server_ev_second);
|
evtimer_del(&server_ev_second);
|
||||||
memset(&tv, 0, sizeof tv);
|
memset(&tv, 0, sizeof tv);
|
||||||
@ -531,27 +514,6 @@ server_second_callback(unused int fd, unused short events, unused void *arg)
|
|||||||
evtimer_add(&server_ev_second, &tv);
|
evtimer_add(&server_ev_second, &tv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lock the server if ALL sessions have hit the time limit. */
|
|
||||||
void
|
|
||||||
server_lock_server(void)
|
|
||||||
{
|
|
||||||
struct session *s;
|
|
||||||
int timeout;
|
|
||||||
time_t t;
|
|
||||||
|
|
||||||
t = time(NULL);
|
|
||||||
RB_FOREACH(s, sessions, &sessions) {
|
|
||||||
if (s->flags & SESSION_UNATTACHED)
|
|
||||||
continue;
|
|
||||||
timeout = options_get_number(&s->options, "lock-after-time");
|
|
||||||
if (timeout <= 0 || t <= s->activity_time.tv_sec + timeout)
|
|
||||||
return; /* not timed out */
|
|
||||||
}
|
|
||||||
|
|
||||||
server_lock();
|
|
||||||
recalculate_sizes();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Lock any sessions which have timed out. */
|
/* Lock any sessions which have timed out. */
|
||||||
void
|
void
|
||||||
server_lock_sessions(void)
|
server_lock_sessions(void)
|
||||||
|
56
status.c
56
status.c
@ -37,6 +37,7 @@ char *status_print(struct client *, struct winlink *, time_t,
|
|||||||
struct grid_cell *);
|
struct grid_cell *);
|
||||||
char *status_replace(struct client *, struct winlink *, const char *, time_t);
|
char *status_replace(struct client *, struct winlink *, const char *, time_t);
|
||||||
void status_message_callback(int, short, void *);
|
void status_message_callback(int, short, void *);
|
||||||
|
void status_timer_callback(int, short, void *);
|
||||||
|
|
||||||
const char *status_prompt_up_history(u_int *);
|
const char *status_prompt_up_history(u_int *);
|
||||||
const char *status_prompt_down_history(u_int *);
|
const char *status_prompt_down_history(u_int *);
|
||||||
@ -142,6 +143,55 @@ status_prompt_save_history(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Status timer callback. */
|
||||||
|
void
|
||||||
|
status_timer_callback(unused int fd, unused short events, void *arg)
|
||||||
|
{
|
||||||
|
struct client *c = arg;
|
||||||
|
struct session *s = c->session;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
evtimer_del(&c->status_timer);
|
||||||
|
|
||||||
|
if (s == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (c->message_string == NULL && c->prompt_string == NULL)
|
||||||
|
c->flags |= CLIENT_STATUS;
|
||||||
|
|
||||||
|
timerclear(&tv);
|
||||||
|
tv.tv_sec = options_get_number(&s->options, "status-interval");
|
||||||
|
|
||||||
|
if (tv.tv_sec != 0)
|
||||||
|
evtimer_add(&c->status_timer, &tv);
|
||||||
|
log_debug("client %d, status interval %d", c->ibuf.fd, (int)tv.tv_sec);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Start status timer for client. */
|
||||||
|
void
|
||||||
|
status_timer_start(struct client *c)
|
||||||
|
{
|
||||||
|
struct session *s = c->session;
|
||||||
|
|
||||||
|
if (event_initialized(&c->status_timer))
|
||||||
|
evtimer_del(&c->status_timer);
|
||||||
|
else
|
||||||
|
evtimer_set(&c->status_timer, status_timer_callback, c);
|
||||||
|
|
||||||
|
if (s != NULL && options_get_number(&s->options, "status"))
|
||||||
|
status_timer_callback(-1, 0, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Start status timer for all clients. */
|
||||||
|
void
|
||||||
|
status_timer_start_all(void)
|
||||||
|
{
|
||||||
|
struct client *c;
|
||||||
|
|
||||||
|
TAILQ_FOREACH(c, &clients, entry)
|
||||||
|
status_timer_start(c);
|
||||||
|
}
|
||||||
|
|
||||||
/* Get screen line of status line. -1 means off. */
|
/* Get screen line of status line. -1 means off. */
|
||||||
int
|
int
|
||||||
status_at_line(struct client *c)
|
status_at_line(struct client *c)
|
||||||
@ -244,10 +294,8 @@ status_redraw(struct client *c)
|
|||||||
left = right = NULL;
|
left = right = NULL;
|
||||||
larrow = rarrow = 0;
|
larrow = rarrow = 0;
|
||||||
|
|
||||||
/* Update status timer. */
|
/* Store current time. */
|
||||||
if (gettimeofday(&c->status_timer, NULL) != 0)
|
t = time(NULL);
|
||||||
fatal("gettimeofday failed");
|
|
||||||
t = c->status_timer.tv_sec;
|
|
||||||
|
|
||||||
/* Set up default colour. */
|
/* Set up default colour. */
|
||||||
style_apply(&stdgc, &s->options, "status-style");
|
style_apply(&stdgc, &s->options, "status-style");
|
||||||
|
17
tmux.1
17
tmux.1
@ -2565,9 +2565,7 @@ Lock the session (like the
|
|||||||
.Ic lock-session
|
.Ic lock-session
|
||||||
command) after
|
command) after
|
||||||
.Ar number
|
.Ar number
|
||||||
seconds of inactivity, or the entire server (all sessions) if the
|
seconds of inactivity.
|
||||||
.Ic lock-server
|
|
||||||
option is set.
|
|
||||||
The default is not to lock (set to 0).
|
The default is not to lock (set to 0).
|
||||||
.It Ic lock-command Ar shell-command
|
.It Ic lock-command Ar shell-command
|
||||||
Command to run when locking each client.
|
Command to run when locking each client.
|
||||||
@ -2575,19 +2573,6 @@ The default is to run
|
|||||||
.Xr lock 1
|
.Xr lock 1
|
||||||
with
|
with
|
||||||
.Fl np .
|
.Fl np .
|
||||||
.It Xo Ic lock-server
|
|
||||||
.Op Ic on | off
|
|
||||||
.Xc
|
|
||||||
If this option is
|
|
||||||
.Ic on
|
|
||||||
(the default),
|
|
||||||
instead of each session locking individually as each has been
|
|
||||||
idle for
|
|
||||||
.Ic lock-after-time ,
|
|
||||||
the entire server will lock after
|
|
||||||
.Em all
|
|
||||||
sessions would have locked.
|
|
||||||
This has no effect as a session option; it must be set as a global option.
|
|
||||||
.It Ic message-command-style Ar style
|
.It Ic message-command-style Ar style
|
||||||
Set status line message command style, where
|
Set status line message command style, where
|
||||||
.Ar style
|
.Ar style
|
||||||
|
6
tmux.h
6
tmux.h
@ -781,7 +781,6 @@ struct window_mode {
|
|||||||
void (*resize)(struct window_pane *, u_int, u_int);
|
void (*resize)(struct window_pane *, u_int, u_int);
|
||||||
void (*key)(struct window_pane *, struct client *, struct session *,
|
void (*key)(struct window_pane *, struct client *, struct session *,
|
||||||
int, struct mouse_event *);
|
int, struct mouse_event *);
|
||||||
void (*timer)(struct window_pane *);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Structures for choose mode. */
|
/* Structures for choose mode. */
|
||||||
@ -1211,7 +1210,7 @@ struct client {
|
|||||||
|
|
||||||
struct event repeat_timer;
|
struct event repeat_timer;
|
||||||
|
|
||||||
struct timeval status_timer;
|
struct event status_timer;
|
||||||
struct screen status;
|
struct screen status;
|
||||||
|
|
||||||
#define CLIENT_TERMINAL 0x1
|
#define CLIENT_TERMINAL 0x1
|
||||||
@ -1453,7 +1452,6 @@ void cfg_show_causes(struct session *);
|
|||||||
|
|
||||||
/* format.c */
|
/* format.c */
|
||||||
struct format_tree;
|
struct format_tree;
|
||||||
void format_clean(void);
|
|
||||||
struct format_tree *format_create(void);
|
struct format_tree *format_create(void);
|
||||||
struct format_tree *format_create_status(int);
|
struct format_tree *format_create_status(int);
|
||||||
void format_free(struct format_tree *);
|
void format_free(struct format_tree *);
|
||||||
@ -1898,6 +1896,8 @@ int server_set_stdin_callback(struct client *, void (*)(struct client *,
|
|||||||
void server_unzoom_window(struct window *);
|
void server_unzoom_window(struct window *);
|
||||||
|
|
||||||
/* status.c */
|
/* status.c */
|
||||||
|
void status_timer_start(struct client *);
|
||||||
|
void status_timer_start_all(void);
|
||||||
int status_at_line(struct client *);
|
int status_at_line(struct client *);
|
||||||
struct window *status_get_window_at(struct client *, u_int);
|
struct window *status_get_window_at(struct client *, u_int);
|
||||||
int status_redraw(struct client *);
|
int status_redraw(struct client *);
|
||||||
|
@ -57,7 +57,6 @@ const struct window_mode window_choose_mode = {
|
|||||||
window_choose_free,
|
window_choose_free,
|
||||||
window_choose_resize,
|
window_choose_resize,
|
||||||
window_choose_key,
|
window_choose_key,
|
||||||
NULL,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct window_choose_mode_item {
|
struct window_choose_mode_item {
|
||||||
|
@ -29,8 +29,8 @@ void window_clock_free(struct window_pane *);
|
|||||||
void window_clock_resize(struct window_pane *, u_int, u_int);
|
void window_clock_resize(struct window_pane *, u_int, u_int);
|
||||||
void window_clock_key(struct window_pane *, struct client *,
|
void window_clock_key(struct window_pane *, struct client *,
|
||||||
struct session *, int, struct mouse_event *);
|
struct session *, int, struct mouse_event *);
|
||||||
void window_clock_timer(struct window_pane *);
|
|
||||||
|
|
||||||
|
void window_clock_timer_callback(int, short, void *);
|
||||||
void window_clock_draw_screen(struct window_pane *);
|
void window_clock_draw_screen(struct window_pane *);
|
||||||
|
|
||||||
const struct window_mode window_clock_mode = {
|
const struct window_mode window_clock_mode = {
|
||||||
@ -38,12 +38,12 @@ const struct window_mode window_clock_mode = {
|
|||||||
window_clock_free,
|
window_clock_free,
|
||||||
window_clock_resize,
|
window_clock_resize,
|
||||||
window_clock_key,
|
window_clock_key,
|
||||||
window_clock_timer,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct window_clock_mode_data {
|
struct window_clock_mode_data {
|
||||||
struct screen screen;
|
struct screen screen;
|
||||||
time_t tim;
|
time_t tim;
|
||||||
|
struct event timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
const char window_clock_table[14][5][5] = {
|
const char window_clock_table[14][5][5] = {
|
||||||
@ -119,15 +119,42 @@ const char window_clock_table[14][5][5] = {
|
|||||||
{ 1,0,0,0,1 } },
|
{ 1,0,0,0,1 } },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
window_clock_timer_callback(unused int fd, unused short events, void *arg)
|
||||||
|
{
|
||||||
|
struct window_pane *wp = arg;
|
||||||
|
struct window_clock_mode_data *data = wp->modedata;
|
||||||
|
struct tm now, then;
|
||||||
|
time_t t;
|
||||||
|
struct timeval tv = { .tv_sec = 1 };
|
||||||
|
|
||||||
|
evtimer_del(&data->timer);
|
||||||
|
evtimer_add(&data->timer, &tv);
|
||||||
|
|
||||||
|
t = time(NULL);
|
||||||
|
gmtime_r(&t, &now);
|
||||||
|
gmtime_r(&data->tim, &then);
|
||||||
|
if (now.tm_min == then.tm_min)
|
||||||
|
return;
|
||||||
|
data->tim = t;
|
||||||
|
|
||||||
|
window_clock_draw_screen(wp);
|
||||||
|
server_redraw_window(wp->window);
|
||||||
|
}
|
||||||
|
|
||||||
struct screen *
|
struct screen *
|
||||||
window_clock_init(struct window_pane *wp)
|
window_clock_init(struct window_pane *wp)
|
||||||
{
|
{
|
||||||
struct window_clock_mode_data *data;
|
struct window_clock_mode_data *data;
|
||||||
struct screen *s;
|
struct screen *s;
|
||||||
|
struct timeval tv = { .tv_sec = 1 };
|
||||||
|
|
||||||
wp->modedata = data = xmalloc(sizeof *data);
|
wp->modedata = data = xmalloc(sizeof *data);
|
||||||
data->tim = time(NULL);
|
data->tim = time(NULL);
|
||||||
|
|
||||||
|
evtimer_set(&data->timer, window_clock_timer_callback, wp);
|
||||||
|
evtimer_add(&data->timer, &tv);
|
||||||
|
|
||||||
s = &data->screen;
|
s = &data->screen;
|
||||||
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
|
screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);
|
||||||
s->mode &= ~MODE_CURSOR;
|
s->mode &= ~MODE_CURSOR;
|
||||||
@ -142,6 +169,7 @@ window_clock_free(struct window_pane *wp)
|
|||||||
{
|
{
|
||||||
struct window_clock_mode_data *data = wp->modedata;
|
struct window_clock_mode_data *data = wp->modedata;
|
||||||
|
|
||||||
|
evtimer_del(&data->timer);
|
||||||
screen_free(&data->screen);
|
screen_free(&data->screen);
|
||||||
free(data);
|
free(data);
|
||||||
}
|
}
|
||||||
@ -163,24 +191,6 @@ window_clock_key(struct window_pane *wp, unused struct client *c,
|
|||||||
window_pane_reset_mode(wp);
|
window_pane_reset_mode(wp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
window_clock_timer(struct window_pane *wp)
|
|
||||||
{
|
|
||||||
struct window_clock_mode_data *data = wp->modedata;
|
|
||||||
struct tm now, then;
|
|
||||||
time_t t;
|
|
||||||
|
|
||||||
t = time(NULL);
|
|
||||||
gmtime_r(&t, &now);
|
|
||||||
gmtime_r(&data->tim, &then);
|
|
||||||
if (now.tm_min == then.tm_min)
|
|
||||||
return;
|
|
||||||
data->tim = t;
|
|
||||||
|
|
||||||
window_clock_draw_screen(wp);
|
|
||||||
server_redraw_window(wp->window);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
window_clock_draw_screen(struct window_pane *wp)
|
window_clock_draw_screen(struct window_pane *wp)
|
||||||
{
|
{
|
||||||
|
@ -91,7 +91,6 @@ const struct window_mode window_copy_mode = {
|
|||||||
window_copy_free,
|
window_copy_free,
|
||||||
window_copy_resize,
|
window_copy_resize,
|
||||||
window_copy_key,
|
window_copy_key,
|
||||||
NULL,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum window_copy_input_type {
|
enum window_copy_input_type {
|
||||||
|
Loading…
Reference in New Issue
Block a user