mirror of
https://github.com/irssi/irssi.git
synced 2026-08-23 02:22:36 +02:00
Improve get_alignment so it works with columns (width), not chars (length).
This commit is contained in:
parent
e720a48ee9
commit
f5033031b1
2 changed files with 32 additions and 13 deletions
|
|
@ -25,6 +25,7 @@
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "servers.h"
|
#include "servers.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
#include "utf8.h"
|
||||||
|
|
||||||
#define isvarchar(c) \
|
#define isvarchar(c) \
|
||||||
(i_isalnum(c) || (c) == '_')
|
(i_isalnum(c) || (c) == '_')
|
||||||
|
|
@ -317,10 +318,14 @@ char *get_alignment(const char *text, int align, int flags, char pad)
|
||||||
gchar *ret;
|
gchar *ret;
|
||||||
gchar *ret_p;
|
gchar *ret_p;
|
||||||
uint i;
|
uint i;
|
||||||
uint start_length;
|
/* Terminology: width is an amount of columns, length is an amount of
|
||||||
uint cut_length;
|
* characters.
|
||||||
uint final_length;
|
*/
|
||||||
|
uint start_width, start_length;
|
||||||
|
uint cut_width, cut_length;
|
||||||
|
uint final_width, final_length;
|
||||||
uint pad_count;
|
uint pad_count;
|
||||||
|
uint delta;
|
||||||
|
|
||||||
g_return_val_if_fail(text != NULL, NULL);
|
g_return_val_if_fail(text != NULL, NULL);
|
||||||
|
|
||||||
|
|
@ -328,18 +333,31 @@ char *get_alignment(const char *text, int align, int flags, char pad)
|
||||||
if (!g_utf8_validate(text, -1, NULL))
|
if (!g_utf8_validate(text, -1, NULL))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* how many characters do we have in the first place? */
|
/* how many columns and chars do we have in the first place? */
|
||||||
|
start_width = get_utf8_string_width(text, 1 /* skip UTF-8 validation */);
|
||||||
start_length = g_utf8_strlen(text, 1024);
|
start_length = g_utf8_strlen(text, 1024);
|
||||||
/* how many characters will we have after the cut? */
|
/* how many columns and chars will we have after the cut? */
|
||||||
|
cut_width = start_width;
|
||||||
cut_length = start_length;
|
cut_length = start_length;
|
||||||
if ((flags & ALIGN_CUT) && align > 0 && start_length > align)
|
delta = 0;
|
||||||
cut_length = align;
|
if ((flags & ALIGN_CUT) && align > 0 && start_width > align) {
|
||||||
/* how many characters will we have after the pad? */
|
cut_width = align;
|
||||||
|
cut_length = get_utf8_chars_for_width(text,
|
||||||
|
align,
|
||||||
|
1 /* skip UTF-8 validation */,
|
||||||
|
&delta);
|
||||||
|
/* At this point, we know that we have to take "cut_length" chars from
|
||||||
|
* "text" and append "delta" padding chars to reach "align" columns.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
/* how many columns will we have after the pad? */
|
||||||
|
final_width = cut_width;
|
||||||
final_length = cut_length;
|
final_length = cut_length;
|
||||||
pad_count = 0;
|
pad_count = delta;
|
||||||
if ((flags & ALIGN_PAD) && align > cut_length) {
|
if ((flags & ALIGN_PAD) && align > cut_width) {
|
||||||
final_length = align;
|
final_width = align;
|
||||||
pad_count = final_length - cut_length;
|
pad_count += (final_width - cut_width);
|
||||||
|
final_length += pad_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate 4 bytes for each character we will have in the end */
|
/* allocate 4 bytes for each character we will have in the end */
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "special-vars.h"
|
#include "special-vars.h"
|
||||||
|
#include "utf8.h"
|
||||||
|
|
||||||
#include "chat-protocols.h"
|
#include "chat-protocols.h"
|
||||||
#include "chatnets.h"
|
#include "chatnets.h"
|
||||||
|
|
@ -324,7 +325,7 @@ static void cmd_channel_remove(const char *data)
|
||||||
|
|
||||||
static int get_nick_length(void *data)
|
static int get_nick_length(void *data)
|
||||||
{
|
{
|
||||||
return g_utf8_strlen(((NICK_REC *) data)->nick, 1024);
|
return get_utf8_string_width(((NICK_REC *) data)->nick, 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void display_sorted_nicks(CHANNEL_REC *channel, GSList *nicklist)
|
static void display_sorted_nicks(CHANNEL_REC *channel, GSList *nicklist)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue