added Xserver files

ulab-original
jsorg71 18 years ago
parent b65409683b
commit 65ed54cc95

@ -0,0 +1,47 @@
OBJS = rdpmain.o rdpdraw.o rdpinput.o rdpmisc.o rdpup.o miinitext.o
CFLAGS = -O2 -fno-strength-reduce -ansi -pedantic
CFLAGS += -I. -I../../../../exports/include/X11
CFLAGS += -I../../../../include/fonts
CFLAGS += -I../../../../exports/include/X11
CFLAGS += -I../../cfb -I../../mfb -I../../mi
CFLAGS += -I../../include -I../../os
CFLAGS += -I../../../../../include
CFLAGS += -I/usr/local/include
CFLAGS += -I../../../.././ -I../../../../exports/include
CFLAGS += -I../../../../include/extensions
CFLAGS += -I../../render
CFLAGS += -Dlinux -D__i386__
CFLAGS += -D_POSIX_C_SOURCE=199309L
CFLAGS += -D_POSIX_SOURCE -D_XOPEN_SOURCE=500L
CFLAGS += -D_BSD_SOURCE -D_SVID_SOURCE -D_REENTRANT
CFLAGS += -DSHAPE -DXKB -DBIGREQS -DGLXEXT -DGLX_USE_MESA -DMITMISC -DXTEST
CFLAGS += -DPANORAMIX -DRANDR -DRENDER -DXCMISC -DXSYNC -DXRECORD
CFLAGS += -D_GNU_SOURCE -DLBX -DXAPPGROUP -DXCSECURITY -DTOGCUP
CFLAGS += -DXF86BIGFONT -DDPMSExtension -DSINGLEDEPTH -DXvExtension
CFLAGS += -DXFree86Server -DXvMCExtension -DSMART_SCHEDULE -DXResExtension
CFLAGS += -DX_BYTE_ORDER=X_LITTLE_ENDIAN -DXTRAP -DMITSHM -DDBE -DEVI
CFLAGS += -DSCREENSAVER -DXV -DXVMC -DFONTCACHE
#CFLAGS += -DXINPUT
CFLAGS += -DGCCUSESGAS -DSTATIC_COLOR -DAVOID_GLYPHBLT -DPIXPRIV
CFLAGS += -DNDEBUG -DFUNCPROTO=15 -DNARROWPROTO -DDDXOSINIT
CFLAGS += -DSERVER_LOCK -DDDXOSFATALERROR -DDDXTIME -DPART_NET
#CFLAGS += -DXVNCRELEASE=\"tight1.2.9\"
all: rdp
rdp: $(OBJS)
$(AR) rvu librdp.a $(OBJS)
ranlib librdp.a
clean:
rm -f $(OBJS) librdp.a
miinitext.o: ../../mi/miinitext.c
$(CC) $(CFLAGS) -c ../../mi/miinitext.c

