--- sourceforge.net/trunk/rdesktop/xwin.c 2003/10/29 08:15:02 527 +++ sourceforge.net/trunk/rdesktop/xwin.c 2004/01/16 23:15:33 564 @@ -20,6 +20,7 @@ #include #include +#include #include #include #include "rdesktop.h" @@ -207,7 +208,7 @@ } #define BSWAP16(x) { x = (((x & 0xff) << 8) | (x >> 8)); } -#define BSWAP24(x) { x = (((x & 0xff) << 16) | (x >> 16) | ((x >> 8) & 0xff00)); } +#define BSWAP24(x) { x = (((x & 0xff) << 16) | (x >> 16) | (x & 0xff00)); } #define BSWAP32(x) { x = (((x & 0xff00ff) << 8) | ((x >> 8) & 0xff00ff)); \ x = (x << 16) | (x >> 16); } @@ -245,7 +246,7 @@ while (out < end) { value = (uint16) g_colmap[*(data++)]; - + if (g_xserver_be) { *(out++) = value >> 8; @@ -268,7 +269,7 @@ while (out < end) { value = g_colmap[*(data++)]; - + if (g_xserver_be) { *(out++) = value >> 16; @@ -310,8 +311,6 @@ } } -/* todo the remaining translate function might need some big endian check ?? */ - static void translate15to16(uint16 * data, uint8 * out, uint8 * end) { @@ -408,34 +407,35 @@ } static void -translate16to16(uint16 * data, uint16 * out, uint16 * end) +translate16to16(uint16 * data, uint8 * out, uint8 * end) { + uint16 pixel; uint16 value; - if (g_xserver_be) + while (out < end) { - while (out < end) + pixel = *(data++); + + if (g_host_be) { - value = *data; - BSWAP16(value); - *out = value; - data++; - out++; + BSWAP16(pixel); } - } - else - { - while (out < end) + value = make_colour(split_colour16(pixel)); + + if (g_xserver_be) + { + *(out++) = value >> 8; + *(out++) = value; + } + else { - *out = *data; - out++; - data++; + *(out++) = value; + *(out++) = value >> 8; } } } - static void translate16to24(uint16 * data, uint8 * out, uint8 * end) { @@ -480,7 +480,8 @@ if (g_host_be) { - BSWAP16(pixel)} + BSWAP16(pixel); + } value = make_colour(split_colour16(pixel)); @@ -530,30 +531,59 @@ static void translate24to24(uint8 * data, uint8 * out, uint8 * end) { + uint32 pixel; + uint32 value; + while (out < end) { - *(out++) = (*(data++)); + pixel = *(data++) << 16; + pixel |= *(data++) << 8; + pixel |= *(data++); + + value = make_colour(split_colour24(pixel)); + + if (g_xserver_be) + { + *(out++) = value >> 16; + *(out++) = value >> 8; + *(out++) = value; + } + else + { + *(out++) = value; + *(out++) = value >> 8; + *(out++) = value >> 16; + } } } static void translate24to32(uint8 * data, uint8 * out, uint8 * end) { + uint32 pixel; + uint32 value; + while (out < end) { + pixel = *(data++) << 16; + pixel |= *(data++) << 8; + pixel |= *(data++); + + value = make_colour(split_colour24(pixel)); + if (g_xserver_be) { - *(out++) = 0x00; - *(out++) = *(data++); - *(out++) = *(data++); - *(out++) = *(data++); + *(out++) = value >> 24; + *(out++) = value >> 16; + *(out++) = value >> 8; + *(out++) = value; } else { - *(out++) = *(data++); - *(out++) = *(data++); - *(out++) = *(data++); - *(out++) = 0x00; + *(out++) = value; + *(out++) = value >> 8; + *(out++) = value >> 16; + *(out++) = value >> 24; } } } @@ -591,8 +621,7 @@ translate16to24((uint16 *) data, out, end); break; case 16: - translate16to16((uint16 *) data, (uint16 *) out, - (uint16 *) end); + translate16to16((uint16 *) data, out, end); break; } break; @@ -700,8 +729,8 @@ g_visual = vi.visual; g_owncolmap = False; - calculate_shifts(vi.red_mask, &g_red_shift_r, &g_red_shift_l); - calculate_shifts(vi.blue_mask, &g_blue_shift_r, &g_blue_shift_l); + calculate_shifts(vi.red_mask, &g_red_shift_r, &g_red_shift_l); + calculate_shifts(vi.blue_mask, &g_blue_shift_r, &g_blue_shift_l); calculate_shifts(vi.green_mask, &g_green_shift_r, &g_green_shift_l); } @@ -746,7 +775,12 @@ /* * Determine desktop size */ - if (g_width < 0) + if (g_fullscreen) + { + g_width = WidthOfScreen(g_screen); + g_height = HeightOfScreen(g_screen); + } + else if (g_width < 0) { /* Percent of screen */ g_height = HeightOfScreen(g_screen) * (-g_width) / 100; @@ -769,11 +803,6 @@ g_height = 600; } } - else if (g_fullscreen) - { - g_width = WidthOfScreen(g_screen); - g_height = HeightOfScreen(g_screen); - } /* make sure width is a multiple of 4 */ g_width = (g_width + 3) & ~3; @@ -819,12 +848,11 @@ g_display = NULL; } -#define NULL_POINTER_MASK "\x80" -#define NULL_POINTER_DATA "\x0\x0\x0" - BOOL ui_create_window(void) { + uint8 null_pointer_mask[1] = { 0x80 }; + uint8 null_pointer_data[4] = { 0x00, 0x00, 0x00, 0x00 }; XSetWindowAttributes attribs; XClassHint *classhints; XSizeHints *sizehints; @@ -907,7 +935,7 @@ XSetWMProtocols(g_display, g_wnd, &g_kill_atom, 1); /* create invisible 1x1 cursor to be used as null cursor */ - g_null_cursor = ui_create_cursor(0, 0, 1, 1, NULL_POINTER_MASK, NULL_POINTER_DATA); + g_null_cursor = ui_create_cursor(0, 0, 1, 1, null_pointer_mask, null_pointer_data); return True; } @@ -915,8 +943,6 @@ void ui_destroy_window(void) { - ui_destroy_cursor(g_null_cursor); - if (g_IC != NULL) XDestroyIC(g_IC); @@ -960,9 +986,6 @@ key_translation tr; char str[256]; Status status; - unsigned int state; - Window wdummy; - int dummy; while (XPending(g_display) > 0) { @@ -1135,9 +1158,7 @@ if (xevent.xfocus.mode == NotifyGrab) break; g_focused = True; - XQueryPointer(g_display, g_wnd, &wdummy, &wdummy, &dummy, &dummy, - &dummy, &dummy, &state); - reset_modifier_keys(state); + reset_modifier_keys(); if (g_grab_keyboard && g_mouse_in_wnd) XGrabKeyboard(g_display, g_wnd, True, GrabModeAsync, GrabModeAsync, CurrentTime); @@ -1802,33 +1823,34 @@ {\ glyph = cache_get_font (font, ttext[idx]);\ if (!(flags & TEXT2_IMPLICIT_X))\ + {\ + xyoffset = ttext[++idx];\ + if ((xyoffset & 0x80))\ {\ - xyoffset = ttext[++idx];\ - if ((xyoffset & 0x80))\ - {\ - if (flags & TEXT2_VERTICAL) \ - y += ttext[idx+1] | (ttext[idx+2] << 8);\ - else\ - x += ttext[idx+1] | (ttext[idx+2] << 8);\ - idx += 2;\ - }\ + if (flags & TEXT2_VERTICAL)\ + y += ttext[idx+1] | (ttext[idx+2] << 8);\ else\ - {\ - if (flags & TEXT2_VERTICAL) \ - y += xyoffset;\ - else\ - x += xyoffset;\ - }\ + x += ttext[idx+1] | (ttext[idx+2] << 8);\ + idx += 2;\ }\ - if (glyph != NULL)\ + else\ {\ - ui_draw_glyph (mixmode, x + glyph->offset,\ - y + glyph->baseline,\ - glyph->width, glyph->height,\ - glyph->pixmap, 0, 0, bgcolour, fgcolour);\ - if (flags & TEXT2_IMPLICIT_X)\ - x += glyph->width;\ + if (flags & TEXT2_VERTICAL)\ + y += xyoffset;\ + else\ + x += xyoffset;\ }\ + }\ + if (glyph != NULL)\ + {\ + x1 = x + glyph->offset;\ + y1 = y + glyph->baseline;\ + XSetStipple(g_display, g_gc, (Pixmap) glyph->pixmap);\ + XSetTSOrigin(g_display, g_gc, x1, y1);\ + FILL_RECTANGLE_BACKSTORE(x1, y1, glyph->width, glyph->height);\ + if (flags & TEXT2_IMPLICIT_X)\ + x += glyph->width;\ + }\ } void @@ -1838,7 +1860,7 @@ int fgcolour, uint8 * text, uint8 length) { FONTGLYPH *glyph; - int i, j, xyoffset; + int i, j, xyoffset, x1, y1; DATABLOB *entry; SET_FOREGROUND(bgcolour); @@ -1852,6 +1874,10 @@ FILL_RECTANGLE_BACKSTORE(clipx, clipy, clipcx, clipcy); } + SET_FOREGROUND(fgcolour); + SET_BACKGROUND(bgcolour); + XSetFillStyle(g_display, g_gc, FillStippled); + /* Paint text, character by character */ for (i = 0; i < length;) { @@ -1902,6 +1928,9 @@ break; } } + + XSetFillStyle(g_display, g_gc, FillSolid); + if (g_ownbackstore) { if (boxcx > 1)