From 53e4b2c971a319aff2819ae1ebec2b33a0126351 Mon Sep 17 00:00:00 2001 From: Loui Chang Date: Thu, 19 Feb 2015 18:20:38 -0500 Subject: [PATCH] Add support for custom timestamps in chat and logs. Internal representations of the time_format setting are replaced by timestamp format strings. time_format is only used in the setup. Signed-off-by: Loui Chang --- doc/toxic.conf.5 | 26 +++++++++++++++++++------- doc/toxic.conf.5.asc | 15 ++++++++++++--- misc/toxic.conf.example | 3 +++ src/friendlist.c | 2 +- src/line_info.c | 14 +++++++------- src/log.c | 2 +- src/misc_tools.c | 2 +- src/settings.c | 31 ++++++++++++++++++++++++++----- src/settings.h | 10 ++++++---- src/toxic.h | 2 +- 10 files changed, 77 insertions(+), 30 deletions(-) diff --git a/doc/toxic.conf.5 b/doc/toxic.conf.5 index fa30e86..0ee128a 100644 --- a/doc/toxic.conf.5 +++ b/doc/toxic.conf.5 @@ -2,12 +2,12 @@ .\" Title: toxic.conf .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 -.\" Date: 2015-02-08 +.\" Date: 2015-02-19 .\" Manual: Toxic Manual .\" Source: toxic __VERSION__ .\" Language: English .\" -.TH "TOXIC\&.CONF" "5" "2015\-02\-08" "toxic __VERSION__" "Toxic Manual" +.TH "TOXIC\&.CONF" "5" "2015\-02\-19" "toxic __VERSION__" "Toxic Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -66,6 +66,23 @@ Configuration related to interface elements\&. Enable or disable timestamps\&. true or false .RE .PP +\fBtime_format\fR +.RS 4 +Select between 24 and 12 hour time\&. Specify 24 or 12\&. Setting timestamp_format and log_timestamp_format will override this setting\&. +.RE +.PP +\fBtimestamp_format\fR +.RS 4 +Time format string for the interface enclosed by double quotes\&. See +\fBdate\fR(1) +.RE +.PP +\fBlog_timestamp_format\fR +.RS 4 +Time format string for logging enclosed by double quotes\&. See +\fBdate\fR(1) +.RE +.PP \fBalerts\fR .RS 4 Enable or disable terminal alerts on events\&. true or false @@ -81,11 +98,6 @@ Select between native terminal colors and toxic color theme\&. true or false Enable or disable autologging\&. true or false .RE .PP -\fBtime_format\fR -.RS 4 -Select between 24 and 12 hour time\&. Specify 24 or 12 -.RE -.PP \fBshow_typing_other\fR .RS 4 Show when others are typing in a 1\-on\-1 chat\&. true or false diff --git a/doc/toxic.conf.5.asc b/doc/toxic.conf.5.asc index 4643405..5411bba 100644 --- a/doc/toxic.conf.5.asc +++ b/doc/toxic.conf.5.asc @@ -42,6 +42,18 @@ OPTIONS *timestamps*;; Enable or disable timestamps. true or false + *time_format*;; + Select between 24 and 12 hour time. Specify 24 or 12. Setting + timestamp_format and log_timestamp_format will override this setting. + + *timestamp_format*;; + Time format string for the interface enclosed by double quotes. + See *date*(1) + + *log_timestamp_format*;; + Time format string for logging enclosed by double quotes. + See *date*(1) + *alerts*;; Enable or disable terminal alerts on events. true or false @@ -51,9 +63,6 @@ OPTIONS *autolog*;; Enable or disable autologging. true or false - *time_format*;; - Select between 24 and 12 hour time. Specify 24 or 12 - *show_typing_other*;; Show when others are typing in a 1-on-1 chat. true or false diff --git a/misc/toxic.conf.example b/misc/toxic.conf.example index 7b8e352..ed2e24f 100644 --- a/misc/toxic.conf.example +++ b/misc/toxic.conf.example @@ -17,6 +17,9 @@ ui = { // 24 or 12 hour time time_format=24; + // timestamp format string according to date/strftime format. Overrides time_format setting + timestamp_format="%H:%M:%S"; + // true to show you when others are typing a message in 1-on-1 chats show_typing_other=true; diff --git a/src/friendlist.c b/src/friendlist.c index 21f8a93..f0d4fca 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -299,7 +299,7 @@ static void update_friend_last_online(int32_t num, uint64_t timestamp) Friends.list[num].last_online.tm = *localtime((const time_t*)×tamp); /* if the format changes make sure TIME_STR_SIZE is the correct size */ - const char *t = user_settings->time == TIME_12 ? "%I:%M %p" : "%H:%M"; + const char *t = user_settings->timestamp_format; strftime(Friends.list[num].last_online.hour_min_str, TIME_STR_SIZE, t, &Friends.list[num].last_online.tm); } diff --git a/src/line_info.c b/src/line_info.c index d3be1ae..70b943a 100644 --- a/src/line_info.c +++ b/src/line_info.c @@ -202,7 +202,7 @@ void line_info_add(ToxWindow *self, const char *timestr, const char *name1, cons if (timestr) { snprintf(new_line->timestr, sizeof(new_line->timestr), "%s", timestr); - len += strlen(new_line->timestr); + len += strlen(new_line->timestr) + 1; } if (name1) { @@ -302,7 +302,7 @@ void line_info_print(ToxWindow *self) case OUT_MSG_READ: case IN_MSG: wattron(win, COLOR_PAIR(BLUE)); - wprintw(win, "%s", line->timestr); + wprintw(win, "%s ", line->timestr); wattroff(win, COLOR_PAIR(BLUE)); int nameclr = GREEN; @@ -342,7 +342,7 @@ void line_info_print(ToxWindow *self) case OUT_ACTION: case IN_ACTION: wattron(win, COLOR_PAIR(BLUE)); - wprintw(win, "%s", line->timestr); + wprintw(win, "%s ", line->timestr); wattroff(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(YELLOW)); @@ -366,7 +366,7 @@ void line_info_print(ToxWindow *self) case SYS_MSG: if (line->timestr[0]) { wattron(win, COLOR_PAIR(BLUE)); - wprintw(win, "%s", line->timestr); + wprintw(win, "%s ", line->timestr); wattroff(win, COLOR_PAIR(BLUE)); } @@ -399,7 +399,7 @@ void line_info_print(ToxWindow *self) case CONNECTION: wattron(win, COLOR_PAIR(BLUE)); - wprintw(win, "%s", line->timestr); + wprintw(win, "%s ", line->timestr); wattroff(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(line->colour)); @@ -416,7 +416,7 @@ void line_info_print(ToxWindow *self) case DISCONNECTION: wattron(win, COLOR_PAIR(BLUE)); - wprintw(win, "%s", line->timestr); + wprintw(win, "%s ", line->timestr); wattroff(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(line->colour)); @@ -433,7 +433,7 @@ void line_info_print(ToxWindow *self) case NAME_CHANGE: wattron(win, COLOR_PAIR(BLUE)); - wprintw(win, "%s", line->timestr); + wprintw(win, "%s ", line->timestr); wattroff(win, COLOR_PAIR(BLUE)); wattron(win, COLOR_PAIR(MAGENTA)); diff --git a/src/log.c b/src/log.c index 27e2a20..f04c83d 100644 --- a/src/log.c +++ b/src/log.c @@ -134,7 +134,7 @@ void write_to_log(const char *msg, const char *name, struct chatlog *log, bool e else snprintf(name_frmt, sizeof(name_frmt), "%s:", name); - const char *t = user_settings->time == TIME_12 ? "%Y/%m/%d [%I:%M:%S %p]" : "%Y/%m/%d [%H:%M:%S]"; + const char *t = user_settings->log_timestamp_format; char s[MAX_STR_SIZE]; strftime(s, MAX_STR_SIZE, t, get_time()); fprintf(log->file, "%s %s %s\n", s, name_frmt, msg); diff --git a/src/misc_tools.c b/src/misc_tools.c index 0b977b2..1c48f32 100644 --- a/src/misc_tools.c +++ b/src/misc_tools.c @@ -87,7 +87,7 @@ void get_time_str(char *buf, int bufsize) return; } - const char *t = user_settings->time == TIME_12 ? "%I:%M:%S " : "%H:%M:%S "; + const char *t = user_settings->timestamp_format; strftime(buf, bufsize, t, get_time()); } diff --git a/src/settings.c b/src/settings.c index cd8385f..ca30f3e 100644 --- a/src/settings.c +++ b/src/settings.c @@ -47,10 +47,12 @@ static struct ui_strings { const char* self; const char* timestamps; + const char* time_format; + const char* timestamp_format; + const char* log_timestamp_format; const char* alerts; const char* native_colors; const char* autolog; - const char* time_format; const char* history_size; const char* show_typing_self; const char* show_typing_other; @@ -63,10 +65,12 @@ static struct ui_strings { } ui_strings = { "ui", "timestamps", + "time_format", + "timestamp_format", + "log_timestamp_format", "alerts", "native_colors", "autolog", - "time_format", "history_size", "show_typing_self", "show_typing_other", @@ -80,7 +84,9 @@ static struct ui_strings { static void ui_defaults(struct user_settings* settings) { settings->timestamps = TIMESTAMPS_ON; - settings->time = TIME_24; + snprintf(settings->timestamp_format, sizeof(settings->timestamp_format), "%s", TIMESTAMP_DEFAULT); + snprintf(settings->log_timestamp_format, sizeof(settings->log_timestamp_format), "%s", LOG_TIMESTAMP_DEFAULT); + settings->autolog = AUTOLOG_OFF; settings->alerts = ALERTS_ENABLED; settings->colour_theme = DFLT_COLS; @@ -267,6 +273,23 @@ int settings_load(struct user_settings *s, const char *patharg) /* ui */ if ((setting = config_lookup(cfg, ui_strings.self)) != NULL) { config_setting_lookup_bool(setting, ui_strings.timestamps, &s->timestamps); + + int time = 24; + if ( config_setting_lookup_int(setting, ui_strings.time_format, &time) ) { + if (time == 12) { + snprintf(s->timestamp_format, sizeof(s->timestamp_format), "%s", "%I:%M:%S %p"); + snprintf(s->log_timestamp_format, sizeof(s->log_timestamp_format), "%s", "%Y/%m/%d [%I:%M:%S %p]"); + } + } + + if ( config_setting_lookup_string(setting, ui_strings.timestamp_format, &str) ) { + snprintf(s->timestamp_format, sizeof(s->timestamp_format), "%s", str); + } + + if ( config_setting_lookup_string(setting, ui_strings.log_timestamp_format, &str) ) { + snprintf(s->log_timestamp_format, sizeof(s->log_timestamp_format), "%s", str); + } + config_setting_lookup_bool(setting, ui_strings.alerts, &s->alerts); config_setting_lookup_bool(setting, ui_strings.autolog, &s->autolog); config_setting_lookup_bool(setting, ui_strings.native_colors, &s->colour_theme); @@ -274,8 +297,6 @@ int settings_load(struct user_settings *s, const char *patharg) config_setting_lookup_bool(setting, ui_strings.show_typing_self, &s->show_typing_self); config_setting_lookup_bool(setting, ui_strings.show_typing_other, &s->show_typing_other); config_setting_lookup_bool(setting, ui_strings.show_welcome_msg, &s->show_welcome_msg); - config_setting_lookup_int(setting, ui_strings.time_format, &s->time); - s->time = s->time == TIME_24 || s->time == TIME_12 ? s->time : TIME_24; /* Check defaults */ if ( config_setting_lookup_string(setting, ui_strings.line_join, &str) ) { snprintf(s->line_join, sizeof(s->line_join), "%s", str); diff --git a/src/settings.h b/src/settings.h index 1cc9e13..cf9b628 100644 --- a/src/settings.h +++ b/src/settings.h @@ -32,8 +32,11 @@ struct user_settings { int autolog; /* boolean */ int alerts; /* boolean */ - int time; /* 12 or 24 */ + int timestamps; /* boolean */ + char timestamp_format[TIME_STR_SIZE]; + char log_timestamp_format[TIME_STR_SIZE]; + int colour_theme; /* boolean (0 for default toxic colours) */ int history_size; /* int between MIN_HISTORY and MAX_HISTORY */ int show_typing_self; /* boolean */ @@ -71,9 +74,6 @@ enum { AUTOLOG_OFF = 0, AUTOLOG_ON = 1, - TIME_24 = 24, - TIME_12 = 12, - TIMESTAMPS_OFF = 0, TIMESTAMPS_ON = 1, @@ -96,6 +96,8 @@ enum { #define LINE_QUIT "<--" #define LINE_ALERT "-!-" #define LINE_NORMAL "---" +#define TIMESTAMP_DEFAULT "%H:%M:%S" +#define LOG_TIMESTAMP_DEFAULT "%Y/%m/%d [%H:%M:%S]" int settings_load(struct user_settings *s, const char *patharg); #endif /* #define SETTINGS_H */ diff --git a/src/toxic.h b/src/toxic.h index 8c38498..fc6b512 100644 --- a/src/toxic.h +++ b/src/toxic.h @@ -47,7 +47,7 @@ #define MAX_CMDNAME_SIZE 64 #define TOXIC_MAX_NAME_LENGTH 32 /* Must be <= TOX_MAX_NAME_LENGTH */ #define KEY_IDENT_DIGITS 3 /* number of hex digits to display for the pub-key based identifier */ -#define TIME_STR_SIZE 16 +#define TIME_STR_SIZE 32 /* ASCII key codes */ #define T_KEY_ESC 0x1B /* ESC key */