summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@oracle.com>2012-07-15 02:01:41 -0700
committerAlan Coopersmith <alan.coopersmith@oracle.com>2012-10-02 22:16:08 -0700
commitd678ab80b2987ddd696519a27dad5571c379b511 (patch)
tree58edc1ba4455426cf4545bc838aadece8ca8cffd
parent95a96dbdc483d9dc6371f52a9e41771a64d23aed (diff)
downloadxscope-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.ac2
-rw-r--r--prtype.c19
-rw-r--r--scope.c24
-rw-r--r--scope.h3
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
diff --git a/prtype.c b/prtype.c
index 9117ae0..8a16bfb 100644
--- a/prtype.c
+++ b/prtype.c
@@ -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);
}
/* ************************************************************ */
diff --git a/scope.c b/scope.c
index c20deba..96f0464 100644
--- a/scope.c
+++ b/scope.c
@@ -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();
diff --git a/scope.h b/scope.h
index 2fb627d..8dc6b31 100644
--- a/scope.h
+++ b/scope.h
@@ -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"