summaryrefslogtreecommitdiffstats
path: root/xrdp
diff options
context:
space:
mode:
Diffstat (limited to 'xrdp')
-rw-r--r--xrdp/funcs.c8
-rw-r--r--xrdp/libxrdp.h2
-rw-r--r--xrdp/xrdp.h10
-rw-r--r--xrdp/xrdp_bitmap.c41
-rw-r--r--xrdp/xrdp_cache.c61
-rw-r--r--xrdp/xrdp_interface.c10
-rw-r--r--xrdp/xrdp_iso.c2
-rw-r--r--xrdp/xrdp_login_wnd.c30
-rw-r--r--xrdp/xrdp_mcs.c4
-rw-r--r--xrdp/xrdp_painter.c9
-rw-r--r--xrdp/xrdp_process.c335
-rw-r--r--xrdp/xrdp_rdp.c35
-rw-r--r--xrdp/xrdp_sec.c1
-rw-r--r--xrdp/xrdp_tcp.c8
-rw-r--r--xrdp/xrdp_types.h31
-rw-r--r--xrdp/xrdp_wm.c68
16 files changed, 406 insertions, 249 deletions
diff --git a/xrdp/funcs.c b/xrdp/funcs.c
index 35c95445..4c3ac42b 100644
--- a/xrdp/funcs.c
+++ b/xrdp/funcs.c
@@ -285,7 +285,9 @@ int add_char_at(char* text, char ch, int index)
return 0;
}
for (i = len - 1; i >= index; i--)
+ {
text[i + 1] = text[i];
+ }
text[i + 1] = ch;
text[len + 1] = 0;
return 0;
@@ -301,14 +303,18 @@ int remove_char_at(char* text, int index)
len = g_strlen(text);
if (len <= 0)
+ {
return 0;
+ }
if (index >= len - 1 || index < 0)
{
text[len - 1] = 0;
return 0;
}
for (i = index; i < len - 1; i++)
+ {
text[i] = text[i + 1];
+ }
text[len - 1] = 0;
return 0;
}
@@ -317,7 +323,9 @@ int remove_char_at(char* text, int index)
int set_string(char** in_str, char* in)
{
if (in_str == 0)
+ {
return 0;
+ }
g_free(*in_str);
*in_str = g_strdup(in);
return 0;
diff --git a/xrdp/libxrdp.h b/xrdp/libxrdp.h
index 0d86dab5..28b68828 100644
--- a/xrdp/libxrdp.h
+++ b/xrdp/libxrdp.h
@@ -14,6 +14,6 @@ int server_end_update(void);
int server_fill_rect(int x, int y, int cx, int cy, int color);
int server_screen_blt(int x, int y, int cx, int cy, int srcx, int srcy);
int server_paint_rect(int x, int y, int cx, int cy, char* data);
-int server_set_cursor(int x, int y, char* data, char* mask);
+int server_set_pointer(int x, int y, char* data, char* mask);
int server_palette(int* palette);
diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h
index e13cdb7e..c484e01f 100644
--- a/xrdp/xrdp.h
+++ b/xrdp/xrdp.h
@@ -136,6 +136,8 @@ int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap);
int xrdp_cache_add_palette(struct xrdp_cache* self, int* palette);
int xrdp_cache_add_char(struct xrdp_cache* self,
struct xrdp_font_item* font_item);
+int xrdp_cache_add_pointer(struct xrdp_cache* self,
+ struct xrdp_pointer_item* pointer_item);
/* xrdp_wm.c */
struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner,
@@ -145,6 +147,7 @@ int xrdp_wm_send_palette(struct xrdp_wm* self);
int xrdp_wm_init(struct xrdp_wm* self);
int xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap,
int x, int y, int cx, int cy);
+int xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx);
int xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd);
int xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap,
int x, int y, int cx, int cy,
@@ -154,8 +157,9 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down);
int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code);
int 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_cursor(struct xrdp_wm* self, int cache_idx,
+int xrdp_wm_send_pointer(struct xrdp_wm* self, int cache_idx,
char* data, char* mask, int x, int y);
+int xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y);
/* xrdp_process.c */
struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner);
@@ -285,8 +289,8 @@ int server_screen_blt(struct xrdp_mod* mod, int x, int y, int cx, int cy,
int srcx, int srcy);
int server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy,
char* data);
-int server_set_cursor(struct xrdp_mod* mod, int x, int y,
- char* data, char* mask);
+int server_set_pointer(struct xrdp_mod* mod, int x, int y,
+ char* data, char* mask);
int server_palette(struct xrdp_mod* mod, int* palette);
int server_error_popup(struct xrdp_mod* mod, char* error, char* caption);
#endif
diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c
index 3554f9a0..de0c0d57 100644
--- a/xrdp/xrdp_bitmap.c
+++ b/xrdp/xrdp_bitmap.c
@@ -99,7 +99,7 @@ struct xrdp_bitmap* xrdp_bitmap_create(int width, int height, int bpp,
}
if (self->type == WND_TYPE_SCREEN || self->type == WND_TYPE_BITMAP)
{
- self->data = (char*)g_malloc(width * height * Bpp, 1);
+ self->data = (char*)g_malloc(width * height * Bpp, 0);
}
if (self->type != WND_TYPE_BITMAP)
{
@@ -196,6 +196,7 @@ void xrdp_bitmap_delete(struct xrdp_bitmap* self)
{
g_free(self->data);
}
+ g_free(self->caption1);
g_free(self);
}
@@ -249,7 +250,7 @@ int xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused)
xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18);
painter->font->color = self->wm->black;
}
- xrdp_painter_draw_text(painter, self, 4, 4, self->caption);
+ xrdp_painter_draw_text(painter, self, 4, 4, self->caption1);
xrdp_painter_end_update(painter);
xrdp_painter_delete(painter);
return 0;
@@ -884,7 +885,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18);
painter->font->color = self->wm->black;
}
- xrdp_painter_draw_text(painter, self, 4, 4, self->caption);
+ xrdp_painter_draw_text(painter, self, 4, 4, self->caption1);
}
else if (self->type == WND_TYPE_SCREEN) /* 2 */
{
@@ -913,11 +914,11 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
{
xrdp_bitmap_draw_button(self, painter, 0, 0,
self->width, self->height, 0);
- w = xrdp_painter_text_width(painter, self->caption);
- h = xrdp_painter_text_height(painter, self->caption);
+ w = xrdp_painter_text_width(painter, self->caption1);
+ h = xrdp_painter_text_height(painter, self->caption1);
painter->font->color = self->wm->black;
xrdp_painter_draw_text(painter, self, self->width / 2 - w / 2,
- self->height / 2 - h / 2, self->caption);
+ self->height / 2 - h / 2, self->caption1);
if (self->parent != 0)
if (self->wm->focused_window == self->parent)
if (self->parent->focused_control == self)
@@ -928,11 +929,11 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
{
xrdp_bitmap_draw_button(self, painter, 0, 0,
self->width, self->height, 1);
- w = xrdp_painter_text_width(painter, self->caption);
- h = xrdp_painter_text_height(painter, self->caption);
+ w = xrdp_painter_text_width(painter, self->caption1);
+ h = xrdp_painter_text_height(painter, self->caption1);
painter->font->color = self->wm->black;
xrdp_painter_draw_text(painter, self, (self->width / 2 - w / 2) + 1,
- (self->height / 2 - h / 2) + 1, self->caption);
+ (self->height / 2 - h / 2) + 1, self->caption1);
if (self->parent != 0)
if (self->wm->focused_window == self->parent)
if (self->parent->focused_control == self)
@@ -976,13 +977,13 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
painter->fg_color = self->wm->black;
if (self->password_char != 0)
{
- i = g_strlen(self->caption);
+ i = g_strlen(self->caption1);
g_memset(text, self->password_char, i);
text[i] = 0;
xrdp_painter_draw_text(painter, self, 4, 2, text);
}
else
- xrdp_painter_draw_text(painter, self, 4, 2, self->caption);
+ xrdp_painter_draw_text(painter, self, 4, 2, self->caption1);
/* draw xor box(cursor) */
if (self->parent != 0)
{
@@ -994,7 +995,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
text[self->edit_pos] = 0;
}
else
- g_strncpy(text, self->caption, self->edit_pos);
+ g_strncpy(text, self->caption1, self->edit_pos);
w = xrdp_painter_text_width(painter, text);
painter->fg_color = self->wm->black;
painter->rop = 0x5a;
@@ -1007,7 +1008,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect)
else if (self->type == WND_TYPE_LABEL) /* 6 */
{
painter->font->color = self->wm->black;
- xrdp_painter_draw_text(painter, self, 0, 0, self->caption);
+ xrdp_painter_draw_text(painter, self, 0, 0, self->caption1);
}
else if (self->type == WND_TYPE_COMBO) /* 7 combo box */
{
@@ -1205,7 +1206,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
else if ((scan_code == 77 || scan_code == 80) &&
(ext || self->wm->num_lock == 0))
{
- if (self->edit_pos < g_strlen(self->caption))
+ if (self->edit_pos < g_strlen(self->caption1))
{
self->edit_pos++;
xrdp_bitmap_invalidate(self, 0);
@@ -1214,13 +1215,13 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
/* backspace */
else if (scan_code == 14)
{
- n = g_strlen(self->caption);
+ n = g_strlen(self->caption1);
if (n > 0)
{
if (self->edit_pos > 0)
{
self->edit_pos--;
- remove_char_at(self->caption, self->edit_pos);
+ remove_char_at(self->caption1, self->edit_pos);
xrdp_bitmap_invalidate(self, 0);
}
}
@@ -1229,12 +1230,12 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
else if (scan_code == 83 &&
(ext || self->wm->num_lock == 0))
{
- n = g_strlen(self->caption);
+ n = g_strlen(self->caption1);
if (n > 0)
{
if (self->edit_pos < n)
{
- remove_char_at(self->caption, self->edit_pos);
+ remove_char_at(self->caption1, self->edit_pos);
xrdp_bitmap_invalidate(self, 0);
}
}
@@ -1243,7 +1244,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
else if (scan_code == 79 &&
(ext || self->wm->num_lock == 0))
{
- n = g_strlen(self->caption);
+ n = g_strlen(self->caption1);
if (self->edit_pos < n)
{
self->edit_pos = n;
@@ -1268,7 +1269,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg,
self->wm->scroll_lock);
if (c != 0)
{
- add_char_at(self->caption, c, self->edit_pos);
+ add_char_at(self->caption1, c, self->edit_pos);
self->edit_pos++;
xrdp_bitmap_invalidate(self, 0);
}
diff --git a/xrdp/xrdp_cache.c b/xrdp/xrdp_cache.c
index 031563f6..7c315526 100644
--- a/xrdp/xrdp_cache.c
+++ b/xrdp/xrdp_cache.c
@@ -39,6 +39,7 @@ struct xrdp_cache* xrdp_cache_create(struct xrdp_wm* owner,
self->cache2_size = client_info->cache2_size;
self->cache3_entries = client_info->cache3_entries;
self->cache3_size = client_info->cache3_size;
+ self->pointer_cache_entries = client_info->pointer_cache_entries;
return self;
}
@@ -320,3 +321,63 @@ int xrdp_cache_add_char(struct xrdp_cache* self,
xrdp_orders_send_font(self->orders, fi, f, c);
return MAKELONG(f, c);
}
+
+/*****************************************************************************/
+/* added the pointer to the cache and send it to client, it also sets the
+ client if it finds it
+ returns the index in the cache
+ does not take ownership of pointer_item */
+int xrdp_cache_add_pointer(struct xrdp_cache* self,
+ struct xrdp_pointer_item* pointer_item)
+{
+ int i;
+ int oldest;
+ int index;
+
+ if (self == 0)
+ {
+ return 0;
+ }
+ self->pointer_stamp++;
+ /* look for match */
+ for (i = 0; i < self->pointer_cache_entries; i++)
+ {
+ if (self->pointer_items[i].x == pointer_item->x &&
+ self->pointer_items[i].y == pointer_item->y &&
+ g_memcmp(self->pointer_items[i].data,
+ pointer_item->data, 32 * 32 * 3) == 0 &&
+ g_memcmp(self->pointer_items[i].mask,
+ pointer_item->mask, 32 * 32 / 8) == 0)
+ {
+ self->pointer_items[i].stamp = self->pointer_stamp;
+ xrdp_wm_set_pointer(self->wm, i);
+ DEBUG(("found pointer at %d\n\r", i));
+ return i;
+ }
+ }
+ /* look for oldest */
+ index = 0;
+ oldest = 0x7fffffff;
+ for (i = 0; i < self->pointer_cache_entries; i++)
+ {
+ if (self->pointer_items[i].stamp < oldest)
+ {
+ oldest = self->pointer_items[i].stamp;
+ index = i;
+ }
+ }
+ self->pointer_items[index].x = pointer_item->x;
+ self->pointer_items[index].y = pointer_item->y;
+ g_memcpy(self->pointer_items[index].data,
+ pointer_item->data, 32 * 32 * 3);
+ g_memcpy(self->pointer_items[index].mask,
+ pointer_item->mask, 32 * 32 / 8);
+ self->pointer_items[index].stamp = self->pointer_stamp;
+ xrdp_wm_send_pointer(self->wm, index,
+ self->pointer_items[index].data,
+ self->pointer_items[index].mask,
+ self->pointer_items[index].x,
+ self->pointer_items[index].y);
+ DEBUG(("adding pointer at %d\n\r", index));
+ return index;
+}
diff --git a/xrdp/xrdp_interface.c b/xrdp/xrdp_interface.c
index b52ce3b4..55b1de55 100644
--- a/xrdp/xrdp_interface.c
+++ b/xrdp/xrdp_interface.c
@@ -190,12 +190,12 @@ int server_paint_rect(int x, int y, int cx, int cy, char* data)
}
/*****************************************************************************/
-int server_set_cursor(int x, int y, char* data, char* mask)
+int server_set_pointer(int x, int y, char* data, char* mask)
{
struct xrdp_wm* wm;
wm = (struct xrdp_wm*)g_mod.wm;
- xrdp_wm_send_cursor(wm, 2, data, mask, x, y);
+ xrdp_wm_pointer(wm, data, mask, x, y);
return 0;
}
@@ -283,13 +283,13 @@ int server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy,
}
/*****************************************************************************/
-int server_set_cursor(struct xrdp_mod* mod, int x, int y,
- char* data, char* mask)
+int server_set_pointer(struct xrdp_mod* mod, int x, int y,
+ char* data, char* mask)
{
struct xrdp_wm* wm;
wm = (struct xrdp_wm*)mod->wm;
- xrdp_wm_send_cursor(wm, 2, data, mask, x, y);
+ xrdp_wm_pointer(wm, data, mask, x, y);
return 0;
}
diff --git a/xrdp/xrdp_iso.c b/xrdp/xrdp_iso.c
index 131fefde..7180c8b9 100644
--- a/xrdp/xrdp_iso.c
+++ b/xrdp/xrdp_iso.c
@@ -89,10 +89,12 @@ int xrdp_iso_recv(struct xrdp_iso* self, struct stream* s)
DEBUG((" in xrdp_iso_recv\n\r"));
if (xrdp_iso_recv_msg(self, s, &code) != 0)
{
+ DEBUG((" out xrdp_iso_recv xrdp_iso_recv_msg return non zero\n\r"));
return 1;
}
if (code != ISO_PDU_DT)
{
+ DEBUG((" out xrdp_iso_recv code != ISO_PDU_DT\n\r"));
return 1;
}
DEBUG((" out xrdp_iso_recv\n\r"));
diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c
index 56861b22..38b58d99 100644
--- a/xrdp/xrdp_login_wnd.c
+++ b/xrdp/xrdp_login_wnd.c
@@ -107,7 +107,7 @@ int xrdp_wm_setup_mod(struct xrdp_wm* self,
self->mod->server_fill_rect = server_fill_rect;
self->mod->server_screen_blt = server_screen_blt;
self->mod->server_paint_rect = server_paint_rect;
- self->mod->server_set_cursor = server_set_cursor;
+ self->mod->server_set_pointer = server_set_pointer;
self->mod->server_palette = server_palette;
self->mod->server_error_popup= server_error_popup;
}
@@ -167,7 +167,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
help->left = wnd->wm->screen->width / 2 - help->width / 2;
help->top = wnd->wm->screen->height / 2 - help->height / 2;
help->notify = xrdp_wm_login_help_notify;
- g_strcpy(help->caption, "Login help");
+ set_string(&help->caption1, "Login help");
/* ok button */
but = xrdp_bitmap_create(60, 25, wnd->wm->screen->bpp, 3, wnd->wm);
xrdp_list_insert_item(help->child_list, 0, (int)but);
@@ -177,7 +177,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
but->top = 260;
but->id = 1;
but->tab_stop = 1;
- g_strcpy(but->caption, "OK");
+ set_string(&but->caption1, "OK");
/* draw it */
help->focused_control = but;
//wnd->wm->focused_window = help;
@@ -207,7 +207,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
edit = xrdp_bitmap_get_child_by_id(wnd, 4);
if (edit != 0)
{
- g_strcpy(con_mod.username, edit->caption);
+ g_strcpy(con_mod.username, edit->caption1);
}
}
if (g_strcmp(con_mod.password, "ask") == 0)
@@ -215,7 +215,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
edit = xrdp_bitmap_get_child_by_id(wnd, 5);
if (edit != 0)
{
- g_strcpy(con_mod.password, edit->caption);
+ g_strcpy(con_mod.password, edit->caption1);
}
}
if (xrdp_wm_setup_mod(wm, mod) == 0)
@@ -364,7 +364,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
self->login_window->top = self->screen->height / 2 -
self->login_window->height / 2;
self->login_window->notify = xrdp_wm_login_notify;
- g_strcpy(self->login_window->caption, "Login to xrdp");
+ set_string(&self->login_window->caption1, "Login to xrdp");
/* image */
but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE, self);
@@ -391,7 +391,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->owner = self->login_window;
but->left = 155;
but->top = 50;
- g_strcpy(but->caption, "Username");
+ set_string(&but->caption1, "Username");
/* edit */
but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self);
@@ -401,8 +401,9 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->left = 220;
but->top = 50;
but->id = 4;
- but->cursor = 1;
+ but->pointer = 1;
but->tab_stop = 1;
+ but->caption1 = g_malloc(256, 1);
self->login_window->focused_control = but;
/* label */
@@ -412,7 +413,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->owner = self->login_window;
but->left = 155;
but->top = 80;
- g_strcpy(but->caption, "Password");
+ set_string(&but->caption1, "Password");
/* edit */
but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self);
@@ -422,8 +423,9 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->left = 220;
but->top = 80;
but->id = 5;
- but->cursor = 1;
+ but->pointer = 1;
but->tab_stop = 1;
+ but->caption1 = g_malloc(256, 1);
but->password_char = '*';
/* label */
@@ -433,7 +435,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->owner = self->login_window;
but->left = 155;
but->top = 110;
- g_strcpy(but->caption, "Module");
+ set_string(&but->caption1, "Module");
/* combo */
but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_COMBO, self);
@@ -454,7 +456,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->left = 180;
but->top = 160;
but->id = 3;
- g_strcpy(but->caption, "OK");
+ set_string(&but->caption1, "OK");
but->tab_stop = 1;
/* button */
@@ -465,7 +467,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->left = 250;
but->top = 160;
but->id = 2;
- g_strcpy(but->caption, "Cancel");
+ set_string(&but->caption1, "Cancel");
but->tab_stop = 1;
/* button */
@@ -476,7 +478,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self)
but->left = 320;
but->top = 160;
but->id = 1;
- g_strcpy(but->caption, "Help");
+ set_string(&but->caption1, "Help");
but->tab_stop = 1;
return 0;
diff --git a/xrdp/xrdp_mcs.c b/xrdp/xrdp_mcs.c
index e47a36f3..82eeff0f 100644
--- a/xrdp/xrdp_mcs.c
+++ b/xrdp/xrdp_mcs.c
@@ -91,12 +91,14 @@ int xrdp_mcs_recv(struct xrdp_mcs* self, struct stream* s, int* chan)
{
if (xrdp_iso_recv(self->iso_layer, s) != 0)
{
+ DEBUG((" out xrdp_mcs_recv xrdp_iso_recv returned non zero\n\r"));
return 1;
}
in_uint8(s, opcode);
appid = opcode >> 2;
if (appid == MCS_DPUM)
{
+ DEBUG((" out xrdp_mcs_recv appid != MCS_DPUM\n\r"));
return 1;
}
if (appid == MCS_CJRQ)
@@ -141,7 +143,9 @@ int xrdp_mcs_ber_parse_header(struct xrdp_mcs* self, struct stream* s,
in_uint8(s, tag);
}
if (tag != tag_val)
+ {
return 1;
+ }
in_uint8(s, l);
if (l & 0x80)
{
diff --git a/xrdp/xrdp_painter.c b/xrdp/xrdp_painter.c
index ba9605e8..7fcb7170 100644
--- a/xrdp/xrdp_painter.c
+++ b/xrdp/xrdp_painter.c
@@ -380,6 +380,7 @@ int xrdp_painter_draw_bitmap(struct xrdp_painter* self,
srcy = srcy - y1;
y1 = 0;
}
+ //g_printf("%d %d %d %d %d %d\n", x1, y1, w, h, srcx, srcy);
xrdp_orders_mem_blt(self->orders, cache_id, palette_id,
x1, y1, w, h, self->rop, srcx, srcy,
cache_idx, &rect1);
@@ -425,6 +426,10 @@ int xrdp_painter_text_width(struct xrdp_painter* self, char* text)
struct xrdp_font_item* font_item;
xrdp_painter_font_needed(self);
+ if (text == 0)
+ {
+ return 0;
+ }
rv = 0;
len = g_strlen(text);
for (index = 0; index < len; index++)
@@ -444,6 +449,10 @@ int xrdp_painter_text_height(struct xrdp_painter* self, char* text)
struct xrdp_font_item* font_item;
xrdp_painter_font_needed(self);
+ if (text == 0)
+ {
+ return 0;
+ }
rv = 0;
len = g_strlen(text);
for (index = 0; index < len; index++)
diff --git a/xrdp/xrdp_process.c b/xrdp/xrdp_process.c
index c38b9257..aa9acfa1 100644
--- a/xrdp/xrdp_process.c
+++ b/xrdp/xrdp_process.c
@@ -1,166 +1,169 @@
-/*
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- xrdp: A Remote Desktop Protocol server.
- Copyright (C) Jay Sorg 2004-2005
-
- main rdp process
-
-*/
-
-#include "xrdp.h"
-
-/*****************************************************************************/
-struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner)
-{
- struct xrdp_process* self;
-
- self = (struct xrdp_process*)g_malloc(sizeof(struct xrdp_process), 1);
- self->lis_layer = owner;
- return self;
-}
-
-/*****************************************************************************/
-void xrdp_process_delete(struct xrdp_process* self)
-{
- if (self == 0)
- {
- return;
- }
- xrdp_rdp_delete(self->rdp_layer);
- xrdp_orders_delete(self->orders);
- xrdp_wm_delete(self->wm);
- g_free(self);
-}
-
-/*****************************************************************************/
-int xrdp_process_loop(struct xrdp_process* self, struct stream* s)
-{
- int cont;
- int rv;
- int code;
-
- code = 0;
- rv = 0;
- cont = 1;
- while (cont && !self->term)
- {
- if (xrdp_rdp_recv(self->rdp_layer, s, &code) != 0)
- {
- rv = 1;
- break;
- }
- DEBUG(("xrdp_process_main_loop code %d\n\r", code));
- switch (code)
- {
- case -1:
- xrdp_rdp_send_demand_active(self->rdp_layer);
- break;
- case 0:
- break;
- case RDP_PDU_CONFIRM_ACTIVE: /* 3 */
- xrdp_rdp_process_confirm_active(self->rdp_layer, s);
- break;
- case RDP_PDU_DATA: /* 7 */
- if (xrdp_rdp_process_data(self->rdp_layer, s) != 0)
- {
- DEBUG(("xrdp_rdp_process_data returned non zero\n\r"));
- cont = 0;
- self->term = 1;
- }
- break;
- default:
- g_printf("unknown in xrdp_process_main_loop\n\r");
- break;
- }
- if (cont)
- {
- cont = s->next_packet < s->end;
- }
- }
- if (self->rdp_layer->up_and_running && self->wm == 0 && rv == 0)
- {
- /* only do this once */
- DEBUG(("xrdp_process_main_loop up and running\n\r"));
- self->orders = xrdp_orders_create(self, self->rdp_layer);
- self->wm = xrdp_wm_create(self, &self->rdp_layer->client_info);
- xrdp_wm_init(self->wm);
- }
- return rv;
-}
-
-/*****************************************************************************/
-int xrdp_process_main_loop(struct xrdp_process* self)
-{
-#ifndef XRDP_LIB
- int i;
- struct stream* s;
-
- make_stream(s);
- self->status = 1;
- self->rdp_layer = xrdp_rdp_create(self, self->sck);
- g_tcp_set_non_blocking(self->sck);
- if (xrdp_rdp_incoming(self->rdp_layer) == 0)
- {
- while (!g_is_term() && !self->term)
- {
- i = g_tcp_select(self->sck, self->app_sck);
- if (i & 1)
- {
- init_stream(s, 8192);
- xrdp_process_loop(self, s);
- }
- if (i & 2) /* mod socket fired */
- {
- if (self->wm->mod == 0)
- {
- break;
- }
- if (self->wm->mod->mod_signal == 0)
- {
- break;
- }
- if (self->wm->mod->mod_signal(self->wm->mod) != 0)
- {
- break;
- }
- }
- if (i == 0) /* no data on any stream */
- {
- g_sleep(10);
- }
- else if (i < 0)
- {
- break;
- }
- }
- }
- if (self->wm->mod != 0)
- {
- if (self->wm->mod->mod_end != 0)
- {
- self->wm->mod->mod_end(self->wm->mod);
- }
- }
- xrdp_rdp_disconnect(self->rdp_layer);
- xrdp_rdp_delete(self->rdp_layer);
- self->rdp_layer = 0;
- g_tcp_close(self->sck);
- self->status = -1;
- xrdp_listen_delete_pro(self->lis_layer, self);
- free_stream(s);
-#endif
- return 0;
-}
+/*
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ xrdp: A Remote Desktop Protocol server.
+ Copyright (C) Jay Sorg 2004-2005
+
+ main rdp process
+
+*/
+
+#include "xrdp.h"
+
+/*****************************************************************************/
+struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner)
+{
+ struct xrdp_process* self;
+
+ self = (struct xrdp_process*)g_malloc(sizeof(struct xrdp_process), 1);
+ self->lis_layer = owner;
+ return self;
+}
+
+/*****************************************************************************/
+void xrdp_process_delete(struct xrdp_process* self)
+{
+ if (self == 0)
+ {
+ return;
+ }
+ xrdp_rdp_delete(self->rdp_layer);
+ xrdp_orders_delete(self->orders);
+ xrdp_wm_delete(self->wm);
+ g_free(self);
+}
+
+/*****************************************************************************/
+int xrdp_process_loop(struct xrdp_process* self, struct stream* s)
+{
+ int cont;
+ int rv;
+ int code;
+
+ code = 0;
+ rv = 0;
+ cont = 1;
+ while (cont && !self->term)
+ {
+ if (xrdp_rdp_recv(self->rdp_layer, s, &code) != 0)
+ {
+ rv = 1;
+ break;
+ }
+ DEBUG(("xrdp_process_main_loop code %d\n\r", code));
+ switch (code)
+ {
+ case -1:
+ xrdp_rdp_send_demand_active(self->rdp_layer);
+ break;
+ case 0:
+ break;
+ case RDP_PDU_CONFIRM_ACTIVE: /* 3 */
+ xrdp_rdp_process_confirm_active(self->rdp_layer, s);
+ break;
+ case RDP_PDU_DATA: /* 7 */
+ if (xrdp_rdp_process_data(self->rdp_layer, s) != 0)
+ {
+ DEBUG(("xrdp_rdp_process_data returned non zero\n\r"));
+ cont = 0;
+ self->term = 1;
+ }
+ break;
+ default:
+ g_printf("unknown in xrdp_process_main_loop\n\r");
+ break;
+ }
+ if (cont)
+ {
+ cont = s->next_packet < s->end;
+ }
+ }
+ if (self->rdp_layer->up_and_running && self->wm == 0 && rv == 0)
+ {
+ /* only do this once */
+ DEBUG(("xrdp_process_main_loop up and running\n\r"));
+ self->orders = xrdp_orders_create(self, self->rdp_layer);
+ self->wm = xrdp_wm_create(self, &self->rdp_layer->client_info);
+ xrdp_wm_init(self->wm);
+ }
+ return rv;
+}
+
+/*****************************************************************************/
+int xrdp_process_main_loop(struct xrdp_process* self)
+{
+#ifndef XRDP_LIB
+ int i;
+ struct stream* s;
+
+ make_stream(s);
+ self->status = 1;
+ self->rdp_layer = xrdp_rdp_create(self, self->sck);
+ g_tcp_set_non_blocking(self->sck);
+ if (xrdp_rdp_incoming(self->rdp_layer) == 0)
+ {
+ while (!g_is_term() && !self->term)
+ {
+ i = g_tcp_select(self->sck, self->app_sck);
+ if (i & 1)
+ {
+ init_stream(s, 8192);
+ if (xrdp_process_loop(self, s) != 0)
+ {
+ break;
+ }
+ }
+ if (i & 2) /* mod socket fired */
+ {
+ if (self->wm->mod == 0)
+ {
+ break;
+ }
+ if (self->wm->mod->mod_signal == 0)
+ {
+ break;
+ }
+ if (self->wm->mod->mod_signal(self->wm->mod) != 0)
+ {
+ break;
+ }
+ }
+ if (i == 0) /* no data on any stream */
+ {
+ g_sleep(10);
+ }
+ else if (i < 0)
+ {
+ break;
+ }
+ }
+ }
+ if (self->wm->mod != 0)
+ {
+ if (self->wm->mod->mod_end != 0)
+ {
+ self->wm->mod->mod_end(self->wm->mod);
+ }
+ }
+ xrdp_rdp_disconnect(self->rdp_layer);
+ xrdp_rdp_delete(self->rdp_layer);
+ self->rdp_layer = 0;
+ g_tcp_close(self->sck);
+ self->status = -1;
+ xrdp_listen_delete_pro(self->lis_layer, self);
+ free_stream(s);
+#endif
+ return 0;
+}
diff --git a/xrdp/xrdp_rdp.c b/xrdp/xrdp_rdp.c
index 0098252f..bed3e833 100644
--- a/xrdp/xrdp_rdp.c
+++ b/xrdp/xrdp_rdp.c
@@ -138,6 +138,7 @@ int xrdp_rdp_init_data(struct xrdp_rdp* self, struct stream* s)
}
/*****************************************************************************/
+/* returns erros */
int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code)
{
int error;
@@ -145,6 +146,7 @@ int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code)
int pdu_code;
int chan;
+ DEBUG(("in xrdp_rdp_recv\n\r"));
if (s->next_packet == 0 || s->next_packet >= s->end)
{
chan = 0;
@@ -153,18 +155,21 @@ int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code)
{
s->next_packet = 0;
*code = -1;
+ DEBUG(("out xrdp_rdp_recv\n\r"));
return 0;
}
+ if (error != 0)
+ {
+ DEBUG(("out xrdp_rdp_recv error\n\r"));
+ return 1;
+ }
if (chan != MCS_GLOBAL_CHANNEL && chan > 0)
{
s->next_packet = 0;
*code = 0;
+ DEBUG(("out xrdp_rdp_recv\n\r"));
return 0;
}
- if (error != 0)
- {
- return 1;
- }
s->next_packet = s->p;
}
else
@@ -176,12 +181,14 @@ int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code)
{
s->next_packet += 8;
*code = 0;
+ DEBUG(("out xrdp_rdp_recv\n\r"));
return 0;
}
in_uint16_le(s, pdu_code);
*code = pdu_code & 0xf;
in_uint8s(s, 2); /* mcs user id */
s->next_packet += len;
+ DEBUG(("out xrdp_rdp_recv\n\r"));
return 0;
}
@@ -198,6 +205,7 @@ int xrdp_rdp_send(struct xrdp_rdp* self, struct stream* s, int pdu_type)
out_uint16_le(s, self->mcs_channel);
if (xrdp_sec_send(self->sec_layer, s, 0) != 0)
{
+ DEBUG(("out xrdp_rdp_send error\n\r"));
return 1;
}
DEBUG(("out xrdp_rdp_send\n\r"));
@@ -225,6 +233,7 @@ int xrdp_rdp_send_data(struct xrdp_rdp* self, struct stream* s,
out_uint16_le(s, 0);
if (xrdp_sec_send(self->sec_layer, s, 0) != 0)
{
+ DEBUG(("out xrdp_rdp_send_data error\n\r"));
return 1;
}
DEBUG(("out xrdp_rdp_send_data\n\r"));
@@ -441,6 +450,21 @@ int xrdp_process_capset_bmpcache(struct xrdp_rdp* self, struct stream* s,
}
/*****************************************************************************/
+int xrdp_process_capset_pointercache(struct xrdp_rdp* self, struct stream* s,
+ int len)
+{
+ int i;
+
+ //g_hexdump(s->p, len);
+ in_uint8s(s, 2); /* color pointer */
+ in_uint16_le(s, i);
+ i = MIN(i, 32);
+ self->client_info.pointer_cache_entries = i;
+ //g_printf("%d\n", self->client_info.pointer_cache_entries);
+ return 0;
+}
+
+/*****************************************************************************/
int xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s)
{
int cap_len;
@@ -469,6 +493,9 @@ int xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s)
case RDP_CAPSET_BMPCACHE:
xrdp_process_capset_bmpcache(self, s, len);
break;
+ case RDP_CAPSET_POINTER:
+ xrdp_process_capset_pointercache(self, s, len);
+ break;
}
s->p = p + len;
}
diff --git a/xrdp/xrdp_sec.c b/xrdp/xrdp_sec.c
index b5a69de9..f1982f5e 100644
--- a/xrdp/xrdp_sec.c
+++ b/xrdp/xrdp_sec.c
@@ -430,6 +430,7 @@ int xrdp_sec_recv(struct xrdp_sec* self, struct stream* s, int* chan)
DEBUG((" in xrdp_sec_recv\n\r"));
if (xrdp_mcs_recv(self->mcs_layer, s, chan) != 0)
{
+ DEBUG((" out xrdp_sec_recv error\n\r"));
return 1;
}
in_uint32_le(s, flags);
diff --git a/xrdp/xrdp_tcp.c b/xrdp/xrdp_tcp.c
index 479b3ae6..ed08aef7 100644
--- a/xrdp/xrdp_tcp.c
+++ b/xrdp/xrdp_tcp.c
@@ -54,12 +54,13 @@ int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len)
{
int rcvd;
- DEBUG((" in xrdp_tcp_recv, gota get %d bytes\n", len))
+ DEBUG((" in xrdp_tcp_recv, gota get %d bytes\n\r", len));
init_stream(s, len);
while (len > 0)
{
if (g_is_term())
{
+ DEBUG((" out xrdp_tcp_recv, g_is_term is true\n\r"));
return 1;
}
rcvd = g_tcp_recv(self->sck, s->end, len, 0);
@@ -71,13 +72,13 @@ int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len)
}
else
{
- DEBUG((" error = -1 in xrdp_tcp_recv socket %d\n", self->sck))
+ DEBUG((" error = -1 in xrdp_tcp_recv socket %d\n\r", self->sck));
return 1;
}
}
else if (rcvd == 0)
{
- DEBUG((" error = 0 in xrdp_tcp_recv socket %d\n", self->sck))
+ DEBUG((" error = 0 in xrdp_tcp_recv socket %d\n\r", self->sck));
return 1;
}
else
@@ -86,6 +87,7 @@ int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len)
len -= rcvd;
}
}
+ DEBUG((" out xrdp_tcp_recv\n\r"));
return 0;
}
diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h
index db61a603..03fa7a69 100644
--- a/xrdp/xrdp_types.h
+++ b/xrdp/xrdp_types.h
@@ -42,7 +42,7 @@ struct xrdp_mod
int srcx, int srcy);
int (*server_paint_rect)(struct xrdp_mod* v, int x, int y, int cx, int cy,
char* data);
- int (*server_set_cursor)(struct xrdp_mod* v, int x, int y, char* data, char* mask);
+ int (*server_set_pointer)(struct xrdp_mod* v, int x, int y, char* data, char* mask);
int (*server_palette)(struct xrdp_mod* v, int* palette);
int (*server_error_popup)(struct xrdp_mod* v, char* error, char* caption);
int d2[92];
@@ -181,6 +181,7 @@ struct xrdp_client_info
int cache2_size;
int cache3_entries;
int cache3_size;
+ int pointer_cache_entries;
int use_bitmap_comp;
int use_bitmap_cache;
int op1; /* use smaller bitmap header, todo */
@@ -314,17 +315,26 @@ struct xrdp_char_item
struct xrdp_font_item font_item;
};
+struct xrdp_pointer_item
+{
+ int stamp;
+ int x; /* hotspot */
+ int y;
+ char data[32 * 32 * 3];
+ char mask[32 * 32 / 8];
+};
+
/* differnce caches */
struct xrdp_cache
{
struct xrdp_wm* wm; /* owner */
struct xrdp_orders* orders;
+ /* palette */
int palette_stamp;
struct xrdp_palette_item palette_items[6];
+ /* bitmap */
int bitmap_stamp;
struct xrdp_bitmap_item bitmap_items[3][600];
- int char_stamp;
- struct xrdp_char_item char_items[12][256];
int use_bitmap_comp;
int cache1_entries;
int cache1_size;
@@ -332,6 +342,13 @@ struct xrdp_cache
int cache2_size;
int cache3_entries;
int cache3_size;
+ /* font */
+ int char_stamp;
+ struct xrdp_char_item char_items[12][256];
+ /* pointer */
+ int pointer_stamp;
+ struct xrdp_pointer_item pointer_items[32];
+ int pointer_cache_entries;
};
/* the window manager */
@@ -372,8 +389,8 @@ struct xrdp_wm
struct xrdp_bitmap* popup_wnd;
/* focused window */
struct xrdp_bitmap* focused_window;
- /* cursor */
- int current_cursor;
+ /* pointer */
+ int current_pointer;
int mouse_x;
int mouse_y;
/* keyboard info */
@@ -458,11 +475,11 @@ struct xrdp_bitmap
/* for all but bitmap */
int left;
int top;
- int cursor;
+ int pointer;
int bg_color;
int tab_stop;
int id;
- char caption[256];
+ char* caption1;
/* for window or screen */
struct xrdp_bitmap* modal_dialog;
struct xrdp_bitmap* focused_control;
diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c
index e776ef21..bd6e9e7e 100644
--- a/xrdp/xrdp_wm.c
+++ b/xrdp/xrdp_wm.c
@@ -299,23 +299,6 @@ int xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd)
return 0;
}
-/*****************************************************************************/
-int xrdp_set_cursor(struct xrdp_wm* self, int cache_idx)
-{
- struct stream* s;
-
- make_stream(s);
- init_stream(s, 8192);
- xrdp_rdp_init_data(self->rdp_layer, s);
- out_uint16_le(s, RDP_POINTER_CACHED);
- out_uint16_le(s, 0); /* pad */
- out_uint16_le(s, cache_idx); /* cache_idx */
- s_mark_end(s);
- xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER);
- free_stream(s);
- return 0;
-}
-
//******************************************************************************
int xrdp_wm_get_pixel(char* data, int x, int y, int width, int bpp)
{
@@ -347,7 +330,22 @@ int xrdp_wm_get_pixel(char* data, int x, int y, int width, int bpp)
}
/*****************************************************************************/
-int xrdp_wm_load_cursor(struct xrdp_wm* self, char* file_name, char* data,
+int xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y)
+{
+
+ struct xrdp_pointer_item pointer_item;
+
+ g_memset(&pointer_item, 0, sizeof(struct xrdp_pointer_item));
+ pointer_item.x = x;
+ pointer_item.y = y;
+ g_memcpy(pointer_item.data, data, 32 * 32 * 3);
+ g_memcpy(pointer_item.mask, mask, 32 * 32 / 8);
+ xrdp_cache_add_pointer(self->cache, &pointer_item);
+ return 0;
+}
+
+/*****************************************************************************/
+int xrdp_wm_load_pointer(struct xrdp_wm* self, char* file_name, char* data,
char* mask, int* x, int* y)
{
int fd;
@@ -419,7 +417,7 @@ int xrdp_wm_load_cursor(struct xrdp_wm* self, char* file_name, char* data,
}
/*****************************************************************************/
-int xrdp_wm_send_cursor(struct xrdp_wm* self, int cache_idx,
+int xrdp_wm_send_pointer(struct xrdp_wm* self, int cache_idx,
char* data, char* mask, int x, int y)
{
struct stream* s;
@@ -460,6 +458,24 @@ int xrdp_wm_send_cursor(struct xrdp_wm* self, int cache_idx,
}
/*****************************************************************************/
+int xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx)
+{
+ struct stream* s;
+
+ make_stream(s);
+ init_stream(s, 8192);
+ xrdp_rdp_init_data(self->rdp_layer, s);
+ out_uint16_le(s, RDP_POINTER_CACHED);
+ out_uint16_le(s, 0); /* pad */
+ out_uint16_le(s, cache_idx); /* cache_idx */
+ //g_printf("%d\n", cache_idx);
+ s_mark_end(s);
+ xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER);
+ free_stream(s);
+ return 0;
+}
+
+/*****************************************************************************/
int xrdp_wm_init(struct xrdp_wm* self)
{
#ifndef XRDP_LIB /* if lib, dodn't create login screen */
@@ -537,10 +553,10 @@ int xrdp_wm_init(struct xrdp_wm* self)
xrdp_wm_set_focused(self, self->login_window);
- xrdp_wm_load_cursor(self, "cursor1.cur", data, mask, &x, &y);
- xrdp_wm_send_cursor(self, 1, data, mask, x, y);
- xrdp_wm_load_cursor(self, "cursor0.cur", data, mask, &x, &y);
- xrdp_wm_send_cursor(self, 0, data, mask, x, y);
+ xrdp_wm_load_pointer(self, "cursor1.cur", data, mask, &x, &y);
+ xrdp_wm_send_pointer(self, 1, data, mask, x, y);
+ xrdp_wm_load_pointer(self, "cursor0.cur", data, mask, &x, &y);
+ xrdp_wm_send_pointer(self, 0, data, mask, x, y);
#endif
return 0;
}
@@ -850,10 +866,10 @@ int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y)
{
if (!self->dragging)
{
- if (b->cursor != self->current_cursor)
+ if (b->pointer != self->current_pointer)
{
- xrdp_set_cursor(self, b->cursor);
- self->current_cursor = b->cursor;
+ xrdp_wm_set_pointer(self, b->pointer);
+ self->current_pointer = b->pointer;
}
xrdp_bitmap_def_proc(b, WM_MOUSEMOVE,
xrdp_bitmap_from_screenx(b, x),