tmate-msg.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include <time.h>
  2. #include "tmate.h"
  3. void status_message_callback(int, short, void *);
  4. /* Very similar to status.c:status_message_set */
  5. static void tmate_status_message_client(struct client *c, const char *message)
  6. {
  7. struct timeval tv;
  8. struct message_entry *msg, *msg1;
  9. int delay;
  10. u_int limit;
  11. limit = options_get_number(global_options, "message-limit");
  12. delay = options_get_number(c->session ? c->session->options : global_s_options,
  13. "tmate-display-time");
  14. status_prompt_clear(c);
  15. status_message_clear(c);
  16. xasprintf(&c->message_string, "[tmate] %s", message);
  17. msg = xcalloc(1, sizeof *msg);
  18. msg->msg_time = time(NULL);
  19. msg->msg_num = c->message_next++;
  20. msg->msg = xstrdup(c->message_string);
  21. TAILQ_INSERT_TAIL(&c->message_log, msg, entry);
  22. TAILQ_FOREACH_SAFE(msg, &c->message_log, entry, msg1) {
  23. if (msg->msg_num + limit >= c->message_next)
  24. break;
  25. free(msg->msg);
  26. TAILQ_REMOVE(&c->message_log, msg, entry);
  27. free(msg);
  28. }
  29. if (delay > 0) {
  30. tv.tv_sec = delay / 1000;
  31. tv.tv_usec = (delay % 1000) * 1000L;
  32. if (event_initialized(&c->message_timer))
  33. evtimer_del(&c->message_timer);
  34. evtimer_set(&c->message_timer, status_message_callback, c);
  35. evtimer_add(&c->message_timer, &tv);
  36. }
  37. c->flags |= CLIENT_STATUS | CLIENT_FORCE_STATUS;
  38. recalculate_sizes();
  39. }
  40. void __tmate_status_message(const char *fmt, va_list ap)
  41. {
  42. struct client *c;
  43. char *message;
  44. xvasprintf(&message, fmt, ap);
  45. tmate_debug("%s", message);
  46. TAILQ_FOREACH(c, &clients, entry) {
  47. if (c && !(c->flags & CLIENT_READONLY))
  48. tmate_status_message_client(c, message);
  49. }
  50. free(message);
  51. }
  52. void tmate_status_message(const char *fmt, ...)
  53. {
  54. va_list ap;
  55. va_start(ap, fmt);
  56. __tmate_status_message(fmt, ap);
  57. va_end(ap);
  58. }