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