@ -0,0 +1,98 @@
/*
Copyright 2005-2006 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
static void
rdpValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr d);
static void
rdpChangeGC(GCPtr pGC, unsigned long mask);
static void
rdpCopyGC(GCPtr src, unsigned long mask, GCPtr dst);
static void
rdpDestroyGC(GCPtr pGC);
static void
rdpChangeClip(GCPtr pGC, int type, pointer pValue, int nrects);
static void
rdpDestroyClip(GCPtr pGC);
static void
rdpCopyClip(GCPtr dst, GCPtr src);
static void
rdpFillSpans(DrawablePtr pDrawable, GCPtr pGC, int nInit,
DDXPointPtr pptInit, int * pwidthInit, int fSorted);
static void
rdpSetSpans(DrawablePtr pDrawable, GCPtr pGC, char * psrc,
DDXPointPtr ppt, int * pwidth, int nspans, int fSorted);
static void
rdpPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
int w, int h, int leftPad, int format, char * pBits);
static RegionPtr
rdpCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
int srcx, int srcy, int w, int h, int dstx, int dsty);
static RegionPtr
rdpCopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
GCPtr pGC, int srcx, int srcy, int width, int height,
int dstx, int dsty, unsigned long bitPlane);
static void
rdpPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode,
int npt, DDXPointPtr pptInit);
static void
rdpPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode,
int npt, DDXPointPtr pptInit);
static void
rdpPolySegment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pSegs);
static void
rdpPolyRectangle(DrawablePtr pDrawable, GCPtr pGC, int nrects,
xRectangle * pRects);
static void
rdpPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * parcs);
static void
rdpFillPolygon(DrawablePtr pDrawable, GCPtr pGC,
int shape, int mode, int count,
DDXPointPtr pPts);
static void
rdpPolyFillRect(DrawablePtr pDrawable, GCPtr pGC, int nrectFill,
xRectangle * prectInit);
static void
rdpPolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * parcs);
static int
rdpPolyText8(DrawablePtr pDrawable, GCPtr pGC,
int x, int y, int count, char * chars);
static int
rdpPolyText16(DrawablePtr pDrawable, GCPtr pGC,
int x, int y, int count, unsigned short * chars);
static void
rdpImageText8(DrawablePtr pDrawable, GCPtr pGC,
int x, int y, int count, char * chars);
static void
rdpImageText16(DrawablePtr pDrawable, GCPtr pGC,
int x, int y, int count,
unsigned short * chars);
static void
rdpImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
int x, int y, unsigned int nglyph,
CharInfoPtr * ppci, pointer pglyphBase);
static void
rdpPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
int x, int y, unsigned int nglyph,
CharInfoPtr * ppci,
pointer pglyphBase);
static void
rdpPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
int w, int h, int x, int y);

@ -0,0 +1,400 @@
/*
Copyright 2005-2006 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include "X11/X.h"
#define NEED_EVENTS
#include "X11/Xproto.h"
#include "X11/Xos.h"
#include "scrnintstr.h"
#include "servermd.h"
#define PSZ 8
#include "cfb.h"
#include "mibstore.h"
#include "colormapst.h"
#include "gcstruct.h"
#include "input.h"
#include "mipointer.h"
#include "dixstruct.h"
#include "propertyst.h"
#include <Xatom.h>
#include <errno.h>
#include <sys/param.h>
#include "dix.h"
#include <X11/keysym.h>
#include "dixfontstr.h"
#include "osdep.h"
#include "fontstruct.h"
#include <cursorstr.h>
#include "picturestr.h"
#include <netinet/tcp.h>
/* Per-screen (framebuffer) structure. There is only one of these, since we
don't allow the X server to have multiple screens. */
typedef struct
{
int width;
int paddedWidthInBytes;
int height;
int depth;
int bitsPerPixel;
int sizeInBytes;
char* pfbMemory;
Pixel blackPixel;
Pixel whitePixel;
/* wrapped screen functions */
/* Random screen procedures */
CloseScreenProcPtr CloseScreen;
/* GC procedures */
CreateGCProcPtr CreateGC;
/* Window Procedures */
PaintWindowBackgroundProcPtr PaintWindowBackground;
PaintWindowBorderProcPtr PaintWindowBorder;
CopyWindowProcPtr CopyWindow;
ClearToBackgroundProcPtr ClearToBackground;
ScreenWakeupHandlerProcPtr WakeupHandler;
CompositeProcPtr Composite;
/* Backing store procedures */
RestoreAreasProcPtr RestoreAreas;
/*InstallColormapProcPtr InstallColormap;*/
} rdpScreenInfo;
typedef rdpScreenInfo* rdpScreenInfoPtr;
typedef struct
{
GCFuncs* funcs;
GCOps* ops;
} rdpGCRec;
typedef rdpGCRec* rdpGCPtr;
/* rdpmisc.c */
void
rdpLog(char *format, ...);
int
rdpBitsPerPixel(int depth);
void
rdpClientStateChange(CallbackListPtr* cbl, pointer myData, pointer clt);
int
g_tcp_recv(int sck, void* ptr, int len, int flags);
void
g_tcp_close(int sck);
int
g_tcp_last_error_would_block(int sck);
void
g_sleep(int msecs);
int
g_tcp_send(int sck, void* ptr, int len, int flags);
void*
g_malloc(int size, int zero);
void
g_free(void* ptr);
void
g_sprintf(char* dest, char* format, ...);
int
g_tcp_socket(void);
void
g_memcpy(void* d_ptr, const void* s_ptr, int size);
int
g_tcp_set_no_delay(int sck);
int
g_tcp_set_non_blocking(int sck);
int
g_tcp_accept(int sck);
int
g_tcp_select(int sck1, int sck2);
int
g_tcp_bind(int sck, char* port);
int
g_tcp_listen(int sck);
/* rdpdraw.c */
Bool
rdpCloseScreen(int i, ScreenPtr pScreen);
Bool
rdpCreateGC(GCPtr pGC);
void
rdpPaintWindowBackground(WindowPtr pWin, RegionPtr pRegion, int what);
void
rdpPaintWindowBorder(WindowPtr pWin, RegionPtr pRegion, int what);
void
rdpCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr pOldRegion);
void
rdpClearToBackground(WindowPtr pWin, int x, int y, int w, int h,
Bool generateExposures);
RegionPtr
rdpRestoreAreas(WindowPtr pWin, RegionPtr prgnExposed);
void
rdpInstallColormap(ColormapPtr pmap);
void
rdpUninstallColormap(ColormapPtr pmap);
int
rdpListInstalledColormaps(ScreenPtr pScreen, Colormap* pmaps);
void
rdpStoreColors(ColormapPtr pmap, int ndef, xColorItem* pdefs);
Bool
rdpSaveScreen(ScreenPtr pScreen, int on);
Bool
rdpRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor);
Bool
rdpUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor);
void
rdpCursorLimits(ScreenPtr pScreen, CursorPtr pCursor,
BoxPtr pHotBox, BoxPtr pTopLeftBox);
void
rdpConstrainCursor(ScreenPtr pScreen, BoxPtr pBox);
Bool
rdpSetCursorPosition(ScreenPtr pScreen, int x, int y, Bool generateEvent);
Bool
rdpDisplayCursor(ScreenPtr pScreen, CursorPtr pCursor);
void
rdpRecolorCursor(ScreenPtr pScreen, CursorPtr pCursor,
Bool displayed);
void
rdpComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst,
INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst,
INT16 yDst, CARD16 width, CARD16 height);
/* rdpkbdptr.c */
int
rdpKeybdProc(DeviceIntPtr pDevice, int onoff);
int
rdpMouseProc(DeviceIntPtr pDevice, int onoff);
Bool
rdpCursorOffScreen(ScreenPtr* ppScreen, int* x, int* y);
void
rdpCrossScreen(ScreenPtr pScreen, Bool entering);
Bool
rdpSpriteRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor);
Bool
rdpSpriteUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor);
void
rdpSpriteSetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y);
void
rdpSpriteMoveCursor(ScreenPtr pScreen, int x, int y);
void
PtrAddEvent(int buttonMask, int x, int y);
void
KbdAddEvent(int down, int param1, int param2, int param3, int param4);
/* rdpup.c */
int
rdpup_init(void);
int
rdpup_check(void);
int
rdpup_begin_update(void);
int
rdpup_end_update(void);
int
rdpup_fill_rect(short x, short y, int cx, int cy);
int
rdpup_screen_blt(short x, short y, int cx, int cy, short srcx, short srcy);
int
rdpup_set_clip(short x, short y, int cx, int cy);
int
rdpup_reset_clip(void);
int
rdpup_set_fgcolor(int fgcolor);
int
rdpup_set_bgcolor(int bgcolor);
int
rdpup_set_opcode(int opcode);
int
rdpup_paint_rect(short x, short y, int cx, int cy,
char* bmpdata, int width, int height,
short srcx, short srcy);
int
rdpup_set_pen(int style, int width);
int
rdpup_draw_line(short x1, short y1, short x2, short y2);
void
rdpup_send_area(int x, int y, int w, int h);
#if defined(__sparc__) || defined(__PPC__)
#define B_ENDIAN
#elif __BYTE_ORDER == __LITTLE_ENDIAN
#define L_ENDIAN
#elif __BYTE_ORDER == __BIG_ENDIAN
#define B_ENDIAN
#endif
/* check if we need to align data */
#if defined(__sparc__) || defined(__alpha__) || defined(__hppa__) || \
defined(__AIX__) || defined(__PPC__) || defined(__mips__) || \
defined(__ia64__)
#define NEED_ALIGN
#endif
/* parser state */
struct stream
{
char* p;
char* end;
char* data;
int size;
/* offsets of various headers */
char* iso_hdr;
char* mcs_hdr;
char* sec_hdr;
char* rdp_hdr;
char* channel_hdr;
char* next_packet;
};
/******************************************************************************/
#define s_push_layer(s, h, n) \
{ \
(s)->h = (s)->p; \
(s)->p += (n); \
}
/******************************************************************************/
#define s_pop_layer(s, h) \
{ \
(s)->p = (s)->h; \
}
/******************************************************************************/
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
#define out_uint16_le(s, v) \
{ \
*((s)->p) = (unsigned char)((v) >> 0); \
(s)->p++; \
*((s)->p) = (unsigned char)((v) >> 8); \
(s)->p++; \
}
#else
#define out_uint16_le(s, v) \
{ \
*((unsigned short*)((s)->p)) = (unsigned short)(v); \
(s)->p += 2; \
}
#endif
/******************************************************************************/
#define init_stream(s, v) \
{ \
if ((v) > (s)->size) \
{ \
g_free((s)->data); \
(s)->data = (char*)g_malloc((v), 0); \
(s)->size = (v); \
} \
(s)->p = (s)->data; \
(s)->end = (s)->data; \
(s)->next_packet = 0; \
}
/******************************************************************************/
#define out_uint8p(s, v, n) \
{ \
g_memcpy((s)->p, (v), (n)); \
(s)->p += (n); \
}
/******************************************************************************/
#define out_uint8a(s, v, n) \
{ \
out_uint8p((s), (v), (n)); \
}
/******************************************************************************/
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
#define out_uint32_le(s, v) \
{ \
*((s)->p) = (unsigned char)((v) >> 0); \
(s)->p++; \
*((s)->p) = (unsigned char)((v) >> 8); \
(s)->p++; \
*((s)->p) = (unsigned char)((v) >> 16); \
(s)->p++; \
*((s)->p) = (unsigned char)((v) >> 24); \
(s)->p++; \
}
#else
#define out_uint32_le(s, v) \
{ \
*((unsigned int*)((s)->p)) = (v); \
(s)->p += 4; \
}
#endif
/******************************************************************************/
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
#define in_uint32_le(s, v) \
{ \
(v) = (unsigned int) \
( \
(*((unsigned char*)((s)->p + 0)) << 0) | \
(*((unsigned char*)((s)->p + 1)) << 8) | \
(*((unsigned char*)((s)->p + 2)) << 16) | \
(*((unsigned char*)((s)->p + 3)) << 24) \
); \
(s)->p += 4; \
}
#else
#define in_uint32_le(s, v) \
{ \
(v) = *((unsigned int*)((s)->p)); \
(s)->p += 4; \
}
#endif
/******************************************************************************/
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
#define in_uint16_le(s, v) \
{ \
(v) = (unsigned short) \
( \
(*((unsigned char*)((s)->p + 0)) << 0) | \
(*((unsigned char*)((s)->p + 1)) << 8) \
); \
(s)->p += 2; \
}
#else
#define in_uint16_le(s, v) \
{ \
(v) = *((unsigned short*)((s)->p)); \
(s)->p += 2; \
}
#endif
/******************************************************************************/
#define s_mark_end(s) \
{ \
(s)->end = (s)->p; \
}
/******************************************************************************/
#define make_stream(s) \
{ \
(s) = (struct stream*)g_malloc(sizeof(struct stream), 1); \
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,999 @@
/*
Copyright 2005-2006 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keyboard and mouse stuff
*/
#include "rdp.h"
static DeviceIntPtr kbdDevice;
static int g_old_button_mask = 0;
extern int g_Bpp; /* from rdpmain.c */
extern ScreenPtr g_pScreen; /* from rdpmain.c */
extern rdpScreenInfo rdpScreen; /* from rdpmain.c */
#define CONTROL_L_KEY_CODE MIN_KEY_CODE
#define CONTROL_R_KEY_CODE (MIN_KEY_CODE + 1)
#define MIN_KEY_CODE 8
#define MAX_KEY_CODE 255
#define NO_OF_KEYS (MAX_KEY_CODE - MIN_KEY_CODE + 1)
#define GLYPHS_PER_KEY 2
#define SHIFT_L_KEY_CODE (MIN_KEY_CODE + 2)
#define SHIFT_R_KEY_CODE (MIN_KEY_CODE + 3)
#define META_L_KEY_CODE (MIN_KEY_CODE + 4)
#define META_R_KEY_CODE (MIN_KEY_CODE + 5)
#define ALT_L_KEY_CODE (MIN_KEY_CODE + 6)
#define ALT_R_KEY_CODE (MIN_KEY_CODE + 7)
#define N_PREDEFINED_KEYS (sizeof(kbdMap) / (sizeof(KeySym) * GLYPHS_PER_KEY))
/* Copied from Xvnc/lib/font/util/utilbitmap.c */
static unsigned char g_reverse_byte[0x100] =
{
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
};
static KeySym kbdMap[] =
{
/* non shift shift index */
/* key map */
XK_Control_L, NoSymbol, /* 8 */
XK_Control_R, NoSymbol, /* 9 */
XK_Shift_L, NoSymbol, /* 10 */
XK_Shift_R, NoSymbol,
XK_Meta_L, NoSymbol,
XK_Meta_R, NoSymbol,
XK_Alt_L, NoSymbol,
XK_Alt_R, NoSymbol,
/* Standard US keyboard */
XK_space, NoSymbol,
XK_0, XK_parenright,
XK_1, XK_exclam,
XK_2, XK_at,
XK_3, XK_numbersign, /* 20 */
XK_4, XK_dollar,
XK_5, XK_percent,
XK_6, XK_asciicircum,
XK_7, XK_ampersand,
XK_8, XK_asterisk,
XK_9, XK_parenleft,
XK_minus, XK_underscore,
XK_equal, XK_plus,
XK_bracketleft, XK_braceleft,
XK_bracketright, XK_braceright, /* 30 */
XK_semicolon, XK_colon,
XK_apostrophe, XK_quotedbl,
XK_grave, XK_asciitilde,
XK_comma, XK_less,
XK_period, XK_greater,
XK_slash, XK_question,
XK_backslash, XK_bar,
XK_a, XK_A,
XK_b, XK_B,
XK_c, XK_C, /* 40 */
XK_d, XK_D,
XK_e, XK_E,
XK_f, XK_F,
XK_g, XK_G,
XK_h, XK_H,
XK_i, XK_I,
XK_j, XK_J,
XK_k, XK_K,
XK_l, XK_L,
XK_m, XK_M, /* 50 */
XK_n, XK_N,
XK_o, XK_O,
XK_p, XK_P,
XK_q, XK_Q,
XK_r, XK_R,
XK_s, XK_S,
XK_t, XK_T,
XK_u, XK_U,
XK_v, XK_V,
XK_w, XK_W, /* 60 */
XK_x, XK_X,
XK_y, XK_Y,
XK_z, XK_Z,
/* Other useful keys */
XK_BackSpace, NoSymbol,
XK_Return, NoSymbol,
XK_Tab, NoSymbol,
XK_Escape, NoSymbol,
XK_Delete, NoSymbol,
XK_Home, NoSymbol,
XK_End, NoSymbol, /* 70 */
XK_Page_Up, NoSymbol,
XK_Page_Down, NoSymbol,
XK_Up, NoSymbol,
XK_Down, NoSymbol,
XK_Left, NoSymbol,
XK_Right, NoSymbol,
XK_F1, NoSymbol,
XK_F2, NoSymbol,
XK_F3, NoSymbol,
XK_F4, NoSymbol, /* 80 */
XK_F5, NoSymbol,
XK_F6, NoSymbol,
XK_F7, NoSymbol,
XK_F8, NoSymbol,
XK_F9, NoSymbol,
XK_F10, NoSymbol,
XK_F11, NoSymbol,
XK_F12, NoSymbol,
XK_KP_Multiply, NoSymbol, /* 89 */
XK_Print, NoSymbol, /* 90 */
XK_Caps_Lock, NoSymbol, /* 91 */
XK_Num_Lock, NoSymbol, /* 92 */
XK_Scroll_Lock, NoSymbol, /* 93 */
XK_KP_Home, NoSymbol, /* 94 */
XK_KP_7, NoSymbol, /* 95 */
XK_KP_Up, NoSymbol, /* 96 */
XK_KP_8, NoSymbol, /* 97 */
XK_KP_Page_Up, NoSymbol, /* 98 */
XK_KP_9, NoSymbol, /* 99 */
XK_KP_Subtract, NoSymbol, /* 100 */
XK_KP_Left, NoSymbol, /* 101 */
XK_KP_4, NoSymbol, /* 102 */
XK_KP_5, NoSymbol, /* 103 */
XK_KP_Right, NoSymbol, /* 104 */
XK_KP_6, NoSymbol, /* 105 */
XK_KP_Add, NoSymbol, /* 106 */
XK_KP_End, NoSymbol, /* 107 */
XK_KP_1, NoSymbol, /* 108 */
XK_KP_Down, NoSymbol, /* 109 */
XK_KP_2, NoSymbol, /* 110 */
XK_KP_Page_Down, NoSymbol, /* 111 */
XK_KP_3, NoSymbol, /* 112 */
XK_KP_Insert, NoSymbol, /* 113 */
XK_KP_0, NoSymbol, /* 114 */
XK_Insert, NoSymbol, /* 115 */
XK_KP_Delete, NoSymbol, /* 116 */
XK_KP_Decimal, NoSymbol /* 117 */
};
/******************************************************************************/
static void
rdpSendBell()
{
ErrorF("hi rdpSendBell\n");
}
/******************************************************************************/
void
KbdDeviceInit(DeviceIntPtr pDevice, KeySymsPtr pKeySyms, CARD8* pModMap)
{
int i;
ErrorF("hi KbdDeviceInit\n");
kbdDevice = pDevice;
for (i = 0; i < MAP_LENGTH; i++)
{
pModMap[i] = NoSymbol;
}
pModMap[CONTROL_L_KEY_CODE] = ControlMask;
pModMap[CONTROL_R_KEY_CODE] = ControlMask;
pModMap[SHIFT_L_KEY_CODE] = ShiftMask;
pModMap[SHIFT_R_KEY_CODE] = ShiftMask;
pModMap[META_L_KEY_CODE] = Mod4Mask;
pModMap[META_R_KEY_CODE] = Mod4Mask;
pModMap[ALT_L_KEY_CODE] = Mod1Mask;
pModMap[ALT_R_KEY_CODE] = Mod1Mask;
pKeySyms->minKeyCode = MIN_KEY_CODE;
pKeySyms->maxKeyCode = MAX_KEY_CODE;
pKeySyms->mapWidth = GLYPHS_PER_KEY;
pKeySyms->map = (KeySym *)Xalloc(sizeof(KeySym) * MAP_LENGTH *
GLYPHS_PER_KEY);
if (pKeySyms->map == 0)
{
rdpLog("Xalloc failed\n");
exit(1);
}
for (i = 0; i < MAP_LENGTH * GLYPHS_PER_KEY ; i++)
{
pKeySyms->map[i] = NoSymbol;
}
for (i = 0; i < N_PREDEFINED_KEYS * GLYPHS_PER_KEY; i++)
{
pKeySyms->map[i] = kbdMap[i];
}
}
/******************************************************************************/
void
KbdDeviceOn(void)
{
ErrorF("hi KbdDeviceOn\n");
/*usleep(1000000);*/
/*ErrorF("bye KbdDeviceOn\n");*/
}
/******************************************************************************/
void
KbdDeviceOff(void)
{
ErrorF("hi KbdDeviceOff\n");
}
/******************************************************************************/
int
rdpKeybdProc(DeviceIntPtr pDevice, int onoff)
{
KeySymsRec keySyms;
CARD8 modMap[MAP_LENGTH];
DevicePtr pDev;
ErrorF("hi rdpKeybdProc\n");
pDev = (DevicePtr)pDevice;
switch (onoff)
{
case DEVICE_INIT:
KbdDeviceInit(pDevice, &keySyms, modMap);
InitKeyboardDeviceStruct(pDev, &keySyms, modMap,
(BellProcPtr)rdpSendBell,
(KbdCtrlProcPtr)NoopDDA);
break;
case DEVICE_ON:
pDev->on = 1;
KbdDeviceOn();
break;
case DEVICE_OFF:
pDev->on = 0;
KbdDeviceOff();
break;
case DEVICE_CLOSE:
if (pDev->on)
{
KbdDeviceOff();
}
break;
}
return Success;
}
/******************************************************************************/
void
PtrDeviceControl(DevicePtr dev, PtrCtrl* ctrl)
{
ErrorF("hi PtrDeviceControl\n");
}
/******************************************************************************/
void
PtrDeviceInit(void)
{
ErrorF("hi PtrDeviceInit\n");
}
/******************************************************************************/
void
PtrDeviceOn(DeviceIntPtr pDev)
{
ErrorF("hi PtrDeviceOn\n");
}
/******************************************************************************/
void
PtrDeviceOff(void)
{
ErrorF("hi PtrDeviceOff\n");
}
/******************************************************************************/
int
rdpMouseProc(DeviceIntPtr pDevice, int onoff)
{
BYTE map[6];
DevicePtr pDev;
ErrorF("hi rdpMouseProc\n");
pDev = (DevicePtr)pDevice;
switch (onoff)
{
case DEVICE_INIT:
PtrDeviceInit();
map[0] = 0;
map[1] = 1;
map[2] = 2;
map[3] = 3;
map[4] = 4;
map[5] = 5;
InitPointerDeviceStruct(pDev, map, 5, miPointerGetMotionEvents,
PtrDeviceControl,
miPointerGetMotionBufferSize());
break;
case DEVICE_ON:
pDev->on = 1;
PtrDeviceOn(pDevice);
break;
case DEVICE_OFF:
pDev->on = 0;
PtrDeviceOff();
break;
case DEVICE_CLOSE:
if (pDev->on)
{
PtrDeviceOff();
}
break;
}
return Success;
}
/******************************************************************************/
Bool
rdpCursorOffScreen(ScreenPtr* ppScreen, int* x, int* y)
{
/*ErrorF("hi rdpCursorOffScreen\n");*/
return 0;
}
/******************************************************************************/
void
rdpCrossScreen(ScreenPtr pScreen, Bool entering)
{
/*ErrorF("hi rdpCrossScreen\n");*/
}
/******************************************************************************/
Bool
rdpSpriteRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor)
{
/*ErrorF("hi rdpSpriteRealizeCursor\n");*/
return 1;
}
/******************************************************************************/
Bool
rdpSpriteUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor)
{
/*ErrorF("hi rdpSpriteUnrealizeCursor\n");*/
return 1;
}
/******************************************************************************/
int
get_pixel_safe(char* data, int x, int y, int width, int height, int bpp)
{
int start;
int shift;
int c;
if (x < 0)
{
return 0;
}
if (y < 0)
{
return 0;
}
if (x >= width)
{
return 0;
}
if (y >= height)
{
return 0;
}
if (bpp == 1)
{
width = (width + 7) / 8;
start = (y * width) + x / 8;
shift = x % 8;
c = (unsigned char)(data[start]);
/* todo LSBFirst */
return (g_reverse_byte[c] & (0x80 >> shift)) != 0;
}
return 0;
}
/******************************************************************************/
void
set_pixel_safe(char* data, int x, int y, int width, int height, int bpp,
int pixel)
{
int start;
int shift;
if (x < 0)
{
return;
}
if (y < 0)
{
return;
}
if (x >= width)
{
return;
}
if (y >= height)
{
return;
}
if (bpp == 1)
{
width = (width + 7) / 8;
start = (y * width) + x / 8;
shift = x % 8;
if (pixel & 1)
{
data[start] = data[start] | (0x80 >> shift);
}
else
{
data[start] = data[start] & ~(0x80 >> shift);
}
}
else if (bpp == 24)
{
*(data + (3 * (y * width + x)) + 0) = pixel >> 0;
*(data + (3 * (y * width + x)) + 1) = pixel >> 8;
*(data + (3 * (y * width + x)) + 2) = pixel >> 16;
}
}
/******************************************************************************/
void
rdpSpriteSetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
{
char cur_data[32 * (32 * 3)];
char cur_mask[32 * (32 / 8)];
char* mask;
char* data;
int i;
int j;
int w;
int h;
int p;
int xhot;
int yhot;
int paddedRowBytes;
int fgcolor;
int bgcolor;
if (pCursor == 0)
{
return;
}
if (pCursor->bits == 0)
{
return;
}
w = pCursor->bits->width;
h = pCursor->bits->height;
paddedRowBytes = PixmapBytePad(w, 1);
xhot = pCursor->bits->xhot;
yhot = pCursor->bits->yhot;
data = (char*)(pCursor->bits->source);
mask = (char*)(pCursor->bits->mask);
fgcolor = (((pCursor->foreRed >> 8) & 0xff) << 16) |
(((pCursor->foreGreen >> 8) & 0xff) << 8) |
((pCursor->foreBlue >> 8) & 0xff);
bgcolor = (((pCursor->backRed >> 8) & 0xff) << 16) |
(((pCursor->backGreen >> 8) & 0xff) << 8) |
((pCursor->backBlue >> 8) & 0xff);
memset(cur_data, 0, sizeof(cur_data));
memset(cur_mask, 0, sizeof(cur_mask));
for (j = 0; j < 32; j++)
{
for (i = 0; i < 32; i++)
{
p = get_pixel_safe(mask, i, j, paddedRowBytes * 8, h, 1);
set_pixel_safe(cur_mask, i, 31 - j, 32, 32, 1, !p);
if (p != 0)
{
p = get_pixel_safe(data, i, j, paddedRowBytes * 8, h, 1);
p = p ? fgcolor : bgcolor;
set_pixel_safe(cur_data, i, 31 - j, 32, 32, 24, p);
}
}
}
rdpup_begin_update();
rdpup_set_cursor(xhot, yhot, cur_data, cur_mask);
rdpup_end_update();
}
/******************************************************************************/
void
rdpSpriteMoveCursor(ScreenPtr pScreen, int x, int y)
{
/*ErrorF("hi rdpSpriteMoveCursor\n");*/
}
/******************************************************************************/
void
PtrAddEvent(int buttonMask, int x, int y)
{
xEvent ev;
int i;
unsigned long time;
time = GetTimeInMillis();
miPointerAbsoluteCursor(x, y, time);
for (i = 0; i < 5; i++)
{
if ((buttonMask ^ g_old_button_mask) & (1 << i))
{
if (buttonMask & (1 << i))
{
ev.u.u.type = ButtonPress;
ev.u.u.detail = i + 1;
ev.u.keyButtonPointer.time = time;
mieqEnqueue(&ev);
}
else
{
ev.u.u.type = ButtonRelease;
ev.u.u.detail = i + 1;
ev.u.keyButtonPointer.time = time;
mieqEnqueue(&ev);
}
}
}
g_old_button_mask = buttonMask;
}
/******************************************************************************/
void
KbdAddEvent(int down, int param1, int param2, int param3, int param4)
{
xEvent ev;
unsigned long time;
int ch;
time = GetTimeInMillis();
if (down)
{
ev.u.u.type = KeyPress;
}
else
{
ev.u.u.type = KeyRelease;
}
ev.u.keyButtonPointer.time = time;
ch = 0;
switch (param3)
{
case 1: /* esc */
ch = 67;
break;
case 2: /* 1 or ! */
ch = 18;
break;
case 3: /* 2 or @ */
ch = 19;
break;
case 4: /* 3 or # */
ch = 20;
break;
case 5: /* 4 or $ */
ch = 21;
break;
case 6: /* 5 or % */
ch = 22;
break;
case 7: /* 6 or ^ */
ch = 23;
break;
case 8: /* 7 or & */
ch = 24;
break;
case 9: /* 8 or * */
ch = 25;
break;
case 10: /* 9 or ( */
ch = 26;
break;
case 11: /* 0 or ) */
ch = 17;
break;
case 12: /* - or _ */
ch = 27;
break;
case 13: /* = or + */
ch = 28;
break;
case 14: /* backspace */
ch = 64;
break;
case 15: /* tab */
ch = 66;
break;
case 16: /* q */
ch = 54;
break;
case 17: /* w */
ch = 60;
break;
case 18: /* e */
ch = 42;
break;
case 19: /* r */
ch = 55;
break;
case 20: /* t */
ch = 57;
break;
case 21: /* y */
ch = 62;
break;
case 22: /* u */
ch = 58;
break;
case 23: /* i */
ch = 46;
break;
case 24: /* o */
ch = 52;
break;
case 25: /* p */
ch = 53;
break;
case 26: /* [ or { */
ch = 29;
break;
case 27: /* ] or } */
ch = 30;
break;
case 28: /* enter */
ch = 65;
break;
case 29: /* left and right control */
if (param4 & 0x100) /* rdp ext flag */
{
ch = 9;
}
else
{
ch = 8;
}
break;
case 30: /* a */
ch = 38;
break;
case 31: /* s */
ch = 56;
break;
case 32: /* d */
ch = 41;
break;
case 33: /* f */
ch = 43;
break;
case 34: /* g */
ch = 44;
break;
case 35: /* h */
ch = 45;
break;
case 36: /* j */
ch = 47;
break;
case 37: /* k */
ch = 48;
break;
case 38: /* l */
ch = 49;
break;
case 39: /* : or ; */
ch = 31;
break;
case 40: /* ' or " */
ch = 32;
break;
case 41: /* ` or ~ */
ch = 33;
break;
case 42: /* left shift */
ch = 10;
break;
case 43: /* / */
ch = 36;
break;
case 44: /* z */
ch = 63;
break;
case 45: /* x */
ch = 61;
break;
case 46: /* c */
ch = 40;
break;
case 47: /* v */
ch = 59;
break;
case 48: /* b */
ch = 39;
break;
case 49: /* n */
ch = 51;
break;
case 50: /* m */
ch = 50;
break;
case 51: /* , or < */
ch = 34;
break;
case 52: /* . or > */
ch = 35;
break;
case 53: /* / or ? */
ch = 36;
break;
case 54: /* right shift */
ch = 11;
break;
case 55: /* * on keypad or print screen if ext */
if (param4 & 0x100) /* rdp ext flag */
{
ch = 90;
}
else
{
ch = 89;
}
break;
case 56: /* left and right alt */
if (param4 & 0x100) /* rdp ext flag */
{
ch = 15; /* right alt */
}
else
{
ch = 14; /* left alt */
}
break;
case 57: /* space */
ch = 16;
break;
case 58: /* caps lock */
ch = 91;
break;
case 59: /* F1 */
ch = 77;
break;
case 60: /* F2 */
ch = 78;
break;
case 61: /* F3 */
ch = 79;
break;
case 62: /* F4 */
ch = 80;
break;
case 63: /* F5 */
ch = 81;
break;
case 64: /* F6 */
ch = 82;
break;
case 65: /* F7 */
ch = 83;
break;
case 66: /* F8 */
ch = 84;
break;
case 67: /* F9 */
ch = 85;
break;
case 68: /* F10 */
ch = 86;
break;
case 69: /* Num lock */
ch = 92;
break;
case 70: /* Scroll lock */
ch = 93;
break;
case 71: /* 7 or home */
if (param2 == 0xffff) /* ascii 7 */
{
ch = 95; /* keypad 7 */
}
else if (param4 & 0x100)
{
ch = 69; /* non keypad home */
}
else
{
ch = 94; /* keypad home */
}
break;
case 72: /* 8 or up arrow */
if (param2 == 0xffff) /* ascii 8 */
{
ch = 97; /* keypad 8 */
}
else if (param4 & 0x100)
{
ch = 73; /* non keypad up */
}
else
{
ch = 96; /* keypad up */
}
break;
case 73: /* 9 or page up */
if (param2 == 0xffff) /* ascii 9 */
{
ch = 99; /* keypad 9 */
}
else if (param4 & 0x100)
{
ch = 71; /* non keypad page up */
}
else
{
ch = 98; /* keypad page up */
}
break;
case 74: /* minus on keypad */
ch = 100;
break;
case 75: /* 4 or left arrow */
if (param2 == 0xffff) /* ascii 4 */
{
ch = 102; /* keypad 4 */
}
else if (param4 & 0x100)
{
ch = 75; /* non keypad left */
}
else
{
ch = 101; /* keypad left */
}
break;
case 76: /* 5 on keypad */
ch = 103;
break;
case 77: /* 6 or right arrow */
if (param2 == 0xffff) /* ascii 6 */
{
ch = 105; /* keypad 6 */
}
else if (param4 & 0x100)
{
ch = 76; /* non keypad right */
}
else
{
ch = 104; /* keypad right */
}
break;
case 78: /* plus on keypad */
ch = 106;
break;
case 79: /* 1 or end */
if (param2 == 0xffff) /* ascii 1 */
{
ch = 108; /* keypad 1 */
}
else if (param4 & 0x100)
{
ch = 70; /* non keypad end */
}
else
{
ch = 107; /* keypad end */
}
break;
case 80: /* 2 or down arrow */
if (param2 == 0xffff) /* ascii 2 */
{
ch = 110; /* keypad 2 */
}
else if (param4 & 0x100)
{
ch = 74; /* non keypad down arrow */
}
else
{
ch = 109; /* keypad down arrow */
}
break;
case 81: /* 3 or page down */
if (param2 == 0xffff) /* ascii 3 */
{
ch = 112; /* keypad 3 */
}
else if (param4 & 0x100)
{
ch = 72; /* non keypad page down */
}
else
{
ch = 111; /* keypad page down */
}
break;
case 82: /* 0 or insert */
if (param2 == 0xffff) /* ascii 0 */
{
ch = 114; /* keypad 0 */
}
else if (param4 & 0x100)
{
ch = 115; /* non keypad insert */
}
else
{
ch = 113; /* keypad insert */
}
break;
case 83: /* . or delete */
if (param2 == 0xffff) /* ascii . */
{
ch = 117; /* keypad . */
}
else if (param4 & 0x100)
{
ch = 68; /* non keypad delete */
}
else
{
ch = 116; /* keypad delete */
}
break;
case 87: /* F11 */
ch = 87;
break;
case 88: /* F12 */
ch = 88;
break;
}
if (ch > 0)
{
ev.u.u.detail = ch;
mieqEnqueue(&ev);
}
}

