[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: