add -M for local mouse cursor

This commit is contained in:
Joshua Hudson 2017-10-25 19:22:35 -07:00 committed by Henrik Andersson
parent 5aa5a9dbfc
commit e7cda3dbf8
4 changed files with 21 additions and 1 deletions

View File

@ -128,6 +128,11 @@ but everything after this is unencrypted (including interactive logins).
Do not send mouse motion events. This saves bandwidth, although some Windows Do not send mouse motion events. This saves bandwidth, although some Windows
applications may rely on receiving mouse motion. applications may rely on receiving mouse motion.
.TP .TP
.BR "-M"
Use local X cursor inherited from window manager instead of server cursor. This
is mostly useful with -m, but is also useful if the server is sending bogus
mouse cursors.
.TP
.BR "-C" .BR "-C"
Use private colourmap. This will improve colour accuracy on an 8-bit display, Use private colourmap. This will improve colour accuracy on an 8-bit display,
but rdesktop will appear in false colour when not focused. but rdesktop will appear in false colour when not focused.

View File

@ -96,6 +96,7 @@ RD_BOOL g_desktop_save = True; /* desktop save order */
RD_BOOL g_polygon_ellipse_orders = True; /* polygon / ellipse orders */ RD_BOOL g_polygon_ellipse_orders = True; /* polygon / ellipse orders */
RD_BOOL g_fullscreen = False; RD_BOOL g_fullscreen = False;
RD_BOOL g_grab_keyboard = True; RD_BOOL g_grab_keyboard = True;
RD_BOOL g_local_cursor = False;
RD_BOOL g_hide_decorations = False; RD_BOOL g_hide_decorations = False;
RDP_VERSION g_rdp_version = RDP_V5; /* Default to version 5 */ RDP_VERSION g_rdp_version = RDP_V5; /* Default to version 5 */
RD_BOOL g_rdpclip = True; RD_BOOL g_rdpclip = True;
@ -182,6 +183,7 @@ usage(char *program)
fprintf(stderr, " -e: disable encryption (French TS)\n"); fprintf(stderr, " -e: disable encryption (French TS)\n");
fprintf(stderr, " -E: disable encryption from client to server\n"); fprintf(stderr, " -E: disable encryption from client to server\n");
fprintf(stderr, " -m: do not send motion events\n"); fprintf(stderr, " -m: do not send motion events\n");
fprintf(stderr, " -M: use local mouse cursor\n");
fprintf(stderr, " -C: use private colour map\n"); fprintf(stderr, " -C: use private colour map\n");
fprintf(stderr, " -D: hide window manager decorations\n"); fprintf(stderr, " -D: hide window manager decorations\n");
fprintf(stderr, " -K: keep window manager key bindings\n"); fprintf(stderr, " -K: keep window manager key bindings\n");
@ -638,7 +640,7 @@ main(int argc, char *argv[])
g_num_devices = 0; g_num_devices = 0;
while ((c = getopt(argc, argv, while ((c = getopt(argc, argv,
"A:u:L:d:s:c:p:n:k:g:o:fbBeEitmzCDKS:T:NX:a:x:Pr:045vh?")) != -1) "A:u:L:d:s:c:p:n:k:g:o:fbBeEitmMzCDKS:T:NX:a:x:Pr:045vh?")) != -1)
{ {
switch (c) switch (c)
{ {
@ -787,6 +789,9 @@ main(int argc, char *argv[])
case 'm': case 'm':
g_sendmotion = False; g_sendmotion = False;
break; break;
case 'M':
g_local_cursor = True;
break;
case 'C': case 'C':
g_owncolmap = True; g_owncolmap = True;
@ -1040,6 +1045,12 @@ main(int argc, char *argv[])
usage(argv[0]); usage(argv[0]);
return EX_USAGE; return EX_USAGE;
} }
if (g_local_cursor)
{
/* there is no point wasting bandwidth on cursor shadows
* that we're just going to throw out anyway */
g_rdp5_performanceflags |= PERF_DISABLE_CURSOR_SHADOW;
}
STRNCPY(server, argv[optind], sizeof(server)); STRNCPY(server, argv[optind], sizeof(server));
parse_server_and_port(server); parse_server_and_port(server);

2
rdp.c
View File

@ -1171,6 +1171,7 @@ process_demand_active(STREAM s)
static void static void
process_colour_pointer_common(STREAM s, int bpp) process_colour_pointer_common(STREAM s, int bpp)
{ {
extern RD_BOOL g_local_cursor;
uint16 width, height, cache_idx, masklen, datalen; uint16 width, height, cache_idx, masklen, datalen;
uint16 x, y; uint16 x, y;
uint8 *mask; uint8 *mask;
@ -1194,6 +1195,7 @@ process_colour_pointer_common(STREAM s, int bpp)
/* keep hotspot within cursor bounding box */ /* keep hotspot within cursor bounding box */
x = MIN(x, width - 1); x = MIN(x, width - 1);
y = MIN(y, height - 1); y = MIN(y, height - 1);
if (g_local_cursor) return ; /* don't bother creating a cursor we won't use */
cursor = ui_create_cursor(x, y, width, height, mask, data, bpp); cursor = ui_create_cursor(x, y, width, height, mask, data, bpp);
ui_set_cursor(cursor); ui_set_cursor(cursor);
cache_put_cursor(cache_idx, cursor); cache_put_cursor(cache_idx, cursor);

2
xwin.c
View File

@ -3088,6 +3088,8 @@ ui_create_cursor(unsigned int xhot, unsigned int yhot, uint32 width,
void void
ui_set_cursor(RD_HCURSOR cursor) ui_set_cursor(RD_HCURSOR cursor)
{ {
extern RD_BOOL g_local_cursor;
if (g_local_cursor) return ;
logger(GUI, Debug, "ui_set_cursor(): g_current_cursor = %p, new = %p", logger(GUI, Debug, "ui_set_cursor(): g_current_cursor = %p, new = %p",
g_current_cursor, cursor); g_current_cursor, cursor);