From 0f834b91a4768673833ab4917e87d86c237bb1a6 Mon Sep 17 00:00:00 2001 From: marha Date: Fri, 23 Mar 2012 10:05:55 +0100 Subject: libX11 xserver fontconfig mesa pixman xkbcomp xkeyboard-config git update 23 Mar 2012 --- libX11/configure.ac | 2 +- libX11/nls/en_US.UTF-8/Compose.pre | 382 ++++++++++- libX11/src/Xrm.c | 2 +- libX11/src/locking.c | 1248 ++++++++++++++++++------------------ 4 files changed, 998 insertions(+), 636 deletions(-) (limited to 'libX11') diff --git a/libX11/configure.ac b/libX11/configure.ac index c1f64b697..aaec96810 100644 --- a/libX11/configure.ac +++ b/libX11/configure.ac @@ -1,7 +1,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) -AC_INIT([libX11], [1.4.99.1], +AC_INIT([libX11], [1.4.99.901], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libX11]) AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_HEADERS([src/config.h include/X11/XlibConf.h]) diff --git a/libX11/nls/en_US.UTF-8/Compose.pre b/libX11/nls/en_US.UTF-8/Compose.pre index 057f6217a..2eae91239 100644 --- a/libX11/nls/en_US.UTF-8/Compose.pre +++ b/libX11/nls/en_US.UTF-8/Compose.pre @@ -9,6 +9,7 @@ XCOMM Spacing versions of dead accents : "~" asciitilde # TILDE : "'" apostrophe # APOSTROPHE : "´" acute # ACUTE ACCENT + : "´" acute # ACUTE ACCENT : "`" grave # GRAVE ACCENT : "`" grave # GRAVE ACCENT : "^" asciicircum # CIRCUMFLEX ACCENT @@ -17,22 +18,32 @@ XCOMM Spacing versions of dead accents : "°" degree # DEGREE SIGN : "¯" macron # MACRON : "¯" macron # MACRON + : "¯" macron # MACRON + : "¯" macron # MACRON + : "¯" macron # MACRON + : "¯" macron # MACRON : "˘" breve # BREVE : "˘" breve # BREVE + : "˘" breve # BREVE + : "˘" breve # BREVE : "˙" abovedot # DOT ABOVE : "˙" abovedot # DOT ABOVE : "¨" diaeresis # DIAERESIS + : "¨" diaeresis # DIAERESIS : "\"" quotedbl # REVERSE SOLIDUS : "˝" U2dd # DOUBLE ACUTE ACCENT : "˝" U2dd # DOUBLE ACUTE ACCENT : "ˇ" caron # CARON : "ˇ" caron # CARON + : "ˇ" caron # CARON + : "ˇ" caron # CARON : "¸" cedilla # CEDILLA : "¸" cedilla # CEDILLA : "˛" ogonek # OGONEK : "˛" ogonek # OGONEK : "ͺ" U37a # GREEK YPOGEGRAMMENI : "ͺ" U37a # GREEK YPOGEGRAMMENI + : "­" U00ad # SOFT HYPHEN XCOMM ASCII characters that may be difficult to access @@ -57,6 +68,7 @@ XCOMM on some keyboards. : "¸" cedilla # CEDILLA : "¸" cedilla # CEDILLA + : "¸" cedilla # CEDILLA : "{" braceleft # LEFT CURLY BRACKET : "{" braceleft # LEFT CURLY BRACKET @@ -84,22 +96,28 @@ XCOMM Spaces : "©" copyright # COPYRIGHT SIGN : "©" copyright # COPYRIGHT SIGN : "©" copyright # COPYRIGHT SIGN + : "©" copyright # COPYRIGHT SIGN + : "©" copyright # COPYRIGHT SIGN : "®" registered # REGISTERED SIGN : "®" registered # REGISTERED SIGN : "®" registered # REGISTERED SIGN : "®" registered # REGISTERED SIGN + : "®" registered # REGISTERED SIGN : "›" U203a # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK : "‹" U2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK : "…" ellipsis # HORIZONTAL ELLIPSIS : "·" periodcentered # MIDDLE DOT + : "·" periodcentered # MIDDLE DOT + : "·" periodcentered # MIDDLE DOT : "•" enfilledcircbullet # BULLET : "¦" brokenbar # BROKEN BAR : "¡" exclamdown # INVERTED EXCLAMATION MARK

: "¶" paragraph # PILCROW SIGN

: "¶" paragraph # PILCROW SIGN : "±" plusminus # PLUS-MINUS SIGN + : "±" plusminus # PLUS-MINUS SIGN : "¿" questiondown # INVERTED QUESTION MARK : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE @@ -120,10 +138,10 @@ XCOMM Spaces : "ij" U0133 # LATIN SMALL LIGATURE IJ : "°" degree # DEGREE SIGN + <0> : "°" degree # DEGREE SIGN + <0> : "°" degree # DEGREE SIGN XCOMM Quotation marks - : "〝" U301d # REVERSED DOUBLE PRIME QUOTATION MARK - : "〞" U301e # DOUBLE PRIME QUOTATION MARK : "«" guillemotleft # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK : "»" guillemotright # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK : "‘" U2018 # LEFT SINGLE QUOTATION MARK @@ -159,7 +177,8 @@ XCOMM Currencies : "₩" U20a9 # WON SIGN : "₩" U20a9 # WON SIGN XCOMM "₪" U20aa NEW SHEQEL SIGN - : "₫" U20ab # DONG SIGN + : "₫" U20ab # DONG SIGN + : "₫" U20ab # DONG SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN : "€" EuroSign # EURO SIGN @@ -197,6 +216,10 @@ XCOMM "₵" U20b5 CEDI SIGN : "¥" yen # YEN SIGN : "¥" yen # YEN SIGN : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN + : "¥" yen # YEN SIGN XCOMM Long S : "ſ" U017f # LATIN SMALL LETTER LONG S @@ -209,6 +232,10 @@ XCOMM Dashes : "—" U2014 # EM DASH XCOMM Musical alterations + : "♩" U2669 # QUARTER NOTE + : "♪" U266a # EIGHTH NOTE + : "♫" U266b # BEAMED EIGHTH NOTES + : "♬" U266c # BEAMED SIXTEENTH NOTES : "♭" U266d # MUSIC FLAT SIGN : "♮" U266e # MUSIC NATURAL SIGN : "♯" U266f # MUSIC SHARP SIGN @@ -216,10 +243,20 @@ XCOMM Musical alterations XCOMM Other symbols : "§" section # SECTION SIGN : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN + : "§" section # SECTION SIGN : "§" section # SECTION SIGN : "¤" currency # CURRENCY SIGN : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN + : "¤" currency # CURRENCY SIGN

