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
This commit is contained in:
kofany 2025-08-25 00:01:39 +02:00
commit f69e40e745
3 changed files with 61 additions and 24 deletions

View file

@ -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";

View file

@ -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);
}

View file

@ -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";