diff --git a/libxrdp/libxrdp.c b/libxrdp/libxrdp.c index 72bcf84573..4337c36420 100644 --- a/libxrdp/libxrdp.c +++ b/libxrdp/libxrdp.c @@ -702,6 +702,25 @@ libxrdp_send_bitmap(struct xrdp_session *session, int width, int height, return 0; } +/*****************************************************************************/ +int EXPORT_CC +libxrdp_send_pointer_system(struct xrdp_session *session, int pointer_type) +{ + struct stream *s; + + make_stream(s); + init_stream(s, 8192); + xrdp_rdp_init_data((struct xrdp_rdp *)(session->rdp), s); + out_uint16_le(s, RDP_POINTER_SYSTEM); + out_uint16_le(s, 0); /* pad */ + out_uint32_le(s, pointer_type); + s_mark_end(s); + xrdp_rdp_send_data((struct xrdp_rdp *)session->rdp, s, + RDP_DATA_PDU_POINTER); + free_stream(s); + return 0; +} + /*****************************************************************************/ int EXPORT_CC libxrdp_send_pointer(struct xrdp_session *session, int cache_idx, diff --git a/libxrdp/libxrdpinc.h b/libxrdp/libxrdpinc.h index e026843c31..b2d86adb14 100644 --- a/libxrdp/libxrdpinc.h +++ b/libxrdp/libxrdpinc.h @@ -122,6 +122,8 @@ int libxrdp_send_bitmap(struct xrdp_session *session, int width, int height, int bpp, char *data, int x, int y, int cx, int cy); int +libxrdp_send_pointer_system(struct xrdp_session *session, int pointer_type); +int libxrdp_send_pointer(struct xrdp_session *session, int cache_idx, char *data, char *mask, int x, int y, int bpp, int width, int height); diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h index 96ee93c222..d4f1c8c481 100644 --- a/xrdp/xrdp.h +++ b/xrdp/xrdp.h @@ -168,6 +168,8 @@ xrdp_wm_key_sync(struct xrdp_wm *self, int device_flags, int key_flags); int xrdp_wm_pu(struct xrdp_wm *self, struct xrdp_bitmap *control); int +xrdp_wm_send_pointer_system(struct xrdp_wm *self, int pointer_type); +int xrdp_wm_send_pointer(struct xrdp_wm *self, int cache_idx, char *data, char *mask, int x, int y, int bpp, int width, int height); @@ -568,6 +570,8 @@ server_paint_rects(struct xrdp_mod *mod, int num_drects, short *drects, char *data, int width, int height, int flags, int frame_id); int +server_set_pointer_system(struct xrdp_mod *mod, int pointer_type); +int server_set_pointer(struct xrdp_mod *mod, int x, int y, char *data, char *mask); int diff --git a/xrdp/xrdp_mm.c b/xrdp/xrdp_mm.c index a29ae9850b..4679d2f2c6 100644 --- a/xrdp/xrdp_mm.c +++ b/xrdp/xrdp_mm.c @@ -466,6 +466,7 @@ xrdp_mm_setup_mod1(struct xrdp_mm *self) self->mod->server_egfx_cmd = server_egfx_cmd; self->mod->server_set_pointer_large = server_set_pointer_large; self->mod->server_paint_rects_ex = server_paint_rects_ex; + self->mod->server_set_pointer_system = server_set_pointer_system; self->mod->si = &(self->wm->session->si); } } @@ -4457,6 +4458,17 @@ server_egfx_cmd(struct xrdp_mod *mod, return 0; } +/*****************************************************************************/ +int +server_set_pointer_system(struct xrdp_mod *mod, int pointer_type) +{ + struct xrdp_wm *wm; + + wm = (struct xrdp_wm *)(mod->wm); + xrdp_wm_send_pointer_system(wm, pointer_type); + return 0; +} + /*****************************************************************************/ int server_set_pointer(struct xrdp_mod *mod, int x, int y, diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 72dda3e827..e6111ba6b3 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -198,7 +198,8 @@ struct xrdp_mod int (*server_egfx_cmd)(struct xrdp_mod *v, char *cmd, int cmd_bytes, char *data, int data_bytes); - tintptr server_dumby[100 - 51]; /* align, 100 minus the number of server + int (*server_set_pointer_system)(struct xrdp_mod *v, int pointer_type); + tintptr server_dumby[100 - 52]; /* align, 100 minus the number of server functions above */ /* common */ tintptr handle; /* pointer to self as int */ diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index 586901b489..e9a3bd6d4f 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -418,6 +418,13 @@ xrdp_wm_load_pointer(struct xrdp_wm *self, char *file_name, char *data, return 0; } +/*****************************************************************************/ +int +xrdp_wm_send_pointer_system(struct xrdp_wm *self, int pointer_type) +{ + return libxrdp_send_pointer_system(self->session, pointer_type); +} + /*****************************************************************************/ int xrdp_wm_send_pointer(struct xrdp_wm *self, int cache_idx, diff --git a/xup/xup.c b/xup/xup.c index e59657b51e..5bcfcc137d 100644 --- a/xup/xup.c +++ b/xup/xup.c @@ -1553,6 +1553,19 @@ process_server_paint_rect_shmfd(struct mod *amod, struct stream *s) return rv; } +/******************************************************************************/ +/* return error */ +static int +process_server_set_pointer_system(struct mod *amod, struct stream *s) +{ + int rv; + int pointer_type; + + in_uint32_le(s, pointer_type); + rv = amod->server_set_pointer_system(amod, pointer_type); + return rv; +} + /******************************************************************************/ /* return error */ static int @@ -1788,6 +1801,9 @@ lib_mod_process_orders(struct mod *mod, int type, struct stream *s) case 64: /* server_paint_rect_shmfd */ rv = process_server_paint_rect_shmfd(mod, s); break; + case 65: /* server_set_pointer_system */ + rv = process_server_set_pointer_system(mod, s); + break; default: LOG_DEVEL(LOG_LEVEL_WARNING, "lib_mod_process_orders: unknown order type %d", type); diff --git a/xup/xup.h b/xup/xup.h index 6486be0466..0045d72ad0 100644 --- a/xup/xup.h +++ b/xup/xup.h @@ -190,7 +190,8 @@ struct mod int (*server_egfx_cmd)(struct mod *v, char *cmd, int cmd_bytes, char *data, int data_bytes); - tintptr server_dumby[100 - 51]; /* align, 100 minus the number of server + int (*server_set_pointer_system)(struct mod *v, int pointer_type); + tintptr server_dumby[100 - 52]; /* align, 100 minus the number of server functions above */ /* common */ tintptr handle; /* pointer to self as long */