: "¶" paragraph # PILCROW SIGN @@ -494,15 +531,34 @@ XCOMM Part 3 : "²" twosuperior # SUPERSCRIPT TWO : "²" twosuperior # SUPERSCRIPT TWO : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO + <2> : "²" twosuperior # SUPERSCRIPT TWO <3> : "³" threesuperior # SUPERSCRIPT THREE <3> : "³" threesuperior # SUPERSCRIPT THREE : "³" threesuperior # SUPERSCRIPT THREE : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE + <3> : "³" threesuperior # SUPERSCRIPT THREE : "µ" mu # MICRO SIGN + : "µ" mu # MICRO SIGN + : "µ" mu # MICRO SIGN + : "µ" mu # MICRO SIGN + : "µ" mu # MICRO SIGN <1> : "¹" onesuperior # SUPERSCRIPT ONE <1> : "¹" onesuperior # SUPERSCRIPT ONE : "¹" onesuperior # SUPERSCRIPT ONE : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE + <1> : "¹" onesuperior # SUPERSCRIPT ONE : "º" masculine # MASCULINE ORDINAL INDICATOR : "º" masculine # MASCULINE ORDINAL INDICATOR : "º" masculine # MASCULINE ORDINAL INDICATOR @@ -512,137 +568,260 @@ XCOMM Part 3 <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 + : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + : "Â" 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 + : "Ã" 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 + : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS + : "Ä" 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 + : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE + : "Å" 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 + : "Ç" 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 + : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + : "Ê" 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 + : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS + : "Ë" 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 + : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + : "Î" 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 + : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS + : "Ï" 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 + : "Ñ" 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 + : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + : "Ô" 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 + : "Õ" 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 + : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS + : "Ö" 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 + : "Ø" 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 + : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + : "Û" 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 + : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS + : "Ü" 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 + : "Ý" 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 + : "á" aacute # LATIN SMALL LETTER A WITH ACUTE : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX + : "â" 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 + : "ã" 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 + : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS + : "ä" 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 + : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE + : "å" 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 + : "ç" 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 + : "é" eacute # LATIN SMALL LETTER E WITH ACUTE : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX + : "ê" 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 + : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS + : "ë" 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 + : "í" iacute # LATIN SMALL LETTER I WITH ACUTE : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX + : "î" 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 + : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS + : "ï" 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 + : "ñ" 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 + : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX + : "ô" 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 + : "õ" 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 + : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS : "ö" 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 + : "ø" 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 + : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX + : "û" 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 + : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS + : "ü" 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 + : "ý" 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 + : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS + : "ÿ" 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 @@ -652,49 +831,73 @@ XCOMM Part 3 : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE + : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE + : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK + : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK + : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE + : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE + : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE : "Ĉ" U0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX : "Ĉ" U0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX : "ĉ" U0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX : "ĉ" U0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX : "Ċ" U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE : "Ċ" U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE + : "Ċ" U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE : "ċ" U010B # LATIN SMALL LETTER C WITH DOT ABOVE : "ċ" U010B # LATIN SMALL LETTER C WITH DOT ABOVE + : "ċ" U010B # LATIN SMALL LETTER C WITH DOT ABOVE : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON + : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON + : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON : "č" U010D # LATIN SMALL LETTER C WITH CARON : "č" U010D # LATIN SMALL LETTER C WITH CARON + : "č" U010D # LATIN SMALL LETTER C WITH CARON + : "č" U010D # LATIN SMALL LETTER C WITH CARON : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON + : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON + : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON : "ď" U010F # LATIN SMALL LETTER D WITH CARON : "ď" U010F # LATIN SMALL LETTER D WITH CARON - : "Đ" U0110 # LATIN CAPITAL LETTER D WITH STROKE - : "Đ" U0110 # LATIN CAPITAL LETTER D WITH STROKE - : "Đ" U0110 # LATIN CAPITAL LETTER D WITH STROKE - : "đ" U0111 # LATIN SMALL LETTER D WITH STROKE - : "đ" U0111 # LATIN SMALL LETTER D WITH STROKE - : "đ" U0111 # LATIN SMALL LETTER D WITH STROKE + : "ď" U010F # LATIN SMALL LETTER D WITH CARON + : "ď" U010F # LATIN SMALL LETTER D WITH CARON + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE + : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON + : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON + : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE @@ -703,37 +906,57 @@ XCOMM Part 3 : "ĕ" U0115 # LATIN SMALL LETTER E WITH BREVE : "Ė" U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE : "Ė" U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE + : "Ė" U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE : "ė" U0117 # LATIN SMALL LETTER E WITH DOT ABOVE : "ė" U0117 # LATIN SMALL LETTER E WITH DOT ABOVE + : "ė" U0117 # LATIN SMALL LETTER E WITH DOT ABOVE : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK + : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK + : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON + : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON + : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON : "ě" U011B # LATIN SMALL LETTER E WITH CARON : "ě" U011B # LATIN SMALL LETTER E WITH CARON + : "ě" U011B # LATIN SMALL LETTER E WITH CARON + : "ě" U011B # LATIN SMALL LETTER E WITH CARON : "Ĝ" U011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX : "Ĝ" U011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX : "ĝ" U011D # LATIN SMALL LETTER G WITH CIRCUMFLEX : "ĝ" U011D # LATIN SMALL LETTER G WITH CIRCUMFLEX : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE + : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE + : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE : "Ġ" U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE : "Ġ" U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE + : "Ġ" U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE : "ġ" U0121 # LATIN SMALL LETTER G WITH DOT ABOVE : "ġ" U0121 # LATIN SMALL LETTER G WITH DOT ABOVE + : "ġ" U0121 # LATIN SMALL LETTER G WITH DOT ABOVE : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA + : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA + : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA : "Ĥ" U0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX : "Ĥ" U0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX @@ -747,14 +970,22 @@ XCOMM Part 3 : "ħ" U0127 # LATIN SMALL LETTER H WITH STROKE : "Ĩ" U0128 # LATIN CAPITAL LETTER I WITH TILDE : "Ĩ" U0128 # LATIN CAPITAL LETTER I WITH TILDE + : "Ĩ" U0128 # LATIN CAPITAL LETTER I WITH TILDE : "ĩ" U0129 # LATIN SMALL LETTER I WITH TILDE : "ĩ" U0129 # LATIN SMALL LETTER I WITH TILDE + : "ĩ" U0129 # LATIN SMALL LETTER I WITH TILDE : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON + : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON : "ī" U012B # LATIN SMALL LETTER I WITH MACRON : "ī" U012B # LATIN SMALL LETTER I WITH MACRON : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON + : "ī" U012B # LATIN SMALL LETTER I WITH MACRON : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE @@ -764,70 +995,97 @@ XCOMM Part 3 : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK + : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK : "į" U012F # LATIN SMALL LETTER I WITH OGONEK : "į" U012F # LATIN SMALL LETTER I WITH OGONEK + : "į" U012F # LATIN SMALL LETTER I WITH OGONEK : "į" U012F # LATIN SMALL LETTER I WITH OGONEK + : "į" U012F # LATIN SMALL LETTER I WITH OGONEK : "İ" U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE : "İ" U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE + : "İ" U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE : "ı" U0131 # LATIN SMALL LETTER DOTLESS I : "ı" U0131 # LATIN SMALL LETTER DOTLESS I + : "ı" U0131 # LATIN SMALL LETTER DOTLESS I : "Ĵ" U0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX : "Ĵ" U0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX : "ĵ" U0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX : "ĵ" U0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA + : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA + : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA : "ĸ" U0138 # LATIN SMALL LETTER KRA : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE + : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE + : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA + : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA + : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON + : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON + : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON : "ľ" U013E # LATIN SMALL LETTER L WITH CARON : "ľ" U013E # LATIN SMALL LETTER L WITH CARON + : "ľ" U013E # LATIN SMALL LETTER L WITH CARON + : "ľ" U013E # LATIN SMALL LETTER L WITH CARON : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE + : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE + : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE + : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE + : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA + : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA + : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON + : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON + : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON : "ň" U0148 # LATIN SMALL LETTER N WITH CARON : "ň" U0148 # LATIN SMALL LETTER N WITH CARON + : "ň" U0148 # LATIN SMALL LETTER N WITH CARON + : "ň" U0148 # LATIN SMALL LETTER N WITH CARON : "Ŋ" U014A # LATIN CAPITAL LETTER ENG : "ŋ" U014B # LATIN SMALL LETTER ENG : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON + : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON : "ō" U014D # LATIN SMALL LETTER O WITH MACRON : "ō" U014D # LATIN SMALL LETTER O WITH MACRON : "ō" U014D # LATIN SMALL LETTER O WITH MACRON + : "ō" U014D # LATIN SMALL LETTER O WITH MACRON : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE @@ -841,65 +1099,100 @@ XCOMM Part 3 : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE + : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE + : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA + : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA + : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON + : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON + : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON : "ř" U0159 # LATIN SMALL LETTER R WITH CARON : "ř" U0159 # LATIN SMALL LETTER R WITH CARON + : "ř" U0159 # LATIN SMALL LETTER R WITH CARON + : "ř" U0159 # LATIN SMALL LETTER R WITH CARON : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE + : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE + : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE : "Ŝ" U015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX : "Ŝ" U015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX : "ŝ" U015D # LATIN SMALL LETTER S WITH CIRCUMFLEX : "ŝ" U015D # LATIN SMALL LETTER S WITH CIRCUMFLEX : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA + : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA + : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA + : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON + : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON + : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON : "š" U0161 # LATIN SMALL LETTER S WITH CARON : "š" U0161 # LATIN SMALL LETTER S WITH CARON + : "š" U0161 # LATIN SMALL LETTER S WITH CARON + : "š" U0161 # LATIN SMALL LETTER S WITH CARON : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA + : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA + : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON + : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON + : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON : "ť" U0165 # LATIN SMALL LETTER T WITH CARON : "ť" U0165 # LATIN SMALL LETTER T WITH CARON + : "ť" U0165 # LATIN SMALL LETTER T WITH CARON + : "ť" U0165 # LATIN SMALL LETTER T WITH CARON : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE + : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE + : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE + : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE + : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE : "Ũ" U0168 # LATIN CAPITAL LETTER U WITH TILDE : "Ũ" U0168 # LATIN CAPITAL LETTER U WITH TILDE + : "Ũ" U0168 # LATIN CAPITAL LETTER U WITH TILDE : "ũ" U0169 # LATIN SMALL LETTER U WITH TILDE : "ũ" U0169 # LATIN SMALL LETTER U WITH TILDE + : "ũ" U0169 # LATIN SMALL LETTER U WITH TILDE : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON + : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON : "ū" U016B # LATIN SMALL LETTER U WITH MACRON : "ū" U016B # LATIN SMALL LETTER U WITH MACRON : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON + : "ū" U016B # LATIN SMALL LETTER U WITH MACRON : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE @@ -909,8 +1202,12 @@ XCOMM Part 3 : "ŭ" U016D # LATIN SMALL LETTER U WITH BREVE : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE + : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE + : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE + : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE + : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE : "Ű" U0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE : "Ű" U0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE : "ű" U0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE @@ -918,33 +1215,52 @@ XCOMM Part 3 : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK + : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK + : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK : "Ŵ" U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX : "Ŵ" U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX + : "Ŵ" U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX : "ŵ" U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX : "ŵ" U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX + : "ŵ" U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX : "Ŷ" U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX : "Ŷ" U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + : "Ŷ" U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX : "ŷ" U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX : "ŷ" U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX + : "ŷ" U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS + : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS + : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS + : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE + : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE + : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE : "Ż" U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE : "Ż" U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE + : "Ż" U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE : "ż" U017C # LATIN SMALL LETTER Z WITH DOT ABOVE : "ż" U017C # LATIN SMALL LETTER Z WITH DOT ABOVE + : "ż" U017C # LATIN SMALL LETTER Z WITH DOT ABOVE : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON + : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON + : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON + : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON : "ž" U017E # LATIN SMALL LETTER Z WITH CARON : "ž" U017E # LATIN SMALL LETTER Z WITH CARON + : "ž" U017E # LATIN SMALL LETTER Z WITH CARON + : "ž" U017E # LATIN SMALL LETTER Z WITH CARON + : "ž" U017E # LATIN SMALL LETTER Z WITH CARON : "ƀ" U0180 # LATIN SMALL LETTER B WITH STROKE : "ƀ" U0180 # LATIN SMALL LETTER B WITH STROKE : "ƀ" U0180 # LATIN SMALL LETTER B WITH STROKE @@ -1143,6 +1459,7 @@ XCOMM Part 3 : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE + : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE @@ -1151,6 +1468,7 @@ XCOMM Part 3 : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE + : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE @@ -1346,52 +1664,69 @@ XCOMM Part 3 : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS : "΅" U0385 # GREEK DIALYTIKA TONOS : "΅" U0385 # GREEK DIALYTIKA TONOS : "΅" U0385 # GREEK DIALYTIKA TONOS + : "΅" U0385 # GREEK DIALYTIKA TONOS : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS + : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS + : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS + : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS + : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS + : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS + : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS + : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS : "Ϊ" U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA : "Ϊ" U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + : "Ϊ" U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA : "Ϋ" U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA : "Ϋ" U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + : "Ϋ" U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS + : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS + : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS + : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS @@ -1404,19 +1739,26 @@ XCOMM Part 3 : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS : "ϊ" U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA : "ϊ" U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA + : "ϊ" U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA : "ϋ" U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA : "ϋ" U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + : "ϋ" U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS + : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS + : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS + : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS : "ϔ" U03D4 # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL : "Ѐ" U0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE : "Ѐ" U0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE @@ -1626,8 +1968,10 @@ XCOMM Part 3 : "ḁ" U1E01 # LATIN SMALL LETTER A WITH RING BELOW : "Ḃ" U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE : "Ḃ" U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE + : "Ḃ" U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE : "ḃ" U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE : "ḃ" U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE + : "ḃ" U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE : "Ḅ" U1E04 # LATIN CAPITAL LETTER B WITH DOT BELOW : "Ḅ" U1E04 # LATIN CAPITAL LETTER B WITH DOT BELOW : "ḅ" U1E05 # LATIN SMALL LETTER B WITH DOT BELOW @@ -1658,8 +2002,10 @@ XCOMM Part 3 : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE : "Ḋ" U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE : "Ḋ" U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE + : "Ḋ" U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE : "ḋ" U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE : "ḋ" U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE + : "ḋ" U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE : "Ḍ" U1E0C # LATIN CAPITAL LETTER D WITH DOT BELOW : "Ḍ" U1E0C # LATIN CAPITAL LETTER D WITH DOT BELOW : "ḍ" U1E0D # LATIN SMALL LETTER D WITH DOT BELOW @@ -1668,9 +2014,11 @@ XCOMM Part 3 : "ḏ" U1E0F # LATIN SMALL LETTER D WITH LINE BELOW : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA + : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA + : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA : "Ḓ" U1E12 # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW : "ḓ" U1E13 # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW @@ -1725,7 +2073,7 @@ XCOMM Part 3 : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE - : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE + : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE @@ -1737,15 +2085,17 @@ XCOMM Part 3 : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE - : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE + : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE : "Ḟ" U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE : "Ḟ" U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE + : "Ḟ" U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE : "ḟ" U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE : "ḟ" U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE + : "ḟ" U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON @@ -1766,9 +2116,11 @@ XCOMM Part 3 : "ḧ" U1E27 # LATIN SMALL LETTER H WITH DIAERESIS : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA + : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA + : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA : "Ḫ" U1E2A # LATIN CAPITAL LETTER H WITH BREVE BELOW : "ḫ" U1E2B # LATIN SMALL LETTER H WITH BREVE BELOW @@ -1838,8 +2190,10 @@ XCOMM Part 3 : "ḿ" U1E3F # LATIN SMALL LETTER M WITH ACUTE : "Ṁ" U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE : "Ṁ" U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE + : "Ṁ" U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE : "ṁ" U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE : "ṁ" U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE + : "ṁ" U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE : "Ṃ" U1E42 # LATIN CAPITAL LETTER M WITH DOT BELOW : "Ṃ" U1E42 # LATIN CAPITAL LETTER M WITH DOT BELOW : "ṃ" U1E43 # LATIN SMALL LETTER M WITH DOT BELOW @@ -1934,8 +2288,10 @@ XCOMM Part 3

