Re: Русские оконные заголовки (en_IE-UTF8, icewm)
On 17.01.2010 21:23, Mikhail Ramendik wrote:
> Стоит английская UTF8 локаль, icewm.
> Русский везде работает, а вот в оконных заголовках русские буквы молча
> пропускаются. Проверено в iceweasel (lenny) и oo.org (backports.org).
> Вопрос - можно ли это починить, не переходя на русскую локаль?
icewm не понимает (всегда уникодного) _NET_WM_NAME и использует только WM_NAME.
Я считал, что в уникодной локали это проблем вызывать не должно; но, видимо,
таки вызывает.
Поскольку у меня локаль не уникодная :-), у меня эта проблема требовала решения,
см. приаттаченный патч.
Он несколько неполноценный - если текущая локаль не поддерживает какие-то
символы, он их молча проигнорирует; теоретически, для icewm, собранного с xft,
можно доточить, но это потребует слишком большого (и неочевидного)
перетряхивания внутренностей icewm, у меня этим желания заниматся не было (и нет).
Если кто желает доточить всё что апстрим посчитает нужным и пропихнуть в апстрим
- welcome.
PS just in case, правильное название этой локали - en_IE.UTF-8.
#! /bin/sh -e
##
##
## All lines beginning with `## DP:' are a description of the patch.
## DP:
if [ $# -lt 1 ]; then
echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
exit 1
fi
[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"
case "$1" in
-patch) patch -p1 ${patch_opts} < $0;;
-unpatch) patch -R -p1 ${patch_opts} < $0;;
*)
echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
exit 1;;
esac
exit 0
@DPATCH@
--- icewm-1.2.36.orig/src/yxapp.cc.orig 2008-08-08 16:34:48.000000000 +0400
+++ icewm-1.2.36.orig/src/yxapp.cc 2009-05-01 07:25:07.000000000 +0400
@@ -91,6 +91,7 @@
Atom _XA_NET_WM_WINDOW_TYPE_SPLASH;
Atom _XA_NET_WM_NAME;
+Atom _XA_NET_WM_ICON_NAME;
Atom _XA_NET_WM_PID;
Atom _XA_NET_WM_USER_TIME;
@@ -310,6 +311,7 @@
{ &_XA_NET_WM_WINDOW_TYPE_SPLASH, "_NET_WM_WINDOW_TYPE_SPLASH" },
{ &_XA_NET_WM_NAME, "_NET_WM_NAME" },
+ { &_XA_NET_WM_ICON_NAME, "_NET_WM_ICON_NAME" },
{ &_XA_NET_WM_PID, "_NET_WM_PID" },
{ &_XA_NET_WM_USER_TIME, "_NET_WM_USER_TIME" },
{ &_XA_NET_WM_STATE_DEMANDS_ATTENTION, "_NET_WM_STATE_DEMANDS_ATTENTION" },
--- icewm-1.2.36.orig/src/wmclient.h.orig 2008-02-10 21:00:36.000000000 +0300
+++ icewm-1.2.36.orig/src/wmclient.h 2009-05-01 00:51:14.000000000 +0400
@@ -221,6 +221,8 @@
bool net_wm_state : 1; // no property notify
bool net_wm_window_type : 1;
bool net_wm_user_time : 1;
+ bool net_wm_name : 1;
+ bool net_wm_icon_name : 1;
#endif
#ifndef NO_MWM_HINTS
bool mwm_hints : 1;
--- icewm-1.2.36.orig/src/wmclient.cc.orig 2008-02-10 21:00:36.000000000 +0300
+++ icewm-1.2.36.orig/src/wmclient.cc 2009-05-01 01:17:16.000000000 +0400
@@ -417,12 +417,20 @@
switch (property.atom) {
case XA_WM_NAME:
if (new_prop) prop.wm_name = true;
+#if defined(WMSPEC_HINTS) && defined(CONFIG_I18N)
+ // don't use WM_NAME when we have _NET_WM_NAME
+ if (!prop.net_wm_name)
+#endif
getNameHint();
prop.wm_name = new_prop;
break;
case XA_WM_ICON_NAME:
if (new_prop) prop.wm_icon_name = true;
+#if defined(WMSPEC_HINTS) && defined(CONFIG_I18N)
+ // don't use WM_ICON_NAME when we have _NET_WM_ICON_NAME
+ if (!prop.net_wm_icon_name)
+#endif
getIconNameHint();
prop.wm_icon_name = false;
break;
@@ -488,6 +496,14 @@
if (getFrame())
getFrame()->updateNetWMStrut();
prop.net_wm_strut = new_prop;
+ } else if (property.atom == _XA_NET_WM_NAME) {
+ if (new_prop) prop.net_wm_name = true;
+ getNameHint();
+ prop.net_wm_name = new_prop;
+ } else if (property.atom == _XA_NET_WM_ICON_NAME) {
+ if (new_prop) prop.net_wm_icon_name = true;
+ getIconNameHint();
+ prop.net_wm_icon_name = new_prop;
#endif
#ifdef GNOME1_HINTS
} else if (property.atom == _XA_WIN_HINTS) {
@@ -765,12 +781,19 @@
}
void YFrameClient::getNameHint() {
+#ifdef WMSPEC_HINTS
+ if (!prop.net_wm_name)
+#endif
if (!prop.wm_name)
return;
#ifdef CONFIG_I18N
XTextProperty name;
- if (XGetWMName(xapp->display(), handle(), &name))
+ if (
+#ifdef WMSPEC_HINTS
+ (prop.net_wm_name && XGetTextProperty(xapp->display(), handle(), &name, _XA_NET_WM_NAME)) ||
+#endif
+ XGetWMName(xapp->display(), handle(), &name))
#else
char *name;
if (XFetchName(xapp->display(), handle(), &name))
@@ -787,12 +810,19 @@
}
void YFrameClient::getIconNameHint() {
+#ifdef WMSPEC_HINTS
+ if (!prop.net_wm_icon_name)
+#endif
if (!prop.wm_icon_name)
return;
#ifdef CONFIG_I18N
XTextProperty name;
- if (XGetWMIconName(xapp->display(), handle(), &name))
+ if (
+#ifdef WMSPEC_HINTS
+ (prop.net_wm_icon_name && XGetTextProperty(xapp->display(), handle(), &name, _XA_NET_WM_ICON_NAME)) ||
+#endif
+ XGetWMIconName(xapp->display(), handle(), &name))
#else
char *name;
if (XGetIconName(xapp->display(), handle(), &name))
@@ -1609,6 +1639,8 @@
else if (a == _XA_NET_WM_STATE) HAS(prop.net_wm_state);
else if (a == _XA_NET_WM_WINDOW_TYPE) HAS(prop.net_wm_window_type);
else if (a == _XA_NET_WM_USER_TIME) HAS(prop.net_wm_user_time);
+ else if (a == _XA_NET_WM_NAME) HAS(prop.net_wm_name);
+ else if (a == _XA_NET_WM_ICON_NAME) HAS(prop.net_wm_icon_name);
#endif
#ifdef GNOME1_HINTS
else if (a == _XA_WIN_HINTS) HAS(prop.win_hints);
Reply to: