a few minor fixes

ulab-original
jsorg71 20 years ago
parent 8defc32e27
commit 15acc669dd

@ -39,6 +39,10 @@ int lib_recv(struct vnc* v, char* data, int len)
{ {
if (g_tcp_last_error_would_block(v->sck)) if (g_tcp_last_error_would_block(v->sck))
{ {
if (v->server_is_term(v))
{
return 1;
}
g_sleep(1); g_sleep(1);
} }
else else
@ -77,6 +81,10 @@ int lib_send(struct vnc* v, char* data, int len)
{ {
if (g_tcp_last_error_would_block(v->sck)) if (g_tcp_last_error_would_block(v->sck))
{ {
if (v->server_is_term(v))
{
return 1;
}
g_sleep(1); g_sleep(1);
} }
else else
@ -122,38 +130,117 @@ int lib_mod_event(struct vnc* v, int msg, int param1, int param2)
{ {
switch (param1) switch (param1)
{ {
case 0x0001: key = 0xff1b; break; /* ecs */ case 0x0001: /* ecs */
case 0x000e: key = 0xff08; break; /* backspace */ key = 0xff1b;
case 0x000f: key = 0xff09; break; /* tab */ break;
case 0x001c: key = 0xff0d; break; /* enter */ case 0x000e: /* backspace */
/* left-right control */ key = 0xff08;
case 0x001d: key = (param2 & 0x0100) ? 0xffe3 : 0xffe4; break; break;
case 0x002a: key = 0xffe1; break; /* left shift */ case 0x000f: /* tab(0xff09) or left tab(0xfe20) */
case 0x0036: key = 0xffe2; break; /* right shift */ /* some documentation says don't send left tab */
/* left-right alt */ /* just send tab and if the shift modifier is down */
case 0x0038: key = (param2 & 0x0100) ? 0xffe9 : 0xffea; break; /* the server will know */
case 0x003b: key = 0xffbe; break; /* F1 */ /* for now, sending left tab, I don't know which is best */
case 0x003c: key = 0xffbf; break; /* F2 */ key = (v->shift_state) ? 0xfe20 : 0xff09;
case 0x003d: key = 0xffc0; break; /* F3 */ break;
case 0x003e: key = 0xffc1; break; /* F4 */ case 0x001c: /* enter */
case 0x003f: key = 0xffc2; break; /* F5 */ key = 0xff0d;
case 0x0040: key = 0xffc3; break; /* F6 */ break;
case 0x0041: key = 0xffc4; break; /* F7 */ case 0x001d: /* left-right control */
case 0x0042: key = 0xffc5; break; /* F8 */ key = (param2 & 0x0100) ? 0xffe4 : 0xffe3;
case 0x0043: key = 0xffc6; break; /* F9 */ break;
case 0x0044: key = 0xffc7; break; /* F10 */ case 0x002a: /* left shift */
case 0x0047: key = 0xff50; break; /* home */ key = 0xffe1;
case 0x0048: key = 0xff52; break; /* up arrow */ v->shift_state = (msg == 15);
case 0x0049: key = 0xff55; break; /* page up */ break;
case 0x004b: key = 0xff51; break; /* left arrow */ case 0x0036: /* right shift */
case 0x004d: key = 0xff53; break; /* right arrow */ key = 0xffe2;
case 0x004f: key = 0xff57; break; /* end */ v->shift_state = (msg == 15);
case 0x0050: key = 0xff54; break; /* down arrow */ break;
case 0x0051: key = 0xff56; break; /* page down */ case 0x0038: /* left-right alt */
case 0x0052: key = 0xff63; break; /* insert */ key = (param2 & 0x0100) ? 0xffea : 0xffe9;
case 0x0053: key = 0xffff; break; /* delete */ break;
case 0x0057: key = 0xffc8; break; /* F11 */ case 0x003b: /* F1 */
case 0x0058: key = 0xffc9; break; /* F12 */ key = 0xffbe;
break;
case 0x003c: /* F2 */
key = 0xffbf;
break;
case 0x003d: /* F3 */
key = 0xffc0;
break;
case 0x003e: /* F4 */
key = 0xffc1;
break;
case 0x003f: /* F5 */
key = 0xffc2;
break;
case 0x0040: /* F6 */
key = 0xffc3;
break;
case 0x0041: /* F7 */
key = 0xffc4;
break;
case 0x0042: /* F8 */
key = 0xffc5;
break;
case 0x0043: /* F9 */
key = 0xffc6;
break;
case 0x0044: /* F10 */
key = 0xffc7;
break;
case 0x0047: /* home */
key = 0xff50;
break;
case 0x0048: /* up arrow */
key = 0xff52;
break;
case 0x0049: /* page up */
key = 0xff55;
break;
case 0x004b: /* left arrow */
key = 0xff51;
break;
case 0x004d: /* right arrow */
key = 0xff53;
break;
case 0x004f: /* end */
key = 0xff57;
break;
case 0x0050: /* down arrow */
key = 0xff54;
break;
case 0x0051: /* page down */
key = 0xff56;
break;
case 0x0052: /* insert */
key = 0xff63;
break;
case 0x0053: /* delete */
key = 0xffff;
break;
case 0x0057: /* F11 */
key = 0xffc8;
break;
case 0x0058: /* F12 */
key = 0xffc9;
break;
/* not sure about the next three, I don't think rdesktop */
/* sends them right */
case 0x0037: /* Print Screen */
key = 0xff61;
break;
case 0x0046: /* Scroll Lock */
key = 0xff14;
break;
case 0x0045: /* Pause */
key = 0xff13;
break;
default:
g_printf("unkown key lib_mod_event msg %d \
param1 0x%4.4x param2 0x%4.4x\n\r", msg, param1, param2);
break;
} }
} }
if (key > 0) if (key > 0)
@ -605,6 +692,7 @@ int lib_mod_start(struct vnc* v, int w, int h, int bpp)
/******************************************************************************/ /******************************************************************************/
/* /*
return error return error
these are wrong.....
1 - authentation failed 1 - authentation failed
2 - authentation failed 2 - authentation failed
3 - server name length received from server too long 3 - server name length received from server too long
@ -630,6 +718,11 @@ int lib_mod_connect(struct vnc* v)
int display; int display;
check_sec_result = 1; check_sec_result = 1;
/* only support 8 and 16 bpp connections from rdp client */
if (v->server_bpp != 8 && v->server_bpp != 16)
{
return 1;
}
if (g_strcmp(v->ip, "") == 0) if (g_strcmp(v->ip, "") == 0)
{ {
return 6; return 6;
@ -644,6 +737,8 @@ int lib_mod_connect(struct vnc* v)
v->sck_closed = 0; v->sck_closed = 0;
if (g_tcp_connect(v->sck, v->ip, "3350") == 0) if (g_tcp_connect(v->sck, v->ip, "3350") == 0)
{ {
g_tcp_set_non_blocking(v->sck);
g_tcp_set_no_delay(v->sck);
s_push_layer(s, channel_hdr, 8); s_push_layer(s, channel_hdr, 8);
out_uint16_be(s, 0); // code out_uint16_be(s, 0); // code
i = g_strlen(v->username); i = g_strlen(v->username);
@ -779,7 +874,7 @@ int lib_mod_connect(struct vnc* v)
} }
if (error == 0) if (error == 0)
{ {
in_uint8(pixel_format, v->mod_bpp); v->mod_bpp = v->server_bpp;
init_stream(s, 8192); init_stream(s, 8192);
error = lib_recv(v, s->data, 4); /* name len */ error = lib_recv(v, s->data, 4); /* name len */
} }
@ -820,6 +915,20 @@ int lib_mod_connect(struct vnc* v)
out_uint8(pixel_format, 0); /* blue shift */ out_uint8(pixel_format, 0); /* blue shift */
out_uint8s(pixel_format, 3); /* pad */ out_uint8s(pixel_format, 3); /* pad */
} }
else if (v->mod_bpp == 16)
{
out_uint8(pixel_format, 16); /* bits per pixel */
out_uint8(pixel_format, 16); /* depth */
out_uint8(pixel_format, 0); /* big endian */
out_uint8(pixel_format, 1); /* true color flag */
out_uint16_be(pixel_format, 31); /* red max */
out_uint16_be(pixel_format, 63); /* green max */
out_uint16_be(pixel_format, 31); /* blue max */
out_uint8(pixel_format, 11); /* red shift */
out_uint8(pixel_format, 5); /* green shift */
out_uint8(pixel_format, 0); /* blue shift */
out_uint8s(pixel_format, 3); /* pad */
}
out_uint8a(s, pixel_format->data, 16); out_uint8a(s, pixel_format->data, 16);
error = lib_send(v, s->data, 20); error = lib_send(v, s->data, 20);
} }

@ -71,4 +71,5 @@ struct vnc
char ip[256]; char ip[256];
char port[256]; char port[256];
int sck_closed; int sck_closed;
int shift_state; /* 0 up, 1 down */
}; };

Loading…
Cancel
Save