svn commit: r319382 - in head/net/tigervnc: . files
Steve Wills
swills at FreeBSD.org
Wed May 29 16:29:41 UTC 2013
Author: swills
Date: Wed May 29 16:29:40 2013
New Revision: 319382
URL: http://svnweb.freebsd.org/changeset/ports/319382
Log:
- Add backport patches to support xorg-server 1.12.x
- Fix the build after xorg mega-update
- Fix typo s/LISENCE/LICENSE/
PR: ports/179018
Submitted by: Koichiro IWAO <meta+ports at vmeta.jp>
Added:
head/net/tigervnc/files/extra-patch-common_rdr.patch (contents, props changed)
head/net/tigervnc/files/extra-patch-common_rfb.patch (contents, props changed)
head/net/tigervnc/files/extra-patch-unix_hw_vnc.patch (contents, props changed)
head/net/tigervnc/files/xserver112.patch (contents, props changed)
Modified:
head/net/tigervnc/Makefile
Modified: head/net/tigervnc/Makefile
==============================================================================
--- head/net/tigervnc/Makefile Wed May 29 15:44:57 2013 (r319381)
+++ head/net/tigervnc/Makefile Wed May 29 16:29:40 2013 (r319382)
@@ -3,7 +3,7 @@
PORTNAME= tigervnc
PORTVERSION= 1.2.0
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= net x11-servers
MASTER_SITES= SF:tigervnc
MASTER_SITE_SUBDIR= ${PORTNAME}/${PORTNAME}/${PORTVERSION}/:tigervnc
@@ -12,12 +12,8 @@ DISTFILES= ${PORTNAME}-${PORTVERSION}.ta
MAINTAINER= meta+ports at vmeta.jp
COMMENT= TigerVNC is an advanced VNC implementation
-LISENCE= GPLv2
-LISENCE_FILE= ${WRKSRC}/LICENCE.TXT
-
-.if defined(WITH_NEW_XORG)
-BROKEN= Does not build
-.endif
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/LICENCE.TXT
PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/x11-servers/xorg-server:patch
BUILD_DEPENDS= ${LOCALBASE}/include/GL/internal/dri_interface.h:${PORTSDIR}/graphics/dri
@@ -127,7 +123,10 @@ CONFIGURE_ARGS+= \
.include <bsd.port.pre.mk>
.ifdef WITH_NEW_XORG
-TIGERVNC_XORG_PATCH_VER= 110
+TIGERVNC_XORG_PATCH_VER= 112
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-unix_hw_vnc.patch \
+ ${FILESDIR}/extra-patch-common_rdr.patch \
+ ${FILESDIR}/extra-patch-common_rfb.patch
.else
TIGERVNC_XORG_PATCH_VER= 17
.endif
@@ -146,6 +145,7 @@ pre-patch:
@${CP} -R `${XORG_WRKDIR}`/ ${WRKSRC}/unix/xserver/
post-patch:
+ @${CP} ${FILESDIR}/xserver*.patch ${WRKSRC}/unix/
@cd ${WRKSRC}/unix/xserver/ && ${PATCH} -p1 < ${WRKSRC}/unix/xserver${TIGERVNC_XORG_PATCH_VER}.patch
post-configure:
Added: head/net/tigervnc/files/extra-patch-common_rdr.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/net/tigervnc/files/extra-patch-common_rdr.patch Wed May 29 16:29:40 2013 (r319382)
@@ -0,0 +1,214 @@
+
+--- common/rdr/TLSErrno.h 1970-01-01 09:00:00.000000000 +0900
++++ common/rdr/TLSErrno.h 2013-05-27 19:09:50.115573000 +0900
+@@ -0,0 +1,46 @@
++/* Copyright (C) 2012 Pierre Ossman for Cendio AB
++ *
++ * This 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 software 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 software; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++ * USA.
++ */
++
++#ifndef __RDR_TLSERRNO_H__
++#define __RDR_TLSERRNO_H__
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#ifdef HAVE_GNUTLS
++
++#include <errno.h>
++
++namespace rdr {
++
++ static inline void gnutls_errno_helper(gnutls_session session, int _errno)
++ {
++#if defined(HAVE_GNUTLS_SET_ERRNO)
++ gnutls_transport_set_errno(session, _errno);
++#elif defined(HAVE_GNUTLS_SET_GLOBAL_ERRNO)
++ gnutls_transport_set_global_errno(_errno);
++#else
++ errno = _errno;
++#endif
++ }
++};
++
++#endif
++
++#endif
+
+--- common/rdr/TLSInStream.cxx 2010-09-30 15:25:28.000000000 +0900
++++ common/rdr/TLSInStream.cxx 2013-05-27 19:09:50.124573000 +0900
+@@ -25,25 +25,22 @@
+ #include <rdr/Exception.h>
+ #include <rdr/TLSException.h>
+ #include <rdr/TLSInStream.h>
++#include <rdr/TLSErrno.h>
+ #include <errno.h>
+
+-#ifdef HAVE_OLD_GNUTLS
+-#define gnutls_transport_set_global_errno(A) do { errno = (A); } while(0)
+-#endif
+-
+ #ifdef HAVE_GNUTLS
+ using namespace rdr;
+
+ enum { DEFAULT_BUF_SIZE = 16384 };
+
+-ssize_t rdr::gnutls_InStream_pull(gnutls_transport_ptr str, void* data,
+- size_t size)
++ssize_t TLSInStream::pull(gnutls_transport_ptr str, void* data, size_t size)
+ {
+- InStream* in= (InStream*) str;
++ TLSInStream* self= (TLSInStream*) str;
++ InStream *in = self->in;
+
+ try {
+ if (!in->check(1, 1, false)) {
+- gnutls_transport_set_global_errno(EAGAIN);
++ gnutls_errno_helper(self->session, EAGAIN);
+ return -1;
+ }
+
+@@ -53,7 +50,7 @@
+ in->readBytes(data, size);
+
+ } catch (Exception& e) {
+- gnutls_transport_set_global_errno(EINVAL);
++ gnutls_errno_helper(self->session, EINVAL);
+ return -1;
+ }
+
+@@ -63,11 +60,19 @@
+ TLSInStream::TLSInStream(InStream* _in, gnutls_session _session)
+ : session(_session), in(_in), bufSize(DEFAULT_BUF_SIZE), offset(0)
+ {
++ gnutls_transport_ptr recv, send;
++
+ ptr = end = start = new U8[bufSize];
++
++ gnutls_transport_set_pull_function(session, pull);
++ gnutls_transport_get_ptr2(session, &recv, &send);
++ gnutls_transport_set_ptr2(session, this, send);
+ }
+
+ TLSInStream::~TLSInStream()
+ {
++ gnutls_transport_set_pull_function(session, NULL);
++
+ delete[] start;
+ }
+
+
+--- common/rdr/TLSInStream.h 2010-04-23 23:12:18.000000000 +0900
++++ common/rdr/TLSInStream.h 2013-05-27 19:09:50.086573000 +0900
+@@ -41,6 +41,7 @@
+ private:
+ int overrun(int itemSize, int nItems, bool wait);
+ int readTLS(U8* buf, int len, bool wait);
++ static ssize_t pull(gnutls_transport_ptr str, void* data, size_t size);
+
+ gnutls_session session;
+ InStream* in;
+@@ -48,9 +49,6 @@
+ int offset;
+ U8* start;
+ };
+-
+- ssize_t gnutls_InStream_pull(gnutls_transport_ptr,void*, size_t);
+-
+ };
+
+ #endif
+
+--- common/rdr/TLSOutStream.cxx 2010-09-30 15:25:28.000000000 +0900
++++ common/rdr/TLSOutStream.cxx 2013-05-27 19:09:50.094576000 +0900
+@@ -25,27 +25,25 @@
+ #include <rdr/Exception.h>
+ #include <rdr/TLSException.h>
+ #include <rdr/TLSOutStream.h>
++#include <rdr/TLSErrno.h>
+ #include <errno.h>
+
+-#ifdef HAVE_OLD_GNUTLS
+-#define gnutls_transport_set_global_errno(A) do { errno = (A); } while(0)
+-#endif
+-
+ #ifdef HAVE_GNUTLS
+ using namespace rdr;
+
+ enum { DEFAULT_BUF_SIZE = 16384 };
+
+-ssize_t rdr::gnutls_OutStream_push(gnutls_transport_ptr str, const void* data,
++ssize_t TLSOutStream::push(gnutls_transport_ptr str, const void* data,
+ size_t size)
+ {
+- OutStream* out = (OutStream*) str;
++ TLSOutStream* self= (TLSOutStream*) str;
++ OutStream *out = self->out;
+
+ try {
+ out->writeBytes(data, size);
+ out->flush();
+ } catch (Exception& e) {
+- gnutls_transport_set_global_errno(EINVAL);
++ gnutls_errno_helper(self->session, EINVAL);
+ return -1;
+ }
+
+@@ -55,8 +53,14 @@
+ TLSOutStream::TLSOutStream(OutStream* _out, gnutls_session _session)
+ : session(_session), out(_out), bufSize(DEFAULT_BUF_SIZE), offset(0)
+ {
++ gnutls_transport_ptr recv, send;
++
+ ptr = start = new U8[bufSize];
+ end = start + bufSize;
++
++ gnutls_transport_set_push_function(session, push);
++ gnutls_transport_get_ptr2(session, &recv, &send);
++ gnutls_transport_set_ptr2(session, recv, this);
+ }
+
+ TLSOutStream::~TLSOutStream()
+@@ -67,6 +71,8 @@
+ } catch (Exception&) {
+ }
+ #endif
++ gnutls_transport_set_push_function(session, NULL);
++
+ delete [] start;
+ }
+
+
+--- common/rdr/TLSOutStream.h 2010-04-23 23:12:18.000000000 +0900
++++ common/rdr/TLSOutStream.h 2013-05-27 19:09:50.101573000 +0900
+@@ -43,6 +43,7 @@
+
+ private:
+ int writeTLS(const U8* data, int length);
++ static ssize_t push(gnutls_transport_ptr str, const void* data, size_t size);
+
+ gnutls_session session;
+ OutStream* out;
+@@ -50,8 +51,6 @@
+ U8* start;
+ int offset;
+ };
+-
+- ssize_t gnutls_OutStream_push(gnutls_transport_ptr, const void*, size_t);
+ };
+
+ #endif
Added: head/net/tigervnc/files/extra-patch-common_rfb.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/net/tigervnc/files/extra-patch-common_rfb.patch Wed May 29 16:29:40 2013 (r319382)
@@ -0,0 +1,259 @@
+
+--- common/rfb/CConnection.cxx 2011-11-15 00:44:11.000000000 +0900
++++ common/rfb/CConnection.cxx 2013-05-27 19:09:50.167574000 +0900
+@@ -100,7 +100,7 @@
+ char msg[256];
+ sprintf(msg,"Server gave unsupported RFB protocol version %d.%d",
+ cp.majorVersion, cp.minorVersion);
+- vlog.error(msg);
++ vlog.error("%s", msg);
+ state_ = RFBSTATE_INVALID;
+ throw Exception(msg);
+ } else if (useProtocol3_3 || cp.beforeVersion(3,7)) {
+
+--- common/rfb/CMsgReader.cxx 2010-02-10 16:43:02.000000000 +0900
++++ common/rfb/CMsgReader.cxx 2013-05-27 19:09:50.274574000 +0900
+@@ -100,7 +100,7 @@
+ readCopyRect(r);
+ } else {
+
+- if (encoding > encodingMax) {
++ if (!Decoder::supported(encoding)) {
+ fprintf(stderr, "Unknown rect encoding %d\n", encoding);
+ throw Exception("Unknown rect encoding");
+ }
+
+--- common/rfb/CSecurityTLS.cxx 2011-05-10 17:54:57.000000000 +0900
++++ common/rfb/CSecurityTLS.cxx 2013-05-27 19:09:50.329576000 +0900
+@@ -72,7 +72,7 @@
+
+ static void debug_log(int level, const char* str)
+ {
+- vlog_raw.debug(str);
++ vlog_raw.debug("[%d]: %s", level, str);
+ }
+
+ void CSecurityTLS::initGlobal()
+@@ -188,20 +188,20 @@
+ throw AuthFailureException("gnutls_set_default_priority failed");
+
+ setParam();
+-
+- gnutls_transport_set_pull_function(session, rdr::gnutls_InStream_pull);
+- gnutls_transport_set_push_function(session, rdr::gnutls_OutStream_push);
+- gnutls_transport_set_ptr2(session,
+- (gnutls_transport_ptr) is,
+- (gnutls_transport_ptr) os);
+ }
+
++ rdr::TLSInStream *tlsis = new rdr::TLSInStream(is, session);
++ rdr::TLSOutStream *tlsos = new rdr::TLSOutStream(os, session);
++
+ int err;
+ err = gnutls_handshake(session);
+- if (err != GNUTLS_E_SUCCESS && !gnutls_error_is_fatal(err))
+- return false;
+-
+ if (err != GNUTLS_E_SUCCESS) {
++ delete tlsis;
++ delete tlsos;
++
++ if (!gnutls_error_is_fatal(err))
++ return false;
++
+ vlog.error("TLS Handshake failed: %s\n", gnutls_strerror (err));
+ shutdown(false);
+ throw AuthFailureException("TLS Handshake failed");
+@@ -209,8 +209,7 @@
+
+ checkSession();
+
+- cc->setStreams(fis = new rdr::TLSInStream(is, session),
+- fos = new rdr::TLSOutStream(os, session));
++ cc->setStreams(fis = tlsis, fos = tlsos);
+
+ return true;
+ }
+
+--- common/rfb/Decoder.cxx 2010-02-10 16:43:02.000000000 +0900
++++ common/rfb/Decoder.cxx 2013-05-27 19:09:50.186575000 +0900
+@@ -34,12 +34,12 @@
+
+ bool Decoder::supported(int encoding)
+ {
+- return encoding <= encodingMax && createFns[encoding];
++ return encoding >= 0 && encoding <= encodingMax && createFns[encoding];
+ }
+
+ Decoder* Decoder::createDecoder(int encoding, CMsgReader* reader)
+ {
+- if (encoding <= encodingMax && createFns[encoding])
++ if (supported(encoding))
+ return (*createFns[encoding])(reader);
+ return 0;
+ }
+
+--- common/rfb/LogWriter.h 2011-02-18 19:54:11.000000000 +0900
++++ common/rfb/LogWriter.h 2013-05-27 19:09:50.170575000 +0900
+@@ -25,12 +25,18 @@
+ #include <rfb/Logger.h>
+ #include <rfb/Configuration.h>
+
++#ifdef __GNUC__
++# define __printf_attr(a, b) __attribute__((__format__ (__printf__, a, b)))
++#else
++# define __printf_attr(a, b)
++#endif // __GNUC__
++
+ // Each log writer instance has a unique textual name,
+ // and is attached to a particular Log instance and
+ // is assigned a particular log level.
+
+ #define DEF_LOGFUNCTION(name, level) \
+- inline void name(const char* fmt, ...) { \
++ inline void name(const char* fmt, ...) __printf_attr(2, 3) { \
+ if (m_log && (level <= m_level)) { \
+ va_list ap; va_start(ap, fmt); \
+ m_log->write(level, m_name, fmt, ap);\
+@@ -53,7 +59,7 @@
+ void setLevel(int level);
+ int getLevel(void) { return m_level; }
+
+- inline void write(int level, const char* format, ...) {
++ inline void write(int level, const char* format, ...) __printf_attr(3, 4) {
+ if (m_log && (level <= m_level)) {
+ va_list ap;
+ va_start(ap, format);
+
+--- common/rfb/SConnection.cxx 2011-11-15 01:22:23.000000000 +0900
++++ common/rfb/SConnection.cxx 2013-05-27 19:09:50.208576000 +0900
+@@ -239,7 +239,7 @@
+
+ void SConnection::throwConnFailedException(const char* msg)
+ {
+- vlog.info(msg);
++ vlog.info("%s", msg);
+ if (state_ == RFBSTATE_PROTOCOL_VERSION) {
+ if (cp.majorVersion == 3 && cp.minorVersion == 3) {
+ os->writeU32(0);
+
+--- common/rfb/SSecurityTLS.cxx 2011-02-18 19:54:11.000000000 +0900
++++ common/rfb/SSecurityTLS.cxx 2013-05-27 19:09:50.354575000 +0900
+@@ -49,7 +49,7 @@
+
+ static void debug_log(int level, const char* str)
+ {
+- vlog.debug(str);
++ vlog.debug("[%d]: %s", level, str);
+ }
+
+ void SSecurityTLS::initGlobal()
+@@ -148,17 +148,19 @@
+ throw;
+ }
+
+- gnutls_transport_set_pull_function(session,rdr::gnutls_InStream_pull);
+- gnutls_transport_set_push_function(session,rdr::gnutls_OutStream_push);
+- gnutls_transport_set_ptr2(session,
+- (gnutls_transport_ptr)is,
+- (gnutls_transport_ptr)os);
+ os->writeU8(1);
+ os->flush();
+ }
+
++ rdr::TLSInStream *tlsis = new rdr::TLSInStream(is, session);
++ rdr::TLSOutStream *tlsos = new rdr::TLSOutStream(os, session);
++
+ int err;
+- if ((err = gnutls_handshake(session)) != GNUTLS_E_SUCCESS) {
++ err = gnutls_handshake(session);
++ if (err != GNUTLS_E_SUCCESS) {
++ delete tlsis;
++ delete tlsos;
++
+ if (!gnutls_error_is_fatal(err)) {
+ vlog.debug("Deferring completion of TLS handshake: %s", gnutls_strerror(err));
+ return false;
+@@ -170,8 +172,7 @@
+
+ vlog.debug("Handshake completed");
+
+- sc->setStreams(fis=new rdr::TLSInStream(is,session),
+- fos=new rdr::TLSOutStream(os,session));
++ sc->setStreams(fis = tlsis, fos = tlsos);
+
+ return true;
+ }
+
+--- common/rfb/ScreenSet.h 2010-12-01 19:11:20.000000000 +0900
++++ common/rfb/ScreenSet.h 2013-05-27 19:09:50.103575000 +0900
+@@ -23,6 +23,7 @@
+
+ #include <stdio.h>
+
++#include <rdr/types.h>
+ #include <rfb/Rect.h>
+ #include <list>
+ #include <set>
+
+--- common/rfb/VNCSConnectionST.cxx 2011-12-21 22:17:54.000000000 +0900
++++ common/rfb/VNCSConnectionST.cxx 2013-05-27 19:09:50.296574000 +0900
+@@ -66,7 +66,8 @@
+ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
+ bool reverse)
+ : SConnection(reverse), sock(s), inProcessMessages(false),
+- syncFence(false), fenceFlags(0), fenceDataLen(0), fenceData(NULL),
++ pendingSyncFence(false), syncFence(false), fenceFlags(0),
++ fenceDataLen(0), fenceData(NULL),
+ baseRTT(-1), minRTT(-1), seenCongestion(false), pingCounter(0),
+ ackedOffset(0), sentOffset(0), congWindow(0), congestionTimer(this),
+ server(server_),
+@@ -156,7 +157,13 @@
+ network::TcpSocket::cork(sock->getFd(), true);
+
+ while (getInStream()->checkNoWait(1)) {
++ if (pendingSyncFence) {
++ syncFence = true;
++ pendingSyncFence = false;
++ }
++
+ processMsg();
++
+ if (syncFence) {
+ writer()->writeFence(fenceFlags, fenceDataLen, fenceData);
+ syncFence = false;
+@@ -627,10 +634,7 @@
+ {
+ if (flags & fenceFlagRequest) {
+ if (flags & fenceFlagSyncNext) {
+- if (syncFence)
+- vlog.error("Fence trying to synchronise another fence");
+-
+- syncFence = true;
++ pendingSyncFence = true;
+
+ fenceFlags = flags & (fenceFlagBlockBefore | fenceFlagBlockAfter | fenceFlagSyncNext);
+ fenceDataLen = len;
+@@ -1083,6 +1087,10 @@
+ if (i->width() && i->height()) {
+ int nUpdateRects = writer()->getNumRects(*i);
+ if (nUpdateRects == 0 && cp.currentEncoding() == encodingTight) {
++ // With Tight encoding and LastRect support, the client does not
++ // care about the number of rectangles in the update - it will
++ // stop parsing when it encounters a LastRect "rectangle".
++ // In this case, pretend to send 65535 rectangles.
+ nRects = 0xFFFF; break;
+ }
+ else
+
+--- common/rfb/VNCSConnectionST.h 2011-11-21 00:36:11.000000000 +0900
++++ common/rfb/VNCSConnectionST.h 2013-05-27 19:09:50.156574000 +0900
+@@ -183,7 +183,7 @@
+
+ bool inProcessMessages;
+
+- bool syncFence;
++ bool pendingSyncFence, syncFence;
+ rdr::U32 fenceFlags;
+ unsigned fenceDataLen;
+ char *fenceData;
Added: head/net/tigervnc/files/extra-patch-unix_hw_vnc.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/net/tigervnc/files/extra-patch-unix_hw_vnc.patch Wed May 29 16:29:40 2013 (r319382)
@@ -0,0 +1,1806 @@
+
+--- unix/xserver/hw/vnc/Input.cc 2011-11-08 21:44:10.000000000 +0900
++++ unix/xserver/hw/vnc/Input.cc 2013-05-27 18:54:41.184574000 +0900
+@@ -82,10 +82,11 @@
+ /* Event queue is shared between all devices. */
+ #if XORG == 15
+ static xEvent *eventq = NULL;
+-#else
++#elif XORG < 111
+ static EventList *eventq = NULL;
+ #endif
+
++#if XORG < 111
+ static void initEventq(void)
+ {
+ /* eventq is never free()-ed because it exists during server life. */
+@@ -100,7 +101,9 @@
+ #endif
+ }
+ }
++#endif /* XORG < 111 */
+
++#if XORG < 111
+ static void enqueueEvents(DeviceIntPtr dev, int n)
+ {
+ int i;
+@@ -122,6 +125,7 @@
+ );
+ }
+ }
++#endif /* XORG < 111 */
+
+ InputDevice::InputDevice(rfb::VNCServerST *_server)
+ : server(_server), oldButtonMask(0)
+@@ -141,12 +145,17 @@
+ keyboardProc, TRUE);
+ RegisterKeyboardDevice(keyboardDev);
+ #endif
++#if XORG < 111
+ initEventq();
++#endif
+ }
+
+ void InputDevice::PointerButtonAction(int buttonMask)
+ {
+- int i, n;
++ int i;
++#if XORG < 111
++ int n;
++#endif
+ #if XORG >= 110
+ ValuatorMask mask;
+ #endif
+@@ -160,13 +169,17 @@
+ #if XORG < 110
+ n = GetPointerEvents(eventq, pointerDev, action, i + 1,
+ POINTER_RELATIVE, 0, 0, NULL);
+-#else
++ enqueueEvents(pointerDev, n);
++#elif XORG < 111
+ valuator_mask_set_range(&mask, 0, 0, NULL);
+ n = GetPointerEvents(eventq, pointerDev, action, i + 1,
+ POINTER_RELATIVE, &mask);
+-#endif
+ enqueueEvents(pointerDev, n);
+-
++#else
++ valuator_mask_set_range(&mask, 0, 0, NULL);
++ QueuePointerEvents(pointerDev, action, i + 1,
++ POINTER_RELATIVE, &mask);
++#endif
+ }
+ }
+
+@@ -175,7 +188,10 @@
+
+ void InputDevice::PointerMove(const rfb::Point &pos)
+ {
+- int n, valuators[2];
++ int valuators[2];
++#if XORG < 111
++ int n;
++#endif
+ #if XORG >= 110
+ ValuatorMask mask;
+ #endif
+@@ -190,12 +206,16 @@
+ #if XORG < 110
+ n = GetPointerEvents(eventq, pointerDev, MotionNotify, 0, POINTER_ABSOLUTE, 0,
+ 2, valuators);
+-#else
++ enqueueEvents(pointerDev, n);
++#elif XORG < 111
+ valuator_mask_set_range(&mask, 0, 2, valuators);
+ n = GetPointerEvents(eventq, pointerDev, MotionNotify, 0, POINTER_ABSOLUTE,
+ &mask);
+-#endif
+ enqueueEvents(pointerDev, n);
++#else
++ valuator_mask_set_range(&mask, 0, 2, valuators);
++ QueuePointerEvents(pointerDev, MotionNotify, 0, POINTER_ABSOLUTE, &mask);
++#endif
+
+ cursorPos = pos;
+ }
+@@ -298,14 +318,20 @@
+ static inline void pressKey(DeviceIntPtr dev, int kc, bool down, const char *msg)
+ {
+ int action;
++#if XORG < 111
+ unsigned int n;
++#endif
+
+ if (msg != NULL)
+ vlog.debug("%s %d %s", msg, kc, down ? "down" : "up");
+
+ action = down ? KeyPress : KeyRelease;
+- n = GetKeyboardEvents(eventq, dev, action, kc);
++#if XORG < 111
++ n = GetKeyboardEvents(eventq, dev, action, kc, NULL);
+ enqueueEvents(dev, n);
++#else
++ QueueKeyboardEvents(dev, action, kc, NULL);
++#endif
+ }
+
+ #define IS_PRESSED(keyc, keycode) \
+@@ -340,8 +366,11 @@
+ int state, maxKeysPerMod, keycode;
+ #if XORG >= 17
+ KeyCode *modmap = NULL;
+-
++#if XORG >= 111
++ state = XkbStateFieldFromRec(&dev->master->key->xkbInfo->state);
++#else /* XORG >= 111 */
+ state = XkbStateFieldFromRec(&dev->u.master->key->xkbInfo->state);
++#endif /* XORG >= 111 */
+ #else
+ KeyClassPtr keyc = dev->key;
+ state = keyc->state;
+@@ -379,7 +408,11 @@
+ #if XORG >= 17
+ KeyCode *modmap = NULL;
+
++#if XORG >= 111
++ keyc = dev->master->key;
++#else /* XORG >= 111 */
+ keyc = dev->u.master->key;
++#endif /* XORG >= 111 */
+ state = XkbStateFieldFromRec(&keyc->xkbInfo->state);
+ #else
+ keyc = dev->key;
+@@ -595,7 +628,11 @@
+ }
+
+ #if XORG >= 17
++#if XORG >= 111
++ keyc = keyboardDev->master->key;
++#else /* XORG >= 111 */
+ keyc = keyboardDev->u.master->key;
++#endif /* XORG >= 111 */
+
+ keymap = XkbGetCoreMap(keyboardDev);
+ if (!keymap) {
+@@ -752,7 +789,11 @@
+ XkbApplyMappingChange(keyboardDev, keymap, minKeyCode,
+ maxKeyCode - minKeyCode + 1,
+ NULL, serverClient);
++#if XORG >= 111
++ XkbCopyDeviceKeymap(keyboardDev->master, keyboardDev);
++#else
+ XkbCopyDeviceKeymap(keyboardDev->u.master, keyboardDev);
++#endif
+ #endif /* XORG < 17 */
+ break;
+ }
+
+--- unix/xserver/hw/vnc/Makefile.am 2011-10-31 17:14:40.000000000 +0900
++++ unix/xserver/hw/vnc/Makefile.am 2013-05-27 18:54:41.196574000 +0900
+@@ -63,7 +63,7 @@
+ BUILT_SOURCES = $(nodist_Xvnc_SOURCES)
+
+ fb.h: $(top_srcdir)/fb/fb.h
+- cat $(top_srcdir)/fb/fb.h | sed -e 's,and,c_and,' -e 's,xor,c_xor,' > $(srcdir)/fb.h
++ cat $(top_srcdir)/fb/fb.h | sed -e 's,and,c_and,g' -e 's,xor,c_xor,g' > $(srcdir)/fb.h
+
+ pixman.h:
+ for i in ${XSERVERLIBS_CFLAGS}; do \
+@@ -78,4 +78,4 @@
+ fi
+
+ fbrop.h: $(top_srcdir)/fb/fbrop.h
+- cat $(top_srcdir)/fb/fbrop.h | sed -e 's,and,c_and,' -e 's,xor,c_xor,' > $(srcdir)/fbrop.h
++ cat $(top_srcdir)/fb/fbrop.h | sed -e 's,and,c_and,g' -e 's,xor,c_xor,g' > $(srcdir)/fbrop.h
+
+--- unix/xserver/hw/vnc/XserverDesktop.cc 2012-01-24 00:54:11.000000000 +0900
++++ unix/xserver/hw/vnc/XserverDesktop.cc 2013-05-27 18:54:41.203576000 +0900
+@@ -200,6 +200,8 @@
+
+ void XserverDesktop::setFramebuffer(int w, int h, void* fbptr, int stride)
+ {
++ ScreenSet layout;
++
+ width_ = w;
+ height_ = h;
+
+@@ -217,9 +219,98 @@
+ data = (rdr::U8*)fbptr;
+ stride_ = stride;
+
+- server->setPixelBuffer(this);
++ layout = computeScreenLayout();
++
++ server->setPixelBuffer(this, layout);
++}
++
++void XserverDesktop::refreshScreenLayout()
++{
++ server->setScreenLayout(computeScreenLayout());
++}
++
++ScreenSet XserverDesktop::computeScreenLayout()
++{
++ ScreenSet layout;
++
++#ifdef RANDR
++ rrScrPrivPtr rp = rrGetScrPriv(pScreen);
++ OutputIdMap newIdMap;
++
++ for (int i = 0;i < rp->numOutputs;i++) {
++ RROutputPtr output;
++ RRCrtcPtr crtc;
++
++ output = rp->outputs[i];
++ crtc = output->crtc;
++
++ /* Disabled? */
++ if ((crtc == NULL) || (crtc->mode == NULL))
++ continue;
++
++ /* Known output? */
++ if (outputIdMap.count(output) == 1)
++ newIdMap[output] = outputIdMap[output];
++ else {
++ rdr::U32 id;
++ OutputIdMap::const_iterator iter;
++
++ while (true) {
++ id = rand();
++ for (iter = outputIdMap.begin();iter != outputIdMap.end();++iter) {
++ if (iter->second == id)
++ break;
++ }
++ if (iter == outputIdMap.end())
++ break;
++ }
++
++ newIdMap[output] = id;
++ }
++
++ layout.add_screen(Screen(newIdMap[output], crtc->x, crtc->y,
++ crtc->mode->mode.width,
++ crtc->mode->mode.height,
++ 0));
++ }
++
++ /* Only keep the entries that are currently active */
++ outputIdMap = newIdMap;
++#endif
++
++ /*
++ * Make sure we have something to display. Hopefully it's just temporary
++ * that we have no active outputs...
++ */
++ if (layout.num_screens() == 0)
++ layout.add_screen(Screen(0, 0, 0, pScreen->width, pScreen->height, 0));
++
++ return layout;
+ }
+
++#ifdef RANDR
++
++extern RRModePtr vncRandRModeGet(int width, int height);
++
++RRModePtr XserverDesktop::findRandRMode(RROutputPtr output, int width, int height)
++{
++ RRModePtr mode;
++
++ for (int i = 0;i < output->numModes;i++) {
++ if ((output->modes[i]->mode.width == width) &&
++ (output->modes[i]->mode.height == height))
++ return output->modes[i];
++ }
++
++ mode = vncRandRModeGet(width, height);
++ if (mode != NULL)
++ return mode;
++
++ return NULL;
++}
++
++#endif
++
+ char* XserverDesktop::substitute(const char* varName)
+ {
+ if (strcmp(varName, "$$") == 0) {
+@@ -727,100 +818,251 @@
+ vncClientCutText(str, len);
+ }
+
+-#ifdef RANDR
++extern RROutputPtr vncRandROutputCreate(ScreenPtr pScreen);
++
+ unsigned int XserverDesktop::setScreenLayout(int fb_width, int fb_height,
+ const rfb::ScreenSet& layout)
+ {
+- int i;
+- Bool ret;
+- RRScreenSizePtr pSize;
+- RROutputPtr output;
+- RRModePtr mode;
+-
+- // Make sure all RandR tables are properly populated
+-#if XORG == 15
+- ret = RRGetInfo(pScreen);
++#ifndef RANDR
++ return rfb::resultProhibited;
+ #else
+- ret = RRGetInfo(pScreen, FALSE);
+-#endif
+- if (!ret)
+- return resultNoResources;
++ int availableOutputs;
++ Bool ret;
+
+- // Register a new size, or get a reference to the existing one
+- pSize = RRRegisterSize(pScreen, fb_width, fb_height,
+- pScreen->mmWidth, pScreen->mmHeight);
+- if (!pSize) {
+- vlog.error("setScreenLayout: Could not get register new resolution");
+- return resultNoResources;
+- }
+- ret = RRRegisterRate(pScreen, pSize, 60);
+- if (!ret) {
+- vlog.error("setScreenLayout: Could not register a rate for the resolution");
+- return resultNoResources;
+- }
+-
+- // Then we have to call RRGetInfo again for it to copy the RandR
+- // 1.0 information to the 1.2 structures.
+-#if XORG == 15
+- ret = RRGetInfo(pScreen);
+-#else
+- ret = RRGetInfo(pScreen, FALSE);
+-#endif
+- if (!ret)
+- return resultNoResources;
++ rrScrPrivPtr rp = rrGetScrPriv(pScreen);
+
+- // Go via RandR to set the resolution in order for X11 notifications
+- // to be sent out properly. We currently only do RandR 1.0, but Xorg
+- // has dropped support for that API. So we have to emulate it via the
+- // same method ProcRRSetScreenConfig() uses.
+- //
+- // FIXME: This will cause setPixelBuffer() to be called, resulting in
+- // an unnecessary ExtendedDesktopSize to be sent.
+-
+- // We'll just reconfigure the first output
+- output = RRFirstOutput(pScreen);
+- if (!output) {
+- vlog.error("setScreenLayout: Could not get first output");
+- return resultNoResources;
+- }
+-
+- // Find first mode with matching size
+- mode = NULL;
+- for (i = 0;i < output->numModes;i++) {
+- if ((output->modes[i]->mode.width == fb_width) &&
+- (output->modes[i]->mode.height == fb_height)) {
+- mode = output->modes[i];
+- break;
++ /*
++ * First check that we don't have any active clone modes. That's just
++ * too messy to deal with.
++ */
++ for (int i = 0;i < rp->numCrtcs;i++) {
++ if (rp->crtcs[i]->numOutputs > 1) {
++ vlog.error("Clone mode active. Refusing to touch screen layout.");
++ return rfb::resultInvalid;
++ }
++ }
++
++ /*
++ * Next count how many useful outputs we have...
++ *
++ * This gets slightly complicated because we might need to hook a CRTC
++ * up to the output, but also check that we don't try to use the same
++ * CRTC for multiple outputs.
++ */
++ std::set<RRCrtcPtr> usedCrtcs;
++ availableOutputs = 0;
++ for (int i = 0;i < rp->numOutputs;i++) {
++ RROutputPtr output;
++
++ output = rp->outputs[i];
++
++ if (output->crtc != NULL)
++ availableOutputs++;
++ else {
++ for (int j = 0;j < output->numCrtcs;j++) {
++ if (output->crtcs[j]->numOutputs != 0)
++ continue;
++ if (usedCrtcs.count(output->crtcs[j]) != 0)
++ continue;
++
++ availableOutputs++;
++ usedCrtcs.insert(output->crtcs[j]);
++
++ break;
++ }
+ }
+ }
+- if (!mode) {
+- vlog.error("setScreenLayout: Could not find a matching mode");
+- return resultNoResources;
++
++ /* Try to create more outputs if needed... (only works on Xvnc) */
++ if (layout.num_screens() > availableOutputs) {
++ for (int i = 0;i < (layout.num_screens() - availableOutputs);i++) {
++ RROutputPtr output;
++ output = vncRandROutputCreate(pScreen);
++ if (output == NULL) {
++ vlog.error("Unable to create more screens, as needed by the new client layout.");
++ return rfb::resultInvalid;
++ }
++ }
+ }
+
+- // Adjust screen size
+- ret = RRScreenSizeSet(pScreen, fb_width, fb_height,
+- pScreen->mmWidth, pScreen->mmHeight);
+- if (!ret) {
+- vlog.error("setScreenLayout: Could not adjust screen size");
+- return resultNoResources;
++ /* First we might need to resize the screen */
++ if ((fb_width != pScreen->width) || (fb_height != pScreen->height)) {
++ /* Try to retain DPI when we resize */
++ ret = RRScreenSizeSet(pScreen, fb_width, fb_height,
++ pScreen->mmWidth * fb_width / pScreen->width,
++ pScreen->mmHeight * fb_height / pScreen->height);
++ if (!ret) {
++ vlog.error("Failed to resize screen to %dx%d", fb_width, fb_height);
++ return rfb::resultInvalid;
++ }
++ }
++
++ /* Next, reconfigure all known outputs, and turn off the other ones */
++ for (int i = 0;i < rp->numOutputs;i++) {
++ RROutputPtr output;
++ RRCrtcPtr crtc;
++ RRModePtr mode;
++
++ ScreenSet::const_iterator iter;
++
++ output = rp->outputs[i];
++ crtc = output->crtc;
++
++ /* Known? */
++ if (outputIdMap.count(output) == 0)
++ continue;
++
++ /* A known output should have a CRTC, but double check... */
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-ports-all
mailing list