@ -0,0 +1,528 @@
/*
Copyright 2005-2006 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
This is the main file called from main.c
Sets up the functions
*/
#include "rdp.h"
rdpScreenInfo g_rdpScreen; /* the one screen */
ScreenPtr g_pScreen = 0;
int g_rdpGCIndex = -1;
int g_firstTime = 1;
/* set all these at once, use function set_bpp */
/* only allow 8 and 16 bpp for not, adding 32 later */
int g_bpp = 16;
int g_Bpp = 2;
int g_Bpp_mask = 0xffff;
static int g_redBits = 5;
static int g_greenBits = 6;
static int g_blueBits = 5;
extern int monitorResolution;
extern int defaultColorVisualClass;
extern char* display;
/*static HWEventQueueType alwaysCheckForInput[2] = { 0, 1 };
static HWEventQueueType* mieqCheckForInput[2];*/
static int g_initOutputCalled = 0;
/******************************************************************************/
/* returns error, zero is good */
static int
set_bpp(int bpp)
{
int rv;
rv = 0;
g_bpp = bpp;
if (g_bpp == 8)
{
g_Bpp = 1;
g_Bpp_mask = 0xff;
g_redBits = 3;
g_greenBits = 3;
g_blueBits = 2;
}
else if (g_bpp == 16)
{
g_Bpp = 2;
g_Bpp_mask = 0xffff;
g_redBits = 5;
g_greenBits = 6;
g_blueBits = 5;
}
else if (g_bpp == 32)
{
g_Bpp = 4;
g_Bpp_mask = 0xffffff;
g_redBits = 8;
g_greenBits = 8;
g_blueBits = 8;
}
else
{
rv = 1;
}
return rv;
}
/******************************************************************************/
/* these are in rdpkbptr.c */
static miPointerSpriteFuncRec rdpSpritePointerFuncs =
{
rdpSpriteRealizeCursor,
rdpSpriteUnrealizeCursor,
rdpSpriteSetCursor,
rdpSpriteMoveCursor,
};
/******************************************************************************/
/* these are in rdpkbptr.c */
static miPointerScreenFuncRec rdpPointerCursorFuncs =
{
rdpCursorOffScreen,
rdpCrossScreen,
miPointerWarpCursor /* don't need to set last 2 funcs
EnqueueEvent and NewEventScreen */
};
/******************************************************************************/
static void
rdpWakeupHandler(int i, pointer blockData, unsigned long err,
pointer pReadmask)
{
int e;
/*ErrorF("rdpWakeupHandler %d\n", err);*/
e = (int)err;
if (e < 0)
{
g_pScreen->WakeupHandler = g_rdpScreen.WakeupHandler;
g_pScreen->WakeupHandler(i, blockData, err, pReadmask);
g_pScreen->WakeupHandler = rdpWakeupHandler;
return;
}
rdpup_check();
g_pScreen->WakeupHandler = g_rdpScreen.WakeupHandler;
g_pScreen->WakeupHandler(i, blockData, err, pReadmask);
g_pScreen->WakeupHandler = rdpWakeupHandler;
}
/******************************************************************************/
/* returns boolean, true if everything is ok */
static Bool
rdpScreenInit(int index, ScreenPtr pScreen, int argc, char** argv)
{
int dpix;
int dpiy;
int ret;
VisualPtr vis;
PictureScreenPtr ps;
g_pScreen = pScreen;
/*ErrorF("hi rdpScreenInit\n");*/
/*dpix = 75;
dpiy = 75;*/
dpix = 100;
dpiy = 100;
if (monitorResolution != 0)
{
dpix = monitorResolution;
dpiy = monitorResolution;
}
g_rdpScreen.paddedWidthInBytes = PixmapBytePad(g_rdpScreen.width,
g_rdpScreen.depth);
g_rdpScreen.bitsPerPixel = rdpBitsPerPixel(g_rdpScreen.depth);
ErrorF("screen width %d height %d depth %d bpp %d\n", g_rdpScreen.width,
g_rdpScreen.height, g_rdpScreen.depth, g_rdpScreen.bitsPerPixel);
ErrorF("dpix %d dpiy %d\n", dpix, dpiy);
if (g_rdpScreen.pfbMemory == 0)
{
g_rdpScreen.sizeInBytes =
(g_rdpScreen.paddedWidthInBytes * g_rdpScreen.height);
ErrorF("buffer size %d\n", g_rdpScreen.sizeInBytes);
g_rdpScreen.pfbMemory = (char*)Xalloc(g_rdpScreen.sizeInBytes);
memset(g_rdpScreen.pfbMemory, 0, g_rdpScreen.sizeInBytes);
}
if (g_rdpScreen.pfbMemory == 0)
{
return 0;
}
miClearVisualTypes();
if (defaultColorVisualClass == -1)
{
defaultColorVisualClass = TrueColor;
}
if (!miSetVisualTypes(g_rdpScreen.depth,
miGetDefaultVisualMask(g_rdpScreen.depth),
8, defaultColorVisualClass))
{
return 0;
}
miSetPixmapDepths();
switch (g_rdpScreen.bitsPerPixel)
{
case 8:
ret = fbScreenInit(pScreen, g_rdpScreen.pfbMemory,
g_rdpScreen.width, g_rdpScreen.height,
dpix, dpiy, g_rdpScreen.paddedWidthInBytes);
break;
case 16:
ret = fbScreenInit(pScreen, g_rdpScreen.pfbMemory,
g_rdpScreen.width, g_rdpScreen.height,
dpix, dpiy, g_rdpScreen.paddedWidthInBytes / 2);
break;
case 32:
ret = fbScreenInit(pScreen, g_rdpScreen.pfbMemory,
g_rdpScreen.width, g_rdpScreen.height,
dpix, dpiy, g_rdpScreen.paddedWidthInBytes / 4);
break;
default:
return 0;
}
if (!ret)
{
return 0;
}
miInitializeBackingStore(pScreen);
/* this is for rgb, not bgr, just doing rgb for now */
vis = g_pScreen->visuals + g_pScreen->numVisuals;
while (--vis >= pScreen->visuals)
{
if ((vis->class | DynamicClass) == DirectColor)
{
vis->offsetBlue = 0;
vis->blueMask = (1 << g_blueBits) - 1;
vis->offsetGreen = g_blueBits;
vis->greenMask = ((1 << g_greenBits) - 1) << vis->offsetGreen;
vis->offsetRed = g_blueBits + g_greenBits;
vis->redMask = ((1 << g_redBits) - 1) << vis->offsetRed;
}
}
if (g_rdpScreen.bitsPerPixel > 4)
{
fbPictureInit(pScreen, 0, 0);
}
if (!AllocateGCPrivate(pScreen, g_rdpGCIndex, sizeof(rdpGCRec)))
{
FatalError("rdpScreenInit: AllocateGCPrivate failed\n");
}
/* Random screen procedures */
g_rdpScreen.CloseScreen = pScreen->CloseScreen;
/* GC procedures */
g_rdpScreen.CreateGC = pScreen->CreateGC;
/* Window Procedures */
g_rdpScreen.PaintWindowBackground = pScreen->PaintWindowBackground;
g_rdpScreen.PaintWindowBorder = pScreen->PaintWindowBorder;
g_rdpScreen.CopyWindow = pScreen->CopyWindow;
g_rdpScreen.ClearToBackground = pScreen->ClearToBackground;
/* Backing store procedures */
g_rdpScreen.RestoreAreas = pScreen->RestoreAreas;
g_rdpScreen.WakeupHandler = pScreen->WakeupHandler;
ps = GetPictureScreenIfSet(pScreen);
if (ps)
{
g_rdpScreen.Composite = ps->Composite;
}
/* testing something here */
/*rdpScreen.InstallColormap = pScreen->InstallColormap;*/
pScreen->blackPixel = g_rdpScreen.blackPixel;
pScreen->whitePixel = g_rdpScreen.whitePixel;
/* Random screen procedures */
pScreen->CloseScreen = rdpCloseScreen;
pScreen->WakeupHandler = rdpWakeupHandler;
if (ps)
{
ps->Composite = rdpComposite;
}
pScreen->SaveScreen = rdpSaveScreen;
/* GC procedures */
pScreen->CreateGC = rdpCreateGC;
/* Window Procedures */
pScreen->PaintWindowBackground = rdpPaintWindowBackground;
pScreen->PaintWindowBorder = rdpPaintWindowBorder;
pScreen->CopyWindow = rdpCopyWindow;
pScreen->ClearToBackground = rdpClearToBackground;
/* Backing store procedures */
pScreen->RestoreAreas = rdpRestoreAreas;
/* Colormap procedures */
/*pScreen->InstallColormap = rdpInstallColormap;*/
/*pScreen->UninstallColormap = rdpUninstallColormap;*/
/*pScreen->ListInstalledColormaps = rdpListInstalledColormaps;*/
/*pScreen->StoreColors = rdpStoreColors;*/
miPointerInitialize(pScreen, &rdpSpritePointerFuncs,
&rdpPointerCursorFuncs, 1);
vis = pScreen->visuals;
while (vis->vid != pScreen->rootVisual)
{
vis++;
}
if (vis == 0)
{
rdpLog("rdpScreenInit: couldn't find root visual\n");
exit(1);
}
/*vis->offsetBlue = 0;*/
/*vis->blueMask = (1 << blueBits) - 1;*/
/*vis->offsetGreen = blueBits;*/
/*vis->greenMask = ((1 << greenBits) - 1) << vis->offsetGreen;*/
/*vis->offsetRed = vis->offsetGreen + greenBits;*/
/*vis->redMask = ((1 << redBits) - 1) << vis->offsetRed;*/
if (g_rdpScreen.bitsPerPixel == 1)
{
ret = mfbCreateDefColormap(pScreen);
}
else
{
ret = fbCreateDefColormap(pScreen);
}
if (ret)
{
ret = rdpup_init();
}
return ret;
}
/******************************************************************************/
/* this is the first function called, it can be called many times
returns the number or parameters processed
if it dosen't apply to the rdp part, return 0 */
int
ddxProcessArgument(int argc, char** argv, int i)
{
/*ErrorF("hi ddxProcessArgument %s\n", argv[i]);*/
if (g_firstTime)
{
memset(&g_rdpScreen, 0, sizeof(g_rdpScreen));
g_rdpScreen.width = 800;
g_rdpScreen.height = 600;
g_rdpScreen.depth = 8;
set_bpp(8);
/*rdpScreen.whitePixel = 0xffff;*/
g_rdpScreen.blackPixel = 1;
/*rdpScreen.blackPixel = 0xffff;*/
g_firstTime = 0;
}
if (strcmp (argv[i], "-geometry") == 0)
{
if (i + 1 >= argc)
{
UseMsg();
}
if (sscanf(argv[i + 1], "%dx%d", &g_rdpScreen.width,
&g_rdpScreen.height) != 2)
{
ErrorF("Invalid geometry %s\n", argv[i + 1]);
UseMsg();
}
return 2;
}
if (strcmp (argv[i], "-depth") == 0)
{
if (i + 1 >= argc)
{
UseMsg();
}
g_rdpScreen.depth = atoi(argv[i + 1]);
if (set_bpp(g_rdpScreen.depth) != 0)
{
UseMsg();
}
return 2;
}
return 0;
}
/******************************************************************************/
void
OsVendorInit(void)
{
/*ErrorF("hi OsVendorInit\n");*/
}
/******************************************************************************/
CARD32
GetTimeInMillis(void)
{
struct timeval tp;
/*ErrorF("hi GetTimeInMillis\n");*/
X_GETTIMEOFDAY(&tp);
return (tp.tv_sec * 1000) + (tp.tv_usec / 1000);
}
/* Common pixmap formats */
static PixmapFormatRec formats[MAXFORMATS] =
{
{ 1, 1, BITMAP_SCANLINE_PAD },
{ 4, 8, BITMAP_SCANLINE_PAD },
{ 8, 8, BITMAP_SCANLINE_PAD },
{ 15, 16, BITMAP_SCANLINE_PAD },
{ 16, 16, BITMAP_SCANLINE_PAD },
{ 24, 32, BITMAP_SCANLINE_PAD },
{ 32, 32, BITMAP_SCANLINE_PAD },
};
static int numFormats = 7;
/******************************************************************************/
/* InitOutput is called every time the server resets. It should call
AddScreen for each screen (but we only ever have one), and in turn this
will call rdpScreenInit. */
void
InitOutput(ScreenInfo* screenInfo, int argc, char** argv)
{
int i;
/*ErrorF("hi InitOutput\n");*/
g_initOutputCalled = 1;
/* initialize pixmap formats */
screenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
screenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
screenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
screenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
screenInfo->numPixmapFormats = numFormats;
for (i = 0; i < numFormats; i++)
{
screenInfo->formats[i] = formats[i];
}
g_rdpGCIndex = AllocateGCPrivateIndex();
if (g_rdpGCIndex < 0)
{
FatalError("InitOutput: AllocateGCPrivateIndex failed\n");
}
if (!AddCallback(&ClientStateCallback, rdpClientStateChange, NULL))
{
rdpLog("InitOutput: AddCallback failed\n");
return;
}
/* initialize screen */
if (AddScreen(rdpScreenInit, argc, argv) == -1)
{
FatalError("Couldn't add screen\n");
}
}
/******************************************************************************/
void
InitInput(int argc, char** argv)
{
DeviceIntPtr p;
DeviceIntPtr k;
/*ErrorF("hi InitInput\n");*/
k = AddInputDevice(rdpKeybdProc, 1);
p = AddInputDevice(rdpMouseProc, 1);
RegisterKeyboardDevice(k);
RegisterPointerDevice(p);
miRegisterPointerDevice(screenInfo.screens[0], p);
mieqInit(k, p);
/*
mieqCheckForInput[0] = checkForInput[0];
mieqCheckForInput[1] = checkForInput[1];
SetInputCheck(&alwaysCheckForInput[0], &alwaysCheckForInput[1]);
*/
}
/******************************************************************************/
void
ddxGiveUp(void)
{
char unixSocketName[32];
/*ErrorF("hi ddxGiveUp\n");*/
Xfree(g_rdpScreen.pfbMemory);
if (g_initOutputCalled)
{
sprintf(unixSocketName, "/tmp/.X11-unix/X%s", display);
unlink(unixSocketName);
}
}
/******************************************************************************/
Bool
LegalModifier(unsigned int key, DevicePtr pDev)
{
/*ErrorF("hi LegalModifier\n");*/
return 1; /* true */
}
/******************************************************************************/
void
ProcessInputEvents(void)
{
/*ErrorF("hi ProcessInputEvents\n");*/
/*rdpup_check();*/
/*if (*mieqCheckForInput[0] != *mieqCheckForInput[1])*/
{
/*ErrorF("hi ProcessInputEvents2 \n");*/
mieqProcessInputEvents();
miPointerUpdate();
}
}
/******************************************************************************/
/* needed for some reason? todo
needs to be rfb */
void
rfbRootPropertyChange(PropertyPtr pProp)
{
/*ErrorF("hi rdpRootPropertyChange\n");*/
}
/******************************************************************************/
void
AbortDDX(void)
{
/*ErrorF("hi AbortDDX\n");*/
ddxGiveUp();
}
/******************************************************************************/
void
OsVendorFatalError(void)
{
/*ErrorF("hi OsVendorFatalError\n");*/
}
/******************************************************************************/
/* print the command list parameters and exit the program */
void
ddxUseMsg(void)
{
ErrorF("\n");
ErrorF("Xrdp specific options\n");
ErrorF("-geometry WxH set framebuffer width & height\n");
ErrorF("-depth D set framebuffer depth\n");
ErrorF("\n");
exit(1);
}

