Unverified Commit 1391c0ad authored by Mike Gabriel's avatar Mike Gabriel

Merge branch 'sunweaver-pr/xinerama-xrandr' into 3.6.x

parents e4763fb4 c4a38893
......@@ -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; \
......
......@@ -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
......
usr/lib/*/libNX_Xinerama.so
usr/include/*/nx-X11/extensions/Xinerama.h
usr/include/*/nx-X11/extensions/panoramiXext.h
usr/lib/*/libNX_Xinerama.so.*
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
usr/share/nx/SecurityPolicy
usr/lib/nx/X11/
usr/include/*/nx-X11/extensions/panoramiXproto.h
\ No newline at end of file
#!/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
#!/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
......@@ -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
......
......@@ -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
......@@ -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
......
......@@ -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
......
......@@ -15,10 +15,6 @@ NULL =
XKBLIBDIR = xkbfile
#endif
#if BuildXineramaLibrary
XINERAMADIR=Xinerama
#endif
#if BuildRenderLibrary
RENDERLIBDIR = Xrender
#endif
......
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()
LIBRARY Xinerama
VERSION LIBRARY_VERSION
EXPORTS
XPanoramiXAllocInfo
XPanoramiXGetScreenCount
XPanoramiXGetScreenSize
XPanoramiXGetState
XPanoramiXQueryExtension
XPanoramiXQueryVersion
XineramaIsActive
XineramaQueryExtension
XineramaQueryScreens
XineramaQueryVersion
/* $XFree86$ */
/* $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;
}
......@@ -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
......
......@@ -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)
......
......@@ -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);
......@@ -3472,6 +3483,25 @@ int nxagentHandleConfigureNotify(XEvent* X)
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);
/*
......
......@@ -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)
{
/*
......
......@@ -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 \
......
......@@ -154,6 +154,8 @@ void nxagentInitOptions()
nxagentOptions.CopyBufferSize = COPY_UNLIMITED;
nxagentOptions.ImageRateLimit = 0;
nxagentOptions.Xinerama = 0;
}
/*
......
......@@ -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;
......
......@@ -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);
......
......@@ -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);
......@@ -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)
{
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)
{
output = RRFirstOutput(pScreen);
int i, j;
int number = 0;
if (output && output -> crtc)
XineramaScreenInfo *screeninfo = NULL;
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
{
crtc = output -> crtc;
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);
}
for (c = 0; c < pScrPriv -> numCrtcs; c++)
#ifdef DEBUG
fprintf(stderr, "nxagentAdjustRandRXinerama: numCrtcs [%d], numOutputs [%d]\n", pScrPriv->numCrtcs, pScrPriv->numOutputs);
{
RRCrtcSet(pScrPriv -> crtcs[c], NULL, 0, 0, RR_Rotate_0, 0, NULL);
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
#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
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);
modeInfo.nameLength = strlen(name);
#ifdef DEBUG
fprintf(stderr, "nxagentAdjustRandRXinerama: numCrtcs [%d], numOutputs [%d]\n", pScrPriv->numCrtcs, pScrPriv->numOutputs);
#endif
if (nxagentRRCustomMode != NULL)
/* 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
{
RROutputDeleteUserMode(output, nxagentRRCustomMode);
FreeResource(nxagentRRCustomMode -> mode.id, 0);
#ifdef DEBUG
fprintf(stderr, "nxagentAdjustRandRXinerama: adding crtc\n");
#endif
RRCrtcCreate(pScreen, 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]);
}
}
if (crtc != NULL && crtc -> mode == nxagentRRCustomMode)
/* 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
{
RRCrtcSet(crtc, NULL, 0, 0, RR_Rotate_0, 0, NULL);
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);
}
#ifdef TEST
fprintf(stderr, "nxagentChangeScreenConfig: "
"Going to destroy mode %p with refcnt %d.\n",
nxagentRRCustomMode, nxagentRRCustomMode->refcnt);
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;
}
RRModeDestroy(nxagentRRCustomMode);
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
nxagentRRCustomMode = RRModeGet(&modeInfo, name);
/* 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
RROutputAddUserMode(output, nxagentRRCustomMode);
RROutputSetCrtcs(pScrPriv->outputs[i], &(pScrPriv->crtcs[i]), 1);
RRCrtcSet(crtc, nxagentRRCustomMode, 0, 0, RR_Rotate_0, 1, &output);
if (disable_output) {
#ifdef DEBUG
fprintf(stderr, "nxagentAdjustRandRXinerama: output %d: no (valid) intersection - disconnecting\n", i);
#endif
RROutputSetConnection(pScrPriv->outputs[i], RR_Disconnected);
RROutputChanged(output, 1);
/*
* 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);
doNotify = 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
pScrPriv -> lastSetTime = currentTime;
RROutputSetConnection(pScrPriv->outputs[i], RR_Connected);
pScrPriv->changed = 1;
pScrPriv->configChanged = 1;
memset(&modeInfo, '\0', sizeof(modeInfo));
#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);
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
{
/* 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 (doNotify
)
/* 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
{
RRScreenSizeNotify(pScreen);
#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 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]));
}
} /* if disable_output */
/* 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 */
if (prevmode && prevmode->refcnt == 1) {
#ifdef DEBUG
fprintf(stderr, "nxagentAdjustRandRXinerama: destroying prevmode [%s]\n", prevmode->name);
#endif
FreeResource(prevmode->mode.id, 0);
}
return r;
RROutputChanged(pScrPriv->outputs[i], TRUE);
RRCrtcChanged(pScrPriv->crtcs[i], TRUE);
}
/* release allocated memory */
if (screeninfo) {
xfree(screeninfo);
screeninfo = NULL;
}
#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);
}
if (pScrPriv->crtcs[i]->numOutputs > 0)
fprintf(stderr, " output[%d]->crtc=[%p]\n", i, pScrPriv->outputs[i]->crtc);
}
#endif
pScrPriv -> lastSetTime = currentTime;
pScrPriv->changed = TRUE;
pScrPriv->configChanged = TRUE;
}
/* 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)
......
......@@ -46,6 +46,7 @@ extern Bool PanoramiXMapped;
extern Bool PanoramiXVisibilityNotifySent;
extern Bool PanoramiXWindowExposureSent;
extern Bool PanoramiXOneExposeRequest;
extern Bool PanoramiXExtensionDisabledHack;
#endif
#ifdef BIGREQS
......
......@@ -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");
......
......@@ -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;
}
......
......@@ -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
......
......@@ -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\
......
#!/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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment