diff options
Diffstat (limited to 'xrdp')
| -rw-r--r-- | xrdp/Makefile.am | 7 | ||||
| -rw-r--r-- | xrdp/xrdp.ini | 6 | ||||
| -rw-r--r-- | xrdp/xrdp_bitmap.c | 31 | ||||
| -rw-r--r-- | xrdp/xrdp_encoder.c | 30 | ||||
| -rw-r--r-- | xrdp/xrdp_keyboard.ini | 3 | ||||
| -rw-r--r-- | xrdp/xrdp_mm.c | 19 | ||||
| -rw-r--r-- | xrdp/xrdp_wm.c | 80 |
7 files changed, 129 insertions, 47 deletions
diff --git a/xrdp/Makefile.am b/xrdp/Makefile.am index 818a77a1..8e22d182 100644 --- a/xrdp/Makefile.am +++ b/xrdp/Makefile.am @@ -1,3 +1,8 @@ +EXTRA_DIST = \ + czech.txt \ + rdp-scan-codes.txt \ + xrdpwin.c + AM_CPPFLAGS = \ -DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \ -DXRDP_SBIN_PATH=\"${sbindir}\" \ @@ -19,7 +24,7 @@ endif if XRDP_RFXCODEC AM_CPPFLAGS += -DXRDP_RFXCODEC AM_CPPFLAGS += -I$(top_srcdir)/librfxcodec/include -XRDP_EXTRA_LIBS += $(top_srcdir)/librfxcodec/src/.libs/librfxencode.a +XRDP_EXTRA_LIBS += $(top_builddir)/librfxcodec/src/.libs/librfxencode.a endif if XRDP_PIXMAN diff --git a/xrdp/xrdp.ini b/xrdp/xrdp.ini index 1da90cca..242641ff 100644 --- a/xrdp/xrdp.ini +++ b/xrdp/xrdp.ini @@ -31,8 +31,10 @@ key_file= #tls_ciphers=HIGH ; Section name to use for automatic login if the client sends username -; and password -autorun=X11rdp +; and password. If empty, the domain name sent by the client is used. +; If empty and no domain name is given, the first suitable section in +; this file will be used. +autorun= allow_channels=true allow_multimon=true diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index 1c759c3e..deb56a2c 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -157,9 +157,9 @@ xrdp_bitmap_create_with_data(int width, int height, struct xrdp_wm *wm) { struct xrdp_bitmap *self = (struct xrdp_bitmap *)NULL; + int Bpp; #if defined(NEED_ALIGN) tintptr data_as_int; - int Bpp; #endif self = (struct xrdp_bitmap *)g_malloc(sizeof(struct xrdp_bitmap), 1); @@ -168,6 +168,22 @@ xrdp_bitmap_create_with_data(int width, int height, self->height = height; self->bpp = bpp; self->wm = wm; + + Bpp = 4; + switch (bpp) + { + case 8: + Bpp = 1; + break; + case 15: + Bpp = 2; + break; + case 16: + Bpp = 2; + break; + } + self->line_size = width * Bpp; + #if defined(NEED_ALIGN) data_as_int = (tintptr) data; if (((bpp >= 24) && (data_as_int & 3)) || @@ -175,19 +191,6 @@ xrdp_bitmap_create_with_data(int width, int height, { /* got to copy data here, it's not aligned other calls in this file assume alignment */ - Bpp = 4; - switch (bpp) - { - case 8: - Bpp = 1; - break; - case 15: - Bpp = 2; - break; - case 16: - Bpp = 2; - break; - } self->data = (char *)g_malloc(width * height * Bpp, 0); g_memcpy(self->data, data, width * height * Bpp); return self; diff --git a/xrdp/xrdp_encoder.c b/xrdp/xrdp_encoder.c index 643fe0aa..0af0b85e 100644 --- a/xrdp/xrdp_encoder.c +++ b/xrdp/xrdp_encoder.c @@ -42,8 +42,10 @@ /*****************************************************************************/ static int process_enc_jpg(struct xrdp_encoder *self, XRDP_ENC_DATA *enc); +#ifdef XRDP_RFXCODEC static int process_enc_rfx(struct xrdp_encoder *self, XRDP_ENC_DATA *enc); +#endif static int process_enc_h264(struct xrdp_encoder *self, XRDP_ENC_DATA *enc); @@ -58,11 +60,6 @@ xrdp_encoder_create(struct xrdp_mm *mm) client_info = mm->wm->client_info; - if (client_info->client_os_major != OSMAJORTYPE_UNIX) - { - /* temp workaround to avoid black screen in non-supported clients */ - return 0; - } if (client_info->mcs_connection_type != 6) /* LAN */ { return 0; @@ -87,6 +84,7 @@ xrdp_encoder_create(struct xrdp_mm *mm) (32 << 24) | (3 << 16) | (8 << 12) | (8 << 8) | (8 << 4) | 8; self->process_enc = process_enc_jpg; } +#ifdef XRDP_RFXCODEC else if (client_info->rfx_codec_id != 0) { LLOGLN(0, ("xrdp_encoder_create: starting rfx codec session")); @@ -94,13 +92,11 @@ xrdp_encoder_create(struct xrdp_mm *mm) self->in_codec_mode = 1; client_info->capture_code = 2; self->process_enc = process_enc_rfx; -#ifdef XRDP_RFXCODEC - self->codec_handle = - rfxcodec_encode_create(mm->wm->screen->width, - mm->wm->screen->height, - RFX_FORMAT_YUV, 0); -#endif + self->codec_handle = rfxcodec_encode_create(mm->wm->screen->width, + mm->wm->screen->height, + RFX_FORMAT_YUV, 0); } +#endif else if (client_info->h264_codec_id != 0) { LLOGLN(0, ("xrdp_encoder_create: starting h264 codec session")); @@ -296,7 +292,6 @@ process_enc_jpg(struct xrdp_encoder *self, XRDP_ENC_DATA *enc) } #ifdef XRDP_RFXCODEC - /*****************************************************************************/ /* called from encoder thread */ static int @@ -399,17 +394,6 @@ process_enc_rfx(struct xrdp_encoder *self, XRDP_ENC_DATA *enc) return 0; } - -#else - -/*****************************************************************************/ -/* called from encoder thread */ -static int -process_enc_rfx(struct xrdp_encoder *self, XRDP_ENC_DATA *enc) -{ - return 0; -} - #endif /*****************************************************************************/ diff --git a/xrdp/xrdp_keyboard.ini b/xrdp/xrdp_keyboard.ini index 914ca974..3ce7644a 100644 --- a/xrdp/xrdp_keyboard.ini +++ b/xrdp/xrdp_keyboard.ini @@ -62,6 +62,7 @@ rdp_layout_de=0x00000407 rdp_layout_fr=0x0000040C rdp_layout_it=0x00000410 rdp_layout_jp=0x00000411 +rdp_layout_kr=0x00000412 rdp_layout_ru=0x00000419 rdp_layout_se=0x0000041D rdp_layout_ch=0x00000807 @@ -76,6 +77,7 @@ rdp_layout_de=de rdp_layout_fr=fr rdp_layout_it=it rdp_layout_jp=jp +rdp_layout_kr=kr rdp_layout_ru=ru rdp_layout_se=se rdp_layout_ch=ch @@ -103,6 +105,7 @@ rdp_layout_us=us rdp_layout_de=de rdp_layout_fr=fr rdp_layout_jp=jp +rdp_layout_kr=kr rdp_layout_it=it rdp_layout_ru=ru rdp_layout_se=se diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c index 715a18fc..bb6bc5d8 100644 --- a/xrdp/xrdp_mm.c +++ b/xrdp/xrdp_mm.c @@ -229,14 +229,19 @@ xrdp_mm_send_login(struct xrdp_mm *self) out_uint16_be(s, self->wm->screen->width); out_uint16_be(s, self->wm->screen->height); - if (xserverbpp > 0) + /* select and send X server bpp */ + if (xserverbpp == 0) { - out_uint16_be(s, xserverbpp); - } - else - { - out_uint16_be(s, self->wm->screen->bpp); + if (self->code == 20) + { + xserverbpp = 24; /* xorgxrdp is always at 24 bpp */ + } + else + { + xserverbpp = self->wm->screen->bpp; /* use client's bpp */ + } } + out_uint16_be(s, xserverbpp); /* send domain */ if(self->wm->client_info->domain[0]!='_') @@ -2291,7 +2296,7 @@ xrdp_mm_frame_ack(struct xrdp_mm *self, int frame_id) { int ex; - LLOGLN(0, ("xrdp_mm_frame_ack:")); + LLOGLN(10, ("xrdp_mm_frame_ack:")); self->encoder->frame_id_client = frame_id; if (self->wm->client_info->use_frame_acks == 0) { diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index a8ae5033..065bca5c 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -1496,6 +1496,83 @@ xrdp_wm_key_sync(struct xrdp_wm *self, int device_flags, int key_flags) /*****************************************************************************/ int APP_CC +xrdp_wm_key_unicode(struct xrdp_wm *self, int device_flags, int unicode) +{ + int index; + + for (index = XR_MIN_KEY_CODE; index < XR_MAX_KEY_CODE; index++) + { + if (unicode == self->keymap.keys_noshift[index].chr) + { + xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE); + return 0; + } + } + + for (index = XR_MIN_KEY_CODE; index < XR_MAX_KEY_CODE; index++) + { + if (unicode == self->keymap.keys_shift[index].chr) + { + if (device_flags & KBD_FLAG_UP) + { + xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE); + xrdp_wm_key(self, KBD_FLAG_UP, XR_RDP_SCAN_LSHIFT); + } + else + { + xrdp_wm_key(self, KBD_FLAG_DOWN, XR_RDP_SCAN_LSHIFT); + xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE); + } + return 0; + } + } + + for (index = XR_MIN_KEY_CODE; index < XR_MAX_KEY_CODE; index++) + { + if (unicode == self->keymap.keys_altgr[index].chr) + { + if (device_flags & KBD_FLAG_UP) + { + xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE); + xrdp_wm_key(self, KBD_FLAG_UP | KBD_FLAG_EXT, + XR_RDP_SCAN_ALT); + } + else + { + xrdp_wm_key(self, KBD_FLAG_DOWN | KBD_FLAG_EXT, + XR_RDP_SCAN_ALT); + xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE); + } + return 0; + } + } + + for (index = XR_MIN_KEY_CODE; index < XR_MAX_KEY_CODE; index++) + { + if (unicode == self->keymap.keys_shiftaltgr[index].chr) + { + if (device_flags & KBD_FLAG_UP) + { + xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE); + xrdp_wm_key(self, KBD_FLAG_UP | KBD_FLAG_EXT, XR_RDP_SCAN_ALT); + xrdp_wm_key(self, KBD_FLAG_UP, XR_RDP_SCAN_LSHIFT); + } + else + { + xrdp_wm_key(self, KBD_FLAG_DOWN, XR_RDP_SCAN_LSHIFT); + xrdp_wm_key(self, KBD_FLAG_DOWN | KBD_FLAG_EXT, + XR_RDP_SCAN_ALT); + xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE); + } + return 0; + } + } + + return 0; +} + +/*****************************************************************************/ +int APP_CC xrdp_wm_pu(struct xrdp_wm *self, struct xrdp_bitmap *control) { int x; @@ -1690,6 +1767,9 @@ callback(long id, int msg, long param1, long param2, long param3, long param4) case 4: /* RDP_INPUT_SCANCODE */ rv = xrdp_wm_key(wm, param3, param1); break; + case 5: /* RDP_INPUT_UNICODE */ + rv = xrdp_wm_key_unicode(wm, param3, param1); + break; case 0x8001: /* RDP_INPUT_MOUSE */ rv = xrdp_wm_process_input_mouse(wm, param3, param1, param2); break; |