@ -0,0 +1,377 @@
/*
Copyright 2005-2006 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
the rest
*/
#include "rdp.h"
/******************************************************************************/
/* print a time-stamped message to the log file (stderr). */
void
rdpLog(char *format, ...)
{
va_list args;
char buf[256];
time_t clock;
va_start(args, format);
time(&clock);
strftime(buf, 255, "%d/%m/%y %T ", localtime(&clock));
fprintf(stderr, buf);
vfprintf(stderr, format, args);
fflush(stderr);
va_end(args);
}
/******************************************************************************/
int
rdpBitsPerPixel(int depth)
{
if (depth == 1)
{
return 1;
}
else if (depth <= 8)
{
return 8;
}
else if (depth <= 16)
{
return 16;
}
else
{
return 32;
}
}
/******************************************************************************/
void
rdpClientStateChange(CallbackListPtr* cbl, pointer myData, pointer clt)
{
dispatchException &= ~DE_RESET; /* hack - force server not to reset */
}
/******************************************************************************/
int
DPMSSupported(void)
{
return 0;
}
/******************************************************************************/
int
DPSMGet(int* level)
{
return -1;
}
/******************************************************************************/
void
DPMSSet(int level)
{
}
/******************************************************************************/
void
AddOtherInputDevices(void)
{
}
/******************************************************************************/
void
OpenInputDevice(DeviceIntPtr dev, ClientPtr client, int* status)
{
}
/******************************************************************************/
int
SetDeviceValuators(register ClientPtr client, DeviceIntPtr dev,
int* valuators, int first_valuator, int num_valuators)
{
return BadMatch;
}
/******************************************************************************/
int
SetDeviceMode(register ClientPtr client, DeviceIntPtr dev, int mode)
{
return BadMatch;
}
/******************************************************************************/
int
ChangeKeyboardDevice(DeviceIntPtr old_dev, DeviceIntPtr new_dev)
{
return BadMatch;
}
/******************************************************************************/
int
ChangeDeviceControl(register ClientPtr client, DeviceIntPtr dev,
void* control)
{
return BadMatch;
}
/******************************************************************************/
int
ChangePointerDevice(DeviceIntPtr old_dev, DeviceIntPtr new_dev,
unsigned char x, unsigned char y)
{
return BadMatch;
}
/******************************************************************************/
void
CloseInputDevice(DeviceIntPtr d, ClientPtr client)
{
}
/* the g_ functions from os_calls.c */
/*****************************************************************************/
int
g_tcp_recv(int sck, void* ptr, int len, int flags)
{
#if defined(_WIN32)
return recv(sck, (char*)ptr, len, flags);
#else
return recv(sck, ptr, len, flags);
#endif
}
/*****************************************************************************/
void
g_tcp_close(int sck)
{
if (sck == 0)
{
return;
}
shutdown(sck, 2);
#if defined(_WIN32)
closesocket(sck);
#else
close(sck);
#endif
}
/*****************************************************************************/
int
g_tcp_last_error_would_block(int sck)
{
#if defined(_WIN32)
return WSAGetLastError() == WSAEWOULDBLOCK;
#else
return errno == EWOULDBLOCK;
#endif
}
/*****************************************************************************/
void
g_sleep(int msecs)
{
#if defined(_WIN32)
Sleep(msecs);
#else
usleep(msecs * 1000);
#endif
}
/*****************************************************************************/
int
g_tcp_send(int sck, void* ptr, int len, int flags)
{
#if defined(_WIN32)
return send(sck, (char*)ptr, len, flags);
#else
return send(sck, ptr, len, flags);
#endif
}
/*****************************************************************************/
void*
g_malloc(int size, int zero)
{
char* rv;
rv = (char*)malloc(size);
if (zero)
{
memset(rv, 0, size);
}
return rv;
}
/*****************************************************************************/
void
g_free(void* ptr)
{
if (ptr != 0)
{
free(ptr);
}
}
/*****************************************************************************/
void
g_sprintf(char* dest, char* format, ...)
{
va_list ap;
va_start(ap, format);
vsprintf(dest, format, ap);
va_end(ap);
}
/*****************************************************************************/
int
g_tcp_socket(void)
{
int rv;
int i;
i = 1;
rv = socket(PF_INET, SOCK_STREAM, 0);
#if defined(_WIN32)
setsockopt(rv, IPPROTO_TCP, TCP_NODELAY, (char*)&i, sizeof(i));
#else
setsockopt(rv, IPPROTO_TCP, TCP_NODELAY, (void*)&i, sizeof(i));
#endif
return rv;
}
/*****************************************************************************/
void
g_memcpy(void* d_ptr, const void* s_ptr, int size)
{
memcpy(d_ptr, s_ptr, size);
}
/*****************************************************************************/
int
g_tcp_set_no_delay(int sck)
{
int i;
i = 1;
#if defined(_WIN32)
setsockopt(sck, IPPROTO_TCP, TCP_NODELAY, (char*)&i, sizeof(i));
#else
setsockopt(sck, IPPROTO_TCP, TCP_NODELAY, (void*)&i, sizeof(i));
#endif
return 0;
}
/*****************************************************************************/
int
g_tcp_set_non_blocking(int sck)
{
unsigned long i;
#if defined(_WIN32)
i = 1;
ioctlsocket(sck, FIONBIO, &i);
#else
i = fcntl(sck, F_GETFL);
i = i | O_NONBLOCK;
fcntl(sck, F_SETFL, i);
#endif
return 0;
}
/*****************************************************************************/
int
g_tcp_accept(int sck)
{
struct sockaddr_in s;
#if defined(_WIN32)
signed int i;
#else
unsigned int i;
#endif
i = sizeof(struct sockaddr_in);
memset(&s, 0, i);
return accept(sck, (struct sockaddr*)&s, &i);
}
/*****************************************************************************/
int
g_tcp_select(int sck1, int sck2)
{
fd_set rfds;
struct timeval time;
int max;
int rv;
time.tv_sec = 0;
time.tv_usec = 0;
FD_ZERO(&rfds);
if (sck1 > 0)
{
FD_SET(((unsigned int)sck1), &rfds);
}
if (sck2 > 0)
{
FD_SET(((unsigned int)sck2), &rfds);
}
max = sck1;
if (sck2 > max)
{
max = sck2;
}
rv = select(max + 1, &rfds, 0, 0, &time);
if (rv > 0)
{
rv = 0;
if (FD_ISSET(((unsigned int)sck1), &rfds))
{
rv = rv | 1;
}
if (FD_ISSET(((unsigned int)sck2), &rfds))
{
rv = rv | 2;
}
}
return rv;
}
/*****************************************************************************/
int
g_tcp_bind(int sck, char* port)
{
struct sockaddr_in s;
memset(&s, 0, sizeof(struct sockaddr_in));
s.sin_family = AF_INET;
s.sin_port = htons(atoi(port));
s.sin_addr.s_addr = INADDR_ANY;
return bind(sck, (struct sockaddr*)&s, sizeof(struct sockaddr_in));
}
/*****************************************************************************/
int
g_tcp_listen(int sck)
{
return listen(sck, 2);
}

