aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Gabriel <mike.gabriel@das-netzwerkteam.de>2015-12-30 00:06:58 +0100
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2015-12-30 00:06:58 +0100
commit1391c0ad76cb1f8588a08f9350d2ba1fe98b8b6b (patch)
treec2d62e905a69bdbc787a6599b8b0f0e21fcdfe70
parente4763fb4879ce8782e50c784ed9e7d8c5a1b7322 (diff)
parentc4a388937baad8215f2650d746d3ddba4d4d1ee3 (diff)
downloadnx-libs-1391c0ad76cb1f8588a08f9350d2ba1fe98b8b6b.tar.gz
nx-libs-1391c0ad76cb1f8588a08f9350d2ba1fe98b8b6b.tar.bz2
nx-libs-1391c0ad76cb1f8588a08f9350d2ba1fe98b8b6b.zip
Merge branch 'sunweaver-pr/xinerama-xrandr' into 3.6.x
Attributes GH PR #66: https://github.com/ArcticaProject/nx-libs/pull/66
-rw-r--r--Makefile17
-rw-r--r--debian/control46
-rw-r--r--debian/libnx-xinerama-dev.install.in3
-rw-r--r--debian/libnx-xinerama1.install.in1
-rw-r--r--debian/libnx-xinerama1.symbols11
-rw-r--r--debian/nx-x11-common.install1
-rw-r--r--debian/nx-x11proto-xinerama-dev.install.in1
-rwxr-xr-xdebian/nxagent.postinst.in57
-rwxr-xr-xdebian/nxagent.prerm53
-rwxr-xr-xdebian/rules5
-rw-r--r--debian/x2goagent.install1
-rw-r--r--nx-X11/config/cf/X11.tmpl37
-rw-r--r--nx-X11/include/extensions/Imakefile4
-rw-r--r--nx-X11/lib/Imakefile4
-rw-r--r--nx-X11/lib/Xinerama/Imakefile30
-rw-r--r--nx-X11/lib/Xinerama/Xinerama-def.cpp14
-rw-r--r--nx-X11/lib/Xinerama/Xinerama.c361
-rw-r--r--nx-X11/programs/Xserver/Imakefile2
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Args.c31
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Events.c46
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Extensions.c38
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Imakefile4
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Options.c2
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Options.h11
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Reconnect.c2
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Screen.c543
-rw-r--r--nx-X11/programs/Xserver/include/globals.h1
-rw-r--r--nx-X11/programs/Xserver/os/utils.c1
-rw-r--r--nx-X11/programs/Xserver/randr/rrmode.c27
-rw-r--r--nx-libs.spec45
-rw-r--r--nxcomp/Misc.cpp1
-rw-r--r--x2goagent.features37
32 files changed, 697 insertions, 740 deletions
diff --git a/Makefile b/Makefile
index 2b5b4946a..c9a52ac02 100644
--- a/Makefile
+++ b/Makefile
@@ -17,6 +17,7 @@ USRLIBDIR ?= $(LIBDIR)
INCLUDEDIR ?= $(PREFIX)/include
NXLIBDIR ?= $(PREFIX)/lib/nx
X2GOLIBDIR ?= $(PREFIX)/lib/x2go
+X2GODATADIR ?= $(PREFIX)/share/x2go
CONFIGURE ?= ./configure
NX_VERSION_MAJOR=$(shell ./version.sh 1)
@@ -154,14 +155,6 @@ install-full:
"$$(string_rep "$$dirname" nx-X11/.build-exports/include "$(DESTDIR)$(INCLUDEDIR)/")"/ || true; \
done; \
- # Provide means for Xinerama support in NX/X2Go sessions. This
- # This also requires three post-install symlinks created by libnx-xinerama1:
- # $(DESTDIR)$(NXLIBDIR)/X11/Xinerama/libNX_X11.so.6 -> /usr/<libdir>/libX11.so.6
- # $(DESTDIR)$(NXLIBDIR)/X11/Xinerama/libNX_Xext.so.6 -> /usr/<libdir>/libXext.so.6
- # $(DESTDIR)$(NXLIBDIR)/X11/Xinerama/libXinerama.so.1 -> /usr/<libdir>/libNX_Xinerama.so.1
- # Only create the owned directory here for nx-x11-common.
- $(INSTALL_DIR) $(DESTDIR)$(NXLIBDIR)/X11/Xinerama
-
$(INSTALL_DIR) $(DESTDIR)/$(ETCDIR_NX)
$(INSTALL_DIR) $(DESTDIR)/$(ETCDIR_X2GO)
$(INSTALL_FILE) etc/keystrokes.cfg $(DESTDIR)/$(ETCDIR_NX)/
@@ -171,6 +164,10 @@ install-full:
$(INSTALL_FILE) etc/nxagent.keyboard $(DESTDIR)$(ETCDIR_NX)/
$(INSTALL_FILE) etc/x2goagent.keyboard $(DESTDIR)$(ETCDIR_X2GO)/
+ # x2goagent.features file for X2Go
+ $(INSTALL_DIR) $(DESTDIR)$(X2GODATADIR)/x2gofeature.d/
+ $(INSTALL_FILE) x2goagent.features $(DESTDIR)$(X2GODATADIR)/x2gofeature.d/
+
$(INSTALL_DIR) $(DESTDIR)$(PREFIX)/share/x2go
$(INSTALL_SYMLINK) $(ETCDIR_X2GO)/rgb $(DESTDIR)$(PREFIX)/share/x2go/rgb
@@ -199,6 +196,10 @@ uninstall-full:
$(RM_FILE) $(DESTDIR)$(X2GOLIBDIR)/bin/x2goagent
$(RM_DIR) $(DESTDIR)$(X2GOLIBDIR)/bin/
+ # x2goagent.features file for X2Go
+ $(RM_FILE) $(DESTDIR)$(X2GODATADIR)/x2gofeature.d/x2goagent.features
+ $(RM_DIR) $(DESTDIR)$(X2GODATADIR)/x2gofeature.d/
+
if test -d nx-X11; then \
if test -f nxcompext/Makefile; then ${MAKE} -C nxcompext $@; fi; \
if test -f nxcompshad/Makefile; then ${MAKE} -C nxcompshad $@; fi; \
diff --git a/debian/control b/debian/control
index 946dd4b2a..94aa64014 100644
--- a/debian/control
+++ b/debian/control
@@ -22,12 +22,11 @@ Build-Depends:
libxrandr-dev,
libxfixes-dev,
libxtst-dev,
+ libxinerama-dev,
autoconf,
pkg-config,
x11proto-core-dev,
expat,
-Build-Conflicts:
- x11proto-xinerama-dev,
Standards-Version: 3.9.6
Homepage: http://code.x2go.org/gitweb?p=nx-libs.git;a=summary
Vcs-Git: git://code.x2go.org/nx-libs.git
@@ -548,21 +547,17 @@ Multi-Arch: same
Pre-Depends:
${misc:Pre-Depends},
Depends:
- ${shlibs:Depends},
${misc:Depends},
-Breaks: nxlibs (<= 3.5.1),
- libnx-x11 (<< 2:3.5.0.29-0x2go2~),
Description: nx-X11 Xinerama extension library
NX is a software suite which implements very efficient
compression of the X11 protocol. This increases performance when
using X applications over a network, especially a slow one.
.
- libNX_Xinerama provides an X Window System client interface to the XINERAMA
- extension to the X protocol.
+ This package removes the obsoleted libNX_Xinerama.so.1 library.
+ Xinerama support in NX has been moved into nxagent whereas X-Clients
+ can now use the libXinerama library shipped with X.Org.
.
- The Xinerama (also known as panoramiX) extension allows for multiple screens
- attached to a single display to be treated as belonging together, and to give
- desktop applications a better idea of the monitor layout.
+ This package can be safely removed.
Package: libnx-xinerama-dev
Provides: libnx-xinerama1-dev
@@ -570,24 +565,16 @@ Section: libdevel
Architecture: any
Multi-Arch: same
Depends:
- libnx-xinerama1 (= ${binary:Version}),
- nx-x11proto-xinerama-dev (= ${binary:Version}),
${misc:Depends},
-Breaks: nxlibs (<= 3.5.1),
- libnx-x11-dev (<< 2:3.5.0.29-0x2go2~),
Description: nx-X11 Xinerama extension library (development headers)
NX is a software suite which implements very efficient
compression of the X11 protocol. This increases performance when
using X applications over a network, especially a slow one.
.
- libNX_Xinerama provides an X Window System client interface to the XINERAMA
- extension to the X protocol.
+ This package removes the obsoleted headers for the libNX_Xinerama.so.1
+ library.
.
- The Xinerama (also known as panoramiX) extension allows for multiple screens
- attached to a single display to be treated as belonging together, and to give
- desktop applications a better idea of the monitor layout.
- .
- This package contains the development headers for this library.
+ This package can be safely removed.
Package: nx-x11proto-xinerama-dev
Section: libdevel
@@ -595,16 +582,15 @@ Architecture: any
Multi-Arch: same
Depends:
${misc:Depends},
-Breaks: nxlibs (<= 3.5.1),
- libnx-x11-dev (<< 2:3.5.0.29-0x2go2~),
Description: nx-X11 Xinerama extension wire protocol
NX is a software suite which implements very efficient
compression of the X11 protocol. This increases performance when
using X applications over a network, especially a slow one.
.
- This package provides development headers describing the wire protocol
- for the XINERAMA extension, used to use and manage a multiple-screen
- display.
+ This package removes the obsoleted headers for the libNX_Xinerama.so.1
+ library.
+ .
+ This package can be safely removed.
Package: libnx-xinerama1-dbg
Architecture: any
@@ -624,12 +610,10 @@ Description: nx-X11 Xinerama extension library (debug package)
libNX_Xinerama provides an X Window System client interface to the XINERAMA
extension to the X protocol.
.
- The Xinerama (also known as panoramiX) extension allows for multiple
- screens attached to a single display to be treated as belonging
- together, and to give desktop applications a better idea of the monitor
- layout.
+ This package removes the obsoleted debug symbols for the libNX_Xinerama.so.1
+ library.
.
- This package contains debug symbols for this library.
+ This package can be safely removed.
Package: libnx-xpm4
Architecture: any
diff --git a/debian/libnx-xinerama-dev.install.in b/debian/libnx-xinerama-dev.install.in
deleted file mode 100644
index 59c0456aa..000000000
--- a/debian/libnx-xinerama-dev.install.in
+++ /dev/null
@@ -1,3 +0,0 @@
-usr/lib/*/libNX_Xinerama.so
-usr/include/*/nx-X11/extensions/Xinerama.h
-usr/include/*/nx-X11/extensions/panoramiXext.h
diff --git a/debian/libnx-xinerama1.install.in b/debian/libnx-xinerama1.install.in
deleted file mode 100644
index d53de9c4f..000000000
--- a/debian/libnx-xinerama1.install.in
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib/*/libNX_Xinerama.so.*
diff --git a/debian/libnx-xinerama1.symbols b/debian/libnx-xinerama1.symbols
deleted file mode 100644
index f8f73a3fd..000000000
--- a/debian/libnx-xinerama1.symbols
+++ /dev/null
@@ -1,11 +0,0 @@
-libNX_Xinerama.so.1 libnx-xinerama1 #MINVER#
- XPanoramiXAllocInfo@Base 3.5.0.29
- XPanoramiXGetScreenCount@Base 3.5.0.29
- XPanoramiXGetScreenSize@Base 3.5.0.29
- XPanoramiXGetState@Base 3.5.0.29
- XPanoramiXQueryExtension@Base 3.5.0.29
- XPanoramiXQueryVersion@Base 3.5.0.29
- XineramaIsActive@Base 3.5.0.29
- XineramaQueryExtension@Base 3.5.0.29
- XineramaQueryScreens@Base 3.5.0.29
- XineramaQueryVersion@Base 3.5.0.29
diff --git a/debian/nx-x11-common.install b/debian/nx-x11-common.install
index 1131e7291..b6fc46613 100644
--- a/debian/nx-x11-common.install
+++ b/debian/nx-x11-common.install
@@ -1,2 +1 @@
usr/share/nx/SecurityPolicy
-usr/lib/nx/X11/
diff --git a/debian/nx-x11proto-xinerama-dev.install.in b/debian/nx-x11proto-xinerama-dev.install.in
deleted file mode 100644
index dca06ddee..000000000
--- a/debian/nx-x11proto-xinerama-dev.install.in
+++ /dev/null
@@ -1 +0,0 @@
-usr/include/*/nx-X11/extensions/panoramiXproto.h \ No newline at end of file
diff --git a/debian/nxagent.postinst.in b/debian/nxagent.postinst.in
deleted file mode 100755
index 95879b943..000000000
--- a/debian/nxagent.postinst.in
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/sh
-# postinst script for nxagent
-#
-# see: dh_installdeb(1)
-
-set -e
-
-# summary of how this script can be called:
-# * <postinst> `configure' <most-recently-configured-version>
-# * <old-postinst> `abort-upgrade' <new version>
-# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
-# <new-version>
-# * <postinst> `abort-remove'
-# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
-# <failed-install-package> <version> `removing'
-# <conflicting-package> <version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-
-case "$1" in
- configure)
- ### FIXME: this is a work-around while we have not implemented
- ### multiarch support into the Debian source package of
- ### nx-libs.
-
- libdir=/usr/lib/#DEB_BUILD_MULTIARCH#
-
- mkdir -p /usr/lib/nx/X11/Xinerama/
- # Already existent files are not removed.
- # Users will need to explicitly remove them and (re-) configure this package.
- if test -e $libdir/libX11.so.6; then
- ln -sf $libdir/libX11.so.6 /usr/lib/nx/X11/Xinerama/libNX_X11.so.6
- fi
- if test -e $libdir/libXext.so.6; then
- ln -sf $libdir/libXext.so.6 /usr/lib/nx/X11/Xinerama/libNX_Xext.so.6
- fi
- if test -e $libdir/libNX_Xinerama.so.1; then
- ln -sf $libdir/libNX_Xinerama.so.1 /usr/lib/nx/X11/Xinerama/libXinerama.so.1
- fi
- ;;
-
- abort-upgrade|abort-remove|abort-deconfigure)
- ;;
-
- *)
- echo "postinst called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/nxagent.prerm b/debian/nxagent.prerm
deleted file mode 100755
index 019284a16..000000000
--- a/debian/nxagent.prerm
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/sh
-# prerm script for nxagent
-#
-# see: dh_installdeb(1)
-# summary of how this script can be called:
-# * <prerm> `remove'
-# * <old-prerm> `upgrade' <new-version>
-# * <new-prerm> `failed-upgrade' <old-version>
-# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
-# * <deconfigured's-prerm> `deconfigure' `in-favour'
-# <package-being-installed> <version> `removing'
-# <conflicting-package> <version>
-# for details, see http://www.debian.org/doc/debian-policy/ or
-# the debian-policy package
-
-set -e
-
-
-
-case "$1" in
- remove)
- if test -d /usr/lib/nx/X11/Xinerama; then
- if test -e /usr/lib/nx/X11/Xinerama/libNX_X11.so.6; then
- rm -f /usr/lib/nx/X11/Xinerama/libNX_X11.so.6
- fi
-
- if test -e /usr/lib/nx/X11/Xinerama/libNX_Xext.so.6; then
- rm -f /usr/lib/nx/X11/Xinerama/libNX_Xext.so.6
- fi
-
- if test -e /usr/lib/nx/X11/Xinerama/libXinerama.so.1; then
- rm -f /usr/lib/nx/X11/Xinerama/libXinerama.so.1
- fi
-
- rmdir --ignore-fail-on-non-empty /usr/lib/nx/X11/Xinerama
-
- fi
- ;;
- deconfigure|upgrade|failed-upgrade)
- :
- ;;
- *)
- echo "prerm called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-# dh_installdeb will replace this with shell code automatically
-# generated by other debhelper scripts.
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/rules b/debian/rules
index 729a2c6f4..c90bb6451 100755
--- a/debian/rules
+++ b/debian/rules
@@ -20,7 +20,6 @@ override_dh_auto_clean:
override_dh_clean:
rm -f nx*/configure
. ./replace.sh; set -x; ls debian/*.install.in | while read file; do rm -f $$(string_rep $$file .install.in .install); done
- rm -f debian/nxagent.postinst
rm -fR .preserve/
dh_clean
@@ -72,16 +71,12 @@ override_dh_auto_install:
override_dh_auto_build:
- # let's prep the nxagent.postinst script with the value of the build systems's DEB_BUILD_MULTIARCH variable
- sed debian/nxagent.postinst.in -e 's/#DEB_BUILD_MULTIARCH#/$(DEB_BUILD_MULTIARCH)/' > debian/nxagent.postinst
-
LOCAL_LDFLAGS="$(LDFLAGS)" SHLIBGLOBALSFLAGS="$(LDFLAGS)" SHLIBDIR="$(LIBDIR)" PREFIX=/usr dh_auto_build --parallel
override_dh_strip:
dh_strip -plibnx-x11-6 --dbg-package=libnx-x11-6-dbg
dh_strip -plibnx-xau6 --dbg-package=libnx-xau6-dbg
dh_strip -plibnx-xext6 --dbg-package=libnx-xext6-dbg
- dh_strip -plibnx-xinerama1 --dbg-package=libnx-xinerama1-dbg
dh_strip -plibnx-xrender1 --dbg-package=libnx-xrender1-dbg
dh_strip -plibxcomp3 --dbg-package=libxcomp3-dbg
dh_strip -plibxcompshad3 --dbg-package=libxcompshad3-dbg
diff --git a/debian/x2goagent.install b/debian/x2goagent.install
index 9ef17d9c6..0603507ef 100644
--- a/debian/x2goagent.install
+++ b/debian/x2goagent.install
@@ -5,5 +5,6 @@ usr/share/x2go/rgb
usr/share/man/man1/x2goagent.1*
etc/x2go/rgb
usr/share/x2go/versions/VERSION.x2goagent
+usr/share/x2go/x2gofeature.d/x2goagent.features
etc/x2go/keystrokes.cfg
etc/x2go/x2goagent.keyboard
diff --git a/nx-X11/config/cf/X11.tmpl b/nx-X11/config/cf/X11.tmpl
index af466b47f..3e7423040 100644
--- a/nx-X11/config/cf/X11.tmpl
+++ b/nx-X11/config/cf/X11.tmpl
@@ -226,9 +226,6 @@ XORGRELSTRING = XorgManVersionString
#ifndef BuildXinerama
#define BuildXinerama NO
#endif
-#ifndef BuildXineramaLibrary
-#define BuildXineramaLibrary (BuildXinerama)
-#endif
#ifndef BuildXCSecurity
#define BuildXCSecurity YES
#endif
@@ -1321,30 +1318,6 @@ ProjectUnsharedLibReferences(XONLY,NX_X11,$(XLIBSRC),XBuildLibDir)
XLIBONLY = $(XONLYLIB)
LINTXONLYLIB = $(LINTXONLY)
-#if BuildXineramaLibrary
-#ifndef SharedLibXinerama
-#define SharedLibXinerama HasSharedLibraries
-#endif
-#ifndef NormalLibXinerama
-#define NormalLibXinerama (!SharedLibXinerama || ForceNormalLib)
-#endif
-#ifndef DebugLibXinerama
-#define DebugLibXinerama NO
-#endif
-#ifndef ProfileLibXinerama
-#define ProfileLibXinerama NO
-#endif
-#else
-#undef SharedLibXinerama
-#define SharedLibXinerama NO
-#undef NormalLibXinerama
-#define NormalLibXinerama NO
-#undef DebugLibXinerama
-#define DebugLibXinerama NO
-#undef ProfileLibXinerama
-#define ProfileLibXinerama NO
-#endif
-
#if BuildRenderLibrary
#ifndef SharedLibXrender
#define SharedLibXrender HasSharedLibraries
@@ -1395,16 +1368,6 @@ LINTEXTENSIONLIB = $(LINTEXTENSION)
XLIB = $(EXTENSIONLIB) $(XONLYLIB)
LINTXLIB = $(LINTXONLYLIB)
- XINERAMALIBSRC = $(LIBSRC)/Xinerama
-#if SharedLibXinerama
-#ifndef SharedXineramaRev
-#define SharedXineramaRev 1.0
-#endif
-SharedLibReferences(XINERAMA,NX_Xinerama,$(XINERAMALIBSRC),SOXINERAMAREV,SharedXineramaRev)
-#else
-ProjectUnsharedLibReferences(XINERAMA,NX_Xinerama,$(XINERAMALIBSRC),XBuildLibDir)
-#endif
-
XRENDERLIBSRC = $(LIBSRC)/Xrender
#if SharedLibXrender
#ifndef SharedXrenderRev
diff --git a/nx-X11/include/extensions/Imakefile b/nx-X11/include/extensions/Imakefile
index 33e854058..eb7763535 100644
--- a/nx-X11/include/extensions/Imakefile
+++ b/nx-X11/include/extensions/Imakefile
@@ -35,8 +35,8 @@ XVMCHEADERS = XvMC.h XvMClib.h XvMCproto.h vldXvMC.h
#if BuildFontCache
FONTCACHEHEADERS = fontcache.h fontcacheP.h fontcachstr.h
#endif
-#if BuildXinerama || BuildXineramaLibrary
-XINERAMAHEADERS = Xinerama.h panoramiXext.h panoramiXproto.h
+#if BuildXinerama
+XINERAMAHEADERS = panoramiXext.h panoramiXproto.h
#endif
#if BuildRandR
RANDRHEADERS = randr.h randrproto.h
diff --git a/nx-X11/lib/Imakefile b/nx-X11/lib/Imakefile
index b97ef6b22..dbe4e4280 100644
--- a/nx-X11/lib/Imakefile
+++ b/nx-X11/lib/Imakefile
@@ -15,10 +15,6 @@ NULL =
XKBLIBDIR = xkbfile
#endif
-#if BuildXineramaLibrary
-XINERAMADIR=Xinerama
-#endif
-
#if BuildRenderLibrary
RENDERLIBDIR = Xrender
#endif
diff --git a/nx-X11/lib/Xinerama/Imakefile b/nx-X11/lib/Xinerama/Imakefile
deleted file mode 100644
index 910f98da6..000000000
--- a/nx-X11/lib/Xinerama/Imakefile
+++ /dev/null
@@ -1,30 +0,0 @@
-XCOMM $XFree86: xc/lib/Xinerama/Imakefile,v 1.4 2002/10/16 00:37:31 dawes Exp $
-
-#define DoNormalLib NormalLibXinerama
-#define DoSharedLib SharedLibXinerama
-#define DoDebugLib DebugLibXinerama
-#define DoProfileLib ProfileLibXinerama
-#define LibName NX_Xinerama
-#define SoRev SOXINERAMAREV
-#define LibHeaders NO
-
-#include <Threads.tmpl>
-
-#ifdef SharedXineramaReqs
-REQUIREDLIBS = SharedXineramaReqs
-#endif
-
-#if Malloc0ReturnsNull
-ALLOC_DEFINES = -DMALLOC_0_RETURNS_NULL
-#endif
-
- DEFINES = $(ALLOC_DEFINES)
- SRCS = Xinerama.c
- OBJS = Xinerama.o
- LINTLIBS = $(LINTXLIB)
-
-#define IncludeSharedObjectInNormalLib
-
-#include <Library.tmpl>
-
-DependTarget()
diff --git a/nx-X11/lib/Xinerama/Xinerama-def.cpp b/nx-X11/lib/Xinerama/Xinerama-def.cpp
deleted file mode 100644
index 01449d15b..000000000
--- a/nx-X11/lib/Xinerama/Xinerama-def.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-LIBRARY Xinerama
-VERSION LIBRARY_VERSION
-EXPORTS
- XPanoramiXAllocInfo
- XPanoramiXGetScreenCount
- XPanoramiXGetScreenSize
- XPanoramiXGetState
- XPanoramiXQueryExtension
- XPanoramiXQueryVersion
- XineramaIsActive
- XineramaQueryExtension
- XineramaQueryScreens
- XineramaQueryVersion
-/* $XFree86$ */
diff --git a/nx-X11/lib/Xinerama/Xinerama.c b/nx-X11/lib/Xinerama/Xinerama.c
deleted file mode 100644
index 0256336be..000000000
--- a/nx-X11/lib/Xinerama/Xinerama.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/* $Xorg: XPanoramiX.c,v 1.4 2000/08/17 19:45:51 cpqbld Exp $ */
-/*****************************************************************
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-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
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL 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.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-******************************************************************/
-/* $XFree86: xc/lib/Xinerama/Xinerama.c,v 1.2 2001/07/23 17:20:28 dawes Exp $ */
-
-#define NEED_EVENTS
-#define NEED_REPLIES
-#include <nx-X11/Xlibint.h>
-#include <nx-X11/Xutil.h>
-#include <nx-X11/extensions/Xext.h>
-#include <nx-X11/extensions/extutil.h>
-#include <nx-X11/extensions/panoramiXext.h>
-#include <nx-X11/extensions/panoramiXproto.h>
-#include <nx-X11/extensions/Xinerama.h>
-#include <stdio.h>
-
-static XExtensionInfo _panoramiX_ext_info_data;
-static XExtensionInfo *panoramiX_ext_info = &_panoramiX_ext_info_data;
-static /* const */ char *panoramiX_extension_name = PANORAMIX_PROTOCOL_NAME;
-
-#define PanoramiXCheckExtension(dpy,i,val) \
- XextCheckExtension (dpy, i, panoramiX_extension_name, val)
-#define PanoramiXSimpleCheckExtension(dpy,i) \
- XextSimpleCheckExtension (dpy, i, panoramiX_extension_name)
-
-static int close_display();
-static /* const */ XExtensionHooks panoramiX_extension_hooks = {
- NULL, /* create_gc */
- NULL, /* copy_gc */
- NULL, /* flush_gc */
- NULL, /* free_gc */
- NULL, /* create_font */
- NULL, /* free_font */
- close_display, /* close_display */
- NULL, /* wire_to_event */
- NULL, /* event_to_wire */
- NULL, /* error */
- NULL, /* error_string */
-};
-
-static XEXT_GENERATE_FIND_DISPLAY (find_display, panoramiX_ext_info,
- panoramiX_extension_name,
- &panoramiX_extension_hooks,
- 0, NULL)
-
-static XEXT_GENERATE_CLOSE_DISPLAY (close_display, panoramiX_ext_info)
-
-
-
-/****************************************************************************
- * *
- * PanoramiX public interfaces *
- * *
- ****************************************************************************/
-
-Bool XPanoramiXQueryExtension (
- Display *dpy,
- int *event_basep,
- int *error_basep
-)
-{
- XExtDisplayInfo *info = find_display (dpy);
-
- if (XextHasExtension(info)) {
- *event_basep = info->codes->first_event;
- *error_basep = info->codes->first_error;
- return True;
- } else {
- return False;
- }
-}
-
-
-Status XPanoramiXQueryVersion(
- Display *dpy,
- int *major_versionp,
- int *minor_versionp
-)
-{
- XExtDisplayInfo *info = find_display (dpy);
- xPanoramiXQueryVersionReply rep;
- register xPanoramiXQueryVersionReq *req;
-
- PanoramiXCheckExtension (dpy, info, 0);
-
- LockDisplay (dpy);
- GetReq (PanoramiXQueryVersion, req);
- req->reqType = info->codes->major_opcode;
- req->panoramiXReqType = X_PanoramiXQueryVersion;
- req->clientMajor = PANORAMIX_MAJOR_VERSION;
- req->clientMinor = PANORAMIX_MINOR_VERSION;
- if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
- UnlockDisplay (dpy);
- SyncHandle ();
- return 0;
- }
- *major_versionp = rep.majorVersion;
- *minor_versionp = rep.minorVersion;
- UnlockDisplay (dpy);
- SyncHandle ();
- return 1;
-}
-
-XPanoramiXInfo *XPanoramiXAllocInfo(void)
-{
- return (XPanoramiXInfo *) Xmalloc (sizeof (XPanoramiXInfo));
-}
-
-Status XPanoramiXGetState (
- Display *dpy,
- Drawable drawable,
- XPanoramiXInfo *panoramiX_info
-)
-{
- XExtDisplayInfo *info = find_display (dpy);
- xPanoramiXGetStateReply rep;
- register xPanoramiXGetStateReq *req;
-
- PanoramiXCheckExtension (dpy, info, 0);
-
- LockDisplay (dpy);
- GetReq (PanoramiXGetState, req);
- req->reqType = info->codes->major_opcode;
- req->panoramiXReqType = X_PanoramiXGetState;
- req->window = drawable;
- if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
- UnlockDisplay (dpy);
- SyncHandle ();
- return 0;
- }
- UnlockDisplay (dpy);
- SyncHandle ();
- panoramiX_info->window = rep.window;
- panoramiX_info->State = rep.state;
- return 1;
-}
-
-Status XPanoramiXGetScreenCount (
- Display *dpy,
- Drawable drawable,
- XPanoramiXInfo *panoramiX_info
-)
-{
- XExtDisplayInfo *info = find_display (dpy);
- xPanoramiXGetScreenCountReply rep;
- register xPanoramiXGetScreenCountReq *req;
-
- PanoramiXCheckExtension (dpy, info, 0);
-
- LockDisplay (dpy);
- GetReq (PanoramiXGetScreenCount, req);
- req->reqType = info->codes->major_opcode;
- req->panoramiXReqType = X_PanoramiXGetScreenCount;
- req->window = drawable;
- if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
- UnlockDisplay (dpy);
- SyncHandle ();
- return 0;
- }
- UnlockDisplay (dpy);
- SyncHandle ();
- panoramiX_info->window = rep.window;
- panoramiX_info->ScreenCount = rep.ScreenCount;
- return 1;
-}
-
-Status XPanoramiXGetScreenSize (
- Display *dpy,
- Drawable drawable,
- int screen_num,
- XPanoramiXInfo *panoramiX_info
-)
-{
- XExtDisplayInfo *info = find_display (dpy);
- xPanoramiXGetScreenSizeReply rep;
- register xPanoramiXGetScreenSizeReq *req;
-
- PanoramiXCheckExtension (dpy, info, 0);
-
- LockDisplay (dpy);
- GetReq (PanoramiXGetScreenSize, req);
- req->reqType = info->codes->major_opcode;
- req->panoramiXReqType = X_PanoramiXGetScreenSize;
- req->window = drawable;
- req->screen = screen_num; /* need to define */
- if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
- UnlockDisplay (dpy);
- SyncHandle ();
- return 0;
- }
- UnlockDisplay (dpy);
- SyncHandle ();
- panoramiX_info->window = rep.window;
- panoramiX_info->screen = rep.screen;
- panoramiX_info->width = rep.width;
- panoramiX_info->height = rep.height;
- return 1;
-}
-
-/*******************************************************************\
- Alternate interface to make up for shortcomings in the original,
- namely, the omission of the screen origin. The new interface is
- in the "Xinerama" namespace instead of "PanoramiX".
-\*******************************************************************/
-
-Bool XineramaQueryExtension (
- Display *dpy,
- int *event_base,
- int *error_base
-)
-{
- return XPanoramiXQueryExtension(dpy, event_base, error_base);
-}
-
-Status XineramaQueryVersion(
- Display *dpy,
- int *major,
- int *minor
-)
-{
- return XPanoramiXQueryVersion(dpy, major, minor);
-}
-
-Bool XineramaIsActive(Display *dpy)
-{
- xXineramaIsActiveReply rep;
- xXineramaIsActiveReq *req;
- XExtDisplayInfo *info = find_display (dpy);
-
-
- FILE* fptr;
- if((fptr=fopen(getenv("NX_XINERAMA_CONF"),"r"))!=NULL) {
- fclose (fptr);
- return True;
- }
- else {
- return False;
- }
-
- if(!XextHasExtension(info))
- return False; /* server doesn't even have the extension */
-
- LockDisplay (dpy);
- GetReq (XineramaIsActive, req);
- req->reqType = info->codes->major_opcode;
- req->panoramiXReqType = X_XineramaIsActive;
- if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
- UnlockDisplay (dpy);
- SyncHandle ();
- return False;
- }
- UnlockDisplay (dpy);
- SyncHandle ();
- return rep.state;
-}
-
-
-XineramaScreenInfo *
-XineramaQueryScreens(
- Display *dpy,
- int *number
-)
-{
- XExtDisplayInfo *info = find_display (dpy);
- xXineramaQueryScreensReply rep;
- xXineramaQueryScreensReq *req;
- XineramaScreenInfo *scrnInfo = NULL;
-
- int i;
- int x,y,w,h;
- FILE* fptr;
- if((fptr=fopen(getenv("NX_XINERAMA_CONF"),"r"))==NULL) {
- PanoramiXCheckExtension (dpy, info, 0);
- LockDisplay (dpy);
- GetReq (XineramaQueryScreens, req);
- req->reqType = info->codes->major_opcode;
- req->panoramiXReqType = X_XineramaQueryScreens;
- if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
- UnlockDisplay (dpy);
- SyncHandle ();
- return NULL;
- }
- if(rep.number) {
- if((scrnInfo = Xmalloc(sizeof(XineramaScreenInfo) * rep.number))) {
- xXineramaScreenInfo scratch;
- int i;
-
- for(i = 0; i < rep.number; i++) {
- _XRead(dpy, (char*)(&scratch), sz_XineramaScreenInfo);
- scrnInfo[i].screen_number = i;
- scrnInfo[i].x_org = scratch.x_org;
- scrnInfo[i].y_org = scratch.y_org;
- scrnInfo[i].width = scratch.width;
- scrnInfo[i].height = scratch.height;
- }
-
- *number = rep.number;
- } else {
- _XEatData(dpy, rep.length << 2);
- }
- }
-
- UnlockDisplay (dpy);
- SyncHandle ();
-
- } else {
-
- i=0;
- while(!feof(fptr)) {
- w=h=0;
- fscanf(fptr,"%d %d %d %d",&x,&y,&w,&h);
- if(w&&h)
- i++;
- }
- rewind(fptr);
- *number=i;
- if((scrnInfo = Xmalloc(sizeof(XineramaScreenInfo) * i))) {
- i=0;
- while(!feof(fptr)){
- w=h=0;
- fscanf(fptr,"%d %d %d %d",&x,&y,&w,&h);
- if(w&&h){
- scrnInfo[i].screen_number=i;
- scrnInfo[i].x_org=x;
- scrnInfo[i].y_org=y;
- scrnInfo[i].width=w;
- scrnInfo[i].height=h;
- i++;
- }
- }
- }
- fclose(fptr);
- }
-
- return scrnInfo;
-}
-
-
-
diff --git a/nx-X11/programs/Xserver/Imakefile b/nx-X11/programs/Xserver/Imakefile
index 309d5d98f..d034c2672 100644
--- a/nx-X11/programs/Xserver/Imakefile
+++ b/nx-X11/programs/Xserver/Imakefile
@@ -413,7 +413,7 @@ NXAGENTNXLIBS = -L ../../../nxcomp -L ../../../nxcompext \
#else
NXAGENTNXLIBS = -L ../../../nxcomp -L ../../../nxcompext -L ../../../nxcompshad \
-lXcomp -lXcompext -lXcompshad -lNX_Xrender -lNX_X11 -lNX_Xext -lXfixes -lXfont \
- -L../../../nx-X11/exports/lib -lXtst -lXrandr -lXcomposite -lNX_Xinerama -lXdmcp \
+ -L../../../nx-X11/exports/lib -lXtst -lXrandr -lXcomposite -lXinerama -lXdmcp \
`pkg-config --libs libxml-2.0`
#endif
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c
index 5c5a1e8f8..309f08d0e 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Args.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c
@@ -42,6 +42,7 @@ is" without express or implied warranty.
#include "screenint.h"
#include "input.h"
#include "misc.h"
+#include "globals.h"
#include "scrnintstr.h"
#include "dixstruct.h"
#include "servermd.h"
@@ -1202,6 +1203,36 @@ static void nxagentParseOptions(char *name, char *value)
return;
}
+ else if (!strcmp(name, "xinerama"))
+ {
+#ifdef PANORAMIX
+ if (!PanoramiXExtensionDisabledHack)
+ {
+ if (!strcmp(value, "1"))
+ {
+ nxagentChangeOption(Xinerama, 1);
+ }
+ else if (!strcmp(value, "0"))
+ {
+ nxagentChangeOption(Xinerama, 0);
+ }
+ else
+ {
+ fprintf(stderr, "Warning: Ignoring bad value '%s' for option 'xinerama'.\n",
+ validateString(value));
+ }
+ }
+ else
+ {
+ nxagentChangeOption(Xinerama, 0);
+ fprintf(stderr, "Warning: Xinerama extension has been disabled via -disablexineramaextension cmdline switch.\n");
+ }
+#else
+ nxagentChangeOption(Xinerama, 0);
+ fprintf(stderr, "Warning: No Xinerama support compiled into nxagent.\n")
+#endif /* of PANORAMIX */
+ return;
+ }
else if (!strcmp(name, "resize"))
{
if (nxagentOption(DesktopResize) == 0 || strcmp(value, "0") == 0)
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c
index 9f7d6280f..c04481c92 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Events.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c
@@ -568,6 +568,10 @@ void nxagentSwitchResizeMode(ScreenPtr pScreen)
{
XSizeHints sizeHints;
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentSwitchResizeMode called.\n");
+ #endif
+
int desktopResize = nxagentOption(DesktopResize);
nxagentChangeOption(DesktopResize, !desktopResize);
@@ -3366,7 +3370,9 @@ int nxagentHandleConfigureNotify(XEvent* X)
if (nxagentOption(DesktopResize) == 1)
{
if (nxagentOption(Width) != X -> xconfigure.width ||
- nxagentOption(Height) != X -> xconfigure.height)
+ nxagentOption(Height) != X -> xconfigure.height ||
+ nxagentOption(X) != X -> xconfigure.x ||
+ nxagentOption(Y) != X -> xconfigure.y)
{
Bool newEvents = False;
@@ -3423,11 +3429,16 @@ int nxagentHandleConfigureNotify(XEvent* X)
nxagentMoveViewport(pScreen, 0, 0);
+ /* if in shadowing mode or if neither size nor position have
+ changed we do not need to adjust RandR */
+ /* FIXME: Comment makes no sense */
if (nxagentOption(Shadow) == 1 ||
(nxagentOption(Width) == nxagentOption(RootWidth) &&
- nxagentOption(Height) == nxagentOption(RootHeight)))
+ nxagentOption(Height) == nxagentOption(RootHeight) &&
+ nxagentOption(X) == nxagentOption(RootX) &&
+ nxagentOption(Y) == nxagentOption(RootY)))
{
- doRandR = 0;
+ doRandR = False;
}
nxagentChangeOption(Width, X -> xconfigure.width);
@@ -3466,12 +3477,31 @@ int nxagentHandleConfigureNotify(XEvent* X)
#endif
nxagentChangeScreenConfig(0, nxagentOption(Width),
- nxagentOption(Height), 0, 0);
+ nxagentOption(Height), 0, 0);
}
}
return 1;
}
+ else
+ {
+ if ( (X -> xconfigure.window == DefaultRootWindow(nxagentDisplay)) || nxagentFullscreenWindow )
+ {
+ #ifdef TEST
+ fprintf(stderr, "nxagentHandleConfigureNotify: remote root window has changed: %d,%d %dx%d\n", X -> xconfigure.x, X -> xconfigure.y, X -> xconfigure.width, X -> xconfigure.height);
+ #endif
+
+ nxagentChangeOption(RootX, X -> xconfigure.x);
+ nxagentChangeOption(RootY, X -> xconfigure.y);
+ nxagentChangeOption(RootWidth, X -> xconfigure.width);
+ nxagentChangeOption(RootHeight, X -> xconfigure.height);
+
+ nxagentChangeScreenConfig(0, nxagentOption(Width),
+ nxagentOption(Height), 0, 0);
+
+ return 1;
+ }
+ }
}
return 0;
@@ -4416,6 +4446,10 @@ int nxagentHandleRRScreenChangeNotify(XEvent *X)
{
XRRScreenChangeNotifyEvent *Xr;
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentHandleRRScreenChangeNotify called.\n");
+ #endif
+
Xr = (XRRScreenChangeNotifyEvent *) X;
nxagentResizeScreen(screenInfo.screens[DefaultScreen(nxagentDisplay)], Xr -> width, Xr -> height,
@@ -4504,6 +4538,10 @@ int nxagentWaitEvents(Display *dpy, struct timeval *tm)
{
XEvent ev;
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentWaitEvents called.\n");
+ #endif
+
NXFlushDisplay(dpy, NXFlushLink);
/*
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Extensions.c b/nx-X11/programs/Xserver/hw/nxagent/Extensions.c
index 6dce644ae..d77d27674 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Extensions.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Extensions.c
@@ -35,6 +35,13 @@ static int nxagentRandRScreenSetSize(ScreenPtr pScreen, CARD16 width,
static int nxagentRandRInitSizes(ScreenPtr pScreen);
+#if RANDR_12_INTERFACE
+static Bool nxagentRandRCrtcSet (ScreenPtr pScreen, RRCrtcPtr crtc,
+ RRModePtr mode, int x, int y,
+ Rotation rotation, int numOutputs,
+ RROutputPtr *outputs);
+#endif
+
#ifdef __DARWIN__
void DarwinHandleGUI(int argc, char *argv[])
@@ -83,6 +90,8 @@ void nxagentInitRandRExtension(ScreenPtr pScreen)
fprintf(stderr, "Warning: Failed to initialize the RandR extension.\n");
}
+
+ /* FIXME: do we need this at all with the new rand/xinerama stuff? */
nxagentRandRInitSizes(pScreen);
/*
@@ -97,6 +106,7 @@ void nxagentInitRandRExtension(ScreenPtr pScreen)
#if RANDR_12_INTERFACE
pRandRScrPriv -> rrScreenSetSize = nxagentRandRScreenSetSize;
+ pRandRScrPriv -> rrCrtcSet = nxagentRandRCrtcSet;
#endif
#if RANDR_10_INTERFACE
@@ -104,6 +114,34 @@ void nxagentInitRandRExtension(ScreenPtr pScreen)
#endif
}
+void
+RRResetProc (ExtensionEntry *extEntry)
+{
+ fprintf(stderr, "RANDR going down - NX version\n");
+}
+
+
+
+#if RANDR_12_INTERFACE
+/*
+ * Request that the Crtc be reconfigured
+ */
+
+static Bool
+nxagentRandRCrtcSet (ScreenPtr pScreen,
+ RRCrtcPtr crtc,
+ RRModePtr mode,
+ int x,
+ int y,
+ Rotation rotation,
+ int numOutputs,
+ RROutputPtr *outputs)
+{
+ return RRCrtcNotify(crtc, mode, x, y, rotation, numOutputs, outputs);
+}
+#endif
+
+
int nxagentRandRGetInfo(ScreenPtr pScreen, Rotation *pRotations)
{
/*
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Imakefile b/nx-X11/programs/Xserver/hw/nxagent/Imakefile
index 794864cf3..160d01e60 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Imakefile
+++ b/nx-X11/programs/Xserver/hw/nxagent/Imakefile
@@ -179,7 +179,8 @@ INCLUDES = -I. -I$(XBUILDINCDIR) \
# NXAGENT_CLIPBOARD Enables clipboard cut and paste function between X servers.
# NXAGENT_FONTEXCLUDE Exclude some specific font names (only "-ult1mo" at this moment).
# NXAGENT FULLSCREEN Fullscreen mode
-#
+# NXAGENT_RANDR_MODE_PREFIX Use prefixed (i.e., nx_<x>x<y>) RandR modes
+# NXAGENT_RANDR_XINERAMA_CLIPPING cut off invisible window parts in xinerama mode (you probably do not want this)
#if nxVersion
NX_DEFINES=-DNX_VERSION_CURRENT="$(NX_VERSION_CURRENT)" \
@@ -203,6 +204,7 @@ DEFINES = -g $(OS_DEFINES) $(EXT_DEFINES) $(NX_DEFINES) \
-DNXAGENT_ONSTART \
-DNXAGENT_SPLASH \
-DNXAGENT_ARTSD \
+ -DNXAGENT_RANDR_MODE_PREFIX \
-UNX_DEBUG_INPUT \
-DRANDR_10_INTERFACE \
-DRANDR_12_INTERFACE \
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Options.c b/nx-X11/programs/Xserver/hw/nxagent/Options.c
index 7eac3d8a2..dbe200273 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Options.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Options.c
@@ -154,6 +154,8 @@ void nxagentInitOptions()
nxagentOptions.CopyBufferSize = COPY_UNLIMITED;
nxagentOptions.ImageRateLimit = 0;
+
+ nxagentOptions.Xinerama = 0;
}
/*
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Options.h b/nx-X11/programs/Xserver/hw/nxagent/Options.h
index 0e4869926..5bf1597d5 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Options.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Options.h
@@ -388,6 +388,17 @@ typedef struct _AgentOptions
int NoRootlessExit;
+ /*
+ * Store if the user wants Xinerama. There's a variable called
+ * noPanoramiXExtension in os/utils.c but we cannot rely on that
+ * because RandR and Panoramix change its value when trying to
+ * initialize. So we use this variable to save the user preference
+ * provided by the -/+xinerama parameter before initalizing those
+ * extensions.
+ */
+
+ int Xinerama;
+
} AgentOptionsRec;
typedef AgentOptionsRec *AgentOptionsPtr;
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c
index b26fa9cfe..660d30863 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c
@@ -624,7 +624,7 @@ Bool nxagentReconnectSession(void)
nxagentRedirectDefaultWindows();
- if (nxagentResizeDesktopAtStartup || nxagentOption(Rootless) == True)
+ if (nxagentResizeDesktopAtStartup || nxagentOption(Rootless) == True || nxagentOption(Xinerama) == True)
{
nxagentChangeScreenConfig(0, nxagentOption(RootWidth),
nxagentOption(RootHeight), 0, 0);
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Screen.c b/nx-X11/programs/Xserver/hw/nxagent/Screen.c
index 491a92c2f..a677b7eb4 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Screen.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Screen.c
@@ -79,6 +79,10 @@ is" without express or implied warranty.
#include "X11/include/Xrandr_nxagent.h"
+#include <nx-X11/Xlib.h>
+#include "X11/include/Xinerama_nxagent.h"
+
+
#define GC XlibGC
#define Font XlibFont
#define KeySym XlibKeySym
@@ -102,8 +106,8 @@ is" without express or implied warranty.
#define PANIC
#define WARNING
-#undef TEST
-#undef DEBUG
+#define TEST
+#define DEBUG
#undef WATCH
#undef DUMP
@@ -129,14 +133,6 @@ extern Pixmap nxagentIconPixmap;
extern Pixmap nxagentIconShape;
extern Bool useXpmIcon;
-/*
- * From randr/randr.c.
- */
-
-extern Bool RRGetInfo(ScreenPtr pScreen);
-extern void RRSendConfigNotify(ScreenPtr pScreen);
-extern void RREditConnectionInfo(ScreenPtr pScreen);
-
Window nxagentDefaultWindows[MAXSCREENS];
Window nxagentInputWindows[MAXSCREENS];
Window nxagentScreenSaverWindows[MAXSCREENS];
@@ -319,7 +315,7 @@ void nxagentMaximizeToFullScreen(ScreenPtr pScreen)
XUnmapWindow(nxagentDisplay, nxagentIconWindow);
*/
/*
-FIXME: We'll chech for ReparentNotify and LeaveNotify events after XReparentWindow()
+FIXME: We'll check for ReparentNotify and LeaveNotify events after XReparentWindow()
in order to avoid the session window is iconified.
We could avoid the sesssion window is iconified when a LeaveNotify event is received,
so this check would be unnecessary.
@@ -1117,6 +1113,11 @@ Bool nxagentOpenScreen(int index, ScreenPtr pScreen,
nxagentChangeOption(ViewportXSpan, nxagentOption(Width) - nxagentOption(RootWidth));
nxagentChangeOption(ViewportYSpan, nxagentOption(Height) - nxagentOption(RootHeight));
+ /* PanoramiXExtension enabled via cmdline, turn on Xinerama in nxagent
+ */
+ if( (!noPanoramiXExtension) && (!PanoramiXExtensionDisabledHack) )
+ nxagentOption(Xinerama) = True;
+
if (nxagentReconnectTrap == 0)
{
if (nxagentOption(Persistent))
@@ -1781,7 +1782,9 @@ N/A
XSetClassHint(nxagentDisplay,nxagentDefaultWindows[pScreen->myNum],&hint);
free(hint.res_name);
free(hint.res_class);
- } else {
+ }
+ else
+ {
#ifdef TEST
fprintf(stderr, "nxagentOpenScreen: Setting WM_CLASS and WM_NAME for window withid [%ld].\n",
nxagentDefaultWindows[pScreen->myNum]);
@@ -2035,6 +2038,9 @@ N/A
nxagentCompositeExtensionInit();
+ /* We use this to get informed about RandR changes on the real display.
+ FIXME: It would probably be better to use an RRScreenChangeNotifyEvent here. */
+ XSelectInput(nxagentDisplay, DefaultRootWindow(nxagentDisplay), StructureNotifyMask);
#ifdef NXAGENT_TIMESTAMP
@@ -2071,6 +2077,10 @@ Bool nxagentCloseScreen(int index, ScreenPtr pScreen)
{
int i;
+ #ifdef DEBUG
+ fprintf(stderr, "running nxagentCloseScreen()\n");
+ #endif
+
for (i = 0; i < pScreen->numDepths; i++)
{
xfree(pScreen->allowedDepths[i].vids);
@@ -2240,7 +2250,7 @@ static void nxagentSetRootClip (ScreenPtr pScreen, Bool enable)
if (pWin->realized)
WindowsRestructured ();
FlushAllOutput ();
-}
+}
Bool nxagentResizeScreen(ScreenPtr pScreen, int width, int height,
int mmWidth, int mmHeight)
@@ -3585,21 +3595,91 @@ Bool nxagentReconnectScreen(void *p0)
return True;
}
-RRModePtr nxagentRRCustomMode = NULL;
+/* FIXME: there must be such macros somewhere already...*/
+#define MAX(a,b) ((a) > (b)) ? (a) : (b);
+#define MIN(a,b) ((a) < (b)) ? (a) : (b);
+
+/* intersect two rectangles */
+Bool intersect(int ax1, int ay1, unsigned int aw, unsigned int ah,
+ int bx1, int by1, unsigned int bw, unsigned int bh,
+ int *x, int *y, unsigned int *w, unsigned int *h)
+{
+ int tx1, ty1, tx2, ty2, ix, iy;
+ unsigned int iw, ih;
+
+ int ax2 = ax1 + aw;
+ int ay2 = ay1 + ah;
+ int bx2 = bx1 + bw;
+ int by2 = by1 + bh;
+
+ /* thanks to http://silentmatt.com/rectangle-intersection */
+
+ /* check if there's any intersection at all */
+ if (ax2 < bx1 || bx2 < ax1 || ay2 < by1 || by2 < ay1) {
+ return FALSE;
+ }
+
+ tx1 = MAX(ax1, bx1);
+ ty1 = MAX(ay1, by1);
+ tx2 = MIN(ax2, bx2);
+ ty2 = MIN(ay2, by2);
+
+ ix = tx1 - ax1;
+ iy = ty1 - ay1;
+ iw = tx2 - tx1;
+ ih = ty2 - ty1;
+
+ /* check if the resulting rectangle is feasible */
+ if (iw <= 0 || ih <= 0) {
+ return FALSE;
+ }
+ *x = ix;
+ *y = iy;
+ *w = iw;
+ *h = ih;
+ return TRUE;
+}
+
+#ifndef NXAGENT_RANDR_XINERAMA_CLIPPING
+/* intersect two rectangles, return aw/ah for w/h if resulting
+ rectangle is (partly) outside of bounding box */
+Bool intersect_bb(int ax1, int ay1, unsigned int aw, unsigned int ah,
+ int bx1, int by1, unsigned int bw, unsigned int bh,
+ int bbx1, int bby1, int bbx2, int bby2,
+ int *x, int *y, unsigned int *w, unsigned int *h)
+{
+ Bool result = intersect(ax1, ay1, aw, ah, bx1, by1, bw, bh, x, y, w, h);
+ if (result == TRUE) {
+ /* check if outside of bounding box */
+ if (ax1 < bbx1 || ax1 + aw > bbx2) {
+ #ifdef DEBUG
+ fprintf(stderr, "intersect: box has parts outside bounding box - width stays unchanged [%d]\n", aw);
+ #endif
+ *w = aw;
+ }
+
+ if (ay1 < bby1 || ay1 + ah > bby2) {
+ #ifdef DEBUG
+ fprintf(stderr, "intersect: box has parts outside bounding box - height stays unchanged [%d]\n", ah);
+ #endif
+ *h = ah;
+ }
+ }
+
+ return result;
+}
+#endif
int nxagentChangeScreenConfig(int screen, int width, int height, int mmWidth, int mmHeight)
{
ScreenPtr pScreen;
- rrScrPrivPtr pScrPriv;
- RROutputPtr output;
- RRCrtcPtr crtc;
- RRModePtr mode;
- xRRModeInfo modeInfo;
- char name[100];
- int r, c, m;
- int refresh = 60;
- int doNotify = 1;
+ /* FIXME: when is this needed? */
+ int doNotify = TRUE;
+ int r;
+ #ifdef TEST
+ fprintf(stderr, "nxagentChangeScreenConfig: WindowTable[%d] is %p\n", screen, WindowTable[screen]);
+ #endif
if (WindowTable[screen] == NULL)
{
return 0;
@@ -3607,16 +3687,17 @@ int nxagentChangeScreenConfig(int screen, int width, int height, int mmWidth, in
UpdateCurrentTime();
- if (nxagentGrabServerInfo.grabstate == SERVER_GRABBED)
+ if (nxagentGrabServerInfo.grabstate == SERVER_GRABBED && nxagentGrabServerInfo.client != NULL)
{
/*
- * If any client grabbed the server it won't expect that screen
+ * If any client grabbed the server it won't expect screen
* configuration changes until it releases the grab. That could
- * get an X error because available modes are chanded meanwhile.
+ * lead to an X error because available modes are changed
+ * in the meantime.
*/
#ifdef TEST
- fprintf(stderr, "nxagentChangeScreenConfig: Cancel with grabbed server.\n");
+ fprintf(stderr, "nxagentChangeScreenConfig: Cancel with grabbed server (grab held by %p).\n", nxagentGrabServerInfo.client);
#endif
return 0;
@@ -3632,76 +3713,398 @@ int nxagentChangeScreenConfig(int screen, int width, int height, int mmWidth, in
if (r != 0)
{
- pScrPriv = rrGetScrPriv(pScreen);
+ nxagentAdjustRandRXinerama(pScreen);
+ }
+
+ if (doNotify)
+ {
+ RRScreenSizeNotify(pScreen);
+ }
+
+#ifdef DEBUG
+ fprintf(stderr, "nxagentChangeScreenConfig: Geometry: %d,%d %dx%d\n", nxagentOption(X), nxagentOption(Y),nxagentOption(Width),nxagentOption(Height));
+ fprintf(stderr, "nxagentChangeScreenConfig: return %d\n", r);
+#endif
+
+ return r;
+}
+
+int nxagentAdjustRandRXinerama(ScreenPtr pScreen)
+{
+ rrScrPrivPtr pScrPriv;
+ RROutputPtr output;
+ xRRModeInfo modeInfo;
+ char name[100];
+ int refresh = 60;
+ int width = nxagentOption(Width);
+ int height = nxagentOption(Height);
+
+ pScrPriv = rrGetScrPriv(pScreen);
+
+ if (pScrPriv)
+ {
+ int i, j;
+ int number = 0;
+
+ XineramaScreenInfo *screeninfo = NULL;
- if (pScrPriv)
+ if (nxagentOption(Xinerama)) {
+ screeninfo = XineramaQueryScreens(nxagentDisplay, &number);
+#ifdef DEBUG
+ if (number) {
+ fprintf(stderr, "nxagentAdjustRandRXinerama: XineramaQueryScreens() returned %d screens\n", number);
+ }
+ else
+ {
+ fprintf(stderr, "nxagentAdjustRandRXinerama: XineramaQueryScreens() failed - continuing without Xinerama\n");
+ }
+ }
+ else
{
- output = RRFirstOutput(pScreen);
+ fprintf(stderr, "nxagentAdjustRandRXinerama: Xinerama is disabled\n");
+#endif
+ }
+
+ /*
+ * if there's no xinerama on the real server or xinerama is
+ * disabled in nxagent we only report one big screen. Clients
+ * still see xinerama enabled but it will report only one (big)
+ * screen. This is consistent with the way rrxinerama always
+ * behaved. The single PanoramiX/Xinerama extension however
+ * disables xinerama if only one screen exists.
+ */
+ if (number == 0) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: faking xinerama\n" );
+ #endif
+ number = 1;
+
+ if (screeninfo) {
+ xfree(screeninfo);
+ }
+ if (!(screeninfo = xalloc(sizeof(XineramaScreenInfo)))) {
+ return FALSE;
+ }
+
+ /* fake a xinerama screeninfo that covers the whole screen */
+ screeninfo->x_org = nxagentOption(X);
+ screeninfo->y_org = nxagentOption(Y);
+ screeninfo->width = nxagentOption(Width);
+ screeninfo->height = nxagentOption(Height);
+ }
+
+#ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: numCrtcs [%d], numOutputs [%d]\n", pScrPriv->numCrtcs, pScrPriv->numOutputs);
+ {
+ Bool rrgetinfo;
+
+ /*
+ * Convert old RANDR 1.0 data (if any) to current structure. This
+ * is needed once at the first run of this function. If we don't
+ * do this here it will be done implicitely later and add mode(s) to
+ * our crtc(s)!
+ */
+ rrgetinfo = RRGetInfo(pScreen);
+
+ fprintf(stderr, "nxagentAdjustRandRXinerama: RRGetInfo returned [%d]\n", rrgetinfo);
+ }
+#else
+ /* we are not interested in the return code */
+ RRGetInfo(pScreen);
+#endif
- if (output && output -> crtc)
+#ifndef NXAGENT_RANDR_XINERAMA_CLIPPING
+ /* calculate bounding box (outer edges) */
+ int bbx2, bbx1, bby1, bby2;
+ bbx2 = bby2 = 0;
+ bbx1 = bby1 = INT_MAX;
+
+ for (i = 0; i < number; i++) {
+ bbx2 = MAX(bbx2, screeninfo[i].x_org + screeninfo[i].width);
+ bby2 = MAX(bby2, screeninfo[i].y_org + screeninfo[i].height);
+ bbx1 = MIN(bbx1, screeninfo[i].x_org);
+ bby1 = MIN(bby1, screeninfo[i].y_org);
+ }
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: bounding box: left [%d] right [%d] top [%d] bottom[%d]\n", bbx1, bbx2, bby1, bby2);
+ #endif
+#endif
+
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: numCrtcs [%d], numOutputs [%d]\n", pScrPriv->numCrtcs, pScrPriv->numOutputs);
+ #endif
+
+ /* adjust the number of CRTCs to match the number of reported
+ xinerama screens on the real server */
+ while (number != pScrPriv->numCrtcs) {
+ if (number < pScrPriv->numCrtcs) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: destroying crtc\n");
+ #endif
+ RRCrtcDestroy(pScrPriv->crtcs[pScrPriv->numCrtcs - 1]);
+ }
+ else
{
- crtc = output -> crtc;
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: adding crtc\n");
+ #endif
+ RRCrtcCreate(pScreen, NULL);
+ }
+ }
- for (c = 0; c < pScrPriv -> numCrtcs; c++)
- {
- RRCrtcSet(pScrPriv -> crtcs[c], NULL, 0, 0, RR_Rotate_0, 0, NULL);
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: numCrtcs [%d], numOutputs [%d]\n", pScrPriv->numCrtcs, pScrPriv->numOutputs);
+ #endif
+
+ /* set gamma. Currently the only reason for doing this is
+ preventing the xrandr command from complaining about missing
+ gamma. */
+ for (i = 0; i < pScrPriv->numCrtcs; i++) {
+ if (pScrPriv->crtcs[i]->gammaSize == 0) {
+ CARD16 gamma = 0;
+ RRCrtcGammaSetSize(pScrPriv->crtcs[i], 1);
+ RRCrtcGammaSet(pScrPriv->crtcs[i], &gamma, &gamma, &gamma);
+ RRCrtcGammaNotify(pScrPriv->crtcs[i]);
+ }
+ }
+
+ /* delete superfluous non-NX outputs */
+ for (i = pScrPriv->numOutputs - 1; i >= 0; i--) {
+ if (strncmp(pScrPriv->outputs[i]->name, "NX", 2)) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: destroying output [%s]\n", pScrPriv->outputs[i]->name);
+ #endif
+ RROutputDestroy(pScrPriv->outputs[i]);
+ }
+ }
+
+ /* at this stage only NX outputs are left - we delete the superfluous ones */
+ for (i = pScrPriv->numOutputs - 1; i >= number; i--) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: destroying output [%s]\n", pScrPriv->outputs[i]->name);
+ #endif
+ RROutputDestroy(pScrPriv->outputs[i]);
+ }
+
+ /* add and init outputs */
+ for (i = 0; i < number; i++) {
+ if (i >= pScrPriv->numOutputs) {
+ sprintf(name, "NX%d", i+1);
+ output = RROutputCreate(pScreen, name, strlen(name), NULL);
+ /* will be done later
+ RROutputSetConnection(output, RR_Disconnected);
+ */
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: created new output [%s]\n", name);
+ #endif
+ }
+ else
+ {
+ output = pScrPriv->outputs[i];
+ }
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: adjusting output [%s]\n", pScrPriv->outputs[i]->name);
+ #endif
+ RROutputSetCrtcs(output, &(pScrPriv->crtcs[i]), 1);
+ /* FIXME: Isn't there a function for setting this? */
+ output->crtc = pScrPriv->crtcs[i];
+ /* FIXME: get SubPixelOrder from real X server */
+ RROutputSetSubpixelOrder(output, SubPixelUnknown);
+ /* FIXME: What is the correct physical size here? */
+ RROutputSetPhysicalSize(output, 0, 0);
+ }
+
+ for (i = 0; i < pScrPriv->numOutputs; i++ ) {
+ Bool disable_output = FALSE;
+ RRModePtr mymode, prevmode;
+ int new_x, new_y;
+ unsigned int new_w, new_h;
+
+ /*
+ if ((nxagentOption(X) < bbx1 || (nxagentOption(X) + width >= bbx2 )) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: window has parts outside visible area - width stays unchanged [%d]\n", width);
+ #endif
+ new_w = width;
+ }
+
+ if ((nxagentOption(Y) < bby1 || (nxagentOption(Y) + height >= bby2 ) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: window has parts outside visible area - height stays unchanged [%d]\n", height);
+ #endif
+ new_h = height;
+ }
+ */
+
+ /* if there's no intersection disconnect the output */
+#ifdef NXAGENT_RANDR_XINERAMA_CLIPPING
+ disable_output = !intersect(nxagentOption(X), nxagentOption(Y),
+ width, height,
+ screeninfo[i].x_org, screeninfo[i].y_org,
+ screeninfo[i].width, screeninfo[i].height,
+ &new_x, &new_y, &new_w, &new_h);
+#else
+ disable_output = !intersect_bb(nxagentOption(X), nxagentOption(Y),
+ width, height,
+ screeninfo[i].x_org, screeninfo[i].y_org,
+ screeninfo[i].width, screeninfo[i].height,
+ bbx1, bby1, bbx2, bby2,
+ &new_x, &new_y, &new_w, &new_h);
+#endif
+
+ /* save previous mode */
+ prevmode = pScrPriv->crtcs[i]->mode;
+ #ifdef DEBUG
+ if (prevmode) {
+ fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: prevmode [%s] ([%p]) refcnt [%d]\n", i, prevmode->name, prevmode, prevmode->refcnt);
+ } else {
+ fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: no prevmode\n", i);
+ }
+ #endif
+
+ RROutputSetCrtcs(pScrPriv->outputs[i], &(pScrPriv->crtcs[i]), 1);
+
+ if (disable_output) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: no (valid) intersection - disconnecting\n", i);
+ #endif
+ RROutputSetConnection(pScrPriv->outputs[i], RR_Disconnected);
+
+ /*
+ * Tests revealed that some window managers (e.g. LXDE) also
+ * take disconnected outputs into account when calculating
+ * stuff like wallpaper tile size and maximum window
+ * size. This is problematic when a disconnected output is
+ * smaller than any of the connected ones. Solution: unset the
+ * mode of the output's crtc. This also leads to xinerama not
+ * showing the disconnected head anymore.
+ */
+ if (prevmode) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: removing mode from output %d\n", i);
+ #endif
+ RROutputSetModes(pScrPriv->outputs[i], NULL, 0, 0);
+
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: removing mode from ctrc %d\n", i);
+ #endif
+ RRCrtcSet(pScrPriv->crtcs[i], NULL, 0, 0, RR_Rotate_0, 1, &(pScrPriv->outputs[i]));
}
+ }
+ else
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: intersection is x [%d] y [%d] width [%d] height [%d]\n", i, new_x, new_y, new_w, new_h);
+ #endif
+
+ RROutputSetConnection(pScrPriv->outputs[i], RR_Connected);
memset(&modeInfo, '\0', sizeof(modeInfo));
- sprintf(name, "%dx%d", width, height);
-
- modeInfo.width = width;
- modeInfo.height = height;
- modeInfo.hTotal = width;
- modeInfo.vTotal = height;
- modeInfo.dotClock = ((CARD32) width * (CARD32) height *
- (CARD32) refresh);
+
+#ifdef NXAGENT_RANDR_MODE_PREFIX
+ /* avoid collisions with pre-existing default modes by using a
+ separate namespace. If we'd simply use XxY we could not
+ distinguish between pre-existing modes which should stay
+ and our own modes that should be removed after use. */
+ sprintf(name, "nx_%dx%d", new_w, new_h);
+#else
+ sprintf(name, "%dx%d", new_w, new_h);
+#endif
+
+ modeInfo.width = new_w;
+ modeInfo.height = new_h;
+ modeInfo.hTotal = new_w;
+ modeInfo.vTotal = new_h;
+ modeInfo.dotClock = ((CARD32) new_w * (CARD32) new_h * (CARD32) refresh);
modeInfo.nameLength = strlen(name);
- if (nxagentRRCustomMode != NULL)
+ mymode = RRModeGet(&modeInfo, name);
+
+#ifdef DEBUG
+ if (mymode) {
+ fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: mode [%s] ([%p]) created/received, refcnt [%d]\n", i, name, mymode, mymode->refcnt);
+ }
+ else
{
- RROutputDeleteUserMode(output, nxagentRRCustomMode);
- FreeResource(nxagentRRCustomMode -> mode.id, 0);
+ /* FIXME: what is the correct behaviour in this case? */
+ fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: mode [%s] creation failed!\n", i, name);
+ }
+#endif
+ if (prevmode && mymode == prevmode) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: mymode [%s] ([%p]) == prevmode [%s] ([%p])\n", mymode->name, mymode, prevmode->name, prevmode);
+ #endif
- if (crtc != NULL && crtc -> mode == nxagentRRCustomMode)
- {
- RRCrtcSet(crtc, NULL, 0, 0, RR_Rotate_0, 0, NULL);
- }
+ /* if they are the same RRModeGet() has increased the
+ refcnt by 1. We decrease it again by calling only
+ RRModeDestroy() and forget about prevmode */
+ RRModeDestroy(mymode);
+ }
+ else
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: setting mode [%s] ([%p]) refcnt [%d] for output %d\n", mymode->name, mymode, mymode->refcnt, i);
+ #endif
+ RROutputSetModes(pScrPriv->outputs[i], &mymode, 1, 0);
- #ifdef TEST
- fprintf(stderr, "nxagentChangeScreenConfig: "
- "Going to destroy mode %p with refcnt %d.\n",
- nxagentRRCustomMode, nxagentRRCustomMode->refcnt);
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: setting mode [%s] ([%p]) refcnt [%d] for crtc %d\n", mymode->name, mymode, mymode->refcnt, i);
#endif
+ RRCrtcSet(pScrPriv->crtcs[i], mymode, new_x, new_y, RR_Rotate_0, 1, &(pScrPriv->outputs[i]));
- RRModeDestroy(nxagentRRCustomMode);
}
+ } /* if disable_output */
- nxagentRRCustomMode = RRModeGet(&modeInfo, name);
+ /* throw away the mode if otherwise unused. We do not need it
+ anymore. We call FreeResource() to ensure the system will not
+ try to free it again on shutdown */
- RROutputAddUserMode(output, nxagentRRCustomMode);
+ if (prevmode && prevmode->refcnt == 1) {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: destroying prevmode [%s]\n", prevmode->name);
+ #endif
+ FreeResource(prevmode->mode.id, 0);
+ }
- RRCrtcSet(crtc, nxagentRRCustomMode, 0, 0, RR_Rotate_0, 1, &output);
+ RROutputChanged(pScrPriv->outputs[i], TRUE);
+ RRCrtcChanged(pScrPriv->crtcs[i], TRUE);
+ }
- RROutputChanged(output, 1);
+ /* release allocated memory */
+ if (screeninfo) {
+ xfree(screeninfo);
+ screeninfo = NULL;
+ }
- doNotify = 0;
+#ifdef DEBUG
+ for (i = 0; i < pScrPriv->numCrtcs; i++) {
+ RRModePtr mode = pScrPriv->crtcs[i]->mode;
+ if (mode) {
+ fprintf(stderr, "nxagentAdjustRandRXinerama: crtc %d has mode [%s] ([%p]), refcnt [%d] and %d outputs\n", i, pScrPriv->crtcs[i]->mode->name, pScrPriv->crtcs[i]->mode, pScrPriv->crtcs[i]->mode->refcnt, pScrPriv->crtcs[i]->numOutputs);
+ }
+ else
+ {
+ fprintf(stderr, "nxagentAdjustRandRXinerama: crtc %d has no mode and %d outputs\n", i, pScrPriv->crtcs[i]->numOutputs);
}
- pScrPriv -> lastSetTime = currentTime;
-
- pScrPriv->changed = 1;
- pScrPriv->configChanged = 1;
+ if (pScrPriv->crtcs[i]->numOutputs > 0)
+ fprintf(stderr, " output[%d]->crtc=[%p]\n", i, pScrPriv->outputs[i]->crtc);
}
+#endif
- if (doNotify
-)
- {
- RRScreenSizeNotify(pScreen);
- }
+ pScrPriv -> lastSetTime = currentTime;
+
+ pScrPriv->changed = TRUE;
+ pScrPriv->configChanged = TRUE;
}
- return r;
+ /* FIXME: adjust maximum screen size according to remote randr/xinerama setup */
+
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentAdjustRandRXinerama: Min %dx%d, Max %dx%d \n", pScrPriv->minWidth,pScrPriv->minHeight,pScrPriv->maxWidth,pScrPriv->maxHeight);
+ #endif
+
+ return TRUE;
}
void nxagentSaveAreas(PixmapPtr pPixmap, RegionPtr prgnSave, int xorg, int yorg, WindowPtr pWin)
diff --git a/nx-X11/programs/Xserver/include/globals.h b/nx-X11/programs/Xserver/include/globals.h
index 0f2864825..bb6aa80d3 100644
--- a/nx-X11/programs/Xserver/include/globals.h
+++ b/nx-X11/programs/Xserver/include/globals.h
@@ -46,6 +46,7 @@ extern Bool PanoramiXMapped;
extern Bool PanoramiXVisibilityNotifySent;
extern Bool PanoramiXWindowExposureSent;
extern Bool PanoramiXOneExposeRequest;
+extern Bool PanoramiXExtensionDisabledHack;
#endif
#ifdef BIGREQS
diff --git a/nx-X11/programs/Xserver/os/utils.c b/nx-X11/programs/Xserver/os/utils.c
index 3ab08897a..4934b5ca3 100644
--- a/nx-X11/programs/Xserver/os/utils.c
+++ b/nx-X11/programs/Xserver/os/utils.c
@@ -701,6 +701,7 @@ void UseMsg(void)
#ifdef PANORAMIX
ErrorF("+xinerama Enable XINERAMA extension\n");
ErrorF("-xinerama Disable XINERAMA extension\n");
+ ErrorF("-disablexineramaextension Disable XINERAMA extension\n");
#endif
#ifdef SMART_SCHEDULE
ErrorF("-dumbSched Disable smart scheduling, enable old behavior\n");
diff --git a/nx-X11/programs/Xserver/randr/rrmode.c b/nx-X11/programs/Xserver/randr/rrmode.c
index cb45bf74a..c3740b5f8 100644
--- a/nx-X11/programs/Xserver/randr/rrmode.c
+++ b/nx-X11/programs/Xserver/randr/rrmode.c
@@ -104,11 +104,13 @@ RRModeCreate (xRRModeInfo *modeInfo,
}
modes = newModes;
modes[num_modes++] = mode;
-
/*
* give the caller a reference to this mode
*/
++mode->refcnt;
+#ifdef DEBUG
+ fprintf(stderr, "RRModeCreate: num_modes [%d] new mode [%s] ([%p]) refcnt [%d]\n", num_modes, mode->name, mode, mode->refcnt);
+#endif
return mode;
}
@@ -144,11 +146,22 @@ RRModeGet (xRRModeInfo *modeInfo,
!memcmp (name, mode->name, modeInfo->nameLength))
{
++mode->refcnt;
+#ifdef DEBUG
+ fprintf(stderr, "RRModeGet: return existing mode [%s] ([%p]) refcnt [%d]\n", mode->name, mode, mode->refcnt);
+#endif
return mode;
}
}
+#ifdef DEBUG
+ {
+ RRModePtr mode = RRModeCreate (modeInfo, name, NULL);
+ fprintf(stderr, "RRModeGet: return new mode [%s] ([%p]) refcnt [%d]\n", mode->name, mode, mode->refcnt);
+ return mode;
+ }
+#else
return RRModeCreate (modeInfo, name, NULL);
+#endif
}
static RRModePtr
@@ -252,8 +265,12 @@ RRModeDestroy (RRModePtr mode)
{
int m;
- if (--mode->refcnt > 0)
+ if (--mode->refcnt > 0) {
+#ifdef DEBUG
+ fprintf(stderr, "RRModeDestroy: mode [%s] ([%p]) refcnt [%d -> %d]\n", mode->name, mode, mode->refcnt + 1, mode->refcnt);
+#endif
return;
+ }
for (m = 0; m < num_modes; m++)
{
if (modes[m] == mode)
@@ -270,12 +287,18 @@ RRModeDestroy (RRModePtr mode)
}
}
+#ifdef DEBUG
+ fprintf(stderr, "RRModeDestroy: destroyed mode [%s] ([%p])\n", mode->name, mode);
+#endif
xfree (mode);
}
static int
RRModeDestroyResource (void * value, XID pid)
{
+#ifdef DEBUG
+ fprintf(stderr, "RRModeDestroyResource: mode [%s] ([%p]) refcnt [%d]\n", ((RRModePtr)value)->name, (RRModePtr)value, ((RRModePtr)value)->refcnt);
+#endif
RRModeDestroy ((RRModePtr) value);
return 1;
}
diff --git a/nx-libs.spec b/nx-libs.spec
index 22094c2a5..01341a4ca 100644
--- a/nx-libs.spec
+++ b/nx-libs.spec
@@ -39,6 +39,7 @@ BuildRequires: pkgconfig(xcomposite)
BuildRequires: pkgconfig(xrandr)
BuildRequires: pkgconfig(xfixes)
BuildRequires: pkgconfig(xtst)
+BuildRequires: pkgconfig(xinerama)
%else
BuildRequires: libexpat-devel
BuildRequires: libpng-devel
@@ -53,6 +54,7 @@ BuildRequires: xorg-x11-libXcomposite-devel
BuildRequires: xorg-x11-libXrandr-devel
BuildRequires: xorg-x11-libXfixes-devel
BuildRequires: xorg-x11-libXtst-devel
+BuildRequires: xorg-x11-libXinerama-devel
%endif
BuildRequires: xorg-x11-util-devel
%endif
@@ -67,6 +69,7 @@ BuildRequires: libXcomposite-devel
BuildRequires: libXrandr-devel
BuildRequires: libXfixes-devel
BuildRequires: libXtst-devel
+BuildRequires: libXinerama-devel
%endif
# For imake
@@ -84,20 +87,6 @@ Provides: nx = %{version}-%{release}
Obsoletes: nx%{?_isa} < 3.5.0-19
Provides: nx%{?_isa} = %{version}-%{release}
-# for Xinerama in NX to work:
-%if 0%{?suse_version}
-%if 0%{?suse_version} < 1140
-Requires: xorg-x11-libX11%{?_isa}
-Requires: xorg-x11-libXext%{?_isa}
-%else
-Requires: libX11-6%{?_isa}
-Requires: libXext6%{?_isa}
-%endif
-%else
-Requires: libX11%{?_isa}
-Requires: libXext%{?_isa}
-%endif
-
%if 0%{?el5}
# For compatibility with EPEL5
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
@@ -244,22 +233,6 @@ The NX_Xext library contains a handful of X11 extensions:
- X11 Double-Buffering, Multi-Buffering, and Stereo extension (Xmbuf)
-%package -n libNX_Xinerama1
-Group: System Environment/Libraries
-Summary: Xinerama extension to the NX Protocol
-Requires: %{name}%{?_isa} >= 3.5.0.29
-Obsoletes: libNX_Xinerama
-
-%description -n libNX_Xinerama1
-NX is a software suite which implements very efficient compression of
-the X11 protocol. This increases performance when using X
-applications over a network, especially a slow one.
-
-Xinerama is an extension to the X Window System which enables
-multi-headed X applications and window managers to use two or more
-physical displays as one large virtual display.
-
-
%package -n libNX_Xrender-devel
Group: Development/Libraries
Summary: Development files for the NX Render Extension library
@@ -553,11 +526,6 @@ rm -r %{buildroot}%{_includedir}/nx-X11/extensions/XK*.h
rm -r %{buildroot}%{_includedir}/nx-X11/extensions/*Xv*.h
rm -r %{buildroot}%{_includedir}/nx-X11/Xtrans
-# Needed for Xinerama support
-ln -s -f ../../../../%{_lib}/libX11.so.6 %{buildroot}%{_libdir}/nx/X11/Xinerama/libNX_X11.so.6
-ln -s -f ../../../../%{_lib}/libXext.so.6 %{buildroot}%{_libdir}/nx/X11/Xinerama/libNX_Xext.so.6
-ln -s -f ../../../../%{_lib}/libNX_Xinerama.so.1 %{buildroot}%{_libdir}/nx/X11/Xinerama/libXinerama.so.1
-
%if 0%{?fdupes:1}
%fdupes %buildroot/%_prefix
%endif
@@ -566,7 +534,6 @@ ln -s -f ../../../../%{_lib}/libNX_Xinerama.so.1 %{buildroot}%{_libdir}/nx/X11/X
%post -n libNX_X11-6 -p /sbin/ldconfig
%post -n libNX_Xau6 -p /sbin/ldconfig
%post -n libNX_Xext6 -p /sbin/ldconfig
-%post -n libNX_Xinerama1 -p /sbin/ldconfig
%post -n libNX_Xrender1 -p /sbin/ldconfig
%post -n libXcomp3 -p /sbin/ldconfig
%post -n libXcompext3 -p /sbin/ldconfig
@@ -575,7 +542,6 @@ ln -s -f ../../../../%{_lib}/libNX_Xinerama.so.1 %{buildroot}%{_libdir}/nx/X11/X
%postun -n libNX_X11-6 -p /sbin/ldconfig
%postun -n libNX_Xau6 -p /sbin/ldconfig
%postun -n libNX_Xext6 -p /sbin/ldconfig
-%postun -n libNX_Xinerama1 -p /sbin/ldconfig
%postun -n libNX_Xrender1 -p /sbin/ldconfig
%postun -n libXcomp3 -p /sbin/ldconfig
%postun -n libXcompext3 -p /sbin/ldconfig
@@ -654,10 +620,6 @@ ln -s -f ../../../../%{_lib}/libNX_Xinerama.so.1 %{buildroot}%{_libdir}/nx/X11/X
%defattr(-,root,root)
%{_libdir}/libNX_Xext.so.6*
-%files -n libNX_Xinerama1
-%defattr(-,root,root)
-%{_libdir}/libNX_Xinerama.so.1*
-
%files -n libNX_Xrender-devel
%defattr(-,root,root)
%{_libdir}/libNX_Xrender.so
@@ -722,7 +684,6 @@ ln -s -f ../../../../%{_lib}/libNX_Xinerama.so.1 %{buildroot}%{_libdir}/nx/X11/X
%files devel
%defattr(-,root,root)
-%{_libdir}/libNX_Xinerama.so
%{_includedir}/nx-X11/X10.h
%dir %{_includedir}/nx-X11/extensions
%{_includedir}/nx-X11/extensions/Xevie.h
diff --git a/nxcomp/Misc.cpp b/nxcomp/Misc.cpp
index 3297d8ee8..ee73f19d8 100644
--- a/nxcomp/Misc.cpp
+++ b/nxcomp/Misc.cpp
@@ -306,6 +306,7 @@ clipboard=n\n\
streaming=n\n\
backingstore=n\n\
composite=n\n\
+xinerama=n\n\
shmem=b\n\
shpix=b\n\
kbtype=s\n\
diff --git a/x2goagent.features b/x2goagent.features
new file mode 100644
index 000000000..12d62e01c
--- /dev/null
+++ b/x2goagent.features
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+# Copyright (C) 2015, Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# silently bail out if X2Go Server is not installed
+if ! which x2gopath 1>/dev/null; then
+ exit 0
+fi
+
+X2GO_LIB_PATH="$(x2gopath libexec)";
+
+$X2GO_LIB_PATH/x2gosyslog "$0" "info" "$(basename $0) called with options: $@"
+
+X2GO_FEATURE=$1
+
+# check for X2Go Agent features
+case "$X2GO_FEATURE" in
+
+ "X2GOAGENT_RANDRXINERAMA") echo "ok"; exit 0;;
+ *) exit -1;;
+
+esac