Allow inclusion of system level compose files.

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¹. 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² but it
is almost identical with en_US.UTF-8 except for perhaps half a dozen
compositions.

This commit allows 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@redhat.com>
Signed-off-by: James Cloos <cloos@jhcloos.com>
This commit is contained in:
James Cloos 2010-01-13 11:04:38 -05:00
parent ccf21a8877
commit 9df349a789
2 changed files with 17 additions and 1 deletions

View file

@ -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 {

View file

@ -219,7 +219,7 @@ _XlcParsePath(
#define XLOCALEDIR "/usr/lib/X11/locale"
#endif
static void
void
xlocaledir(
char *buf,
int buf_len)