From e699c4231c205ef00d687b6412308d031b99806b Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Wed, 16 May 2007 18:01:23 +0200 Subject: [PATCH 01/36] Constified error list. --- src/ErrDes.c | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/src/ErrDes.c b/src/ErrDes.c index eb5b4c25..ca5dfeb3 100644 --- a/src/ErrDes.c +++ b/src/ErrDes.c @@ -71,25 +71,31 @@ SOFTWARE. * descriptions of errors in Section 4 of Protocol doc (pp. 350-351); more * verbose descriptions are given in the error database */ -static const char * const _XErrorList[] = { - /* No error */ "no error", - /* BadRequest */ "BadRequest", - /* BadValue */ "BadValue", - /* BadWindow */ "BadWindow", - /* BadPixmap */ "BadPixmap", - /* BadAtom */ "BadAtom", - /* BadCursor */ "BadCursor", - /* BadFont */ "BadFont", - /* BadMatch */ "BadMatch", - /* BadDrawable */ "BadDrawable", - /* BadAccess */ "BadAccess", - /* BadAlloc */ "BadAlloc", - /* BadColor */ "BadColor", - /* BadGC */ "BadGC", - /* BadIDChoice */ "BadIDChoice", - /* BadName */ "BadName", - /* BadLength */ "BadLength", - /* BadImplementation */ "BadImplementation", +static const char _XErrorList[] = + /* No error */ "no error\0" + /* BadRequest */ "BadRequest\0" + /* BadValue */ "BadValue\0" + /* BadWindow */ "BadWindow\0" + /* BadPixmap */ "BadPixmap\0" + /* BadAtom */ "BadAtom\0" + /* BadCursor */ "BadCursor\0" + /* BadFont */ "BadFont\0" + /* BadMatch */ "BadMatch\0" + /* BadDrawable */ "BadDrawable\0" + /* BadAccess */ "BadAccess\0" + /* BadAlloc */ "BadAlloc\0" + /* BadColor */ "BadColor\0" + /* BadGC */ "BadGC\0" + /* BadIDChoice */ "BadIDChoice\0" + /* BadName */ "BadName\0" + /* BadLength */ "BadLength\0" + /* BadImplementation */ "BadImplementation" +; + +/* offsets into _XErrorList */ +static const unsigned char _XErrorOffsets[] = { + 0, 9, 20, 29, 39, 49, 57, 67, 75, 84, 96, + 106, 115, 124, 130, 142, 150, 160 }; @@ -107,7 +113,8 @@ XGetErrorText( if (nbytes == 0) return 0; if (code <= BadImplementation && code > 0) { sprintf(buf, "%d", code); - (void) XGetErrorDatabaseText(dpy, "XProtoError", buf, _XErrorList[code], + (void) XGetErrorDatabaseText(dpy, "XProtoError", buf, + _XErrorList + _XErrorOffsets[code], buffer, nbytes); } else buffer[0] = '\0'; From 6c508eab5df5d517f7e4cbe6087308cd53a564b2 Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Wed, 16 May 2007 18:24:42 +0200 Subject: [PATCH 02/36] Constified more tables. --- src/StBytes.c | 5 ++++- src/imConv.c | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/StBytes.c b/src/StBytes.c index b81e7a1b..1476e83d 100644 --- a/src/StBytes.c +++ b/src/StBytes.c @@ -33,7 +33,7 @@ in this Software without prior written authorization from The Open Group. #include /* insulate predefined atom numbers from cut routines */ -static Atom n_to_atom[8] = { +static const Atom n_to_atom[8] = { XA_CUT_BUFFER0, XA_CUT_BUFFER1, XA_CUT_BUFFER2, @@ -48,6 +48,9 @@ XRotateBuffers ( register Display *dpy, int rotate) { + /* XRotateWindowProperties wants a non-const Atom*, but it doesn't + * modify it, so this is safe. + */ return XRotateWindowProperties(dpy, RootWindow(dpy, 0), n_to_atom, 8, rotate); } diff --git a/src/imConv.c b/src/imConv.c index 408336bb..e30f8ef9 100644 --- a/src/imConv.c +++ b/src/imConv.c @@ -67,11 +67,11 @@ typedef int (*ucstocsConvProc)( ); struct SubstRec { - const char* encoding_name; - const char* charset_name; + const char encoding_name[8]; + const char charset_name[12]; }; -static struct SubstRec SubstTable[] = { +static const struct SubstRec SubstTable[] = { {"STRING", "ISO8859-1"}, {"TIS620", "TIS620-0"}, {"UTF-8", "ISO10646-1"} From 6d2bed8f04942b4de086a519ac693e729c9fdeea Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Wed, 16 May 2007 19:18:20 +0200 Subject: [PATCH 03/36] Constify and clean up token table. --- src/xlibi18n/lcDB.c | 73 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/src/xlibi18n/lcDB.c b/src/xlibi18n/lcDB.c index b7c7edd2..5228a006 100644 --- a/src/xlibi18n/lcDB.c +++ b/src/xlibi18n/lcDB.c @@ -99,10 +99,7 @@ typedef enum { typedef struct { Token token; /* token id */ - const char *name; /* token sequence */ int len; /* length of token sequence */ - int (*parse_proc)(const char *str, Token token, Database *db); - /* parsing procedure */ } TokenTable; static int f_newline (const char *str, Token token, Database *db); @@ -116,20 +113,20 @@ static int f_backslash (const char *str, Token token, Database *db); static int f_numeric (const char *str, Token token, Database *db); static int f_default (const char *str, Token token, Database *db); -static TokenTable token_tbl[] = { - { T_NEWLINE, "\n", 1, f_newline }, - { T_COMMENT, "#", 1, f_comment }, - { T_SEMICOLON, ";", 1, f_semicolon }, - { T_DOUBLE_QUOTE, "\"", 1, f_double_quote }, - { T_LEFT_BRACE, "{", 1, f_left_brace }, - { T_RIGHT_BRACE, "}", 1, f_right_brace }, - { T_SPACE, " ", 1, f_white }, - { T_TAB, "\t", 1, f_white }, - { T_BACKSLASH, "\\", 1, f_backslash }, - { T_NUMERIC_HEX, "\\x", 2, f_numeric }, - { T_NUMERIC_DEC, "\\d", 2, f_numeric }, - { T_NUMERIC_OCT, "\\o", 2, f_numeric }, - { T_DEFAULT, " ", 1, f_default } /* any character */ +static const TokenTable token_tbl[] = { + { T_NEWLINE, 1 }, + { T_COMMENT, 1 }, + { T_SEMICOLON, 1 }, + { T_DOUBLE_QUOTE, 1 }, + { T_LEFT_BRACE, 1 }, + { T_RIGHT_BRACE, 1 }, + { T_SPACE, 1 }, + { T_TAB, 1 }, + { T_BACKSLASH, 1 }, + { T_NUMERIC_HEX, 2 }, + { T_NUMERIC_DEC, 2 }, + { T_NUMERIC_OCT, 2 }, + { T_DEFAULT, 1 } /* any character */ }; #define SYM_CR '\r' @@ -1093,8 +1090,48 @@ CreateDatabase( } p = line.str; while (*p) { + int (*parse_proc)(const char *str, Token token, Database *db) = NULL; + token = get_token(p); - len = (*token_tbl[token].parse_proc)(p, token, &db); + + switch (token_tbl[token].token) { + case T_NEWLINE: + parse_proc = f_newline; + break; + case T_COMMENT: + parse_proc = f_comment; + break; + case T_SEMICOLON: + parse_proc = f_semicolon; + break; + case T_DOUBLE_QUOTE: + parse_proc = f_double_quote; + break; + case T_LEFT_BRACE: + parse_proc = f_left_brace; + break; + case T_RIGHT_BRACE: + parse_proc = f_right_brace; + break; + case T_SPACE: + case T_TAB: + parse_proc = f_white; + break; + case T_BACKSLASH: + parse_proc = f_backslash; + break; + case T_NUMERIC_HEX: + case T_NUMERIC_DEC: + case T_NUMERIC_OCT: + parse_proc = f_numeric; + break; + case T_DEFAULT: + parse_proc = f_default; + break; + } + + len = parse_proc(p, token, &db); + if (len < 1) { error = 1; break; From 0e8d9ca47dab0d069e305d5784d05f2ade04f0a8 Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Wed, 16 May 2007 19:36:23 +0200 Subject: [PATCH 04/36] More constification. --- modules/im/ximcp/imLcPrs.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/modules/im/ximcp/imLcPrs.c b/modules/im/ximcp/imLcPrs.c index ac533244..42f8f2a2 100644 --- a/modules/im/ximcp/imLcPrs.c +++ b/modules/im/ximcp/imLcPrs.c @@ -278,32 +278,26 @@ static long modmask( char *name) { - long mask; - struct _modtbl { - const char *name; + const char name[6]; long mask; }; - struct _modtbl *p; - static struct _modtbl tbl[] = { + static const struct _modtbl tbl[] = { { "Ctrl", ControlMask }, { "Lock", LockMask }, { "Caps", LockMask }, { "Shift", ShiftMask }, { "Alt", Mod1Mask }, - { "Meta", Mod1Mask }, - { NULL, 0 }}; + { "Meta", Mod1Mask }}; - p = tbl; - mask = 0; - for (p = tbl; p->name != NULL; p++) { - if (strcmp(name, p->name) == 0) { - mask = p->mask; - break; - } - } - return(mask); + int i, num_entries = sizeof (tbl) / sizeof (tbl[0]); + + for (i = 0; i < num_entries; i++) + if (!strcmp (name, tbl[i].name)) + return tbl[i].mask; + + return 0; } static char* From 0581c0aa6039e6b2abb9f7b0a4f9904d8e01f00e Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Wed, 16 May 2007 23:19:22 +0200 Subject: [PATCH 05/36] Have the compiler fill in hexTable so we don't have to do it at runtime. --- src/RdBitF.c | 55 +++++++++++++++------------------------------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/src/RdBitF.c b/src/RdBitF.c index 198e0e4a..0b31230e 100644 --- a/src/RdBitF.c +++ b/src/RdBitF.c @@ -56,43 +56,23 @@ from The Open Group. #define MAX_SIZE 255 /* shared data for the image read/parse logic */ -static short hexTable[256]; /* conversion value */ -static Bool initialized = False; /* easier to fill in at run time */ +static const short hexTable[256] = { + ['0'] = 0, ['1'] = 1, + ['2'] = 2, ['3'] = 3, + ['4'] = 4, ['5'] = 5, + ['6'] = 6, ['7'] = 7, + ['8'] = 8, ['9'] = 9, + ['A'] = 10, ['B'] = 11, + ['C'] = 12, ['D'] = 13, + ['E'] = 14, ['F'] = 15, + ['a'] = 10, ['b'] = 11, + ['c'] = 12, ['d'] = 13, + ['e'] = 14, ['f'] = 15, - -/* - * Table index for the hex values. Initialized once, first time. - * Used for translation value or delimiter significance lookup. - */ -static void initHexTable(void) -{ - /* - * We build the table at run time for several reasons: - * - * 1. portable to non-ASCII machines. - * 2. still reentrant since we set the init flag after setting table. - * 3. easier to extend. - * 4. less prone to bugs. - */ - hexTable['0'] = 0; hexTable['1'] = 1; - hexTable['2'] = 2; hexTable['3'] = 3; - hexTable['4'] = 4; hexTable['5'] = 5; - hexTable['6'] = 6; hexTable['7'] = 7; - hexTable['8'] = 8; hexTable['9'] = 9; - hexTable['A'] = 10; hexTable['B'] = 11; - hexTable['C'] = 12; hexTable['D'] = 13; - hexTable['E'] = 14; hexTable['F'] = 15; - hexTable['a'] = 10; hexTable['b'] = 11; - hexTable['c'] = 12; hexTable['d'] = 13; - hexTable['e'] = 14; hexTable['f'] = 15; - - /* delimiters of significance are flagged w/ negative value */ - hexTable[' '] = -1; hexTable[','] = -1; - hexTable['}'] = -1; hexTable['\n'] = -1; - hexTable['\t'] = -1; - - initialized = True; -} + [' '] = -1, [','] = -1, + ['}'] = -1, ['\n'] = -1, + ['\t'] = -1 +}; /* * read next hex value in the input stream, return -1 if EOF @@ -151,9 +131,6 @@ XReadBitmapFileData ( int hx = -1; /* x hotspot */ int hy = -1; /* y hotspot */ - /* first time initialization */ - if (initialized == False) initHexTable(); - #ifdef __UNIXOS2__ filename = __XOS2RedirRoot(filename); #endif From a4f3841940158351f9424c3f59b305cce877177d Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Thu, 17 May 2007 00:29:43 +0200 Subject: [PATCH 06/36] Constified composite text charset table. --- src/xlibi18n/lcCT.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/xlibi18n/lcCT.c b/src/xlibi18n/lcCT.c index 63608a3c..f3a91e6c 100644 --- a/src/xlibi18n/lcCT.c +++ b/src/xlibi18n/lcCT.c @@ -53,11 +53,11 @@ * Static representation of a character set that can be used in Compound Text. */ typedef struct _CTDataRec { - const char *name; - const char *ct_sequence; /* Compound Text encoding, ESC sequence */ + const char name[19]; + const char ct_sequence[5]; /* Compound Text encoding, ESC sequence */ } CTDataRec, *CTData; -static CTDataRec default_ct_data[] = +static const CTDataRec default_ct_data[] = { /* */ /* X11 registry name MIME name ISO-IR ESC sequence */ @@ -1265,7 +1265,7 @@ Bool _XlcInitCTInfo() { if (ct_list == NULL) { - CTData ct_data; + const CTDataRec *ct_data; int num; XlcCharSet charset; From 91b02b8064f4e0bcc56019f0722914850008a597 Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Thu, 17 May 2007 19:07:34 +0200 Subject: [PATCH 07/36] More constification. --- modules/im/ximcp/imRm.c | 410 ++++++++++++++++++++++++---------------- 1 file changed, 249 insertions(+), 161 deletions(-) diff --git a/modules/im/ximcp/imRm.c b/modules/im/ximcp/imRm.c index 47fe3952..f6599eb6 100644 --- a/modules/im/ximcp/imRm.c +++ b/modules/im/ximcp/imRm.c @@ -42,8 +42,10 @@ PERFORMANCE OF THIS SOFTWARE. #include "Ximint.h" #include "Xresource.h" +#define GET_NAME(x) name_table + x.name_offset + typedef struct _XimValueOffsetInfo { - const char *name; + unsigned short name_offset; XrmQuark quark; unsigned int offset; Bool (*defaults)( @@ -206,54 +208,136 @@ _XimSetProtoResource(im) } #endif /* XIM_CONNECTABLE */ -static const char *supported_local_im_values_list[] = { - XNQueryInputStyle, - XNResourceName, - XNResourceClass, - XNDestroyCallback, - XNQueryIMValuesList, - XNQueryICValuesList, - XNVisiblePosition, - NULL +static const char name_table[] = + /* 0 */ XNQueryInputStyle"\0" + /* 16 */ XNClientWindow"\0" + /* 29 */ XNInputStyle"\0" + /* 40 */ XNFocusWindow"\0" + /* 52 */ XNResourceName"\0" + /* 65 */ XNResourceClass"\0" + /* 79 */ XNGeometryCallback"\0" + /* 96 */ XNDestroyCallback"\0" + /* 112 */ XNFilterEvents"\0" + /* 125 */ XNPreeditStartCallback"\0" + /* 146 */ XNPreeditDoneCallback"\0" + /* 166 */ XNPreeditDrawCallback"\0" + /* 186 */ XNPreeditCaretCallback"\0" + /* 207 */ XNPreeditStateNotifyCallback"\0" + /* 234 */ XNPreeditAttributes"\0" + /* 252 */ XNStatusStartCallback"\0" + /* 272 */ XNStatusDoneCallback"\0" + /* 291 */ XNStatusDrawCallback"\0" + /* 310 */ XNStatusAttributes"\0" + /* 327 */ XNArea"\0" + /* 332 */ XNAreaNeeded"\0" + /* 343 */ XNSpotLocation"\0" + /* 356 */ XNColormap"\0" + /* 365 */ XNStdColormap"\0" + /* 377 */ XNForeground"\0" + /* 388 */ XNBackground"\0" + /* 399 */ XNBackgroundPixmap"\0" + /* 416 */ XNFontSet"\0" + /* 424 */ XNLineSpace"\0" + /* 434 */ XNCursor"\0" + /* 441 */ XNQueryIMValuesList"\0" + /* 459 */ XNQueryICValuesList"\0" + /* 477 */ XNVisiblePosition"\0" + /* 493 */ XNStringConversionCallback"\0" + /* 518 */ XNStringConversion"\0" + /* 535 */ XNResetState"\0" + /* 546 */ XNHotKey"\0" + /* 553 */ XNHotKeyState"\0" + /* 565 */ XNPreeditState +; + +#define OFFSET_XNQUERYINPUTSTYLE 0 +#define OFFSET_XNCLIENTWINDOW 16 +#define OFFSET_XNINPUTSTYLE 29 +#define OFFSET_XNFOCUSWINDOW 40 +#define OFFSET_XNRESOURCENAME 52 +#define OFFSET_XNRESOURCECLASS 65 +#define OFFSET_XNGEOMETRYCALLBACK 79 +#define OFFSET_XNDESTROYCALLBACK 96 +#define OFFSET_XNFILTEREVENTS 112 +#define OFFSET_XNPREEDITSTARTCALLBACK 125 +#define OFFSET_XNPREEDITDONECALLBACK 146 +#define OFFSET_XNPREEDITDRAWCALLBACK 166 +#define OFFSET_XNPREEDITCARETCALLBACK 186 +#define OFFSET_XNPREEDITSTATENOTIFYCALLBACK 207 +#define OFFSET_XNPREEDITATTRIBUTES 234 +#define OFFSET_XNSTATUSSTARTCALLBACK 252 +#define OFFSET_XNSTATUSDONECALLBACK 272 +#define OFFSET_XNSTATUSDRAWCALLBACK 291 +#define OFFSET_XNSTATUSATTRIBUTES 310 +#define OFFSET_XNAREA 327 +#define OFFSET_XNAREANEEDED 332 +#define OFFSET_XNSPOTLOCATION 343 +#define OFFSET_XNCOLORMAP 356 +#define OFFSET_XNSTDCOLORMAP 365 +#define OFFSET_XNFOREGROUND 377 +#define OFFSET_XNBACKGROUND 388 +#define OFFSET_XNBACKGROUNDPIXMAP 399 +#define OFFSET_XNFONTSET 416 +#define OFFSET_XNLINESPACE 424 +#define OFFSET_XNCURSOR 434 +#define OFFSET_XNQUERYIMVALUESLIST 441 +#define OFFSET_XNQUERYICVALUESLIST 459 +#define OFFSET_XNVISIBLEPOSITION 477 +#define OFFSET_XNSTRINGCONVERSIONCALLBACK 493 +#define OFFSET_XNSTRINGCONVERSION 518 +#define OFFSET_XNRESETSTATE 535 +#define OFFSET_XNHOTKEY 546 +#define OFFSET_XNHOTKEYSTATE 553 +#define OFFSET_XNPREEDITSTATE 565 + +/* offsets into name_table */ +static const unsigned short supported_local_im_values_list[] = { + OFFSET_XNQUERYINPUTSTYLE, + OFFSET_XNRESOURCENAME, + OFFSET_XNRESOURCECLASS, + OFFSET_XNDESTROYCALLBACK, + OFFSET_XNQUERYIMVALUESLIST, + OFFSET_XNQUERYICVALUESLIST, + OFFSET_XNVISIBLEPOSITION }; -static const char *supported_local_ic_values_list[] = { - XNInputStyle, - XNClientWindow, - XNFocusWindow, - XNResourceName, - XNResourceClass, - XNGeometryCallback, - XNFilterEvents, - XNDestroyCallback, - XNStringConversionCallback, - XNStringConversion, - XNResetState, - XNHotKey, - XNHotKeyState, - XNPreeditAttributes, - XNStatusAttributes, - XNArea, - XNAreaNeeded, - XNSpotLocation, - XNColormap, - XNStdColormap, - XNForeground, - XNBackground, - XNBackgroundPixmap, - XNFontSet, - XNLineSpace, - XNCursor, - XNPreeditStartCallback, - XNPreeditDoneCallback, - XNPreeditDrawCallback, - XNPreeditCaretCallback, - XNStatusStartCallback, - XNStatusDoneCallback, - XNStatusDrawCallback, - XNPreeditState, - XNPreeditStateNotifyCallback, - NULL +/* offsets into name_table */ +static const unsigned short supported_local_ic_values_list[] = { + OFFSET_XNINPUTSTYLE, + OFFSET_XNCLIENTWINDOW, + OFFSET_XNFOCUSWINDOW, + OFFSET_XNRESOURCENAME, + OFFSET_XNRESOURCECLASS, + OFFSET_XNGEOMETRYCALLBACK, + OFFSET_XNFILTEREVENTS, + OFFSET_XNDESTROYCALLBACK, + OFFSET_XNSTRINGCONVERSIONCALLBACK, + OFFSET_XNSTRINGCONVERSIONCALLBACK, + OFFSET_XNRESETSTATE, + OFFSET_XNHOTKEY, + OFFSET_XNHOTKEYSTATE, + OFFSET_XNPREEDITATTRIBUTES, + OFFSET_XNSTATUSATTRIBUTES, + OFFSET_XNAREA, + OFFSET_XNAREANEEDED, + OFFSET_XNSPOTLOCATION, + OFFSET_XNCOLORMAP, + OFFSET_XNSTDCOLORMAP, + OFFSET_XNFOREGROUND, + OFFSET_XNBACKGROUND, + OFFSET_XNBACKGROUNDPIXMAP, + OFFSET_XNFONTSET, + OFFSET_XNLINESPACE, + OFFSET_XNCURSOR, + OFFSET_XNPREEDITSTARTCALLBACK, + OFFSET_XNPREEDITDONECALLBACK, + OFFSET_XNPREEDITDRAWCALLBACK, + OFFSET_XNPREEDITCARETCALLBACK, + OFFSET_XNSTATUSSTARTCALLBACK, + OFFSET_XNSTATUSDONECALLBACK, + OFFSET_XNSTATUSDRAWCALLBACK, + OFFSET_XNPREEDITSTATE, + OFFSET_XNPREEDITSTATENOTIFYCALLBACK }; static XIMStyle const supported_local_styles[] = { @@ -312,7 +396,7 @@ _XimDefaultIMValues( int len; XPointer tmp; - n = XIMNumber(supported_local_im_values_list) - 1; + n = XIMNumber(supported_local_im_values_list); len = sizeof(XIMValuesList) + sizeof(char **) * n; if(!(tmp = (XPointer)Xmalloc(len))) { return False; @@ -325,8 +409,8 @@ _XimDefaultIMValues( values_list->supported_values = (char **)((char *)tmp + sizeof(XIMValuesList)); for(i = 0; i < n; i++) { - values_list->supported_values[i] - = supported_local_im_values_list[i]; + values_list->supported_values[i] = + name_table + supported_local_im_values_list[i]; } } @@ -349,7 +433,7 @@ _XimDefaultICValues( int len; XPointer tmp; - n = XIMNumber(supported_local_ic_values_list) - 1; + n = XIMNumber(supported_local_ic_values_list); len = sizeof(XIMValuesList) + sizeof(char **) * n; if(!(tmp = (XPointer)Xmalloc(len))) { return False; @@ -362,8 +446,8 @@ _XimDefaultICValues( values_list->supported_values = (char **)((char *)tmp + sizeof(XIMValuesList)); for(i = 0; i < n; i++) { - values_list->supported_values[i] - = supported_local_ic_values_list[i]; + values_list->supported_values[i] = + name_table + supported_local_ic_values_list[i]; } } @@ -1439,247 +1523,245 @@ static XIMResource ic_inner_resources[] = { }; static XimValueOffsetInfoRec im_attr_info[] = { - {XNQueryInputStyle, 0, + {OFFSET_XNQUERYINPUTSTYLE, 0, XOffsetOf(XimDefIMValues, styles), _XimDefaultStyles, NULL, _XimDecodeStyles}, - {XNDestroyCallback, 0, + {OFFSET_XNDESTROYCALLBACK, 0, XOffsetOf(XimDefIMValues, destroy_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNResourceName, 0, + {OFFSET_XNRESOURCENAME, 0, XOffsetOf(XimDefIMValues, res_name), NULL, _XimEncodeString, _XimDecodeString}, - {XNResourceClass, 0, + {OFFSET_XNRESOURCECLASS, 0, XOffsetOf(XimDefIMValues, res_class), NULL, _XimEncodeString, _XimDecodeString}, - {XNQueryIMValuesList, 0, + {OFFSET_XNQUERYIMVALUESLIST, 0, XOffsetOf(XimDefIMValues, im_values_list), _XimDefaultIMValues, NULL, _XimDecodeValues}, - {XNQueryICValuesList, 0, + {OFFSET_XNQUERYICVALUESLIST, 0, XOffsetOf(XimDefIMValues, ic_values_list), _XimDefaultICValues, NULL, _XimDecodeValues}, - {XNVisiblePosition, 0, + {OFFSET_XNVISIBLEPOSITION, 0, XOffsetOf(XimDefIMValues, visible_position), _XimDefaultVisiblePos, NULL, _XimDecodeBool} }; static XimValueOffsetInfoRec ic_attr_info[] = { - {XNInputStyle, 0, + {OFFSET_XNINPUTSTYLE, 0, XOffsetOf(XimDefICValues, input_style), NULL, _XimEncodeStyle, _XimDecodeStyle}, - {XNClientWindow, 0, + {OFFSET_XNCLIENTWINDOW, 0, XOffsetOf(XimDefICValues, client_window), NULL, _XimEncodeWindow, _XimDecodeWindow}, - {XNFocusWindow, 0, + {OFFSET_XNFOCUSWINDOW, 0, XOffsetOf(XimDefICValues, focus_window), _XimDefaultFocusWindow, _XimEncodeWindow, _XimDecodeWindow}, - {XNResourceName, 0, + {OFFSET_XNRESOURCENAME, 0, XOffsetOf(XimDefICValues, res_name), _XimDefaultResName, _XimEncodeString, _XimDecodeString}, - {XNResourceClass, 0, + {OFFSET_XNRESOURCECLASS, 0, XOffsetOf(XimDefICValues, res_class), _XimDefaultResClass, _XimEncodeString, _XimDecodeString}, - {XNGeometryCallback, 0, + {OFFSET_XNGEOMETRYCALLBACK, 0, XOffsetOf(XimDefICValues, geometry_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNFilterEvents, 0, + {OFFSET_XNFILTEREVENTS, 0, XOffsetOf(XimDefICValues, filter_events), NULL, NULL, _XimDecodeLong}, - {XNDestroyCallback, 0, + {OFFSET_XNDESTROYCALLBACK, 0, XOffsetOf(XimDefICValues, destroy_callback), _XimDefaultDestroyCB, _XimEncodeCallback, _XimDecodeCallback}, - {XNStringConversionCallback, 0, + {OFFSET_XNSTRINGCONVERSIONCALLBACK, 0, XOffsetOf(XimDefICValues, string_conversion_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNStringConversion, 0, + {OFFSET_XNSTRINGCONVERSION, 0, XOffsetOf(XimDefICValues, string_conversion), NULL, _XimEncodeStringConv, _XimDecodeStringConv}, - {XNResetState, 0, + {OFFSET_XNRESETSTATE, 0, XOffsetOf(XimDefICValues, reset_state), _XimDefaultResetState, _XimEncodeResetState, _XimDecodeResetState}, - {XNHotKey, 0, + {OFFSET_XNHOTKEY, 0, XOffsetOf(XimDefICValues, hotkey), NULL, _XimEncodeHotKey, _XimDecodeHotKey}, - {XNHotKeyState, 0, + {OFFSET_XNHOTKEYSTATE, 0, XOffsetOf(XimDefICValues, hotkey_state), _XimDefaultHotKeyState, _XimEncodeHotKetState, _XimDecodeHotKetState}, - {XNPreeditAttributes, 0, + {OFFSET_XNPREEDITATTRIBUTES, 0, XOffsetOf(XimDefICValues, preedit_attr), _XimDefaultNest, _XimEncodeNest, _XimDecodeNest}, - {XNStatusAttributes, 0, + {OFFSET_XNSTATUSATTRIBUTES, 0, XOffsetOf(XimDefICValues, status_attr), _XimDefaultNest, _XimEncodeNest, _XimDecodeNest}, }; static XimValueOffsetInfoRec ic_pre_attr_info[] = { - {XNArea, 0, + {OFFSET_XNAREA, 0, XOffsetOf(ICPreeditAttributes, area), _XimDefaultArea, _XimEncodeRectangle, _XimDecodeRectangle}, - {XNAreaNeeded, 0, + {OFFSET_XNAREANEEDED, 0, XOffsetOf(ICPreeditAttributes, area_needed), NULL, _XimEncodeRectangle, _XimDecodeRectangle}, - {XNSpotLocation, 0, + {OFFSET_XNSPOTLOCATION, 0, XOffsetOf(ICPreeditAttributes, spot_location), NULL, _XimEncodeSpot, _XimDecodeSpot}, - {XNColormap, 0, + {OFFSET_XNCOLORMAP, 0, XOffsetOf(ICPreeditAttributes, colormap), _XimDefaultColormap, _XimEncodeColormap, _XimDecodeColormap}, - {XNStdColormap, 0, + {OFFSET_XNSTDCOLORMAP, 0, XOffsetOf(ICPreeditAttributes, std_colormap), _XimDefaultStdColormap, _XimEncodeStdColormap, _XimDecodeStdColormap}, - {XNForeground, 0, + {OFFSET_XNFOREGROUND, 0, XOffsetOf(ICPreeditAttributes, foreground), _XimDefaultFg, _XimEncodeLong, _XimDecodeLong}, - {XNBackground, 0, + {OFFSET_XNBACKGROUND, 0, XOffsetOf(ICPreeditAttributes, background), _XimDefaultBg, _XimEncodeLong, _XimDecodeLong}, - {XNBackgroundPixmap, 0, + {OFFSET_XNBACKGROUNDPIXMAP, 0, XOffsetOf(ICPreeditAttributes, background_pixmap), _XimDefaultBgPixmap, _XimEncodeBgPixmap, _XimDecodeBgPixmap}, - {XNFontSet, 0, + {OFFSET_XNFONTSET, 0, XOffsetOf(ICPreeditAttributes, fontset), _XimDefaultFontSet, _XimEncodeFontSet, _XimDecodeFontSet}, - {XNLineSpace, 0, + {OFFSET_XNLINESPACE, 0, XOffsetOf(ICPreeditAttributes, line_spacing), _XimDefaultLineSpace, _XimEncodeLineSpace, _XimDecodeLineSpace}, - {XNCursor, 0, + {OFFSET_XNCURSOR, 0, XOffsetOf(ICPreeditAttributes, cursor), _XimDefaultCursor, _XimEncodeCursor, _XimDecodeCursor}, - {XNPreeditStartCallback, 0, + {OFFSET_XNPREEDITSTARTCALLBACK, 0, XOffsetOf(ICPreeditAttributes, start_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNPreeditDoneCallback, 0, + {OFFSET_XNPREEDITDONECALLBACK, 0, XOffsetOf(ICPreeditAttributes, done_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNPreeditDrawCallback, 0, + {OFFSET_XNPREEDITDRAWCALLBACK, 0, XOffsetOf(ICPreeditAttributes, draw_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNPreeditCaretCallback, 0, + {OFFSET_XNPREEDITCARETCALLBACK, 0, XOffsetOf(ICPreeditAttributes, caret_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNPreeditState, 0, + {OFFSET_XNPREEDITSTATE, 0, XOffsetOf(ICPreeditAttributes, preedit_state), _XimDefaultPreeditState, _XimEncodePreeditState,_XimDecodePreeditState}, - {XNPreeditStateNotifyCallback, 0, + {OFFSET_XNPREEDITSTATENOTIFYCALLBACK, 0, XOffsetOf(ICPreeditAttributes, state_notify_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, }; static XimValueOffsetInfoRec ic_sts_attr_info[] = { - {XNArea, 0, + {OFFSET_XNAREA, 0, XOffsetOf(ICStatusAttributes, area), _XimDefaultArea, _XimEncodeRectangle, _XimDecodeRectangle}, - {XNAreaNeeded, 0, + {OFFSET_XNAREANEEDED, 0, XOffsetOf(ICStatusAttributes, area_needed), NULL, _XimEncodeRectangle, _XimDecodeRectangle}, - {XNColormap, 0, + {OFFSET_XNCOLORMAP, 0, XOffsetOf(ICStatusAttributes, colormap), _XimDefaultColormap, _XimEncodeColormap, _XimDecodeColormap}, - {XNStdColormap, 0, + {OFFSET_XNSTDCOLORMAP, 0, XOffsetOf(ICStatusAttributes, std_colormap), _XimDefaultStdColormap, _XimEncodeStdColormap, _XimDecodeStdColormap}, - {XNForeground, 0, + {OFFSET_XNFOREGROUND, 0, XOffsetOf(ICStatusAttributes, foreground), _XimDefaultFg, _XimEncodeLong, _XimDecodeLong}, - {XNBackground, 0, + {OFFSET_XNBACKGROUND, 0, XOffsetOf(ICStatusAttributes, background), _XimDefaultBg, _XimEncodeLong, _XimDecodeLong}, - {XNBackgroundPixmap, 0, + {OFFSET_XNBACKGROUNDPIXMAP, 0, XOffsetOf(ICStatusAttributes, background_pixmap), _XimDefaultBgPixmap, _XimEncodeBgPixmap, _XimDecodeBgPixmap}, - {XNFontSet, 0, + {OFFSET_XNFONTSET, 0, XOffsetOf(ICStatusAttributes, fontset), _XimDefaultFontSet, _XimEncodeFontSet, _XimDecodeFontSet}, - {XNLineSpace, 0, + {OFFSET_XNLINESPACE, 0, XOffsetOf(ICStatusAttributes, line_spacing), _XimDefaultLineSpace, _XimEncodeLineSpace, _XimDecodeLineSpace}, - {XNCursor, 0, + {OFFSET_XNCURSOR, 0, XOffsetOf(ICStatusAttributes, cursor), _XimDefaultCursor, _XimEncodeCursor, _XimDecodeCursor}, - {XNStatusStartCallback, 0, + {OFFSET_XNSTATUSSTARTCALLBACK, 0, XOffsetOf(ICStatusAttributes, start_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNStatusDoneCallback, 0, + {OFFSET_XNSTATUSDONECALLBACK, 0, XOffsetOf(ICStatusAttributes, done_callback), NULL, _XimEncodeCallback, _XimDecodeCallback}, - {XNStatusDrawCallback, 0, + {OFFSET_XNSTATUSDRAWCALLBACK, 0, XOffsetOf(ICStatusAttributes, draw_callback), NULL, _XimEncodeCallback, _XimDecodeCallback} }; typedef struct _XimIMMode { - const char *name; - XrmQuark quark; + unsigned short name_offset; unsigned short mode; } XimIMMode; -static XimIMMode im_mode[] = { - {XNQueryInputStyle, 0, +static const XimIMMode im_mode[] = { + {OFFSET_XNQUERYINPUTSTYLE, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, - {XNDestroyCallback, 0, + {OFFSET_XNDESTROYCALLBACK, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, - {XNResourceName, 0, + {OFFSET_XNRESOURCENAME, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, - {XNResourceClass, 0, + {OFFSET_XNRESOURCECLASS, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)}, - {XNQueryIMValuesList, 0, + {OFFSET_XNQUERYIMVALUESLIST, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, - {XNQueryICValuesList, 0, + {OFFSET_XNQUERYICVALUESLIST, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}, - {XNVisiblePosition, 0, + {OFFSET_XNVISIBLEPOSITION, (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)} }; typedef struct _XimICMode { - const char *name; - XrmQuark quark; + unsigned short name_offset; unsigned short preedit_callback_mode; unsigned short preedit_position_mode; unsigned short preedit_area_mode; @@ -1691,8 +1773,8 @@ typedef struct _XimICMode { unsigned short status_none_mode; } XimICMode; -static XimICMode ic_mode[] = { - {XNInputStyle, 0, +static const XimICMode ic_mode[] = { + {OFFSET_XNINPUTSTYLE, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET), @@ -1702,7 +1784,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET), (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET), (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET)}, - {XNClientWindow, 0, + {OFFSET_XNCLIENTWINDOW, (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET), @@ -1712,7 +1794,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET), (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET), 0}, - {XNFocusWindow, 0, + {OFFSET_XNFOCUSWINDOW, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1722,7 +1804,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNResourceName, 0, + {OFFSET_XNRESOURCENAME, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1732,7 +1814,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNResourceClass, 0, + {OFFSET_XNRESOURCECLASS, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1742,7 +1824,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNGeometryCallback, 0, + {OFFSET_XNGEOMETRYCALLBACK, 0, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1752,7 +1834,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0}, - {XNFilterEvents, 0, + {OFFSET_XNFILTEREVENTS, XIM_MODE_PRE_GET, XIM_MODE_PRE_GET, XIM_MODE_PRE_GET, @@ -1762,7 +1844,7 @@ static XimICMode ic_mode[] = { XIM_MODE_STS_GET, XIM_MODE_STS_GET, XIM_MODE_STS_GET}, - {XNDestroyCallback, 0, + {OFFSET_XNDESTROYCALLBACK, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1772,7 +1854,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNStringConversionCallback, 0, + {OFFSET_XNSTRINGCONVERSIONCALLBACK, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1782,7 +1864,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNStringConversion, 0, + {OFFSET_XNSTRINGCONVERSION, XIM_MODE_PRE_SET, XIM_MODE_PRE_SET, XIM_MODE_PRE_SET, @@ -1792,7 +1874,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNResetState, 0, + {OFFSET_XNRESETSTATE, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1802,7 +1884,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNHotKey, 0, + {OFFSET_XNHOTKEY, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1812,7 +1894,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNHotKeyState, 0, + {OFFSET_XNHOTKEYSTATE, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1822,7 +1904,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNPreeditAttributes, 0, + {OFFSET_XNPREEDITATTRIBUTES, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1832,7 +1914,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNStatusAttributes, 0, + {OFFSET_XNSTATUSATTRIBUTES, 0, 0, 0, @@ -1842,7 +1924,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNArea, 0, + {OFFSET_XNAREA, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1852,7 +1934,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0}, - {XNAreaNeeded, 0, + {OFFSET_XNAREANEEDED, 0, 0, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1862,7 +1944,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0, 0}, - {XNSpotLocation, 0, + {OFFSET_XNSPOTLOCATION, 0, /*(XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),*/ (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, @@ -1872,7 +1954,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNColormap, 0, + {OFFSET_XNCOLORMAP, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1882,7 +1964,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNStdColormap, 0, + {OFFSET_XNSTDCOLORMAP, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1892,7 +1974,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNForeground, 0, + {OFFSET_XNFOREGROUND, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1902,7 +1984,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNBackground, 0, + {OFFSET_XNBACKGROUND, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1912,7 +1994,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNBackgroundPixmap, 0, + {OFFSET_XNBACKGROUNDPIXMAP, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1922,7 +2004,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNFontSet, 0, + {OFFSET_XNFONTSET, 0, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1932,7 +2014,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNLineSpace, 0, + {OFFSET_XNLINESPACE, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1942,7 +2024,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNCursor, 0, + {OFFSET_XNCURSOR, 0, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -1952,7 +2034,7 @@ static XimICMode ic_mode[] = { (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET), 0}, - {XNPreeditStartCallback, 0, + {OFFSET_XNPREEDITSTARTCALLBACK, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, @@ -1962,7 +2044,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNPreeditDoneCallback, 0, + {OFFSET_XNPREEDITDONECALLBACK, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, @@ -1972,7 +2054,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNPreeditDrawCallback, 0, + {OFFSET_XNPREEDITDRAWCALLBACK, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, @@ -1982,7 +2064,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNPreeditCaretCallback, 0, + {OFFSET_XNPREEDITCARETCALLBACK, (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), 0, 0, @@ -1992,7 +2074,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNPreeditState, 0, + {OFFSET_XNPREEDITSTATE, (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -2002,7 +2084,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNPreeditStateNotifyCallback, 0, + {OFFSET_XNPREEDITSTATENOTIFYCALLBACK, (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET), @@ -2012,7 +2094,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNStatusStartCallback, 0, + {OFFSET_XNSTATUSSTARTCALLBACK, 0, 0, 0, @@ -2022,7 +2104,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNStatusDoneCallback, 0, + {OFFSET_XNSTATUSDONECALLBACK, 0, 0, 0, @@ -2032,7 +2114,7 @@ static XimICMode ic_mode[] = { 0, 0, 0}, - {XNStatusDrawCallback, 0, + {OFFSET_XNSTATUSDRAWCALLBACK, 0, 0, 0, @@ -2044,6 +2126,12 @@ static XimICMode ic_mode[] = { 0} }; +/* the quarks are separated from im_mode/ic_mode so those arrays + * can be const. + */ +static XrmQuark im_mode_quark[sizeof(im_mode) / sizeof(im_mode[0])]; +static XrmQuark ic_mode_quark[sizeof(ic_mode) / sizeof(ic_mode[0])]; + Private Bool _XimSetResourceList( XIMResourceList *res_list, @@ -2234,7 +2322,7 @@ _XimSetIMMode( for(i = 0; i < n; i++) { if(!(res = _XimGetResourceListRecByQuark(res_list, - list_num, im_mode[i].quark))) { + list_num, im_mode_quark[i]))) { continue; } res->mode = im_mode[i].mode; @@ -2327,7 +2415,7 @@ _XimSetICMode(res_list, list_num, style) for(i = 0; i < n; i++) { if(!(res = _XimGetResourceListRecByQuark(res_list, - list_num, ic_mode[i].quark))) { + list_num, ic_mode_quark[i]))) { continue; } res->mode = ( (*(unsigned short *)((char *)&ic_mode[i] + pre_offset)) @@ -3069,7 +3157,7 @@ _XimInitialIMOffsetInfo(void) register int i; for(i = 0; i < n; i++) { - im_attr_info[i].quark = XrmStringToQuark(im_attr_info[i].name); + im_attr_info[i].quark = XrmStringToQuark(GET_NAME(im_attr_info[i])); } } @@ -3081,17 +3169,17 @@ _XimInitialICOffsetInfo(void) n = XIMNumber(ic_attr_info); for(i = 0; i < n; i++) { - ic_attr_info[i].quark = XrmStringToQuark(ic_attr_info[i].name); + ic_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_attr_info[i])); } n = XIMNumber(ic_pre_attr_info); for(i = 0; i < n; i++) { - ic_pre_attr_info[i].quark = XrmStringToQuark(ic_pre_attr_info[i].name); + ic_pre_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_pre_attr_info[i])); } n = XIMNumber(ic_sts_attr_info); for(i = 0; i < n; i++) { - ic_sts_attr_info[i].quark = XrmStringToQuark(ic_sts_attr_info[i].name); + ic_sts_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_sts_attr_info[i])); } } @@ -3102,7 +3190,7 @@ _XimInitialIMMode(void) register int i; for(i = 0; i < n; i++) { - im_mode[i].quark = XrmStringToQuark(im_mode[i].name); + im_mode_quark[i] = XrmStringToQuark(GET_NAME(im_mode[i])); } } @@ -3113,7 +3201,7 @@ _XimInitialICMode(void) register int i; for(i = 0; i < n; i++) { - ic_mode[i].quark = XrmStringToQuark(ic_mode[i].name); + ic_mode_quark[i] = XrmStringToQuark(GET_NAME(ic_mode[i])); } } From 95523387d619af5b400748898d722e080b5ce1a6 Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sat, 2 Jun 2007 11:57:39 -0700 Subject: [PATCH 08/36] Allow re-entrant Xlib calls from _XIOError. Some libraries try to clean up X resources from atexit handlers, _fini, or C++ destructors. To make these work, the Display lock should be downgraded to a user lock (as in XLockDisplay) before calling exit(3). This blocks Xlib calls from threads other than the one calling exit(3) while still allowing the exit handlers to call Xlib. This assumes that the thread calling exit will call any atexit handlers. If this does not hold, then an alternate solution would involve registering an atexit handler to take over the lock, which would only assume that the same thread calls all the atexit handlers. Commit by Josh Triplett and Jamey Sharp. --- src/XlibInt.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/XlibInt.c b/src/XlibInt.c index 1d025c7b..d6e72204 100644 --- a/src/XlibInt.c +++ b/src/XlibInt.c @@ -2926,6 +2926,16 @@ _XIOError ( errno = WSAGetLastError(); #endif + /* This assumes that the thread calling exit will call any atexit handlers. + * If this does not hold, then an alternate solution would involve + * registering an atexit handler to take over the lock, which would only + * assume that the same thread calls all the atexit handlers. */ +#ifdef XTHREADS + if (dpy->lock) + (*dpy->lock->user_lock_display)(dpy); +#endif + UnlockDisplay(dpy); + if (_XIOErrorFunction != NULL) (*_XIOErrorFunction)(dpy); else From 6b81cbbedfb521ce046b77ee3cc54e884a1dc0c5 Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sat, 2 Jun 2007 12:30:30 -0700 Subject: [PATCH 09/36] Hold XCB's Xlib lock even when only the user lock (XLockDisplay) is held. An Xlib client can query Display state, such as with NextRequest, while it holds only the Xlib user lock (between XLockDisplay and XUnlockDisplay), so XCB requests in other threads should be blocked when the Xlib user lock is held. We acquire the lock even when XInitThreads was not called, so that pure XCB code can use multiple threads even in an otherwise single-threaded Xlib application. Commit by Josh Triplett and Jamey Sharp. --- src/xcb_lock.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/xcb_lock.c b/src/xcb_lock.c index 0ace8e51..96386f31 100644 --- a/src/xcb_lock.c +++ b/src/xcb_lock.c @@ -17,7 +17,8 @@ static void _XCBLockDisplay(Display *dpy) { if(dpy->xcb->lock_fns.lock_display) dpy->xcb->lock_fns.lock_display(dpy); - xcb_xlib_lock(dpy->xcb->connection); + if(!dpy->lock || dpy->lock->locking_level == 0) + xcb_xlib_lock(dpy->xcb->connection); _XGetXCBBuffer(dpy); } @@ -31,7 +32,8 @@ static void _XCBUnlockDisplay(Display *dpy) * of that function for why we do it here instead. */ _XSetSeqSyncFunction(dpy); - xcb_xlib_unlock(dpy->xcb->connection); + if(!dpy->lock || dpy->lock->locking_level == 0) + xcb_xlib_unlock(dpy->xcb->connection); if(dpy->xcb->lock_fns.unlock_display) dpy->xcb->lock_fns.unlock_display(dpy); } From 740ead23512f8d2eaafaa69e514f1ebafad475b9 Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sat, 2 Jun 2007 16:01:01 -0700 Subject: [PATCH 10/36] Xlib/XCB: Avoid re-crashing after _XIOError. Commit by Josh Triplett and Jamey Sharp. --- src/xcb_io.c | 9 +++++++++ src/xcb_lock.c | 18 +++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/xcb_io.c b/src/xcb_io.c index d40ac102..ebb9d028 100644 --- a/src/xcb_io.c +++ b/src/xcb_io.c @@ -186,6 +186,8 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi int _XEventsQueued(Display *dpy, int mode) { + if(dpy->flags & XlibDisplayIOError) + return 0; if(dpy->xcb->event_owner != XlibOwnsEventQueue) return 0; @@ -202,6 +204,8 @@ int _XEventsQueued(Display *dpy, int mode) */ void _XReadEvents(Display *dpy) { + if(dpy->flags & XlibDisplayIOError) + return; _XSend(dpy, 0, 0); if(dpy->xcb->event_owner != XlibOwnsEventQueue) return; @@ -219,6 +223,8 @@ void _XReadEvents(Display *dpy) void _XSend(Display *dpy, const char *data, long size) { xcb_connection_t *c = dpy->xcb->connection; + if(dpy->flags & XlibDisplayIOError) + return; assert(!dpy->xcb->request_extra); dpy->xcb->request_extra = data; @@ -356,6 +362,9 @@ Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard) assert(!dpy->xcb->reply_data); + if(dpy->flags & XlibDisplayIOError) + return 0; + /* Internals of UnlockDisplay done by hand here, so that we can insert_pending_request *after* we _XPutXCBBuffer, but before we unlock the display. */ diff --git a/src/xcb_lock.c b/src/xcb_lock.c index 96386f31..0f661c53 100644 --- a/src/xcb_lock.c +++ b/src/xcb_lock.c @@ -19,18 +19,22 @@ static void _XCBLockDisplay(Display *dpy) dpy->xcb->lock_fns.lock_display(dpy); if(!dpy->lock || dpy->lock->locking_level == 0) xcb_xlib_lock(dpy->xcb->connection); - _XGetXCBBuffer(dpy); + if(!(dpy->flags & XlibDisplayIOError)) + _XGetXCBBuffer(dpy); } static void _XCBUnlockDisplay(Display *dpy) { - _XPutXCBBuffer(dpy); - assert(dpy->xcb->partial_request == 0); - assert(xcb_get_request_sent(dpy->xcb->connection) == dpy->request); + if(!(dpy->flags & XlibDisplayIOError)) + { + _XPutXCBBuffer(dpy); + assert(dpy->xcb->partial_request == 0); + assert(xcb_get_request_sent(dpy->xcb->connection) == dpy->request); - /* Traditional Xlib does this in _XSend; see the Xlib/XCB version - * of that function for why we do it here instead. */ - _XSetSeqSyncFunction(dpy); + /* Traditional Xlib does this in _XSend; see the Xlib/XCB version + * of that function for why we do it here instead. */ + _XSetSeqSyncFunction(dpy); + } if(!dpy->lock || dpy->lock->locking_level == 0) xcb_xlib_unlock(dpy->xcb->connection); From 7f66c897f04806b75e574b55b48921b48045e3f9 Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sat, 2 Jun 2007 16:43:39 -0700 Subject: [PATCH 11/36] Update _XReply's copy of _XCBUnlockDisplay's guts. We introduced this bug in 6b81cbbedfb521ce046b77ee3cc54e884a1dc0c5. Also add a comment in _XCBUnlockDisplay to discourage this problem from respawning. Commit by Josh Triplett and Jamey Sharp. --- src/xcb_io.c | 3 ++- src/xcb_lock.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/xcb_io.c b/src/xcb_io.c index ebb9d028..542b426b 100644 --- a/src/xcb_io.c +++ b/src/xcb_io.c @@ -370,7 +370,8 @@ Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard) unlock the display. */ _XPutXCBBuffer(dpy); current = insert_pending_request(dpy); - xcb_xlib_unlock(dpy->xcb->connection); + if(!dpy->lock || dpy->lock->locking_level == 0) + xcb_xlib_unlock(dpy->xcb->connection); if(dpy->xcb->lock_fns.unlock_display) dpy->xcb->lock_fns.unlock_display(dpy); reply = xcb_wait_for_reply(c, current->sequence, &error); diff --git a/src/xcb_lock.c b/src/xcb_lock.c index 0f661c53..71b23835 100644 --- a/src/xcb_lock.c +++ b/src/xcb_lock.c @@ -23,6 +23,7 @@ static void _XCBLockDisplay(Display *dpy) _XGetXCBBuffer(dpy); } +/* XXX: If you change this function, update _XReply's copy of its guts! */ static void _XCBUnlockDisplay(Display *dpy) { if(!(dpy->flags & XlibDisplayIOError)) From c337f9de7cfd89f983f83956b7457a274dd412f3 Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sat, 2 Jun 2007 17:46:41 -0700 Subject: [PATCH 12/36] Xlib/XCB: Ensure _XReadEvents reads at least one new event and blocks for exactly one event. Commit by Jamey Sharp and Josh Triplett. --- src/xcb_io.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/xcb_io.c b/src/xcb_io.c index 542b426b..dea6b3df 100644 --- a/src/xcb_io.c +++ b/src/xcb_io.c @@ -106,7 +106,7 @@ static xcb_generic_event_t * wait_or_poll_for_event(Display *dpy, int wait) { xcb_connection_t *c = dpy->xcb->connection; xcb_generic_event_t *event; - if(wait && !dpy->head) + if(wait) { UnlockDisplay(dpy); event = xcb_wait_for_event(c); @@ -140,7 +140,7 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi break; } handle_event(dpy, event); - event = wait_or_poll_for_event(dpy, wait_for_first_event); + event = xcb_poll_for_event(c); } else if(req && req->waiters != -1) { From f417570735aac865eb6b576d1ea76b5bfcd8573b Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sat, 2 Jun 2007 17:59:15 -0700 Subject: [PATCH 13/36] Xlib/XCB: inline wait_or_poll_for_event, which now had only one caller. Commit by Josh Triplett and Jamey Sharp. --- src/xcb_io.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/xcb_io.c b/src/xcb_io.c index dea6b3df..276c1b93 100644 --- a/src/xcb_io.c +++ b/src/xcb_io.c @@ -102,21 +102,6 @@ static void call_handlers(Display *dpy, xcb_generic_reply_t *buf) _XError(dpy, (xError *) buf); } -static xcb_generic_event_t * wait_or_poll_for_event(Display *dpy, int wait) -{ - xcb_connection_t *c = dpy->xcb->connection; - xcb_generic_event_t *event; - if(wait) - { - UnlockDisplay(dpy); - event = xcb_wait_for_event(c); - LockDisplay(dpy); - } - else - event = xcb_poll_for_event(c); - return event; -} - static void process_responses(Display *dpy, int wait_for_first_event, xcb_generic_error_t **current_error, unsigned int current_request) { void *reply; @@ -125,7 +110,16 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi PendingRequest *req; xcb_connection_t *c = dpy->xcb->connection; if(!event && dpy->xcb->event_owner == XlibOwnsEventQueue) - event = wait_or_poll_for_event(dpy, wait_for_first_event); + { + if(wait_for_first_event) + { + UnlockDisplay(dpy); + event = xcb_wait_for_event(c); + LockDisplay(dpy); + } + else + event = xcb_poll_for_event(c); + } while(1) { From 79fa3d8070d95b960ba486f2439225872471dadd Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Sat, 2 Jun 2007 22:05:16 -0700 Subject: [PATCH 14/36] Revert "include: don't distribute XlibConf.h" This reverts commit c9e28e05ae01ce8a29bea09df759b6271865b44c. The installed XlibInt.h includes XlibConf.h , so libX11 should ship XlibConf.h. (Commit c9e28e05ae01ce8a29bea09df759b6271865b44c didn't actually prevent automake from shipping XlibConf.h, because it used nodist_x11include_HEADERS rather than nodist_HEADERS.) --- include/Makefile.am | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/Makefile.am b/include/Makefile.am index 58277232..c5cdb4ff 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -9,12 +9,10 @@ x11include_HEADERS=\ X11/Xutil.h \ X11/cursorfont.h \ X11/Xregion.h \ - X11/ImUtil.h - -nodist_x11include_HEADERS=\ + X11/ImUtil.h \ X11/XlibConf.h -EXTRA_DIST = \ +EXTRA_DIST=\ X11/XlibConf.h.in if XCB From 416f38f2e67ee1979b3d2feac6f06b3670238804 Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Sun, 3 Jun 2007 12:13:44 -0700 Subject: [PATCH 15/36] Revert "Revert "include: don't distribute XlibConf.h"" This reverts commit 79fa3d8070d95b960ba486f2439225872471dadd. Re-revert the XlibConf.h change, which prevented distribution, not installation. --- include/Makefile.am | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/Makefile.am b/include/Makefile.am index c5cdb4ff..58277232 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -9,10 +9,12 @@ x11include_HEADERS=\ X11/Xutil.h \ X11/cursorfont.h \ X11/Xregion.h \ - X11/ImUtil.h \ + X11/ImUtil.h + +nodist_x11include_HEADERS=\ X11/XlibConf.h -EXTRA_DIST=\ +EXTRA_DIST = \ X11/XlibConf.h.in if XCB From 7a6dbd4b07ca0a49c30ca7a1d2437eafb2e15eab Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Sun, 3 Jun 2007 15:39:39 -0700 Subject: [PATCH 16/36] Bump version number to 1.1.2, and add NEWS entry for 1.1.2 Signed-off-by: Josh Triplett --- NEWS | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 2 +- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9ac5fc22..2ee3a92e 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,65 @@ +Version 1.1.2 - 2007-06-03 + +* Fix CVE-2007-1667: Multiple integer overflows in the XGetPixel() and + XInitImage() functions. + +* Xlib/XCB: Ensure _XReadEvents reads at least one new event and blocks for + exactly one event. Large performance improvement for XIfEvent and similar. + +* Hold XCB's Xlib lock even when only the user lock (XLockDisplay) is held. + An Xlib client can query Display state, such as with NextRequest, while it + holds only the Xlib user lock (between XLockDisplay and XUnlockDisplay), so + XCB requests in other threads should be blocked when the Xlib user lock is + held. We acquire the lock even when XInitThreads was not called, so that + pure XCB code can use multiple threads even in an otherwise single-threaded + Xlib application. + +* Allow re-entrant Xlib calls from _XIOError. + Some libraries try to clean up X resources from atexit handlers, _fini, or + C++ destructors. To make these work, downgrade the Display lock to a user + lock (as in XLockDisplay) before calling exit(3). This blocks Xlib calls + from threads other than the one calling exit(3) while still allowing the + exit handlers to call Xlib. + +* Xlib/XCB: Avoid re-crashing after _XIOError. + +* For NetBSD, define XTHREADLIB and XTHREAD_CFLAGS. + +* Bug #7703: Fixed XSetSizeHints() et al wrt use of uninitialized data. + Now only those fields of the respective hint struct are set that + are actually valid in the input data. +* Bug #10292: Fixed a memory leak related to XOpenDisplay() in the XCB code. +* Bug #7713: Initialize all of the event's fields before sending it. +* Bug #9279: Fixed a file descriptor leak. +* Bug #10562: Define _GNU_SOURCE on glibc systems. +* Use unistd.h to get getresuid() and friends, now that we have _GNU_SOURCE + defined. + +* Switched function definitions from K&R to ANSI style. +* Many constness fixes. +* Fixed a few warnings. +* Fix 64bit issues with reallocation. + +* Manpage fixes: + * Add man pages for XKB APIs. + (Volunteer needed to convert prototypes in man pages to ANSI C style...) + * Protect C comments and #defines in XKB man pages from being mangled by cpp + * Fix typo in nroff macro in XkbAddGeomOverlayKey.man + * Bug #9695: Fixed a few argument types in the XOpenIM manpage. + * Markup tweak for XOpenIM. + * Bug #9696: refer to XDefineCursor() instead of XDefineCusor(). + * Bug #9697: Fixed documentation of XVisualInfo struct. The "depth" member + was said to be unsigned int, but it's signed. + +* nls fixes: + * Update el_GR.UTF-8/Compose.pre to match changes in xkeyboard-config cvs. + * For nls/*.pre, allow people to comment lines by starting them with '##'. + +* Build system fixes: + * Add autogen.sh to EXTRA_DIST. + * Makefile.am: make ChangeLog hook safer + * Don't distribute the configure-generated XlibConf.h in tarballs. + Version 1.1.1 - 2006-11-30 The "xcompmgr is hard, let's go releasing" release diff --git a/configure.ac b/configure.ac index e3bc1431..55186a4f 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.57) AC_INIT([libX11], - 1.1.1, + 1.1.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], libX11) AC_CONFIG_SRCDIR([Makefile.am]) From e2c1d788d1fe7bd2d34756493951552441e59b8c Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sun, 3 Jun 2007 17:33:23 -0700 Subject: [PATCH 17/36] Xlib/XCB: Only remove pending_requests when there are provably no more responses. --- src/xcb_io.c | 44 +++++++++++++------------------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/src/xcb_io.c b/src/xcb_io.c index 276c1b93..c0b2c1f0 100644 --- a/src/xcb_io.c +++ b/src/xcb_io.c @@ -107,7 +107,6 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi void *reply; xcb_generic_event_t *event = dpy->xcb->next_event; xcb_generic_error_t *error; - PendingRequest *req; xcb_connection_t *c = dpy->xcb->connection; if(!event && dpy->xcb->event_owner == XlibOwnsEventQueue) { @@ -123,7 +122,7 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi while(1) { - req = dpy->xcb->pending_requests; + PendingRequest *req = dpy->xcb->pending_requests; assert(!(req && current_request && !XCB_SEQUENCE_COMPARE(req->sequence, <=, current_request))); if(event && (!req || XCB_SEQUENCE_COMPARE(event->full_sequence, <=, req->sequence))) { @@ -146,24 +145,26 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi req->waiters++; assert(req->waiters > 0); condition_wait(dpy, &req->condition); - if(--req->waiters == 0) - free(req); + --req->waiters; event = dpy->xcb->next_event; } else if(req && xcb_poll_for_reply(dpy->xcb->connection, req->sequence, &reply, &error)) { - dpy->xcb->pending_requests = req->next; - if(!dpy->xcb->pending_requests) - dpy->xcb->pending_requests_tail = &dpy->xcb->pending_requests; + unsigned int sequence = req->sequence; if(!reply) + { + dpy->xcb->pending_requests = req->next; + if(!dpy->xcb->pending_requests) + dpy->xcb->pending_requests_tail = &dpy->xcb->pending_requests; + free(req); reply = error; + } if(reply) { - dpy->last_request_read = req->sequence; + dpy->last_request_read = sequence; call_handlers(dpy, reply); + free(reply); } - free(req); - free(reply); } else break; @@ -329,17 +330,6 @@ static PendingRequest * insert_pending_request(Display *dpy) return *cur; } -static void remove_pending_request(Display *dpy, PendingRequest *node) -{ - PendingRequest **cur = &dpy->xcb->pending_requests; - while(*cur && *cur != node) - cur = &((*cur)->next); - if(*cur == node) - *cur = node->next; - if(!dpy->xcb->pending_requests) - dpy->xcb->pending_requests_tail = &dpy->xcb->pending_requests; -} - /* * _XReply - Wait for a reply packet and copy its contents into the * specified rep. @@ -352,7 +342,6 @@ Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard) xcb_connection_t *c = dpy->xcb->connection; char *reply; PendingRequest *current; - unsigned int current_sequence; assert(!dpy->xcb->reply_data); @@ -374,18 +363,11 @@ Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard) check_internal_connections(dpy); process_responses(dpy, 0, &error, current->sequence); - current_sequence = current->sequence; - - remove_pending_request(dpy, current); if(current->waiters) { /* The ConditionBroadcast macro contains an if; braces needed here. */ ConditionBroadcast(dpy, ¤t->condition); } - else - { - free(current); - current = NULL; - } + --current->waiters; if(error) { @@ -440,7 +422,7 @@ Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard) return 0; } - dpy->last_request_read = current_sequence; + dpy->last_request_read = current->sequence; /* there's no error and we have a reply. */ dpy->xcb->reply_data = reply; From 582ca690ea4f3ffd2b94826c4db97229bd3c7238 Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sun, 3 Jun 2007 20:59:12 -0700 Subject: [PATCH 18/36] Xlib/XCB: Fix _XReadEvents to always enqueue a new event, even if an error occurs Commit c337f9de7cfd89f983f83956b7457a274dd412f3 broke the invariant that _XReadEvents always enqueues at least one event even if an error occurred, because the one call to xcb_wait_for_event would then return an error, not an event, and nothing else ensured that process_responses would obtain an event. Fix this by reverting most of c337f9de7cfd89f983f83956b7457a274dd412f3 and f417570735aac865eb6b576d1ea76b5bfcd8573b and implementing the correct fix. In process_responses, wait_for_first_event now serves as a flag, cleared when actually handling an event. Commit by Josh Triplett and Jamey Sharp. --- src/xcb_io.c | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/xcb_io.c b/src/xcb_io.c index c0b2c1f0..afab7ac7 100644 --- a/src/xcb_io.c +++ b/src/xcb_io.c @@ -102,6 +102,21 @@ static void call_handlers(Display *dpy, xcb_generic_reply_t *buf) _XError(dpy, (xError *) buf); } +static xcb_generic_event_t * wait_or_poll_for_event(Display *dpy, int wait) +{ + xcb_connection_t *c = dpy->xcb->connection; + xcb_generic_event_t *event; + if(wait) + { + UnlockDisplay(dpy); + event = xcb_wait_for_event(c); + LockDisplay(dpy); + } + else + event = xcb_poll_for_event(c); + return event; +} + static void process_responses(Display *dpy, int wait_for_first_event, xcb_generic_error_t **current_error, unsigned int current_request) { void *reply; @@ -109,16 +124,7 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi xcb_generic_error_t *error; xcb_connection_t *c = dpy->xcb->connection; if(!event && dpy->xcb->event_owner == XlibOwnsEventQueue) - { - if(wait_for_first_event) - { - UnlockDisplay(dpy); - event = xcb_wait_for_event(c); - LockDisplay(dpy); - } - else - event = xcb_poll_for_event(c); - } + event = wait_or_poll_for_event(dpy, wait_for_first_event); while(1) { @@ -126,20 +132,25 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi assert(!(req && current_request && !XCB_SEQUENCE_COMPARE(req->sequence, <=, current_request))); if(event && (!req || XCB_SEQUENCE_COMPARE(event->full_sequence, <=, req->sequence))) { - if(current_error && event->response_type == 0 && event->full_sequence == current_request) + if(current_error && event->response_type == X_Error + && event->full_sequence == current_request) { + /* This can only occur when called from + * _XReply, which doesn't need a new event. */ *current_error = (xcb_generic_error_t *) event; event = 0; break; } + if(event->response_type != X_Error) + wait_for_first_event = 0; handle_event(dpy, event); - event = xcb_poll_for_event(c); + event = wait_or_poll_for_event(dpy, wait_for_first_event); } else if(req && req->waiters != -1) { if(req->sequence == current_request) break; - if(!current_request && !(wait_for_first_event && !dpy->head)) + if(!current_request && !wait_for_first_event) break; dpy->xcb->next_event = event; req->waiters++; @@ -176,7 +187,7 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi _XIOError(dpy); assert_sequence_less(dpy->last_request_read, dpy->request); - assert(!wait_for_first_event || dpy->head); + assert(!wait_for_first_event); } int _XEventsQueued(Display *dpy, int mode) From 5123b77a3d32d3ad479462f319762c328278aed9 Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sun, 3 Jun 2007 21:24:54 -0700 Subject: [PATCH 19/36] Xlib/XCB: Inline and simplify handle_event, since only process_responses calls it now. Commit by Josh Triplett and Jamey Sharp. --- src/xcb_io.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/xcb_io.c b/src/xcb_io.c index afab7ac7..193ee686 100644 --- a/src/xcb_io.c +++ b/src/xcb_io.c @@ -77,18 +77,6 @@ static void condition_wait(Display *dpy, xcondition_t cv) _XGetXCBBuffer(dpy); } -static void handle_event(Display *dpy, xcb_generic_event_t *e) -{ - if(!e) - _XIOError(dpy); - dpy->last_request_read = e->full_sequence; - if(e->response_type == X_Error) - _XError(dpy, (xError *) e); - else - _XEnq(dpy, (xEvent *) e); - free(e); -} - static void call_handlers(Display *dpy, xcb_generic_reply_t *buf) { _XAsyncHandler *async, *next; @@ -132,8 +120,13 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi assert(!(req && current_request && !XCB_SEQUENCE_COMPARE(req->sequence, <=, current_request))); if(event && (!req || XCB_SEQUENCE_COMPARE(event->full_sequence, <=, req->sequence))) { - if(current_error && event->response_type == X_Error - && event->full_sequence == current_request) + dpy->last_request_read = event->full_sequence; + if(event->response_type != X_Error) + { + _XEnq(dpy, (xEvent *) event); + wait_for_first_event = 0; + } + else if(current_error && event->full_sequence == current_request) { /* This can only occur when called from * _XReply, which doesn't need a new event. */ @@ -141,9 +134,9 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi event = 0; break; } - if(event->response_type != X_Error) - wait_for_first_event = 0; - handle_event(dpy, event); + else + _XError(dpy, (xError *) event); + free(event); event = wait_or_poll_for_event(dpy, wait_for_first_event); } else if(req && req->waiters != -1) From a549a258b8fcb1ba9d0c1b01b72967e385f67cab Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sun, 3 Jun 2007 21:29:40 -0700 Subject: [PATCH 20/36] Add NEWS item for bugfix in commit e2c1d788d1fe7bd2d34756493951552441e59b8c. Commit by Josh Triplett and Jamey Sharp --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 2ee3a92e..52a56cc1 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,8 @@ Version 1.1.2 - 2007-06-03 * Xlib/XCB: Avoid re-crashing after _XIOError. +* Xlib/XCB: Only remove pending_requests when there are provably no more responses. + * For NetBSD, define XTHREADLIB and XTHREAD_CFLAGS. * Bug #7703: Fixed XSetSizeHints() et al wrt use of uninitialized data. From 65f0ab5d46d80d55fc04d4eb14fa05f130eb8b9c Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sun, 3 Jun 2007 21:41:47 -0700 Subject: [PATCH 21/36] Move security fixes to the top of NEWS, and fix spacing. Commit by Josh Triplett and Jamey Sharp. --- NEWS | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 52a56cc1..e03d5562 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,9 @@ Version 1.1.2 - 2007-06-03 -* Fix CVE-2007-1667: Multiple integer overflows in the XGetPixel() and - XInitImage() functions. +* Security fixes: + * Fix CVE-2007-1667: Multiple integer overflows in the XGetPixel() and + XInitImage() functions. + * Bug #9279: Fixed a file descriptor leak. * Xlib/XCB: Ensure _XReadEvents reads at least one new event and blocks for exactly one event. Large performance improvement for XIfEvent and similar. @@ -30,16 +32,22 @@ Version 1.1.2 - 2007-06-03 * Bug #7703: Fixed XSetSizeHints() et al wrt use of uninitialized data. Now only those fields of the respective hint struct are set that are actually valid in the input data. + * Bug #10292: Fixed a memory leak related to XOpenDisplay() in the XCB code. + * Bug #7713: Initialize all of the event's fields before sending it. -* Bug #9279: Fixed a file descriptor leak. + * Bug #10562: Define _GNU_SOURCE on glibc systems. + * Use unistd.h to get getresuid() and friends, now that we have _GNU_SOURCE defined. * Switched function definitions from K&R to ANSI style. + * Many constness fixes. + * Fixed a few warnings. + * Fix 64bit issues with reallocation. * Manpage fixes: From c2f88cdf5cd9c94b77e5bfdac572b5ac06ab4aa8 Mon Sep 17 00:00:00 2001 From: Jamey Sharp Date: Sun, 10 Jun 2007 16:19:59 -0700 Subject: [PATCH 22/36] Fix locking in _XimGetWindowEventmask. Now that XFilterEvent drops the Display lock before invoking callback functions, _XimGetWindowEventmask is called without the lock held. So when it called _XGetWindowAttributes, a variant of XGetWindowAttributes that does not lock the Display, Xlib/XCB would assert: xcb_xlib.c:50: xcb_xlib_unlock: Assertion `c->xlib.lock' failed. Should fix Gentoo #156367, Ubuntu #87947, Debian #427296. And others? --- modules/im/ximcp/imDefLkup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/im/ximcp/imDefLkup.c b/modules/im/ximcp/imDefLkup.c index aa1aaaf0..157b076d 100644 --- a/modules/im/ximcp/imDefLkup.c +++ b/modules/im/ximcp/imDefLkup.c @@ -466,7 +466,7 @@ _XimGetWindowEventmask( Xim im = (Xim )ic->core.im; XWindowAttributes atr; - if (!_XGetWindowAttributes(im->core.display, ic->core.focus_window, &atr)) + if (!XGetWindowAttributes(im->core.display, ic->core.focus_window, &atr)) return 0; return (EVENTMASK)atr.your_event_mask; } From 8e76bcf3cafda85058ce5f35f1f81929f4772f72 Mon Sep 17 00:00:00 2001 From: Olivier Blin Date: Mon, 11 Jun 2007 18:32:09 +1000 Subject: [PATCH 23/36] fix XGetMotionEvents arguments order - Fixes bug 11222 --- src/GetMoEv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GetMoEv.c b/src/GetMoEv.c index 2aa6c1a6..dac1bfc4 100644 --- a/src/GetMoEv.c +++ b/src/GetMoEv.c @@ -33,9 +33,9 @@ in this Software without prior written authorization from The Open Group. XTimeCoord *XGetMotionEvents( register Display *dpy, + Window w, Time start, Time stop, - Window w, int *nEvents) /* RETURN */ { xGetMotionEventsReply rep; From d334665e619e9db657a2ea2764a8b852401d4a3f Mon Sep 17 00:00:00 2001 From: Kean Johnston Date: Tue, 17 Jul 2007 16:34:30 -0700 Subject: [PATCH 24/36] LOCALCONN fallback changes DisplayString() output, breaks KDE See --- src/ConnDis.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ConnDis.c b/src/ConnDis.c index 95a836d4..8da5140d 100644 --- a/src/ConnDis.c +++ b/src/ConnDis.c @@ -152,6 +152,7 @@ _X11TransConnectDisplay ( int connect_stat; #ifdef LOCALCONN struct utsname sys; + Bool reset_hostname = False; /* Reset hostname? */ # ifdef UNIXCONN Bool try_unix_socket = False; /* Try unix if local fails */ # endif @@ -245,6 +246,8 @@ _X11TransConnectDisplay ( else tcphostname = copystring("localhost", 9); #endif + if (!phostname) + reset_hostname = True; Xfree (phostname); phostname = copystring ("unix", 4); } @@ -429,6 +432,12 @@ _X11TransConnectDisplay ( * * [host] : [:] dpy . scr \0 */ +#ifdef LOCALCONN + if (reset_hostname) { + Xfree (phostname); + phostname = NULL; + } +#endif len = ((phostname ? strlen(phostname) : 0) + 1 + (dnet ? 1 : 0) + strlen(pdpynum) + 1 + (pscrnum ? strlen(pscrnum) : 1) + 1); *fullnamep = (char *) Xmalloc (len); From 590cde811a79375231c59ed8583e02b111ed567c Mon Sep 17 00:00:00 2001 From: Kean Johnston Date: Thu, 19 Jul 2007 16:44:20 -0700 Subject: [PATCH 25/36] Reset hostname when falling back from :0 to hostname/localhost:0 as well --- src/ConnDis.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ConnDis.c b/src/ConnDis.c index 8da5140d..2f0cd496 100644 --- a/src/ConnDis.c +++ b/src/ConnDis.c @@ -150,9 +150,11 @@ _X11TransConnectDisplay ( char* address = addrbuf; XtransConnInfo trans_conn = NULL; /* transport connection object */ int connect_stat; +#if defined(LOCALCONN) || defined(TCPCONN) + Bool reset_hostname = False; /* Reset hostname? */ +#endif #ifdef LOCALCONN struct utsname sys; - Bool reset_hostname = False; /* Reset hostname? */ # ifdef UNIXCONN Bool try_unix_socket = False; /* Try unix if local fails */ # endif @@ -432,7 +434,11 @@ _X11TransConnectDisplay ( * * [host] : [:] dpy . scr \0 */ -#ifdef LOCALCONN +#if defined(LOCALCONN) || defined(TCPCONN) + /* + * If we computed the host name, get rid of it so that + * XDisplayString() and XDisplayName() agree. + */ if (reset_hostname) { Xfree (phostname); phostname = NULL; @@ -487,6 +493,7 @@ _X11TransConnectDisplay ( pprotocol = copystring("tcp", 3); phostname = tcphostname; tcphostname = NULL; + reset_hostname = True; goto connect; } #endif From b8bef57342632cc2d25580bb7daa3839bae04d89 Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Wed, 25 Jul 2007 17:44:06 -0700 Subject: [PATCH 26/36] Include comment/copyright/license for AC_DEFINE_DIR in acinclude.m4 --- acinclude.m4 | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/acinclude.m4 b/acinclude.m4 index 4c60e33b..f3d8734f 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1,4 +1,36 @@ -# AC_DEFINE_DIR macro from autoconf-archive.cryp.to +##### http://autoconf-archive.cryp.to/ac_define_dir.html +# +# SYNOPSIS +# +# AC_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION]) +# +# DESCRIPTION +# +# This macro sets VARNAME to the expansion of the DIR variable, +# taking care of fixing up ${prefix} and such. +# +# VARNAME is then offered as both an output variable and a C +# preprocessor symbol. +# +# Example: +# +# AC_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.]) +# +# LAST MODIFICATION +# +# 2006-10-13 +# +# COPYLEFT +# +# Copyright (c) 2006 Stepan Kasal +# Copyright (c) 2006 Andreas Schwab +# Copyright (c) 2006 Guido U. Draheim +# Copyright (c) 2006 Alexandre Oliva +# +# Copying and distribution of this file, with or without +# modification, are permitted in any medium without royalty provided +# the copyright notice and this notice are preserved. + AC_DEFUN([AC_DEFINE_DIR], [ prefix_NONE= exec_prefix_NONE= From 6f0764d4b56f64786b4980839ca262f10a51af6f Mon Sep 17 00:00:00 2001 From: Brice Goglin Date: Thu, 26 Jul 2007 22:53:52 +0200 Subject: [PATCH 27/36] Clarify return value of XGetCommand in case of error in the manpage Reported by Sean Perry in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=133348 and https://bugs.freedesktop.org/show_bug.cgi?id=9828 --- man/XSetCommand.man | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/XSetCommand.man b/man/XSetCommand.man index c5f03e71..c64e2705 100644 --- a/man/XSetCommand.man +++ b/man/XSetCommand.man @@ -189,7 +189,7 @@ If sufficient memory can be allocated to contain the string list, .ZN XGetCommand fills in the argv_return and argc_return arguments and returns a nonzero status. -Otherwise, it returns a zero status. +Otherwise, or if any other error is encountered, it returns a zero status. If the data returned by the server is in the Latin Portable Character Encoding, then the returned strings are in the Host Portable Character Encoding. Otherwise, the result is implementation-dependent. From 1a18319b3bde08dd9ef69c7cd735a76000cf3177 Mon Sep 17 00:00:00 2001 From: Brice Goglin Date: Thu, 26 Jul 2007 23:31:15 +0200 Subject: [PATCH 28/36] Add missing override parameter in XrmCombineDatabase prototype in the manpage Reported by Arnaud Giersch in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=393434 and https://bugs.freedesktop.org/show_bug.cgi?id=9948 Also add the type of the second argument in XrmMergeDatabases. --- man/XrmMergeDatabases.man | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/man/XrmMergeDatabases.man b/man/XrmMergeDatabases.man index 22fc8f42..e1dc75ad 100644 --- a/man/XrmMergeDatabases.man +++ b/man/XrmMergeDatabases.man @@ -145,10 +145,11 @@ XrmMergeDatabases, XrmCombineDatabase, XrmCombineFileDatabase \- merge resource databases .SH SYNTAX .HP -void XrmMergeDatabases(\^XrmDatabase \fIsource_db\fP, *\fItarget_db\fP\^); +void XrmMergeDatabases(\^XrmDatabase \fIsource_db\fP, XrmDatabase +*\fItarget_db\fP\^); .HP void XrmCombineDatabase(\^XrmDatabase \fIsource_db\fP, XrmDatabase -*\fItarget_db\fP\^); +*\fItarget_db\fP, Bool \fIoverride\fP\^); .HP Status XrmCombineFileDatabase(\^char *\fIfilename\fP, XrmDatabase *\fItarget_db\fP\^, Bool \fIoverride\fP); From 76fae9cba1e9bdf7f0eb2ff2b90153d622136cf0 Mon Sep 17 00:00:00 2001 From: Joerg Sonnenberger Date: Fri, 27 Jul 2007 11:15:47 -0700 Subject: [PATCH 29/36] Fail properly on errors in recursive make. --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 18e4cbb0..7c44f5b9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -413,6 +413,6 @@ ks_tables.h: $(KEYSYMDEF) $(top_builddir)/src/util/makekeys$(EXEEXT) mv ks_tables_h $@ $(top_builddir)/src/util/makekeys$(EXEEXT): force - cd util; $(MAKE) + cd util && $(MAKE) force: From ac00a44b4875de70382da5a40dd87f976e5b9327 Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Wed, 1 Aug 2007 20:36:03 +0200 Subject: [PATCH 30/36] Bumped version to 1.1.3. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 55186a4f..f49b9edc 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.57) AC_INIT([libX11], - 1.1.2, + 1.1.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], libX11) AC_CONFIG_SRCDIR([Makefile.am]) From f1ed3da9a30a1f0264fdc7d1c6466f27fe2a3d7d Mon Sep 17 00:00:00 2001 From: "Jeremy C. Reed" Date: Thu, 16 Aug 2007 17:37:22 -0500 Subject: [PATCH 31/36] Fix a mutex reference-counting bug. I was told that some systems have a much more permissive libpthread. I was asked to commit this. This is from NetBSD's X source. (I didn't receive any feedback on xorg list for over two weeks about this.) --- src/Xrm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Xrm.c b/src/Xrm.c index a932a5ce..65d058fa 100644 --- a/src/Xrm.c +++ b/src/Xrm.c @@ -808,6 +808,7 @@ void XrmCombineDatabase( } } (from->methods->destroy)(from->mbstate); + _XUnlockMutex(&from->linfo); _XFreeMutex(&from->linfo); Xfree((char *)from); _XUnlockMutex(&(*into)->linfo); @@ -2656,6 +2657,7 @@ void XrmDestroyDatabase( else DestroyNTable(table); } + _XUnlockMutex(&db->linfo); _XFreeMutex(&db->linfo); (*db->methods->destroy)(db->mbstate); Xfree((char *)db); From d4002e389dd69780dfc7c2f7bd3cb0c57f05d4f8 Mon Sep 17 00:00:00 2001 From: James Cloos Date: Sat, 18 Aug 2007 13:57:31 -0400 Subject: [PATCH 32/36] Fix SMP Compose targets The compose targets from the SMP (plane 1) were incorrect. At some point the 0x10000 bit had been lost. --- nls/en_US.UTF-8/Compose.pre | 44 ++++++++++++++++++------------------- nls/pt_BR.UTF-8/Compose.pre | 44 ++++++++++++++++++------------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/nls/en_US.UTF-8/Compose.pre b/nls/en_US.UTF-8/Compose.pre index e6eaa61a..41e84f4e 100644 --- a/nls/en_US.UTF-8/Compose.pre +++ b/nls/en_US.UTF-8/Compose.pre @@ -5556,25 +5556,25 @@ XCOMM group 1: cluster jamos made of three basic jamos : "בֿ" UFB4C # HEBREW LETTER BET WITH RAFE : "כֿ" UFB4D # HEBREW LETTER KAF WITH RAFE : "פֿ" UFB4E # HEBREW LETTER PE WITH RAFE - : "텞" U1D15E # MUSICAL SYMBOL HALF NOTE - : "텟" U1D15F # MUSICAL SYMBOL QUARTER NOTE - : "텠" U1D160 # MUSICAL SYMBOL EIGHTH NOTE -## : "텠" U1D160 # MUSICAL SYMBOL EIGHTH NOTE - : "텡" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE -## : "텡" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE - : "텢" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE -## : "텢" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE - : "텣" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE -## : "텣" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE - : "텤" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -## : "텤" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE - : "톻" U1D1BB # MUSICAL SYMBOL MINIMA - : "톼" U1D1BC # MUSICAL SYMBOL MINIMA BLACK - : "톽" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE -## : "톽" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE - : "톾" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK -## : "톾" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK - : "톿" U1D1BF # MUSICAL SYMBOL FUSA WHITE -## : "톿" U1D1BF # MUSICAL SYMBOL FUSA WHITE - : "퇀" U1D1C0 # MUSICAL SYMBOL FUSA BLACK -## : "퇀" U1D1C0 # MUSICAL SYMBOL FUSA BLACK + : "𝅗𝅥" U1D15E # MUSICAL SYMBOL HALF NOTE + : "𝅘𝅥" U1D15F # MUSICAL SYMBOL QUARTER NOTE + : "𝅘𝅥𝅮" U1D160 # MUSICAL SYMBOL EIGHTH NOTE +## : "𝅘𝅥𝅮" U1D160 # MUSICAL SYMBOL EIGHTH NOTE + : "𝅘𝅥𝅯" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE +## : "𝅘𝅥𝅯" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE + : "𝅘𝅥𝅰" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE +## : "𝅘𝅥𝅰" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE + : "𝅘𝅥𝅱" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE +## : "𝅘𝅥𝅱" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE + : "𝅘𝅥𝅲" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +## : "𝅘𝅥𝅲" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE + : "𝆹𝅥" U1D1BB # MUSICAL SYMBOL MINIMA + : "𝆺𝅥" U1D1BC # MUSICAL SYMBOL MINIMA BLACK + : "𝆹𝅥𝅮" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE +## : "𝆹𝅥𝅮" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE + : "𝆺𝅥𝅮" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK +## : "𝆺𝅥𝅮" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK + : "𝆹𝅥𝅯" U1D1BF # MUSICAL SYMBOL FUSA WHITE +## : "𝆹𝅥𝅯" U1D1BF # MUSICAL SYMBOL FUSA WHITE + : "𝆺𝅥𝅯" U1D1C0 # MUSICAL SYMBOL FUSA BLACK +## : "𝆺𝅥𝅯" U1D1C0 # MUSICAL SYMBOL FUSA BLACK diff --git a/nls/pt_BR.UTF-8/Compose.pre b/nls/pt_BR.UTF-8/Compose.pre index 8842e613..017efc4b 100644 --- a/nls/pt_BR.UTF-8/Compose.pre +++ b/nls/pt_BR.UTF-8/Compose.pre @@ -5517,25 +5517,25 @@ XCOMM group 1: cluster jamos made of three basic jamos : "בֿ" UFB4C # HEBREW LETTER BET WITH RAFE : "כֿ" UFB4D # HEBREW LETTER KAF WITH RAFE : "פֿ" UFB4E # HEBREW LETTER PE WITH RAFE - : "텞" U1D15E # MUSICAL SYMBOL HALF NOTE - : "텟" U1D15F # MUSICAL SYMBOL QUARTER NOTE - : "텠" U1D160 # MUSICAL SYMBOL EIGHTH NOTE - : "텠" U1D160 # MUSICAL SYMBOL EIGHTH NOTE - : "텡" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE - : "텡" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE - : "텢" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE - : "텢" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE - : "텣" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE - : "텣" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE - : "텤" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE - : "텤" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE - : "톻" U1D1BB # MUSICAL SYMBOL MINIMA - : "톼" U1D1BC # MUSICAL SYMBOL MINIMA BLACK - : "톽" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE - : "톽" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE - : "톾" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK - : "톾" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK - : "톿" U1D1BF # MUSICAL SYMBOL FUSA WHITE - : "톿" U1D1BF # MUSICAL SYMBOL FUSA WHITE - : "퇀" U1D1C0 # MUSICAL SYMBOL FUSA BLACK - : "퇀" U1D1C0 # MUSICAL SYMBOL FUSA BLACK + : "𝅗𝅥" U1D15E # MUSICAL SYMBOL HALF NOTE + : "𝅘𝅥" U1D15F # MUSICAL SYMBOL QUARTER NOTE + : "𝅘𝅥𝅮" U1D160 # MUSICAL SYMBOL EIGHTH NOTE + : "𝅘𝅥𝅮" U1D160 # MUSICAL SYMBOL EIGHTH NOTE + : "𝅘𝅥𝅯" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE + : "𝅘𝅥𝅯" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE + : "𝅘𝅥𝅰" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE + : "𝅘𝅥𝅰" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE + : "𝅘𝅥𝅱" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE + : "𝅘𝅥𝅱" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE + : "𝅘𝅥𝅲" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE + : "𝅘𝅥𝅲" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE + : "𝆹𝅥" U1D1BB # MUSICAL SYMBOL MINIMA + : "𝆺𝅥" U1D1BC # MUSICAL SYMBOL MINIMA BLACK + : "𝆹𝅥𝅮" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE + : "𝆹𝅥𝅮" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE + : "𝆺𝅥𝅮" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK + : "𝆺𝅥𝅮" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK + : "𝆹𝅥𝅯" U1D1BF # MUSICAL SYMBOL FUSA WHITE + : "𝆹𝅥𝅯" U1D1BF # MUSICAL SYMBOL FUSA WHITE + : "𝆺𝅥𝅯" U1D1C0 # MUSICAL SYMBOL FUSA BLACK + : "𝆺𝅥𝅯" U1D1C0 # MUSICAL SYMBOL FUSA BLACK From 5cf5bc76642bfece7cb5b76faf414bf445f14489 Mon Sep 17 00:00:00 2001 From: James Cloos Date: Sat, 18 Aug 2007 17:13:41 -0400 Subject: [PATCH 33/36] Add some compose sequences Add some compose sequences from the patch in bug 5371 (attachment 4122). Cf: https://bugs.freedesktop.org/show_bug.cgi?id=5371 https://bugs.freedesktop.org/attachment.cgi?id=4122 --- nls/en_US.UTF-8/Compose.pre | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/nls/en_US.UTF-8/Compose.pre b/nls/en_US.UTF-8/Compose.pre index 41e84f4e..9dfcd286 100644 --- a/nls/en_US.UTF-8/Compose.pre +++ b/nls/en_US.UTF-8/Compose.pre @@ -155,6 +155,11 @@ XCOMM "₪" U20aa NEW SHEQEL SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "¢" U00A2 # CENT SIGN : "¢" U00A2 # CENT SIGN @@ -181,12 +186,18 @@ XCOMM Musical alterations XCOMM Other symbols : "§" section # SECTION SIGN : "§" section # SECTION SIGN + : "§" section # SECTION SIGN : "¤" currency # CURRENCY SIGN : "¤" currency # CURRENCY SIGN

: "¶" paragraph # PILCROW SIGN + : "№" numerosign # NUMERO SIGN + : "№" numerosign # NUMERO SIGN + : "№" numerosign # NUMERO SIGN + : "№" numerosign # NUMERO SIGN + XCOMM Part 2 XCOMM Compose map for Korean Hangul(Choseongul) Conjoining Jamos automatically @@ -4982,8 +4993,20 @@ XCOMM group 1: cluster jamos made of three basic jamos : "₎" U208E # SUBSCRIPT RIGHT PARENTHESIS : "℠" U2120 # SERVICE MARK : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK + : "℠" U2120 # SERVICE MARK : "™" U2122 # TRADE MARK SIGN : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN + : "™" U2122 # TRADE MARK SIGN : "↚" U219A # LEFTWARDS ARROW WITH STROKE : "↚" U219A # LEFTWARDS ARROW WITH STROKE : "↛" U219B # RIGHTWARDS ARROW WITH STROKE From 4b0a14521449dfce8b4347bd17243efd1d3eae2d Mon Sep 17 00:00:00 2001 From: James Cloos Date: Sat, 18 Aug 2007 17:29:08 -0400 Subject: [PATCH 34/36] =?UTF-8?q?Compose=20fix=20for=20Latin-1=20(from=20D?= =?UTF-8?q?ebian)=20The=20description=20from=20bugzilla=20bug=207417=C2=B9?= =?UTF-8?q?=20is:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We've been shipping this patch for some time in Debian now. The problem description from the patch header is reproduced below. You may want to note the licensing issue mentioned below, but we've been shipping it because the method by which this particular patch was generated and updated was also given below. This patch by Denis Barbier. The X11 protocol states that Unicode keysyms are in the range 0x01000100 - 0x0110FFFF. If the result of composing characters is a Unicode codepoint, X returns the corresponding Unicode keysym, which is its Unicode codepoint augmented by 0x01000000. Latin-1 characters must not appear with their Unicode codepoints in compose files, otherwise the returned composed character lies in the range 0x01000000 - 0x010000FF which is not valid. There are two solutions: either fix composing routines to return 0xZZ instead of 0x010000ZZ (where Z is an hexadecimal digit), or replace U00ZZ by their corresponding keysyms in compose files. The latter is more logical and less error prone, so compose files will be patched. Many applications accept these invalid Unicode keysyms, but few of them don't, most notably xemacs. Only UTF-8 locales are affected. This has been fixed very recently in XFree86 CVS (but not xorg), but for licensing reasons, this patch is not grabbed. Instead automatic conversion is performed by: sed -e '/XK_LATIN1/,/XK_LATIN1/!d' /usr/include/X11/keysymdef.h \ | grep -v deprecated | grep 0x0 \ | sed -e 's/0x0/U0/' -e 's/XK_//' \ | awk '{ printf "s/\\b%s\\b/%s/ig\n", $3, $2; }' > sedfile for f in nls/*.UTF-8/Compose.pre do sed -f sedfile $f > $f.tmp && mv $f.tmp $f done [I edited the quoted script to update it for the current location of the installed keysymdef.h and the current layout of the libX11 repo. -JimC] I applied the script, not the patch attached to the bugreport. 1] https://bugs.freedesktop.org/show_bug.cgi?id=7417 --- nls/en_US.UTF-8/Compose.pre | 384 ++++++++++++++++++------------------ nls/pt_BR.UTF-8/Compose.pre | 350 ++++++++++++++++---------------- 2 files changed, 367 insertions(+), 367 deletions(-) diff --git a/nls/en_US.UTF-8/Compose.pre b/nls/en_US.UTF-8/Compose.pre index 9dfcd286..8c58ceab 100644 --- a/nls/en_US.UTF-8/Compose.pre +++ b/nls/en_US.UTF-8/Compose.pre @@ -92,7 +92,7 @@ XCOMM Spaces : "›" U203a # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK : "‹" U2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - : "·" U00B7 # MIDDLE DOT + : "·" periodcentered # MIDDLE DOT : "¦" brokenbar # BROKEN BAR : "¡" exclamdown # INVERTED EXCLAMATION MARK

: "¶" paragraph # PILCROW SIGN @@ -161,12 +161,12 @@ XCOMM "₪" U20aa NEW SHEQEL SIGN : "€" EuroSign # EURO SIGN - : "¢" U00A2 # CENT SIGN - : "¢" U00A2 # CENT SIGN - : "¢" U00A2 # CENT SIGN - : "¢" U00A2 # CENT SIGN - : "£" U00a3 # POUND SIGN - : "£" U00a3 # POUND SIGN + : "¢" cent # CENT SIGN + : "¢" cent # CENT SIGN + : "¢" cent # CENT SIGN + : "¢" cent # CENT SIGN + : "£" sterling # POUND SIGN + : "£" sterling # POUND SIGN : "¥" yen # YEN SIGN : "¥" yen # YEN SIGN @@ -440,191 +440,191 @@ XCOMM group 1: cluster jamos made of three basic jamos : "ᇞ" U11de # HANGUL JONGSEONG MIEUM-SSANGSIOS : "ᇭ" U11ed # HANGUL JONGSEONG IEUNG-SSANGKIYEOK - : "¬" U00AC # NOT SIGN - : "¬" U00AC # NOT SIGN - : "ª" U00AA # FEMININE ORDINAL INDICATOR - : "ª" U00AA # FEMININE ORDINAL INDICATOR - : "ª" U00AA # FEMININE ORDINAL INDICATOR - : "ª" U00AA # FEMININE ORDINAL INDICATOR - <2> : "²" U00B2 # SUPERSCRIPT TWO - <2> : "²" U00B2 # SUPERSCRIPT TWO - : "²" U00B2 # SUPERSCRIPT TWO - : "²" U00B2 # SUPERSCRIPT TWO - : "²" U00B2 # SUPERSCRIPT TWO - : "²" U00B2 # SUPERSCRIPT TWO - <3> : "³" U00B3 # SUPERSCRIPT THREE - <3> : "³" U00B3 # SUPERSCRIPT THREE - : "³" U00B3 # SUPERSCRIPT THREE - : "³" U00B3 # SUPERSCRIPT THREE - : "µ" U00B5 # MICRO SIGN - <1> : "¹" U00B9 # SUPERSCRIPT ONE - <1> : "¹" U00B9 # SUPERSCRIPT ONE - : "¹" U00B9 # SUPERSCRIPT ONE - : "¹" U00B9 # SUPERSCRIPT ONE - : "º" U00BA # MASCULINE ORDINAL INDICATOR - : "º" U00BA # MASCULINE ORDINAL INDICATOR - : "º" U00BA # MASCULINE ORDINAL INDICATOR - : "º" U00BA # MASCULINE ORDINAL INDICATOR - <1> <4> : "¼" U00BC # VULGAR FRACTION ONE QUARTER - <1> <2> : "½" U00BD # VULGAR FRACTION ONE HALF - <3> <4> : "¾" U00BE # VULGAR FRACTION THREE QUARTERS - : "À" U00C0 # LATIN CAPITAL LETTER A WITH GRAVE - : "À" U00C0 # LATIN CAPITAL LETTER A WITH GRAVE - : "À" U00C0 # LATIN CAPITAL LETTER A WITH GRAVE - : "Á" U00C1 # LATIN CAPITAL LETTER A WITH ACUTE - : "Á" U00C1 # LATIN CAPITAL LETTER A WITH ACUTE - : "Á" U00C1 # LATIN CAPITAL LETTER A WITH ACUTE - : "Á" U00C1 # LATIN CAPITAL LETTER A WITH ACUTE - : "Â" U00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - : "Â" U00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - : "Ã" U00C3 # LATIN CAPITAL LETTER A WITH TILDE - : "Ã" U00C3 # LATIN CAPITAL LETTER A WITH TILDE - : "Ã" U00C3 # LATIN CAPITAL LETTER A WITH TILDE - : "Ä" U00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS - : "Ä" U00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS - : "Å" U00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE - : "Å" U00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE - : "Ç" U00C7 # LATIN CAPITAL LETTER C WITH CEDILLA - : "Ç" U00C7 # LATIN CAPITAL LETTER C WITH CEDILLA - : "È" U00C8 # LATIN CAPITAL LETTER E WITH GRAVE - : "È" U00C8 # LATIN CAPITAL LETTER E WITH GRAVE - : "È" U00C8 # LATIN CAPITAL LETTER E WITH GRAVE - : "É" U00C9 # LATIN CAPITAL LETTER E WITH ACUTE - : "É" U00C9 # LATIN CAPITAL LETTER E WITH ACUTE - : "É" U00C9 # LATIN CAPITAL LETTER E WITH ACUTE - : "É" U00C9 # LATIN CAPITAL LETTER E WITH ACUTE - : "Ê" U00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - : "Ê" U00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - : "Ë" U00CB # LATIN CAPITAL LETTER E WITH DIAERESIS - : "Ë" U00CB # LATIN CAPITAL LETTER E WITH DIAERESIS - : "Ì" U00CC # LATIN CAPITAL LETTER I WITH GRAVE - : "Ì" U00CC # LATIN CAPITAL LETTER I WITH GRAVE - : "Ì" U00CC # LATIN CAPITAL LETTER I WITH GRAVE - : "Í" U00CD # LATIN CAPITAL LETTER I WITH ACUTE - : "Í" U00CD # LATIN CAPITAL LETTER I WITH ACUTE - : "Í" U00CD # LATIN CAPITAL LETTER I WITH ACUTE - : "Í" U00CD # LATIN CAPITAL LETTER I WITH ACUTE - : "Î" U00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - : "Î" U00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - : "Ï" U00CF # LATIN CAPITAL LETTER I WITH DIAERESIS - : "Ï" U00CF # LATIN CAPITAL LETTER I WITH DIAERESIS - : "Ð" U00D0 # LATIN CAPITAL LETTER ETH - : "Ñ" U00D1 # LATIN CAPITAL LETTER N WITH TILDE - : "Ñ" U00D1 # LATIN CAPITAL LETTER N WITH TILDE - : "Ñ" U00D1 # LATIN CAPITAL LETTER N WITH TILDE - : "Ò" U00D2 # LATIN CAPITAL LETTER O WITH GRAVE - : "Ò" U00D2 # LATIN CAPITAL LETTER O WITH GRAVE - : "Ò" U00D2 # LATIN CAPITAL LETTER O WITH GRAVE - : "Ó" U00D3 # LATIN CAPITAL LETTER O WITH ACUTE - : "Ó" U00D3 # LATIN CAPITAL LETTER O WITH ACUTE - : "Ó" U00D3 # LATIN CAPITAL LETTER O WITH ACUTE - : "Ó" U00D3 # LATIN CAPITAL LETTER O WITH ACUTE - : "Ô" U00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - : "Ô" U00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - : "Õ" U00D5 # LATIN CAPITAL LETTER O WITH TILDE - : "Õ" U00D5 # LATIN CAPITAL LETTER O WITH TILDE - : "Õ" U00D5 # LATIN CAPITAL LETTER O WITH TILDE - : "Ö" U00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS - : "Ö" U00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS - : "×" U00D7 # MULTIPLICATION SIGN - : "Ø" U00D8 # LATIN CAPITAL LETTER O WITH STROKE - : "Ø" U00D8 # LATIN CAPITAL LETTER O WITH STROKE - : "Ù" U00D9 # LATIN CAPITAL LETTER U WITH GRAVE - : "Ù" U00D9 # LATIN CAPITAL LETTER U WITH GRAVE - : "Ù" U00D9 # LATIN CAPITAL LETTER U WITH GRAVE - : "Ú" U00DA # LATIN CAPITAL LETTER U WITH ACUTE - : "Ú" U00DA # LATIN CAPITAL LETTER U WITH ACUTE - : "Ú" U00DA # LATIN CAPITAL LETTER U WITH ACUTE - : "Ú" U00DA # LATIN CAPITAL LETTER U WITH ACUTE - : "Û" U00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - : "Û" U00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - : "Ü" U00DC # LATIN CAPITAL LETTER U WITH DIAERESIS - : "Ü" U00DC # LATIN CAPITAL LETTER U WITH DIAERESIS - : "Ý" U00DD # LATIN CAPITAL LETTER Y WITH ACUTE - : "Ý" U00DD # LATIN CAPITAL LETTER Y WITH ACUTE - : "Ý" U00DD # LATIN CAPITAL LETTER Y WITH ACUTE - : "Ý" U00DD # LATIN CAPITAL LETTER Y WITH ACUTE - : "Þ" U00DE # LATIN CAPITAL LETTER THORN - : "à" U00E0 # LATIN SMALL LETTER A WITH GRAVE - : "à" U00E0 # LATIN SMALL LETTER A WITH GRAVE - : "à" U00E0 # LATIN SMALL LETTER A WITH GRAVE - : "á" U00E1 # LATIN SMALL LETTER A WITH ACUTE - : "á" U00E1 # LATIN SMALL LETTER A WITH ACUTE - : "á" U00E1 # LATIN SMALL LETTER A WITH ACUTE - : "á" U00E1 # LATIN SMALL LETTER A WITH ACUTE - : "â" U00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX - : "â" U00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX - : "ã" U00E3 # LATIN SMALL LETTER A WITH TILDE - : "ã" U00E3 # LATIN SMALL LETTER A WITH TILDE - : "ã" U00E3 # LATIN SMALL LETTER A WITH TILDE - : "ä" U00E4 # LATIN SMALL LETTER A WITH DIAERESIS - : "ä" U00E4 # LATIN SMALL LETTER A WITH DIAERESIS - : "å" U00E5 # LATIN SMALL LETTER A WITH RING ABOVE - : "å" U00E5 # LATIN SMALL LETTER A WITH RING ABOVE - : "ç" U00E7 # LATIN SMALL LETTER C WITH CEDILLA - : "ç" U00E7 # LATIN SMALL LETTER C WITH CEDILLA - : "è" U00E8 # LATIN SMALL LETTER E WITH GRAVE - : "è" U00E8 # LATIN SMALL LETTER E WITH GRAVE - : "è" U00E8 # LATIN SMALL LETTER E WITH GRAVE - : "é" U00E9 # LATIN SMALL LETTER E WITH ACUTE - : "é" U00E9 # LATIN SMALL LETTER E WITH ACUTE - : "é" U00E9 # LATIN SMALL LETTER E WITH ACUTE - : "é" U00E9 # LATIN SMALL LETTER E WITH ACUTE - : "ê" U00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX - : "ê" U00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX - : "ë" U00EB # LATIN SMALL LETTER E WITH DIAERESIS - : "ë" U00EB # LATIN SMALL LETTER E WITH DIAERESIS - : "ì" U00EC # LATIN SMALL LETTER I WITH GRAVE - : "ì" U00EC # LATIN SMALL LETTER I WITH GRAVE - : "ì" U00EC # LATIN SMALL LETTER I WITH GRAVE - : "í" U00ED # LATIN SMALL LETTER I WITH ACUTE - : "í" U00ED # LATIN SMALL LETTER I WITH ACUTE - : "í" U00ED # LATIN SMALL LETTER I WITH ACUTE - : "í" U00ED # LATIN SMALL LETTER I WITH ACUTE - : "î" U00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX - : "î" U00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX - : "ï" U00EF # LATIN SMALL LETTER I WITH DIAERESIS - : "ï" U00EF # LATIN SMALL LETTER I WITH DIAERESIS - : "ð" U00F0 # LATIN SMALL LETTER ETH - : "ñ" U00F1 # LATIN SMALL LETTER N WITH TILDE - : "ñ" U00F1 # LATIN SMALL LETTER N WITH TILDE - : "ñ" U00F1 # LATIN SMALL LETTER N WITH TILDE - : "ò" U00F2 # LATIN SMALL LETTER O WITH GRAVE - : "ò" U00F2 # LATIN SMALL LETTER O WITH GRAVE - : "ò" U00F2 # LATIN SMALL LETTER O WITH GRAVE - : "ó" U00F3 # LATIN SMALL LETTER O WITH ACUTE - : "ó" U00F3 # LATIN SMALL LETTER O WITH ACUTE - : "ó" U00F3 # LATIN SMALL LETTER O WITH ACUTE - : "ó" U00F3 # LATIN SMALL LETTER O WITH ACUTE - : "ô" U00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX - : "ô" U00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX - : "õ" U00F5 # LATIN SMALL LETTER O WITH TILDE - : "õ" U00F5 # LATIN SMALL LETTER O WITH TILDE - : "õ" U00F5 # LATIN SMALL LETTER O WITH TILDE - : "ö" U00F6 # LATIN SMALL LETTER O WITH DIAERESIS - : "ö" U00F6 # LATIN SMALL LETTER O WITH DIAERESIS - : "÷" U00F7 # DIVISION SIGN - : "÷" U00F7 # DIVISION SIGN - : "ø" U00F8 # LATIN SMALL LETTER O WITH STROKE - : "ø" U00F8 # LATIN SMALL LETTER O WITH STROKE - : "ù" U00F9 # LATIN SMALL LETTER U WITH GRAVE - : "ù" U00F9 # LATIN SMALL LETTER U WITH GRAVE - : "ù" U00F9 # LATIN SMALL LETTER U WITH GRAVE - : "ú" U00FA # LATIN SMALL LETTER U WITH ACUTE - : "ú" U00FA # LATIN SMALL LETTER U WITH ACUTE - : "ú" U00FA # LATIN SMALL LETTER U WITH ACUTE - : "ú" U00FA # LATIN SMALL LETTER U WITH ACUTE - : "û" U00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX - : "û" U00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX - : "ü" U00FC # LATIN SMALL LETTER U WITH DIAERESIS - : "ü" U00FC # LATIN SMALL LETTER U WITH DIAERESIS - : "ý" U00FD # LATIN SMALL LETTER Y WITH ACUTE - : "ý" U00FD # LATIN SMALL LETTER Y WITH ACUTE - : "ý" U00FD # LATIN SMALL LETTER Y WITH ACUTE - : "ý" U00FD # LATIN SMALL LETTER Y WITH ACUTE - : "þ" U00FE # LATIN SMALL LETTER THORN - : "ÿ" U00FF # LATIN SMALL LETTER Y WITH DIAERESIS - : "ÿ" U00FF # LATIN SMALL LETTER Y WITH DIAERESIS + : "¬" notsign # NOT SIGN + : "¬" notsign # NOT SIGN + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + <2> : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + <3> : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE + : "³" threesuperior # SUPERSCRIPT THREE + : "³" threesuperior # SUPERSCRIPT THREE + : "µ" mu # MICRO SIGN + <1> : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + : "¹" onesuperior # SUPERSCRIPT ONE + : "¹" onesuperior # SUPERSCRIPT ONE + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + <1> <4> : "¼" onequarter # VULGAR FRACTION ONE QUARTER + <1> <2> : "½" onehalf # VULGAR FRACTION ONE HALF + <3> <4> : "¾" threequarters # VULGAR FRACTION THREE QUARTERS + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA + : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ð" ETH # LATIN CAPITAL LETTER ETH + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "×" multiply # MULTIPLICATION SIGN + : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE + : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Þ" THORN # LATIN CAPITAL LETTER THORN + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA + : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ð" eth # LATIN SMALL LETTER ETH + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "÷" division # DIVISION SIGN + : "÷" division # DIVISION SIGN + : "ø" oslash # LATIN SMALL LETTER O WITH STROKE + : "ø" oslash # LATIN SMALL LETTER O WITH STROKE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "þ" thorn # LATIN SMALL LETTER THORN + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON diff --git a/nls/pt_BR.UTF-8/Compose.pre b/nls/pt_BR.UTF-8/Compose.pre index 017efc4b..1c87986a 100644 --- a/nls/pt_BR.UTF-8/Compose.pre +++ b/nls/pt_BR.UTF-8/Compose.pre @@ -89,7 +89,7 @@ XCOMM Spaces : "›" U203a : "‹" U2039 - : "·" U00B7 + : "·" periodcentered : "¦" brokenbar : "¡" exclamdown

: "¶" paragraph @@ -152,8 +152,8 @@ XCOMM "₪" U20aa NEW SHEQEL SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN - : "£" U00a3 # POUND SIGN - : "£" U00a3 # POUND SIGN + : "£" sterling # POUND SIGN + : "£" sterling # POUND SIGN : "¥" yen : "¥" yen @@ -420,178 +420,178 @@ XCOMM group 1: cluster jamos made of three basic jamos : "ᇞ" U11de : ᅟᅠᆷ ᅟᅠᆻ = ᅟᅠᇞ : "ᇭ" U11ed : ᅟᅠᆼ ᅟᅠᆩ = ᅟᅠᇭ - : "ª" U00AA # FEMININE ORDINAL INDICATOR - : "ª" U00AA # FEMININE ORDINAL INDICATOR - : "ª" U00AA # FEMININE ORDINAL INDICATOR - : "ª" U00AA # FEMININE ORDINAL INDICATOR - <2> : "²" U00B2 # SUPERSCRIPT TWO - <2> : "²" U00B2 # SUPERSCRIPT TWO - : "²" U00B2 # SUPERSCRIPT TWO - : "²" U00B2 # SUPERSCRIPT TWO - : "²" U00B2 # SUPERSCRIPT TWO - : "²" U00B2 # SUPERSCRIPT TWO - <3> : "³" U00B3 # SUPERSCRIPT THREE - <3> : "³" U00B3 # SUPERSCRIPT THREE - : "³" U00B3 # SUPERSCRIPT THREE - : "³" U00B3 # SUPERSCRIPT THREE - <1> : "¹" U00B9 # SUPERSCRIPT ONE - <1> : "¹" U00B9 # SUPERSCRIPT ONE - : "¹" U00B9 # SUPERSCRIPT ONE - : "¹" U00B9 # SUPERSCRIPT ONE - : "º" U00BA # MASCULINE ORDINAL INDICATOR - : "º" U00BA # MASCULINE ORDINAL INDICATOR - : "º" U00BA # MASCULINE ORDINAL INDICATOR - : "º" U00BA # MASCULINE ORDINAL INDICATOR - : "À" U00C0 # LATIN CAPITAL LETTER A WITH GRAVE - : "À" U00C0 # LATIN CAPITAL LETTER A WITH GRAVE - : "À" U00C0 # LATIN CAPITAL LETTER A WITH GRAVE - : "Á" U00C1 # LATIN CAPITAL LETTER A WITH ACUTE - : "Á" U00C1 # LATIN CAPITAL LETTER A WITH ACUTE - : "Á" U00C1 # LATIN CAPITAL LETTER A WITH ACUTE - : "Á" U00C1 # LATIN CAPITAL LETTER A WITH ACUTE - : "Â" U00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - : "Â" U00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - : "Ã" U00C3 # LATIN CAPITAL LETTER A WITH TILDE - : "Ã" U00C3 # LATIN CAPITAL LETTER A WITH TILDE - : "Ã" U00C3 # LATIN CAPITAL LETTER A WITH TILDE - : "Ä" U00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS - : "Ä" U00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS - : "Å" U00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE - : "Å" U00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE - : "Ç" U00C7 # LATIN CAPITAL LETTER C WITH CEDILLA - : "Ç" U00C7 # LATIN CAPITAL LETTER C WITH CEDILLA - : "È" U00C8 # LATIN CAPITAL LETTER E WITH GRAVE - : "È" U00C8 # LATIN CAPITAL LETTER E WITH GRAVE - : "È" U00C8 # LATIN CAPITAL LETTER E WITH GRAVE - : "É" U00C9 # LATIN CAPITAL LETTER E WITH ACUTE - : "É" U00C9 # LATIN CAPITAL LETTER E WITH ACUTE - : "É" U00C9 # LATIN CAPITAL LETTER E WITH ACUTE - : "É" U00C9 # LATIN CAPITAL LETTER E WITH ACUTE - : "Ê" U00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - : "Ê" U00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - : "Ë" U00CB # LATIN CAPITAL LETTER E WITH DIAERESIS - : "Ë" U00CB # LATIN CAPITAL LETTER E WITH DIAERESIS - : "Ì" U00CC # LATIN CAPITAL LETTER I WITH GRAVE - : "Ì" U00CC # LATIN CAPITAL LETTER I WITH GRAVE - : "Ì" U00CC # LATIN CAPITAL LETTER I WITH GRAVE - : "Í" U00CD # LATIN CAPITAL LETTER I WITH ACUTE - : "Í" U00CD # LATIN CAPITAL LETTER I WITH ACUTE - : "Í" U00CD # LATIN CAPITAL LETTER I WITH ACUTE - : "Í" U00CD # LATIN CAPITAL LETTER I WITH ACUTE - : "Î" U00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - : "Î" U00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - : "Ï" U00CF # LATIN CAPITAL LETTER I WITH DIAERESIS - : "Ï" U00CF # LATIN CAPITAL LETTER I WITH DIAERESIS - : "Ñ" U00D1 # LATIN CAPITAL LETTER N WITH TILDE - : "Ñ" U00D1 # LATIN CAPITAL LETTER N WITH TILDE - : "Ñ" U00D1 # LATIN CAPITAL LETTER N WITH TILDE - : "Ò" U00D2 # LATIN CAPITAL LETTER O WITH GRAVE - : "Ò" U00D2 # LATIN CAPITAL LETTER O WITH GRAVE - : "Ò" U00D2 # LATIN CAPITAL LETTER O WITH GRAVE - : "Ó" U00D3 # LATIN CAPITAL LETTER O WITH ACUTE - : "Ó" U00D3 # LATIN CAPITAL LETTER O WITH ACUTE - : "Ó" U00D3 # LATIN CAPITAL LETTER O WITH ACUTE - : "Ó" U00D3 # LATIN CAPITAL LETTER O WITH ACUTE - : "Ô" U00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - : "Ô" U00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - : "Õ" U00D5 # LATIN CAPITAL LETTER O WITH TILDE - : "Õ" U00D5 # LATIN CAPITAL LETTER O WITH TILDE - : "Õ" U00D5 # LATIN CAPITAL LETTER O WITH TILDE - : "Ö" U00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS - : "Ö" U00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS - : "Ø" U00D8 # LATIN CAPITAL LETTER O WITH STROKE - : "Ø" U00D8 # LATIN CAPITAL LETTER O WITH STROKE - : "Ù" U00D9 # LATIN CAPITAL LETTER U WITH GRAVE - : "Ù" U00D9 # LATIN CAPITAL LETTER U WITH GRAVE - : "Ù" U00D9 # LATIN CAPITAL LETTER U WITH GRAVE - : "Ú" U00DA # LATIN CAPITAL LETTER U WITH ACUTE - : "Ú" U00DA # LATIN CAPITAL LETTER U WITH ACUTE - : "Ú" U00DA # LATIN CAPITAL LETTER U WITH ACUTE - : "Ú" U00DA # LATIN CAPITAL LETTER U WITH ACUTE - : "Û" U00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - : "Û" U00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - : "Ü" U00DC # LATIN CAPITAL LETTER U WITH DIAERESIS - : "Ü" U00DC # LATIN CAPITAL LETTER U WITH DIAERESIS - : "Ý" U00DD # LATIN CAPITAL LETTER Y WITH ACUTE - : "Ý" U00DD # LATIN CAPITAL LETTER Y WITH ACUTE - : "Ý" U00DD # LATIN CAPITAL LETTER Y WITH ACUTE - : "Ý" U00DD # LATIN CAPITAL LETTER Y WITH ACUTE - : "à" U00E0 # LATIN SMALL LETTER A WITH GRAVE - : "à" U00E0 # LATIN SMALL LETTER A WITH GRAVE - : "à" U00E0 # LATIN SMALL LETTER A WITH GRAVE - : "á" U00E1 # LATIN SMALL LETTER A WITH ACUTE - : "á" U00E1 # LATIN SMALL LETTER A WITH ACUTE - : "á" U00E1 # LATIN SMALL LETTER A WITH ACUTE - : "á" U00E1 # LATIN SMALL LETTER A WITH ACUTE - : "â" U00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX - : "â" U00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX - : "ã" U00E3 # LATIN SMALL LETTER A WITH TILDE - : "ã" U00E3 # LATIN SMALL LETTER A WITH TILDE - : "ã" U00E3 # LATIN SMALL LETTER A WITH TILDE - : "ä" U00E4 # LATIN SMALL LETTER A WITH DIAERESIS - : "ä" U00E4 # LATIN SMALL LETTER A WITH DIAERESIS - : "å" U00E5 # LATIN SMALL LETTER A WITH RING ABOVE - : "å" U00E5 # LATIN SMALL LETTER A WITH RING ABOVE - : "ç" U00E7 # LATIN SMALL LETTER C WITH CEDILLA - : "ç" U00E7 # LATIN SMALL LETTER C WITH CEDILLA - : "è" U00E8 # LATIN SMALL LETTER E WITH GRAVE - : "è" U00E8 # LATIN SMALL LETTER E WITH GRAVE - : "è" U00E8 # LATIN SMALL LETTER E WITH GRAVE - : "é" U00E9 # LATIN SMALL LETTER E WITH ACUTE - : "é" U00E9 # LATIN SMALL LETTER E WITH ACUTE - : "é" U00E9 # LATIN SMALL LETTER E WITH ACUTE - : "é" U00E9 # LATIN SMALL LETTER E WITH ACUTE - : "ê" U00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX - : "ê" U00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX - : "ë" U00EB # LATIN SMALL LETTER E WITH DIAERESIS - : "ë" U00EB # LATIN SMALL LETTER E WITH DIAERESIS - : "ì" U00EC # LATIN SMALL LETTER I WITH GRAVE - : "ì" U00EC # LATIN SMALL LETTER I WITH GRAVE - : "ì" U00EC # LATIN SMALL LETTER I WITH GRAVE - : "í" U00ED # LATIN SMALL LETTER I WITH ACUTE - : "í" U00ED # LATIN SMALL LETTER I WITH ACUTE - : "í" U00ED # LATIN SMALL LETTER I WITH ACUTE - : "í" U00ED # LATIN SMALL LETTER I WITH ACUTE - : "î" U00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX - : "î" U00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX - : "ï" U00EF # LATIN SMALL LETTER I WITH DIAERESIS - : "ï" U00EF # LATIN SMALL LETTER I WITH DIAERESIS - : "ñ" U00F1 # LATIN SMALL LETTER N WITH TILDE - : "ñ" U00F1 # LATIN SMALL LETTER N WITH TILDE - : "ñ" U00F1 # LATIN SMALL LETTER N WITH TILDE - : "ò" U00F2 # LATIN SMALL LETTER O WITH GRAVE - : "ò" U00F2 # LATIN SMALL LETTER O WITH GRAVE - : "ò" U00F2 # LATIN SMALL LETTER O WITH GRAVE - : "ó" U00F3 # LATIN SMALL LETTER O WITH ACUTE - : "ó" U00F3 # LATIN SMALL LETTER O WITH ACUTE - : "ó" U00F3 # LATIN SMALL LETTER O WITH ACUTE - : "ó" U00F3 # LATIN SMALL LETTER O WITH ACUTE - : "ô" U00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX - : "ô" U00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX - : "õ" U00F5 # LATIN SMALL LETTER O WITH TILDE - : "õ" U00F5 # LATIN SMALL LETTER O WITH TILDE - : "õ" U00F5 # LATIN SMALL LETTER O WITH TILDE - : "ö" U00F6 # LATIN SMALL LETTER O WITH DIAERESIS - : "ö" U00F6 # LATIN SMALL LETTER O WITH DIAERESIS - : "ø" U00F8 # LATIN SMALL LETTER O WITH STROKE - : "ø" U00F8 # LATIN SMALL LETTER O WITH STROKE - : "ù" U00F9 # LATIN SMALL LETTER U WITH GRAVE - : "ù" U00F9 # LATIN SMALL LETTER U WITH GRAVE - : "ù" U00F9 # LATIN SMALL LETTER U WITH GRAVE - : "ú" U00FA # LATIN SMALL LETTER U WITH ACUTE - : "ú" U00FA # LATIN SMALL LETTER U WITH ACUTE - : "ú" U00FA # LATIN SMALL LETTER U WITH ACUTE - : "ú" U00FA # LATIN SMALL LETTER U WITH ACUTE - : "û" U00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX - : "û" U00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX - : "ü" U00FC # LATIN SMALL LETTER U WITH DIAERESIS - : "ü" U00FC # LATIN SMALL LETTER U WITH DIAERESIS - : "ý" U00FD # LATIN SMALL LETTER Y WITH ACUTE - : "ý" U00FD # LATIN SMALL LETTER Y WITH ACUTE - : "ý" U00FD # LATIN SMALL LETTER Y WITH ACUTE - : "ý" U00FD # LATIN SMALL LETTER Y WITH ACUTE - : "ÿ" U00FF # LATIN SMALL LETTER Y WITH DIAERESIS - : "ÿ" U00FF # LATIN SMALL LETTER Y WITH DIAERESIS + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + : "ª" ordfeminine # FEMININE ORDINAL INDICATOR + <2> : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + : "²" twosuperior # SUPERSCRIPT TWO + <3> : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE + : "³" threesuperior # SUPERSCRIPT THREE + : "³" threesuperior # SUPERSCRIPT THREE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + : "¹" onesuperior # SUPERSCRIPT ONE + : "¹" onesuperior # SUPERSCRIPT ONE + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "º" masculine # MASCULINE ORDINAL INDICATOR + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA + : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE + : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "à" agrave # LATIN SMALL LETTER A WITH GRAVE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ã" atilde # LATIN SMALL LETTER A WITH TILDE + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA + : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "è" egrave # LATIN SMALL LETTER E WITH GRAVE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "õ" otilde # LATIN SMALL LETTER O WITH TILDE + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS + : "ø" oslash # LATIN SMALL LETTER O WITH STROKE + : "ø" oslash # LATIN SMALL LETTER O WITH STROKE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON From 1f980cb7d022f53d0aee9e793b08203fb888e86e Mon Sep 17 00:00:00 2001 From: James Cloos Date: Sat, 18 Aug 2007 17:47:04 -0400 Subject: [PATCH 35/36] =?UTF-8?q?Add=20additional=20Euro=20signs=20to=20co?= =?UTF-8?q?mpose=20Inspired=20by=20bug=207419=C2=B9=20make=20all=20of:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit C=, =C, c=, =c, E=, =E, e=, E= after generate € U+20AC EURO SIGN. 1] https://bugs.freedesktop.org/show_bug.cgi?id=7419 --- nls/en_US.UTF-8/Compose.pre | 2 ++ nls/iso8859-15/Compose.pre | 4 ++++ nls/iso8859-3/Compose.pre | 4 ++++ nls/iso8859-9/Compose.pre | 4 ++++ nls/iso8859-9e/Compose.pre | 4 ++++ nls/pt_BR.UTF-8/Compose.pre | 4 ++++ 6 files changed, 22 insertions(+) diff --git a/nls/en_US.UTF-8/Compose.pre b/nls/en_US.UTF-8/Compose.pre index 8c58ceab..25ebacb9 100644 --- a/nls/en_US.UTF-8/Compose.pre +++ b/nls/en_US.UTF-8/Compose.pre @@ -155,6 +155,8 @@ XCOMM "₪" U20aa NEW SHEQEL SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN diff --git a/nls/iso8859-15/Compose.pre b/nls/iso8859-15/Compose.pre index b936e58e..d9264cd3 100644 --- a/nls/iso8859-15/Compose.pre +++ b/nls/iso8859-15/Compose.pre @@ -56,8 +56,12 @@ XCOMM Special Character : "\243" sterling : "\244" EuroSign : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign : "\244" EuroSign + : "\244" EuroSign : "\244" EuroSign + : "\244" EuroSign : "\245" yen : "\245" yen : "\245" yen diff --git a/nls/iso8859-3/Compose.pre b/nls/iso8859-3/Compose.pre index 71a58857..fe52a597 100644 --- a/nls/iso8859-3/Compose.pre +++ b/nls/iso8859-3/Compose.pre @@ -47,6 +47,10 @@ XCOMM Special Character : "\243" sterling : "\244" EuroSign : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign : "\244" EuroSign : "\244" EuroSign : "\245" yen diff --git a/nls/iso8859-9/Compose.pre b/nls/iso8859-9/Compose.pre index 13ae0b40..748e8ace 100644 --- a/nls/iso8859-9/Compose.pre +++ b/nls/iso8859-9/Compose.pre @@ -55,6 +55,10 @@ XCOMM Special Character : "\243" sterling : "\244" EuroSign : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign : "\244" EuroSign : "\244" EuroSign : "\245" yen diff --git a/nls/iso8859-9e/Compose.pre b/nls/iso8859-9e/Compose.pre index a87899ad..f8c08f64 100644 --- a/nls/iso8859-9e/Compose.pre +++ b/nls/iso8859-9e/Compose.pre @@ -54,6 +54,10 @@ XCOMM Special Character : "\243" sterling : "\244" EuroSign : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign + : "\244" EuroSign : "\244" EuroSign : "\244" EuroSign : "\245" yen diff --git a/nls/pt_BR.UTF-8/Compose.pre b/nls/pt_BR.UTF-8/Compose.pre index 1c87986a..c8083e29 100644 --- a/nls/pt_BR.UTF-8/Compose.pre +++ b/nls/pt_BR.UTF-8/Compose.pre @@ -149,8 +149,12 @@ XCOMM "₪" U20aa NEW SHEQEL SIGN : "₫" U20ab # DONG SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN + : "€" EuroSign # EURO SIGN : "£" sterling # POUND SIGN : "£" sterling # POUND SIGN From eff33ae525337ce2026be135a26464c7b1237113 Mon Sep 17 00:00:00 2001 From: James Cloos Date: Sat, 18 Aug 2007 17:58:23 -0400 Subject: [PATCH 36/36] =?UTF-8?q?Patch=20for=20Catalan=20locales=20From=20?= =?UTF-8?q?bugzilla=20bug=2010943=C2=B9:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are several Catalan locale codes which presently can be used in X11 systems; especially after they were accepted in belocs-locale-data². In the following patches, I³ add ca_AD, ca_FR and ca_IT Catalan locale codes. For instance, without this, using ca_AD (actually a quite used locale⁴) some applications (eg. Emacs or Skype) cannot display Catalan diacritic marks as you type them. 1] https://bugs.freedesktop.org/show_bug.cgi?id=10943 2] http://lists.debian.org/debian-devel-changes/2005/07/msg01429.html 3] Toni Hermoso Pulido 4] https://launchpad.net/~ubuntu.cat/+members --- nls/compose.dir.pre | 9 +++++++++ nls/locale.alias.pre | 30 ++++++++++++++++++++++++++++++ nls/locale.dir.pre | 9 +++++++++ 3 files changed, 48 insertions(+) diff --git a/nls/compose.dir.pre b/nls/compose.dir.pre index d9886c7b..c9a35dcf 100644 --- a/nls/compose.dir.pre +++ b/nls/compose.dir.pre @@ -32,8 +32,14 @@ iso8859-1/Compose: br_FR.ISO8859-1 iso8859-14/Compose: br_FR.ISO8859-14 iso8859-15/Compose: br_FR.ISO8859-15 iso8859-2/Compose: bs_BA.ISO8859-2 +iso8859-1/Compose: ca_AD.ISO8859-1 +iso8859-15/Compose: ca_AD.ISO8859-15 iso8859-1/Compose: ca_ES.ISO8859-1 iso8859-15/Compose: ca_ES.ISO8859-15 +iso8859-1/Compose: ca_FR.ISO8859-1 +iso8859-15/Compose: ca_FR.ISO8859-15 +iso8859-1/Compose: ca_IT.ISO8859-1 +iso8859-15/Compose: ca_IT.ISO8859-15 iso8859-2/Compose: cs_CZ.ISO8859-2 iso8859-1/Compose: cy_GB.ISO8859-1 iso8859-14/Compose: cy_GB.ISO8859-14 @@ -258,7 +264,10 @@ en_US.UTF-8/Compose: be_BY.UTF-8 en_US.UTF-8/Compose: bg_BG.UTF-8 en_US.UTF-8/Compose: bn_IN.UTF-8 en_US.UTF-8/Compose: br_FR.UTF-8 +en_US.UTF-8/Compose: ca_AD.UTF-8 en_US.UTF-8/Compose: ca_ES.UTF-8 +en_US.UTF-8/Compose: ca_FR.UTF-8 +en_US.UTF-8/Compose: ca_IT.UTF-8 en_US.UTF-8/Compose: cs_CZ.UTF-8 en_US.UTF-8/Compose: cy_GB.UTF-8 en_US.UTF-8/Compose: cz_CZ.UTF-8 diff --git a/nls/locale.alias.pre b/nls/locale.alias.pre index a74ca759..87f52172 100644 --- a/nls/locale.alias.pre +++ b/nls/locale.alias.pre @@ -146,6 +146,15 @@ bs_BA.iso88592: bs_BA.ISO8859-2 bs_BA.ISO-8859-2: bs_BA.ISO8859-2 bs_BA.ISO_8859-2: bs_BA.ISO8859-2 ca: ca_ES.ISO8859-1 +ca_AD: ca_AD.ISO8859-1 +ca_AD@euro: ca_AD.ISO8859-15 +ca_AD.iso88591: ca_AD.ISO8859-1 +ca_AD.ISO-8859-1: ca_AD.ISO8859-1 +ca_AD.iso885915: ca_AD.ISO8859-15 +ca_AD.utf8: ca_AD.UTF-8 +ca_AD.ISO-8859-15: ca_AD.ISO8859-15 +ca_AD.ISO-8859-15@euro: ca_AD.ISO8859-15 +ca_AD.UTF-8@euro: ca_AD.UTF-8 ca_ES: ca_ES.ISO8859-1 ca_ES@euro: ca_ES.ISO8859-15 ca_ES.iso88591: ca_ES.ISO8859-1 @@ -155,6 +164,24 @@ ca_ES.utf8: ca_ES.UTF-8 ca_ES.ISO-8859-15: ca_ES.ISO8859-15 ca_ES.ISO-8859-15@euro: ca_ES.ISO8859-15 ca_ES.UTF-8@euro: ca_ES.UTF-8 +ca_FR: ca_FR.ISO8859-1 +ca_FR@euro: ca_FR.ISO8859-15 +ca_FR.iso88591: ca_FR.ISO8859-1 +ca_FR.ISO-8859-1: ca_FR.ISO8859-1 +ca_FR.iso885915: ca_FR.ISO8859-15 +ca_FR.utf8: ca_FR.UTF-8 +ca_FR.ISO-8859-15: ca_FR.ISO8859-15 +ca_FR.ISO-8859-15@euro: ca_FR.ISO8859-15 +ca_FR.UTF-8@euro: ca_FR.UTF-8 +ca_IT: ca_IT.ISO8859-1 +ca_IT@euro: ca_IT.ISO8859-15 +ca_IT.iso88591: ca_IT.ISO8859-1 +ca_IT.ISO-8859-1: ca_IT.ISO8859-1 +ca_IT.iso885915: ca_IT.ISO8859-15 +ca_IT.utf8: ca_IT.UTF-8 +ca_IT.ISO-8859-15: ca_IT.ISO8859-15 +ca_IT.ISO-8859-15@euro: ca_IT.ISO8859-15 +ca_IT.UTF-8@euro: ca_IT.UTF-8 cs: cs_CZ.ISO8859-2 cs_CS: cs_CZ.ISO8859-2 cs_CS.ISO8859-2: cs_CZ.ISO8859-2 @@ -1237,7 +1264,10 @@ Arabic_Tunisia.1256: ar_TN.iso8859-6 Arabic_Yemen.1256: ar_YE.iso8859-6 Belarusian_Belarus.1251: be_BY.iso8859-5 Bulgarian_Bulgaria.1251: bg_BG.iso8859-5 +Catalan_Andorra.1252: ca_AD.iso8859-1 Catalan_Spain.1252: ca_ES.iso8859-1 +Catalan_France.1252: ca_FR.iso8859-1 +Catalan_Italy.1252: ca_IT.iso8859-1 Czech_Czech Republic.1250: cs_CZ.iso8859-2 Danish_Denmark.1252: da_DK.iso8859-1 German_Austria.1252: de_AT.iso8859-1 diff --git a/nls/locale.dir.pre b/nls/locale.dir.pre index 275c8c84..28869f23 100644 --- a/nls/locale.dir.pre +++ b/nls/locale.dir.pre @@ -38,8 +38,14 @@ iso8859-2/XLC_LOCALE bs_BA.ISO8859-2 iso8859-1/XLC_LOCALE: br_FR.ISO8859-1 iso8859-14/XLC_LOCALE: br_FR.ISO8859-14 iso8859-15/XLC_LOCALE: br_FR.ISO8859-15 +iso8859-1/XLC_LOCALE: ca_AD.ISO8859-1 +iso8859-15/XLC_LOCALE: ca_AD.ISO8859-15 iso8859-1/XLC_LOCALE: ca_ES.ISO8859-1 iso8859-15/XLC_LOCALE: ca_ES.ISO8859-15 +iso8859-1/XLC_LOCALE: ca_FR.ISO8859-1 +iso8859-15/XLC_LOCALE: ca_FR.ISO8859-15 +iso8859-1/XLC_LOCALE: ca_IT.ISO8859-1 +iso8859-15/XLC_LOCALE: ca_IT.ISO8859-15 iso8859-2/XLC_LOCALE: cs_CZ.ISO8859-2 iso8859-1/XLC_LOCALE: cy_GB.ISO8859-1 iso8859-14/XLC_LOCALE: cy_GB.ISO8859-14 @@ -278,7 +284,10 @@ en_US.UTF-8/XLC_LOCALE: bg_BG.UTF-8 en_US.UTF-8/XLC_LOCALE: bn_BD.UTF-8 en_US.UTF-8/XLC_LOCALE: bn_IN.UTF-8 en_US.UTF-8/XLC_LOCALE: br_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE: ca_AD.UTF-8 en_US.UTF-8/XLC_LOCALE: ca_ES.UTF-8 +en_US.UTF-8/XLC_LOCALE: ca_FR.UTF-8 +en_US.UTF-8/XLC_LOCALE: ca_IT.UTF-8 en_US.UTF-8/XLC_LOCALE: cs_CZ.UTF-8 en_US.UTF-8/XLC_LOCALE: cy_GB.UTF-8 en_US.UTF-8/XLC_LOCALE: cs_CZ.UTF-8