summaryrefslogtreecommitdiffstats
path: root/xup/xup.c
diff options
context:
space:
mode:
Diffstat (limited to 'xup/xup.c')
-rw-r--r--xup/xup.c961
1 files changed, 704 insertions, 257 deletions
diff --git a/xup/xup.c b/xup/xup.c
index 7ff5e5e8..773f3da1 100644
--- a/xup/xup.c
+++ b/xup/xup.c
@@ -21,9 +21,6 @@
#include "xup.h"
#include "log.h"
-#include <sys/ipc.h>
-#include <sys/shm.h>
-
#define LOG_LEVEL 1
#define LLOG(_level, _args) \
do { if (_level < LOG_LEVEL) { g_write _args ; } } while (0)
@@ -226,7 +223,7 @@ lib_mod_connect(struct mod *mod)
g_tcp_set_no_delay(mod->sck);
}
- mod->server_msg(mod, "connecting...", 0);
+ /* mod->server_msg(mod, "connecting...", 0); */
if (use_uds)
{
@@ -258,7 +255,7 @@ lib_mod_connect(struct mod *mod)
}
else
{
- mod->server_msg(mod, "connect error", 0);
+ /* mod->server_msg(mod, "connect error", 0); */
}
}
@@ -271,13 +268,13 @@ lib_mod_connect(struct mod *mod)
mod->sck = 0;
i++;
- if (i >= 4)
+ if (i >= 60)
{
mod->server_msg(mod, "connection problem, giving up", 0);
break;
}
- g_sleep(250);
+ g_sleep(500);
}
if (error == 0)
@@ -438,6 +435,287 @@ lib_mod_event(struct mod *mod, int msg, tbus param1, tbus param2,
/******************************************************************************/
/* return error */
static int APP_CC
+process_server_fill_rect(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int x;
+ int y;
+ int cx;
+ int cy;
+
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ rv = mod->server_fill_rect(mod, x, y, cx, cy);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_screen_blt(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int srcx;
+ int srcy;
+
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ rv = mod->server_screen_blt(mod, x, y, cx, cy, srcx, srcy);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_paint_rect(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int len_bmpdata;
+ char *bmpdata;
+ int width;
+ int height;
+ int srcx;
+ int srcy;
+
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_uint32_le(s, len_bmpdata);
+ in_uint8p(s, bmpdata, len_bmpdata);
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ rv = mod->server_paint_rect(mod, x, y, cx, cy,
+ bmpdata, width, height,
+ srcx, srcy);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_set_clip(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int x;
+ int y;
+ int cx;
+ int cy;
+
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ rv = mod->server_set_clip(mod, x, y, cx, cy);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_reset_clip(struct mod *mod, struct stream *s)
+{
+ int rv;
+
+ rv = mod->server_reset_clip(mod);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_set_fgcolor(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int fgcolor;
+
+ in_uint32_le(s, fgcolor);
+ rv = mod->server_set_fgcolor(mod, fgcolor);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_set_bgcolor(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int bgcolor;
+
+ in_uint32_le(s, bgcolor);
+ rv = mod->server_set_bgcolor(mod, bgcolor);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_set_opcode(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int opcode;
+
+ in_uint16_le(s, opcode);
+ rv = mod->server_set_opcode(mod, opcode);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_set_pen(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int style;
+ int width;
+
+ in_uint16_le(s, style);
+ in_uint16_le(s, width);
+ rv = mod->server_set_pen(mod, style, width);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_draw_line(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int x1;
+ int y1;
+ int x2;
+ int y2;
+
+ in_sint16_le(s, x1);
+ in_sint16_le(s, y1);
+ in_sint16_le(s, x2);
+ in_sint16_le(s, y2);
+ rv = mod->server_draw_line(mod, x1, y1, x2, y2);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_set_cursor(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int x;
+ int y;
+ char cur_data[32 * (32 * 3)];
+ char cur_mask[32 * (32 / 8)];
+
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint8a(s, cur_data, 32 * (32 * 3));
+ in_uint8a(s, cur_mask, 32 * (32 / 8));
+ rv = mod->server_set_cursor(mod, x, y, cur_data, cur_mask);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_create_os_surface(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int rdpid;
+ int width;
+ int height;
+
+ in_uint32_le(s, rdpid);
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+ rv = mod->server_create_os_surface(mod, rdpid, width, height);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_switch_os_surface(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int rdpid;
+
+ in_uint32_le(s, rdpid);
+ rv = mod->server_switch_os_surface(mod, rdpid);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_delete_os_surface(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int rdpid;
+
+ in_uint32_le(s, rdpid);
+ rv = mod->server_delete_os_surface(mod, rdpid);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_paint_rect_os(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int rdpid;
+ int srcx;
+ int srcy;
+
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_uint32_le(s, rdpid);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ rv = mod->server_paint_rect_os(mod, x, y, cx, cy,
+ rdpid, srcx, srcy);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_set_hints(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int hints;
+ int mask;
+
+ in_uint32_le(s, hints);
+ in_uint32_le(s, mask);
+ rv = mod->server_set_hints(mod, hints, mask);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
process_server_window_new_update(struct mod *mod, struct stream *s)
{
int flags;
@@ -521,13 +799,27 @@ process_server_window_new_update(struct mod *mod, struct stream *s)
/******************************************************************************/
/* return error */
static int APP_CC
+process_server_window_delete(struct mod *mod, struct stream *s)
+{
+ int window_id;
+ int rv;
+
+ in_uint32_le(s, window_id);
+ mod->server_window_delete(mod, window_id);
+ rv = 0;
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
process_server_window_show(struct mod* mod, struct stream* s)
{
int window_id;
int rv;
int flags;
struct rail_window_state_order rwso;
-
+
g_memset(&rwso, 0, sizeof(rwso));
in_uint32_le(s, window_id);
in_uint32_le(s, flags);
@@ -540,14 +832,209 @@ process_server_window_show(struct mod* mod, struct stream* s)
/******************************************************************************/
/* return error */
static int APP_CC
-process_server_window_delete(struct mod *mod, struct stream *s)
+process_server_add_char(struct mod *mod, struct stream *s)
{
- int window_id;
int rv;
+ int font;
+ int charactor;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int len_bmpdata;
+ char *bmpdata;
- in_uint32_le(s, window_id);
- mod->server_window_delete(mod, window_id);
- rv = 0;
+ in_uint16_le(s, font);
+ in_uint16_le(s, charactor);
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_uint16_le(s, len_bmpdata);
+ in_uint8p(s, bmpdata, len_bmpdata);
+ rv = mod->server_add_char(mod, font, charactor, x, y, cx, cy, bmpdata);
+ return rv;
+}
+
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_add_char_alpha(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int font;
+ int charactor;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int len_bmpdata;
+ char *bmpdata;
+
+ in_uint16_le(s, font);
+ in_uint16_le(s, charactor);
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_uint16_le(s, len_bmpdata);
+ in_uint8p(s, bmpdata, len_bmpdata);
+ rv = mod->server_add_char_alpha(mod, font, charactor, x, y, cx, cy,
+ bmpdata);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_draw_text(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int font;
+ int flags;
+ int mixmode;
+ int clip_left;
+ int clip_top;
+ int clip_right;
+ int clip_bottom;
+ int box_left;
+ int box_top;
+ int box_right;
+ int box_bottom;
+ int x;
+ int y;
+ int len_bmpdata;
+ char *bmpdata;
+
+ in_uint16_le(s, font);
+ in_uint16_le(s, flags);
+ in_uint16_le(s, mixmode);
+ in_sint16_le(s, clip_left);
+ in_sint16_le(s, clip_top);
+ in_sint16_le(s, clip_right);
+ in_sint16_le(s, clip_bottom);
+ in_sint16_le(s, box_left);
+ in_sint16_le(s, box_top);
+ in_sint16_le(s, box_right);
+ in_sint16_le(s, box_bottom);
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, len_bmpdata);
+ in_uint8p(s, bmpdata, len_bmpdata);
+ rv = mod->server_draw_text(mod, font, flags, mixmode, clip_left, clip_top,
+ clip_right, clip_bottom, box_left, box_top,
+ box_right, box_bottom, x, y, bmpdata, len_bmpdata);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_create_os_surface_bpp(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int rdpid;
+ int width;
+ int height;
+ int bpp;
+
+ in_uint32_le(s, rdpid);
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+ in_uint8(s, bpp);
+ rv = mod->server_create_os_surface_bpp(mod, rdpid, width, height, bpp);
+ return rv;
+}
+
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_paint_rect_bpp(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int len_bmpdata;
+ char *bmpdata;
+ int width;
+ int height;
+ int srcx;
+ int srcy;
+ int bpp;
+
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_uint32_le(s, len_bmpdata);
+ in_uint8p(s, bmpdata, len_bmpdata);
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ in_uint8(s, bpp);
+ rv = mod->server_paint_rect_bpp(mod, x, y, cx, cy,
+ bmpdata, width, height,
+ srcx, srcy, bpp);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_composite(struct mod *mod, struct stream *s)
+{
+ int rv;
+ int srcidx;
+ int srcformat;
+ int srcwidth;
+ int srcrepeat;
+ int transform[10];
+ int mskflags;
+ int mskidx;
+ int mskformat;
+ int mskwidth;
+ int mskrepeat;
+ int op;
+ int srcx;
+ int srcy;
+ int mskx;
+ int msky;
+ int dstx;
+ int dsty;
+ int width;
+ int height;
+ int dstformat;
+
+ in_uint16_le(s, srcidx);
+ in_uint32_le(s, srcformat);
+ in_uint16_le(s, srcwidth);
+ in_uint8(s, srcrepeat);
+ g_memcpy(transform, s->p, 40);
+ in_uint8s(s, 40);
+ in_uint8(s, mskflags);
+ in_uint16_le(s, mskidx);
+ in_uint32_le(s, mskformat);
+ in_uint16_le(s, mskwidth);
+ in_uint8(s, mskrepeat);
+ in_uint8(s, op);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ in_sint16_le(s, mskx);
+ in_sint16_le(s, msky);
+ in_sint16_le(s, dstx);
+ in_sint16_le(s, dsty);
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+ in_uint32_le(s, dstformat);
+ rv = mod->server_composite(mod, srcidx, srcformat, srcwidth, srcrepeat,
+ transform, mskflags, mskidx, mskformat,
+ mskwidth, mskrepeat, op, srcx, srcy, mskx, msky,
+ dstx, dsty, width, height, dstformat);
return rv;
}
@@ -605,67 +1092,185 @@ send_paint_rect_ack(struct mod *mod, int flags, int x, int y, int cx, int cy,
/******************************************************************************/
/* return error */
static int APP_CC
-lib_mod_process_orders(struct mod *mod, int type, struct stream *s)
+process_server_paint_rect_shmem(struct mod *mod, struct stream *s)
{
int rv;
int x;
int y;
int cx;
int cy;
- int srcx;
- int srcy;
- int mskx;
- int msky;
- int dstx;
- int dsty;
- int len_bmpdata;
- int style;
- int x1;
- int y1;
- int x2;
- int y2;
- int bpp;
- int rdpid;
- int hints;
- int mask;
+ int flags;
+ int frame_id;
+ int shmem_id;
+ int shmem_offset;
int width;
int height;
- int fgcolor;
- int bgcolor;
- int opcode;
+ int srcx;
+ int srcy;
+ char *bmpdata;
+
+ in_sint16_le(s, x);
+ in_sint16_le(s, y);
+ in_uint16_le(s, cx);
+ in_uint16_le(s, cy);
+ in_uint32_le(s, flags);
+ in_uint32_le(s, frame_id);
+ in_uint32_le(s, shmem_id);
+ in_uint32_le(s, shmem_offset);
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+ in_sint16_le(s, srcx);
+ in_sint16_le(s, srcy);
+ bmpdata = 0;
+ if (flags == 0) /* screen */
+ {
+ if (mod->screen_shmem_id == 0)
+ {
+ mod->screen_shmem_id = shmem_id;
+ mod->screen_shmem_pixels = g_shmat(mod->screen_shmem_id);
+ }
+ if (mod->screen_shmem_pixels != 0)
+ {
+ bmpdata = mod->screen_shmem_pixels + shmem_offset;
+ }
+ }
+ if (bmpdata != 0)
+ {
+ rv = mod->server_paint_rect(mod, x, y, cx, cy,
+ bmpdata, width, height,
+ srcx, srcy);
+ }
+ else
+ {
+ rv = 1;
+ }
+ send_paint_rect_ack(mod, flags, x, y, cx, cy, frame_id);
+ return rv;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+send_paint_rect_ex_ack(struct mod *mod, int flags, int frame_id)
+{
+ int len;
+ struct stream *s;
+
+ make_stream(s);
+ init_stream(s, 8192);
+ s_push_layer(s, iso_hdr, 4);
+ out_uint16_le(s, 106);
+ out_uint32_le(s, flags);
+ out_uint32_le(s, frame_id);
+ s_mark_end(s);
+ len = (int)(s->end - s->data);
+ s_pop_layer(s, iso_hdr);
+ out_uint32_le(s, len);
+ lib_send(mod, s->data, len);
+ free_stream(s);
+ return 0;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+process_server_paint_rect_shmem_ex(struct mod *amod, struct stream *s)
+{
+ int num_drects;
+ int num_crects;
int flags;
+ int frame_id;
int shmem_id;
int shmem_offset;
- int frame_id;
- int charactor;
- int font;
- int mixmode;
- int clip_left;
- int clip_top;
- int clip_right;
- int clip_bottom;
- int box_left;
- int box_top;
- int box_right;
- int box_bottom;
- int srcrepeat;
- int srcidx;
- int srcformat;
- int srcwidth;
- int mskflags;
- int mskidx;
- int mskformat;
- int mskwidth;
- int mskrepeat;
- int dstformat;
- int op;
- int transform[10];
+ int width;
+ int height;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ int index;
+ int rv;
+ tsi16 *ldrects;
+ tsi16 *ldrects1;
+ tsi16 *lcrects;
+ tsi16 *lcrects1;
char *bmpdata;
- char cur_data[32 * (32 * 3)];
- char cur_mask[32 * (32 / 8)];
- rv = 0;
+ /* dirty pixels */
+ in_uint16_le(s, num_drects);
+ ldrects = (tsi16 *) g_malloc(2 * 4 * num_drects, 0);
+ ldrects1 = ldrects;
+ for (index = 0; index < num_drects; index++)
+ {
+ in_sint16_le(s, ldrects1[0]);
+ in_sint16_le(s, ldrects1[1]);
+ in_sint16_le(s, ldrects1[2]);
+ in_sint16_le(s, ldrects1[3]);
+ ldrects1 += 4;
+ }
+
+ /* copied pixels */
+ in_uint16_le(s, num_crects);
+ lcrects = (tsi16 *) g_malloc(2 * 4 * num_crects, 0);
+ lcrects1 = lcrects;
+ for (index = 0; index < num_crects; index++)
+ {
+ in_sint16_le(s, lcrects1[0]);
+ in_sint16_le(s, lcrects1[1]);
+ in_sint16_le(s, lcrects1[2]);
+ in_sint16_le(s, lcrects1[3]);
+ lcrects1 += 4;
+ }
+
+ in_uint32_le(s, flags);
+ in_uint32_le(s, frame_id);
+ in_uint32_le(s, shmem_id);
+ in_uint32_le(s, shmem_offset);
+
+ in_uint16_le(s, width);
+ in_uint16_le(s, height);
+
+ bmpdata = 0;
+ if (flags == 0) /* screen */
+ {
+ if (amod->screen_shmem_id == 0)
+ {
+ amod->screen_shmem_id = shmem_id;
+ amod->screen_shmem_pixels = g_shmat(amod->screen_shmem_id);
+ }
+ if (amod->screen_shmem_pixels != 0)
+ {
+ bmpdata = amod->screen_shmem_pixels + shmem_offset;
+ }
+ }
+ if (bmpdata != 0)
+ {
+ rv = amod->server_paint_rects(amod, num_drects, ldrects,
+ num_crects, lcrects,
+ bmpdata, width, height, 0);
+ }
+ else
+ {
+ rv = 1;
+ }
+
+ send_paint_rect_ex_ack(amod, flags, frame_id);
+
+ g_free(lcrects);
+ g_free(ldrects);
+
+ return 0;
+}
+
+/******************************************************************************/
+/* return error */
+static int APP_CC
+lib_mod_process_orders(struct mod *mod, int type, struct stream *s)
+{
+ int rv;
+
+ rv = 0;
switch (type)
{
case 1: /* server_begin_update */
@@ -675,106 +1280,52 @@ lib_mod_process_orders(struct mod *mod, int type, struct stream *s)
rv = mod->server_end_update(mod);
break;
case 3: /* server_fill_rect */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- rv = mod->server_fill_rect(mod, x, y, cx, cy);
+ rv = process_server_fill_rect(mod, s);
break;
case 4: /* server_screen_blt */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- rv = mod->server_screen_blt(mod, x, y, cx, cy, srcx, srcy);
+ rv = process_server_screen_blt(mod, s);
break;
case 5: /* server_paint_rect */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_uint32_le(s, len_bmpdata);
- in_uint8p(s, bmpdata, len_bmpdata);
- in_uint16_le(s, width);
- in_uint16_le(s, height);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- rv = mod->server_paint_rect(mod, x, y, cx, cy,
- bmpdata, width, height,
- srcx, srcy);
+ rv = process_server_paint_rect(mod, s);
break;
case 10: /* server_set_clip */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- rv = mod->server_set_clip(mod, x, y, cx, cy);
+ rv = process_server_set_clip(mod, s);
break;
case 11: /* server_reset_clip */
- rv = mod->server_reset_clip(mod);
+ rv = process_server_reset_clip(mod, s);
break;
case 12: /* server_set_fgcolor */
- in_uint32_le(s, fgcolor);
- rv = mod->server_set_fgcolor(mod, fgcolor);
+ rv = process_server_set_fgcolor(mod, s);
break;
case 13: /* server_set_bgcolor */
- in_uint32_le(s, bgcolor);
- rv = mod->server_set_bgcolor(mod, bgcolor);
+ rv = process_server_set_bgcolor(mod, s);
break;
- case 14:
- in_uint16_le(s, opcode);
- rv = mod->server_set_opcode(mod, opcode);
+ case 14: /* server_set_opcode */
+ rv = process_server_set_opcode(mod, s);
break;
- case 17:
- in_uint16_le(s, style);
- in_uint16_le(s, width);
- rv = mod->server_set_pen(mod, style, width);
+ case 17: /* server_set_pen */
+ rv = process_server_set_pen(mod, s);
break;
- case 18:
- in_sint16_le(s, x1);
- in_sint16_le(s, y1);
- in_sint16_le(s, x2);
- in_sint16_le(s, y2);
- rv = mod->server_draw_line(mod, x1, y1, x2, y2);
+ case 18: /* server_draw_line */
+ rv = process_server_draw_line(mod, s);
break;
- case 19:
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint8a(s, cur_data, 32 * (32 * 3));
- in_uint8a(s, cur_mask, 32 * (32 / 8));
- rv = mod->server_set_cursor(mod, x, y, cur_data, cur_mask);
+ case 19: /* server_set_cursor */
+ rv = process_server_set_cursor(mod, s);
break;
- case 20:
- in_uint32_le(s, rdpid);
- in_uint16_le(s, width);
- in_uint16_le(s, height);
- rv = mod->server_create_os_surface(mod, rdpid, width, height);
+ case 20: /* server_create_os_surface */
+ rv = process_server_create_os_surface(mod, s);
break;
- case 21:
- in_uint32_le(s, rdpid);
- rv = mod->server_switch_os_surface(mod, rdpid);
+ case 21: /* server_switch_os_surface */
+ rv = process_server_switch_os_surface(mod, s);
break;
- case 22:
- in_uint32_le(s, rdpid);
- rv = mod->server_delete_os_surface(mod, rdpid);
+ case 22: /* server_delete_os_surface */
+ rv = process_server_delete_os_surface(mod, s);
break;
case 23: /* server_paint_rect_os */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_uint32_le(s, rdpid);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- rv = mod->server_paint_rect_os(mod, x, y, cx, cy,
- rdpid, srcx, srcy);
+ rv = process_server_paint_rect_os(mod, s);
break;
case 24: /* server_set_hints */
- in_uint32_le(s, hints);
- in_uint32_le(s, mask);
- rv = mod->server_set_hints(mod, hints, mask);
+ rv = process_server_set_hints(mod, s);
break;
case 25: /* server_window_new_update */
rv = process_server_window_new_update(mod, s);
@@ -786,149 +1337,40 @@ lib_mod_process_orders(struct mod *mod, int type, struct stream *s)
rv = process_server_window_show(mod, s);
break;
case 28: /* server_add_char */
- in_uint16_le(s, font);
- in_uint16_le(s, charactor);
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_uint16_le(s, len_bmpdata);
- in_uint8p(s, bmpdata, len_bmpdata);
- rv = mod->server_add_char(mod, font, charactor, x, y, cx, cy, bmpdata);
+ rv = process_server_add_char(mod, s);
break;
case 29: /* server_add_char_alpha */
- in_uint16_le(s, font);
- in_uint16_le(s, charactor);
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_uint16_le(s, len_bmpdata);
- in_uint8p(s, bmpdata, len_bmpdata);
- rv = mod->server_add_char_alpha(mod, font, charactor, x, y, cx, cy, bmpdata);
+ rv = process_server_add_char_alpha(mod, s);
break;
case 30: /* server_draw_text */
- in_uint16_le(s, font);
- in_uint16_le(s, flags);
- in_uint16_le(s, mixmode);
- in_sint16_le(s, clip_left);
- in_sint16_le(s, clip_top);
- in_sint16_le(s, clip_right);
- in_sint16_le(s, clip_bottom);
- in_sint16_le(s, box_left);
- in_sint16_le(s, box_top);
- in_sint16_le(s, box_right);
- in_sint16_le(s, box_bottom);
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, len_bmpdata);
- in_uint8p(s, bmpdata, len_bmpdata);
- rv = mod->server_draw_text(mod, font, flags, mixmode, clip_left, clip_top,
- clip_right, clip_bottom, box_left, box_top,
- box_right, box_bottom, x, y, bmpdata, len_bmpdata);
+ rv = process_server_draw_text(mod, s);
break;
case 31: /* server_create_os_surface_bpp */
- in_uint32_le(s, rdpid);
- in_uint16_le(s, width);
- in_uint16_le(s, height);
- in_uint8(s, bpp);
- rv = mod->server_create_os_surface_bpp(mod, rdpid, width, height, bpp);
+ rv = process_server_create_os_surface_bpp(mod, s);
break;
case 32: /* server_paint_rect_bpp */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_uint32_le(s, len_bmpdata);
- in_uint8p(s, bmpdata, len_bmpdata);
- in_uint16_le(s, width);
- in_uint16_le(s, height);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- in_uint8(s, bpp);
- rv = mod->server_paint_rect_bpp(mod, x, y, cx, cy,
- bmpdata, width, height,
- srcx, srcy, bpp);
+ rv = process_server_paint_rect_bpp(mod, s);
break;
- case 33:
- in_uint16_le(s, srcidx);
- in_uint32_le(s, srcformat);
- in_uint16_le(s, srcwidth);
- in_uint8(s, srcrepeat);
- g_memcpy(transform, s->p, 40);
- in_uint8s(s, 40);
- in_uint8(s, mskflags);
- in_uint16_le(s, mskidx);
- in_uint32_le(s, mskformat);
- in_uint16_le(s, mskwidth);
- in_uint8(s, mskrepeat);
- in_uint8(s, op);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- in_sint16_le(s, mskx);
- in_sint16_le(s, msky);
- in_sint16_le(s, dstx);
- in_sint16_le(s, dsty);
- in_uint16_le(s, width);
- in_uint16_le(s, height);
- in_uint32_le(s, dstformat);
- rv = mod->server_composite(mod, srcidx, srcformat, srcwidth, srcrepeat,
- transform, mskflags, mskidx, mskformat,
- mskwidth, mskrepeat, op, srcx, srcy, mskx, msky,
- dstx, dsty, width, height, dstformat);
+ case 33: /* server_composite */
+ rv = process_server_composite(mod, s);
break;
case 51: /* server_set_pointer_ex */
rv = process_server_set_pointer_ex(mod, s);
break;
case 60: /* server_paint_rect_shmem */
- in_sint16_le(s, x);
- in_sint16_le(s, y);
- in_uint16_le(s, cx);
- in_uint16_le(s, cy);
- in_uint32_le(s, flags);
- in_uint32_le(s, frame_id);
- in_uint32_le(s, shmem_id);
- in_uint32_le(s, shmem_offset);
- in_uint16_le(s, width);
- in_uint16_le(s, height);
- in_sint16_le(s, srcx);
- in_sint16_le(s, srcy);
- bmpdata = 0;
- if (flags == 0) /* screen */
- {
- if (mod->screen_shmem_id == 0)
- {
- mod->screen_shmem_id = shmem_id;
- mod->screen_shmem_pixels = shmat(mod->screen_shmem_id, 0, 0);
- }
- if (mod->screen_shmem_pixels != 0)
- {
- bmpdata = mod->screen_shmem_pixels + shmem_offset;
- }
- }
- if (bmpdata != 0)
- {
- rv = mod->server_paint_rect(mod, x, y, cx, cy,
- bmpdata, width, height,
- srcx, srcy);
- }
- else
- {
- rv = 1;
- }
- send_paint_rect_ack(mod, flags, x, y, cx, cy, frame_id);
+ rv = process_server_paint_rect_shmem(mod, s);
+ break;
+ case 61: /* server_paint_rect_shmem_ex */
+ rv = process_server_paint_rect_shmem_ex(mod, s);
break;
-
default:
g_writeln("lib_mod_process_orders: unknown order type %d", type);
rv = 0;
break;
}
-
return rv;
}
-
/******************************************************************************/
/* return error */
static int APP_CC
@@ -1062,6 +1504,11 @@ lib_mod_signal(struct mod *mod)
int DEFAULT_CC
lib_mod_end(struct mod *mod)
{
+ if (mod->screen_shmem_pixels != 0)
+ {
+ g_shmdt(mod->screen_shmem_pixels);
+ mod->screen_shmem_pixels = 0;
+ }
return 0;
}