From f69e40e74506f26f708bc0bf5f66e1fda366333d Mon Sep 17 00:00:00 2001 From: kofany Date: Mon, 25 Aug 2025 00:01:39 +0200 Subject: [PATCH] Fix nick truncation: Add nicktrunc expando and separate logic - Add expando_nicktrunc() that returns truncated nick with >> indicator - Keep expando_nickalign() for padding only (no nick modification) - Update theme to use $nicktrunc instead of $0 for nick display - Fix logic: nickalign returns spaces, nicktrunc returns truncated nick - This resolves issue where long nicks weren't being truncated Timestamp: 2025-01-24 23:50 --- config_dev | 2 +- src/fe-common/core/fe-expandos.c | 67 +++++++++++++++++++++++++------- themes/default.theme | 16 ++++---- 3 files changed, 61 insertions(+), 24 deletions(-) diff --git a/config_dev b/config_dev index bff51fce..8e8acbf0 100644 --- a/config_dev +++ b/config_dev @@ -319,7 +319,7 @@ settings = { theme = "default.theme"; nick_column_enabled = "yes"; nick_column_width = "10"; - debug_nick_column = "no"; + debug_nick_column = "yes"; }; "fe-text" = { lag_min_show = "1s"; diff --git a/src/fe-common/core/fe-expandos.c b/src/fe-common/core/fe-expandos.c index b399850f..b82bfc01 100644 --- a/src/fe-common/core/fe-expandos.c +++ b/src/fe-common/core/fe-expandos.c @@ -87,19 +87,6 @@ static char *expando_nickalign(SERVER_REC *server, void *item, int *free_ret) total_chars = mode_chars + nick_chars; if (total_chars > width) { - /* Nick za długi - przytnij z >> */ - int available_for_nick = width - mode_chars - 2; /* -2 dla >> */ - if (available_for_nick > 0) { - /* Przytnij nick i dodaj >> */ - char *truncated = g_strndup(current_nick, available_for_nick); - g_free(current_nick); - current_nick = g_strdup_printf("%s>>", truncated); - g_free(truncated); - } else { - /* Mode sam za długi */ - g_free(current_nick); - current_nick = g_strdup(">>"); - } padding = 0; } else { padding = width - total_chars; @@ -107,14 +94,60 @@ static char *expando_nickalign(SERVER_REC *server, void *item, int *free_ret) /* Debug output */ if (settings_get_bool("debug_nick_column")) { - printf("DEBUG nickalign: nick='%s', mode='%s', width=%d, mode_chars=%d, nick_chars=%d, padding=%d\n", - current_nick, mode, width, mode_chars, nick_chars, padding); + printf("DEBUG nickalign: nick='%s', mode='%s', width=%d, mode_chars=%d, nick_chars=%d, total_chars=%d, padding=%d\n", + current_nick, mode, width, mode_chars, nick_chars, total_chars, padding); } *free_ret = TRUE; return g_strnfill(padding, ' '); } +/* Nick truncated - returns truncated nick with >> indicator */ +static char *expando_nicktrunc(SERVER_REC *server, void *item, int *free_ret) +{ + int width, mode_chars, nick_chars, total_chars; + const char *mode; + char *result; + + if (!settings_get_bool("nick_column_enabled") || !nick_context_valid || !current_nick) { + return current_nick ? current_nick : ""; + } + + width = settings_get_int("nick_column_width"); + mode = current_mode ? current_mode : ""; + + /* Zawsze 1 miejsce na mode (nawet spacja) */ + mode_chars = strlen(mode) > 0 ? strlen(mode) : 1; + nick_chars = count_nick_chars(current_nick); + total_chars = mode_chars + nick_chars; + + if (total_chars > width) { + /* Nick za długi - przytnij z >> */ + int available_for_nick = width - mode_chars - 2; /* -2 dla >> */ + if (available_for_nick > 0) { + /* Przytnij nick i dodaj >> */ + result = g_strdup_printf("%.*s>>", available_for_nick, current_nick); + + if (settings_get_bool("debug_nick_column")) { + printf("DEBUG nicktrunc TRUNCATED: original='%s', truncated='%s', available_for_nick=%d\n", + current_nick, result, available_for_nick); + } + } else { + /* Mode sam za długi */ + result = g_strdup(">>"); + + if (settings_get_bool("debug_nick_column")) { + printf("DEBUG nicktrunc MODE_TOO_LONG: result='%s'\n", result); + } + } + *free_ret = TRUE; + return result; + } else { + /* Nick się zmieści - zwróć oryginalny */ + return current_nick; + } +} + /* Update nick context for expandos */ void update_nick_context(const char *nick, const char *mode) { @@ -142,6 +175,9 @@ void fe_expandos_init(void) expando_create("nickalign", expando_nickalign, "message public", EXPANDO_ARG_NONE, "message own_public", EXPANDO_ARG_NONE, NULL); + expando_create("nicktrunc", expando_nicktrunc, + "message public", EXPANDO_ARG_NONE, + "message own_public", EXPANDO_ARG_NONE, NULL); } void fe_expandos_deinit(void) @@ -149,4 +185,5 @@ void fe_expandos_deinit(void) expando_destroy("winref", expando_winref); expando_destroy("winname", expando_winname); expando_destroy("nickalign", expando_nickalign); + expando_destroy("nicktrunc", expando_nicktrunc); } diff --git a/themes/default.theme b/themes/default.theme index d1256fe9..0a877272 100644 --- a/themes/default.theme +++ b/themes/default.theme @@ -306,14 +306,14 @@ abstracts = { formats = { "fe-common/core" = { - own_msg = "$nickalign{ownmsgnick $2 {ownnick $0}}$1"; - own_msg_channel = "$nickalign{ownmsgnick $3 {ownnick $0}{msgchannel $1}}$2"; - pubmsg_me = "$nickalign{pubmsgmenick $2 {menick $0}}$1"; - pubmsg_me_channel = "$nickalign{pubmsgmenick $3 {menick $0}{msgchannel $1}}$2"; - pubmsg_hilight = "$nickalign{pubmsghinick $0 $3 $1}$2"; - pubmsg_hilight_channel = "$nickalign{pubmsghinick $0 $4 $1{msgchannel $2}}$3"; - pubmsg = "$nickalign{pubmsgnick $2 {pubnick $0}}$1"; - pubmsg_channel = "$nickalign{pubmsgnick $3 {pubnick $0}{msgchannel $1}}$2"; + own_msg = "$nickalign{ownmsgnick $2 {ownnick $nicktrunc}}$1"; + own_msg_channel = "$nickalign{ownmsgnick $3 {ownnick $nicktrunc}{msgchannel $1}}$2"; + pubmsg_me = "$nickalign{pubmsgmenick $2 {menick $nicktrunc}}$1"; + pubmsg_me_channel = "$nickalign{pubmsgmenick $3 {menick $nicktrunc}{msgchannel $1}}$2"; + pubmsg_hilight = "$nickalign{pubmsghinick $0 $3 $nicktrunc}$2"; + pubmsg_hilight_channel = "$nickalign{pubmsghinick $0 $4 $nicktrunc{msgchannel $2}}$3"; + pubmsg = "$nickalign{pubmsgnick $2 {pubnick $nicktrunc}}$1"; + pubmsg_channel = "$nickalign{pubmsgnick $3 {pubnick $nicktrunc}{msgchannel $1}}$2"; msg_private = "{privmsg $0 $1}$2"; msg_private_query = "{privmsgnick $0}$2";