Fixed indentation with indent

git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@63 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Peter Åstrand 2002-07-18 16:38:31 +00:00
parent 7df1204803
commit 0685b1b65c
15 changed files with 447 additions and 338 deletions

View File

@ -178,7 +178,7 @@ cache_get_desktop(uint32 offset, int cx, int cy, int bytes_per_pixel)
/* Store desktop data in the cache */ /* Store desktop data in the cache */
void void
cache_put_desktop(uint32 offset, int cx, int cy, int scanline, cache_put_desktop(uint32 offset, int cx, int cy, int scanline,
int bytes_per_pixel, uint8 *data) int bytes_per_pixel, uint8 * data)
{ {
int length = cx * cy * bytes_per_pixel; int length = cx * cy * bytes_per_pixel;
@ -203,7 +203,8 @@ cache_put_desktop(uint32 offset, int cx, int cy, int scanline,
static HCURSOR cursorcache[0x20]; static HCURSOR cursorcache[0x20];
/* Retrieve cursor from cache */ /* Retrieve cursor from cache */
HCURSOR cache_get_cursor(uint16 cache_idx) HCURSOR
cache_get_cursor(uint16 cache_idx)
{ {
HCURSOR cursor; HCURSOR cursor;

View File

@ -24,11 +24,11 @@
/* ISO PDU codes */ /* ISO PDU codes */
enum ISO_PDU_CODE enum ISO_PDU_CODE
{ {
ISO_PDU_CR = 0xE0, /* Connection Request */ ISO_PDU_CR = 0xE0, /* Connection Request */
ISO_PDU_CC = 0xD0, /* Connection Confirm */ ISO_PDU_CC = 0xD0, /* Connection Confirm */
ISO_PDU_DR = 0x80, /* Disconnect Request */ ISO_PDU_DR = 0x80, /* Disconnect Request */
ISO_PDU_DT = 0xF0, /* Data */ ISO_PDU_DT = 0xF0, /* Data */
ISO_PDU_ER = 0x70 /* Error */ ISO_PDU_ER = 0x70 /* Error */
}; };
/* MCS PDU codes */ /* MCS PDU codes */
@ -76,7 +76,7 @@ enum MCS_PDU_TYPE
#define SEC_TAG_PUBKEY 0x0006 #define SEC_TAG_PUBKEY 0x0006
#define SEC_TAG_KEYSIG 0x0008 #define SEC_TAG_KEYSIG 0x0008
#define SEC_RSA_MAGIC 0x31415352 /* RSA1 */ #define SEC_RSA_MAGIC 0x31415352 /* RSA1 */
/* RDP licensing constants */ /* RDP licensing constants */
#define LICENCE_TOKEN_SIZE 10 #define LICENCE_TOKEN_SIZE 10

2
iso.c
View File

@ -44,7 +44,7 @@ iso_send_msg(uint8 code)
/* Receive a message on the ISO layer, return code */ /* Receive a message on the ISO layer, return code */
static STREAM static STREAM
iso_recv_msg(uint8 *code) iso_recv_msg(uint8 * code)
{ {
STREAM s; STREAM s;
uint16 length; uint16 length;

View File

@ -32,7 +32,8 @@ BOOL licence_issued = False;
/* Generate a session key and RC4 keys, given client and server randoms */ /* Generate a session key and RC4 keys, given client and server randoms */
static void static void
licence_generate_keys(uint8 *client_key, uint8 *server_key, uint8 *client_rsa) licence_generate_keys(uint8 * client_key, uint8 * server_key,
uint8 * client_rsa)
{ {
uint8 session_key[48]; uint8 session_key[48];
uint8 temp_hash[48]; uint8 temp_hash[48];
@ -49,7 +50,7 @@ licence_generate_keys(uint8 *client_key, uint8 *server_key, uint8 *client_rsa)
} }
static void static void
licence_generate_hwid(uint8 *hwid) licence_generate_hwid(uint8 * hwid)
{ {
buf_out_uint32(hwid, 2); buf_out_uint32(hwid, 2);
strncpy(hwid + 4, hostname, LICENCE_HWID_SIZE - 4); strncpy(hwid + 4, hostname, LICENCE_HWID_SIZE - 4);
@ -57,13 +58,14 @@ licence_generate_hwid(uint8 *hwid)
/* Present an existing licence to the server */ /* Present an existing licence to the server */
static void static void
licence_present(uint8 *client_random, uint8 *rsa_data, licence_present(uint8 * client_random, uint8 * rsa_data,
uint8 *licence_data, int licence_size, uint8 * licence_data, int licence_size,
uint8 *hwid, uint8 *signature) uint8 * hwid, uint8 * signature)
{ {
uint32 sec_flags = SEC_LICENCE_NEG; uint32 sec_flags = SEC_LICENCE_NEG;
uint16 length = 16 + SEC_RANDOM_SIZE + SEC_MODULUS_SIZE + SEC_PADDING_SIZE uint16 length =
+ licence_size + LICENCE_HWID_SIZE + LICENCE_SIGNATURE_SIZE; 16 + SEC_RANDOM_SIZE + SEC_MODULUS_SIZE + SEC_PADDING_SIZE +
licence_size + LICENCE_HWID_SIZE + LICENCE_SIGNATURE_SIZE;
STREAM s; STREAM s;
s = sec_init(sec_flags, length + 4); s = sec_init(sec_flags, length + 4);
@ -97,7 +99,7 @@ licence_present(uint8 *client_random, uint8 *rsa_data,
/* Send a licence request packet */ /* Send a licence request packet */
static void static void
licence_send_request(uint8 *client_random, uint8 *rsa_data, licence_send_request(uint8 * client_random, uint8 * rsa_data,
char *user, char *host) char *user, char *host)
{ {
uint32 sec_flags = SEC_LICENCE_NEG; uint32 sec_flags = SEC_LICENCE_NEG;
@ -156,7 +158,8 @@ licence_process_demand(STREAM s)
licence_size = load_licence(&licence_data); licence_size = load_licence(&licence_data);
if (licence_size == -1) if (licence_size == -1)
{ {
licence_send_request(null_data, null_data, username, hostname); licence_send_request(null_data, null_data, username,
hostname);
return; return;
} }
@ -169,13 +172,13 @@ licence_process_demand(STREAM s)
RC4(&crypt_key, sizeof(hwid), hwid, hwid); RC4(&crypt_key, sizeof(hwid), hwid, hwid);
licence_present(null_data, null_data, licence_data, licence_size, licence_present(null_data, null_data, licence_data, licence_size,
hwid, signature); hwid, signature);
xfree(licence_data); xfree(licence_data);
} }
/* Send an authentication response packet */ /* Send an authentication response packet */
static void static void
licence_send_authresp(uint8 *token, uint8 *crypt_hwid, uint8 *signature) licence_send_authresp(uint8 * token, uint8 * crypt_hwid, uint8 * signature)
{ {
uint32 sec_flags = SEC_LICENCE_NEG; uint32 sec_flags = SEC_LICENCE_NEG;
uint16 length = 58; uint16 length = 58;
@ -202,7 +205,7 @@ licence_send_authresp(uint8 *token, uint8 *crypt_hwid, uint8 *signature)
/* Parse an authentication request packet */ /* Parse an authentication request packet */
static BOOL static BOOL
licence_parse_authreq(STREAM s, uint8 **token, uint8 **signature) licence_parse_authreq(STREAM s, uint8 ** token, uint8 ** signature)
{ {
uint16 tokenlen; uint16 tokenlen;
@ -280,7 +283,7 @@ licence_process_issue(STREAM s)
return; return;
licence_issued = True; licence_issued = True;
save_licence(s->p, length-2); save_licence(s->p, length - 2);
} }
/* Process a licence packet */ /* Process a licence packet */

2
mcs.c
View File

@ -215,7 +215,7 @@ mcs_send_aurq()
/* Expect a AUcf message (ASN.1 PER) */ /* Expect a AUcf message (ASN.1 PER) */
static BOOL static BOOL
mcs_recv_aucf(uint16 *mcs_userid) mcs_recv_aucf(uint16 * mcs_userid)
{ {
uint8 opcode, result; uint8 opcode, result;
STREAM s; STREAM s;

View File

@ -26,7 +26,7 @@ static RDP_ORDER_STATE order_state;
/* Read field indicating which parameters are present */ /* Read field indicating which parameters are present */
static void static void
rdp_in_present(STREAM s, uint32 *present, uint8 flags, int size) rdp_in_present(STREAM s, uint32 * present, uint8 flags, int size)
{ {
uint8 bits; uint8 bits;
int i; int i;
@ -54,7 +54,7 @@ rdp_in_present(STREAM s, uint32 *present, uint8 flags, int size)
/* Read a co-ordinate (16-bit, or 8-bit delta) */ /* Read a co-ordinate (16-bit, or 8-bit delta) */
static void static void
rdp_in_coord(STREAM s, uint16 *coord, BOOL delta) rdp_in_coord(STREAM s, uint16 * coord, BOOL delta)
{ {
uint8 change; uint8 change;
@ -71,7 +71,7 @@ rdp_in_coord(STREAM s, uint16 *coord, BOOL delta)
/* Read a colour entry */ /* Read a colour entry */
static void static void
rdp_in_colour(STREAM s, uint8 *colour) rdp_in_colour(STREAM s, uint8 * colour)
{ {
in_uint8(s, *colour); in_uint8(s, *colour);
s->p += 2; s->p += 2;
@ -79,7 +79,7 @@ rdp_in_colour(STREAM s, uint8 *colour)
/* Parse bounds information */ /* Parse bounds information */
static BOOL static BOOL
rdp_parse_bounds(STREAM s, BOUNDS *bounds) rdp_parse_bounds(STREAM s, BOUNDS * bounds)
{ {
uint8 present; uint8 present;
@ -110,7 +110,7 @@ rdp_parse_bounds(STREAM s, BOUNDS *bounds)
/* Parse a pen */ /* Parse a pen */
static BOOL static BOOL
rdp_parse_pen(STREAM s, PEN *pen, uint32 present) rdp_parse_pen(STREAM s, PEN * pen, uint32 present)
{ {
if (present & 1) if (present & 1)
in_uint8(s, pen->style); in_uint8(s, pen->style);
@ -126,7 +126,7 @@ rdp_parse_pen(STREAM s, PEN *pen, uint32 present)
/* Parse a brush */ /* Parse a brush */
static BOOL static BOOL
rdp_parse_brush(STREAM s, BRUSH *brush, uint32 present) rdp_parse_brush(STREAM s, BRUSH * brush, uint32 present)
{ {
if (present & 1) if (present & 1)
in_uint8(s, brush->xorigin); in_uint8(s, brush->xorigin);
@ -148,7 +148,7 @@ rdp_parse_brush(STREAM s, BRUSH *brush, uint32 present)
/* Process a destination blt order */ /* Process a destination blt order */
static void static void
process_destblt(STREAM s, DESTBLT_ORDER *os, uint32 present, BOOL delta) process_destblt(STREAM s, DESTBLT_ORDER * os, uint32 present, BOOL delta)
{ {
if (present & 0x01) if (present & 0x01)
rdp_in_coord(s, &os->x, delta); rdp_in_coord(s, &os->x, delta);
@ -173,7 +173,7 @@ process_destblt(STREAM s, DESTBLT_ORDER *os, uint32 present, BOOL delta)
/* Process a pattern blt order */ /* Process a pattern blt order */
static void static void
process_patblt(STREAM s, PATBLT_ORDER *os, uint32 present, BOOL delta) process_patblt(STREAM s, PATBLT_ORDER * os, uint32 present, BOOL delta)
{ {
if (present & 0x0001) if (present & 0x0001)
rdp_in_coord(s, &os->x, delta); rdp_in_coord(s, &os->x, delta);
@ -198,9 +198,7 @@ process_patblt(STREAM s, PATBLT_ORDER *os, uint32 present, BOOL delta)
rdp_parse_brush(s, &os->brush, present >> 7); rdp_parse_brush(s, &os->brush, present >> 7);
DEBUG(("PATBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,bs=%d,bg=0x%x,fg=0x%x)\n", DEBUG(("PATBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,bs=%d,bg=0x%x,fg=0x%x)\n", os->opcode, os->x, os->y, os->cx, os->cy, os->brush.style, os->bgcolour, os->fgcolour));
os->opcode, os->x, os->y, os->cx, os->cy,
os->brush.style, os->bgcolour, os->fgcolour));
ui_patblt(ROP2_P(os->opcode), os->x, os->y, os->cx, os->cy, ui_patblt(ROP2_P(os->opcode), os->x, os->y, os->cx, os->cy,
&os->brush, os->bgcolour, os->fgcolour); &os->brush, os->bgcolour, os->fgcolour);
@ -208,7 +206,7 @@ process_patblt(STREAM s, PATBLT_ORDER *os, uint32 present, BOOL delta)
/* Process a screen blt order */ /* Process a screen blt order */
static void static void
process_screenblt(STREAM s, SCREENBLT_ORDER *os, uint32 present, BOOL delta) process_screenblt(STREAM s, SCREENBLT_ORDER * os, uint32 present, BOOL delta)
{ {
if (present & 0x0001) if (present & 0x0001)
rdp_in_coord(s, &os->x, delta); rdp_in_coord(s, &os->x, delta);
@ -240,7 +238,7 @@ process_screenblt(STREAM s, SCREENBLT_ORDER *os, uint32 present, BOOL delta)
/* Process a line order */ /* Process a line order */
static void static void
process_line(STREAM s, LINE_ORDER *os, uint32 present, BOOL delta) process_line(STREAM s, LINE_ORDER * os, uint32 present, BOOL delta)
{ {
if (present & 0x0001) if (present & 0x0001)
in_uint16_le(s, os->mixmode); in_uint16_le(s, os->mixmode);
@ -281,7 +279,7 @@ process_line(STREAM s, LINE_ORDER *os, uint32 present, BOOL delta)
/* Process an opaque rectangle order */ /* Process an opaque rectangle order */
static void static void
process_rect(STREAM s, RECT_ORDER *os, uint32 present, BOOL delta) process_rect(STREAM s, RECT_ORDER * os, uint32 present, BOOL delta)
{ {
if (present & 0x01) if (present & 0x01)
rdp_in_coord(s, &os->x, delta); rdp_in_coord(s, &os->x, delta);
@ -306,7 +304,7 @@ process_rect(STREAM s, RECT_ORDER *os, uint32 present, BOOL delta)
/* Process a desktop save order */ /* Process a desktop save order */
static void static void
process_desksave(STREAM s, DESKSAVE_ORDER *os, uint32 present, BOOL delta) process_desksave(STREAM s, DESKSAVE_ORDER * os, uint32 present, BOOL delta)
{ {
int width, height; int width, height;
@ -344,7 +342,7 @@ process_desksave(STREAM s, DESKSAVE_ORDER *os, uint32 present, BOOL delta)
/* Process a memory blt order */ /* Process a memory blt order */
static void static void
process_memblt(STREAM s, MEMBLT_ORDER *os, uint32 present, BOOL delta) process_memblt(STREAM s, MEMBLT_ORDER * os, uint32 present, BOOL delta)
{ {
HBITMAP bitmap; HBITMAP bitmap;
@ -392,7 +390,7 @@ process_memblt(STREAM s, MEMBLT_ORDER *os, uint32 present, BOOL delta)
/* Process a 3-way blt order */ /* Process a 3-way blt order */
static void static void
process_triblt(STREAM s, TRIBLT_ORDER *os, uint32 present, BOOL delta) process_triblt(STREAM s, TRIBLT_ORDER * os, uint32 present, BOOL delta)
{ {
HBITMAP bitmap; HBITMAP bitmap;
@ -437,9 +435,7 @@ process_triblt(STREAM s, TRIBLT_ORDER *os, uint32 present, BOOL delta)
if (present & 0x010000) if (present & 0x010000)
in_uint16_le(s, os->unknown); in_uint16_le(s, os->unknown);
DEBUG(("TRIBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d,bs=%d,bg=0x%x,fg=0x%x)\n", DEBUG(("TRIBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d,bs=%d,bg=0x%x,fg=0x%x)\n", os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id, os->cache_idx, os->brush.style, os->bgcolour, os->fgcolour));
os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id,
os->cache_idx, os->brush.style, os->bgcolour, os->fgcolour));
bitmap = cache_get_bitmap(os->cache_id, os->cache_idx); bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);
if (bitmap == NULL) if (bitmap == NULL)
@ -452,7 +448,7 @@ process_triblt(STREAM s, TRIBLT_ORDER *os, uint32 present, BOOL delta)
/* Parse a delta co-ordinate in polyline order form */ /* Parse a delta co-ordinate in polyline order form */
static int static int
parse_delta(uint8 *buffer, int *offset) parse_delta(uint8 * buffer, int *offset)
{ {
int value = buffer[(*offset)++]; int value = buffer[(*offset)++];
int two_byte = value & 0x80; int two_byte = value & 0x80;
@ -470,7 +466,7 @@ parse_delta(uint8 *buffer, int *offset)
/* Process a polyline order */ /* Process a polyline order */
static void static void
process_polyline(STREAM s, POLYLINE_ORDER *os, uint32 present, BOOL delta) process_polyline(STREAM s, POLYLINE_ORDER * os, uint32 present, BOOL delta)
{ {
int index, line, data; int index, line, data;
int x, y, xfrom, yfrom; int x, y, xfrom, yfrom;
@ -504,7 +500,8 @@ process_polyline(STREAM s, POLYLINE_ORDER *os, uint32 present, BOOL delta)
opcode = ROP2_NXOR; opcode = ROP2_NXOR;
DEBUG(("POLYLINE(x=%d,y=%d,fl=0x%x,fg=0x%x,n=%d,sz=%d)\n", DEBUG(("POLYLINE(x=%d,y=%d,fl=0x%x,fg=0x%x,n=%d,sz=%d)\n",
os->x, os->y, os->flags, os->fgcolour, os->lines, os->datasize)); os->x, os->y, os->flags, os->fgcolour, os->lines,
os->datasize));
DEBUG(("Data: ")); DEBUG(("Data: "));
@ -545,7 +542,7 @@ process_polyline(STREAM s, POLYLINE_ORDER *os, uint32 present, BOOL delta)
/* Process a text order */ /* Process a text order */
static void static void
process_text2(STREAM s, TEXT2_ORDER *os, uint32 present, BOOL delta) process_text2(STREAM s, TEXT2_ORDER * os, uint32 present, BOOL delta)
{ {
int i; int i;
@ -603,11 +600,7 @@ process_text2(STREAM s, TEXT2_ORDER *os, uint32 present, BOOL delta)
in_uint8a(s, os->text, os->length); in_uint8a(s, os->text, os->length);
} }
DEBUG(("TEXT2(x=%d,y=%d,cl=%d,ct=%d,cr=%d,cb=%d,bl=%d,bt=%d,bb=%d,br=%d,fg=0x%x,bg=0x%x,font=%d,fl=0x%x,mix=%d,unk=0x%x,n=%d)\n", DEBUG(("TEXT2(x=%d,y=%d,cl=%d,ct=%d,cr=%d,cb=%d,bl=%d,bt=%d,bb=%d,br=%d,fg=0x%x,bg=0x%x,font=%d,fl=0x%x,mix=%d,unk=0x%x,n=%d)\n", os->x, os->y, os->clipleft, os->cliptop, os->clipright, os->clipbottom, os->boxleft, os->boxtop, os->boxright, os->boxbottom, os->fgcolour, os->bgcolour, os->font, os->flags, os->mixmode, os->unknown, os->length));
os->x, os->y, os->clipleft, os->cliptop, os->clipright,
os->clipbottom, os->boxleft, os->boxtop, os->boxright,
os->boxbottom, os->fgcolour, os->bgcolour, os->font,
os->flags, os->mixmode, os->unknown, os->length));
DEBUG(("Text: ")); DEBUG(("Text: "));

View File

@ -57,7 +57,8 @@ typedef struct _DESTBLT_ORDER
uint16 cy; uint16 cy;
uint8 opcode; uint8 opcode;
} DESTBLT_ORDER; }
DESTBLT_ORDER;
typedef struct _PATBLT_ORDER typedef struct _PATBLT_ORDER
{ {
@ -70,7 +71,8 @@ typedef struct _PATBLT_ORDER
uint8 fgcolour; uint8 fgcolour;
BRUSH brush; BRUSH brush;
} PATBLT_ORDER; }
PATBLT_ORDER;
typedef struct _SCREENBLT_ORDER typedef struct _SCREENBLT_ORDER
{ {
@ -82,7 +84,8 @@ typedef struct _SCREENBLT_ORDER
uint16 srcx; uint16 srcx;
uint16 srcy; uint16 srcy;
} SCREENBLT_ORDER; }
SCREENBLT_ORDER;
typedef struct _LINE_ORDER typedef struct _LINE_ORDER
{ {
@ -95,7 +98,8 @@ typedef struct _LINE_ORDER
uint8 opcode; uint8 opcode;
PEN pen; PEN pen;
} LINE_ORDER; }
LINE_ORDER;
typedef struct _RECT_ORDER typedef struct _RECT_ORDER
{ {
@ -105,7 +109,8 @@ typedef struct _RECT_ORDER
uint16 cy; uint16 cy;
uint8 colour; uint8 colour;
} RECT_ORDER; }
RECT_ORDER;
typedef struct _DESKSAVE_ORDER typedef struct _DESKSAVE_ORDER
{ {
@ -116,7 +121,8 @@ typedef struct _DESKSAVE_ORDER
uint16 bottom; uint16 bottom;
uint8 action; uint8 action;
} DESKSAVE_ORDER; }
DESKSAVE_ORDER;
typedef struct _TRIBLT_ORDER typedef struct _TRIBLT_ORDER
{ {
@ -135,7 +141,8 @@ typedef struct _TRIBLT_ORDER
uint16 cache_idx; uint16 cache_idx;
uint16 unknown; uint16 unknown;
} TRIBLT_ORDER; }
TRIBLT_ORDER;
typedef struct _MEMBLT_ORDER typedef struct _MEMBLT_ORDER
{ {
@ -150,7 +157,8 @@ typedef struct _MEMBLT_ORDER
uint16 srcy; uint16 srcy;
uint16 cache_idx; uint16 cache_idx;
} MEMBLT_ORDER; }
MEMBLT_ORDER;
#define MAX_DATA 256 #define MAX_DATA 256
@ -164,7 +172,8 @@ typedef struct _POLYLINE_ORDER
uint8 datasize; uint8 datasize;
uint8 data[MAX_DATA]; uint8 data[MAX_DATA];
} POLYLINE_ORDER; }
POLYLINE_ORDER;
#define MAX_TEXT 256 #define MAX_TEXT 256
@ -189,7 +198,8 @@ typedef struct _TEXT2_ORDER
uint8 length; uint8 length;
uint8 text[MAX_TEXT]; uint8 text[MAX_TEXT];
} TEXT2_ORDER; }
TEXT2_ORDER;
typedef struct _RDP_ORDER_STATE typedef struct _RDP_ORDER_STATE
{ {
@ -207,7 +217,8 @@ typedef struct _RDP_ORDER_STATE
POLYLINE_ORDER polyline; POLYLINE_ORDER polyline;
TEXT2_ORDER text2; TEXT2_ORDER text2;
} RDP_ORDER_STATE; }
RDP_ORDER_STATE;
typedef struct _RDP_RAW_BMPCACHE_ORDER typedef struct _RDP_RAW_BMPCACHE_ORDER
{ {
@ -220,7 +231,8 @@ typedef struct _RDP_RAW_BMPCACHE_ORDER
uint16 cache_idx; uint16 cache_idx;
uint8 *data; uint8 *data;
} RDP_RAW_BMPCACHE_ORDER; }
RDP_RAW_BMPCACHE_ORDER;
typedef struct _RDP_BMPCACHE_ORDER typedef struct _RDP_BMPCACHE_ORDER
{ {
@ -237,7 +249,8 @@ typedef struct _RDP_BMPCACHE_ORDER
uint16 final_size; uint16 final_size;
uint8 *data; uint8 *data;
} RDP_BMPCACHE_ORDER; }
RDP_BMPCACHE_ORDER;
#define MAX_GLYPH 32 #define MAX_GLYPH 32
@ -250,7 +263,8 @@ typedef struct _RDP_FONT_GLYPH
uint16 height; uint16 height;
uint8 data[MAX_GLYPH]; uint8 data[MAX_GLYPH];
} RDP_FONT_GLYPH; }
RDP_FONT_GLYPH;
#define MAX_GLYPHS 256 #define MAX_GLYPHS 256
@ -260,11 +274,13 @@ typedef struct _RDP_FONTCACHE_ORDER
uint8 nglyphs; uint8 nglyphs;
RDP_FONT_GLYPH glyphs[MAX_GLYPHS]; RDP_FONT_GLYPH glyphs[MAX_GLYPHS];
} RDP_FONTCACHE_ORDER; }
RDP_FONTCACHE_ORDER;
typedef struct _RDP_COLCACHE_ORDER typedef struct _RDP_COLCACHE_ORDER
{ {
uint8 cache_id; uint8 cache_id;
COLOURMAP map; COLOURMAP map;
} RDP_COLCACHE_ORDER; }
RDP_COLCACHE_ORDER;

View File

@ -32,7 +32,8 @@ typedef struct stream
unsigned char *sec_hdr; unsigned char *sec_hdr;
unsigned char *rdp_hdr; unsigned char *rdp_hdr;
} *STREAM; }
*STREAM;
#define s_push_layer(s,h,n) { (s)->h = (s)->p; (s)->p += n; } #define s_push_layer(s,h,n) { (s)->h = (s)->p; (s)->p += n; }
#define s_pop_layer(s,h) (s)->p = (s)->h; #define s_pop_layer(s,h) (s)->p = (s)->h;

66
proto.h
View File

@ -1,14 +1,18 @@
/* bitmap.c */ /* bitmap.c */
BOOL bitmap_decompress(unsigned char *output, int width, int height, unsigned char *input, int size); BOOL bitmap_decompress(unsigned char *output, int width, int height,
unsigned char *input, int size);
/* cache.c */ /* cache.c */
HBITMAP cache_get_bitmap(uint8 cache_id, uint16 cache_idx); HBITMAP cache_get_bitmap(uint8 cache_id, uint16 cache_idx);
void cache_put_bitmap(uint8 cache_id, uint16 cache_idx, HBITMAP bitmap); void cache_put_bitmap(uint8 cache_id, uint16 cache_idx, HBITMAP bitmap);
FONTGLYPH *cache_get_font(uint8 font, uint16 character); FONTGLYPH *cache_get_font(uint8 font, uint16 character);
void cache_put_font(uint8 font, uint16 character, uint16 offset, uint16 baseline, uint16 width, uint16 height, HGLYPH pixmap); void cache_put_font(uint8 font, uint16 character, uint16 offset,
uint16 baseline, uint16 width, uint16 height,
HGLYPH pixmap);
DATABLOB *cache_get_text(uint8 cache_id); DATABLOB *cache_get_text(uint8 cache_id);
void cache_put_text(uint8 cache_id, void *data, int length); void cache_put_text(uint8 cache_id, void *data, int length);
uint8 *cache_get_desktop(uint32 offset, int cx, int cy, int bytes_per_pixel); uint8 *cache_get_desktop(uint32 offset, int cx, int cy, int bytes_per_pixel);
void cache_put_desktop(uint32 offset, int cx, int cy, int scanline, int bytes_per_pixel, uint8 *data); void cache_put_desktop(uint32 offset, int cx, int cy, int scanline,
int bytes_per_pixel, uint8 * data);
HCURSOR cache_get_cursor(uint16 cache_idx); HCURSOR cache_get_cursor(uint16 cache_idx);
void cache_put_cursor(uint16 cache_idx, HCURSOR cursor); void cache_put_cursor(uint16 cache_idx, HCURSOR cursor);
/* iso.c */ /* iso.c */
@ -30,7 +34,7 @@ void process_orders(STREAM s);
void reset_order_state(void); void reset_order_state(void);
/* rdesktop.c */ /* rdesktop.c */
int main(int argc, char *argv[]); int main(int argc, char *argv[]);
void generate_random(uint8 *random); void generate_random(uint8 * random);
void *xmalloc(int size); void *xmalloc(int size);
void *xrealloc(void *oldmem, int size); void *xrealloc(void *oldmem, int size);
void xfree(void *mem); void xfree(void *mem);
@ -41,15 +45,19 @@ int load_licence(unsigned char **data);
void save_licence(unsigned char *data, int length); void save_licence(unsigned char *data, int length);
/* rdp.c */ /* rdp.c */
void rdp_out_unistr(STREAM s, char *string, int len); void rdp_out_unistr(STREAM s, char *string, int len);
void rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags, uint16 param1, uint16 param2); void rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags,
uint16 param1, uint16 param2);
void rdp_main_loop(void); void rdp_main_loop(void);
BOOL rdp_connect(char *server, uint32 flags, char *domain, char *password, char *command, char *directory); BOOL rdp_connect(char *server, uint32 flags, char *domain, char *password,
char *command, char *directory);
void rdp_disconnect(void); void rdp_disconnect(void);
/* secure.c */ /* secure.c */
void sec_hash_48(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2, uint8 salt); void sec_hash_48(uint8 * out, uint8 * in, uint8 * salt1, uint8 * salt2,
void sec_hash_16(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2); uint8 salt);
void buf_out_uint32(uint8 *buffer, uint32 value); void sec_hash_16(uint8 * out, uint8 * in, uint8 * salt1, uint8 * salt2);
void sec_sign(uint8 *signature, int siglen, uint8 *session_key, int keylen, uint8 *data, int datalen); void buf_out_uint32(uint8 * buffer, uint32 value);
void sec_sign(uint8 * signature, int siglen, uint8 * session_key, int keylen,
uint8 * data, int datalen);
STREAM sec_init(uint32 flags, int maxlen); STREAM sec_init(uint32 flags, int maxlen);
void sec_send(STREAM s, uint32 flags); void sec_send(STREAM s, uint32 flags);
STREAM sec_recv(void); STREAM sec_recv(void);
@ -63,35 +71,47 @@ BOOL tcp_connect(char *server);
void tcp_disconnect(void); void tcp_disconnect(void);
/* xkeymap.c */ /* xkeymap.c */
void xkeymap_init(void); void xkeymap_init(void);
uint8 xkeymap_translate_key(unsigned int keysym, unsigned int keycode, uint16 *flags); uint8 xkeymap_translate_key(unsigned int keysym, unsigned int keycode,
uint16 * flags);
uint16 xkeymap_translate_button(unsigned int button); uint16 xkeymap_translate_button(unsigned int button);
/* xwin.c */ /* xwin.c */
BOOL ui_create_window(char *title); BOOL ui_create_window(char *title);
void ui_destroy_window(void); void ui_destroy_window(void);
void ui_select(int rdp_socket); void ui_select(int rdp_socket);
void ui_move_pointer(int x, int y); void ui_move_pointer(int x, int y);
HBITMAP ui_create_bitmap(int width, int height, uint8 *data); HBITMAP ui_create_bitmap(int width, int height, uint8 * data);
void ui_paint_bitmap(int x, int y, int cx, int cy, int width, int height, uint8 *data); void ui_paint_bitmap(int x, int y, int cx, int cy, int width, int height,
uint8 * data);
void ui_destroy_bitmap(HBITMAP bmp); void ui_destroy_bitmap(HBITMAP bmp);
HGLYPH ui_create_glyph(int width, int height, uint8 *data); HGLYPH ui_create_glyph(int width, int height, uint8 * data);
void ui_destroy_glyph(HGLYPH glyph); void ui_destroy_glyph(HGLYPH glyph);
HCURSOR ui_create_cursor(unsigned int x, unsigned int y, int width, int height, uint8 *andmask, uint8 *xormask); HCURSOR ui_create_cursor(unsigned int x, unsigned int y, int width,
int height, uint8 * andmask, uint8 * xormask);
void ui_set_cursor(HCURSOR cursor); void ui_set_cursor(HCURSOR cursor);
void ui_destroy_cursor(HCURSOR cursor); void ui_destroy_cursor(HCURSOR cursor);
HCOLOURMAP ui_create_colourmap(COLOURMAP *colours); HCOLOURMAP ui_create_colourmap(COLOURMAP * colours);
void ui_destroy_colourmap(HCOLOURMAP map); void ui_destroy_colourmap(HCOLOURMAP map);
void ui_set_colourmap(HCOLOURMAP map); void ui_set_colourmap(HCOLOURMAP map);
void ui_set_clip(int x, int y, int cx, int cy); void ui_set_clip(int x, int y, int cx, int cy);
void ui_reset_clip(void); void ui_reset_clip(void);
void ui_bell(void); void ui_bell(void);
void ui_destblt(uint8 opcode, int x, int y, int cx, int cy); void ui_destblt(uint8 opcode, int x, int y, int cx, int cy);
void ui_patblt(uint8 opcode, int x, int y, int cx, int cy, BRUSH *brush, int bgcolour, int fgcolour); void ui_patblt(uint8 opcode, int x, int y, int cx, int cy, BRUSH * brush,
void ui_screenblt(uint8 opcode, int x, int y, int cx, int cy, int srcx, int srcy); int bgcolour, int fgcolour);
void ui_memblt(uint8 opcode, int x, int y, int cx, int cy, HBITMAP src, int srcx, int srcy); void ui_screenblt(uint8 opcode, int x, int y, int cx, int cy, int srcx,
void ui_triblt(uint8 opcode, int x, int y, int cx, int cy, HBITMAP src, int srcx, int srcy, BRUSH *brush, int bgcolour, int fgcolour); int srcy);
void ui_line(uint8 opcode, int startx, int starty, int endx, int endy, PEN *pen); void ui_memblt(uint8 opcode, int x, int y, int cx, int cy, HBITMAP src,
int srcx, int srcy);
void ui_triblt(uint8 opcode, int x, int y, int cx, int cy, HBITMAP src,
int srcx, int srcy, BRUSH * brush, int bgcolour, int fgcolour);
void ui_line(uint8 opcode, int startx, int starty, int endx, int endy,
PEN * pen);
void ui_rect(int x, int y, int cx, int cy, int colour); void ui_rect(int x, int y, int cx, int cy, int colour);
void ui_draw_glyph(int mixmode, int x, int y, int cx, int cy, HGLYPH glyph, int srcx, int srcy, int bgcolour, int fgcolour); void ui_draw_glyph(int mixmode, int x, int y, int cx, int cy, HGLYPH glyph,
void ui_draw_text(uint8 font, uint8 flags, int mixmode, int x, int y, int clipx, int clipy, int clipcx, int clipcy, int boxx, int boxy, int boxcx, int boxcy, int bgcolour, int fgcolour, uint8 *text, uint8 length); int srcx, int srcy, int bgcolour, int fgcolour);
void ui_draw_text(uint8 font, uint8 flags, int mixmode, int x, int y,
int clipx, int clipy, int clipcx, int clipcy, int boxx,
int boxy, int boxcx, int boxcy, int bgcolour, int fgcolour,
uint8 * text, uint8 length);
void ui_desktop_save(uint32 offset, int x, int y, int cx, int cy); void ui_desktop_save(uint32 offset, int x, int y, int cx, int cy);
void ui_desktop_restore(uint32 offset, int x, int y, int cx, int cy); void ui_desktop_restore(uint32 offset, int x, int y, int cx, int cy);

View File

@ -81,7 +81,8 @@ main(int argc, char *argv[])
int c; int c;
printf("rdesktop: A Remote Desktop Protocol client.\n"); printf("rdesktop: A Remote Desktop Protocol client.\n");
printf("Version " VERSION ". Copyright (C) 1999-2001 Matt Chapman.\n"); printf("Version " VERSION
". Copyright (C) 1999-2001 Matt Chapman.\n");
printf("See http://www.rdesktop.org/ for more information.\n\n"); printf("See http://www.rdesktop.org/ for more information.\n\n");
flags = RDP_LOGON_NORMAL; flags = RDP_LOGON_NORMAL;
@ -118,13 +119,14 @@ main(int argc, char *argv[])
break; break;
case 'k': case 'k':
STRNCPY(keymapname, optarg, sizeof(keymapname)); STRNCPY(keymapname, optarg,
sizeof(keymapname));
break; break;
case 'g': case 'g':
width = strtol(optarg, &p, 10); width = strtol(optarg, &p, 10);
if (*p == 'x') if (*p == 'x')
height = strtol(p+1, NULL, 10); height = strtol(p + 1, NULL, 10);
if ((width == 0) || (height == 0)) if ((width == 0) || (height == 0))
{ {
@ -238,7 +240,7 @@ main(int argc, char *argv[])
/* Generate a 32-byte random for the secure transport code. */ /* Generate a 32-byte random for the secure transport code. */
void void
generate_random(uint8 *random) generate_random(uint8 * random)
{ {
struct stat st; struct stat st;
struct tms tmsbuf; struct tms tmsbuf;
@ -343,7 +345,7 @@ hexdump(unsigned char *p, unsigned int len)
printf("%02x ", line[i]); printf("%02x ", line[i]);
for (; i < 16; i++) for (; i < 16; i++)
printf(" "); printf(" ");
for (i = 0; i < thisline; i++) for (i = 0; i < thisline; i++)
printf("%c", printf("%c",
@ -369,7 +371,7 @@ load_licence(unsigned char **data)
return -1; return -1;
STRNCPY(path, home, sizeof(path)); STRNCPY(path, home, sizeof(path));
strncat(path, "/.rdesktop/licence", sizeof(path)-strlen(path)-1); strncat(path, "/.rdesktop/licence", sizeof(path) - strlen(path) - 1);
fd = open(path, O_RDONLY); fd = open(path, O_RDONLY);
if (fd == -1) if (fd == -1)
@ -394,12 +396,12 @@ save_licence(unsigned char *data, int length)
return; return;
STRNCPY(path, home, sizeof(path)); STRNCPY(path, home, sizeof(path));
strncat(path, "/.rdesktop", sizeof(path)-strlen(path)-1); strncat(path, "/.rdesktop", sizeof(path) - strlen(path) - 1);
mkdir(path, 0700); mkdir(path, 0700);
strncat(path, "/licence", sizeof(path)-strlen(path)-1); strncat(path, "/licence", sizeof(path) - strlen(path) - 1);
fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0600); fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
if (fd == -1) if (fd == -1)
{ {
perror("open"); perror("open");
@ -409,4 +411,3 @@ save_licence(unsigned char *data, int length)
write(fd, data, length); write(fd, data, length);
close(fd); close(fd);
} }

8
rdp.c
View File

@ -60,7 +60,7 @@ rdp_send(STREAM s, uint8 pdu_type)
/* Receive an RDP packet */ /* Receive an RDP packet */
static STREAM static STREAM
rdp_recv(uint8 *type) rdp_recv(uint8 * type)
{ {
static STREAM rdp_s; static STREAM rdp_s;
uint16 length, pdu_type; uint16 length, pdu_type;
@ -156,7 +156,7 @@ rdp_send_logon_info(uint32 flags, char *domain, char *user,
int len_program = 2 * strlen(program); int len_program = 2 * strlen(program);
int len_directory = 2 * strlen(directory); int len_directory = 2 * strlen(directory);
uint32 sec_flags = encryption ? (SEC_LOGON_INFO | SEC_ENCRYPT) uint32 sec_flags = encryption ? (SEC_LOGON_INFO | SEC_ENCRYPT)
: SEC_LOGON_INFO; : SEC_LOGON_INFO;
STREAM s; STREAM s;
s = sec_init(sec_flags, 18 + len_domain + len_user + len_password s = sec_init(sec_flags, 18 + len_domain + len_user + len_password
@ -443,7 +443,7 @@ rdp_send_confirm_active()
RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE + RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE +
RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL + RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL +
RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + RDP_CAPLEN_UNKNOWN RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + RDP_CAPLEN_UNKNOWN
+ 4 /* w2k fix, why? */; + 4 /* w2k fix, why? */ ;
s = rdp_init(14 + caplen + sizeof(RDP_SOURCE)); s = rdp_init(14 + caplen + sizeof(RDP_SOURCE));
@ -616,7 +616,7 @@ process_palette(STREAM s)
in_uint16_le(s, map.ncolours); in_uint16_le(s, map.ncolours);
in_uint8s(s, 2); /* pad */ in_uint8s(s, 2); /* pad */
in_uint8p(s, colours, (map.ncolours * 3)); in_uint8p(s, colours, (map.ncolours * 3));
map.colours = (COLOURENTRY *)colours; map.colours = (COLOURENTRY *) colours;
hmap = ui_create_colourmap(&map); hmap = ui_create_colourmap(&map);
ui_set_colourmap(hmap); ui_set_colourmap(hmap);

View File

@ -56,7 +56,7 @@ static uint8 sec_crypted_random[SEC_MODULUS_SIZE];
* Both SHA1 and MD5 algorithms are used. * Both SHA1 and MD5 algorithms are used.
*/ */
void void
sec_hash_48(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2, uint8 salt) sec_hash_48(uint8 * out, uint8 * in, uint8 * salt1, uint8 * salt2, uint8 salt)
{ {
uint8 shasig[20]; uint8 shasig[20];
uint8 pad[4]; uint8 pad[4];
@ -87,7 +87,7 @@ sec_hash_48(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2, uint8 salt)
* only using a single round of MD5. * only using a single round of MD5.
*/ */
void void
sec_hash_16(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2) sec_hash_16(uint8 * out, uint8 * in, uint8 * salt1, uint8 * salt2)
{ {
MD5_CTX md5; MD5_CTX md5;
@ -100,7 +100,7 @@ sec_hash_16(uint8 *out, uint8 *in, uint8 *salt1, uint8 *salt2)
/* Reduce key entropy from 64 to 40 bits */ /* Reduce key entropy from 64 to 40 bits */
static void static void
sec_make_40bit(uint8 *key) sec_make_40bit(uint8 * key)
{ {
key[0] = 0xd1; key[0] = 0xd1;
key[1] = 0x26; key[1] = 0x26;
@ -109,7 +109,7 @@ sec_make_40bit(uint8 *key)
/* Generate a session key and RC4 keys, given client and server randoms */ /* Generate a session key and RC4 keys, given client and server randoms */
static void static void
sec_generate_keys(uint8 *client_key, uint8 *server_key, int rc4_key_size) sec_generate_keys(uint8 * client_key, uint8 * server_key, int rc4_key_size)
{ {
uint8 session_key[48]; uint8 session_key[48];
uint8 temp_hash[48]; uint8 temp_hash[48];
@ -171,7 +171,7 @@ static uint8 pad_92[48] = {
/* Output a uint32 into a buffer (little-endian) */ /* Output a uint32 into a buffer (little-endian) */
void void
buf_out_uint32(uint8 *buffer, uint32 value) buf_out_uint32(uint8 * buffer, uint32 value)
{ {
buffer[0] = (value) & 0xff; buffer[0] = (value) & 0xff;
buffer[1] = (value >> 8) & 0xff; buffer[1] = (value >> 8) & 0xff;
@ -181,8 +181,8 @@ buf_out_uint32(uint8 *buffer, uint32 value)
/* Generate a signature hash, using a combination of SHA1 and MD5 */ /* Generate a signature hash, using a combination of SHA1 and MD5 */
void void
sec_sign(uint8 *signature, int siglen, uint8 *session_key, int keylen, sec_sign(uint8 * signature, int siglen, uint8 * session_key, int keylen,
uint8 *data, int datalen) uint8 * data, int datalen)
{ {
uint8 shasig[20]; uint8 shasig[20];
uint8 md5sig[16]; uint8 md5sig[16];
@ -210,7 +210,7 @@ sec_sign(uint8 *signature, int siglen, uint8 *session_key, int keylen,
/* Update an encryption key - similar to the signing process */ /* Update an encryption key - similar to the signing process */
static void static void
sec_update(uint8 *key, uint8 *update_key) sec_update(uint8 * key, uint8 * update_key)
{ {
uint8 shasig[20]; uint8 shasig[20];
SHA_CTX sha; SHA_CTX sha;
@ -238,7 +238,7 @@ sec_update(uint8 *key, uint8 *update_key)
/* Encrypt data using RC4 */ /* Encrypt data using RC4 */
static void static void
sec_encrypt(uint8 *data, int length) sec_encrypt(uint8 * data, int length)
{ {
static int use_count; static int use_count;
@ -255,7 +255,7 @@ sec_encrypt(uint8 *data, int length)
/* Decrypt data using RC4 */ /* Decrypt data using RC4 */
static void static void
sec_decrypt(uint8 *data, int length) sec_decrypt(uint8 * data, int length)
{ {
static int use_count; static int use_count;
@ -271,12 +271,12 @@ sec_decrypt(uint8 *data, int length)
} }
static void static void
reverse(uint8 *p, int len) reverse(uint8 * p, int len)
{ {
int i, j; int i, j;
uint8 temp; uint8 temp;
for (i = 0, j = len-1; i < j; i++, j--) for (i = 0, j = len - 1; i < j; i++, j--)
{ {
temp = p[i]; temp = p[i];
p[i] = p[j]; p[i] = p[j];
@ -286,8 +286,8 @@ reverse(uint8 *p, int len)
/* Perform an RSA public key encryption operation */ /* Perform an RSA public key encryption operation */
static void static void
sec_rsa_encrypt(uint8 *out, uint8 *in, int len, sec_rsa_encrypt(uint8 * out, uint8 * in, int len,
uint8 *modulus, uint8 *exponent) uint8 * modulus, uint8 * exponent)
{ {
BN_CTX ctx; BN_CTX ctx;
BIGNUM mod, exp, x, y; BIGNUM mod, exp, x, y;
@ -312,7 +312,7 @@ sec_rsa_encrypt(uint8 *out, uint8 *in, int len,
outlen = BN_bn2bin(&y, out); outlen = BN_bn2bin(&y, out);
reverse(out, outlen); reverse(out, outlen);
if (outlen < SEC_MODULUS_SIZE) if (outlen < SEC_MODULUS_SIZE)
memset(out+outlen, 0, SEC_MODULUS_SIZE-outlen); memset(out + outlen, 0, SEC_MODULUS_SIZE - outlen);
BN_free(&y); BN_free(&y);
BN_clear_free(&x); BN_clear_free(&x);
@ -358,7 +358,8 @@ sec_send(STREAM s, uint32 flags)
hexdump(s->p + 8, datalen); hexdump(s->p + 8, datalen);
#endif #endif
sec_sign(s->p, 8, sec_sign_key, rc4_key_len, s->p + 8, datalen); sec_sign(s->p, 8, sec_sign_key, rc4_key_len, s->p + 8,
datalen);
sec_encrypt(s->p + 8, datalen); sec_encrypt(s->p + 8, datalen);
} }
@ -438,7 +439,7 @@ sec_out_mcs_data(STREAM s)
/* Parse a public key structure */ /* Parse a public key structure */
static BOOL static BOOL
sec_parse_public_key(STREAM s, uint8 **modulus, uint8 **exponent) sec_parse_public_key(STREAM s, uint8 ** modulus, uint8 ** exponent)
{ {
uint32 magic, modulus_len; uint32 magic, modulus_len;
@ -466,8 +467,9 @@ sec_parse_public_key(STREAM s, uint8 **modulus, uint8 **exponent)
/* Parse a crypto information structure */ /* Parse a crypto information structure */
static BOOL static BOOL
sec_parse_crypt_info(STREAM s, uint32 *rc4_key_size, sec_parse_crypt_info(STREAM s, uint32 * rc4_key_size,
uint8 **server_random, uint8 **modulus, uint8 **exponent) uint8 ** server_random, uint8 ** modulus,
uint8 ** exponent)
{ {
uint32 crypt_level, random_len, rsa_info_len; uint32 crypt_level, random_len, rsa_info_len;
uint16 tag, length; uint16 tag, length;

21
types.h
View File

@ -40,14 +40,16 @@ typedef struct _COLOURENTRY
uint8 green; uint8 green;
uint8 blue; uint8 blue;
} COLOURENTRY; }
COLOURENTRY;
typedef struct _COLOURMAP typedef struct _COLOURMAP
{ {
uint16 ncolours; uint16 ncolours;
COLOURENTRY *colours; COLOURENTRY *colours;
} COLOURMAP; }
COLOURMAP;
typedef struct _BOUNDS typedef struct _BOUNDS
{ {
@ -56,7 +58,8 @@ typedef struct _BOUNDS
uint16 right; uint16 right;
uint16 bottom; uint16 bottom;
} BOUNDS; }
BOUNDS;
typedef struct _PEN typedef struct _PEN
{ {
@ -64,7 +67,8 @@ typedef struct _PEN
uint8 width; uint8 width;
uint8 colour; uint8 colour;
} PEN; }
PEN;
typedef struct _BRUSH typedef struct _BRUSH
{ {
@ -73,7 +77,8 @@ typedef struct _BRUSH
uint8 style; uint8 style;
uint8 pattern[8]; uint8 pattern[8];
} BRUSH; }
BRUSH;
typedef struct _FONTGLYPH typedef struct _FONTGLYPH
{ {
@ -83,11 +88,13 @@ typedef struct _FONTGLYPH
uint16 height; uint16 height;
HBITMAP pixmap; HBITMAP pixmap;
} FONTGLYPH; }
FONTGLYPH;
typedef struct _DATABLOB typedef struct _DATABLOB
{ {
void *data; void *data;
int size; int size;
} DATABLOB; }
DATABLOB;

View File

@ -36,7 +36,8 @@ extern int keylayout;
static uint8 keymap[KEYMAP_SIZE]; static uint8 keymap[KEYMAP_SIZE];
static unsigned int min_keycode; static unsigned int min_keycode;
static BOOL xkeymap_read(char *mapname) static BOOL
xkeymap_read(char *mapname)
{ {
FILE *fp; FILE *fp;
char line[PATH_MAX], path[PATH_MAX]; char line[PATH_MAX], path[PATH_MAX];
@ -72,21 +73,23 @@ static BOOL xkeymap_read(char *mapname)
keysym = XStringToKeysym(keyname); keysym = XStringToKeysym(keyname);
if (keysym == NoSymbol) if (keysym == NoSymbol)
error("Bad keysym %s in keymap %s\n", keyname, mapname); error("Bad keysym %s in keymap %s\n",
keyname, mapname);
keymap[keysym & KEYMAP_MASK] = keycode; keymap[keysym & KEYMAP_MASK] = keycode;
keyname = p; keyname = p;
} while (keyname != NULL); }
while (keyname != NULL);
} }
else if (strncmp(line, "include ", 8) == 0) else if (strncmp(line, "include ", 8) == 0)
{ {
if (!xkeymap_read(line+8)) if (!xkeymap_read(line + 8))
return False; return False;
} }
else if (strncmp(line, "map ", 4) == 0) else if (strncmp(line, "map ", 4) == 0)
{ {
keylayout = strtol(line+4, NULL, 16); keylayout = strtol(line + 4, NULL, 16);
} }
else if (line[0] != '#') else if (line[0] != '#')
{ {
@ -98,7 +101,8 @@ static BOOL xkeymap_read(char *mapname)
return True; return True;
} }
void xkeymap_init(void) void
xkeymap_init(void)
{ {
unsigned int max_keycode; unsigned int max_keycode;
@ -108,7 +112,9 @@ void xkeymap_init(void)
xkeymap_read(keymapname); xkeymap_read(keymapname);
} }
uint8 xkeymap_translate_key(unsigned int keysym, unsigned int keycode, uint16 *flags) uint8
xkeymap_translate_key(unsigned int keysym, unsigned int keycode,
uint16 * flags)
{ {
uint8 scancode; uint8 scancode;
@ -124,7 +130,7 @@ uint8 xkeymap_translate_key(unsigned int keysym, unsigned int keycode, uint16 *f
/* not in keymap, try to interpret the raw scancode */ /* not in keymap, try to interpret the raw scancode */
if ((keycode >= min_keycode) && (keycode <= 0x60)) if ((keycode >= min_keycode) && (keycode <= 0x60))
return (uint8)(keycode - min_keycode); return (uint8) (keycode - min_keycode);
*flags |= KBD_FLAG_EXT; *flags |= KBD_FLAG_EXT;
@ -173,19 +179,20 @@ uint8 xkeymap_translate_key(unsigned int keysym, unsigned int keycode, uint16 *f
return 0; return 0;
} }
uint16 xkeymap_translate_button(unsigned int button) uint16
xkeymap_translate_button(unsigned int button)
{ {
switch (button) switch (button)
{ {
case Button1: /* left */ case Button1: /* left */
return MOUSE_FLAG_BUTTON1; return MOUSE_FLAG_BUTTON1;
case Button2: /* middle */ case Button2: /* middle */
return MOUSE_FLAG_BUTTON3; return MOUSE_FLAG_BUTTON3;
case Button3: /* right */ case Button3: /* right */
return MOUSE_FLAG_BUTTON2; return MOUSE_FLAG_BUTTON2;
case Button4: /* wheel up */ case Button4: /* wheel up */
return MOUSE_FLAG_BUTTON4; return MOUSE_FLAG_BUTTON4;
case Button5: /* wheel down */ case Button5: /* wheel down */
return MOUSE_FLAG_BUTTON5; return MOUSE_FLAG_BUTTON5;
} }

442
xwin.c
View File

@ -106,27 +106,27 @@ static int rop2_map[] = {
#define RESET_FUNCTION(rop2) { if (rop2 != ROP2_COPY) XSetFunction(display, gc, GXcopy); } #define RESET_FUNCTION(rop2) { if (rop2 != ROP2_COPY) XSetFunction(display, gc, GXcopy); }
void xwin_get_numlock_mask(); void xwin_get_numlock_mask();
void xwin_mod_update(uint32 state, uint32 ev_time ); void xwin_mod_update(uint32 state, uint32 ev_time);
void xwin_mod_release(uint32 state, uint32 ev_time, uint32 scancode); void xwin_mod_release(uint32 state, uint32 ev_time, uint32 scancode);
void xwin_mod_press(uint32 state, uint32 ev_time, uint32 scancode); void xwin_mod_press(uint32 state, uint32 ev_time, uint32 scancode);
static void static void
translate8(uint8 *data, uint8 *out, uint8 *end) translate8(uint8 * data, uint8 * out, uint8 * end)
{ {
while (out < end) while (out < end)
*(out++) = (uint8)colmap[*(data++)]; *(out++) = (uint8) colmap[*(data++)];
} }
static void static void
translate16(uint8 *data, uint16 *out, uint16 *end) translate16(uint8 * data, uint16 * out, uint16 * end)
{ {
while (out < end) while (out < end)
*(out++) = (uint16)colmap[*(data++)]; *(out++) = (uint16) colmap[*(data++)];
} }
/* little endian - conversion happens when colourmap is built */ /* little endian - conversion happens when colourmap is built */
static void static void
translate24(uint8 *data, uint8 *out, uint8 *end) translate24(uint8 * data, uint8 * out, uint8 * end)
{ {
uint32 value; uint32 value;
@ -140,16 +140,16 @@ translate24(uint8 *data, uint8 *out, uint8 *end)
} }
static void static void
translate32(uint8 *data, uint32 *out, uint32 *end) translate32(uint8 * data, uint32 * out, uint32 * end)
{ {
while (out < end) while (out < end)
*(out++) = colmap[*(data++)]; *(out++) = colmap[*(data++)];
} }
static uint8 * static uint8 *
translate_image(int width, int height, uint8 *data) translate_image(int width, int height, uint8 * data)
{ {
int size = width * height * bpp/8; int size = width * height * bpp / 8;
uint8 *out = xmalloc(size); uint8 *out = xmalloc(size);
uint8 *end = out + size; uint8 *end = out + size;
@ -160,7 +160,7 @@ translate_image(int width, int height, uint8 *data)
break; break;
case 16: case 16:
translate16(data, (uint16 *)out, (uint16 *)end); translate16(data, (uint16 *) out, (uint16 *) end);
break; break;
case 24: case 24:
@ -168,7 +168,7 @@ translate_image(int width, int height, uint8 *data)
break; break;
case 32: case 32:
translate32(data, (uint32 *)out, (uint32 *)end); translate32(data, (uint32 *) out, (uint32 *) end);
break; break;
} }
@ -215,22 +215,24 @@ ui_create_window(char *title)
Screen *screen; Screen *screen;
uint16 test; uint16 test;
int i; int i;
int xkb_minor, xkb_major; int xkb_minor, xkb_major;
int xkb_event, xkb_error, xkb_reason; int xkb_event, xkb_error, xkb_reason;
/* compare compiletime libs with runtime libs. */ /* compare compiletime libs with runtime libs. */
xkb_major = XkbMajorVersion; xkb_major = XkbMajorVersion;
xkb_minor = XkbMinorVersion; xkb_minor = XkbMinorVersion;
if( XkbLibraryVersion( &xkb_major, &xkb_minor ) == False ) if (XkbLibraryVersion(&xkb_major, &xkb_minor) == False)
{ {
error("please re-compile rdesktop\ncompile time version of xkb is not compatible with\nyour runtime version of the library\n"); error("please re-compile rdesktop\ncompile time version of xkb is not compatible with\nyour runtime version of the library\n");
return False; return False;
} }
display = XkbOpenDisplay( NULL, &xkb_event, &xkb_error, &xkb_major, &xkb_minor, &xkb_reason ); display =
switch(xkb_reason) XkbOpenDisplay(NULL, &xkb_event, &xkb_error, &xkb_major,
&xkb_minor, &xkb_reason);
switch (xkb_reason)
{ {
case XkbOD_BadLibraryVersion: case XkbOD_BadLibraryVersion:
error("XkbOD_BadLibraryVersion: XKB extensions in server and the library rdesktop is linked against aren't compatible with each other.\n"); error("XkbOD_BadLibraryVersion: XKB extensions in server and the library rdesktop is linked against aren't compatible with each other.\n");
@ -259,7 +261,7 @@ ui_create_window(char *title)
screen = DefaultScreenOfDisplay(display); screen = DefaultScreenOfDisplay(display);
visual = DefaultVisualOfScreen(screen); visual = DefaultVisualOfScreen(screen);
depth = DefaultDepthOfScreen(screen); depth = DefaultDepthOfScreen(screen);
pfm = XListPixmapFormats(display, &i); pfm = XListPixmapFormats(display, &i);
if (pfm != NULL) if (pfm != NULL)
{ {
@ -289,7 +291,7 @@ ui_create_window(char *title)
xcolmap = DefaultColormapOfScreen(screen); xcolmap = DefaultColormapOfScreen(screen);
test = 1; test = 1;
host_be = !(BOOL)(*(uint8 *)(&test)); host_be = !(BOOL) (*(uint8 *) (&test));
xserver_be = (ImageByteOrder(display) == MSBFirst); xserver_be = (ImageByteOrder(display) == MSBFirst);
white = WhitePixelOfScreen(screen); white = WhitePixelOfScreen(screen);
@ -310,7 +312,7 @@ ui_create_window(char *title)
attribs.override_redirect = False; attribs.override_redirect = False;
} }
width = (width + 3) & ~3; /* make width a multiple of 32 bits */ width = (width + 3) & ~3; /* make width a multiple of 32 bits */
wnd = XCreateWindow(display, RootWindowOfScreen(screen), wnd = XCreateWindow(display, RootWindowOfScreen(screen),
0, 0, width, height, 0, CopyFromParent, 0, 0, width, height, 0, CopyFromParent,
@ -341,8 +343,8 @@ ui_create_window(char *title)
xkeymap_init(); xkeymap_init();
input_mask = KeyPressMask | KeyReleaseMask | input_mask = KeyPressMask | KeyReleaseMask |
ButtonPressMask | ButtonReleaseMask | ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask; EnterWindowMask | LeaveWindowMask;
if (sendmotion) if (sendmotion)
input_mask |= PointerMotionMask; input_mask |= PointerMotionMask;
@ -359,19 +361,21 @@ ui_create_window(char *title)
/* TODO: error texts... make them friendly. */ /* TODO: error texts... make them friendly. */
xkb = XkbGetKeyboard(display, XkbAllComponentsMask, XkbUseCoreKbd); xkb = XkbGetKeyboard(display, XkbAllComponentsMask, XkbUseCoreKbd);
if ((int)xkb == BadAlloc || xkb == NULL) if ((int) xkb == BadAlloc || xkb == NULL)
{ {
error( "XkbGetKeyboard failed.\n"); error("XkbGetKeyboard failed.\n");
exit(0); exit(0);
} }
/* TODO: error texts... make them friendly. */ /* TODO: error texts... make them friendly. */
if( XkbSelectEvents(display, xkb->device_spec, XkbAllEventsMask, XkbAllEventsMask) == False ) if (XkbSelectEvents
(display, xkb->device_spec, XkbAllEventsMask,
XkbAllEventsMask) == False)
{ {
error( "XkbSelectEvents failed.\n"); error("XkbSelectEvents failed.\n");
exit(0); exit(0);
} }
xwin_get_numlock_mask(); xwin_get_numlock_mask();
return True; return True;
@ -381,28 +385,37 @@ void
xwin_get_numlock_mask() xwin_get_numlock_mask()
{ {
KeyCode numlockcode; KeyCode numlockcode;
KeyCode* keycode; KeyCode *keycode;
XModifierKeymap *modmap; XModifierKeymap *modmap;
int i,j; int i, j;
/* Find out if numlock is already defined as a modifier key, and if so where */ /* Find out if numlock is already defined as a modifier key, and if so where */
numlockcode = XKeysymToKeycode(display, 0xFF7F); /* XF_Num_Lock = 0xFF7F */ numlockcode = XKeysymToKeycode(display, 0xFF7F); /* XF_Num_Lock = 0xFF7F */
if (numlockcode) { if (numlockcode)
{
modmap = XGetModifierMapping(display); modmap = XGetModifierMapping(display);
if (modmap) { if (modmap)
{
keycode = modmap->modifiermap; keycode = modmap->modifiermap;
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
for (j = modmap->max_keypermod; j--;) { for (j = modmap->max_keypermod; j--;)
if (*keycode == numlockcode) { {
numlock_modifier_mask = (1 << i); if (*keycode == numlockcode)
{
numlock_modifier_mask =
(1 << i);
i = 8; i = 8;
break; break;
} }
keycode++; keycode++;
} }
if (!numlock_modifier_mask) { if (!numlock_modifier_mask)
modmap->modifiermap[7 * modmap->max_keypermod] = numlockcode; {
if (XSetModifierMapping(display, modmap) == MappingSuccess) modmap->modifiermap[7 *
modmap->max_keypermod] =
numlockcode;
if (XSetModifierMapping(display, modmap) ==
MappingSuccess)
numlock_modifier_mask = (1 << 7); numlock_modifier_mask = (1 << 7);
else else
printf("XSetModifierMapping failed!\n"); printf("XSetModifierMapping failed!\n");
@ -413,13 +426,13 @@ xwin_get_numlock_mask()
if (!numlock_modifier_mask) if (!numlock_modifier_mask)
printf("WARNING: Failed to get a numlock modifier mapping.\n"); printf("WARNING: Failed to get a numlock modifier mapping.\n");
} }
void void
ui_destroy_window() ui_destroy_window()
{ {
if( xkb != NULL ) if (xkb != NULL)
XkbFreeKeyboard(xkb, XkbAllControlsMask, True); XkbFreeKeyboard(xkb, XkbAllControlsMask, True);
if (ownbackstore) if (ownbackstore)
@ -453,21 +466,31 @@ xwin_process_events()
flags = KBD_FLAG_DOWN | KBD_FLAG_UP; flags = KBD_FLAG_DOWN | KBD_FLAG_UP;
/* fall through */ /* fall through */
case KeyPress: case KeyPress:
if( XkbTranslateKeyCode(xkb, xevent.xkey.keycode, xevent.xkey.state, &tmpmods, &keysym) == False ) if (XkbTranslateKeyCode
(xkb, xevent.xkey.keycode,
xevent.xkey.state, &tmpmods,
&keysym) == False)
break; break;
scancode = xkeymap_translate_key(keysym, xevent.xkey.keycode, &flags); scancode =
xkeymap_translate_key(keysym,
xevent.xkey.
keycode,
&flags);
if (scancode == 0 ) if (scancode == 0)
break; break;
/* keep track of the modifiers -- needed for stickykeys... */ /* keep track of the modifiers -- needed for stickykeys... */
if( xevent.type == KeyPress ) if (xevent.type == KeyPress)
xwin_mod_press( xevent.xkey.state, ev_time, scancode ); xwin_mod_press(xevent.xkey.state,
ev_time, scancode);
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, flags, scancode, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE,
flags, scancode, 0);
if( xevent.type == KeyRelease ) if (xevent.type == KeyRelease)
xwin_mod_release( xevent.xkey.state, ev_time, scancode ); xwin_mod_release(xevent.xkey.state,
ev_time, scancode);
break; break;
@ -476,7 +499,9 @@ xwin_process_events()
/* fall through */ /* fall through */
case ButtonRelease: case ButtonRelease:
button = xkeymap_translate_button(xevent.xbutton.button); button = xkeymap_translate_button(xevent.
xbutton.
button);
if (button == 0) if (button == 0)
break; break;
@ -494,10 +519,12 @@ xwin_process_events()
break; break;
case EnterNotify: case EnterNotify:
XGrabKeyboard(display, wnd, True, GrabModeAsync, XGrabKeyboard(display, wnd, True,
GrabModeAsync, CurrentTime); GrabModeAsync, GrabModeAsync,
CurrentTime);
xwin_mod_update( xevent.xcrossing.state, ev_time ); xwin_mod_update(xevent.xcrossing.state,
ev_time);
break; break;
case LeaveNotify: case LeaveNotify:
@ -507,7 +534,8 @@ xwin_process_events()
case Expose: case Expose:
XCopyArea(display, backstore, wnd, gc, XCopyArea(display, backstore, wnd, gc,
xevent.xexpose.x, xevent.xexpose.y, xevent.xexpose.x, xevent.xexpose.y,
xevent.xexpose.width, xevent.xexpose.height, xevent.xexpose.width,
xevent.xexpose.height,
xevent.xexpose.x, xevent.xexpose.y); xevent.xexpose.x, xevent.xexpose.y);
break; break;
} }
@ -515,7 +543,7 @@ xwin_process_events()
} }
void void
xwin_mod_update(uint32 state, uint32 ev_time ) xwin_mod_update(uint32 state, uint32 ev_time)
{ {
xwin_mod_press(state, ev_time, 0); xwin_mod_press(state, ev_time, 0);
xwin_mod_release(state, ev_time, 0); xwin_mod_release(state, ev_time, 0);
@ -524,67 +552,75 @@ xwin_mod_update(uint32 state, uint32 ev_time )
void void
xwin_mod_release(uint32 state, uint32 ev_time, uint32 scancode) xwin_mod_release(uint32 state, uint32 ev_time, uint32 scancode)
{ {
switch (scancode) { switch (scancode)
case 0x2a: {
key_down_state &= ~DShift1Mask; case 0x2a:
break; key_down_state &= ~DShift1Mask;
case 0x36: break;
key_down_state &= ~DShift2Mask; case 0x36:
break; key_down_state &= ~DShift2Mask;
case 0x1d: break;
key_down_state &= ~DControl1Mask; case 0x1d:
break; key_down_state &= ~DControl1Mask;
case 0x9d: break;
key_down_state &= ~DControl2Mask; case 0x9d:
break; key_down_state &= ~DControl2Mask;
case 0x38: break;
key_down_state &= ~DMod1Mask; case 0x38:
break; key_down_state &= ~DMod1Mask;
case 0xb8: break;
key_down_state &= ~DMod2Mask; case 0xb8:
break; key_down_state &= ~DMod2Mask;
break;
} }
if( !(numlock_modifier_mask & state) && (key_down_state & DNumLockMask) ) if (!(numlock_modifier_mask & state)
&& (key_down_state & DNumLockMask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x45, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x45, 0);
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN | KBD_FLAG_UP, 0x45, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE,
KBD_FLAG_DOWN | KBD_FLAG_UP, 0x45, 0);
key_down_state &= ~DNumLockMask; key_down_state &= ~DNumLockMask;
} }
if( !(LockMask & state) && (key_down_state & DLockMask)) if (!(LockMask & state) && (key_down_state & DLockMask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x3a, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x3a, 0);
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN | KBD_FLAG_UP, 0x3a, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE,
KBD_FLAG_DOWN | KBD_FLAG_UP, 0x3a, 0);
key_down_state &= ~DLockMask; key_down_state &= ~DLockMask;
} }
if( !(ShiftMask & state) && (key_down_state & DShift1Mask)) if (!(ShiftMask & state) && (key_down_state & DShift1Mask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_UP, 0x2a, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_UP, 0x2a,
0);
key_down_state &= ~DShift1Mask; key_down_state &= ~DShift1Mask;
} }
if( !(ControlMask & state) && (key_down_state & DControl1Mask)) if (!(ControlMask & state) && (key_down_state & DControl1Mask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_UP, 0x1d, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_UP, 0x1d,
0);
key_down_state &= ~DControl1Mask; key_down_state &= ~DControl1Mask;
} }
if( !(Mod1Mask & state) && (key_down_state & DMod1Mask)) if (!(Mod1Mask & state) && (key_down_state & DMod1Mask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_UP, 0x38, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_UP, 0x38,
0);
key_down_state &= ~DMod1Mask; key_down_state &= ~DMod1Mask;
} }
if( !(Mod2Mask & state) && (key_down_state & DMod2Mask)) if (!(Mod2Mask & state) && (key_down_state & DMod2Mask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_UP, 0xb8, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_UP, 0xb8,
0);
key_down_state &= ~DMod2Mask; key_down_state &= ~DMod2Mask;
} }
} }
@ -594,73 +630,85 @@ void
xwin_mod_press(uint32 state, uint32 ev_time, uint32 scancode) xwin_mod_press(uint32 state, uint32 ev_time, uint32 scancode)
{ {
switch (scancode) { switch (scancode)
case 0x2a: {
key_down_state |= DShift1Mask; case 0x2a:
break; key_down_state |= DShift1Mask;
case 0x36: break;
key_down_state |= DShift2Mask; case 0x36:
break; key_down_state |= DShift2Mask;
case 0x1d: break;
key_down_state |= DControl1Mask; case 0x1d:
break; key_down_state |= DControl1Mask;
case 0x9d: break;
key_down_state |= DControl2Mask; case 0x9d:
break; key_down_state |= DControl2Mask;
case 0x3a: break;
key_down_state ^= DLockMask; case 0x3a:
break; key_down_state ^= DLockMask;
case 0x45: break;
key_down_state ^= DNumLockMask; case 0x45:
break; key_down_state ^= DNumLockMask;
case 0x38: break;
key_down_state |= DMod1Mask; case 0x38:
break; key_down_state |= DMod1Mask;
case 0xb8: break;
key_down_state |= DMod2Mask; case 0xb8:
break; key_down_state |= DMod2Mask;
break;
} }
if( (numlock_modifier_mask && state) && !(key_down_state & DNumLockMask) ) if ((numlock_modifier_mask && state)
&& !(key_down_state & DNumLockMask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x45, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x45, 0);
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN | KBD_FLAG_UP, 0x45, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE,
KBD_FLAG_DOWN | KBD_FLAG_UP, 0x45, 0);
key_down_state |= DNumLockMask; key_down_state |= DNumLockMask;
} }
if( (LockMask & state) && !(key_down_state & DLockMask)) if ((LockMask & state) && !(key_down_state & DLockMask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x3a, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x3a, 0);
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN | KBD_FLAG_UP, 0x3a, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE,
KBD_FLAG_DOWN | KBD_FLAG_UP, 0x3a, 0);
key_down_state |= DLockMask; key_down_state |= DLockMask;
} }
if( (ShiftMask & state) && !((key_down_state & DShift1Mask) || (key_down_state & DShift2Mask))) if ((ShiftMask & state)
&& !((key_down_state & DShift1Mask)
|| (key_down_state & DShift2Mask)))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN, 0x2a, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN,
0x2a, 0);
key_down_state |= DShift1Mask; key_down_state |= DShift1Mask;
} }
if( (ControlMask & state) && !((key_down_state & DControl1Mask) || (key_down_state & DControl2Mask))) if ((ControlMask & state)
&& !((key_down_state & DControl1Mask)
|| (key_down_state & DControl2Mask)))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN, 0x1d, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN,
0x1d, 0);
key_down_state |= DControl1Mask; key_down_state |= DControl1Mask;
} }
if( (Mod1Mask & state) && !(key_down_state & DMod1Mask)) if ((Mod1Mask & state) && !(key_down_state & DMod1Mask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN, 0x38, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN,
0x38, 0);
key_down_state |= DMod1Mask; key_down_state |= DMod1Mask;
} }
if( (Mod2Mask & state) && !(key_down_state & DMod2Mask)) if ((Mod2Mask & state) && !(key_down_state & DMod2Mask))
{ {
rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN, 0xb8, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN,
0xb8, 0);
key_down_state |= DMod2Mask; key_down_state |= DMod2Mask;
} }
@ -669,7 +717,7 @@ xwin_mod_press(uint32 state, uint32 ev_time, uint32 scancode)
void void
ui_select(int rdp_socket) ui_select(int rdp_socket)
{ {
int n = (rdp_socket > x_socket) ? rdp_socket+1 : x_socket+1; int n = (rdp_socket > x_socket) ? rdp_socket + 1 : x_socket + 1;
fd_set rfds; fd_set rfds;
FD_ZERO(&rfds); FD_ZERO(&rfds);
@ -708,7 +756,7 @@ ui_move_pointer(int x, int y)
} }
HBITMAP HBITMAP
ui_create_bitmap(int width, int height, uint8 *data) ui_create_bitmap(int width, int height, uint8 * data)
{ {
XImage *image; XImage *image;
Pixmap bitmap; Pixmap bitmap;
@ -729,7 +777,7 @@ ui_create_bitmap(int width, int height, uint8 *data)
void void
ui_paint_bitmap(int x, int y, int cx, int cy, ui_paint_bitmap(int x, int y, int cx, int cy,
int width, int height, uint8 *data) int width, int height, uint8 * data)
{ {
XImage *image; XImage *image;
uint8 *tdata; uint8 *tdata;
@ -756,11 +804,11 @@ ui_paint_bitmap(int x, int y, int cx, int cy,
void void
ui_destroy_bitmap(HBITMAP bmp) ui_destroy_bitmap(HBITMAP bmp)
{ {
XFreePixmap(display, (Pixmap)bmp); XFreePixmap(display, (Pixmap) bmp);
} }
HGLYPH HGLYPH
ui_create_glyph(int width, int height, uint8 *data) ui_create_glyph(int width, int height, uint8 * data)
{ {
XImage *image; XImage *image;
Pixmap bitmap; Pixmap bitmap;
@ -782,18 +830,18 @@ ui_create_glyph(int width, int height, uint8 *data)
XFree(image); XFree(image);
XFreeGC(display, gc); XFreeGC(display, gc);
return (HGLYPH)bitmap; return (HGLYPH) bitmap;
} }
void void
ui_destroy_glyph(HGLYPH glyph) ui_destroy_glyph(HGLYPH glyph)
{ {
XFreePixmap(display, (Pixmap)glyph); XFreePixmap(display, (Pixmap) glyph);
} }
HCURSOR HCURSOR
ui_create_cursor(unsigned int x, unsigned int y, int width, ui_create_cursor(unsigned int x, unsigned int y, int width,
int height, uint8 *andmask, uint8 *xormask) int height, uint8 * andmask, uint8 * xormask)
{ {
HGLYPH maskglyph, cursorglyph; HGLYPH maskglyph, cursorglyph;
XColor bg, fg; XColor bg, fg;
@ -850,27 +898,27 @@ ui_create_cursor(unsigned int x, unsigned int y, int width,
cursorglyph = ui_create_glyph(width, height, cursor); cursorglyph = ui_create_glyph(width, height, cursor);
maskglyph = ui_create_glyph(width, height, mask); maskglyph = ui_create_glyph(width, height, mask);
xcursor = XCreatePixmapCursor(display, (Pixmap)cursorglyph, xcursor = XCreatePixmapCursor(display, (Pixmap) cursorglyph,
(Pixmap)maskglyph, &fg, &bg, x, y); (Pixmap) maskglyph, &fg, &bg, x, y);
ui_destroy_glyph(maskglyph); ui_destroy_glyph(maskglyph);
ui_destroy_glyph(cursorglyph); ui_destroy_glyph(cursorglyph);
xfree(mask); xfree(mask);
xfree(cursor); xfree(cursor);
return (HCURSOR)xcursor; return (HCURSOR) xcursor;
} }
void void
ui_set_cursor(HCURSOR cursor) ui_set_cursor(HCURSOR cursor)
{ {
XDefineCursor(display, wnd, (Cursor)cursor); XDefineCursor(display, wnd, (Cursor) cursor);
} }
void void
ui_destroy_cursor(HCURSOR cursor) ui_destroy_cursor(HCURSOR cursor)
{ {
XFreeCursor(display, (Cursor)cursor); XFreeCursor(display, (Cursor) cursor);
} }
#define MAKE_XCOLOR(xc,c) \ #define MAKE_XCOLOR(xc,c) \
@ -880,7 +928,7 @@ ui_destroy_cursor(HCURSOR cursor)
(xc)->flags = DoRed | DoGreen | DoBlue; (xc)->flags = DoRed | DoGreen | DoBlue;
HCOLOURMAP HCOLOURMAP
ui_create_colourmap(COLOURMAP *colours) ui_create_colourmap(COLOURMAP * colours)
{ {
COLOURENTRY *entry; COLOURENTRY *entry;
int i, ncolours = colours->ncolours; int i, ncolours = colours->ncolours;
@ -903,7 +951,7 @@ ui_create_colourmap(COLOURMAP *colours)
XStoreColors(display, map, xcolours, ncolours); XStoreColors(display, map, xcolours, ncolours);
xfree(xcolours); xfree(xcolours);
return (HCOLOURMAP)map; return (HCOLOURMAP) map;
} }
else else
{ {
@ -933,7 +981,7 @@ void
ui_destroy_colourmap(HCOLOURMAP map) ui_destroy_colourmap(HCOLOURMAP map)
{ {
if (owncolmap) if (owncolmap)
XFreeColormap(display, (Colormap)map); XFreeColormap(display, (Colormap) map);
else else
xfree(map); xfree(map);
} }
@ -942,7 +990,7 @@ void
ui_set_colourmap(HCOLOURMAP map) ui_set_colourmap(HCOLOURMAP map)
{ {
if (owncolmap) if (owncolmap)
XSetWindowColormap(display, wnd, (Colormap)map); XSetWindowColormap(display, wnd, (Colormap) map);
else else
colmap = map; colmap = map;
} }
@ -989,7 +1037,7 @@ ui_destblt(uint8 opcode,
void void
ui_patblt(uint8 opcode, ui_patblt(uint8 opcode,
/* dest */ int x, int y, int cx, int cy, /* dest */ int x, int y, int cx, int cy,
/* brush */ BRUSH *brush, int bgcolour, int fgcolour) /* brush */ BRUSH * brush, int bgcolour, int fgcolour)
{ {
Pixmap fill; Pixmap fill;
uint8 i, ipattern[8]; uint8 i, ipattern[8];
@ -1012,12 +1060,13 @@ ui_patblt(uint8 opcode,
SET_BACKGROUND(fgcolour); SET_BACKGROUND(fgcolour);
XSetFillStyle(display, gc, FillOpaqueStippled); XSetFillStyle(display, gc, FillOpaqueStippled);
XSetStipple(display, gc, fill); XSetStipple(display, gc, fill);
XSetTSOrigin(display, gc, brush->xorigin, brush->yorigin); XSetTSOrigin(display, gc, brush->xorigin,
brush->yorigin);
FILL_RECTANGLE(x, y, cx, cy); FILL_RECTANGLE(x, y, cx, cy);
XSetFillStyle(display, gc, FillSolid); XSetFillStyle(display, gc, FillSolid);
ui_destroy_glyph((HGLYPH)fill); ui_destroy_glyph((HGLYPH) fill);
break; break;
default: default:
@ -1046,9 +1095,9 @@ ui_memblt(uint8 opcode,
/* src */ HBITMAP src, int srcx, int srcy) /* src */ HBITMAP src, int srcx, int srcy)
{ {
SET_FUNCTION(opcode); SET_FUNCTION(opcode);
XCopyArea(display, (Pixmap)src, wnd, gc, srcx, srcy, cx, cy, x, y); XCopyArea(display, (Pixmap) src, wnd, gc, srcx, srcy, cx, cy, x, y);
if (ownbackstore) if (ownbackstore)
XCopyArea(display, (Pixmap)src, backstore, gc, srcx, srcy, XCopyArea(display, (Pixmap) src, backstore, gc, srcx, srcy,
cx, cy, x, y); cx, cy, x, y);
RESET_FUNCTION(opcode); RESET_FUNCTION(opcode);
} }
@ -1057,7 +1106,7 @@ void
ui_triblt(uint8 opcode, ui_triblt(uint8 opcode,
/* dest */ int x, int y, int cx, int cy, /* dest */ int x, int y, int cx, int cy,
/* src */ HBITMAP src, int srcx, int srcy, /* src */ HBITMAP src, int srcx, int srcy,
/* brush */ BRUSH *brush, int bgcolour, int fgcolour) /* brush */ BRUSH * brush, int bgcolour, int fgcolour)
{ {
/* This is potentially difficult to do in general. Until someone /* This is potentially difficult to do in general. Until someone
comes up with a more efficient way of doing it I am using cases. */ comes up with a more efficient way of doing it I am using cases. */
@ -1093,7 +1142,7 @@ ui_triblt(uint8 opcode,
void void
ui_line(uint8 opcode, ui_line(uint8 opcode,
/* dest */ int startx, int starty, int endx, int endy, /* dest */ int startx, int starty, int endx, int endy,
/* pen */ PEN *pen) /* pen */ PEN * pen)
{ {
SET_FUNCTION(opcode); SET_FUNCTION(opcode);
SET_FOREGROUND(pen->colour); SET_FOREGROUND(pen->colour);
@ -1123,7 +1172,7 @@ ui_draw_glyph(int mixmode,
XSetFillStyle(display, gc, (mixmode == MIX_TRANSPARENT) XSetFillStyle(display, gc, (mixmode == MIX_TRANSPARENT)
? FillStippled : FillOpaqueStippled); ? FillStippled : FillOpaqueStippled);
XSetStipple(display, gc, (Pixmap)glyph); XSetStipple(display, gc, (Pixmap) glyph);
XSetTSOrigin(display, gc, x, y); XSetTSOrigin(display, gc, x, y);
FILL_RECTANGLE(x, y, cx, cy); FILL_RECTANGLE(x, y, cx, cy);
@ -1185,48 +1234,57 @@ ui_draw_text(uint8 font, uint8 flags, int mixmode, int x, int y,
} }
/* Paint text, character by character */ /* Paint text, character by character */
for (i = 0; i < length;) { for (i = 0; i < length;)
switch (text[i]) { {
case 0xff: switch (text[i])
if (i + 2 < length) {
cache_put_text(text[i + 1], text, text[i + 2]); case 0xff:
else {
error("this shouldn't be happening\n");
break;
}
/* this will move pointer from start to first character after FF command */
length -= i + 3;
text = &(text[i + 3]);
i = 0;
break;
case 0xfe:
entry = cache_get_text(text[i + 1]);
if (entry != NULL) {
if ((((uint8 *) (entry->data))[1] == 0)
&& (!(flags & TEXT2_IMPLICIT_X))) {
if (flags & TEXT2_VERTICAL)
y += text[i + 2];
else
x += text[i + 2];
}
if (i + 2 < length) if (i + 2 < length)
i += 3; cache_put_text(text[i + 1], text,
text[i + 2]);
else else
i += 2; {
length -= i; error("this shouldn't be happening\n");
/* this will move pointer from start to first character after FE command */ break;
text = &(text[i]); }
/* this will move pointer from start to first character after FF command */
length -= i + 3;
text = &(text[i + 3]);
i = 0; i = 0;
for (j = 0; j < entry->size; j++) break;
DO_GLYPH(((uint8 *) (entry->data)), j);
}
break;
default: case 0xfe:
DO_GLYPH(text, i); entry = cache_get_text(text[i + 1]);
i++; if (entry != NULL)
break; {
if ((((uint8 *) (entry->data))[1] ==
0)
&& (!(flags & TEXT2_IMPLICIT_X)))
{
if (flags & TEXT2_VERTICAL)
y += text[i + 2];
else
x += text[i + 2];
}
if (i + 2 < length)
i += 3;
else
i += 2;
length -= i;
/* this will move pointer from start to first character after FE command */
text = &(text[i]);
i = 0;
for (j = 0; j < entry->size; j++)
DO_GLYPH(((uint8 *) (entry->
data)),
j);
}
break;
default:
DO_GLYPH(text, i);
i++;
break;
} }
} }
@ -1253,9 +1311,9 @@ ui_desktop_save(uint32 offset, int x, int y, int cx, int cy)
XFreePixmap(display, pix); XFreePixmap(display, pix);
} }
offset *= bpp/8; offset *= bpp / 8;
cache_put_desktop(offset, cx, cy, image->bytes_per_line, cache_put_desktop(offset, cx, cy, image->bytes_per_line,
bpp/8, (uint8 *)image->data); bpp / 8, (uint8 *) image->data);
XDestroyImage(image); XDestroyImage(image);
} }
@ -1266,14 +1324,14 @@ ui_desktop_restore(uint32 offset, int x, int y, int cx, int cy)
XImage *image; XImage *image;
uint8 *data; uint8 *data;
offset *= bpp/8; offset *= bpp / 8;
data = cache_get_desktop(offset, cx, cy, bpp/8); data = cache_get_desktop(offset, cx, cy, bpp / 8);
if (data == NULL) if (data == NULL)
return; return;
image = XCreateImage(display, visual, depth, ZPixmap, image = XCreateImage(display, visual, depth, ZPixmap,
0, data, cx, cy, BitmapPad(display), 0, data, cx, cy, BitmapPad(display),
cx * bpp/8); cx * bpp / 8);
if (ownbackstore) if (ownbackstore)
{ {