--- sourceforge.net/trunk/rdesktop/xwin.c 2004/01/23 08:35:52 580 +++ sourceforge.net/trunk/rdesktop/xwin.c 2004/02/25 18:28:52 617 @@ -21,8 +21,10 @@ #include #include #include +#include #include #include +#include #include "rdesktop.h" #include "xproto.h" @@ -62,8 +64,8 @@ static int g_red_shift_l, g_blue_shift_l, g_green_shift_l; /* software backing store */ -static BOOL g_ownbackstore; -static Pixmap g_backstore = NULL; +BOOL g_ownbackstore = True; /* We can't rely on external BackingStore */ +static Pixmap g_backstore = 0; /* Moving in single app mode */ static BOOL g_moving_wnd; @@ -167,12 +169,9 @@ split_colour15(uint32 colour) { PixelColour rv; - rv.red = (colour & 0x7c00) >> 10; - rv.red = (rv.red * 0xff) / 0x1f; - rv.green = (colour & 0x03e0) >> 5; - rv.green = (rv.green * 0xff) / 0x1f; - rv.blue = (colour & 0x1f); - rv.blue = (rv.blue * 0xff) / 0x1f; + rv.red = (colour & 0x7c00) >> 7; + rv.green = (colour & 0x03e0) >> 2; + rv.blue = (colour & 0x001f) << 3; return rv; } @@ -180,12 +179,9 @@ split_colour16(uint32 colour) { PixelColour rv; - rv.red = (colour & 0xf800) >> 11; - rv.red = (rv.red * 0xff) / 0x1f; - rv.green = (colour & 0x07e0) >> 5; - rv.green = (rv.green * 0xff) / 0x3f; - rv.blue = (colour & 0x001f); - rv.blue = (rv.blue * 0xff) / 0x1f; + rv.red = (colour & 0xf800) >> 8; + rv.green = (colour & 0x07e0) >> 3; + rv.blue = (colour & 0x001f) << 3; return rv; } @@ -193,9 +189,9 @@ split_colour24(uint32 colour) { PixelColour rv; - rv.blue = (colour & 0xff0000) >> 16; - rv.green = (colour & 0xff00) >> 8; - rv.red = (colour & 0xff); + rv.blue = (colour & 0xff0000) >> 16; + rv.green = (colour & 0x00ff00) >> 8; + rv.red = (colour & 0x0000ff); return rv; } @@ -790,8 +786,11 @@ warning("Screen depth is 8 bits or lower: you may want to use -C for a private colourmap\n"); } - if (DoesBackingStore(g_screen) != Always) + if ((!g_ownbackstore) && (DoesBackingStore(g_screen) != Always)) + { + warning("External BackingStore not available, using internal\n"); g_ownbackstore = True; + } test = 1; g_host_be = !(BOOL) (*(uint8 *) (&test)); @@ -894,7 +893,7 @@ if (g_gc == NULL) g_gc = XCreateGC(g_display, g_wnd, 0, NULL); - if ((g_ownbackstore) && (g_backstore == NULL)) + if ((g_ownbackstore) && (g_backstore == 0)) { g_backstore = XCreatePixmap(g_display, g_wnd, g_width, g_height, g_depth); @@ -1271,11 +1270,14 @@ int ui_select(int rdp_socket) { - int n = (rdp_socket > g_x_socket) ? rdp_socket + 1 : g_x_socket + 1; + int n; fd_set rfds, wfds; + struct timeval tv; + BOOL s_timeout = False; while (True) { + n = (rdp_socket > g_x_socket) ? rdp_socket : g_x_socket; /* Process any events already waiting */ if (!xwin_process_events()) /* User quit */ @@ -1291,19 +1293,35 @@ if (g_dsp_busy) { FD_SET(g_dsp_fd, &wfds); - n = (g_dsp_fd + 1 > n) ? g_dsp_fd + 1 : n; + n = (g_dsp_fd > n) ? g_dsp_fd : n; } #endif + /* default timeout */ + tv.tv_sec = 60; + tv.tv_usec = 0; + + /* add redirection handles */ + rdpdr_add_fds(&n, &rfds, &wfds, &tv, &s_timeout); - switch (select(n, &rfds, &wfds, NULL, NULL)) + n++; + + switch (select(n, &rfds, &wfds, NULL, &tv)) { case -1: error("select: %s\n", strerror(errno)); case 0: + /* TODO: if tv.tv_sec just times out + * we will segfault. + * FIXME: + */ + //s_timeout = True; + //rdpdr_check_fds(&rfds, &wfds, (BOOL) True); continue; } + rdpdr_check_fds(&rfds, &wfds, (BOOL) False); + if (FD_ISSET(rdp_socket, &rfds)) return 1; @@ -1759,9 +1777,15 @@ /* src */ int srcx, int srcy) { SET_FUNCTION(opcode); - XCopyArea(g_display, g_wnd, g_wnd, g_gc, srcx, srcy, cx, cy, x, y); if (g_ownbackstore) + { + XCopyArea(g_display, g_backstore, g_wnd, g_gc, srcx, srcy, cx, cy, x, y); XCopyArea(g_display, g_backstore, g_backstore, g_gc, srcx, srcy, cx, cy, x, y); + } + else + { + XCopyArea(g_display, g_wnd, g_wnd, g_gc, srcx, srcy, cx, cy, x, y); + } RESET_FUNCTION(opcode); }