Quoting Andrew de Quincey <adq_...@lidskialf.net>:
Quoting Adam Tkac <at...@redhat.com>:
On Thu, Dec 17, 2009 at 07:52:04AM -0800, Alan Coopersmith wrote:
Andrew de Quincey wrote:
> Hi, the attached two patches (against tigervnc 1.0.0) are my first
> working version of this.
>
> I'm building against 1.7.3.901 under gentoo. So far I've only had the
> time to test Xvnc itself, but it seems to be ok so far...
I found my port to 1.7 was simplified by first taking the patch from
the upstream svn to replace the XORG_16 style defines with the XORG
define so that the existing checks became "#if XORG >= 16"
http://src.opensolaris.org/source/xref/x-cons/XW_NV_tw-clone/open-src/xserver/xvnc/upstream-xorg-version.patch
is the copy I use in my builds.
Yes, this is the main reason why we started to use XORG <number>
instead of XORG_<number>.
The "X.Org 1.7" patch is really welcomed. I will look on it and merge
it to the main repo.
Ah that is much nicer yes; I'll resubmit a patch against SVN with this
change in an hour or so.
(My first priority was to get my headless server's VNC working again
so I worked against the 1.0.0 release initially :)
Hi, patch against SVN trunk attached; I like the splitting out of
Input.cc BTW, much clearer.
Index: unix/xserver/hw/vnc/vncExtInit.cc
===================================================================
--- unix/xserver/hw/vnc/vncExtInit.cc (revision 3925)
+++ unix/xserver/hw/vnc/vncExtInit.cc (working copy)
@@ -187,7 +187,7 @@
vncExtGeneration = serverGeneration;
ExtensionEntry* extEntry
- = AddExtension(VNCEXTNAME, VncExtNumberEvents, VncExtNumberErrors,
+ = AddExtension((char*) VNCEXTNAME, VncExtNumberEvents, VncExtNumberErrors,
ProcVncExtDispatch, SProcVncExtDispatch, vncResetProc,
StandardMinorOpcode);
if (!extEntry) {
Index: unix/xserver/hw/vnc/Input.cc
===================================================================
--- unix/xserver/hw/vnc/Input.cc (revision 3925)
+++ unix/xserver/hw/vnc/Input.cc (working copy)
@@ -45,7 +45,15 @@
#include "exevents.h"
extern void
CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
-#endif
+
+#if XORG >= 17
+#include <xkbsrv.h>
+#include <xkbstr.h>
+#include <xserver-properties.h>
+extern _X_EXPORT DevPrivateKey CoreDevicePrivateKey;
+#endif /* XORG 17 */
+
+#endif /* XORG 16 */
#include <X11/keysym.h>
#include <X11/Xutil.h>
#undef public
@@ -100,7 +108,7 @@
#if XORG == 15
eventq + i
#else
- (eventq + i)->event
+ (InternalEvent*) (eventq + i)->event
#endif
);
}
@@ -169,18 +177,41 @@
BYTE map[BUTTONS + 1];
DevicePtr pDev = (DevicePtr)pDevice;
int i;
+#if XORG == 17
+ Atom btn_labels[5];
+ Atom axes_labels[2];
+#endif
switch (onoff) {
case DEVICE_INIT:
for (i = 0; i < BUTTONS + 1; i++)
map[i] = i;
+#if XORG == 17
+ btn_labels[5] = XIGetKnownProperty((char*) BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
+ btn_labels[4] = XIGetKnownProperty((char*) BTN_LABEL_PROP_BTN_WHEEL_DOWN);
+ btn_labels[3] = XIGetKnownProperty((char*) BTN_LABEL_PROP_BTN_WHEEL_UP);
+ btn_labels[2] = XIGetKnownProperty((char*) BTN_LABEL_PROP_BTN_RIGHT);
+ btn_labels[1] = XIGetKnownProperty((char*) BTN_LABEL_PROP_BTN_MIDDLE);
+ btn_labels[0] = XIGetKnownProperty((char*) BTN_LABEL_PROP_BTN_LEFT);
+
+ axes_labels[0] = XIGetKnownProperty((char*) AXIS_LABEL_PROP_REL_X);
+ axes_labels[1] = XIGetKnownProperty((char*) AXIS_LABEL_PROP_REL_Y);
+
+ InitPointerDeviceStruct(pDev, map, 5, btn_labels,
+ (PtrCtrlProcPtr)NoopDDA, GetMotionHistorySize(),
+ 2, axes_labels);
+#elif XORG == 16
+ InitPointerDeviceStruct(pDev, map, BUTTONS,
+ (PtrCtrlProcPtr)NoopDDA,
+ GetMotionHistorySize(), 2);
+
+#elif XORG == 15
InitPointerDeviceStruct(pDev, map, BUTTONS,
-#if XORG == 15
GetMotionHistory,
-#endif
(PtrCtrlProcPtr)NoopDDA,
GetMotionHistorySize(), 2);
+#endif
break;
case DEVICE_ON:
pDev->on = TRUE;
@@ -240,16 +271,47 @@
void press()
{
KeyClassPtr keyc = dev->key;
+#if XORG >= 17
+ if (!(XkbStateFieldFromRec(&keyc->xkbInfo->state) & (1<<modIndex))) {
+ KeyCode *modkeymap = NULL;
+ int ret, max_keys_per_mod;
+
+ ret = generate_modkeymap(serverClient, dev, &modkeymap, &max_keys_per_mod);
+ if (ret == Success) {
+ tempKeyEvent(modkeymap[modIndex * max_keys_per_mod],
+ true, max_keys_per_mod);
+ pressed = true;
+ xfree(modkeymap);
+ }
+ }
+#else
if (!(keyc->state & (1 << modIndex))) {
int index = modIndex * keyc->maxKeysPerModifier;
- tempKeyEvent(keyc->modifierKeyMap[index], true);
+ tempKeyEvent(keyc->modifierKeyMap[index], true, keyc->maxKeysPerModifier);
pressed = true;
}
+#endif
}
void release()
{
KeyClassPtr keyc = dev->key;
+#if XORG >= 17
+ if (XkbStateFieldFromRec(&keyc->xkbInfo->state) & (1<<modIndex)) {
+ KeyCode *modkeymap = NULL;
+ int ret, max_keys_per_mod;
+
+ ret = generate_modkeymap(serverClient, dev, &modkeymap, &max_keys_per_mod);
+ if (ret == Success) {
+ for (int k = 0; k < max_keys_per_mod; k++) {
+ int keycode = modkeymap[modIndex * max_keys_per_mod + k];
+ if (keycode && IS_PRESSED(keyc, keycode))
+ tempKeyEvent(keycode, false, max_keys_per_mod);
+ }
+ xfree(modkeymap);
+ }
+ }
+#else
if ((keyc->state & (1 << modIndex)) == 0)
return;
@@ -257,15 +319,16 @@
int index = modIndex * keyc->maxKeysPerModifier + k;
int keycode = keyc->modifierKeyMap[index];
if (keycode && IS_PRESSED(keyc, keycode))
- tempKeyEvent(keycode, false);
+ tempKeyEvent(keycode, false, keyc->maxKeysPerModifier);
}
+#endif
}
private:
- void tempKeyEvent(int keycode, bool down)
+ void tempKeyEvent(int keycode, bool down, int maxKeysPerModifier)
{
if (keycode) {
- if (!keys) keys = new int[dev->key->maxKeysPerModifier];
+ if (!keys) keys = new int[maxKeysPerModifier];
keys[nKeys++] = keycode;
generateXKeyEvent(keycode, down);
}
@@ -365,13 +428,16 @@
{
DeviceIntPtr master;
KeyClassPtr keyc = dev->key;
- KeySymsPtr keymap = &keyc->curKeySyms;
- KeySym *map = keymap->map;
- KeyCode minKeyCode = keymap->minKeyCode;
- KeyCode maxKeyCode = keymap->maxKeyCode;
- int mapWidth = keymap->mapWidth;
+ KeySym *map;
+ KeyCode minKeyCode;
+ KeyCode maxKeyCode;
+ int mapWidth;
unsigned int i, n;
int j, k, action;
+ KeySymsPtr keymap = NULL;
+ KeyCode *modifierKeyMap = NULL;
+ int maxKeysPerModifier;
+ int state;
/*
* Since we are checking the current state to determine if we need
@@ -386,12 +452,35 @@
return;
}
+#if XORG >= 17
+ keymap = XkbGetCoreMap(dev);
+ if (!keymap)
+ return;
+
+ if (generate_modkeymap(serverClient, dev, &modifierKeyMap, &maxKeysPerModifier) != Success) {
+ xfree(keymap->map);
+ xfree(keymap);
+ return;
+ }
+
+ state = XkbStateFieldFromRec(&keyc->xkbInfo->state);
+#else
+ state = keyc->state;
+ maxKeysPerModifier = keyc->maxKeysPerModifier;
+ keymap = &keyc->curKeySyms;
+ modifierKeyMap = keyc->modifierKeyMap;
+#endif
+ map = keymap->map;
+ minKeyCode = keymap->minKeyCode;
+ maxKeyCode = keymap->maxKeyCode;
+ mapWidth = keymap->mapWidth;
+
/* find which modifier Mode_switch is on. */
int modeSwitchMapIndex = 0;
for (i = 3; i < 8; i++) {
- for (k = 0; k < keyc->maxKeysPerModifier; k++) {
- int index = i * keyc->maxKeysPerModifier + k;
- int keycode = keyc->modifierKeyMap[index];
+ for (k = 0; k < maxKeysPerModifier; k++) {
+ int index = i * maxKeysPerModifier + k;
+ int keycode = modifierKeyMap[index];
if (keycode == 0)
continue;
@@ -408,10 +497,10 @@
ModeSwitchFound:
int col = 0;
- if ((keyc->state & (1 << ShiftMapIndex)) != 0)
+ if ((state & (1 << ShiftMapIndex)) != 0)
col |= 1;
if (modeSwitchMapIndex != 0 &&
- ((keyc->state & (1 << modeSwitchMapIndex))) != 0)
+ ((state & (1 << modeSwitchMapIndex))) != 0)
col |= 2;
int kc = KeysymToKeycode(keymap, keysym, &col);
@@ -424,7 +513,7 @@
* We never get ISO_Left_Tab here because it's already been translated
* in VNCSConnectionST.
*/
- if (keysym == XK_Tab && ((keyc->state & (1 << ShiftMapIndex))) != 0)
+ if (keysym == XK_Tab && ((state & (1 << ShiftMapIndex))) != 0)
col |= 1;
if (kc == 0) {
@@ -478,6 +567,11 @@
if (kc < minKeyCode) {
vlog.info("Keyboard mapping full - ignoring unknown keysym "
"0x%x",keysym);
+#if XORG >= 17
+ xfree(keymap->map);
+ xfree(keymap);
+ xfree(modifierKeyMap);
+#endif
return;
}
@@ -487,13 +581,19 @@
* followed by a press.
*/
for (i = 0; i < 8; i++) {
- for (k = 0; k < keyc->maxKeysPerModifier; k++) {
- int index = i * keyc->maxKeysPerModifier + k;
- if (kc == keyc->modifierKeyMap[index] &&
- IS_PRESSED(keyc,kc) && down)
+ for (k = 0; k < maxKeysPerModifier; k++) {
+ int index = i * maxKeysPerModifier + k;
+ if (kc == modifierKeyMap[index] &&
+ IS_PRESSED(keyc,kc) && down) {
+#if XORG >= 17
+ xfree(keymap->map);
+ xfree(keymap);
+ xfree(modifierKeyMap);
+#endif
return;
}
}
+ }
ModifierState shift(dev, ShiftMapIndex);
ModifierState modeSwitch(dev, modeSwitchMapIndex);
@@ -523,6 +623,12 @@
* against this by processing the queue now.
*/
mieqProcessInputEvents();
+
+#if XORG >= 17
+ xfree(keymap->map);
+ xfree(keymap);
+ xfree(modifierKeyMap);
+#endif
}
static KeySym KeyCodetoKeySym(KeySymsPtr keymap, int keycode, int col)
@@ -761,9 +867,14 @@
switch (onoff) {
case DEVICE_INIT:
+#if XORG >= 17
+ InitKeyboardDeviceStruct(pDevice, NULL, keyboardBell,
+ (KbdCtrlProcPtr)NoopDDA);
+#else
GetMappings(&keySyms, modMap);
InitKeyboardDeviceStruct(pDev, &keySyms, modMap, keyboardBell,
(KbdCtrlProcPtr)NoopDDA);
+#endif
break;
case DEVICE_ON:
pDev->on = TRUE;
Index: unix/xserver/hw/vnc/xorg-version.h
===================================================================
--- unix/xserver/hw/vnc/xorg-version.h (revision 3925)
+++ unix/xserver/hw/vnc/xorg-version.h (working copy)
@@ -26,8 +26,10 @@
#if XORG_VERSION_CURRENT < ((1 * 10000000) + (5 * 100000) + (99 * 1000))
#define XORG 15
-#else
+#elif XORG_VERSION_CURRENT < ((1 * 10000000) + (6 * 100000) + (99 * 1000))
#define XORG 16
+#else
+#define XORG 17
#endif
#endif
Index: unix/xserver/hw/vnc/xvnc.cc
===================================================================
--- unix/xserver/hw/vnc/xvnc.cc (revision 3925)
+++ unix/xserver/hw/vnc/xvnc.cc (working copy)
@@ -81,6 +81,13 @@
#endif /* RANDR */
#include <X11/keysym.h>
extern char buildtime[];
+
+#if XORG >= 17
+#undef VENDOR_RELEASE
+#undef VENDOR_STRING
+#include <site.h>
+#endif
+
#undef class
#undef public
}
@@ -629,8 +636,17 @@
{
if (pmap->mid != pmap->pScreen->defColormap)
{
+#if XORG >= 17
+ int ret = dixLookupResourceByType((pointer*) &curpmap, pmap->pScreen->defColormap, RT_COLORMAP, NullClient,
+ DixReadAccess);
+ if (ret != Success) {
+ ErrorF("Failed to install colormap, code %d", ret);
+ return;
+ }
+#else
curpmap = (ColormapPtr) LookupIDByType(pmap->pScreen->defColormap,
RT_COLORMAP);
+#endif
(*pmap->pScreen->InstallColormap)(curpmap);
}
}
Index: unix/xserver/hw/vnc/Makefile.am
===================================================================
--- unix/xserver/hw/vnc/Makefile.am (revision 3925)
+++ unix/xserver/hw/vnc/Makefile.am (working copy)
@@ -52,7 +52,7 @@
libvnc_la_LDFLAGS = -module -avoid-version
-libvnc_la_LIBADD = libvnccommon.la $(COMMON_LIBS)
+libvnc_la_LIBADD = libvnccommon.la $(COMMON_LIBS) $(top_srcdir)/Xi/libXi.la $(top_srcdir)/dix/libdix.la
EXTRA_DIST = Xvnc.man
Index: unix/xserver/hw/vnc/XserverDesktop.cc
===================================================================
--- unix/xserver/hw/vnc/XserverDesktop.cc (revision 3925)
+++ unix/xserver/hw/vnc/XserverDesktop.cc (working copy)
@@ -54,6 +54,11 @@
#ifdef RANDR
#include "randrstr.h"
#endif
+
+#if XORG >= 17
+#include <cursorstr.h>
+#endif
+
#undef public
#undef class
}
@@ -185,8 +190,13 @@
int i;
pointer retval;
+#if XORG >= 17
+ i = dixLookupResourceByType(&retval, pScreen->defColormap, RT_COLORMAP, NullClient,
+ DixReadAccess);
+#else
i = dixLookupResource(&retval, pScreen->defColormap, RT_COLORMAP, NullClient,
DixReadAccess);
+#endif
/* Handle suspicious conditions */
assert(i == Success);
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________
Tigervnc-devel mailing list
Tigervnc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-devel