diff --git a/freerdp/xrdp-freerdp.c b/freerdp/xrdp-freerdp.c index c3dbe745..55487962 100644 --- a/freerdp/xrdp-freerdp.c +++ b/freerdp/xrdp-freerdp.c @@ -22,62 +22,152 @@ #include "xrdp-freerdp.h" +#define GET_MOD(_inst) ((struct mod*)((_inst)->param1)) +#define SET_MOD(_inst, _mod) ((_inst)->param1) = _mod + +struct my_bitmap +{ + char* data; + int width; + int height; + int bpp; +}; + +struct my_glyph +{ + char* data; + int width; + int height; +}; + /*****************************************************************************/ /* return error */ -int DEFAULT_CC +static int DEFAULT_CC lib_mod_start(struct mod* mod, int w, int h, int bpp) { LIB_DEBUG(mod, "in lib_mod_start"); + g_writeln("lib_mod_start: w %d h %d bpp %d", w, h, bpp); mod->width = w; mod->height = h; mod->bpp = bpp; + mod->settings->server_depth = mod->bpp; + mod->settings->width = mod->width; + mod->settings->height = mod->height; LIB_DEBUG(mod, "out lib_mod_start"); return 0; } /******************************************************************************/ /* return error */ -int DEFAULT_CC +static int DEFAULT_CC lib_mod_connect(struct mod* mod) { + int code; + LIB_DEBUG(mod, "in lib_mod_connect"); - mod->inst->rdp_connect(mod->inst); + code = mod->inst->rdp_connect(mod->inst); + g_writeln("lib_mod_connect: code %d", code); LIB_DEBUG(mod, "out lib_mod_connect"); - return 0; + return code; } /******************************************************************************/ /* return error */ -int DEFAULT_CC +static int DEFAULT_CC lib_mod_event(struct mod* mod, int msg, long param1, long param2, long param3, long param4) { LIB_DEBUG(mod, "in lib_mod_event"); + switch (msg) + { + case 15: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_SCANCODE, + param4, param3, 0); + break; + case 16: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_SCANCODE, + param4, param3, 0); + break; + case 17: + mod->inst->rdp_sync_input(mod->inst, param4); + break; + case 100: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, MOUSE_FLAG_MOVE, + param1, param2); + break; + case 101: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON1, param1, param2); + break; + case 102: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON1 | MOUSE_FLAG_DOWN, + param1, param2); + break; + case 103: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON2, param1, param2); + break; + case 104: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON2 | MOUSE_FLAG_DOWN, + param1, param2); + break; + case 105: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON3, param1, param2); + break; + case 106: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON3 | MOUSE_FLAG_DOWN, + param1, param2); + break; + case 107: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON4, param1, param2); + break; + case 108: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON4 | MOUSE_FLAG_DOWN, + param1, param2); + break; + case 109: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON5, param1, param2); + break; + case 110: + mod->inst->rdp_send_input(mod->inst, RDP_INPUT_MOUSE, + MOUSE_FLAG_BUTTON5 | MOUSE_FLAG_DOWN, + param1, param2); + break; + } LIB_DEBUG(mod, "out lib_mod_event"); return 0; } /******************************************************************************/ /* return error */ -int DEFAULT_CC +static int DEFAULT_CC lib_mod_signal(struct mod* mod) { LIB_DEBUG(mod, "in lib_mod_signal"); + g_writeln("lib_mod_signal:"); LIB_DEBUG(mod, "out lib_mod_signal"); return 0; } /******************************************************************************/ /* return error */ -int DEFAULT_CC +static int DEFAULT_CC lib_mod_end(struct mod* mod) { + g_writeln("lib_mod_end:"); return 0; } /******************************************************************************/ /* return error */ -int DEFAULT_CC +static int DEFAULT_CC lib_mod_set_param(struct mod* mod, char* name, char* value) { g_writeln("lib_mod_set_param: name [%s] value [%s]", name, value); @@ -111,322 +201,442 @@ lib_mod_set_param(struct mod* mod, char* name, char* value) } /******************************************************************************/ -void DEFAULT_CC -ui_error(rdpInst * inst, const char * text) +static int DEFAULT_CC +mod_session_change(struct mod* v, int a, int b) { - g_writeln("ui_error:"); + g_writeln("mod_session_change:"); + return 0; } /******************************************************************************/ -void DEFAULT_CC -ui_warning(rdpInst * inst, const char * text) +static int DEFAULT_CC +mod_get_wait_objs(struct mod* v, tbus* read_objs, int* rcount, + tbus* write_objs, int* wcount, int* timeout) { - g_writeln("ui_warning:"); + void** rfds; + void** wfds; + + rfds = (void**)read_objs; + wfds = (void**)write_objs; + return v->inst->rdp_get_fds(v->inst, rfds, rcount, wfds, wcount); } /******************************************************************************/ -void DEFAULT_CC -ui_unimpl(rdpInst * inst, const char * text) +static int DEFAULT_CC +mod_check_wait_objs(struct mod* v) { - g_writeln("ui_unimpl:"); + return v->inst->rdp_check_fds(v->inst); } /******************************************************************************/ -void DEFAULT_CC -ui_begin_update(rdpInst * inst) +static void DEFAULT_CC +ui_error(rdpInst* inst, const char* text) { - g_writeln("ui_begin_update:"); + g_writeln("ui_error: %s", text); } /******************************************************************************/ -void DEFAULT_CC -ui_end_update(rdpInst * inst) +static void DEFAULT_CC +ui_warning(rdpInst* inst, const char* text) { - g_writeln("ui_end_update:"); + g_writeln("ui_warning: %s", text); } /******************************************************************************/ -void DEFAULT_CC -ui_desktop_save(rdpInst * inst, int offset, int x, int y, - int cx, int cy) +static void DEFAULT_CC +ui_unimpl(rdpInst* inst, const char* text) +{ + g_writeln("ui_unimpl: %s", text); +} + +/******************************************************************************/ +static void DEFAULT_CC +ui_begin_update(rdpInst* inst) +{ + struct mod* mod; + + mod = GET_MOD(inst); + mod->server_begin_update(mod); +} + +/******************************************************************************/ +static void DEFAULT_CC +ui_end_update(rdpInst* inst) +{ + struct mod* mod; + + mod = GET_MOD(inst); + mod->server_end_update(mod); +} + +/******************************************************************************/ +static void DEFAULT_CC +ui_desktop_save(rdpInst* inst, int offset, int x, int y, + int cx, int cy) { g_writeln("ui_desktop_save:"); } /******************************************************************************/ -void DEFAULT_CC -ui_desktop_restore(rdpInst * inst, int offset, int x, int y, +static void DEFAULT_CC +ui_desktop_restore(rdpInst* inst, int offset, int x, int y, int cx, int cy) { g_writeln("ui_desktop_restore:"); } /******************************************************************************/ -RD_HBITMAP DEFAULT_CC -ui_create_bitmap(rdpInst * inst, int width, int height, uint8 * data) +static RD_HBITMAP DEFAULT_CC +ui_create_bitmap(rdpInst* inst, int width, int height, uint8* data) { - g_writeln("ui_create_bitmap:"); - return 0; + struct my_bitmap* bm; + struct mod* mod; + int size; + + mod = GET_MOD(inst); + bm = (struct my_bitmap*)g_malloc(sizeof(struct my_bitmap), 1); + bm->width = width; + bm->height = height; + bm->bpp = mod->bpp; + size = width * height * (bm->bpp / 8); + bm->data = (char*)g_malloc(size, 0); + g_memcpy(bm->data, data, size); + return bm; } /******************************************************************************/ -void DEFAULT_CC -ui_paint_bitmap(rdpInst * inst, int x, int y, int cx, int cy, int width, - int height, uint8 * data) +static void DEFAULT_CC +ui_paint_bitmap(rdpInst* inst, int x, int y, int cx, int cy, int width, + int height, uint8* data) { - g_writeln("ui_paint_bitmap:"); + struct mod* mod; + + mod = GET_MOD(inst); + mod->server_paint_rect(mod, x, y, cx, cy, data, width, height, 0, 0); } /******************************************************************************/ -void DEFAULT_CC -ui_destroy_bitmap(rdpInst * inst, RD_HBITMAP bmp) +static void DEFAULT_CC +ui_destroy_bitmap(rdpInst* inst, RD_HBITMAP bmp) { - g_writeln("ui_destroy_bitmap:"); + struct my_bitmap* bm; + + bm = (struct my_bitmap*)bmp; + g_free(bm->data); + g_free(bm); } /******************************************************************************/ -void DEFAULT_CC -ui_line(rdpInst * inst, uint8 opcode, int startx, int starty, int endx, - int endy, RD_PEN * pen) +static void DEFAULT_CC +ui_line(rdpInst* inst, uint8 opcode, int startx, int starty, int endx, + int endy, RD_PEN* pen) { g_writeln("ui_line:"); } /******************************************************************************/ -void DEFAULT_CC -ui_rect(rdpInst * inst, int x, int y, int cx, int cy, int color) +static void DEFAULT_CC +ui_rect(rdpInst* inst, int x, int y, int cx, int cy, int color) { - g_writeln("ui_rect:"); + struct mod* mod; + + mod = GET_MOD(inst); + mod->server_set_fgcolor(mod, color); + mod->server_fill_rect(mod, x, y, cx, cy); } /******************************************************************************/ -void DEFAULT_CC -ui_polygon(rdpInst * inst, uint8 opcode, uint8 fillmode, RD_POINT * point, - int npoints, RD_BRUSH * brush, int bgcolor, int fgcolor) +static void DEFAULT_CC +ui_polygon(rdpInst* inst, uint8 opcode, uint8 fillmode, RD_POINT* point, + int npoints, RD_BRUSH* brush, int bgcolor, int fgcolor) { g_writeln("ui_polygon:"); } /******************************************************************************/ -void DEFAULT_CC -ui_polyline(rdpInst * inst, uint8 opcode, RD_POINT * points, int npoints, - RD_PEN * pen) +static void DEFAULT_CC +ui_polyline(rdpInst* inst, uint8 opcode, RD_POINT* points, int npoints, + RD_PEN* pen) { g_writeln("ui_polyline:"); } /******************************************************************************/ -void DEFAULT_CC -ui_ellipse(rdpInst * inst, uint8 opcode, uint8 fillmode, int x, int y, - int cx, int cy, RD_BRUSH * brush, int bgcolor, int fgcolor) +static void DEFAULT_CC +ui_ellipse(rdpInst* inst, uint8 opcode, uint8 fillmode, int x, int y, + int cx, int cy, RD_BRUSH* brush, int bgcolor, int fgcolor) { g_writeln("ui_ellipse:"); } /******************************************************************************/ -void DEFAULT_CC -ui_start_draw_glyphs(rdpInst * inst, int bgcolor, int fgcolor) +static void DEFAULT_CC +ui_start_draw_glyphs(rdpInst* inst, int bgcolor, int fgcolor) { g_writeln("ui_start_draw_glyphs:"); } /******************************************************************************/ -void DEFAULT_CC -ui_draw_glyph(rdpInst * inst, int x, int y, int cx, int cy, +static void DEFAULT_CC +ui_draw_glyph(rdpInst* inst, int x, int y, int cx, int cy, RD_HGLYPH glyph) { g_writeln("ui_draw_glyph:"); } /******************************************************************************/ -void DEFAULT_CC -ui_end_draw_glyphs(rdpInst * inst, int x, int y, int cx, int cy) +static void DEFAULT_CC +ui_end_draw_glyphs(rdpInst* inst, int x, int y, int cx, int cy) { g_writeln("ui_end_draw_glyphs:"); } /******************************************************************************/ -uint32 DEFAULT_CC -ui_get_toggle_keys_state(rdpInst * inst) +static uint32 DEFAULT_CC +ui_get_toggle_keys_state(rdpInst* inst) { g_writeln("ui_get_toggle_keys_state:"); return 0; } /******************************************************************************/ -void DEFAULT_CC -ui_bell(rdpInst * inst) +static void DEFAULT_CC +ui_bell(rdpInst* inst) { g_writeln("ui_bell:"); } /******************************************************************************/ -void DEFAULT_CC -ui_destblt(rdpInst * inst, uint8 opcode, int x, int y, int cx, int cy) +static void DEFAULT_CC +ui_destblt(rdpInst* inst, uint8 opcode, int x, int y, int cx, int cy) { + struct mod* mod; + g_writeln("ui_destblt:"); + mod = GET_MOD(inst); + mod->server_set_opcode(mod, opcode); + mod->server_fill_rect(mod, x, y, cx, cy); + mod->server_set_opcode(mod, 0xcc); } /******************************************************************************/ -void DEFAULT_CC -ui_patblt(rdpInst * inst, uint8 opcode, int x, int y, int cx, int cy, - RD_BRUSH * brush, int bgcolor, int fgcolor) +static void DEFAULT_CC +ui_patblt(rdpInst* inst, uint8 opcode, int x, int y, int cx, int cy, + RD_BRUSH* brush, int bgcolor, int fgcolor) { - g_writeln("ui_patblt:"); + struct mod* mod; + + mod = GET_MOD(inst); + mod->server_set_opcode(mod, opcode); + mod->server_set_fgcolor(mod, fgcolor); + mod->server_set_bgcolor(mod, bgcolor); + mod->server_set_mixmode(mod, 1); + if (brush->bd != 0) + { + if (brush->bd->color_code == 1) /* 8x8 1 bpp */ + { + mod->server_set_brush(mod, brush->xorigin, brush->yorigin, + brush->style, brush->bd->data); + } + else + { + g_writeln("ui_patblt: error color_code %d", brush->bd->color_code); + } + } + else + { + mod->server_set_brush(mod, brush->xorigin, brush->yorigin, + brush->style, brush->pattern); + } + mod->server_fill_rect(mod, x, y, cx, cy); + mod->server_set_opcode(mod, 0xcc); + mod->server_set_mixmode(mod, 0); } /******************************************************************************/ -void DEFAULT_CC -ui_screenblt(rdpInst * inst, uint8 opcode, int x, int y, int cx, int cy, - int srcx, int srcy) +static void DEFAULT_CC +ui_screenblt(rdpInst* inst, uint8 opcode, int x, int y, int cx, int cy, + int srcx, int srcy) { - g_writeln("ui_screenblt:"); + struct mod* mod; + + mod = GET_MOD(inst); + mod->server_set_opcode(mod, opcode); + mod->server_screen_blt(mod, x, y, cx, cy, srcx, srcy); + mod->server_set_opcode(mod, 0xcc); } /******************************************************************************/ -void DEFAULT_CC -ui_memblt(rdpInst * inst, uint8 opcode, int x, int y, int cx, int cy, - RD_HBITMAP src, int srcx, int srcy) +static void DEFAULT_CC +ui_memblt(rdpInst* inst, uint8 opcode, int x, int y, int cx, int cy, + RD_HBITMAP src, int srcx, int srcy) { - g_writeln("ui_memblt:"); + struct my_bitmap* bm; + struct mod* mod; + + mod = GET_MOD(inst); + bm = (struct my_bitmap*)src; + mod->server_paint_rect(mod, x, y, cx, cy, bm->data, + bm->width, bm->height, srcx, srcy); } /******************************************************************************/ -void DEFAULT_CC -ui_triblt(rdpInst * inst, uint8 opcode, int x, int y, int cx, int cy, - RD_HBITMAP src, int srcx, int srcy, RD_BRUSH * brush, int bgcolor, int fgcolor) +static void DEFAULT_CC +ui_triblt(rdpInst* inst, uint8 opcode, int x, int y, int cx, int cy, + RD_HBITMAP src, int srcx, int srcy, RD_BRUSH* brush, + int bgcolor, int fgcolor) { g_writeln("ui_triblt:"); } /******************************************************************************/ -RD_HGLYPH DEFAULT_CC -ui_create_glyph(rdpInst * inst, int width, int height, uint8 * data) +static RD_HGLYPH DEFAULT_CC +ui_create_glyph(rdpInst* inst, int width, int height, uint8* data) { + struct my_glyph* gg; + int size; + g_writeln("ui_create_glyph:"); - return 0; + gg = (struct my_glyph*)g_malloc(sizeof(struct my_glyph), 1); + gg->width = width; + gg->height = height; + size = ((height * ((width + 7) / 8)) + 3) & (~3); + gg->data = (char*)g_malloc(size, 0); + g_memcpy(gg->data, data, size); + return gg; } /******************************************************************************/ -void DEFAULT_CC -ui_destroy_glyph(rdpInst * inst, RD_HGLYPH glyph) +static void DEFAULT_CC +ui_destroy_glyph(rdpInst* inst, RD_HGLYPH glyph) { + struct my_glyph* gg; + g_writeln("ui_destroy_glyph:"); + gg = (struct my_glyph*)glyph; + g_free(gg->data); + g_free(gg); } /******************************************************************************/ -int DEFAULT_CC -ui_select(rdpInst * inst, int rdp_socket) +static int DEFAULT_CC +ui_select(rdpInst* inst, int rdp_socket) { - g_writeln("ui_select:"); return 1; } /******************************************************************************/ -void DEFAULT_CC -ui_set_clip(rdpInst * inst, int x, int y, int cx, int cy) +static void DEFAULT_CC +ui_set_clip(rdpInst* inst, int x, int y, int cx, int cy) { - g_writeln("ui_set_clip:"); + struct mod* mod; + + mod = GET_MOD(inst); + mod->server_set_clip(mod, x, y, cx, cy); } /******************************************************************************/ -void DEFAULT_CC -ui_reset_clip(rdpInst * inst) +static void DEFAULT_CC +ui_reset_clip(rdpInst* inst) { - g_writeln("ui_reset_clip:"); + struct mod* mod; + + mod = GET_MOD(inst); + mod->server_reset_clip(mod); } /******************************************************************************/ -void DEFAULT_CC -ui_resize_window(rdpInst * inst) +static void DEFAULT_CC +ui_resize_window(rdpInst* inst) { g_writeln("ui_resize_window:"); } /******************************************************************************/ -void DEFAULT_CC -ui_set_cursor(rdpInst * inst, RD_HCURSOR cursor) +static void DEFAULT_CC +ui_set_cursor(rdpInst* inst, RD_HCURSOR cursor) { g_writeln("ui_set_cursor:"); } /******************************************************************************/ -void DEFAULT_CC -ui_destroy_cursor(rdpInst * inst, RD_HCURSOR cursor) +static void DEFAULT_CC +ui_destroy_cursor(rdpInst* inst, RD_HCURSOR cursor) { g_writeln("ui_destroy_cursor:"); } /******************************************************************************/ -RD_HCURSOR DEFAULT_CC -ui_create_cursor(rdpInst * inst, unsigned int x, unsigned int y, - int width, int height, uint8 * andmask, uint8 * xormask, int bpp) +static RD_HCURSOR DEFAULT_CC +ui_create_cursor(rdpInst* inst, unsigned int x, unsigned int y, + int width, int height, uint8* andmask, + uint8* xormask, int bpp) { g_writeln("ui_create_cursor:"); return 0; } /******************************************************************************/ -void DEFAULT_CC -ui_set_null_cursor(rdpInst * inst) +static void DEFAULT_CC +ui_set_null_cursor(rdpInst* inst) { g_writeln("ui_set_null_cursor:"); } /******************************************************************************/ -void DEFAULT_CC -ui_set_default_cursor(rdpInst * inst) +static void DEFAULT_CC +ui_set_default_cursor(rdpInst* inst) { g_writeln("ui_set_default_cursor:"); } /******************************************************************************/ -RD_HPALETTE DEFAULT_CC -ui_create_colormap(rdpInst * inst, RD_PALETTE * colors) +static RD_HPALETTE DEFAULT_CC +ui_create_colormap(rdpInst* inst, RD_PALETTE* colors) { g_writeln("ui_create_colormap:"); return 0; } /******************************************************************************/ -void DEFAULT_CC -ui_move_pointer(rdpInst * inst, int x, int y) +static void DEFAULT_CC +ui_move_pointer(rdpInst* inst, int x, int y) { g_writeln("ui_move_pointer:"); } /******************************************************************************/ -void DEFAULT_CC -ui_set_colormap(rdpInst * inst, RD_HPALETTE map) +static void DEFAULT_CC +ui_set_colormap(rdpInst* inst, RD_HPALETTE map) { g_writeln("ui_set_colormap:"); } /******************************************************************************/ -RD_HBITMAP DEFAULT_CC -ui_create_surface(rdpInst * inst, int width, int height, RD_HBITMAP old) +static RD_HBITMAP DEFAULT_CC +ui_create_surface(rdpInst* inst, int width, int height, RD_HBITMAP old) { g_writeln("ui_create_surface:"); return 0; } /******************************************************************************/ -void DEFAULT_CC -ui_set_surface(rdpInst * inst, RD_HBITMAP surface) +static void DEFAULT_CC +ui_set_surface(rdpInst* inst, RD_HBITMAP surface) { g_writeln("ui_set_surface:"); } /******************************************************************************/ -void DEFAULT_CC -ui_destroy_surface(rdpInst * inst, RD_HBITMAP surface) +static void DEFAULT_CC +ui_destroy_surface(rdpInst* inst, RD_HBITMAP surface) { g_writeln("ui_destroy_surface:"); } /******************************************************************************/ -void DEFAULT_CC -ui_channel_data(rdpInst * inst, int chan_id, char * data, int data_size, +static void DEFAULT_CC +ui_channel_data(rdpInst* inst, int chan_id, char* data, int data_size, int flags, int total_size) { g_writeln("ui_channel_data:"); @@ -449,18 +659,31 @@ mod_init(void) mod->mod_signal = lib_mod_signal; mod->mod_end = lib_mod_end; mod->mod_set_param = lib_mod_set_param; + mod->mod_session_change = mod_session_change; + mod->mod_get_wait_objs = mod_get_wait_objs; + mod->mod_check_wait_objs = mod_check_wait_objs; mod->settings = (struct rdp_set*)g_malloc(sizeof(struct rdp_set), 1); + + mod->settings->encryption = 1; + mod->settings->server_depth = 16; + mod->settings->bitmap_cache = 1; + mod->settings->bitmap_compression = 1; + mod->settings->performanceflags = + PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS; + mod->settings->new_cursors = 1; + mod->settings->rdp_version = 5; + mod->inst = freerdp_new(mod->settings); if (mod->inst == 0) { return 0; } + SET_MOD(mod->inst, mod); mod->inst->ui_error = ui_error; mod->inst->ui_warning = ui_warning; mod->inst->ui_unimpl = ui_unimpl; mod->inst->ui_begin_update = ui_begin_update; mod->inst->ui_end_update = ui_end_update; - mod->inst->ui_desktop_save = ui_desktop_save; mod->inst->ui_desktop_restore = ui_desktop_restore; mod->inst->ui_create_bitmap = ui_create_bitmap; @@ -499,7 +722,6 @@ mod_init(void) mod->inst->ui_set_surface = ui_set_surface; mod->inst->ui_destroy_surface = ui_destroy_surface; mod->inst->ui_channel_data = ui_channel_data; - return mod; } diff --git a/freerdp/xrdp-freerdp.h b/freerdp/xrdp-freerdp.h index c6628056..dcb8964e 100644 --- a/freerdp/xrdp-freerdp.h +++ b/freerdp/xrdp-freerdp.h @@ -43,7 +43,11 @@ struct mod int (*mod_signal)(struct mod* v); int (*mod_end)(struct mod* v); int (*mod_set_param)(struct mod* v, char* name, char* value); - long mod_dumby[100 - 6]; /* align, 100 minus the number of mod + int (*mod_session_change)(struct mod* v, int, int); + int (*mod_get_wait_objs)(struct mod* v, tbus* read_objs, int* rcount, + tbus* write_objs, int* wcount, int* timeout); + int (*mod_check_wait_objs)(struct mod* v); + long mod_dumby[100 - 9]; /* align, 100 minus the number of mod functions above */ /* server functions */ int (*server_begin_update)(struct mod* v); @@ -89,9 +93,9 @@ struct mod long server_dumby[100 - 25]; /* align, 100 minus the number of server functions above */ /* common */ - long handle; /* pointer to self as long */ - long wm; - long painter; + tbus handle; /* pointer to self as long */ + tbus wm; + tbus painter; int sck; /* mod data */ int width;