|
From: <pe...@ce...> - 2003-01-02 15:03:00
|
> This is all nice, but my problem now is that our customers aren't
> accepting either flickering cursors or the extra dot. We are currently
> forced to patch vncviewer to the 1.2.4-style.=20
>=20
> Would it be possible to add options for configuring this? I can probabl=
y=20
> help with writing the code needed.=20
The patch above adds a new option, -x11cursor, which:
* Uses a real X11 cursor for encoding rfbEncodingXCursor
* Disables the dotcursor=20
* Disables cursor position updates in non-fullscreen mode
Maybe we could activate the X11 cursor automatically when running=20
fullscreen. That would suffice for us.=20
Comments?
Index: argsresources.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/vnc-tight/vnc_unixsrc/vncviewer/argsresources.c,v
retrieving revision 1.34
diff -u -r1.34 argsresources.c
--- argsresources.c 13 Nov 2002 18:03:50 -0000 1.34
+++ argsresources.c 2 Jan 2003 14:53:43 -0000
@@ -210,6 +210,9 @@
{"useRemoteCursor", "UseRemoteCursor", XtRBool, sizeof(Bool),
XtOffsetOf(AppData, useRemoteCursor), XtRImmediate, (XtPointer) True}=
,
=20
+ {"useX11Cursor", "UseX11Cursor", XtRBool, sizeof(Bool),
+ XtOffsetOf(AppData, useX11Cursor), XtRImmediate, (XtPointer) False},
+
{"grabKeyboard", "GrabKeyboard", XtRBool, sizeof(Bool),
XtOffsetOf(AppData, grabKeyboard), XtRImmediate, (XtPointer) False},
};
@@ -237,6 +240,8 @@
{"-quality", "*qualityLevel", XrmoptionSepArg, 0},
{"-nojpeg", "*enableJPEG", XrmoptionNoArg, "False"},
{"-nocursorshape", "*useRemoteCursor", XrmoptionNoArg, "False"},
+ {"-x11cursor", "*useX11Cursor", XrmoptionNoArg, "True"},
+
};
=20
int numCmdLineOptions =3D XtNumber(cmdLineOptions);
@@ -308,6 +313,7 @@
" -quality <JPEG-QUALITY-VALUE> (0..9: 0-low, 9-high)\n"
" -nojpeg\n"
" -nocursorshape\n"
+ " -x11cursor\n"
"\n"
"Option names may be abbreviated, e.g. -bgr instead of -bgr233.\n"
"See the manual page for more information."
Index: cursor.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/vnc-tight/vnc_unixsrc/vncviewer/cursor.c,v
retrieving revision 1.11
diff -u -r1.11 cursor.c
--- cursor.c 29 Oct 2002 14:18:24 -0000 1.11
+++ cursor.c 2 Jan 2003 14:53:43 -0000
@@ -49,6 +49,114 @@
static void SoftCursorCopyArea(int oper);
static void SoftCursorDraw(void);
static void FreeSoftCursor(void);
+static void FreeX11Cursor();
+
+/* Copied from Xvnc/lib/font/util/utilbitmap.c */
+static unsigned char _reverse_byte[0x100] =3D {
+ 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
+};
+
+/* Data kept for HandleXCursor() function. */
+static Bool prevXCursorSet =3D False;
+static Cursor prevXCursor;
+
+
+Bool HandleXCursor(int xhot, int yhot, int width, int height)
+{
+ rfbXCursorColors colors;
+ size_t bytesPerRow, bytesData;
+ char *buf =3D NULL;
+ XColor bg, fg;
+ Drawable dr;
+ unsigned int wret =3D 0, hret =3D 0;
+ Pixmap source, mask;
+ Cursor cursor;
+ int i;
+
+ bytesPerRow =3D (width + 7) / 8;
+ bytesData =3D bytesPerRow * height;
+ dr =3D DefaultRootWindow(dpy);
+
+ if (width * height) {
+ if (!ReadFromRFBServer((char *)&colors, sz_rfbXCursorColors))
+ return False;
+
+ buf =3D malloc(bytesData * 2);
+ if (buf =3D=3D NULL)
+ return False;
+
+ if (!ReadFromRFBServer(buf, bytesData * 2)) {
+ free(buf);
+ return False;
+ }
+
+ XQueryBestCursor(dpy, dr, width, height, &wret, &hret);
+ }
+
+ if (width * height =3D=3D 0 || wret < width || hret < height) {
+ /* Free resources */
+ if (buf !=3D NULL)
+ free(buf);
+ FreeX11Cursor();
+ return True;
+ }
+
+ bg.red =3D (unsigned short)colors.backRed << 8 | colors.backRed;
+ bg.green =3D (unsigned short)colors.backGreen << 8 | colors.backGreen;
+ bg.blue =3D (unsigned short)colors.backBlue << 8 | colors.backBlue;
+ fg.red =3D (unsigned short)colors.foreRed << 8 | colors.foreRed;
+ fg.green =3D (unsigned short)colors.foreGreen << 8 | colors.foreGreen;
+ fg.blue =3D (unsigned short)colors.foreBlue << 8 | colors.foreBlue;
+
+ for (i =3D 0; i < bytesData * 2; i++)
+ buf[i] =3D (char)_reverse_byte[(int)buf[i] & 0xFF];
+
+ source =3D XCreateBitmapFromData(dpy, dr, buf, width, height);
+ mask =3D XCreateBitmapFromData(dpy, dr, &buf[bytesData], width, height=
);
+ cursor =3D XCreatePixmapCursor(dpy, source, mask, &fg, &bg, xhot, yhot=
);
+ XFreePixmap(dpy, source);
+ XFreePixmap(dpy, mask);
+ free(buf);
+
+ XDefineCursor(dpy, desktopWin, cursor);
+ FreeX11Cursor();
+ prevXCursor =3D cursor;
+ prevXCursorSet =3D True;
+
+ return True;
+}
+
=20
=20
/*********************************************************************
@@ -93,6 +201,10 @@
/* Read and decode cursor pixel data, depending on the encoding type. =
*/
=20
if (enc =3D=3D rfbEncodingXCursor) {
+ if (appData.useX11Cursor) {
+ HandleXCursor(xhot, yhot, width, height);
+ return True;
+ }
=20
/* Read and convert background and foreground colors. */
if (!ReadFromRFBServer((char *)&rgb, sz_rfbXCursorColors)) {
@@ -207,6 +319,12 @@
=20
Bool HandleCursorPos(int x, int y)
{
+ if (appData.useX11Cursor) {
+ if (appData.fullScreen)
+ XWarpPointer(dpy, None, desktopWin, 0, 0, 0, 0, x, y);
+ =20
+ return True;=20
+ }
=20
if (x >=3D si.framebufferWidth)
x =3D si.framebufferWidth - 1;
@@ -382,6 +500,15 @@
free(rcSource);
free(rcMask);
prevSoftCursorSet =3D False;
+ }
+}
+
+
+static void FreeX11Cursor()
+{
+ if (prevXCursorSet) {
+ XFreeCursor(dpy, prevXCursor);
+ prevXCursorSet =3D False;
}
}
=20
Index: desktop.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/vnc-tight/vnc_unixsrc/vncviewer/desktop.c,v
retrieving revision 1.3
diff -u -r1.3 desktop.c
--- desktop.c 16 Jan 2001 21:37:08 -0000 1.3
+++ desktop.c 2 Jan 2003 14:53:43 -0000
@@ -116,6 +116,7 @@
{
XGCValues gcv;
XSetWindowAttributes attr;
+ unsigned long valuemask;
=20
desktopWin =3D XtWindow(desktop);
=20
@@ -132,11 +133,16 @@
=20
XtVaGetApplicationResources(desktop, (XtPointer)&attr.backing_store,
desktopBackingStoreResources, 1, NULL);
+ valuemask =3D CWBackingStore;
=20
- dotCursor =3D CreateDotCursor();
- attr.cursor =3D dotCursor;
+ if (!appData.useX11Cursor) {
+ dotCursor =3D CreateDotCursor();
+ attr.cursor =3D dotCursor; =20
+ valuemask |=3D CWCursor;
+ }
+
+ XChangeWindowAttributes(dpy, desktopWin, valuemask, &attr);
=20
- XChangeWindowAttributes(dpy, desktopWin, CWBackingStore|CWCursor, &att=
r);
}
=20
=20
Index: rfbproto.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/vnc-tight/vnc_unixsrc/vncviewer/rfbproto.c,v
retrieving revision 1.31
diff -u -r1.31 rfbproto.c
--- rfbproto.c 3 Nov 2002 10:08:16 -0000 1.31
+++ rfbproto.c 2 Jan 2003 14:53:43 -0000
@@ -493,7 +493,10 @@
pe.buttonMask =3D buttonMask;
if (x < 0) x =3D 0;
if (y < 0) y =3D 0;
- SoftCursorMove(x, y);
+
+ if (!appData.useX11Cursor)
+ SoftCursorMove(x, y);
+
pe.x =3D Swap16IfLE(x);
pe.y =3D Swap16IfLE(y);
return WriteExact(rfbsock, (char *)&pe, sz_rfbPointerEventMsg);
Index: vncviewer.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/vnc-tight/vnc_unixsrc/vncviewer/vncviewer.h,v
retrieving revision 1.22
diff -u -r1.22 vncviewer.h
--- vncviewer.h 3 Nov 2002 10:08:16 -0000 1.22
+++ vncviewer.h 2 Jan 2003 14:53:43 -0000
@@ -102,6 +102,7 @@
int qualityLevel;
Bool enableJPEG;
Bool useRemoteCursor;
+ Bool useX11Cursor;
=20
} AppData;
=20
--=20
Peter =C5strand Telephone: +46-13-21 46 00
Cendio Systems E-mail: pe...@ce...
Teknikringen 3
583 30 Link=F6ping
|