1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
--- a/nx-X11/programs/Xserver/hw/nxagent/Init.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Init.c
@@ -64,6 +64,9 @@
#include "NX.h"
#include "NXlib.h"
+/* by dimbor */
+#include <X11/Xlocale.h>
+
/*
* Set here the required log level.
*/
@@ -339,6 +342,20 @@
*/
blackRoot = TRUE;
+
+ /* by dimbor */
+ char *locale = setlocale(LC_ALL, "");
+ if (!locale)
+ fprintf(stderr, "InitOutput: failed to set locale, reverting to \"C\"\n");
+ else
+ {
+ if (!XSupportsLocale())
+ fprintf(stderr, "InitOutput: Locale %s not supported by X\n",locale);
+ else
+ fprintf(stderr, "InitOutput: Set %s locale\n",locale);
+ }
+ if (!XSetLocaleModifiers(""))
+ fprintf(stderr,"InitOutput: cannot set locale modifiers.\n");
}
void InitInput(argc, argv)
--- a/nx-X11/programs/Xserver/hw/nxagent/Rootless.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Rootless.c
@@ -32,6 +32,10 @@
#include "NXlib.h"
+/* by dimbor */
+#include "Xatom.h"
+#include <X11/Xlocale.h>
+
/*
* Set here the required log level.
*/
@@ -100,6 +104,10 @@
static void nxagentRemovePropertyFromList(void);
+/* by dimbor */
+static char szAgentUTF8_STRING[] = "UTF8_STRING";
+static Atom agentUTF8_STRING;
+
/*
* This is currently unused.
*/
@@ -419,6 +427,28 @@
}
}
+/* by dimbor */
+char *textToUTF8String(char *text, int nitems)
+{
+ XTextProperty t_prop;
+ char *ret=NULL;
+ t_prop.value=((unsigned char *)text);
+ t_prop.nitems=nitems;
+ if (!t_prop.nitems)
+ return ret;
+ t_prop.format=8;
+ t_prop.encoding=XInternAtom(nxagentDisplay, "COMPOUND_TEXT", 0);
+ char **list;
+ int num;
+ int r = XmbTextPropertyToTextList(nxagentDisplay, &t_prop,&list, &num);
+ if ((r == Success || r > 0) && num > 0 && *list)
+ {
+ ret=(char *)strdup (*list);
+ XFreeStringList(list);
+ }
+ return ret;
+}
+
int nxagentExportAllProperty(pWin)
WindowPtr pWin;
{
@@ -464,6 +494,7 @@
if (strncmp(propertyS, "WM_", 3) != 0 &&
strncmp(propertyS, "_NET_", 5) != 0 &&
+ strncmp(propertyS, "_MOTIF_", 7) != 0 &&
strcmp(propertyS, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR") != 0)
{
#ifdef TEST
@@ -474,6 +505,7 @@
#endif
}
else if (strcmp(typeS, "STRING") == 0 ||
+ strcmp(typeS, "_MOTIF_WM_HINTS") == 0 ||
#ifndef _XSERVER64
strcmp(typeS, "CARDINAL") == 0 ||
strcmp(typeS, "WM_SIZE_HINTS") == 0 ||
@@ -483,6 +515,15 @@
output = value;
export = True;
}
+ /* add by dimbor */
+ else if (strcmp(typeS, "COMPOUND_TEXT") == 0)
+ {
+ output = textToUTF8String(value, nUnits);
+ nUnits = strlen((char *) output);
+ type = MakeAtom(szAgentUTF8_STRING, strlen(szAgentUTF8_STRING), True);
+ freeMem = True;
+ export = True;
+ }
#ifdef _XSERVER64
else if (strcmp(typeS, "CARDINAL") == 0 || strcmp(typeS, "WM_SIZE_HINTS") == 0)
{
|