@ -0,0 +1,806 @@
/*
Copyright 2005-2006 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "rdp.h"
/*#include "arch.h"*/
/*#include "parse.h"*/
/*#include "os_calls.h"*/
#define DEBUG_OUT_UP(arg)
/*#define DEBUG_OUT_UP(arg) ErrorF arg*/
static int g_listen_sck = 0;
static int g_sck = 0;
static int g_sck_closed = 0;
static int g_connected = 0;
static int g_begin = 0;
static struct stream* g_out_s = 0;
static struct stream* g_in_s = 0;
static int g_button_mask = 0;
static int g_cursor_x = 0;
static int g_cursor_y = 0;
static OsTimerPtr g_timer = 0;
static int g_scheduled = 0;
static int g_count = 0;
extern ScreenPtr g_pScreen; /* from rdpmain.c */
extern int g_Bpp; /* from rdpmain.c */
extern int g_Bpp_mask; /* from rdpmain.c */
extern rdpScreenInfo g_rdpScreen; /* from rdpmain.c */
extern char* display;
static void
rdpScheduleDeferredUpdate(void);
/*
0 GXclear, 0
1 GXnor, DPon
2 GXandInverted, DPna
3 GXcopyInverted, Pn
4 GXandReverse, PDna
5 GXinvert, Dn
6 GXxor, DPx
7 GXnand, DPan
8 GXand, DPa
9 GXequiv, DPxn
a GXnoop, D
b GXorInverted, DPno
c GXcopy, P
d GXorReverse, PDno
e GXor, DPo
f GXset 1
*/
static int rdp_opcodes[16] =
{
0x00, /* GXclear 0x0 0 */
0x88, /* GXand 0x1 src AND dst */
0x44, /* GXandReverse 0x2 src AND NOT dst */
0xcc, /* GXcopy 0x3 src */
0x22, /* GXandInverted 0x4 NOT src AND dst */
0xaa, /* GXnoop 0x5 dst */
0x66, /* GXxor 0x6 src XOR dst */
0xee, /* GXor 0x7 src OR dst */
0x11, /* GXnor 0x8 NOT src AND NOT dst */
0x99, /* GXequiv 0x9 NOT src XOR dst */
0x55, /* GXinvert 0xa NOT dst */
0xdd, /* GXorReverse 0xb src OR NOT dst */
0x33, /* GXcopyInverted 0xc NOT src */
0xbb, /* GXorInverted 0xd NOT src OR dst */
0x77, /* GXnand 0xe NOT src OR NOT dst */
0xff /* GXset 0xf 1 */
};
/******************************************************************************/
/* returns error */
static int
rdpup_recv(char* data, int len)
{
int rcvd;
if (g_sck_closed)
{
return 1;
}
while (len > 0)
{
rcvd = g_tcp_recv(g_sck, data, len, 0);
if (rcvd == -1)
{
if (g_tcp_last_error_would_block(g_sck))
{
g_sleep(1);
}
else
{
RemoveEnabledDevice(g_sck);
g_connected = 0;
g_tcp_close(g_sck);
g_sck = 0;
g_sck_closed = 1;
return 1;
}
}
else if (rcvd == 0)
{
RemoveEnabledDevice(g_sck);
g_connected = 0;
g_tcp_close(g_sck);
g_sck = 0;
g_sck_closed = 1;
return 1;
}
else
{
data += rcvd;
len -= rcvd;
}
}
return 0;
}
/*****************************************************************************/
/* returns error */
static int
rdpup_send(char* data, int len)
{
int sent;
DEBUG_OUT_UP(("rdpup_send - sending %d bytes\n", len));
if (g_sck_closed)
{
return 1;
}
while (len > 0)
{
sent = g_tcp_send(g_sck, data, len, 0);
if (sent == -1)
{
if (g_tcp_last_error_would_block(g_sck))
{
g_sleep(1);
}
else
{
RemoveEnabledDevice(g_sck);
g_connected = 0;
g_tcp_close(g_sck);
g_sck = 0;
g_sck_closed = 1;
return 1;
}
}
else if (sent == 0)
{
RemoveEnabledDevice(g_sck);
g_connected = 0;
g_tcp_close(g_sck);
g_sck = 0;
g_sck_closed = 1;
return 1;
}
else
{
data += sent;
len -= sent;
}
}
return 0;
}
/******************************************************************************/
static int
rdpup_send_msg(struct stream* s)
{
int len;
int rv;
rv = 1;
if (s != 0)
{
len = s->end - s->data;
if (len > s->size)
{
ErrorF("overrun error len %d count %d\n", len, g_count);
}
s_pop_layer(s, iso_hdr);
out_uint16_le(s, 1);
out_uint16_le(s, g_count);
out_uint32_le(s, len - 8);
rv = rdpup_send(s->data, len);
}
if (rv != 0)
{
ErrorF("error in rdpup_send_msg\n");
}
return rv;
}
/******************************************************************************/
static int
rdpup_recv_msg(struct stream* s)
{
int len;
int rv;
rv = 1;
if (s != 0)
{
init_stream(s, 4);
rv = rdpup_recv(s->data, 4);
if (rv == 0)
{
in_uint32_le(s, len);
if (len > 3)
{
init_stream(s, len);
rv = rdpup_recv(s->data, len - 4);
}
}
}
if (rv != 0)
{
ErrorF("error in rdpup_recv_msg\n");
}
return rv;
}
/******************************************************************************/
static int
rdpup_process_msg(struct stream* s)
{
int msg_type;
int msg;
int param1;
int param2;
int param3;
int param4;
in_uint16_le(s, msg_type);
if (msg_type == 103)
{
in_uint32_le(s, msg);
in_uint32_le(s, param1);
in_uint32_le(s, param2);
in_uint32_le(s, param3);
in_uint32_le(s, param4);
DEBUG_OUT_UP(("rdpup_process_msg - msg %d param1 %d param2 %d param3 %d \
param4 %d\n", msg, param1, param2, param3, param4));
switch (msg)
{
case 15: /* key down */
case 16: /* key up */
KbdAddEvent(msg == 15, param1, param2, param3, param4);
break;
case 100:
g_cursor_x = param1;
g_cursor_y = param2;
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 101:
g_button_mask = g_button_mask & (~1);
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 102:
g_button_mask = g_button_mask | 1;
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 103:
g_button_mask = g_button_mask & (~4);
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 104:
g_button_mask = g_button_mask | 4;
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 105:
g_button_mask = g_button_mask & (~2);
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 106:
g_button_mask = g_button_mask | 2;
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 107:
g_button_mask = g_button_mask & (~8);
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 108:
g_button_mask = g_button_mask | 8;
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 109:
g_button_mask = g_button_mask & (~16);
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 110:
g_button_mask = g_button_mask | 16;
PtrAddEvent(g_button_mask, g_cursor_x, g_cursor_y);
break;
case 200:
rdpup_begin_update();
rdpup_send_area(param1, param2, param3, param4);
rdpup_end_update();
break;
}
}
else
{
ErrorF("unknown message type in rdpup_process_msg\n");
}
return 0;
}
/******************************************************************************/
int
rdpup_init(void)
{
char text[256];
int i;
i = atoi(display);
if (i < 1)
{
return 0;
}
g_sprintf(text, "62%2.2d", i);
if (g_in_s == 0)
{
make_stream(g_in_s);
init_stream(g_in_s, 8192);
}
if (g_out_s == 0)
{
make_stream(g_out_s);
init_stream(g_out_s, 8192 * g_Bpp + 100);
}
if (g_listen_sck == 0)
{
g_listen_sck = g_tcp_socket();
if (g_tcp_bind(g_listen_sck, text) != 0)
{
return 0;
}
g_tcp_listen(g_listen_sck);
AddEnabledDevice(g_listen_sck);
}
return 1;
}
/******************************************************************************/
int
rdpup_check(void)
{
int sel;
sel = g_tcp_select(g_listen_sck, g_sck);
if (sel & 1)
{
if (g_sck == 0)
{
g_sck = g_tcp_accept(g_listen_sck);
if (g_sck == -1)
{
g_sck = 0;
}
else
{
g_tcp_set_non_blocking(g_sck);
g_tcp_set_no_delay(g_sck);
g_connected = 1;
g_sck_closed = 0;
AddEnabledDevice(g_sck);
}
}
else
{
ErrorF("rejecting connection - maybe\n");
/* g_tcp_close(g_tcp_accept(g_listen_sck));*/
}
}
if (sel & 2)
{
if (rdpup_recv_msg(g_in_s) == 0)
{
rdpup_process_msg(g_in_s);
}
}
return 0;
}
/******************************************************************************/
int
rdpup_begin_update(void)
{
if (g_connected)
{
if (g_begin)
{
return 0;
}
init_stream(g_out_s, 0);
s_push_layer(g_out_s, iso_hdr, 8);
out_uint16_le(g_out_s, 1);
DEBUG_OUT_UP(("begin %d\n", g_count));
g_begin = 1;
g_count = 1;
}
return 0;
}
/******************************************************************************/
int
rdpup_end_update(void)
{
if (g_connected && g_begin)
{
rdpScheduleDeferredUpdate();
}
return 0;
}
/******************************************************************************/
int
rdpup_pre_check(int in_size)
{
if (!g_begin)
{
rdpup_begin_update();
}
if ((g_out_s->p - g_out_s->data) > (g_out_s->size - (in_size + 20)))
{
/*ErrorF("%d %d\n", in_size, g_out_s->size);*/
s_mark_end(g_out_s);
rdpup_send_msg(g_out_s);
g_count = 0;
init_stream(g_out_s, 0);
s_push_layer(g_out_s, iso_hdr, 8);
}
return 0;
}
/******************************************************************************/
int
rdpup_fill_rect(short x, short y, int cx, int cy)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_fill_rect\n"));
rdpup_pre_check(10);
out_uint16_le(g_out_s, 3);
g_count++;
out_uint16_le(g_out_s, x);
out_uint16_le(g_out_s, y);
out_uint16_le(g_out_s, cx);
out_uint16_le(g_out_s, cy);
}
return 0;
}
/******************************************************************************/
int
rdpup_screen_blt(short x, short y, int cx, int cy, short srcx, short srcy)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_screen_blt\n"));
rdpup_pre_check(14);
out_uint16_le(g_out_s, 4);
g_count++;
out_uint16_le(g_out_s, x);
out_uint16_le(g_out_s, y);
out_uint16_le(g_out_s, cx);
out_uint16_le(g_out_s, cy);
out_uint16_le(g_out_s, srcx);
out_uint16_le(g_out_s, srcy);
}
return 0;
}
/******************************************************************************/
int
rdpup_set_clip(short x, short y, int cx, int cy)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_set_clip\n"));
rdpup_pre_check(10);
out_uint16_le(g_out_s, 10);
g_count++;
out_uint16_le(g_out_s, x);
out_uint16_le(g_out_s, y);
out_uint16_le(g_out_s, cx);
out_uint16_le(g_out_s, cy);
}
return 0;
}
/******************************************************************************/
int
rdpup_reset_clip(void)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_reset_clip\n"));
rdpup_pre_check(2);
out_uint16_le(g_out_s, 11);
g_count++;
}
return 0;
}
/******************************************************************************/
int
rdpup_set_fgcolor(int fgcolor)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_set_fgcolor\n"));
rdpup_pre_check(6);
out_uint16_le(g_out_s, 12);
g_count++;
fgcolor = fgcolor & g_Bpp_mask;
out_uint32_le(g_out_s, fgcolor);
}
return 0;
}
/******************************************************************************/
int
rdpup_set_bgcolor(int bgcolor)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_set_bgcolor\n"));
rdpup_pre_check(6);
out_uint16_le(g_out_s, 13);
g_count++;
bgcolor = bgcolor & g_Bpp_mask;
out_uint32_le(g_out_s, bgcolor);
}
return 0;
}
/******************************************************************************/
int
rdpup_set_opcode(int opcode)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_set_opcode\n"));
rdpup_pre_check(4);
out_uint16_le(g_out_s, 14);
g_count++;
out_uint16_le(g_out_s, rdp_opcodes[opcode & 0xf]);
}
return 0;
}
/******************************************************************************/
int
rdpup_set_pen(int style, int width)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_set_pen\n"));
rdpup_pre_check(6);
out_uint16_le(g_out_s, 17);
g_count++;
out_uint16_le(g_out_s, style);
out_uint16_le(g_out_s, width);
}
return 0;
}
/******************************************************************************/
int
rdpup_draw_line(short x1, short y1, short x2, short y2)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_draw_line\n"));
rdpup_pre_check(10);
out_uint16_le(g_out_s, 18);
g_count++;
out_uint16_le(g_out_s, x1);
out_uint16_le(g_out_s, y1);
out_uint16_le(g_out_s, x2);
out_uint16_le(g_out_s, y2);
}
return 0;
}
/******************************************************************************/
int
rdpup_set_cursor(short x, short y, char* cur_data, char* cur_mask)
{
if (g_connected)
{
DEBUG_OUT_UP((" rdpup_set_cursor\n"));
rdpup_pre_check(6 + 32 * (32 * 3) + 32 * (32 / 8));
out_uint16_le(g_out_s, 19);
g_count++;
out_uint16_le(g_out_s, x);
out_uint16_le(g_out_s, y);
out_uint8a(g_out_s, cur_data, 32 * (32 * 3));
out_uint8a(g_out_s, cur_mask, 32 * (32 / 8));
}
return 0;
}
/******************************************************************************/
static int
get_single_color(int x, int y, int w, int h)
{
int rv;
int i;
int j;
int p;
unsigned char* i8;
unsigned short* i16;
rv = -1;
if (g_Bpp == 1)
{
for (i = 0; i < h; i++)
{
i8 = (unsigned char*)(g_rdpScreen.pfbMemory +
((y + i) * g_rdpScreen.paddedWidthInBytes) + (x * g_Bpp));
if (i == 0)
{
p = *i8;
}
for (j = 0; j < w; j++)
{
if (i8[j] != p)
{
return -1;
}
}
}
rv = p;
}
else if (g_Bpp == 2)
{
for (i = 0; i < h; i++)
{
i16 = (unsigned short*)(g_rdpScreen.pfbMemory +
((y + i) * g_rdpScreen.paddedWidthInBytes) + (x * g_Bpp));
if (i == 0)
{
p = *i16;
}
for (j = 0; j < w; j++)
{
if (i16[j] != p)
{
return -1;
}
}
}
rv = p;
}
return rv;
}
/******************************************************************************/
/* split the bitmap up into 64 x 64 pixel areas */
void
rdpup_send_area(int x, int y, int w, int h)
{
char* s;
int i;
int single_color;
int lx;
int ly;
int lh;
int lw;
if (x >= g_rdpScreen.width)
{
return;
}
if (y >= g_rdpScreen.height)
{
return;
}
if (x < 0)
{
w += x;
x = 0;
}
if (y < 0)
{
h += y;
y = 0;
}
if (w <= 0)
{
return;
}
if (h <= 0)
{
return;
}
if (x + w > g_rdpScreen.width)
{
w = g_rdpScreen.width - x;
}
if (y + h > g_rdpScreen.height)
{
h = g_rdpScreen.height - y;
}
/*ErrorF("%d\n", w * h);*/
if (g_connected && g_begin)
{
DEBUG_OUT_UP((" rdpup_send_area\n"));
ly = y;
while (ly < y + h)
{
lx = x;
while (lx < x + w)
{
lw = MIN(64, (x + w) - lx);
lh = MIN(64, (y + h) - ly);
single_color = get_single_color(lx, ly, lw, lh);
if (single_color != -1)
{
/*ErrorF("%d sending single color\n", g_count);*/
rdpup_set_fgcolor(single_color);
rdpup_fill_rect(lx, ly, lw, lh);
}
else
{
rdpup_pre_check(lw * lh * g_Bpp + 42);
out_uint16_le(g_out_s, 5);
g_count++;
out_uint16_le(g_out_s, lx);
out_uint16_le(g_out_s, ly);
out_uint16_le(g_out_s, lw);
out_uint16_le(g_out_s, lh);
out_uint32_le(g_out_s, lw * lh * g_Bpp);
for (i = 0; i < lh; i++)
{
s = (g_rdpScreen.pfbMemory +
((ly + i) * g_rdpScreen.paddedWidthInBytes) + (lx * g_Bpp));
out_uint8a(g_out_s, s, lw * g_Bpp);
}
out_uint16_le(g_out_s, lw);
out_uint16_le(g_out_s, lh);
out_uint16_le(g_out_s, 0);
out_uint16_le(g_out_s, 0);
}
lx += 64;
}
ly += 64;
}
}
}
/******************************************************************************/
static CARD32
rdpDeferredUpdateCallback(OsTimerPtr timer, CARD32 now, pointer arg)
{
if (g_connected && g_begin)
{
DEBUG_OUT_UP(("end %d\n", g_count));
out_uint16_le(g_out_s, 2);
g_count++;
s_mark_end(g_out_s);
rdpup_send_msg(g_out_s);
}
g_count = 0;
g_begin = 0;
g_scheduled = 0;
return 0;
}
/******************************************************************************/
static void
rdpScheduleDeferredUpdate(void)
{
if (!g_scheduled)
{
g_scheduled = 1;
g_timer = TimerSet(g_timer, 0, 40, rdpDeferredUpdateCallback, 0);
}
}
Loading…
Cancel
Save