summaryrefslogtreecommitdiffstats
path: root/xrdp
diff options
context:
space:
mode:
authorjsorg71 <jsorg71>2005-08-24 01:09:33 +0000
committerjsorg71 <jsorg71>2005-08-24 01:09:33 +0000
commit7d891a1bde2f8287f333fda9acc88310d783da73 (patch)
tree5202a565b2bee120ed075a0cac95221b3f1e0427 /xrdp
parent1881c8b1b847ef0de1c42f635ee9e10b99b5863e (diff)
downloadxrdp-proprietary-7d891a1bde2f8287f333fda9acc88310d783da73.tar.gz
xrdp-proprietary-7d891a1bde2f8287f333fda9acc88310d783da73.zip
added server_reset(which uses demand_active) for resizing the rdp client
Diffstat (limited to 'xrdp')
-rw-r--r--xrdp/xrdp.h11
-rw-r--r--xrdp/xrdp_bitmap.c13
-rw-r--r--xrdp/xrdp_cache.c48
-rw-r--r--xrdp/xrdp_interface.c39
-rw-r--r--xrdp/xrdp_login_wnd.c1
-rw-r--r--xrdp/xrdp_types.h1
-rw-r--r--xrdp/xrdp_wm.c23
7 files changed, 126 insertions, 10 deletions
diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h
index 18850579..5f76af0d 100644
--- a/xrdp/xrdp.h
+++ b/xrdp/xrdp.h
@@ -55,6 +55,9 @@ xrdp_cache_create(struct xrdp_wm* owner, struct xrdp_session* session,
void APP_CC
xrdp_cache_delete(struct xrdp_cache* self);
int APP_CC
+xrdp_cache_reset(struct xrdp_cache* self,
+ struct xrdp_client_info* client_info);
+int APP_CC
xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap);
int APP_CC
xrdp_cache_add_palette(struct xrdp_cache* self, int* palette);
@@ -78,6 +81,10 @@ xrdp_wm_delete(struct xrdp_wm* self);
int APP_CC
xrdp_wm_send_palette(struct xrdp_wm* self);
int APP_CC
+xrdp_wm_load_static_colors(struct xrdp_wm* self);
+int APP_CC
+xrdp_wm_load_static_pointers(struct xrdp_wm* self);
+int APP_CC
xrdp_wm_init(struct xrdp_wm* self);
int APP_CC
xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap,
@@ -160,6 +167,8 @@ xrdp_bitmap_get_child_by_id(struct xrdp_bitmap* self, int id);
int APP_CC
xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused);
int APP_CC
+xrdp_bitmap_resize(struct xrdp_bitmap* self, int width, int height);
+int APP_CC
xrdp_bitmap_load(struct xrdp_bitmap* self, char* filename, int* palette);
int APP_CC
xrdp_bitmap_get_pixel(struct xrdp_bitmap* self, int x, int y);
@@ -343,3 +352,5 @@ server_draw_text(struct xrdp_mod* mod, int font,
int box_left, int box_top,
int box_right, int box_bottom,
int x, int y, char* data, int data_len);
+int DEFAULT_CC
+server_reset(struct xrdp_mod* mod, int width, int height, int bpp);
diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c
index bc1a2c46..17d38f01 100644
--- a/xrdp/xrdp_bitmap.c
+++ b/xrdp/xrdp_bitmap.c
@@ -98,7 +98,7 @@ xrdp_bitmap_create(int width, int height, int bpp,
case 15: Bpp = 2; break;
case 16: Bpp = 2; break;
}
- if (self->type == WND_TYPE_SCREEN || self->type == WND_TYPE_BITMAP)
+ if (self->type == WND_TYPE_BITMAP || self->type == WND_TYPE_IMAGE)
{
self->data = (char*)g_malloc(width * height * Bpp, 0);
}
@@ -303,7 +303,10 @@ xrdp_bitmap_resize(struct xrdp_bitmap* self, int width, int height)
{
int Bpp;
- g_free(self->data);
+ if (width == self->width && height == self->height)
+ {
+ return 0;
+ }
self->width = width;
self->height = height;
Bpp = 4;
@@ -313,7 +316,11 @@ xrdp_bitmap_resize(struct xrdp_bitmap* self, int width, int height)
case 15: Bpp = 2; break;
case 16: Bpp = 2; break;
}
- self->data = (char*)g_malloc(width * height * Bpp, 1);
+ if (self->data != 0)
+ {
+ g_free(self->data);
+ self->data = (char*)g_malloc(width * height * Bpp, 1);
+ }
self->line_size = width * Bpp;
return 0;
}
diff --git a/xrdp/xrdp_cache.c b/xrdp/xrdp_cache.c
index 99cc8f31..57ec1f72 100644
--- a/xrdp/xrdp_cache.c
+++ b/xrdp/xrdp_cache.c
@@ -75,6 +75,51 @@ xrdp_cache_delete(struct xrdp_cache* self)
}
/*****************************************************************************/
+int APP_CC
+xrdp_cache_reset(struct xrdp_cache* self,
+ struct xrdp_client_info* client_info)
+{
+ struct xrdp_wm* wm;
+ struct xrdp_session* session;
+ int i;
+ int j;
+
+ /* free all the cached bitmaps */
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 600; j++)
+ {
+ xrdp_bitmap_delete(self->bitmap_items[i][j].bitmap);
+ }
+ }
+ /* free all the cached font items */
+ for (i = 0; i < 12; i++)
+ {
+ for (j = 0; j < 256; j++)
+ {
+ g_free(self->char_items[i][j].font_item.data);
+ }
+ }
+ /* save these */
+ wm = self->wm;
+ session = self->session;
+ /* set whole struct to zero */
+ g_memset(self, 0, sizeof(struct xrdp_cache));
+ /* set some stuff back */
+ self->wm = wm;
+ self->session = session;
+ self->use_bitmap_comp = client_info->use_bitmap_comp;
+ self->cache1_entries = client_info->cache1_entries;
+ self->cache1_size = client_info->cache1_size;
+ self->cache2_entries = client_info->cache2_entries;
+ 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 0;
+}
+
+/*****************************************************************************/
/* returns cache id */
int APP_CC
xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap)
@@ -110,7 +155,6 @@ xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap)
{
self->bitmap_items[i][j].stamp = self->bitmap_stamp;
DEBUG(("found bitmap at %d %d\n\r", i, j));
- //g_printf("found bitmap at %d %d\n\r", i, j);
xrdp_bitmap_delete(bitmap);
return MAKELONG(i, j);
}
@@ -129,7 +173,6 @@ xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap)
{
self->bitmap_items[i][j].stamp = self->bitmap_stamp;
DEBUG(("found bitmap at %d %d\n\r", i, j));
- //g_printf("found bitmap at %d %d\n\r", i, j);
xrdp_bitmap_delete(bitmap);
return MAKELONG(i, j);
}
@@ -148,7 +191,6 @@ xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap)
{
self->bitmap_items[i][j].stamp = self->bitmap_stamp;
DEBUG(("found bitmap at %d %d\n\r", i, j));
- //g_printf("found bitmap at %d %d\n\r", i, j);
xrdp_bitmap_delete(bitmap);
return MAKELONG(i, j);
}
diff --git a/xrdp/xrdp_interface.c b/xrdp/xrdp_interface.c
index b7cd1760..0d1264b8 100644
--- a/xrdp/xrdp_interface.c
+++ b/xrdp/xrdp_interface.c
@@ -372,3 +372,42 @@ server_draw_text(struct xrdp_mod* mod, int font,
box_right, box_bottom,
x, y, data, data_len);
}
+
+/*****************************************************************************/
+int DEFAULT_CC
+server_reset(struct xrdp_mod* mod, int width, int height, int bpp)
+{
+ struct xrdp_wm* wm;
+
+ wm = (struct xrdp_wm*)mod->wm;
+ if (wm->client_info == 0)
+ {
+ return 1;
+ }
+ /* older client can't resize */
+ if (wm->client_info->build <= 419)
+ {
+ return 0;
+ }
+ /* if same, don't need to do anything */
+ if (wm->client_info->width == width &&
+ wm->client_info->height == height &&
+ wm->client_info->bpp == bpp)
+ {
+ return 0;
+ }
+ /* reset lib, client_info gets updated in libxrdp_reset */
+ if (libxrdp_reset(wm->session, width, height, bpp) != 0)
+ {
+ return 1;
+ }
+ /* reset cache */
+ xrdp_cache_reset(wm->cache, wm->client_info);
+ /* resize the main window */
+ xrdp_bitmap_resize(wm->screen, wm->client_info->width,
+ wm->client_info->height);
+ /* load some stuff */
+ xrdp_wm_load_static_colors(wm);
+ xrdp_wm_load_static_pointers(wm);
+ return 0;
+}
diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c
index c2c43d30..be2f6451 100644
--- a/xrdp/xrdp_login_wnd.c
+++ b/xrdp/xrdp_login_wnd.c
@@ -161,6 +161,7 @@ xrdp_wm_setup_mod(struct xrdp_wm* self,
self->mod->server_draw_line = server_draw_line;
self->mod->server_add_char = server_add_char;
self->mod->server_draw_text = server_draw_text;
+ self->mod->server_reset = server_reset;
}
}
/* id self->mod is null, there must be a problem */
diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h
index 2821c257..c0f04e62 100644
--- a/xrdp/xrdp_types.h
+++ b/xrdp/xrdp_types.h
@@ -64,6 +64,7 @@ struct xrdp_mod
int box_left, int box_top,
int box_right, int box_bottom,
int x, int y, char* data, int data_len);
+ int (*server_reset)(struct xrdp_mod* v, int width, int height, int bpp);
/* common */
long handle; /* pointer to self as int */
long wm; /* struct xrdp_wm* */
diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c
index 50f7caf3..fdd5a6c7 100644
--- a/xrdp/xrdp_wm.c
+++ b/xrdp/xrdp_wm.c
@@ -268,12 +268,11 @@ xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx)
/*****************************************************************************/
int APP_CC
-xrdp_wm_init(struct xrdp_wm* self)
+xrdp_wm_load_static_colors(struct xrdp_wm* self)
{
int bindex;
int gindex;
int rindex;
- struct xrdp_pointer_item pointer_item;
if (self->screen->bpp == 8)
{
@@ -334,6 +333,15 @@ xrdp_wm_init(struct xrdp_wm* self)
self->red = COLOR24(0xff, 0x00, 0x00);
self->green = COLOR24(0x00, 0xff, 0x00);
}
+ return 0;
+}
+
+/*****************************************************************************/
+int APP_CC
+xrdp_wm_load_static_pointers(struct xrdp_wm* self)
+{
+ struct xrdp_pointer_item pointer_item;
+
DEBUG(("sending cursor\n\r"));
xrdp_wm_load_pointer(self, "cursor1.cur", pointer_item.data,
pointer_item.mask, &pointer_item.x, &pointer_item.y);
@@ -342,13 +350,20 @@ xrdp_wm_init(struct xrdp_wm* self)
xrdp_wm_load_pointer(self, "cursor0.cur", pointer_item.data,
pointer_item.mask, &pointer_item.x, &pointer_item.y);
xrdp_cache_add_pointer_static(self->cache, &pointer_item, 0);
+ return 0;
+}
+
+/*****************************************************************************/
+int APP_CC
+xrdp_wm_init(struct xrdp_wm* self)
+{
+ xrdp_wm_load_static_colors(self);
+ xrdp_wm_load_static_pointers(self);
xrdp_login_wnd_create(self);
/* clear screen */
self->screen->bg_color = self->black;
xrdp_bitmap_invalidate(self->screen, 0);
-
xrdp_wm_set_focused(self, self->login_window);
-
return 0;
}