mirror of
				https://github.com/rkd77/elinks.git
				synced 2025-10-21 19:54:04 -04: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.
This commit is contained in:
		
				
					committed by
					
						
						Kalle Olavi Niemitalo
					
				
			
			
				
	
			
			
			
						parent
						
							9cb170f97f
						
					
				
				
					commit
					d1245c73a8
				
			@@ -255,7 +255,7 @@ set_clipboard_text(unsigned char *data)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned char *
 | 
					unsigned char *
 | 
				
			||||||
get_window_title(void)
 | 
					get_window_title(int codepage)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef DEBUG_OS2
 | 
					#ifndef DEBUG_OS2
 | 
				
			||||||
	unsigned char *org_switch_title;
 | 
						unsigned char *org_switch_title;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -492,8 +492,48 @@ catch_x_error(void)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#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 *
 | 
					unsigned char *
 | 
				
			||||||
get_window_title(void)
 | 
					get_window_title(int codepage)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef HAVE_X11
 | 
					#ifdef HAVE_X11
 | 
				
			||||||
	/* Following code is stolen from our beloved vim. */
 | 
						/* Following code is stolen from our beloved vim. */
 | 
				
			||||||
@@ -537,7 +577,7 @@ get_window_title(void)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!x_error && status && text_prop.value) {
 | 
						if (!x_error && status && text_prop.value) {
 | 
				
			||||||
		ret = stracpy(text_prop.value);
 | 
							ret = xprop_to_string(display, &text_prop, codepage);
 | 
				
			||||||
		XFree(text_prop.value);
 | 
							XFree(text_prop.value);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ int start_thread(void (*)(void *, int), void *, int);
 | 
				
			|||||||
unsigned char *get_clipboard_text(void);
 | 
					unsigned char *get_clipboard_text(void);
 | 
				
			||||||
void set_clipboard_text(unsigned char *);
 | 
					void set_clipboard_text(unsigned char *);
 | 
				
			||||||
void set_window_title(unsigned char *, int codepage);
 | 
					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 block_stdin(void);
 | 
				
			||||||
void unblock_stdin(void);
 | 
					void unblock_stdin(void);
 | 
				
			||||||
int exe(unsigned char *);
 | 
					int exe(unsigned char *);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -516,7 +516,8 @@ dispatch_special(unsigned char *text)
 | 
				
			|||||||
					break;
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (!ditrm->orig_title)
 | 
									if (!ditrm->orig_title)
 | 
				
			||||||
					ditrm->orig_title = get_window_title();
 | 
										ditrm->orig_title = get_window_title(
 | 
				
			||||||
 | 
											ditrm->title_codepage);
 | 
				
			||||||
				ditrm->touched_title = 1;
 | 
									ditrm->touched_title = 1;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			/* TODO: Is it really possible to get here with
 | 
								/* TODO: Is it really possible to get here with
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user