mirror of
https://github.com/javalsai/lidm.git
synced 2025-11-28 04:25:25 +01:00
feat: don't trunc long hostnames if there is space (#87)
Instead of restricting the length of the hostname field to the size of the column, the hostname is allowed to utilize all space that is not taken up by the time string. Co-authored-by: Darius Kellermann <kellermann@pm.me>
This commit is contained in:
45
src/ui.c
45
src/ui.c
@@ -109,8 +109,8 @@ static char* fmt_time(const char* fmt) {
|
||||
}
|
||||
}
|
||||
|
||||
char* trunc_gethostname(const size_t MAXLEN, const char* const ELLIPSIS) {
|
||||
if (utf8len(ELLIPSIS) > MAXLEN) return NULL;
|
||||
char* trunc_gethostname(size_t maxlen, const char* const ELLIPSIS) {
|
||||
if (utf8len(ELLIPSIS) > maxlen) return NULL;
|
||||
size_t alloc_size = HOST_NAME_MAX + strlen(ELLIPSIS) + 1;
|
||||
char* buf = malloc(alloc_size);
|
||||
if (!buf) return NULL;
|
||||
@@ -120,8 +120,8 @@ char* trunc_gethostname(const size_t MAXLEN, const char* const ELLIPSIS) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (utf8len(buf) > MAXLEN) {
|
||||
size_t end = utf8trunc(buf, MAXLEN - utf8len(ELLIPSIS));
|
||||
if (utf8len(buf) > maxlen) {
|
||||
size_t end = utf8trunc(buf, maxlen - utf8len(ELLIPSIS));
|
||||
strcpy(&buf[end], ELLIPSIS);
|
||||
}
|
||||
return buf;
|
||||
@@ -341,25 +341,40 @@ u_char get_render_pos_offset(struct opts_field* self, u_char maxlen) {
|
||||
return pos - ofield_display_cursor_col(self, maxlen);
|
||||
}
|
||||
|
||||
#define HOSTNAME_SIZE (VALUES_COL - VALUES_SEPR - BOX_HMARGIN - 1)
|
||||
void print_head() {
|
||||
// hostname doesn't just change on runtime
|
||||
static char* hostname = NULL;
|
||||
if (!hostname)
|
||||
hostname = trunc_gethostname(HOSTNAME_SIZE, g_config->strings.ellipsis);
|
||||
if (!hostname) hostname = "unknown";
|
||||
char* fmtd_time = fmt_time(g_config->behavior.timefmt);
|
||||
size_t len_tm = utf8len(fmtd_time);
|
||||
|
||||
// calculate the space available for the host name
|
||||
ssize_t hostname_size = BOX_WIDTH - (BOX_HMARGIN * 2) - len_tm - VALUES_SEPR;
|
||||
if (hostname_size < 0) hostname_size = 0;
|
||||
|
||||
// hostname doesn't just change on runtime,
|
||||
// but the length of the time string might
|
||||
static char* NULLABLE hostname = NULL;
|
||||
static size_t hostname_calcd_size;
|
||||
|
||||
// save the truncated hostname and the length it truncated to,
|
||||
// if said length changes recalculate this (and free previous str)
|
||||
if (!hostname || hostname_calcd_size != hostname_size) {
|
||||
if (hostname) free(hostname);
|
||||
hostname = trunc_gethostname(hostname_size, g_config->strings.ellipsis);
|
||||
hostname_calcd_size = hostname_size;
|
||||
}
|
||||
|
||||
clean_line(box_start, HEAD_ROW);
|
||||
|
||||
// put hostname
|
||||
printf("\x1b[%dG\x1b[%sm%s\x1b[%sm",
|
||||
box_start.x + VALUES_COL - VALUES_SEPR - (uint)utf8len(hostname),
|
||||
g_config->colors.e_hostname, hostname, g_config->colors.fg);
|
||||
if (hostname_size)
|
||||
printf("\x1b[%dG\x1b[%sm%s\x1b[%sm", box_start.x + 1 + BOX_HMARGIN,
|
||||
g_config->colors.e_hostname, hostname ? hostname : "unknown",
|
||||
g_config->colors.fg);
|
||||
|
||||
// put date
|
||||
char* fmtd_time = fmt_time(g_config->behavior.timefmt);
|
||||
printf("\x1b[%dG\x1b[%sm%s\x1b[%sm",
|
||||
box_start.x + BOX_WIDTH - 1 - BOX_HMARGIN - (uint)utf8len(fmtd_time),
|
||||
box_start.x + BOX_WIDTH - 1 - BOX_HMARGIN - (uint)len_tm,
|
||||
g_config->colors.e_date, fmtd_time, g_config->colors.fg);
|
||||
|
||||
free(fmtd_time);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user