mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-04 08:17:17 -05:00
Recode X11 window title when saving and restoring
gnome-terminal 2.30.2 expects UTF-8 in the "OSC Ps ; Pt BEL" sequence
that sets the window title. However, XGetWMName typically returns the
title in "STRING" (Latin-1) or "COMPOUND_TEXT" (escape sequences)
encoding. Recode the title to restore it correctly. This helps
especially in the fi_FI.UTF-8 locale, where gnome-terminal has "Pääte"
as the default title.
Related to bugs 885 and 336.
(cherry picked from commit d1245c73a8
)
This commit is contained in:
parent
534bb38c8a
commit
b178ee6cb6
@ -255,7 +255,7 @@ set_clipboard_text(unsigned char *data)
|
||||
}
|
||||
|
||||
unsigned char *
|
||||
get_window_title(void)
|
||||
get_window_title(int codepage)
|
||||
{
|
||||
#ifndef DEBUG_OS2
|
||||
unsigned char *org_switch_title;
|
||||
|
@ -492,8 +492,48 @@ catch_x_error(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
/** Convert a STRING XTextProperty to a string in the specified codepage.
|
||||
*
|
||||
* @return the string that the caller must free with mem_free(),
|
||||
* or NULL on error. */
|
||||
static unsigned char *
|
||||
xprop_to_string(Display *display, const XTextProperty *text_prop, int to_cp)
|
||||
{
|
||||
int from_cp;
|
||||
char **list = NULL;
|
||||
int count = 0;
|
||||
struct conv_table *convert_table;
|
||||
unsigned char *ret = NULL;
|
||||
|
||||
/* <X11/Xlib.h> defines X_HAVE_UTF8_STRING if
|
||||
* Xutf8TextPropertyToTextList is available. */
|
||||
#if defined(CONFIG_UTF8) && defined(X_HAVE_UTF8_STRING)
|
||||
|
||||
from_cp = get_cp_index("UTF-8");
|
||||
if (Xutf8TextPropertyToTextList(display, text_prop, &list,
|
||||
&count) != Success)
|
||||
return NULL;
|
||||
|
||||
#else /* !defined(X_HAVE_UTF8_STRING) || !defined(CONFIG_UTF8) */
|
||||
|
||||
from_cp = get_cp_index("System");
|
||||
if (XmbTextPropertyToTextList(display, text_prop, &list,
|
||||
&count) != Success)
|
||||
return NULL;
|
||||
|
||||
#endif /* !defined(X_HAVE_UTF8_STRING) || !defined(CONFIG_UTF8) */
|
||||
|
||||
convert_table = get_translation_table(from_cp, to_cp);
|
||||
if (count >= 1 && convert_table)
|
||||
ret = convert_string(convert_table, list[0], strlen(list[0]),
|
||||
to_cp, CSM_NONE, NULL, NULL, NULL);
|
||||
|
||||
XFreeStringList(list);
|
||||
return ret;
|
||||
}
|
||||
|
||||
unsigned char *
|
||||
get_window_title(void)
|
||||
get_window_title(int codepage)
|
||||
{
|
||||
#ifdef HAVE_X11
|
||||
/* Following code is stolen from our beloved vim. */
|
||||
@ -537,7 +577,7 @@ get_window_title(void)
|
||||
}
|
||||
|
||||
if (!x_error && status && text_prop.value) {
|
||||
ret = stracpy(text_prop.value);
|
||||
ret = xprop_to_string(display, &text_prop, codepage);
|
||||
XFree(text_prop.value);
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,7 @@ int start_thread(void (*)(void *, int), void *, int);
|
||||
unsigned char *get_clipboard_text(void);
|
||||
void set_clipboard_text(unsigned char *);
|
||||
void set_window_title(unsigned char *, int codepage);
|
||||
unsigned char *get_window_title(void);
|
||||
unsigned char *get_window_title(int codepage);
|
||||
void block_stdin(void);
|
||||
void unblock_stdin(void);
|
||||
int exe(unsigned char *);
|
||||
|
@ -504,7 +504,8 @@ dispatch_special(unsigned char *text)
|
||||
* ditrm->orig_title should be NULL,
|
||||
* but check it to prevent any leak. */
|
||||
if (!ditrm->orig_title && !ditrm->touched_title)
|
||||
ditrm->orig_title = get_window_title();
|
||||
ditrm->orig_title = get_window_title(
|
||||
ditrm->title_codepage);
|
||||
ditrm->touched_title = 1;
|
||||
}
|
||||
/* TODO: Is it really possible to get here with
|
||||
|
Loading…
Reference in New Issue
Block a user