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
applications may rely on receiving mouse motion.
.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"
Use private colourmap. This will improve colour accuracy on an 8-bit display,
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_fullscreen = False;
RD_BOOL g_grab_keyboard = True;
RD_BOOL g_local_cursor = False;
RD_BOOL g_hide_decorations = False;
RDP_VERSION g_rdp_version = RDP_V5; /* Default to version 5 */
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 from client to server\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, " -D: hide window manager decorations\n");
fprintf(stderr, " -K: keep window manager key bindings\n");
@ -638,7 +640,7 @@ main(int argc, char *argv[])
g_num_devices = 0;
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)
{
@ -787,6 +789,9 @@ main(int argc, char *argv[])
case 'm':
g_sendmotion = False;
break;
case 'M':
g_local_cursor = True;
break;
case 'C':
g_owncolmap = True;
@ -1040,6 +1045,12 @@ main(int argc, char *argv[])
usage(argv[0]);
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));
parse_server_and_port(server);

2
rdp.c
View File

@ -1171,6 +1171,7 @@ process_demand_active(STREAM s)
static void
process_colour_pointer_common(STREAM s, int bpp)
{
extern RD_BOOL g_local_cursor;
uint16 width, height, cache_idx, masklen, datalen;
uint16 x, y;
uint8 *mask;
@ -1194,6 +1195,7 @@ process_colour_pointer_common(STREAM s, int bpp)
/* keep hotspot within cursor bounding box */
x = MIN(x, width - 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);
ui_set_cursor(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
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",
g_current_cursor, cursor);