mirror of
https://github.com/irssi/irssi.git
synced 2024-12-04 14:46:39 -05:00
reimplement format and length logic for the entry prompt
This commit is contained in:
parent
688fc817dd
commit
b03805eeb9
@ -413,6 +413,18 @@ void printtext_gui(const char *text)
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
/* Like printtext_gui(), but don't expand % codes. */
|
||||
void printtext_gui_internal(const char *str)
|
||||
{
|
||||
TEXT_DEST_REC dest;
|
||||
|
||||
g_return_if_fail(str != NULL);
|
||||
|
||||
memset(&dest, 0, sizeof(dest));
|
||||
|
||||
format_send_to_gui(&dest, str);
|
||||
}
|
||||
|
||||
static void msg_beep_check(TEXT_DEST_REC *dest)
|
||||
{
|
||||
if (dest->level != 0 && (dest->level & MSGLEVEL_NO_ACT) == 0 &&
|
||||
|
@ -23,6 +23,7 @@ void printtext_dest(TEXT_DEST_REC *dest, const char *text, ...);
|
||||
/* only GUI should call these - used for printing text to somewhere else
|
||||
than windows */
|
||||
void printtext_gui(const char *text);
|
||||
void printtext_gui_internal(const char *str);
|
||||
void printformat_module_gui(const char *module, int formatnum, ...);
|
||||
void printformat_module_gui_args(const char *module, int formatnum, va_list va);
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "gui-entry.h"
|
||||
#include "gui-printtext.h"
|
||||
#include "term.h"
|
||||
#include "recode.h"
|
||||
|
||||
#undef i_toupper
|
||||
#undef i_tolower
|
||||
@ -345,6 +346,33 @@ void gui_entry_set_active(GUI_ENTRY_REC *entry)
|
||||
}
|
||||
}
|
||||
|
||||
/* Return screen length of plain string */
|
||||
static int scrlen_str(const char *str)
|
||||
{
|
||||
int len = 0;
|
||||
char *stripped;
|
||||
g_return_val_if_fail(str != NULL, 0);
|
||||
|
||||
str = stripped = strip_codes(str);
|
||||
if (is_utf8() && g_utf8_validate(str, -1, NULL)) {
|
||||
|
||||
while (*str != '\0') {
|
||||
gunichar c;
|
||||
|
||||
c = g_utf8_get_char(str);
|
||||
str = g_utf8_next_char(str);
|
||||
|
||||
len += unichar_isprint(c) ? mk_wcwidth(c) : 1;
|
||||
}
|
||||
|
||||
} else {
|
||||
len = strlen(str);
|
||||
}
|
||||
|
||||
g_free(stripped);
|
||||
return len;
|
||||
}
|
||||
|
||||
void gui_entry_set_prompt(GUI_ENTRY_REC *entry, const char *str)
|
||||
{
|
||||
int oldlen;
|
||||
@ -355,11 +383,11 @@ void gui_entry_set_prompt(GUI_ENTRY_REC *entry, const char *str)
|
||||
if (str != NULL) {
|
||||
g_free_not_null(entry->prompt);
|
||||
entry->prompt = g_strdup(str);
|
||||
entry->promptlen = format_get_length(str);
|
||||
entry->promptlen = scrlen_str(str);
|
||||
}
|
||||
|
||||
if (entry->prompt != NULL)
|
||||
gui_printtext(entry->xpos, entry->ypos, entry->prompt);
|
||||
gui_printtext_internal(entry->xpos, entry->ypos, entry->prompt);
|
||||
|
||||
if (entry->promptlen != oldlen) {
|
||||
gui_entry_fix_cursor(entry);
|
||||
|
@ -109,6 +109,16 @@ void gui_printtext(int xpos, int ypos, const char *str)
|
||||
next_xpos = next_ypos = -1;
|
||||
}
|
||||
|
||||
void gui_printtext_internal(int xpos, int ypos, const char *str)
|
||||
{
|
||||
next_xpos = xpos;
|
||||
next_ypos = ypos;
|
||||
|
||||
printtext_gui_internal(str);
|
||||
|
||||
next_xpos = next_ypos = -1;
|
||||
}
|
||||
|
||||
void gui_printtext_after_time(TEXT_DEST_REC *dest, LINE_REC *prev, const char *str, time_t time)
|
||||
{
|
||||
GUI_WINDOW_REC *gui;
|
||||
|
@ -17,6 +17,7 @@ void gui_set_default_indent(const char *name);
|
||||
INDENT_FUNC get_default_indent_func(void);
|
||||
|
||||
void gui_printtext(int xpos, int ypos, const char *str);
|
||||
void gui_printtext_internal(int xpos, int ypos, const char *str);
|
||||
void gui_printtext_after(TEXT_DEST_REC *dest, LINE_REC *prev, const char *str);
|
||||
void gui_printtext_after_time(TEXT_DEST_REC *dest, LINE_REC *prev, const char *str, time_t time);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user