: "ṕ" U1E55 # LATIN SMALL LETTER P WITH ACUTE

: "Ṗ" U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE

: "Ṗ" U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE +

: "Ṗ" U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE

: "ṗ" U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE

: "ṗ" U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE +

: "ṗ" U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE : "Ṙ" U1E58 # LATIN CAPITAL LETTER R WITH DOT ABOVE : "Ṙ" U1E58 # LATIN CAPITAL LETTER R WITH DOT ABOVE : "ṙ" U1E59 # LATIN SMALL LETTER R WITH DOT ABOVE @@ -1966,8 +2322,10 @@ XCOMM Part 3 : "ṟ" U1E5F # LATIN SMALL LETTER R WITH LINE BELOW : "Ṡ" U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE : "Ṡ" U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE + : "Ṡ" U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE : "ṡ" U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE : "ṡ" U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE + : "ṡ" U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE : "Ṣ" U1E62 # LATIN CAPITAL LETTER S WITH DOT BELOW : "Ṣ" U1E62 # LATIN CAPITAL LETTER S WITH DOT BELOW : "ṣ" U1E63 # LATIN SMALL LETTER S WITH DOT BELOW @@ -2012,8 +2370,10 @@ XCOMM Part 3 : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE : "Ṫ" U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE : "Ṫ" U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE + : "Ṫ" U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE : "ṫ" U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE : "ṫ" U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE + : "ṫ" U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE : "Ṭ" U1E6C # LATIN CAPITAL LETTER T WITH DOT BELOW : "Ṭ" U1E6C # LATIN CAPITAL LETTER T WITH DOT BELOW : "ṭ" U1E6D # LATIN SMALL LETTER T WITH DOT BELOW diff --git a/libX11/src/Xrm.c b/libX11/src/Xrm.c index 53467aedc..d6899d970 100644 --- a/libX11/src/Xrm.c +++ b/libX11/src/Xrm.c @@ -1091,7 +1091,7 @@ static void GetIncludeFile( static void GetDatabase( XrmDatabase db, - _Xconst register char *str, + _Xconst char *str, _Xconst char *filename, Bool doall) { diff --git a/libX11/src/locking.c b/libX11/src/locking.c index 008a14863..b3dfb3b01 100644 --- a/libX11/src/locking.c +++ b/libX11/src/locking.c @@ -1,623 +1,625 @@ -/* - -Copyright 1992, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - -*/ - -/* - * Author: Stephen Gildea, MIT X Consortium - * - * locking.c - multi-thread locking routines implemented in C Threads - */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include "Xlibint.h" -#undef _XLockMutex -#undef _XUnlockMutex -#undef _XCreateMutex -#undef _XFreeMutex - -#ifdef XTHREADS - -#ifdef __UNIXWARE__ -#include -#endif - -#include "Xprivate.h" -#include "locking.h" -#ifdef XTHREADS_WARN -#include /* for warn/debug stuff */ -#endif - -/* Additional arguments for source code location lock call was made from */ -#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) -# define XTHREADS_FILE_LINE_ARGS \ - , \ - char* file, /* source file, from macro */ \ - int line -#else -# define XTHREADS_FILE_LINE_ARGS /* None */ -#endif - - -#define NUM_FREE_CVLS 4 - -/* in lcWrap.c */ -extern LockInfoPtr _Xi18n_lock; - -#ifdef WIN32 -static DWORD _X_TlsIndex = (DWORD)-1; - -void _Xthread_init(void) -{ - if (_X_TlsIndex == (DWORD)-1) - _X_TlsIndex = TlsAlloc(); -} - -struct _xthread_waiter * -_Xthread_waiter(void) -{ - struct _xthread_waiter *me; - - if (!(me = TlsGetValue(_X_TlsIndex))) { - me = (struct _xthread_waiter *)xmalloc(sizeof(struct _xthread_waiter)); - me->sem = CreateSemaphore(NULL, 0, 1, NULL); - me->next = NULL; - TlsSetValue(_X_TlsIndex, me); - } - return me; -} -#endif /* WIN32 */ - -static xthread_t _Xthread_self(void) -{ - return xthread_self(); -} - -static LockInfoRec global_lock; -static LockInfoRec i18n_lock; - -static void _XLockMutex( - LockInfoPtr lip - XTHREADS_FILE_LINE_ARGS - ) -{ - xmutex_lock(lip->lock); -} - -static void _XUnlockMutex( - LockInfoPtr lip - XTHREADS_FILE_LINE_ARGS - ) -{ - xmutex_unlock(lip->lock); -} - -static void _XCreateMutex( - LockInfoPtr lip) -{ - lip->lock = xmutex_malloc(); - if (lip->lock) { - xmutex_init(lip->lock); - xmutex_set_name(lip->lock, "Xlib"); - } -} - -static void _XFreeMutex( - LockInfoPtr lip) -{ - xmutex_clear(lip->lock); - xmutex_free(lip->lock); -} - -#ifdef XTHREADS_WARN -static char *locking_file; -static int locking_line; -static xthread_t locking_thread; -static Bool xlibint_unlock = False; /* XlibInt.c may Unlock and re-Lock */ - -/* history that is useful to examine in a debugger */ -#define LOCK_HIST_SIZE 21 - -static struct { - Bool lockp; /* True for lock, False for unlock */ - xthread_t thread; - char *file; - int line; -} locking_history[LOCK_HIST_SIZE]; - -int lock_hist_loc = 0; /* next slot to fill */ - -static void _XLockDisplayWarn( - Display *dpy, - char *file, /* source file, from macro */ - int line) -{ - xthread_t self; - xthread_t old_locker; - - self = xthread_self(); - old_locker = locking_thread; - if (xthread_have_id(old_locker)) { - if (xthread_equal(old_locker, self)) - printf("Xlib ERROR: %s line %d thread %x: locking display already locked at %s line %d\n", - file, line, self, locking_file, locking_line); -#ifdef XTHREADS_DEBUG - else - printf("%s line %d: thread %x waiting on lock held by %s line %d thread %x\n", - file, line, self, - locking_file, locking_line, old_locker); -#endif /* XTHREADS_DEBUG */ - } - - xmutex_lock(dpy->lock->mutex); - - if (strcmp(file, "XlibInt.c") == 0) { - if (!xlibint_unlock) - printf("Xlib ERROR: XlibInt.c line %d thread %x locking display it did not unlock\n", - line, self); - xlibint_unlock = False; - } - -#ifdef XTHREADS_DEBUG - /* if (old_locker && old_locker != self) */ - if (strcmp("XClearArea.c", file) && strcmp("XDrSegs.c", file)) /* ico */ - printf("%s line %d: thread %x got display lock\n", file, line, self); -#endif /* XTHREADS_DEBUG */ - - locking_thread = self; - if (strcmp(file, "XlibInt.c") != 0) { - locking_file = file; - locking_line = line; - } - locking_history[lock_hist_loc].file = file; - locking_history[lock_hist_loc].line = line; - locking_history[lock_hist_loc].thread = self; - locking_history[lock_hist_loc].lockp = True; - lock_hist_loc++; - if (lock_hist_loc >= LOCK_HIST_SIZE) - lock_hist_loc = 0; -} -#endif /* XTHREADS_WARN */ - -static void _XUnlockDisplay( - Display *dpy - XTHREADS_FILE_LINE_ARGS - ) -{ -#ifdef XTHREADS_WARN - xthread_t self = xthread_self(); - -#ifdef XTHREADS_DEBUG - if (strcmp("XClearArea.c", file) && strcmp("XDrSegs.c", file)) /* ico */ - printf("%s line %d: thread %x unlocking display\n", file, line, self); -#endif /* XTHREADS_DEBUG */ - - if (!xthread_have_id(locking_thread)) - printf("Xlib ERROR: %s line %d thread %x: unlocking display that is not locked\n", - file, line, self); - else if (strcmp(file, "XlibInt.c") == 0) - xlibint_unlock = True; -#ifdef XTHREADS_DEBUG - else if (strcmp(file, locking_file) != 0) - /* not always an error because locking_file is not per-thread */ - printf("%s line %d: unlocking display locked from %s line %d (probably okay)\n", - file, line, locking_file, locking_line); -#endif /* XTHREADS_DEBUG */ - xthread_clear_id(locking_thread); - - locking_history[lock_hist_loc].file = file; - locking_history[lock_hist_loc].line = line; - locking_history[lock_hist_loc].thread = self; - locking_history[lock_hist_loc].lockp = False; - lock_hist_loc++; - if (lock_hist_loc >= LOCK_HIST_SIZE) - lock_hist_loc = 0; -#endif /* XTHREADS_WARN */ - xmutex_unlock(dpy->lock->mutex); -} - - -static struct _XCVList *_XCreateCVL( - Display *dpy) -{ - struct _XCVList *cvl; - - if ((cvl = dpy->lock->free_cvls) != NULL) { - dpy->lock->free_cvls = cvl->next; - dpy->lock->num_free_cvls--; - } else { - cvl = (struct _XCVList *)Xmalloc(sizeof(struct _XCVList)); - if (!cvl) - return NULL; - cvl->cv = xcondition_malloc(); - if (!cvl->cv) { - Xfree(cvl); - return NULL; - } - xcondition_init(cvl->cv); - xcondition_set_name(cvl->cv, "Xlib read queue"); - } - cvl->next = NULL; - return cvl; -} - -/* Put ourselves on the queue to read the connection. - Allocates and returns a queue element. */ - -static struct _XCVList * -_XPushReader( - Display *dpy, - struct _XCVList ***tail) -{ - struct _XCVList *cvl; - - cvl = _XCreateCVL(dpy); -#ifdef XTHREADS_DEBUG - printf("_XPushReader called in thread %x, pushing %x\n", - xthread_self(), cvl); -#endif - **tail = cvl; - *tail = &cvl->next; - return cvl; -} - -/* signal the next thread waiting to read the connection */ - -static void _XPopReader( - Display *dpy, - struct _XCVList **list, - struct _XCVList ***tail) -{ - register struct _XCVList *front = *list; - -#ifdef XTHREADS_DEBUG - printf("_XPopReader called in thread %x, popping %x\n", - xthread_self(), front); -#endif - - if (dpy->flags & XlibDisplayProcConni) - /* we never added ourself in the first place */ - return; - - if (front) { /* check "front" for paranoia */ - *list = front->next; - if (*tail == &front->next) /* did we free the last elt? */ - *tail = list; - if (dpy->lock->num_free_cvls < NUM_FREE_CVLS) { - front->next = dpy->lock->free_cvls; - dpy->lock->free_cvls = front; - dpy->lock->num_free_cvls++; - } else { - xcondition_clear(front->cv); - Xfree((char *)front->cv); - Xfree((char *)front); - } - } - - /* signal new front after it is in place */ - if ((dpy->lock->reply_first = (dpy->lock->reply_awaiters != NULL))) { - ConditionSignal(dpy, dpy->lock->reply_awaiters->cv); - } else if (dpy->lock->event_awaiters) { - ConditionSignal(dpy, dpy->lock->event_awaiters->cv); - } -} - -static void _XConditionWait( - xcondition_t cv, - xmutex_t mutex - XTHREADS_FILE_LINE_ARGS - ) -{ -#ifdef XTHREADS_WARN - xthread_t self = xthread_self(); - char *old_file = locking_file; - int old_line = locking_line; - -#ifdef XTHREADS_DEBUG - printf("line %d thread %x in condition wait\n", line, self); -#endif - xthread_clear_id(locking_thread); - - locking_history[lock_hist_loc].file = file; - locking_history[lock_hist_loc].line = line; - locking_history[lock_hist_loc].thread = self; - locking_history[lock_hist_loc].lockp = False; - lock_hist_loc++; - if (lock_hist_loc >= LOCK_HIST_SIZE) - lock_hist_loc = 0; -#endif /* XTHREADS_WARN */ - - xcondition_wait(cv, mutex); - -#ifdef XTHREADS_WARN - locking_thread = self; - locking_file = old_file; - locking_line = old_line; - - locking_history[lock_hist_loc].file = file; - locking_history[lock_hist_loc].line = line; - locking_history[lock_hist_loc].thread = self; - locking_history[lock_hist_loc].lockp = True; - lock_hist_loc++; - if (lock_hist_loc >= LOCK_HIST_SIZE) - lock_hist_loc = 0; -#ifdef XTHREADS_DEBUG - printf("line %d thread %x was signaled\n", line, self); -#endif /* XTHREADS_DEBUG */ -#endif /* XTHREADS_WARN */ -} - -static void _XConditionSignal( - xcondition_t cv - XTHREADS_FILE_LINE_ARGS - ) -{ -#ifdef XTHREADS_WARN -#ifdef XTHREADS_DEBUG - printf("line %d thread %x is signalling\n", line, xthread_self()); -#endif -#endif - xcondition_signal(cv); -} - - -static void _XConditionBroadcast( - xcondition_t cv - XTHREADS_FILE_LINE_ARGS - ) -{ -#ifdef XTHREADS_WARN -#ifdef XTHREADS_DEBUG - printf("line %d thread %x is broadcasting\n", line, xthread_self()); -#endif -#endif - xcondition_broadcast(cv); -} - - -static void _XFreeDisplayLock( - Display *dpy) -{ - struct _XCVList *cvl; - - if (dpy->lock != NULL) { - if (dpy->lock->mutex != NULL) { - xmutex_clear(dpy->lock->mutex); - xmutex_free(dpy->lock->mutex); - } - if (dpy->lock->cv != NULL) { - xcondition_clear(dpy->lock->cv); - xcondition_free(dpy->lock->cv); - } - if (dpy->lock->writers != NULL) { - xcondition_clear(dpy->lock->writers); - xcondition_free(dpy->lock->writers); - } - while ((cvl = dpy->lock->free_cvls)) { - dpy->lock->free_cvls = cvl->next; - xcondition_clear(cvl->cv); - Xfree((char *)cvl->cv); - Xfree((char *)cvl); - } - Xfree((char *)dpy->lock); - dpy->lock = NULL; - } - if (dpy->lock_fns != NULL) { - Xfree((char *)dpy->lock_fns); - dpy->lock_fns = NULL; - } -} - -/* - * wait for thread with user-level display lock to release it. - */ - -static void _XDisplayLockWait( - Display *dpy) -{ - xthread_t self; - - while (dpy->lock->locking_level > 0) { - self = xthread_self(); - if (xthread_equal(dpy->lock->locking_thread, self)) - break; - ConditionWait(dpy, dpy->lock->cv); - } -} - -static void _XLockDisplay( - Display *dpy - XTHREADS_FILE_LINE_ARGS - ) -{ -#ifdef XTHREADS_WARN - _XLockDisplayWarn(dpy, file, line); -#else - xmutex_lock(dpy->lock->mutex); -#endif - if (dpy->lock->locking_level > 0) - _XDisplayLockWait(dpy); - _XIDHandler(dpy); - _XSeqSyncFunction(dpy); -} - -/* - * _XReply is allowed to exit from select/poll and clean up even if a - * user-level lock is in force, so it uses this instead of _XFancyLockDisplay. - */ -static void _XInternalLockDisplay( - Display *dpy, - Bool wskip - XTHREADS_FILE_LINE_ARGS - ) -{ -#ifdef XTHREADS_WARN - _XLockDisplayWarn(dpy, file, line); -#else - xmutex_lock(dpy->lock->mutex); -#endif - if (!wskip && dpy->lock->locking_level > 0) - _XDisplayLockWait(dpy); -} - -static void _XUserLockDisplay( - register Display* dpy) -{ - if (++dpy->lock->locking_level == 1) { - dpy->lock->lock_wait = _XDisplayLockWait; - dpy->lock->locking_thread = xthread_self(); - } -} - -static -void _XUserUnlockDisplay( - register Display* dpy) -{ - if (dpy->lock->locking_level > 0 && --dpy->lock->locking_level == 0) { - /* signal other threads that might be waiting in XLockDisplay */ - ConditionBroadcast(dpy, dpy->lock->cv); - dpy->lock->lock_wait = NULL; - xthread_clear_id(dpy->lock->locking_thread); - } -} - -/* returns 0 if initialized ok, -1 if unable to allocate - a mutex or other memory */ - -static int _XInitDisplayLock( - Display *dpy) -{ - dpy->lock_fns = (struct _XLockPtrs*)Xmalloc(sizeof(struct _XLockPtrs)); - if (dpy->lock_fns == NULL) - return -1; - dpy->lock = (struct _XLockInfo *)Xmalloc(sizeof(struct _XLockInfo)); - if (dpy->lock == NULL) { - _XFreeDisplayLock(dpy); - return -1; - } - dpy->lock->cv = xcondition_malloc(); - dpy->lock->mutex = xmutex_malloc(); - dpy->lock->writers = xcondition_malloc(); - if (!dpy->lock->cv || !dpy->lock->mutex || !dpy->lock->writers) { - _XFreeDisplayLock(dpy); - return -1; - } - - dpy->lock->reply_bytes_left = 0; - dpy->lock->reply_was_read = False; - dpy->lock->reply_awaiters = NULL; - dpy->lock->reply_awaiters_tail = &dpy->lock->reply_awaiters; - dpy->lock->event_awaiters = NULL; - dpy->lock->event_awaiters_tail = &dpy->lock->event_awaiters; - dpy->lock->reply_first = False; - dpy->lock->locking_level = 0; - dpy->lock->num_free_cvls = 0; - dpy->lock->free_cvls = NULL; - xthread_clear_id(dpy->lock->locking_thread); - xthread_clear_id(dpy->lock->reading_thread); - xthread_clear_id(dpy->lock->conni_thread); - xmutex_init(dpy->lock->mutex); - xmutex_set_name(dpy->lock->mutex, "Xlib Display"); - xcondition_init(dpy->lock->cv); - xcondition_set_name(dpy->lock->cv, "XLockDisplay"); - xcondition_init(dpy->lock->writers); - xcondition_set_name(dpy->lock->writers, "Xlib wait for writable"); - dpy->lock_fns->lock_display = _XLockDisplay; - dpy->lock->internal_lock_display = _XInternalLockDisplay; - dpy->lock_fns->unlock_display = _XUnlockDisplay; - dpy->lock->user_lock_display = _XUserLockDisplay; - dpy->lock->user_unlock_display = _XUserUnlockDisplay; - dpy->lock->pop_reader = _XPopReader; - dpy->lock->push_reader = _XPushReader; - dpy->lock->condition_wait = _XConditionWait; - dpy->lock->condition_signal = _XConditionSignal; - dpy->lock->condition_broadcast = _XConditionBroadcast; - dpy->lock->create_cvl = _XCreateCVL; - dpy->lock->lock_wait = NULL; /* filled in by XLockDisplay() */ - - return 0; -} - -#ifdef __UNIXWARE__ -xthread_t __x11_thr_self() { return 0; } -xthread_t (*_x11_thr_self)() = __x11_thr_self; -#endif - - -Status XInitThreads(void) -{ - if (_Xglobal_lock) - return 1; -#ifdef __UNIXWARE__ - else { - void *dl_handle = dlopen(NULL, RTLD_LAZY); - if (!dl_handle || - ((_x11_thr_self = (xthread_t(*)())dlsym(dl_handle,"thr_self")) == 0)) { - _x11_thr_self = __x11_thr_self; - (void) fprintf (stderr, - "XInitThreads called, but no libthread in the calling program!\n" ); - } - } -#endif /* __UNIXWARE__ */ -#ifdef xthread_init - xthread_init(); /* return value? */ -#endif - if (!(global_lock.lock = xmutex_malloc())) - return 0; - if (!(i18n_lock.lock = xmutex_malloc())) { - xmutex_free(global_lock.lock); - global_lock.lock = NULL; - return 0; - } - _Xglobal_lock = &global_lock; - xmutex_init(_Xglobal_lock->lock); - xmutex_set_name(_Xglobal_lock->lock, "Xlib global"); - _Xi18n_lock = &i18n_lock; - xmutex_init(_Xi18n_lock->lock); - xmutex_set_name(_Xi18n_lock->lock, "Xlib i18n"); - _XLockMutex_fn = _XLockMutex; - _XUnlockMutex_fn = _XUnlockMutex; - _XCreateMutex_fn = _XCreateMutex; - _XFreeMutex_fn = _XFreeMutex; - _XInitDisplayLock_fn = _XInitDisplayLock; - _XFreeDisplayLock_fn = _XFreeDisplayLock; - _Xthread_self_fn = _Xthread_self; - -#ifdef XTHREADS_WARN -#ifdef XTHREADS_DEBUG - setlinebuf(stdout); /* for debugging messages */ -#endif -#endif - - return 1; -} - -#else /* XTHREADS */ -Status XInitThreads(void) -{ - return 0; -} -#endif /* XTHREADS */ +/* + +Copyright 1992, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ + +/* + * Author: Stephen Gildea, MIT X Consortium + * + * locking.c - multi-thread locking routines implemented in C Threads + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include "Xlibint.h" +#undef _XLockMutex +#undef _XUnlockMutex +#undef _XCreateMutex +#undef _XFreeMutex + +#ifdef XTHREADS + +#ifdef __UNIXWARE__ +#include +#endif + +#include "Xprivate.h" +#include "locking.h" +#ifdef XTHREADS_WARN +#include /* for warn/debug stuff */ +#endif + +/* Additional arguments for source code location lock call was made from */ +#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) +# define XTHREADS_FILE_LINE_ARGS \ + , \ + char* file, /* source file, from macro */ \ + int line +#else +# define XTHREADS_FILE_LINE_ARGS /* None */ +#endif + + +#define NUM_FREE_CVLS 4 + +/* in lcWrap.c */ +extern LockInfoPtr _Xi18n_lock; + +#ifdef WIN32 +static DWORD _X_TlsIndex = (DWORD)-1; + +void _Xthread_init(void) +{ + if (_X_TlsIndex == (DWORD)-1) + _X_TlsIndex = TlsAlloc(); +} + +struct _xthread_waiter * +_Xthread_waiter(void) +{ + struct _xthread_waiter *me; + + if (!(me = TlsGetValue(_X_TlsIndex))) { + me = (struct _xthread_waiter *)xmalloc(sizeof(struct _xthread_waiter)); + me->sem = CreateSemaphore(NULL, 0, 1, NULL); + me->next = NULL; + TlsSetValue(_X_TlsIndex, me); + } + return me; +} +#endif /* WIN32 */ + +static xthread_t _Xthread_self(void) +{ + return xthread_self(); +} + +static LockInfoRec global_lock; +static LockInfoRec i18n_lock; + +static void _XLockMutex( + LockInfoPtr lip + XTHREADS_FILE_LINE_ARGS + ) +{ + xmutex_lock(lip->lock); +} + +static void _XUnlockMutex( + LockInfoPtr lip + XTHREADS_FILE_LINE_ARGS + ) +{ + xmutex_unlock(lip->lock); +} + +static void _XCreateMutex( + LockInfoPtr lip) +{ + lip->lock = xmutex_malloc(); + if (lip->lock) { + xmutex_init(lip->lock); + xmutex_set_name(lip->lock, "Xlib"); + } +} + +static void _XFreeMutex( + LockInfoPtr lip) +{ + xmutex_clear(lip->lock); + xmutex_free(lip->lock); +} + +#ifdef XTHREADS_WARN +static char *locking_file; +static int locking_line; +static xthread_t locking_thread; +static Bool xlibint_unlock = False; /* XlibInt.c may Unlock and re-Lock */ + +/* history that is useful to examine in a debugger */ +#define LOCK_HIST_SIZE 21 + +static struct { + Bool lockp; /* True for lock, False for unlock */ + xthread_t thread; + char *file; + int line; +} locking_history[LOCK_HIST_SIZE]; + +int lock_hist_loc = 0; /* next slot to fill */ + +static void _XLockDisplayWarn( + Display *dpy, + char *file, /* source file, from macro */ + int line) +{ + xthread_t self; + xthread_t old_locker; + + self = xthread_self(); + old_locker = locking_thread; + if (xthread_have_id(old_locker)) { + if (xthread_equal(old_locker, self)) + printf("Xlib ERROR: %s line %d thread %x: locking display already locked at %s line %d\n", + file, line, self, locking_file, locking_line); +#ifdef XTHREADS_DEBUG + else + printf("%s line %d: thread %x waiting on lock held by %s line %d thread %x\n", + file, line, self, + locking_file, locking_line, old_locker); +#endif /* XTHREADS_DEBUG */ + } + + xmutex_lock(dpy->lock->mutex); + + if (strcmp(file, "XlibInt.c") == 0) { + if (!xlibint_unlock) + printf("Xlib ERROR: XlibInt.c line %d thread %x locking display it did not unlock\n", + line, self); + xlibint_unlock = False; + } + +#ifdef XTHREADS_DEBUG + /* if (old_locker && old_locker != self) */ + if (strcmp("XClearArea.c", file) && strcmp("XDrSegs.c", file)) /* ico */ + printf("%s line %d: thread %x got display lock\n", file, line, self); +#endif /* XTHREADS_DEBUG */ + + locking_thread = self; + if (strcmp(file, "XlibInt.c") != 0) { + locking_file = file; + locking_line = line; + } + locking_history[lock_hist_loc].file = file; + locking_history[lock_hist_loc].line = line; + locking_history[lock_hist_loc].thread = self; + locking_history[lock_hist_loc].lockp = True; + lock_hist_loc++; + if (lock_hist_loc >= LOCK_HIST_SIZE) + lock_hist_loc = 0; +} +#endif /* XTHREADS_WARN */ + +static void _XUnlockDisplay( + Display *dpy + XTHREADS_FILE_LINE_ARGS + ) +{ +#ifdef XTHREADS_WARN + xthread_t self = xthread_self(); + +#ifdef XTHREADS_DEBUG + if (strcmp("XClearArea.c", file) && strcmp("XDrSegs.c", file)) /* ico */ + printf("%s line %d: thread %x unlocking display\n", file, line, self); +#endif /* XTHREADS_DEBUG */ + + if (!xthread_have_id(locking_thread)) + printf("Xlib ERROR: %s line %d thread %x: unlocking display that is not locked\n", + file, line, self); + else if (strcmp(file, "XlibInt.c") == 0) + xlibint_unlock = True; +#ifdef XTHREADS_DEBUG + else if (strcmp(file, locking_file) != 0) + /* not always an error because locking_file is not per-thread */ + printf("%s line %d: unlocking display locked from %s line %d (probably okay)\n", + file, line, locking_file, locking_line); +#endif /* XTHREADS_DEBUG */ + xthread_clear_id(locking_thread); + + locking_history[lock_hist_loc].file = file; + locking_history[lock_hist_loc].line = line; + locking_history[lock_hist_loc].thread = self; + locking_history[lock_hist_loc].lockp = False; + lock_hist_loc++; + if (lock_hist_loc >= LOCK_HIST_SIZE) + lock_hist_loc = 0; +#endif /* XTHREADS_WARN */ + xmutex_unlock(dpy->lock->mutex); +} + + +static struct _XCVList *_XCreateCVL( + Display *dpy) +{ + struct _XCVList *cvl; + + if ((cvl = dpy->lock->free_cvls) != NULL) { + dpy->lock->free_cvls = cvl->next; + dpy->lock->num_free_cvls--; + } else { + cvl = (struct _XCVList *)Xmalloc(sizeof(struct _XCVList)); + if (!cvl) + return NULL; + cvl->cv = xcondition_malloc(); + if (!cvl->cv) { + Xfree(cvl); + return NULL; + } + xcondition_init(cvl->cv); + xcondition_set_name(cvl->cv, "Xlib read queue"); + } + cvl->next = NULL; + return cvl; +} + +/* Put ourselves on the queue to read the connection. + Allocates and returns a queue element. */ + +static struct _XCVList * +_XPushReader( + Display *dpy, + struct _XCVList ***tail) +{ + struct _XCVList *cvl; + + cvl = _XCreateCVL(dpy); +#ifdef XTHREADS_DEBUG + printf("_XPushReader called in thread %x, pushing %x\n", + xthread_self(), cvl); +#endif + **tail = cvl; + *tail = &cvl->next; + return cvl; +} + +/* signal the next thread waiting to read the connection */ + +static void _XPopReader( + Display *dpy, + struct _XCVList **list, + struct _XCVList ***tail) +{ + register struct _XCVList *front = *list; + +#ifdef XTHREADS_DEBUG + printf("_XPopReader called in thread %x, popping %x\n", + xthread_self(), front); +#endif + + if (dpy->flags & XlibDisplayProcConni) + /* we never added ourself in the first place */ + return; + + if (front) { /* check "front" for paranoia */ + *list = front->next; + if (*tail == &front->next) /* did we free the last elt? */ + *tail = list; + if (dpy->lock->num_free_cvls < NUM_FREE_CVLS) { + front->next = dpy->lock->free_cvls; + dpy->lock->free_cvls = front; + dpy->lock->num_free_cvls++; + } else { + xcondition_clear(front->cv); + Xfree((char *)front->cv); + Xfree((char *)front); + } + } + + /* signal new front after it is in place */ + if ((dpy->lock->reply_first = (dpy->lock->reply_awaiters != NULL))) { + ConditionSignal(dpy, dpy->lock->reply_awaiters->cv); + } else if (dpy->lock->event_awaiters) { + ConditionSignal(dpy, dpy->lock->event_awaiters->cv); + } +} + +static void _XConditionWait( + xcondition_t cv, + xmutex_t mutex + XTHREADS_FILE_LINE_ARGS + ) +{ +#ifdef XTHREADS_WARN + xthread_t self = xthread_self(); + char *old_file = locking_file; + int old_line = locking_line; + +#ifdef XTHREADS_DEBUG + printf("line %d thread %x in condition wait\n", line, self); +#endif + xthread_clear_id(locking_thread); + + locking_history[lock_hist_loc].file = file; + locking_history[lock_hist_loc].line = line; + locking_history[lock_hist_loc].thread = self; + locking_history[lock_hist_loc].lockp = False; + lock_hist_loc++; + if (lock_hist_loc >= LOCK_HIST_SIZE) + lock_hist_loc = 0; +#endif /* XTHREADS_WARN */ + + xcondition_wait(cv, mutex); + +#ifdef XTHREADS_WARN + locking_thread = self; + locking_file = old_file; + locking_line = old_line; + + locking_history[lock_hist_loc].file = file; + locking_history[lock_hist_loc].line = line; + locking_history[lock_hist_loc].thread = self; + locking_history[lock_hist_loc].lockp = True; + lock_hist_loc++; + if (lock_hist_loc >= LOCK_HIST_SIZE) + lock_hist_loc = 0; +#ifdef XTHREADS_DEBUG + printf("line %d thread %x was signaled\n", line, self); +#endif /* XTHREADS_DEBUG */ +#endif /* XTHREADS_WARN */ +} + +static void _XConditionSignal( + xcondition_t cv + XTHREADS_FILE_LINE_ARGS + ) +{ +#ifdef XTHREADS_WARN +#ifdef XTHREADS_DEBUG + printf("line %d thread %x is signalling\n", line, xthread_self()); +#endif +#endif + xcondition_signal(cv); +} + + +static void _XConditionBroadcast( + xcondition_t cv + XTHREADS_FILE_LINE_ARGS + ) +{ +#ifdef XTHREADS_WARN +#ifdef XTHREADS_DEBUG + printf("line %d thread %x is broadcasting\n", line, xthread_self()); +#endif +#endif + xcondition_broadcast(cv); +} + + +static void _XFreeDisplayLock( + Display *dpy) +{ + struct _XCVList *cvl; + + if (dpy->lock != NULL) { + if (dpy->lock->mutex != NULL) { + xmutex_clear(dpy->lock->mutex); + xmutex_free(dpy->lock->mutex); + } + if (dpy->lock->cv != NULL) { + xcondition_clear(dpy->lock->cv); + xcondition_free(dpy->lock->cv); + } + if (dpy->lock->writers != NULL) { + xcondition_clear(dpy->lock->writers); + xcondition_free(dpy->lock->writers); + } + while ((cvl = dpy->lock->free_cvls)) { + dpy->lock->free_cvls = cvl->next; + xcondition_clear(cvl->cv); + Xfree((char *)cvl->cv); + Xfree((char *)cvl); + } + Xfree((char *)dpy->lock); + dpy->lock = NULL; + } + if (dpy->lock_fns != NULL) { + Xfree((char *)dpy->lock_fns); + dpy->lock_fns = NULL; + } +} + +/* + * wait for thread with user-level display lock to release it. + */ + +static void _XDisplayLockWait( + Display *dpy) +{ + xthread_t self; + + while (dpy->lock->locking_level > 0) { + self = xthread_self(); + if (xthread_equal(dpy->lock->locking_thread, self)) + break; + ConditionWait(dpy, dpy->lock->cv); + } +} + +static void _XLockDisplay( + Display *dpy + XTHREADS_FILE_LINE_ARGS + ) +{ +#ifdef XTHREADS_WARN + _XLockDisplayWarn(dpy, file, line); +#else + xmutex_lock(dpy->lock->mutex); +#endif + if (dpy->lock->locking_level > 0) + _XDisplayLockWait(dpy); + _XIDHandler(dpy); + _XSeqSyncFunction(dpy); +} + +/* + * _XReply is allowed to exit from select/poll and clean up even if a + * user-level lock is in force, so it uses this instead of _XFancyLockDisplay. + */ +static void _XInternalLockDisplay( + Display *dpy, + Bool wskip + XTHREADS_FILE_LINE_ARGS + ) +{ +#ifdef XTHREADS_WARN + _XLockDisplayWarn(dpy, file, line); +#else + xmutex_lock(dpy->lock->mutex); +#endif + if (!wskip && dpy->lock->locking_level > 0) + _XDisplayLockWait(dpy); +} + +static void _XUserLockDisplay( + register Display* dpy) +{ + _XDisplayLockWait(dpy); + + if (++dpy->lock->locking_level == 1) { + dpy->lock->lock_wait = _XDisplayLockWait; + dpy->lock->locking_thread = xthread_self(); + } +} + +static +void _XUserUnlockDisplay( + register Display* dpy) +{ + if (dpy->lock->locking_level > 0 && --dpy->lock->locking_level == 0) { + /* signal other threads that might be waiting in XLockDisplay */ + ConditionBroadcast(dpy, dpy->lock->cv); + dpy->lock->lock_wait = NULL; + xthread_clear_id(dpy->lock->locking_thread); + } +} + +/* returns 0 if initialized ok, -1 if unable to allocate + a mutex or other memory */ + +static int _XInitDisplayLock( + Display *dpy) +{ + dpy->lock_fns = (struct _XLockPtrs*)Xmalloc(sizeof(struct _XLockPtrs)); + if (dpy->lock_fns == NULL) + return -1; + dpy->lock = (struct _XLockInfo *)Xmalloc(sizeof(struct _XLockInfo)); + if (dpy->lock == NULL) { + _XFreeDisplayLock(dpy); + return -1; + } + dpy->lock->cv = xcondition_malloc(); + dpy->lock->mutex = xmutex_malloc(); + dpy->lock->writers = xcondition_malloc(); + if (!dpy->lock->cv || !dpy->lock->mutex || !dpy->lock->writers) { + _XFreeDisplayLock(dpy); + return -1; + } + + dpy->lock->reply_bytes_left = 0; + dpy->lock->reply_was_read = False; + dpy->lock->reply_awaiters = NULL; + dpy->lock->reply_awaiters_tail = &dpy->lock->reply_awaiters; + dpy->lock->event_awaiters = NULL; + dpy->lock->event_awaiters_tail = &dpy->lock->event_awaiters; + dpy->lock->reply_first = False; + dpy->lock->locking_level = 0; + dpy->lock->num_free_cvls = 0; + dpy->lock->free_cvls = NULL; + xthread_clear_id(dpy->lock->locking_thread); + xthread_clear_id(dpy->lock->reading_thread); + xthread_clear_id(dpy->lock->conni_thread); + xmutex_init(dpy->lock->mutex); + xmutex_set_name(dpy->lock->mutex, "Xlib Display"); + xcondition_init(dpy->lock->cv); + xcondition_set_name(dpy->lock->cv, "XLockDisplay"); + xcondition_init(dpy->lock->writers); + xcondition_set_name(dpy->lock->writers, "Xlib wait for writable"); + dpy->lock_fns->lock_display = _XLockDisplay; + dpy->lock->internal_lock_display = _XInternalLockDisplay; + dpy->lock_fns->unlock_display = _XUnlockDisplay; + dpy->lock->user_lock_display = _XUserLockDisplay; + dpy->lock->user_unlock_display = _XUserUnlockDisplay; + dpy->lock->pop_reader = _XPopReader; + dpy->lock->push_reader = _XPushReader; + dpy->lock->condition_wait = _XConditionWait; + dpy->lock->condition_signal = _XConditionSignal; + dpy->lock->condition_broadcast = _XConditionBroadcast; + dpy->lock->create_cvl = _XCreateCVL; + dpy->lock->lock_wait = NULL; /* filled in by XLockDisplay() */ + + return 0; +} + +#ifdef __UNIXWARE__ +xthread_t __x11_thr_self() { return 0; } +xthread_t (*_x11_thr_self)() = __x11_thr_self; +#endif + + +Status XInitThreads(void) +{ + if (_Xglobal_lock) + return 1; +#ifdef __UNIXWARE__ + else { + void *dl_handle = dlopen(NULL, RTLD_LAZY); + if (!dl_handle || + ((_x11_thr_self = (xthread_t(*)())dlsym(dl_handle,"thr_self")) == 0)) { + _x11_thr_self = __x11_thr_self; + (void) fprintf (stderr, + "XInitThreads called, but no libthread in the calling program!\n" ); + } + } +#endif /* __UNIXWARE__ */ +#ifdef xthread_init + xthread_init(); /* return value? */ +#endif + if (!(global_lock.lock = xmutex_malloc())) + return 0; + if (!(i18n_lock.lock = xmutex_malloc())) { + xmutex_free(global_lock.lock); + global_lock.lock = NULL; + return 0; + } + _Xglobal_lock = &global_lock; + xmutex_init(_Xglobal_lock->lock); + xmutex_set_name(_Xglobal_lock->lock, "Xlib global"); + _Xi18n_lock = &i18n_lock; + xmutex_init(_Xi18n_lock->lock); + xmutex_set_name(_Xi18n_lock->lock, "Xlib i18n"); + _XLockMutex_fn = _XLockMutex; + _XUnlockMutex_fn = _XUnlockMutex; + _XCreateMutex_fn = _XCreateMutex; + _XFreeMutex_fn = _XFreeMutex; + _XInitDisplayLock_fn = _XInitDisplayLock; + _XFreeDisplayLock_fn = _XFreeDisplayLock; + _Xthread_self_fn = _Xthread_self; + +#ifdef XTHREADS_WARN +#ifdef XTHREADS_DEBUG + setlinebuf(stdout); /* for debugging messages */ +#endif +#endif + + return 1; +} + +#else /* XTHREADS */ +Status XInitThreads(void) +{ + return 0; +} +#endif /* XTHREADS */ -- cgit v1.2.3