summaryrefslogtreecommitdiffstats
path: root/xorg/X11R7.6/rdp
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2013-11-22 21:16:17 -0800
committerJay Sorg <jay.sorg@gmail.com>2013-11-22 21:16:17 -0800
commit6777c4e38e742f0f6162ed43762354b377f38fa4 (patch)
treec5d9d9fb667cf8b600ed25d65b267e2ec18f3ded /xorg/X11R7.6/rdp
parentb6f32897b0e6a7cb804a4306609589db306d1f5e (diff)
downloadxrdp-proprietary-6777c4e38e742f0f6162ed43762354b377f38fa4.tar.gz
xrdp-proprietary-6777c4e38e742f0f6162ed43762354b377f38fa4.zip
X11rdp: run setxkbmap when client connects
Diffstat (limited to 'xorg/X11R7.6/rdp')
-rw-r--r--xorg/X11R7.6/rdp/rdp.h2
-rw-r--r--xorg/X11R7.6/rdp/rdpinput.c165
-rw-r--r--xorg/X11R7.6/rdp/rdpmain.c2
-rw-r--r--xorg/X11R7.6/rdp/rdpup.c15
4 files changed, 170 insertions, 14 deletions
diff --git a/xorg/X11R7.6/rdp/rdp.h b/xorg/X11R7.6/rdp/rdp.h
index 32d05d6a..e493b281 100644
--- a/xorg/X11R7.6/rdp/rdp.h
+++ b/xorg/X11R7.6/rdp/rdp.h
@@ -505,6 +505,8 @@ void
KbdAddEvent(int down, int param1, int param2, int param3, int param4);
void
KbdSync(int param1);
+int
+rdpLoadLayout(int keylayout);
/* rdpup.c */
int
diff --git a/xorg/X11R7.6/rdp/rdpinput.c b/xorg/X11R7.6/rdp/rdpinput.c
index e6421d89..6f09ebe5 100644
--- a/xorg/X11R7.6/rdp/rdpinput.c
+++ b/xorg/X11R7.6/rdp/rdpinput.c
@@ -437,7 +437,8 @@ rdpChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
LLOGLN(10, ("rdpChangeKeyboardControl: autoRepeat on"));
/* schedual to turn off the autorepeat after 100 ms so any app
* polling it will be happy it's on */
- g_kbtimer = TimerSet(g_kbtimer, 0, 100, rdpInDeferredUpdateCallback, 0);\
+ g_kbtimer = TimerSet(g_kbtimer, 0, 100,
+ rdpInDeferredUpdateCallback, 0);
}
else
{
@@ -447,6 +448,153 @@ rdpChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
}
/******************************************************************************/
+/*
+0x00000401 Arabic (101)
+0x00000402 Bulgarian
+0x00000404 Chinese (Traditional) - US Keyboard
+0x00000405 Czech
+0x00000406 Danish
+0x00000407 German
+0x00000408 Greek
+0x00000409 US
+0x0000040A Spanish
+0x0000040B Finnish
+0x0000040C French
+0x0000040D Hebrew
+0x0000040E Hungarian
+0x0000040F Icelandic
+0x00000410 Italian
+0x00000411 Japanese
+0x00000412 Korean
+0x00000413 Dutch
+0x00000414 Norwegian
+0x00000415 Polish (Programmers)
+0x00000416 Portuguese (Brazilian ABNT)
+0x00000418 Romanian
+0x00000419 Russian
+0x0000041A Croatian
+0x0000041B Slovak
+0x0000041C Albanian
+0x0000041D Swedish
+0x0000041E Thai Kedmanee
+0x0000041F Turkish Q
+0x00000420 Urdu
+0x00000422 Ukrainian
+0x00000423 Belarusian
+0x00000424 Slovenian
+0x00000425 Estonian
+0x00000426 Latvian
+0x00000427 Lithuanian IBM
+0x00000429 Farsi
+0x0000042A Vietnamese
+0x0000042B Armenian Eastern
+0x0000042C Azeri Latin
+0x0000042F FYRO Macedonian
+0x00000437 Georgian
+0x00000438 Faeroese
+0x00000439 Devanagari - INSCRIPT
+0x0000043A Maltese 47-key
+0x0000043B Norwegian with Sami
+0x0000043F Kazakh
+0x00000440 Kyrgyz Cyrillic
+0x00000444 Tatar
+0x00000445 Bengali
+0x00000446 Punjabi
+0x00000447 Gujarati
+0x00000449 Tamil
+0x0000044A Telugu
+0x0000044B Kannada
+0x0000044C Malayalam
+0x0000044E Marathi
+0x00000450 Mongolian Cyrillic
+0x00000452 United Kingdom Extended
+0x0000045A Syriac
+0x00000461 Nepali
+0x00000463 Pashto
+0x00000465 Divehi Phonetic
+0x0000046E Luxembourgish
+0x00000481 Maori
+0x00000804 Chinese (Simplified) - US Keyboard
+0x00000807 Swiss German
+0x00000809 United Kingdom
+0x0000080A Latin American
+0x0000080C Belgian French
+0x00000813 Belgian (Period)
+0x00000816 Portuguese
+0x0000081A Serbian (Latin)
+0x0000082C Azeri Cyrillic
+0x0000083B Swedish with Sami
+0x00000843 Uzbek Cyrillic
+0x0000085D Inuktitut Latin
+0x00000C0C Canadian French (legacy)
+0x00000C1A Serbian (Cyrillic)
+0x00001009 Canadian French
+0x0000100C Swiss French
+0x0000141A Bosnian
+0x00001809 Irish
+0x0000201A Bosnian Cyrillic
+*/
+int
+rdpLoadLayout(int keylayout)
+{
+ char a1[16];
+ char a2[16];
+ char a3[16];
+ char a4[16];
+ char a5[16];
+ char a6[16];
+ char a7[16];
+ char a8[16];
+ int pid;
+
+ LLOGLN(10, ("rdpLoadLayout: keylayout 0x%8.8x display %s",
+ keylayout, display));
+ snprintf(a1, 15, "setxkbmap");
+ snprintf(a2, 15, "setxkbmap");
+ snprintf(a3, 15, "-layout");
+ snprintf(a4, 15, "us");
+ snprintf(a5, 15, "-display");
+ snprintf(a6, 15, ":%s", display);
+ snprintf(a7, 15, "-model");
+ snprintf(a8, 15, "pc104");
+ switch (keylayout)
+ {
+ case 0x00000407: /* German */
+ snprintf(a4, 15, "%s", "de");
+ break;
+ case 0x00000409: /* US */
+ snprintf(a4, 15, "%s", "us");
+ break;
+ case 0x0000040C: /* French */
+ snprintf(a4, 15, "%s", "fr");
+ break;
+ case 0x00000410: /* Italian */
+ snprintf(a4, 15, "%s", "it");
+ break;
+ case 0x00000416: /* Portuguese (Brazilian ABNT) */
+ snprintf(a4, 15, "%s", "br");
+ snprintf(a8, 15, "%s", "abnt2");
+ break;
+ case 0x00000419: /* Russian */
+ snprintf(a4, 15, "%s", "ru");
+ break;
+ case 0x0000041D: /* Swedish */
+ snprintf(a4, 15, "%s", "se");
+ break;
+ default:
+ LLOGLN(0, ("rdpLoadLayout: unknown keylayout 0x%8.8x", keylayout));
+ return 1;
+ }
+ pid = fork();
+ if (pid == 0)
+ {
+ execlp(a1, a2, a3, a4, a5, a6, a7, a8, (void *)0);
+ exit(0);
+ }
+ return 0;
+}
+
+/******************************************************************************/
int
rdpKeybdProc(DeviceIntPtr pDevice, int onoff)
{
@@ -454,6 +602,7 @@ rdpKeybdProc(DeviceIntPtr pDevice, int onoff)
CARD8 modMap[MAP_LENGTH];
DevicePtr pDev;
XkbRMLVOSet set;
+ int ok;
LLOGLN(10, ("rdpKeybdProc:"));
pDev = (DevicePtr)pDevice;
@@ -461,6 +610,7 @@ rdpKeybdProc(DeviceIntPtr pDevice, int onoff)
switch (onoff)
{
case DEVICE_INIT:
+ LLOGLN(10, ("rdpKeybdProc: DEVICE_INIT"));
KbdDeviceInit(pDevice, &keySyms, modMap);
memset(&set, 0, sizeof(set));
set.rules = "evdev"; /* was "base" */
@@ -468,28 +618,29 @@ rdpKeybdProc(DeviceIntPtr pDevice, int onoff)
set.layout = "us";
set.variant = "";
set.options = "";
- InitKeyboardDeviceStruct(pDevice, &set, rdpBell,
- rdpChangeKeyboardControl);
- //XkbDDXChangeControls(pDevice, 0, 0);
+ ok = InitKeyboardDeviceStruct(pDevice, &set, rdpBell,
+ rdpChangeKeyboardControl);
+ LLOGLN(10, ("rdpKeybdProc: InitKeyboardDeviceStruct %d", ok));
+ //kbDDXChangeControls(pDevice, 0, 0);
break;
case DEVICE_ON:
+ LLOGLN(10, ("rdpKeybdProc: DEVICE_ON"));
pDev->on = 1;
KbdDeviceOn();
break;
case DEVICE_OFF:
+ LLOGLN(10, ("rdpKeybdProc: DEVICE_OFF"));
pDev->on = 0;
KbdDeviceOff();
break;
case DEVICE_CLOSE:
-
+ LLOGLN(10, ("rdpKeybdProc: DEVICE_CLOSE"));
if (pDev->on)
{
KbdDeviceOff();
}
-
break;
}
-
return Success;
}
diff --git a/xorg/X11R7.6/rdp/rdpmain.c b/xorg/X11R7.6/rdp/rdpmain.c
index 1b924db7..ba23ae6a 100644
--- a/xorg/X11R7.6/rdp/rdpmain.c
+++ b/xorg/X11R7.6/rdp/rdpmain.c
@@ -540,7 +540,7 @@ rdpScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
}
rdpGlyphInit();
-
+
//rdpXvInit(pScreen);
ErrorF("rdpScreenInit: ret %d\n", ret);
diff --git a/xorg/X11R7.6/rdp/rdpup.c b/xorg/X11R7.6/rdp/rdpup.c
index 52472121..83525251 100644
--- a/xorg/X11R7.6/rdp/rdpup.c
+++ b/xorg/X11R7.6/rdp/rdpup.c
@@ -538,7 +538,7 @@ static int
rdpup_send_pending(void)
{
int rv;
-
+
rv = 0;
if (g_connected && g_begin)
{
@@ -1116,6 +1116,9 @@ rdpup_process_msg(struct stream *s)
LLOGLN(0, (" client can not do multimon"));
g_do_multimon = 0;
}
+
+ rdpLoadLayout(g_rdpScreen.client_info.keylayout);
+
}
else if (msg_type == 105)
{
@@ -1431,7 +1434,7 @@ int
rdpup_pre_check(int in_size)
{
int rv;
-
+
rv = 0;
if (!g_begin)
{
@@ -2226,7 +2229,7 @@ rdpup_send_alpha_area(struct image_data* id, int x, int y, int w, int h)
int lw;
int size;
struct image_data lid;
-
+
LLOGLN(10, ("rdpup_send_alpha_area: id %p x %d y %d w %d h %d",
id, x, y, w, h));
if (id == 0)
@@ -2234,7 +2237,7 @@ rdpup_send_alpha_area(struct image_data* id, int x, int y, int w, int h)
rdpup_get_screen_image_rect(&lid);
id = &lid;
}
-
+
if (x >= id->width)
{
return;
@@ -2480,7 +2483,7 @@ rdpup_show_window(WindowPtr pWindow, rdpWindowRec* priv, int showState)
if (g_connected)
{
int flags = WINDOW_ORDER_TYPE_WINDOW;
-
+
rdpup_pre_check(16);
out_uint16_le(g_out_s, 27);
out_uint16_le(g_out_s, 16);
@@ -2780,7 +2783,7 @@ int
rdpup_check_alpha_dirty(PixmapPtr pDirtyPixmap, rdpPixmapRec* pDirtyPriv)
{
struct image_data id;
-
+
LLOGLN(10, ("rdpup_check_alpha_dirty: width %d height %d",
pDirtyPixmap->drawable.width, pDirtyPixmap->drawable.height));
if (pDirtyPriv == 0)