mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-24 14:26:29 -05:00
Display some IM pre-edit state when painting the terminal
This is approximately how it should work: term_set_preedit_text stashes data in the terminal structure and then do_paint() renders it in place of what's in the terminal buffer. Currently this only works for a single narrow character, and it copies the existing attributes under the cursor, but this might actually be enough for the UK keyboard layout in GNOME.
This commit is contained in:
parent
ab9dfc572e
commit
b72fec0a52
@ -6199,6 +6199,9 @@ static void do_paint(Terminal *term)
|
|||||||
|
|
||||||
if (i == our_curs_y && j == our_curs_x)
|
if (i == our_curs_y && j == our_curs_x)
|
||||||
tattr |= cursor;
|
tattr |= cursor;
|
||||||
|
if (term->preedit_char != -1)
|
||||||
|
tchar = term->preedit_char;
|
||||||
|
}
|
||||||
|
|
||||||
/* FULL-TERMCHAR */
|
/* FULL-TERMCHAR */
|
||||||
newline[j].attr = tattr;
|
newline[j].attr = tattr;
|
||||||
@ -8115,19 +8118,20 @@ void term_notify_window_size_pixels(Terminal *term, int x, int y)
|
|||||||
void term_set_preedit_text(Terminal *term, char *preedit_text)
|
void term_set_preedit_text(Terminal *term, char *preedit_text)
|
||||||
{
|
{
|
||||||
BinarySource src[1];
|
BinarySource src[1];
|
||||||
pos oldcurs = term->curs;
|
|
||||||
|
|
||||||
if (preedit_text != NULL) {
|
if (preedit_text != NULL) {
|
||||||
debug("Pre-edit:");
|
debug("Pre-edit:");
|
||||||
BinarySource_BARE_INIT(src, preedit_text, strlen(preedit_text));
|
BinarySource_BARE_INIT(src, preedit_text, strlen(preedit_text));
|
||||||
while (get_avail(src)) {
|
if (get_avail(src)) {
|
||||||
unsigned int c = decode_utf8(src, NULL);
|
unsigned int c = decode_utf8(src, NULL);
|
||||||
debug(" U+%04X", c);
|
debug(" U+%04X", c);
|
||||||
term_display_graphic_char(term, c);
|
term->preedit_char = c;
|
||||||
}
|
} else
|
||||||
|
term->preedit_char = -1;
|
||||||
debug("\n");
|
debug("\n");
|
||||||
term->curs = oldcurs;
|
|
||||||
} else {
|
} else {
|
||||||
debug("Pre-edit finished\n");
|
debug("Pre-edit finished\n");
|
||||||
|
term->preedit_char = -1;
|
||||||
}
|
}
|
||||||
|
seen_disp_event(term);
|
||||||
}
|
}
|
||||||
|
@ -442,6 +442,9 @@ struct terminal_tag {
|
|||||||
*/
|
*/
|
||||||
struct term_userpass_state *userpass_state;
|
struct term_userpass_state *userpass_state;
|
||||||
bool userpass_utf8_override;
|
bool userpass_utf8_override;
|
||||||
|
|
||||||
|
/* Input method state. */
|
||||||
|
int preedit_char; /* -1 for none */
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline bool in_utf(Terminal *term)
|
static inline bool in_utf(Terminal *term)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user