X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=blobdiff_plain;f=rdpsrv.c;h=c838fc7a60c711d7f7ec8434a9b9755ad8040feb;hp=1bf41d70a83821225294fec81bbf444e1527824f;hb=dbccf42e4424093cfc0f970d1fcfaad9ae60c954;hpb=98742a5ac6a2170d0d5b219a69a9cc6d57915547 diff --git a/rdpsrv.c b/rdpsrv.c index 1bf41d7..c838fc7 100644 --- a/rdpsrv.c +++ b/rdpsrv.c @@ -59,12 +59,14 @@ int create_server_socket() return server_sock; } -void handle_input_pdu(STREAM s) +void handle_input_pdu(STREAM s, int vnc_sock) { uint32 time; uint16 message_type, device_flags, param1, param2; uint16 num_events; int i; + char buf[256]; + static int mouse1_down = 0, mouse2_down = 0; in_uint16_le(s, num_events); // number of events in_uint8s(s, 2); // pad @@ -91,6 +93,19 @@ void handle_input_pdu(STREAM s) printf("- Device flags: %x\n", device_flags); printf("- Position: (%u,%u)\n", param1, param2); + if (device_flags & MOUSE_FLAG_BUTTON1) + mouse1_down = (device_flags & MOUSE_FLAG_DOWN) ? 0x01 : 0; + if (device_flags & MOUSE_FLAG_BUTTON2) + mouse2_down = (device_flags & MOUSE_FLAG_DOWN) ? 0x02 : 0; + + buf[0] = 5; // message type + buf[1] = mouse1_down | mouse2_down; // button mask + buf[2] = param1 >> 8; + buf[3] = param1 & 0xff; + buf[4] = param2 >> 8; + buf[5] = param2 & 0xff; + write(vnc_sock, buf, 6); + break; default: printf("- Unknown type %x\n", message_type); @@ -98,6 +113,20 @@ void handle_input_pdu(STREAM s) } printf("\n"); } + + // re-request the entire framebuffer + buf[0] = 3; // message type + buf[1] = 1; // incremental + buf[2] = 0; // xpos + buf[3] = 0; + buf[4] = 0; // ypos + buf[5] = 0; + buf[6] = 640 >> 8; // width + buf[7] = 640 & 0xff; + buf[8] = 480 >> 8; // height + buf[9] = 480 & 0xff; + + write(vnc_sock, buf, 10); } struct ServerInitialization { @@ -138,7 +167,7 @@ int vnc_init() if (read(vnc_sock, buf, ntohl(si.name_len)) != ntohl(si.name_len)) error("short read on server name\n"); - printf("Server name is '%*s' (%u bytes)\n", ntohl(si.name_len), buf, ntohl(si.name_len)); +// printf("Server name is '%*s' (%u bytes)\n", ntohl(si.name_len), buf, ntohl(si.name_len)); // we can only accept raw encoding buf[0] = 2; // message type @@ -229,7 +258,7 @@ void handle_vnc_fbupdate(int vnc_sock) dst = smallblock; for (y = 0; y < bh; ++y) { - src = data + ((yt * 64 + (bh + 1 - y)) * width + (xt * 64)) * 4; + src = data + ((yt * 64 + (bh - 1 - y)) * width + (xt * 64)) * 4; for (x = 0; x < bw; ++x) { *dst++ = *src++; *dst++ = *src++; @@ -280,8 +309,7 @@ int serve_client() switch (data_pdu_type) { case RDP_DATA_PDU_INPUT: - printf("Input PDU\n"); - handle_input_pdu(s); + handle_input_pdu(s, vnc_sock); listen_on_vnc = 1; break; default: @@ -296,14 +324,20 @@ int serve_client() printf("Activity on VNC socket!\n"); - if (read(vnc_sock, buf, 2) != 2) + if (read(vnc_sock, buf, 1) != 1) error("short read on vnc_sock\n"); switch (buf[0]) { case 0: // frame buffer update! + printf("Framebuffer update\n"); + if (read(vnc_sock, buf, 1) != 1) + error("short read on vnc_sock\n"); handle_vnc_fbupdate(vnc_sock); break; + case 2: + printf("\n"); + break; default: printf("Unknown VNC server message %x\n", buf[0]); exit(1);