SOURCES: rdesktop-vnc.patch (NEW) - new
arekm
arekm at pld-linux.org
Tue Sep 19 09:42:07 CEST 2006
Author: arekm Date: Tue Sep 19 07:42:07 2006 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- new
---- Files affected:
SOURCES:
rdesktop-vnc.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/rdesktop-vnc.patch
diff -u /dev/null SOURCES/rdesktop-vnc.patch:1.1
--- /dev/null Tue Sep 19 09:42:07 2006
+++ SOURCES/rdesktop-vnc.patch Tue Sep 19 09:42:02 2006
@@ -0,0 +1,2898 @@
+diff -urN rdesktop-1.5.0.org/vnc/vnc.c rdesktop-1.5.0/vnc/vnc.c
+--- rdesktop-1.5.0.org/vnc/vnc.c 1970-01-01 01:00:00.000000000 +0100
++++ rdesktop-1.5.0/vnc/vnc.c 2004-10-07 15:00:29.000000000 +0200
+@@ -0,0 +1,1376 @@
++/*
++ rdesktop: A Remote Desktop Protocol client.
++ User interface services - VNC target
++ Copyright (C) Matthew Chapman 1999-2000
++ Copyright (C) 2000 Tim Edmonds
++ Copyright (C) 2001 James "Wez" Weatherall
++ Copyright (C) 2001 Johannes E. Schindelin
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++
++#include <stdio.h>
++#include <time.h>
++
++#ifdef WIN32
++#define close closesocket
++#define strcasecmp _strcmpi
++#else
++#include <unistd.h>
++#include <sys/time.h> /* timeval */
++#include <sys/socket.h>
++#endif
++
++#include "../rdesktop.h"
++#undef VERSION
++
++#ifdef WIN32
++#define HBITMAP R_HBITMAP
++#define HCURSOR R_HCURSOR
++#define WORD R_WORD
++#endif
++#include "vnc.h"
++#ifdef WIN32
++#undef HBITMAP
++#undef HCURSOR
++#undef WORD
++#endif
++
++#include <errno.h>
++#include <sys/socket.h>
++extern int ListenOnTCPPort(int port);
++extern int rfbClientSocket;
++
++#include <rfb/rfbregion.h>
++
++#define BITSPERBYTES 8
++#define TOBYTES(bits) ((bits)/BITSPERBYTES)
++
++extern int g_width;
++extern int g_height;
++extern int keylayout;
++extern BOOL sendmotion;
++#ifdef ENABLE_SHADOW
++extern int client_counter;
++#endif
++
++
++int rfb_port = 5923;
++int defer_time = 5;
++int rfbClientSocket = 0;
++static rfbScreenInfoPtr server = NULL;
++static vncBuffer *frameBuffer = NULL;
++static uint8_t reverseByte[0x100];
++BOOL g_enable_compose = False;
++int g_display = 0;
++
++/* ignored */
++BOOL owncolmap = False;
++BOOL enable_compose = False;
++
++void
++vncHideCursor()
++{
++ if (server->clientHead)
++ rfbUndrawCursor(server);
++}
++
++/* -=- mouseLookup
++ * Table converting mouse button number (0-2) to flag
++ */
++
++int mouseLookup[3] = {
++ MOUSE_FLAG_BUTTON1, MOUSE_FLAG_BUTTON3, MOUSE_FLAG_BUTTON2
++};
++
++int clipX, clipY, clipW, clipH;
++
++BOOL
++vncwinClipRect(int *x, int *y, int *cx, int *cy)
++{
++ if (*x + *cx > clipX + clipW)
++ *cx = clipX + clipW - *x;
++ if (*y + *cy > clipY + clipH)
++ *cy = clipY + clipH - *y;
++ if (*x < clipX)
++ {
++ *cx -= clipX - *x;
++ *x = clipX;
++ }
++ if (*y < clipY)
++ {
++ *cy -= clipY - *y;
++ *y = clipY;
++ }
++ if (*cx < 0 || *cy < 0)
++ *cx = *cy = 0;
++ return (*cx > 0 && *cy > 0 && *x < server->width && *y < server->height);
++}
++
++void
++xwin_toggle_fullscreen(void)
++{
++}
++
++static int lastbuttons = 0;
++
++#define FIRST_MODIFIER XK_Shift_L
++#define LAST_MODIFIER XK_Hyper_R
++
++static BOOL keystate[LAST_MODIFIER - FIRST_MODIFIER];
++
++void
++init_keyboard()
++{
++ int i;
++ for (i = 0; i < LAST_MODIFIER - FIRST_MODIFIER; i++)
++ keystate[i] = 0;
++
++ xkeymap_init();
++}
++
++BOOL
++get_key_state(unsigned int state, uint32 keysym)
++{
++ if (keysym >= FIRST_MODIFIER && keysym <= LAST_MODIFIER)
++ return keystate[keysym - FIRST_MODIFIER];
++ return 0;
++}
++
++void
++vncKey(rfbBool down, rfbKeySym keysym, struct _rfbClientRec *cl)
++{
++ uint32 ev_time = time(NULL);
++ key_translation tr = { 0, 0 };
++
++ if (keysym >= FIRST_MODIFIER && keysym <= LAST_MODIFIER)
++ {
++ /* TODO: fake local state */
++ keystate[keysym - FIRST_MODIFIER] = down;
++ }
++
++ if (down)
++ {
++ /* TODO: fake local state */
++ if (handle_special_keys(keysym, 0, ev_time, True))
++ return;
++
++ /* TODO: fake local state */
++ tr = xkeymap_translate_key(keysym, 0, 0);
++
++ if (tr.scancode == 0)
++ return;
++
++ ensure_remote_modifiers(ev_time, tr);
++
++ rdp_send_scancode(ev_time, RDP_KEYPRESS, tr.scancode);
++ }
++ else
++ {
++ /* todO: fake local state */
++ if (handle_special_keys(keysym, 0, ev_time, False))
++ return;
++
++ /* todO: fake local state */
++ tr = xkeymap_translate_key(keysym, 0, 0);
++
++ if (tr.scancode == 0)
++ return;
++
++ rdp_send_scancode(ev_time, RDP_KEYRELEASE, tr.scancode);
++ }
++}
++
++void
++vncMouse(int buttonMask, int x, int y, struct _rfbClientRec *cl)
++{
++ int b;
++ uint32 ev_time = time(NULL);
++
++ rdp_send_input(ev_time, RDP_INPUT_MOUSE, MOUSE_FLAG_MOVE, x, y);
++
++ for (b = 0; b < 3; b++)
++ {
++ int bb = 1 << (b);
++ if (!(lastbuttons & bb) && (buttonMask & bb))
++ {
++ rdp_send_input(ev_time, RDP_INPUT_MOUSE,
++ (mouseLookup[b]) | MOUSE_FLAG_DOWN, x, y);
++ }
++ else if ((lastbuttons & bb) && !(buttonMask & bb))
++ {
++ rdp_send_input(ev_time, RDP_INPUT_MOUSE, (mouseLookup[b]), x, y);
++ }
++ }
++ lastbuttons = buttonMask;
++
++ /* handle cursor */
++ rfbDefaultPtrAddEvent(buttonMask, x, y, cl);
++}
++
++
++void
++rdp2vnc_connect(char *server, uint32 flags, char *domain, char *password,
++ char *shell, char *directory)
++{
++ struct sockaddr addr;
++ fd_set fdset;
++ struct timeval tv;
++ int rfbListenSock, addrlen = sizeof(addr);
++
++ rfbListenSock = rfbListenOnTCPPort(rfb_port);
++ fprintf(stderr, "Listening on VNC port %d\n", rfb_port);
++ if (rfbListenSock <= 0)
++ error("Cannot listen on port %d", rfb_port);
++ else
++ while (1)
++ {
++ FD_ZERO(&fdset);
++ FD_SET(rfbListenSock, &fdset);
++ tv.tv_sec = 5;
++ tv.tv_usec = 0;
++ if (select(rfbListenSock + 1, &fdset, NULL, NULL, &tv) > 0)
++ {
++ rfbClientSocket = accept(rfbListenSock, &addr, &addrlen);
++ if (rfbClientSocket < 0)
++ {
++ error("Error accepting client (%d: %s.\n",
++ errno, strerror(errno));
++ continue;
++ }
++ ui_create_window();
++ if (!rdp_connect(server, flags, domain, password, shell, directory))
++ {
++ error("Error connecting to RDP server.\n");
++ continue;
++ }
++ if (!fork())
++ {
++ BOOL deactivated;
++ uint32_t ext_disc_reason;
++ printf("Connection successful.\n");
++ rdp_main_loop(&deactivated, &ext_disc_reason);
++ printf("Disconnecting...\n");
++ rdp_disconnect();
++ ui_destroy_window();
++ exit(0);
++ }
++ }
++ }
++}
++
++
++
++
++
++extern char g_title[];
++BOOL
++ui_create_window()
++{
++ int i;
++
++ for (i = 0; i < 0x100; i++)
++ reverseByte[i] =
++ (((i >> 7) & 1)) | (((i >> 6) & 1) << 1) | (((i >> 5) & 1) << 2) |
++ (((i >> 4) & 1) << 3) | (((i >> 3) & 1) << 4) | (((i >> 2) & 1) << 5) |
++ (((i >> 1) & 1) << 6) | (((i >> 0) & 1) << 7);
++
++ server = rfbGetScreen(0, NULL, g_width, g_height, 8, 1, 1);
++ server->desktopName = g_title;
++ server->frameBuffer = (char *) malloc(g_width * g_height);
++ server->ptrAddEvent = vncMouse;
++ server->kbdAddEvent = vncKey;
++#ifdef ENABLE_SHADOW
++ server->httpPort = 6124 + client_counter;
++ server->port = 5924 + client_counter;
++ rfbInitSockets(server);
++ server->alwaysShared = TRUE;
++ server->neverShared = FALSE;
++#else
++ server->port = -1;
++ server->alwaysShared = FALSE;
++ server->neverShared = FALSE;
++#endif
++ server->inetdSock = rfbClientSocket;
++ server->serverFormat.trueColour = FALSE; /* activate colour maps */
++ server->deferUpdateTime = defer_time;
++
++ frameBuffer = (vncBuffer *) malloc(sizeof(vncBuffer));
++ frameBuffer->w = g_width;
++ frameBuffer->h = g_height;
++ frameBuffer->linew = g_width;
++ frameBuffer->data = server->frameBuffer;
++ frameBuffer->owner = FALSE;
++ frameBuffer->format = &server->serverFormat;
++
++ ui_set_clip(0, 0, g_width, g_height);
++
++ rfbInitServer(server);
++#ifndef ENABLE_SHADOW
++ server->port = rfb_port;
++#else
++ fprintf(stderr, "server listening on port %d (socket %d)\n", server->port,
++ server->listenSock);
++#endif
++
++ init_keyboard();
++
++ return (server != NULL);
++}
++
++void
++ui_destroy_window()
++{
++ rfbCloseClient(server->clientHead);
++}
++
++
++int
++ui_select(int rdpSocket)
++{
++ fd_set fds;
++ struct timeval tv;
++ int n, m = server->maxFd;
++
++ if (rdpSocket > m)
++ m = rdpSocket;
++ while (1)
++ {
++ fds = server->allFds;
++ FD_SET(rdpSocket, &fds);
++ tv.tv_sec = defer_time / 1000;
++ tv.tv_usec = (defer_time % 1000) * 1000;
++ n = select(m + 1, &fds, NULL, NULL, &tv);
++ rfbProcessEvents(server, 0);
++ /* if client is gone, close connection */
++ if (!server->clientHead)
++ close(rdpSocket);
++ if (FD_ISSET(rdpSocket, &fds))
++ return 1;
++ }
++ return 0;
++}
++
++void
++ui_move_pointer(int x, int y)
++{
++ // TODO: Is there a way to send x,y even if cursor encoding is active?
++ rfbUndrawCursor(server);
++ server->cursorX = x;
++ server->cursorY = y;
++}
++
++HBITMAP
++ui_create_bitmap(int width, int height, uint8 * data)
++{
++ vncBuffer *buf;
++
++ buf = vncNewBuffer(width, height, 8);
++ memcpy(buf->data, data, width * height);
++
++ return (HBITMAP) buf;
++}
++
++void
++ui_paint_bitmap(int x, int y, int cx, int cy, int width, int height, uint8 * data)
++{
++ vncBuffer *buf;
++ buf = ui_create_bitmap(width, height, data);
++ vncCopyBlitFrom(server, x, y, cx, cy, buf, 0, 0);
++ vncDeleteBuffer(buf);
++}
++
++void
++ui_destroy_bitmap(HBITMAP bmp)
++{
++ vncDeleteBuffer((vncBuffer *) bmp);
++}
++
++uint8_t
++vncLookupColour(rfbColourMap * colourMap, uint8_t * p)
++{
++ uint8_t i, i1 = 0;
++ uint8_t *cm = colourMap->data.bytes;
++ uint32_t m, m1 = abs(cm[0] - p[0]) + abs(cm[1] - p[1]) + abs(cm[2] - p[2]);
++ for (i = 1; i < 255; i++)
++ {
++ m = abs(cm[i * 3] - p[0]) + abs(cm[i * 3 + 1] - p[1]) + abs(cm[i * 3 + 2] - p[2]);
++ if (m < m1)
++ {
++ m1 = m;
++ i1 = i;
++ }
++ }
++ return (i1);
++}
++
++HCURSOR
++ui_create_cursor(unsigned int x, unsigned int y, int width, int height, uint8 * mask, uint8 * data)
++{
++ int i, j;
++ uint8_t *d0, *d1;
++ uint8_t *cdata;
++ uint8_t white[3] = { 0xff, 0xff, 0xff };
++ uint8_t black[3] = { 0, 0, 0 };
++ uint8_t *cur;
++ rfbCursorPtr cursor;
++ rfbColourMap *colourMap = &server->colourMap;
++
++ cdata = xmalloc(sizeof(uint8_t) * width * height);
++ d0 = xmalloc(sizeof(uint32_t) * width * height / 4);
++ d1 = (uint8_t *) mask;
++ for (j = 0; j < height; j++)
++ for (i = 0; i < width / 8; i++)
++ {
++ d0[j * width / 8 + i] = d1[(height - 1 - j) * width / 8 + i] ^ 0xffffffff;
++ }
++ for (j = 0; j < height; j++)
++ {
++ for (i = 0; i < width; i++)
++ {
++ //strange that the pointer is in 24bit depth when everything
++ //else is in 8bit palletized.
++ cur = data + ((height - 1 - j) * width + i) * 3;
++ if (cur[0] > 0x80 || cur[1] > 0x80 || cur[2] > 0x80)
++ {
++ if (!(d0[(j * width + i) / 8] & (0x80 >> (i & 7))))
++ {
++ /* text cursor! */
++ cdata[j * width + i] = vncLookupColour(colourMap, black);
++ d0[(j * width + i) / 8] |= 0x80 >> (i & 7);
++ }
++ else
++ cdata[j * width + i] = vncLookupColour(colourMap, white);
++ }
++ else
++ cdata[j * width + i] = vncLookupColour(colourMap, cur);
++ }
++ }
++ cursor = (rfbCursorPtr) xmalloc(sizeof(rfbCursor));
++ cursor->width = width;
++ cursor->height = height;
++ cursor->xhot = x;
++ cursor->yhot = y;
++ cursor->mask = (char *) d0;
++ cursor->source = 0;
++ cursor->richSource = cdata;
++ cursor->cleanup = 0; // workaround: this produces a memleak
++
++ cursor->backRed = cursor->backGreen = cursor->backBlue = 0xffff;
++ cursor->foreRed = cursor->foreGreen = cursor->foreBlue = 0;
++
++ return (HCURSOR) cursor;
++}
++
++void
++ui_set_cursor(HCURSOR cursor)
++{
++ /* FALSE means: don't delete old cursor */
++ rfbSetCursor(server, (rfbCursorPtr) cursor, FALSE);
++}
++
++void
++ui_destroy_cursor(HCURSOR cursor)
++{
++ if (cursor)
++ rfbFreeCursor((rfbCursorPtr) cursor);
++}
++
++void
++ui_set_null_cursor(void)
++{
++ rfbSetCursor(server, 0, FALSE);
++}
++
++HGLYPH
++ui_create_glyph(int width, int height, uint8 * data)
++{
++ int x, y;
++ vncBuffer *buf;
++
++ buf = vncNewBuffer(width, height, 8);
++
++ //data is padded to multiple of 16bit line lengths
++ for (y = 0; y < height; y++)
++ {
++ for (x = 0; x < width; x++)
++ {
++ int byte = x / 8 + (y * ((width + 7) / 8));
++ byte = rfbEndianTest ? reverseByte[data[byte]] : data[byte];
++ byte = (byte >> (x & 7)) & 0x01;
++ vncSetPixel(buf, x, y, byte ? 0x7f : 0x00);
++ }
++ }
++
++ return (HGLYPH) buf;
++}
++
++void
++ui_destroy_glyph(HGLYPH glyph)
++{
++ ui_destroy_bitmap((HBITMAP) glyph);
++}
++
++HCOLOURMAP
++ui_create_colourmap(COLOURMAP * colours)
++{
++ int i;
++ rfbColourMap *map = vncNewColourMap(server, colours->ncolours);
++ for (i = 0; i < colours->ncolours; i++)
++ {
++ vncSetColourMapEntry(map, i, colours->colours[i].red,
++ colours->colours[i].green, colours->colours[i].blue);
++ }
++ return map;
++}
++
++void
++ui_destroy_colourmap(HCOLOURMAP map)
++{
++ vncDeleteColourMap(map);
++}
++
++void
++ui_set_colourmap(HCOLOURMAP map)
++{
++ vncSetColourMap(server, map);
++}
++
++void
++ui_set_clip(int x, int y, int cx, int cy)
++{
++ clipX = x;
++ clipY = y;
++ clipW = cx;
++ clipH = cy;
++}
++
++void
++ui_reset_clip()
++{
++ clipX = 0;
++ clipY = 0;
++ clipW = 64000;
++ clipH = 64000;
++}
++
++void
++ui_bell()
++{
++ rfbSendBell(server);
++}
++
++void
++ui_destblt(uint8 opcode,
++ /* dest */ int x, int y, int cx, int cy)
++{
++ int i;
++ vncBuffer *buf;
++
++ switch (opcode)
++ {
++ case 0:
++ case 15:
++ ui_rect(x, y, cx, cy, 0xff);
<<Diff was trimmed, longer than 597 lines>>
More information about the pld-cvs-commit
mailing list