[PATCH] libX11: allow inclusion of system level compose files

Marko Myllynen myllynen at redhat.com
Sun Oct 11 11:12:09 PDT 2009


Hi,

with the release of XFree86 4.4 an inclusion system of compose files was
added to Xlib to allow inclusion of the default compose file (with %L),
any compose files from user's home directory (with %H), or a compose
file with a hard coded path [1]. However, even today including system
level compose files is not possible in a platform independent manner
although the machinery for including compose files and overriding
previously defined compositions is already in place.

With the ability to include system level compose files one could greatly
reduce the need for compose file rule duplication and the work needed to
propagate changes in one compose file to others. For example, currently
the Finnish compose file fi_FI.UTF-8 weights over 5000 lines [2] but it
is almost identical with en_US.UTF-8 except for perhaps half a dozen
compositions.

Please consider something like the patch below to allow one to include
system level compose files with the following kind of syntax:

include "%S/en_US.UTF-8/Compose"

1) http://www.xfree86.org/4.4.0/RELNOTES5.html#42
2)
http://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/fi_FI.UTF-8/Compose.pre


Signed-off-by: Marko Myllynen <myllynen at redhat.com>


--- a/modules/im/ximcp/imLcPrs.c
+++ b/modules/im/ximcp/imLcPrs.c
@@ -44,6 +44,13 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #include <sys/stat.h>
 #include <stdio.h>

+#define XLC_BUFSIZE 256
+
+extern void xlocaledir(
+    char *buf,
+    int buf_len
+);
+
 extern int _Xmbstowcs(
     wchar_t	*wstr,
     char	*str,
@@ -304,6 +311,7 @@ static char*
 TransFileName(Xim im, char *name)
 {
    char *home = NULL, *lcCompose = NULL;
+   char dir[XLC_BUFSIZE];
    char *i = name, *ret, *j;
    int l = 0;

@@ -324,6 +332,10 @@ TransFileName(Xim im, char *name)
                  if (lcCompose)
                      l += strlen(lcCompose);
    	         break;
+   	      case 'S':
+                 xlocaledir(dir, XLC_BUFSIZE);
+                 l += strlen(dir);
+   	         break;
    	  }
       } else {
       	  l++;
@@ -355,6 +367,10 @@ TransFileName(Xim im, char *name)
                     Xfree(lcCompose);
                  }
    	         break;
+   	      case 'S':
+                 strcpy(j, dir);
+                 j += strlen(dir);
+   	         break;
    	  }
           i++;
       } else {

--- a/src/xlibi18n/lcFile.c
+++ b/src/xlibi18n/lcFile.c
@@ -219,7 +219,7 @@ _XlcParsePath(
 #define XLOCALEDIR "/usr/lib/X11/locale"
 #endif

-static void
+void
 xlocaledir(
     char *buf,
     int buf_len)


-- 
Marko Myllynen


More information about the xorg-devel mailing list