diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2012-07-15 02:01:41 -0700 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2012-10-02 22:16:08 -0700 |
commit | d678ab80b2987ddd696519a27dad5571c379b511 (patch) | |
tree | 58edc1ba4455426cf4545bc838aadece8ca8cffd | |
parent | 95a96dbdc483d9dc6371f52a9e41771a64d23aed (diff) | |
download | xscope-d678ab80b2987ddd696519a27dad5571c379b511.tar.gz |
Print UTF8_STRING properties as text if locale uses UTF-8 charset
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Reviewed-by: Mark Kettenis <kettenis@openbsd.org>
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | prtype.c | 19 | ||||
-rw-r--r-- | scope.c | 24 | ||||
-rw-r--r-- | scope.h | 3 |
4 files changed, 42 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac index 74d0d53..dee7b66 100644 --- a/configure.ac +++ b/configure.ac @@ -70,7 +70,7 @@ fi PKG_CHECK_MODULES(XSCOPE, [xproto >= 7.0.17 $XTRANS_PKG]) AC_CHECK_FUNCS([getdtablesize]) -AC_CHECK_HEADERS([sys/filio.h]) +AC_CHECK_HEADERS([sys/filio.h langinfo.h]) dnl Allow checking code with lint, sparse, etc. XORG_WITH_LINT @@ -1054,9 +1054,22 @@ PrintPropertyValues(const unsigned char *buf, uint32_t type /* atom */, uint8_t unit, uint32_t num, const char *name) { if (type == 31 /* string */) - PrintString8(buf, num * unit, name); - else - PrintBytes(buf, num * unit, name); + return PrintString8(buf, num * unit, name); + else { + const char *typename = FindAtomName(type); + + if (typename) { + if (strcmp(typename, "UTF8_STRING") == 0) { + if (IsUTF8locale) + return PrintString8(buf, num * unit, name); + else + return PrintBytes(buf, num * unit, name); + } + } + } + + /* When all else fails, print raw bytes */ + return PrintBytes(buf, num * unit, name); } /* ************************************************************ */ @@ -68,6 +68,11 @@ #include <netdb.h> /* struct servent * and struct hostent * */ #include <errno.h> /* for EINTR, EADDRINUSE, ... */ +#include <locale.h> +#ifdef HAVE_LANGINFO_H +#include <langinfo.h> +#endif + /* ********************************************** */ /* */ @@ -86,7 +91,8 @@ static FD ConnectToClient(FD ConnectionSocket); static void DataFromClient(FD fd); static void SetUpStdin(void); -long TranslateText = 0; +char TranslateText = 0; +char IsUTF8locale = 0; char ScopeEnabled = 1; char HandleSIGUSR1 = 0; char DoAudio = 0; @@ -666,6 +672,21 @@ Usage(void) } static void +InitializeLocale(void) +{ + setlocale(LC_CTYPE, ""); + +#ifdef HAVE_LANGINFO_H + { + const char *charmap = nl_langinfo (CODESET); + + if (charmap != NULL && strcmp(charmap, "UTF-8") == 0) + IsUTF8locale = 1; + } +#endif +} + +static void ScanArgs(int argc, char **argv) { XVerbose = 1; /* default verbose-ness level */ @@ -795,6 +816,7 @@ ScanArgs(int argc, char **argv) int main(int argc, char **argv) { + InitializeLocale(); ScanArgs(argc, argv); InitializeFD(); InitializeX11(); @@ -121,7 +121,8 @@ extern char HandleSIGUSR1; extern char Leader[]; extern long ServerBasePort; extern char ScopeEnabled; -extern long TranslateText; +extern char TranslateText; +extern char IsUTF8locale; #include "proto.h" |