From ddce48ede036f3996f8e584b0012c396c5df42fb Mon Sep 17 00:00:00 2001 From: Elvis Pranskevichus Date: Tue, 6 Nov 2007 09:40:14 +0000 Subject: [PATCH 01/28] Config: D-Bus: Fix dbus_bus_request_name failure check The code in connect_hook incorrectly checks for dbus_bus_request_name failure. The dbus_bus_request_name error indicator is -1, not 0. This leads to subsequent assertion failure in libdbus. --- config/dbus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/dbus.c b/config/dbus.c index c8675120f..6fe061815 100644 --- a/config/dbus.c +++ b/config/dbus.c @@ -355,8 +355,8 @@ connect_hook(DBusConnection *connection, void *data) dbus_error_init(&error); - if (!dbus_bus_request_name(info->connection, info->busname, - 0, &error)) { + dbus_bus_request_name(info->connection, info->busname, 0, &error); + if (dbus_error_is_set(&error)) { ErrorF("[config/dbus] couldn't take over org.x.config: %s (%s)\n", error.name, error.message); goto err_start; From 868e303630d8b84070c2f1fd8d6da2cef045b029 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Tue, 6 Nov 2007 16:24:46 +0100 Subject: [PATCH 02/28] Xephyr: fix a crash when using xrandr twice * hw/kdrive/ephyr/ephyr.c: (ephyrScreenFini): don't forget to free shadowfb data (if necessary) upon server is reset. --- hw/kdrive/ephyr/ephyr.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index f46a89d55..52f5dcf60 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -719,6 +719,10 @@ ephyrRestore (KdCardInfo *card) void ephyrScreenFini (KdScreenInfo *screen) { + EphyrScrPriv *scrpriv = screen->driver; + if (scrpriv->shadow) { + KdShadowFbFree (screen, 0); + } xfree(screen->driver); screen->driver = NULL; } From d7c5e8bfc1aecbd23a4cbb2eab08656587aac2e8 Mon Sep 17 00:00:00 2001 From: Eamon Walsh Date: Tue, 6 Nov 2007 16:26:09 -0500 Subject: [PATCH 03/28] Modified performance patches from Arjan van de Ven Subject: [PATCH] fix some performance gaps in Xace The XaceHook function is used in several hotpaths. The problem with it (performance wise) is twofold: * The XaceHook function has a big switch() statement for the hook number in it * The XaceHook function uses varargs to reassemble the final dispatch arguments again Both are expensive operations... for something that is known at compile time This patch turns the hotpath XaceHook call into a direct call to avoid the switch and varargs; this gives me over 10% performance gain on the x11perf benchmark. --- Xext/xace.c | 47 +++++++++++++++++++++-------------------------- Xext/xace.h | 9 +++++++++ dix/dispatch.c | 4 ++-- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/Xext/xace.c b/Xext/xace.c index 00c3b8f9b..b4e0eee5f 100644 --- a/Xext/xace.c +++ b/Xext/xace.c @@ -44,6 +44,22 @@ static int (*SwappedUntrustedProcVector[256])( ClientPtr /*client*/ ); +/* Special-cased hook functions. Called by Xserver. + */ +void XaceHookAuditBegin(ClientPtr ptr) +{ + XaceAuditRec rec = { ptr, 0 }; + /* call callbacks, there is no return value. */ + CallCallbacks(&XaceHooks[XACE_AUDIT_BEGIN], &rec); +} + +void XaceHookAuditEnd(ClientPtr ptr, int result) +{ + XaceAuditRec rec = { ptr, result }; + /* call callbacks, there is no return value. */ + CallCallbacks(&XaceHooks[XACE_AUDIT_END], &rec); +} + /* Entry point for hook functions. Called by Xserver. */ int XaceHook(int hook, ...) @@ -60,15 +76,6 @@ int XaceHook(int hook, ...) */ switch (hook) { - case XACE_CORE_DISPATCH: { - XaceCoreDispatchRec rec = { - va_arg(ap, ClientPtr), - TRUE /* default allow */ - }; - calldata = &rec; - prv = &rec.rval; - break; - } case XACE_RESOURCE_ACCESS: { XaceResourceAccessRec rec = { va_arg(ap, ClientPtr), @@ -190,22 +197,6 @@ int XaceHook(int hook, ...) calldata = &rec; break; } - case XACE_AUDIT_BEGIN: { - XaceAuditRec rec = { - va_arg(ap, ClientPtr), - 0 - }; - calldata = &rec; - break; - } - case XACE_AUDIT_END: { - XaceAuditRec rec = { - va_arg(ap, ClientPtr), - va_arg(ap, int) - }; - calldata = &rec; - break; - } default: { va_end(ap); return 0; /* unimplemented hook number */ @@ -271,11 +262,15 @@ XaceCatchDispatchProc(ClientPtr client) { REQUEST(xReq); int major = stuff->reqType; + XaceCoreDispatchRec rec = { client, TRUE /* default allow */ }; if (!ProcVector[major]) return (BadRequest); - if (!XaceHook(XACE_CORE_DISPATCH, client)) + /* call callbacks and return result, if any. */ + CallCallbacks(&XaceHooks[XACE_CORE_DISPATCH], &rec); + + if (!rec.rval) return (BadAccess); return client->swapped ? diff --git a/Xext/xace.h b/Xext/xace.h index 4143cd42f..273635c73 100644 --- a/Xext/xace.h +++ b/Xext/xace.h @@ -68,6 +68,11 @@ extern int XaceHook( ... /*appropriate args for hook*/ ); +/* Special-cased hook functions + */ +extern void XaceHookAuditEnd(ClientPtr ptr, int result); +extern void XaceHookAuditBegin(ClientPtr ptr); + /* Register a callback for a given hook. */ #define XaceRegisterCallback(hook,callback,data) \ @@ -98,9 +103,13 @@ extern void XaceCensorImage( #ifdef __GNUC__ #define XaceHook(args...) XaceAllowOperation +#define XaceHookAuditEnd(args...) { ; } +#define XaceHookAuditBegin(args...) { ; } #define XaceCensorImage(args...) { ; } #else #define XaceHook(...) XaceAllowOperation +#define XaceHookAuditEnd(...) { ; } +#define XaceHookAuditBegin(...) { ; } #define XaceCensorImage(...) { ; } #endif diff --git a/dix/dispatch.c b/dix/dispatch.c index 5c4f8e487..8c76eb12e 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -498,9 +498,9 @@ Dispatch(void) if (result > (maxBigRequestSize << 2)) result = BadLength; else { - XaceHook(XACE_AUDIT_BEGIN, client); + XaceHookAuditBegin(client); result = (* client->requestVector[MAJOROP])(client); - XaceHook(XACE_AUDIT_END, client, result); + XaceHookAuditEnd(client, result); } #ifdef XSERVER_DTRACE XSERVER_REQUEST_DONE(GetRequestName(MAJOROP), MAJOROP, From 512bac25ec0e980968b93a2ebe88bd89bf99b697 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Tue, 6 Nov 2007 14:52:03 +0000 Subject: [PATCH 04/28] DIX: XKB: Set xkbInfo to NULL as well as freeing it (bug #10639) XkbRemoveResourceClient wants to access xkbInfo if it exists, so make sure we NULL it after freeing it. It doesn't make much sense to move the RemoveResourceClient call first, as there's not much point in notifying clients while we're shutting the server down anyway. --- dix/devices.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dix/devices.c b/dix/devices.c index 9798b97a6..3855c2b8b 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -528,6 +528,7 @@ CloseDevice(DeviceIntPtr dev) if (dev->key->xkbInfo) XkbFreeInfo(dev->key->xkbInfo); #endif + dev->key->xkbInfo = NULL; xfree(dev->key->curKeySyms.map); xfree(dev->key->modifierKeyMap); xfree(dev->key); From fda832772b3e630037bf1b822534996154a50861 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Tue, 6 Nov 2007 15:05:06 +0000 Subject: [PATCH 05/28] .gitignore: Ignore build directories Ignore directories people might use for building. --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 27132c0f9..6abca3b1a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ Makefile.in *.a *.o *~ +.*.swp +obj* +build* aclocal.m4 autom4te.cache compile @@ -298,4 +301,3 @@ mfb/mfbteblack.c mfb/mfbtewhite.c mfb/mfbtileC.c mfb/mfbtileG.c -.*.swp From 66fe554a59bb7de37354b618945cd5f30d78250d Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Tue, 6 Nov 2007 18:57:09 +0000 Subject: [PATCH 06/28] COPYING: Collapse 'canonical license' into one statement For a few of us, the license statement is identical, and the only variant is the copyright. For these, aggregate the copyrights, and only list the license once. Put this at the top, and note that this is more or less our agreed canonical license. --- COPYING | 200 ++++++++++++-------------------------------------------- 1 file changed, 42 insertions(+), 158 deletions(-) diff --git a/COPYING b/COPYING index 097ef984f..2b464e0d4 100644 --- a/COPYING +++ b/COPYING @@ -1,3 +1,45 @@ +The following is the 'standard copyright' agreed upon by most contributors, +and is currently the canonical license, though a modification is currently +under discussion. Copyright holders of new code should use this license +statement where possible, and append their name to this list. Please sort +by surname for people, and by the full name for other entities (e.g. +Juliusz Chroboczek sorts before Intel Corporation sorts before Daniel +Stone). + +Copyright © 2000-2001 Juliusz Chroboczek +Copyright © 2006-2007 Intel Corporation +Copyright © 2006 Nokia Corporation +Copyright © 1999 Keith Packard +Copyright © 2005-2007 Daniel Stone +Copyright © 2006 Luc Verhaegen + +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, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) 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 +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 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. + + + + +The following licenses are 'legacy': usually MIT/X11 licenses with the name +of the copyright holder(s) in the license statement, but also some BSD-like +licenses. + + Copyright (C) 1994-2003 The XFree86 Project, Inc. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -1058,27 +1100,6 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -Copyright © 2003-2005 Keith Packard, Daniel Stone - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation, and that the names of Keith Packard and Daniel Stone not be -used in advertising or publicity pertaining to distribution of the software -without specific, written prior permission. Keith Packard and Daniel Stone -make no representations about the suitability of this software for any -purpose. It is provided "as is" without express or implied warranty. - -KEITH PACKARD AND DANIEL STONE DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL KEITH PACKARD OR DANIEL STONE BE LIABLE FOR ANY SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - Copyright © 1999 Keith Packard Copyright © 2000 Compaq Computer Corporation Copyright © 2002 MontaVista Software Inc. @@ -2357,54 +2378,6 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -Copyright (c) 1999 by Keith Packard -Copyright © 2006 Intel Corporation -Copyright 2006 Luc Verhaegen. - -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, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next -paragraph) 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 -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 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. - - -Copyright (c) 2000-2001 by Juliusz Chroboczek -Copyright (c) 1999 by Keith Packard - -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, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -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 THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, 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. - - Copyright 1990, 1991 by Thomas Roell, Dinkelscherben, Germany Copyright 1992 by David Dawes Copyright 1992 by Jim Tsillas @@ -2622,92 +2595,3 @@ FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, 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. - - -Copyright © 2006 Daniel Stone - -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, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next -paragraph) 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 -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 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. - - -Copyright © 2006-2007 Daniel Stone - -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, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next -paragraph) 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 -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 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. - - -Copyright © 2007 Daniel Stone - -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, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next -paragraph) 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 -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 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. - - -Copyright © 1999 Keith Packard -Copyright © 2006 Nokia Corporation - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation, and that the name of the authors not be used in -advertising or publicity pertaining to distribution of the software without -specific, written prior permission. The authors make no -representations about the suitability of this software for any purpose. It -is provided "as is" without express or implied warranty. - -THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - From e717409bae355df9a617a226f12fbb8c54ae77e5 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Tue, 6 Nov 2007 21:36:13 +0000 Subject: [PATCH 07/28] DIX/getevents: Document GetMaximumEventsNum() a little better Note that the number returned by GMEN can _never_ change, and be a little more explicit about the figure for repeats. --- dix/getevents.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dix/getevents.c b/dix/getevents.c index ffcdf174e..3754c72f4 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -207,11 +207,13 @@ updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator, * * Should be used in DIX as: * xEvent *events = xcalloc(sizeof(xEvent), GetMaximumEventsNum()); + * + * This MUST be absolutely constant, from init until exit. */ _X_EXPORT int GetMaximumEventsNum(void) { /* Two base events -- core and device, plus valuator events. Multiply - * by two if we're doing key repeats. */ + * by two if we're doing non-XKB key repeats. */ int ret = 2 + MAX_VALUATOR_EVENTS; #ifdef XKB From 950f9995d11aff2c51139b34fb27eba594f2bd20 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Wed, 7 Nov 2007 18:43:16 +0100 Subject: [PATCH 08/28] Xnest: fix lib dependancy to make libtool happy This fixes an undefined symbol error happening when compiling the server with the --disable-xv configure switch. Basically, xnest was linking against @XSERVER_LIBS@ and @XNEST_LIBS@ and the order of the libraries given to the linker at the end of the process was bogus. * configure.ac: make XNEST_LIBS contain the $XSERVER_LIBS re-ordered in such a way that the linker finds the symbols of all the libs contained in $XNEST_LIBS. * hw/xnest/Makefile.am: don't link against @XSERVER_LIBS@ anymore because XNEST_LIBS contains the right thing. --- configure.ac | 2 +- hw/xnest/Makefile.am | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index a09a5c2bc..df70ae931 100644 --- a/configure.ac +++ b/configure.ac @@ -1219,7 +1219,7 @@ AC_MSG_RESULT([$XNEST]) AM_CONDITIONAL(XNEST, [test "x$XNEST" = xyes]) if test "x$XNEST" = xyes; then - XNEST_LIBS="$CONFIG_LIB $FB_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB" + XNEST_LIBS="$FB_LIB $FIXES_LIB $MI_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $DIX_LIB $OS_LIB $CONFIG_LIB" XNEST_SYS_LIBS="$XNESTMODULES_LIBS" AC_SUBST([XNEST_LIBS]) AC_SUBST([XNEST_SYS_LIBS]) diff --git a/hw/xnest/Makefile.am b/hw/xnest/Makefile.am index 92f840c97..8601b2988 100644 --- a/hw/xnest/Makefile.am +++ b/hw/xnest/Makefile.am @@ -50,8 +50,7 @@ libfbcmap_a_CFLAGS = $(AM_CFLAGS) XNEST_LIBS = \ @XNEST_LIBS@ \ - libfbcmap.a \ - $(XSERVER_LIBS) + libfbcmap.a Xnest_SOURCES = $(SRCS) From 26e1fc7b42de850d69fba89703ffddd36480b997 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Wed, 7 Nov 2007 18:48:23 +0100 Subject: [PATCH 09/28] Xephyr: don't use Xv or GL when those are disabled. --- configure.ac | 3 ++ hw/kdrive/ephyr/Makefile.am | 62 ++++++++++++++++++++++++------------- hw/kdrive/ephyr/ephyr.c | 2 -- 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/configure.ac b/configure.ac index df70ae931..1b4580127 100644 --- a/configure.ac +++ b/configure.ac @@ -1855,10 +1855,13 @@ if test "$KDRIVE" = yes; then XEPHYR_DRI=no if test x$XEPHYR = xyes -a x$DRI = xyes; then XEPHYR_DRI=yes + XEPHYR_DRI_LIBS=-lGL + AC_SUBST(XEPHYR_DRI_LIBS) fi if test x$XEPHYR_DRI = xyes ; then AC_DEFINE(XEPHYR_DRI,1,[enable DRI extension in xephyr]) fi + AM_CONDITIONAL(XEPHYR_HAS_DRI, [test x$XEPHYR_DRI = xyes]) # Xephyr needs nanosleep() which is in librt on Solaris AC_CHECK_FUNC([nanosleep], [], diff --git a/hw/kdrive/ephyr/Makefile.am b/hw/kdrive/ephyr/Makefile.am index 604e22eaa..d025c201c 100644 --- a/hw/kdrive/ephyr/Makefile.am +++ b/hw/kdrive/ephyr/Makefile.am @@ -3,47 +3,65 @@ INCLUDES = \ @KDRIVE_CFLAGS@ \ -I$(srcdir)/../../../exa -noinst_LIBRARIES = libxephyr-hostx.a libxephyr-hostxv.a libxephyr.a +if XV + LIBXEPHYR_HOSTXV=libxephyr-hostxv.a +else + LIBXEPHYR_HOSTXV= +endif + +if XEPHYR_HAS_DRI + LIBXEPHYR_HOSTDRI=libxephyr-hostdri.a +else + LIBXEPHYR_HOSTDRI= +endif + +noinst_LIBRARIES = libxephyr-hostx.a $(LIBXEPHYR_HOSTXV) $(LIBXEPHYR_HOSTDRI) libxephyr.a bin_PROGRAMS = Xephyr - libxephyr_hostx_a_SOURCES = \ hostx.c \ hostx.h -libxephyr_hostx_a_INCLUDES = @XEPHYR_INCS@ +libxephyr_hostxv_a_INCLUDES = @XEPHYR_INCS@ +if XV libxephyr_hostxv_a_SOURCES= \ ephyrhostvideo.c \ ephyrhostvideo.h +endif + +if XEPHYR_HAS_DRI + +libxephyr_hostdri_a_SOURCES= \ +ephyrdriext.c \ +ephyrdri.c \ +ephyrdri.h \ +XF86dri.c \ +ephyrglxext.c \ +ephyrglxext.h \ +ephyrhostglx.c \ +ephyrhostglx.h + +libxephyr_hostdri_a_CFLAGS= \ +-I$(top_srcdir) \ +@LIBDRM_CFLAGS@ \ +@DRIPROTO_CFLAGS@ + +endif libxephyr_a_SOURCES = \ ephyr.c \ ephyr_draw.c \ ephyrvideo.c \ - XF86dri.c \ - ephyrdriext.c \ - ephyrdri.c \ - ephyrdri.h \ - ephyrglxext.c \ - ephyrglxext.h \ - ephyrhostglx.c \ - ephyrhostglx.h \ - ephyrhostproxy.c \ - ephyrhostproxy.h \ - ephyrhostproxy.c \ - ephyrproxyext.c \ - ephyrproxyext.h \ os.c \ hostx.h \ ephyr.h \ ephyrlog.h libxephyr_a_CFLAGS = \ -@LIBDRM_CFLAGS@ \ -I$(top_srcdir) \ -@DRIPROTO_CFLAGS@ +@LIBDRM_CFLAGS@ Xephyr_SOURCES = \ ephyrinit.c @@ -51,17 +69,19 @@ Xephyr_SOURCES = \ Xephyr_LDADD = \ libxephyr.a \ libxephyr-hostx.a \ - libxephyr-hostxv.a \ + $(LIBXEPHYR_HOSTXV) \ + $(LIBXEPHYR_HOSTDRI) \ ../../../exa/libexa.la \ @KDRIVE_LIBS@ \ @XEPHYR_LIBS@ \ @LIBDRM_LIBS@ \ - -lGL + @XEPHYR_DRI_LIBS@ Xephyr_DEPENDENCIES = \ libxephyr.a \ libxephyr-hostx.a \ - libxephyr-hostxv.a \ + $(LIBXEPHYR_HOSTXV) \ + $(LIBXEPHYR_HOSTDRI) \ @KDRIVE_LOCAL_LIBS@ relink: diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index 52f5dcf60..282b52868 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -36,7 +36,6 @@ #include "ephyrdri.h" #include "ephyrdriext.h" #include "ephyrglxext.h" -#include "ephyrproxyext.h" #endif /*XEPHYR_DRI*/ extern int KdTsPhyScreen; @@ -640,7 +639,6 @@ ephyrInitScreen (ScreenPtr pScreen) if (!ephyrNoDRI) { ephyrDRIExtensionInit (pScreen) ; ephyrHijackGLXExtension () ; - ephyrProxyExtensionInit ("ATIFGLRXDRI") ; } #endif From 9bee1c6912817f65bbb8cf4078f0ad016d9d51cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Wed, 7 Nov 2007 18:56:45 +0100 Subject: [PATCH 10/28] EXA: Disable problematic optimization of dest pixmap migration by default. Also add some code comments about these optimizations. --- exa/exa_migration.c | 33 +++++++++++++++++++++++++-------- exa/exa_priv.h | 1 + hw/xfree86/exa/exa.man.pre | 6 ++++++ hw/xfree86/exa/examodule.c | 8 ++++++++ 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/exa/exa_migration.c b/exa/exa_migration.c index d69526b7f..d3646b0b6 100644 --- a/exa/exa_migration.c +++ b/exa/exa_migration.c @@ -153,22 +153,39 @@ exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc, REGION_SUBTRACT(pScreen, &CopyReg, pValidSrc, pValidDst); if (migrate->as_dst) { - RegionPtr pending_damage = DamagePendingRegion(pExaPixmap->pDamage); + ExaScreenPriv (pPixmap->drawable.pScreen); - if (REGION_NIL(pending_damage)) { - static Bool firsttime = TRUE; + /* XXX: The pending damage region will be marked as damaged after the + * operation, so it should serve as an upper bound for the region that + * needs to be synchronized for the operation. Unfortunately, this + * causes corruption in some cases, e.g. when starting compiz. See + * https://bugs.freedesktop.org/show_bug.cgi?id=12916 . + */ + if (pExaScr->optimize_migration) { + RegionPtr pending_damage = DamagePendingRegion(pExaPixmap->pDamage); - if (firsttime) { - ErrorF("%s: Pending damage region empty!\n", __func__); - firsttime = FALSE; + if (REGION_NIL(pending_damage)) { + static Bool firsttime = TRUE; + + if (firsttime) { + ErrorF("%s: Pending damage region empty!\n", __func__); + firsttime = FALSE; + } } + + REGION_INTERSECT(pScreen, &CopyReg, &CopyReg, pending_damage); } - REGION_INTERSECT(pScreen, &CopyReg, &CopyReg, pending_damage); - + /* The caller may provide a region to be subtracted from the calculated + * dirty region. This is to avoid migration of bits that don't + * contribute to the result of the operation. + */ if (migrate->pReg) REGION_SUBTRACT(pScreen, &CopyReg, &CopyReg, migrate->pReg); } else { + /* The caller may restrict the region to be migrated for source pixmaps + * to what's relevant for the operation. + */ if (migrate->pReg) REGION_INTERSECT(pScreen, &CopyReg, &CopyReg, migrate->pReg); } diff --git a/exa/exa_priv.h b/exa/exa_priv.h index a69536372..7656a0278 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -119,6 +119,7 @@ typedef struct { enum ExaMigrationHeuristic migration; Bool checkDirtyCorrectness; unsigned disableFbCount; + Bool optimize_migration; } ExaScreenPrivRec, *ExaScreenPrivPtr; /* diff --git a/hw/xfree86/exa/exa.man.pre b/hw/xfree86/exa/exa.man.pre index 31e1cfe34..14859bc8f 100644 --- a/hw/xfree86/exa/exa.man.pre +++ b/hw/xfree86/exa/exa.man.pre @@ -31,6 +31,12 @@ Disables acceleration of downloading of pixmap data from the framebuffer. Not usable with drivers which rely on DownloadFromScreen succeeding. Default: No. .TP +.BI "Option \*qEXAOptimizeMigration\*q \*q" boolean \*q +Enables an additional optimization for migration of destination pixmaps. This +may improve performance in some cases (e.g. when switching virtual desktops with +no compositing manager) but causes corruption in others (e.g. when starting +compiz). Default: No. +.TP .BI "Option \*qMigrationHeuristic\*q \*q" anystr \*q Chooses an alternate pixmap migration heuristic, for debugging purposes. The default is intended to be the best performing one for general use, though others diff --git a/hw/xfree86/exa/examodule.c b/hw/xfree86/exa/examodule.c index 4dce58fd8..ceead8219 100644 --- a/hw/xfree86/exa/examodule.c +++ b/hw/xfree86/exa/examodule.c @@ -50,6 +50,7 @@ typedef enum { EXAOPT_NO_COMPOSITE, EXAOPT_NO_UTS, EXAOPT_NO_DFS, + EXAOPT_OPTIMIZE_MIGRATION } EXAOpts; static const OptionInfoRec EXAOptions[] = { @@ -61,6 +62,8 @@ static const OptionInfoRec EXAOptions[] = { OPTV_BOOLEAN, {0}, FALSE }, { EXAOPT_NO_DFS, "EXANoDownloadFromScreen", OPTV_BOOLEAN, {0}, FALSE }, + { EXAOPT_OPTIMIZE_MIGRATION, "EXAOptimizeMigration", + OPTV_BOOLEAN, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -144,6 +147,11 @@ exaDDXDriverInit(ScreenPtr pScreen) heuristicName); } } + + pExaScr->optimize_migration = + xf86ReturnOptValBool(pScreenPriv->options, + EXAOPT_OPTIMIZE_MIGRATION, + FALSE); } if (xf86IsOptionSet(pScreenPriv->options, EXAOPT_NO_COMPOSITE)) { From 0e9ef65fa583bf2393dd0fda82df6f092387b425 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 7 Nov 2007 16:33:10 -0800 Subject: [PATCH 11/28] Don't frob timers unless SmartSchedule is running --- os/utils.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/os/utils.c b/os/utils.c index 322814669..ae96a4176 100644 --- a/os/utils.c +++ b/os/utils.c @@ -1520,6 +1520,8 @@ SmartScheduleStopTimer (void) #ifdef SMART_SCHEDULE_POSSIBLE struct itimerval timer; + if (SmartScheduleDisable) + return; timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = 0; timer.it_value.tv_sec = 0; @@ -1534,6 +1536,8 @@ SmartScheduleStartTimer (void) #ifdef SMART_SCHEDULE_POSSIBLE struct itimerval timer; + if (SmartScheduleDisable) + return; timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = SmartScheduleInterval * 1000; timer.it_value.tv_sec = 0; From 476a9d85f819f454a6901ccb7eb028d1c563c341 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Thu, 8 Nov 2007 09:11:05 +0100 Subject: [PATCH 12/28] Xephyr: do not AM_CONDITIONAL inside a shell if branch --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 1b4580127..cd78dc42e 100644 --- a/configure.ac +++ b/configure.ac @@ -1861,7 +1861,6 @@ if test "$KDRIVE" = yes; then if test x$XEPHYR_DRI = xyes ; then AC_DEFINE(XEPHYR_DRI,1,[enable DRI extension in xephyr]) fi - AM_CONDITIONAL(XEPHYR_HAS_DRI, [test x$XEPHYR_DRI = xyes]) # Xephyr needs nanosleep() which is in librt on Solaris AC_CHECK_FUNC([nanosleep], [], @@ -1919,6 +1918,7 @@ AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes]) AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes]) AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = xyes]) AM_CONDITIONAL(BUILD_KDRIVEFBDEVLIB, [test "x$KDRIVE" = xyes && test "x$KDRIVEFBDEVLIB" = xyes]) +AM_CONDITIONAL(XEPHYR_HAS_DRI, [test x$XEPHYR_DRI = xyes]) AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes]) dnl these only go in xkb-config.h (which is shared by the Xorg and Xnest servers) From 169f83e366f678ac5441ad21beb84c9b8c65d28e Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Sun, 4 Nov 2007 19:14:10 -0800 Subject: [PATCH 13/28] Disable deferred updates in xp_init to fix performance problems -- thanks to Eric Gouriou for pointing out the issue --- hw/darwin/quartz/xpr/xprScreen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/darwin/quartz/xpr/xprScreen.c b/hw/darwin/quartz/xpr/xprScreen.c index 709e6e8cc..886ef343f 100644 --- a/hw/darwin/quartz/xpr/xprScreen.c +++ b/hw/darwin/quartz/xpr/xprScreen.c @@ -228,7 +228,7 @@ xprDisplayInit(void) else darwinScreensFound = 1; - if (xp_init(XP_IN_BACKGROUND) != Success) + if (xp_init(XP_IN_BACKGROUND | XP_NO_DEFERRED_UPDATES) != Success) FatalError("Could not initialize the Xplugin library."); xp_select_events(XP_EVENT_DISPLAY_CHANGED From 154fb6417e5d0bae5191984beac5ce045ce754bb Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Sat, 3 Nov 2007 05:34:19 -0700 Subject: [PATCH 14/28] Initial support for Spaces -- if you use Expose to drag an X11 window to another Space, it will work correctly (as opposed to just leaving a ghost window). We accomplish this by listening for the notification from Xplugin that our window has been moved, and then we ask X11 to move the window to the new location. --- hw/darwin/quartz/xpr/xprFrame.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/darwin/quartz/xpr/xprFrame.c b/hw/darwin/quartz/xpr/xprFrame.c index c395f0743..aa38845f6 100644 --- a/hw/darwin/quartz/xpr/xprFrame.c +++ b/hw/darwin/quartz/xpr/xprFrame.c @@ -67,6 +67,7 @@ static inline xp_error xprConfigureWindow(xp_window_id id, unsigned int mask, const xp_window_changes *values) { + // ErrorF("xprConfigureWindow()\n"); if (!no_configure_window) return xp_configure_window(id, mask, values); else @@ -184,7 +185,7 @@ xprMoveFrame(RootlessFrameID wid, ScreenPtr pScreen, int newX, int newY) wc.x = newX; wc.y = newY; - + // ErrorF("xprMoveFrame(%d, %p, %d, %d)\n", wid, pScreen, newX, newY); xprConfigureWindow((xp_window_id) wid, XP_ORIGIN, &wc); } From 67e96be13cdb45be31db121ce216295cd9496d20 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Mon, 5 Nov 2007 20:01:34 -0800 Subject: [PATCH 15/28] Fixed logic error that prevent JIS (Japanese) keyboard layouts from being detected. --- hw/darwin/quartz/quartzKeyboard.c | 51 +++++++++++++------------------ 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/hw/darwin/quartz/quartzKeyboard.c b/hw/darwin/quartz/quartzKeyboard.c index b580a8e84..40b5e92f7 100644 --- a/hw/darwin/quartz/quartzKeyboard.c +++ b/hw/darwin/quartz/quartzKeyboard.c @@ -222,36 +222,27 @@ DarwinModeReadSystemKeymap (darwinKeyboardInfo *info) KeySym *k; TISInputSourceRef currentKeyLayoutRef = TISCopyCurrentKeyboardLayoutInputSource(); - if (currentKeyLayoutRef) - { - CFDataRef currentKeyLayoutDataRef = (CFDataRef )TISGetInputSourceProperty(currentKeyLayoutRef, kTISPropertyUnicodeKeyLayoutData); - if (currentKeyLayoutDataRef) - chr_data = CFDataGetBytePtr(currentKeyLayoutDataRef); - } - - if(chr_data == NULL) { - KLGetCurrentKeyboardLayout (&key_layout); - KLGetKeyboardLayoutProperty (key_layout, kKLuchrData, &chr_data); - - if (chr_data != NULL) - { - is_uchr = 1; - keyboard_type = LMGetKbdType (); - } - else - { - KLGetKeyboardLayoutProperty (key_layout, kKLKCHRData, &chr_data); - - if (chr_data == NULL) - { - ErrorF ( "Couldn't get uchr or kchr resource\n"); - return FALSE; - } - - is_uchr = 0; - num_keycodes = 128; - } - } + keyboard_type = LMGetKbdType (); + if (currentKeyLayoutRef) { + CFDataRef currentKeyLayoutDataRef = (CFDataRef )TISGetInputSourceProperty(currentKeyLayoutRef, kTISPropertyUnicodeKeyLayoutData); + if (currentKeyLayoutDataRef) chr_data = CFDataGetBytePtr(currentKeyLayoutDataRef); + } + + if (chr_data == NULL) { + KLGetCurrentKeyboardLayout (&key_layout); + KLGetKeyboardLayoutProperty (key_layout, kKLuchrData, &chr_data); + } + + if (chr_data == NULL) { + KLGetKeyboardLayoutProperty (key_layout, kKLKCHRData, &chr_data); + is_uchr = 0; + num_keycodes = 128; + } + + if (chr_data == NULL) { + ErrorF ( "Couldn't get uchr or kchr resource\n"); + return FALSE; + } /* Scan the keycode range for the Unicode character that each key produces in the four shift states. Then convert that to From a6ac9002956767fefa37aac95513e21ac5246d15 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Mon, 5 Nov 2007 20:25:10 -0800 Subject: [PATCH 16/28] formatting cleanup --- hw/darwin/quartz/quartzKeyboard.c | 103 +++++++++--------------------- 1 file changed, 31 insertions(+), 72 deletions(-) diff --git a/hw/darwin/quartz/quartzKeyboard.c b/hw/darwin/quartz/quartzKeyboard.c index 40b5e92f7..b40d81e21 100644 --- a/hw/darwin/quartz/quartzKeyboard.c +++ b/hw/darwin/quartz/quartzKeyboard.c @@ -1,8 +1,7 @@ /* quartzKeyboard.c - Code to build a keymap using the Carbon Keyboard Layout API, - which is supported on Mac OS X 10.2 and newer. + Code to build a keymap using the Carbon Keyboard Layout API. Copyright (c) 2003, 2007 Apple Inc. @@ -150,15 +149,11 @@ unsigned int DarwinModeSystemKeymapSeed (void) { static unsigned int seed; - static KeyboardLayoutRef last_key_layout; KeyboardLayoutRef key_layout; KLGetCurrentKeyboardLayout (&key_layout); - - if (key_layout != last_key_layout) - seed++; - + if (key_layout != last_key_layout) seed++; last_key_layout = key_layout; return seed; @@ -190,10 +185,8 @@ macroman2ucs (unsigned char c) 0xaf, 0x2d8, 0x2d9, 0x2da, 0xb8, 0x2dd, 0x2db, 0x2c7, }; - if (c < 128) - return c; - else - return table[c - 128]; + if (c < 128) return c; + else return table[c - 128]; } static KeySym @@ -202,10 +195,7 @@ make_dead_key (KeySym in) int i; for (i = 0; i < sizeof (dead_keys) / sizeof (dead_keys[0]); i++) - { - if (dead_keys[i].normal == in) - return dead_keys[i].dead; - } + if (dead_keys[i].normal == in) return dead_keys[i].dead; return in; } @@ -249,53 +239,39 @@ DarwinModeReadSystemKeymap (darwinKeyboardInfo *info) an X11 keysym (which may just the bit that says "this is Unicode" if it can't find the real symbol.) */ - for (i = 0; i < num_keycodes; i++) - { + for (i = 0; i < num_keycodes; i++) { static const int mods[4] = {0, MOD_SHIFT, MOD_OPTION, MOD_OPTION | MOD_SHIFT}; k = info->keyMap + i * GLYPHS_PER_KEY; - for (j = 0; j < 4; j++) - { - if (is_uchr) - { + for (j = 0; j < 4; j++) { + if (is_uchr) { UniChar s[8]; UniCharCount len; - UInt32 dead_key_state, extra_dead; + UInt32 dead_key_state = 0, extra_dead = 0; - dead_key_state = 0; err = UCKeyTranslate (chr_data, i, kUCKeyActionDown, mods[j] >> 8, keyboard_type, 0, &dead_key_state, 8, &len, s); - if (err != noErr) - continue; + if (err != noErr) continue; - if (len == 0 && dead_key_state != 0) - { + if (len == 0 && dead_key_state != 0) { /* Found a dead key. Work out which one it is, but remembering that it's dead. */ - - extra_dead = 0; err = UCKeyTranslate (chr_data, i, kUCKeyActionDown, mods[j] >> 8, keyboard_type, kUCKeyTranslateNoDeadKeysMask, &extra_dead, 8, &len, s); - if (err != noErr) - continue; + if (err != noErr) continue; } - if (len > 0 && s[0] != 0x0010) - { + if (len > 0 && s[0] != 0x0010) { k[j] = ucs2keysym (s[0]); - - if (dead_key_state != 0) - k[j] = make_dead_key (k[j]); + if (dead_key_state != 0) k[j] = make_dead_key (k[j]); } - } - else - { - UInt32 c, state = 0; + } else { // kchr + UInt32 c, state = 0, state2 = 0; UInt16 code; code = i | mods[j]; @@ -307,67 +283,50 @@ DarwinModeReadSystemKeymap (darwinKeyboardInfo *info) us the actual dead character. */ if (state != 0) - { - UInt32 state2 = 0; c = KeyTranslate (chr_data, code | 128, &state2); - } /* Characters seem to be in MacRoman encoding. */ - if (c != 0 && c != 0x0010) - { + if (c != 0 && c != 0x0010) { k[j] = ucs2keysym (macroman2ucs (c & 255)); - if (state != 0) - k[j] = make_dead_key (k[j]); + if (state != 0) k[j] = make_dead_key (k[j]); } } } - - if (k[3] == k[2]) - k[3] = NoSymbol; - if (k[2] == k[1]) - k[2] = NoSymbol; - if (k[1] == k[0]) - k[1] = NoSymbol; - if (k[0] == k[2] && k[1] == k[3]) - k[2] = k[3] = NoSymbol; + + if (k[3] == k[2]) k[3] = NoSymbol; + if (k[2] == k[1]) k[2] = NoSymbol; + if (k[1] == k[0]) k[1] = NoSymbol; + if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol; } /* Fix up some things that are normally missing.. */ - if (HACK_MISSING) - { - for (i = 0; i < sizeof (known_keys) / sizeof (known_keys[0]); i++) - { + if (HACK_MISSING) { + for (i = 0; i < sizeof (known_keys) / sizeof (known_keys[0]); i++) { k = info->keyMap + known_keys[i].keycode * GLYPHS_PER_KEY; - if (k[0] == NoSymbol && k[1] == NoSymbol + if (k[0] == NoSymbol && k[1] == NoSymbol && k[2] == NoSymbol && k[3] == NoSymbol) - { - k[0] = known_keys[i].keysym; - } + k[0] = known_keys[i].keysym; } } /* And some more things. We find the right symbols for the numeric keypad, but not the KP_ keysyms. So try to convert known keycodes. */ - if (HACK_KEYPAD) - { + if (HACK_KEYPAD) { for (i = 0; i < sizeof (known_numeric_keys) - / sizeof (known_numeric_keys[0]); i++) - { + / sizeof (known_numeric_keys[0]); i++) { k = info->keyMap + known_numeric_keys[i].keycode * GLYPHS_PER_KEY; if (k[0] == known_numeric_keys[i].normal) - { k[0] = known_numeric_keys[i].keypad; - } } } - if(currentKeyLayoutRef) CFRelease(currentKeyLayoutRef); - + if(currentKeyLayoutRef) CFRelease(currentKeyLayoutRef); + return TRUE; } From d68bd5510437c1fd3850e020f7cd90901fae8e1b Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Thu, 8 Nov 2007 20:08:49 -0800 Subject: [PATCH 17/28] fixing GLX in Xquartz --- configure.ac | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index cd78dc42e..1df8874db 100644 --- a/configure.ac +++ b/configure.ac @@ -1746,7 +1746,8 @@ return 0;} # LDFLAGS=$save_LDFLAGS # ]) xorg_cv_AGL_framework=no - DARWIN_LIBS="$FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB" + DARWIN_GLX_LIBS='$(top_builddir)/GL/apple/indirect.o $(top_builddir)/GL/glx/libglx.la' + DARWIN_LIBS="$FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $DARWIN_GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB" AC_SUBST([DARWIN_LIBS]) AC_CHECK_LIB([Xplugin],[xp_init],[:]) AC_SUBST([APPLE_APPLICATIONS_DIR]) From ce7cfbe261b7fd4fcd09d1a4a61344d1555a71f2 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Thu, 8 Nov 2007 20:10:51 -0800 Subject: [PATCH 18/28] Fixed check to refer to DarwinApp, not all Darwin targets --- mi/miinitext.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mi/miinitext.c b/mi/miinitext.c index b40e8bde3..6fa180b2f 100644 --- a/mi/miinitext.c +++ b/mi/miinitext.c @@ -672,7 +672,7 @@ InitVisualWrap() { miResetInitVisuals(); #ifdef GLXEXT -#ifdef __DARWIN__ +#ifdef INXDARWINAPP DarwinGlxWrapInitVisuals(&miInitVisualsProc); #endif #endif From 50dac9b2cb3b40810fb79253adc0265a838a497b Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Wed, 7 Nov 2007 01:35:48 -0800 Subject: [PATCH 19/28] Fixed Spaces issue, correctly -- dragging an X window from one Space to another in Expose mode now works. --- hw/darwin/darwin.h | 3 +- hw/darwin/quartz/quartz.c | 87 ++++++++++++-------- hw/darwin/quartz/quartz.h | 1 + miext/rootless/rootless.h | 2 + miext/rootless/rootlessWindow.c | 138 +++++++++++++++++++++++++++++++- 5 files changed, 191 insertions(+), 40 deletions(-) diff --git a/hw/darwin/darwin.h b/hw/darwin/darwin.h index 70ce57e01..e63385882 100644 --- a/hw/darwin/darwin.h +++ b/hw/darwin/darwin.h @@ -131,7 +131,6 @@ enum { = LASTEvent+1, // (from X.h list of event names) kXDarwinUpdateButtons, // update state of mouse buttons 2 and up kXDarwinScrollWheel, // scroll wheel event - /* * Quartz-specific events -- not used in IOKit mode */ @@ -142,6 +141,8 @@ enum { kXDarwinReadPasteboard, // copy Mac OS X pasteboard into X cut buffer kXDarwinWritePasteboard, // copy X cut buffer onto Mac OS X pasteboard kXDarwinBringAllToFront, // bring all X windows to front + kXDarwinToggleFullscreen, // Enable/Disable fullscreen mode + kXDarwinSetRootless, // Set rootless mode /* * AppleWM events */ diff --git a/hw/darwin/quartz/quartz.c b/hw/darwin/quartz/quartz.c index 25061a8b3..29f54de51 100644 --- a/hw/darwin/quartz/quartz.c +++ b/hw/darwin/quartz/quartz.c @@ -342,8 +342,22 @@ void DarwinModeProcessEvent( xEvent *xe) { switch (xe->u.u.type) { + case kXDarwinControllerNotify: + AppleWMSendEvent(AppleWMControllerNotify, + AppleWMControllerNotifyMask, + xe->u.clientMessage.u.l.longs0, + xe->u.clientMessage.u.l.longs1); + break; + + case kXDarwinPasteboardNotify: + AppleWMSendEvent(AppleWMPasteboardNotify, + AppleWMPasteboardNotifyMask, + xe->u.clientMessage.u.l.longs0, + xe->u.clientMessage.u.l.longs1); + break; case kXDarwinActivate: + ErrorF("kXDarwinActivate\n"); QuartzShow(xe->u.keyButtonPointer.rootX, xe->u.keyButtonPointer.rootY); AppleWMSendEvent(AppleWMActivationNotify, @@ -352,12 +366,48 @@ void DarwinModeProcessEvent( break; case kXDarwinDeactivate: + ErrorF("kXDarwinDeactivate\n"); AppleWMSendEvent(AppleWMActivationNotify, AppleWMActivationNotifyMask, AppleWMIsInactive, 0); QuartzHide(); break; + case kXDarwinDisplayChanged: + ErrorF("kXDarwinDisplayChanged\n"); + QuartzUpdateScreens(); + break; + + case kXDarwinWindowState: + ErrorF("kXDarwinWindowState\n"); + RootlessNativeWindowStateChanged(xe->u.clientMessage.u.l.longs0, + xe->u.clientMessage.u.l.longs1); + break; + + case kXDarwinWindowMoved: + ErrorF("kXDarwinWindowMoved\n"); + RootlessNativeWindowMoved (xe->u.clientMessage.u.l.longs0); + break; + + case kXDarwinToggleFullscreen: +#ifdef DARWIN_DDX_MISSING + if (quartzEnableRootless) QuartzSetFullscreen(!quartzHasRoot); + else if (quartzHasRoot) QuartzHide(); + else QuartzShow(); +#else + ErrorF("kXDarwinToggleFullscreen not implemented\n"); +#endif + break; + + case kXDarwinSetRootless: +#ifdef DARWIN_DDX_MISSING + QuartzSetRootless(xe->u.clientMessage.u.l.longs0); + if (!quartzEnableRootless && !quartzHasRoot) QuartzHide(); +#else + ErrorF("kXDarwinSetRootless not implemented\n"); +#endif + break; + case kXDarwinSetRootClip: QuartzSetRootClip((BOOL)xe->u.clientMessage.u.l.longs0); break; @@ -374,46 +424,13 @@ void DarwinModeProcessEvent( QuartzWritePasteboard(); break; - /* - * AppleWM events - */ - case kXDarwinControllerNotify: - AppleWMSendEvent(AppleWMControllerNotify, - AppleWMControllerNotifyMask, - xe->u.clientMessage.u.l.longs0, - xe->u.clientMessage.u.l.longs1); - break; - - case kXDarwinPasteboardNotify: - AppleWMSendEvent(AppleWMPasteboardNotify, - AppleWMPasteboardNotifyMask, - xe->u.clientMessage.u.l.longs0, - xe->u.clientMessage.u.l.longs1); - break; - - case kXDarwinDisplayChanged: - QuartzUpdateScreens(); - break; - case kXDarwinBringAllToFront: + ErrorF("kXDarwinBringAllToFront\n"); RootlessOrderAllWindows(); break; - case kXDarwinWindowState: - ErrorF("kXDarwinWindowState\n"); - break; - case kXDarwinWindowMoved: { - WindowPtr pWin = (WindowPtr)xe->u.clientMessage.u.l.longs0; - short x = xe->u.clientMessage.u.l.longs1, - y = xe->u.clientMessage.u.l.longs2; - ErrorF("kXDarwinWindowMoved(%p, %hd, %hd)\n", pWin, x, y); - RootlessMoveWindow(pWin, x, y, pWin->nextSib, VTMove); - } - break; - default: - ErrorF("Unknown application defined event type %d.\n", - xe->u.u.type); + ErrorF("Unknown application defined event type %d.\n", xe->u.u.type); } } diff --git a/hw/darwin/quartz/quartz.h b/hw/darwin/quartz/quartz.h index fa7499df1..172f3239b 100644 --- a/hw/darwin/quartz/quartz.h +++ b/hw/darwin/quartz/quartz.h @@ -122,6 +122,7 @@ typedef struct _QuartzModeProcs { } QuartzModeProcsRec, *QuartzModeProcsPtr; extern QuartzModeProcsPtr quartzProcs; +extern int quartzHasRoot, quartzEnableRootless; Bool QuartzLoadDisplayBundle(const char *dpyBundleName); diff --git a/miext/rootless/rootless.h b/miext/rootless/rootless.h index d9fdb6adb..b4a5b2a3d 100644 --- a/miext/rootless/rootless.h +++ b/miext/rootless/rootless.h @@ -74,6 +74,8 @@ typedef struct _RootlessWindowRec { unsigned int is_drawing :1; // Currently drawing? unsigned int is_reorder_pending :1; + unsigned int is_offscreen :1; + unsigned int is_obscured :1; } RootlessWindowRec, *RootlessWindowPtr; diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/rootlessWindow.c index 4a3c0f6ae..eb736b7f7 100644 --- a/miext/rootless/rootlessWindow.c +++ b/miext/rootless/rootlessWindow.c @@ -36,13 +36,23 @@ #include /* For NULL */ #include /* For CHAR_BIT */ #include +#ifdef __APPLE__ +//#include +#include +#include "mi.h" +#include "pixmapstr.h" +#include "windowstr.h" +#include +//#include +extern int darwinMainScreenX, darwinMainScreenY; +#endif +#include "fb.h" + +#define AppleWMNumWindowLevels 5 #include "rootlessCommon.h" #include "rootlessWindow.h" -#include "fb.h" - - #ifdef ROOTLESS_GLOBAL_COORDS #define SCREEN_TO_GLOBAL_X \ (dixScreenOrigins[pScreen->myNum].x + rootlessGlobalOffsetX) @@ -53,6 +63,127 @@ #define SCREEN_TO_GLOBAL_Y 0 #endif +#define DEFINE_ATOM_HELPER(func,atom_name) \ + static Atom func (void) { \ + static unsigned int generation; \ + static Atom atom; \ + if (generation != serverGeneration) { \ + generation = serverGeneration; \ + atom = MakeAtom (atom_name, strlen (atom_name), TRUE); \ + } \ + return atom; \ + } + +DEFINE_ATOM_HELPER (xa_native_screen_origin, "_NATIVE_SCREEN_ORIGIN") +DEFINE_ATOM_HELPER (xa_native_window_id, "_NATIVE_WINDOW_ID") +DEFINE_ATOM_HELPER (xa_apple_no_order_in, "_APPLE_NO_ORDER_IN") + +static Bool no_configure_window; +static Bool windows_hidden; +// TODO - abstract xp functions + +static const int normal_window_levels[AppleWMNumWindowLevels+1] = { + 0, 3, 4, 5, LONG_MIN + 30, LONG_MIN + 29, +}; +static const int rooted_window_levels[AppleWMNumWindowLevels+1] = { + 202, 203, 204, 205, 201, 200 +}; + +static inline int +configure_window (xp_window_id id, unsigned int mask, + const xp_window_changes *values) +{ + if (!no_configure_window) + return xp_configure_window (id, mask, values); + else + return XP_Success; +} + +/*static inline unsigned long +current_time_in_seconds (void) +{ + unsigned long t = 0; + + t += currentTime.milliseconds / 1000; + t += currentTime.months * 4294967; + + return t; + } */ + +static inline Bool +rootlessHasRoot (ScreenPtr pScreen) +{ + return WINREC (WindowTable[pScreen->myNum]) != NULL; +} + +void +RootlessNativeWindowStateChanged (xp_window_id id, unsigned int state) +{ + WindowPtr pWin; + RootlessWindowRec *winRec; + + pWin = xprGetXWindow (id); + if (pWin == NULL) return; + + winRec = WINREC (pWin); + if (winRec == NULL) return; + + winRec->is_offscreen = ((state & XP_WINDOW_STATE_OFFSCREEN) != 0); + winRec->is_obscured = ((state & XP_WINDOW_STATE_OBSCURED) != 0); + // pWin->rootlessUnhittable = winRec->is_offscreen; +} + +void +RootlessNativeWindowMoved (WindowPtr pWin) +{ + xp_box bounds; + int sx, sy; + XID vlist[2]; + Mask mask; + ClientPtr client; + RootlessWindowRec *winRec = WINREC(pWin); + + if (xp_get_window_bounds (winRec->wid, &bounds) != Success) return; + + sx = dixScreenOrigins[pWin->drawable.pScreen->myNum].x + darwinMainScreenX; + sy = dixScreenOrigins[pWin->drawable.pScreen->myNum].y + darwinMainScreenY; + + /* Fake up a ConfigureWindow packet to resize the window to the current bounds. */ + + vlist[0] = (INT16) bounds.x1 - sx; + vlist[1] = (INT16) bounds.y1 - sy; + mask = CWX | CWY; + + /* pretend we're the owner of the window! */ + client = LookupClient (pWin->drawable.id, NullClient); + + /* Don't want to do anything to the physical window (avoids + notification-response feedback loops) */ + + no_configure_window = TRUE; + ConfigureWindow (pWin, mask, vlist, client); + no_configure_window = FALSE; +} + +/* Updates the _NATIVE_SCREEN_ORIGIN property on the given root window. */ +static void +set_screen_origin (WindowPtr pWin) +{ + long data[2]; + + if (!IsRoot (pWin)) + return; + + /* FIXME: move this to an extension? */ + + data[0] = (dixScreenOrigins[pWin->drawable.pScreen->myNum].x + + darwinMainScreenX); + data[1] = (dixScreenOrigins[pWin->drawable.pScreen->myNum].y + + darwinMainScreenY); + + ChangeWindowProperty (pWin, xa_native_screen_origin (), XA_INTEGER, + 32, PropModeReplace, 2, data, TRUE); +} /* * RootlessCreateWindow @@ -565,7 +696,6 @@ RootlessRestackWindow(WindowPtr pWin, WindowPtr pOldNextSib) RL_DEBUG_MSG("restackwindow end\n"); } - /* * Specialized window copy procedures */ From b34d2ffc38002f7c4980c138f57e9a828cd79c37 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Wed, 7 Nov 2007 01:56:37 -0800 Subject: [PATCH 20/28] formatting changes. --- hw/darwin/apple/X11Application.m | 264 +++++++++++++++---------------- 1 file changed, 129 insertions(+), 135 deletions(-) diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m index 6b235ad0b..0a080db40 100644 --- a/hw/darwin/apple/X11Application.m +++ b/hw/darwin/apple/X11Application.m @@ -183,116 +183,111 @@ static void message_kit_thread (SEL selector, NSObject *arg) { } - (void) sendEvent:(NSEvent *)e { - NSEventType type; - BOOL for_appkit, for_x; - - type = [e type]; - - /* By default pass down the responder chain and to X. */ - for_appkit = YES; - for_x = YES; - - switch (type) { - case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown: - case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp: - if ([e window] != nil) { - /* Pointer event has a window. Probably something for the kit. */ - - for_x = NO; - - if (_x_active) [self activateX:NO]; - } else if ([self modalWindow] == nil) { - /* Must be an X window. Tell appkit it doesn't have focus. */ - - for_appkit = NO; - - if ([self isActive]) { - [self deactivate]; - - if (!_x_active && quartzProcs->IsX11Window([e window], [e windowNumber])) - [self activateX:YES]; - } - } - break; + NSEventType type; + BOOL for_appkit, for_x; + + type = [e type]; + + /* By default pass down the responder chain and to X. */ + for_appkit = YES; + for_x = YES; + + switch (type) { + case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown: + case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp: + if ([e window] != nil) { + /* Pointer event has an (AppKit) window. Probably something for the kit. */ + for_x = NO; + if (_x_active) [self activateX:NO]; + } else if ([self modalWindow] == nil) { + /* Must be an X window. Tell appkit it doesn't have focus. */ + for_appkit = NO; - case NSKeyDown: case NSKeyUp: - if (_x_active) { - static int swallow_up; + if ([self isActive]) { + [self deactivate]; - /* No kit window is focused, so send it to X. */ + if (!_x_active && quartzProcs->IsX11Window([e window], + [e windowNumber])) + [self activateX:YES]; + } + } + break; + + case NSKeyDown: case NSKeyUp: + if (_x_active) { + static int swallow_up; + + /* No kit window is focused, so send it to X. */ + for_appkit = NO; + if (type == NSKeyDown) { + /* Before that though, see if there are any global + shortcuts bound to it. */ - for_appkit = NO; - - if (type == NSKeyDown) { - /* Before that though, see if there are any global - shortcuts bound to it. */ - - if (X11EnableKeyEquivalents - && [[self mainMenu] performKeyEquivalent:e]) { - swallow_up = [e keyCode]; - for_x = NO; - } else if (!quartzEnableRootless + if (X11EnableKeyEquivalents + && [[self mainMenu] performKeyEquivalent:e]) { + swallow_up = [e keyCode]; + for_x = NO; + } else if (!quartzEnableRootless && ([e modifierFlags] & ALL_KEY_MASKS) == (NSCommandKeyMask | NSAlternateKeyMask) && ([e keyCode] == 0 /*a*/ - || [e keyCode] == 53 /*Esc*/)) { - swallow_up = 0; - for_x = NO; + || [e keyCode] == 53 /*Esc*/)) { + swallow_up = 0; + for_x = NO; #ifdef DARWIN_DDX_MISSING - QuartzMessageServerThread (kXDarwinToggleFullscreen, 0); + QuartzMessageServerThread (kXDarwinToggleFullscreen, 0); #endif - } - } else { - /* If we saw a key equivalent on the down, don't pass - the up through to X. */ - - if (swallow_up != 0 && [e keyCode] == swallow_up) { - swallow_up = 0; - for_x = NO; - } + } + } else { + /* If we saw a key equivalent on the down, don't pass + the up through to X. */ + + if (swallow_up != 0 && [e keyCode] == swallow_up) { + swallow_up = 0; + for_x = NO; } } - else for_x = NO; - break; - - case NSFlagsChanged: - /* For the l33t X users who remap modifier keys to normal keysyms. */ - if (!_x_active) - for_x = NO; - break; - - case NSAppKitDefined: - switch ([e subtype]) { - case NSApplicationActivatedEventType: - for_x = NO; - if ([self modalWindow] == nil) { - for_appkit = NO; - - /* FIXME: hack to avoid having to pass the event to appkit, - which would cause it to raise one of its windows. */ - _appFlags._active = YES; - - [self activateX:YES]; - if ([e data2] & 0x10) X11ApplicationSetFrontProcess(); - } - break; - - case 18: /* ApplicationDidReactivate */ - if (quartzHasRoot) for_appkit = NO; - break; - - case NSApplicationDeactivatedEventType: - for_x = NO; - [self activateX:NO]; - break; + } else for_x = NO; + break; + + case NSFlagsChanged: + /* For the l33t X users who remap modifier keys to normal keysyms. */ + if (!_x_active) for_x = NO; + break; + + case NSAppKitDefined: + switch ([e subtype]) { + case NSApplicationActivatedEventType: + for_x = NO; + if ([self modalWindow] == nil) { + for_appkit = NO; + + /* FIXME: hack to avoid having to pass the event to appkit, + which would cause it to raise one of its windows. */ + _appFlags._active = YES; + + [self activateX:YES]; + if ([e data2] & 0x10) X11ApplicationSetFrontProcess(); } break; - default: break; /* for gcc */ + case 18: /* ApplicationDidReactivate */ + if (quartzHasRoot) for_appkit = NO; + break; + + case NSApplicationDeactivatedEventType: + for_x = NO; + [self activateX:NO]; + break; } - - if (for_appkit) [super sendEvent:e]; - if (for_x) send_nsevent (type, e); + break; + + default: break; /* for gcc */ + } + + if (for_appkit) [super sendEvent:e]; + + if (for_x) send_nsevent (type, e); } - (void) set_window_menu:(NSArray *)list { @@ -596,52 +591,51 @@ static NSMutableArray * cfarray_to_nsarray (CFArrayRef in) { CFPreferencesAppSynchronize (kCFPreferencesCurrentApplication); } -- (void) read_defaults { - const char *tem; - - quartzUseSysBeep = [self prefs_get_boolean:@PREFS_SYSBEEP - default:quartzUseSysBeep]; - quartzEnableRootless = [self prefs_get_boolean:@PREFS_ROOTLESS - default:quartzEnableRootless]; +- (void) read_defaults +{ + const char *tem; + + quartzUseSysBeep = [self prefs_get_boolean:@PREFS_SYSBEEP + default:quartzUseSysBeep]; + quartzEnableRootless = [self prefs_get_boolean:@PREFS_ROOTLESS + default:quartzEnableRootless]; #ifdef DARWIN_DDX_MISSING - quartzFullscreenDisableHotkeys = ![self prefs_get_boolean: - @PREFS_FULLSCREEN_HOTKEYS default: - !quartzFullscreenDisableHotkeys]; - quartzXpluginOptions = [self prefs_get_integer:@PREFS_XP_OPTIONS - default:quartzXpluginOptions]; + quartzFullscreenDisableHotkeys = ![self prefs_get_boolean: + @PREFS_FULLSCREEN_HOTKEYS default: + !quartzFullscreenDisableHotkeys]; + quartzXpluginOptions = [self prefs_get_integer:@PREFS_XP_OPTIONS + default:quartzXpluginOptions]; #endif - - darwinSwapAltMeta = [self prefs_get_boolean:@PREFS_SWAP_ALT_META - default:darwinSwapAltMeta]; - darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS - default:darwinFakeButtons]; - if (darwinFakeButtons) { - const char *fake2, *fake3; - - fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL]; - fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL]; - - if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2); - if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3); - - } - X11EnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS - default:X11EnableKeyEquivalents]; + darwinSwapAltMeta = [self prefs_get_boolean:@PREFS_SWAP_ALT_META + default:darwinSwapAltMeta]; + darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS + default:darwinFakeButtons]; + if (darwinFakeButtons) { + const char *fake2, *fake3; + + fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL]; + fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL]; + + if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2); + if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3); + } - darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP - default:darwinSyncKeymap]; + X11EnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS + default:X11EnableKeyEquivalents]; - tem = [self prefs_get_string:@PREFS_KEYMAP_FILE default:NULL]; - - if (tem != NULL) darwinKeymapFile = strdup (tem); - else darwinKeymapFile = NULL; + darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP + default:darwinSyncKeymap]; - darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH - default:darwinDesiredDepth]; + tem = [self prefs_get_string:@PREFS_KEYMAP_FILE default:NULL]; + if (tem != NULL) darwinKeymapFile = strdup (tem); + else darwinKeymapFile = NULL; - enable_stereo = [self prefs_get_boolean:@PREFS_ENABLE_STEREO - default:false]; + darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH + default:darwinDesiredDepth]; + + enable_stereo = [self prefs_get_boolean:@PREFS_ENABLE_STEREO + default:false]; } /* This will end up at the end of the responder chain. */ From 9a8abcfa6d6d0cdc17be02a3443a7e116eb07d07 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Wed, 7 Nov 2007 02:22:39 -0800 Subject: [PATCH 21/28] Fixed focus problem (clicking on an X11 window that sits behind an Aqua window would not always bring it to the top of the stack. --- hw/darwin/apple/X11Application.m | 2 ++ hw/darwin/quartz/xpr/xpr.h | 3 +++ hw/darwin/quartz/xpr/xprFrame.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m index 0a080db40..84e295b4a 100644 --- a/hw/darwin/apple/X11Application.m +++ b/hw/darwin/apple/X11Application.m @@ -201,6 +201,8 @@ static void message_kit_thread (SEL selector, NSObject *arg) { if (_x_active) [self activateX:NO]; } else if ([self modalWindow] == nil) { /* Must be an X window. Tell appkit it doesn't have focus. */ + WindowPtr pWin = xprGetXWindowFromAppKit([e windowNumber]); + if (pWin) RootlessReorderWindow(pWin); for_appkit = NO; if ([self isActive]) { diff --git a/hw/darwin/quartz/xpr/xpr.h b/hw/darwin/quartz/xpr/xpr.h index 73a88c03d..46baac78f 100644 --- a/hw/darwin/quartz/xpr/xpr.h +++ b/hw/darwin/quartz/xpr/xpr.h @@ -38,6 +38,9 @@ void AppleDRIExtensionInit(void); void xprAppleWMInit(void); Bool xprInit(ScreenPtr pScreen); Bool xprIsX11Window(void *nsWindow, int windowNumber); +WindowPtr xprGetX11Window(xp_window_id wid); +WindowPtr xprGetXWindowFromAppKit(int windowNumber); + void xprHideWindows(Bool hide); Bool QuartzInitCursor(ScreenPtr pScreen); diff --git a/hw/darwin/quartz/xpr/xprFrame.c b/hw/darwin/quartz/xpr/xprFrame.c index aa38845f6..ddb6d2dda 100644 --- a/hw/darwin/quartz/xpr/xprFrame.c +++ b/hw/darwin/quartz/xpr/xprFrame.c @@ -424,6 +424,37 @@ xprGetXWindow(xp_window_id wid) return winRec != NULL ? winRec->win : NULL; } +/* + * Given the id of a physical window, try to find the top-level (or root) + * X window that it represents. + */ +WindowPtr +xprGetXWindowFromAppKit(int windowNumber) +{ + RootlessWindowRec *winRec; + Bool ret; + xp_window_id wid; + + if (window_hash == NULL) + return FALSE; + + /* need to lock, since this function can be called by any thread */ + + pthread_mutex_lock(&window_hash_mutex); + + if (xp_lookup_native_window(windowNumber, &wid)) + ret = xprGetXWindow(wid) != NULL; + else + ret = FALSE; + + pthread_mutex_unlock(&window_hash_mutex); + + if (!ret) return NULL; + winRec = x_hash_table_lookup(window_hash, (void *) wid, NULL); + + return winRec != NULL ? winRec->win : NULL; +} + /* * The windowNumber is an AppKit window number. Returns TRUE if xpr is From 05d5b9baa05a4ba14a4383d8a981bc327d99290c Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Wed, 7 Nov 2007 02:28:49 -0800 Subject: [PATCH 22/28] removed debugging output --- hw/darwin/quartz/quartz.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/hw/darwin/quartz/quartz.c b/hw/darwin/quartz/quartz.c index 29f54de51..762a84b75 100644 --- a/hw/darwin/quartz/quartz.c +++ b/hw/darwin/quartz/quartz.c @@ -357,7 +357,7 @@ void DarwinModeProcessEvent( break; case kXDarwinActivate: - ErrorF("kXDarwinActivate\n"); + // ErrorF("kXDarwinActivate\n"); QuartzShow(xe->u.keyButtonPointer.rootX, xe->u.keyButtonPointer.rootY); AppleWMSendEvent(AppleWMActivationNotify, @@ -366,7 +366,7 @@ void DarwinModeProcessEvent( break; case kXDarwinDeactivate: - ErrorF("kXDarwinDeactivate\n"); + // ErrorF("kXDarwinDeactivate\n"); AppleWMSendEvent(AppleWMActivationNotify, AppleWMActivationNotifyMask, AppleWMIsInactive, 0); @@ -374,18 +374,18 @@ void DarwinModeProcessEvent( break; case kXDarwinDisplayChanged: - ErrorF("kXDarwinDisplayChanged\n"); + // ErrorF("kXDarwinDisplayChanged\n"); QuartzUpdateScreens(); break; case kXDarwinWindowState: - ErrorF("kXDarwinWindowState\n"); + // ErrorF("kXDarwinWindowState\n"); RootlessNativeWindowStateChanged(xe->u.clientMessage.u.l.longs0, xe->u.clientMessage.u.l.longs1); break; case kXDarwinWindowMoved: - ErrorF("kXDarwinWindowMoved\n"); + // ErrorF("kXDarwinWindowMoved\n"); RootlessNativeWindowMoved (xe->u.clientMessage.u.l.longs0); break; @@ -395,7 +395,7 @@ void DarwinModeProcessEvent( else if (quartzHasRoot) QuartzHide(); else QuartzShow(); #else - ErrorF("kXDarwinToggleFullscreen not implemented\n"); + // ErrorF("kXDarwinToggleFullscreen not implemented\n"); #endif break; @@ -404,7 +404,7 @@ void DarwinModeProcessEvent( QuartzSetRootless(xe->u.clientMessage.u.l.longs0); if (!quartzEnableRootless && !quartzHasRoot) QuartzHide(); #else - ErrorF("kXDarwinSetRootless not implemented\n"); + // ErrorF("kXDarwinSetRootless not implemented\n"); #endif break; @@ -425,7 +425,7 @@ void DarwinModeProcessEvent( break; case kXDarwinBringAllToFront: - ErrorF("kXDarwinBringAllToFront\n"); + // ErrorF("kXDarwinBringAllToFront\n"); RootlessOrderAllWindows(); break; From b4d14484056e6f4a7374fc1acf3f223be4bd116f Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Wed, 7 Nov 2007 03:10:52 -0800 Subject: [PATCH 23/28] Undo some last-minute breakage in xpr.h --- hw/darwin/quartz/xpr/xpr.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/hw/darwin/quartz/xpr/xpr.h b/hw/darwin/quartz/xpr/xpr.h index 46baac78f..bd8e63e61 100644 --- a/hw/darwin/quartz/xpr/xpr.h +++ b/hw/darwin/quartz/xpr/xpr.h @@ -38,8 +38,6 @@ void AppleDRIExtensionInit(void); void xprAppleWMInit(void); Bool xprInit(ScreenPtr pScreen); Bool xprIsX11Window(void *nsWindow, int windowNumber); -WindowPtr xprGetX11Window(xp_window_id wid); -WindowPtr xprGetXWindowFromAppKit(int windowNumber); void xprHideWindows(Bool hide); From bd269d0d783d418ef99363478fdf849fd89eed76 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Wed, 7 Nov 2007 03:55:08 -0800 Subject: [PATCH 24/28] Fix for off-by-one error in menu bar height calculation -- props to Nicholas Riley! --- hw/darwin/apple/X11Application.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m index 84e295b4a..38675a38e 100644 --- a/hw/darwin/apple/X11Application.m +++ b/hw/darwin/apple/X11Application.m @@ -819,7 +819,7 @@ void X11ApplicationMain (int argc, const char *argv[], /* Calculate the height of the menubar so we can avoid it. */ aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) - - NSMaxY([[NSScreen mainScreen] visibleFrame]) - 1; + NSMaxY([[NSScreen mainScreen] visibleFrame]); if (!create_thread (server_thread, server_arg)) { ErrorF("can't create secondary thread\n"); From 338c1aedbdf3964e542947140f7c50d58542cf12 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Wed, 7 Nov 2007 03:56:44 -0800 Subject: [PATCH 25/28] formatting fixes --- hw/darwin/apple/X11Application.m | 66 +++++++++++++++----------------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m index 38675a38e..461ca3926 100644 --- a/hw/darwin/apple/X11Application.m +++ b/hw/darwin/apple/X11Application.m @@ -789,44 +789,40 @@ environment?", @"Startup xinitrc dialog"); void X11ApplicationMain (int argc, const char *argv[], void (*server_thread) (void *), void *server_arg) { - NSAutoreleasePool *pool; - + NSAutoreleasePool *pool; + #ifdef DEBUG - while (access ("/tmp/x11-block", F_OK) == 0) sleep (1); + while (access ("/tmp/x11-block", F_OK) == 0) sleep (1); #endif + + pool = [[NSAutoreleasePool alloc] init]; + X11App = (X11Application *) [X11Application sharedApplication]; + init_ports (); + [NSApp read_defaults]; + [NSBundle loadNibNamed:@"main" owner:NSApp]; + [[NSNotificationCenter defaultCenter] addObserver:NSApp + selector:@selector (became_key:) + name:NSWindowDidBecomeKeyNotification object:nil]; + check_xinitrc (); - pool = [[NSAutoreleasePool alloc] init]; - - X11App = (X11Application *) [X11Application sharedApplication]; - - init_ports (); - - [NSApp read_defaults]; - - [NSBundle loadNibNamed:@"main" owner:NSApp]; - - [[NSNotificationCenter defaultCenter] addObserver:NSApp - selector:@selector (became_key:) - name:NSWindowDidBecomeKeyNotification object:nil]; - - check_xinitrc (); - - /* - * The xpr Quartz mode is statically linked into this server. - * Initialize all the Quartz functions. - */ - QuartzModeBundleInit(); - - /* Calculate the height of the menubar so we can avoid it. */ - aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) - - NSMaxY([[NSScreen mainScreen] visibleFrame]); - - if (!create_thread (server_thread, server_arg)) { - ErrorF("can't create secondary thread\n"); - exit(1); - } - - [NSApp run]; + /* + * The xpr Quartz mode is statically linked into this server. + * Initialize all the Quartz functions. + */ + QuartzModeBundleInit(); + + /* Calculate the height of the menubar so we can avoid it. */ + aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) - + NSMaxY([[NSScreen mainScreen] visibleFrame]); + + if (!create_thread (server_thread, server_arg)) { + ErrorF("can't create secondary thread\n"); + exit (1); + } + + [NSApp run]; + + /* not reached */ } From f2a3728868376a3646832d4af3a29549ce0b8f5d Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Thu, 8 Nov 2007 18:49:05 -0800 Subject: [PATCH 26/28] Patch to rootless code that should fix many crashes. Credit to Ken Thomases at CodeWeavers for the patch. From his description: Fix a display bug with the X server. The Generic Rootless extension installs overrides for certain GC (graphics context) operations. Within these overrides, they temporarily uninstall themselves, perform their work, and then reinstall themselves. Except sometimes they would return early and wouldn't reinstall themselves when they should. Now they do in all cases. Fix a bug in RootlessCopyWindow where early returns could leave the screen's dispatch table entry for CopyWindow unwrapped. We think that this is another case (hopefully the last) of the rootless drawing bug. --- miext/rootless/rootlessGC.c | 50 +++++++++++++++++++++------------ miext/rootless/rootlessWindow.c | 5 ++-- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/miext/rootless/rootlessGC.c b/miext/rootless/rootlessGC.c index b26f52c54..7e0778e17 100644 --- a/miext/rootless/rootlessGC.c +++ b/miext/rootless/rootlessGC.c @@ -413,10 +413,12 @@ static void RootlessCopyClip(GCPtr pgcDst, GCPtr pgcSrc) #define GC_IS_ROOT(pDst) ((pDst)->type == DRAWABLE_WINDOW \ && IsRoot ((WindowPtr) (pDst))) -#define GC_SKIP_ROOT(pDst) \ +#define GC_SKIP_ROOT(pDst, pGC) \ do { \ - if (GC_IS_ROOT (pDst)) \ + if (GC_IS_ROOT (pDst)) { \ + GCOP_WRAP(pGC); \ return; \ + } \ } while (0) @@ -426,7 +428,7 @@ RootlessFillSpans(DrawablePtr dst, GCPtr pGC, int nInit, { GC_SAVE(pGC); GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("fill spans start "); if (nInit <= 0) { @@ -482,7 +484,7 @@ RootlessSetSpans(DrawablePtr dst, GCPtr pGC, char *pSrc, int nspans, int sorted) { GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("set spans start "); if (nspans <= 0) { @@ -533,7 +535,7 @@ RootlessPutImage(DrawablePtr dst, GCPtr pGC, BoxRec box; GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("put image start "); RootlessStartDrawing((WindowPtr) dst); @@ -565,7 +567,10 @@ RootlessCopyArea(DrawablePtr pSrc, DrawablePtr dst, GCPtr pGC, GCOP_UNWRAP(pGC); if (GC_IS_ROOT(dst) || GC_IS_ROOT(pSrc)) + { + GCOP_WRAP(pGC); return NULL; /* nothing exposed */ + } RL_DEBUG_MSG("copy area start (src 0x%x, dst 0x%x)", pSrc, dst); @@ -615,7 +620,10 @@ static RegionPtr RootlessCopyPlane(DrawablePtr pSrc, DrawablePtr dst, GCOP_UNWRAP(pGC); if (GC_IS_ROOT(dst) || GC_IS_ROOT(pSrc)) + { + GCOP_WRAP(pGC); return NULL; /* nothing exposed */ + } RL_DEBUG_MSG("copy plane start "); @@ -652,7 +660,7 @@ static void RootlessPolyPoint(DrawablePtr dst, GCPtr pGC, int mode, int npt, DDXPointPtr pptInit) { GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("polypoint start "); RootlessStartDrawing((WindowPtr) dst); @@ -746,7 +754,7 @@ static void RootlessPolylines(DrawablePtr dst, GCPtr pGC, int mode, int npt, DDXPointPtr pptInit) { GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("poly lines start "); RootlessStartDrawing((WindowPtr) dst); @@ -821,7 +829,7 @@ static void RootlessPolySegment(DrawablePtr dst, GCPtr pGC, int nseg, xSegment *pSeg) { GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("poly segment start (win 0x%x)", dst); RootlessStartDrawing((WindowPtr) dst); @@ -892,7 +900,7 @@ static void RootlessPolyRectangle(DrawablePtr dst, GCPtr pGC, int nRects, xRectangle *pRects) { GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("poly rectangle start "); RootlessStartDrawing((WindowPtr) dst); @@ -953,7 +961,7 @@ static void RootlessPolyRectangle(DrawablePtr dst, GCPtr pGC, static void RootlessPolyArc(DrawablePtr dst, GCPtr pGC, int narcs, xArc *parcs) { GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("poly arc start "); RootlessStartDrawing((WindowPtr) dst); @@ -1009,7 +1017,7 @@ static void RootlessFillPolygon(DrawablePtr dst, GCPtr pGC, { GC_SAVE(pGC); GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("fill poly start (win 0x%x, fillStyle 0x%x)", dst, pGC->fillStyle); @@ -1083,7 +1091,7 @@ static void RootlessPolyFillRect(DrawablePtr dst, GCPtr pGC, { GC_SAVE(pGC); GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("fill rect start (win 0x%x, fillStyle 0x%x)", dst, pGC->fillStyle); @@ -1138,7 +1146,7 @@ static void RootlessPolyFillArc(DrawablePtr dst, GCPtr pGC, { GC_SAVE(pGC); GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("fill arc start "); if (narcsInit > 0) { @@ -1193,7 +1201,7 @@ static void RootlessImageText8(DrawablePtr dst, GCPtr pGC, { GC_SAVE(pGC); GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("imagetext8 start "); if (count > 0) { @@ -1247,7 +1255,10 @@ static int RootlessPolyText8(DrawablePtr dst, GCPtr pGC, GCOP_UNWRAP(pGC); if (GC_IS_ROOT(dst)) + { + GCOP_WRAP(pGC); return 0; + } RL_DEBUG_MSG("polytext8 start "); @@ -1285,7 +1296,7 @@ static void RootlessImageText16(DrawablePtr dst, GCPtr pGC, { GC_SAVE(pGC); GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("imagetext16 start "); if (count > 0) { @@ -1339,7 +1350,10 @@ static int RootlessPolyText16(DrawablePtr dst, GCPtr pGC, GCOP_UNWRAP(pGC); if (GC_IS_ROOT(dst)) + { + GCOP_WRAP(pGC); return 0; + } RL_DEBUG_MSG("polytext16 start "); @@ -1378,7 +1392,7 @@ static void RootlessImageGlyphBlt(DrawablePtr dst, GCPtr pGC, { GC_SAVE(pGC); GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("imageglyph start "); if (nglyphInit > 0) { @@ -1439,7 +1453,7 @@ static void RootlessPolyGlyphBlt(DrawablePtr dst, GCPtr pGC, CharInfoPtr *ppci, pointer pglyphBase) { GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("polyglyph start "); RootlessStartDrawing((WindowPtr) dst); @@ -1485,7 +1499,7 @@ RootlessPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr dst, BoxRec box; GCOP_UNWRAP(pGC); - GC_SKIP_ROOT(dst); + GC_SKIP_ROOT(dst, pGC); RL_DEBUG_MSG("push pixels start "); RootlessStartDrawing((WindowPtr) dst); diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/rootlessWindow.c index eb736b7f7..89c02f8c7 100644 --- a/miext/rootless/rootlessWindow.c +++ b/miext/rootless/rootlessWindow.c @@ -836,13 +836,13 @@ RootlessCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) top = TopLevelParent(pWin); if (top == NULL) { RL_DEBUG_MSG("no parent\n"); - return; + goto out; } winRec = WINREC(top); if (winRec == NULL) { RL_DEBUG_MSG("not framed\n"); - return; + goto out; } /* Move region to window local coords */ @@ -865,6 +865,7 @@ RootlessCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) RootlessDamageRegion(pWin, prgnSrc); } +out: REGION_UNINIT(pScreen, &rgnDst); fbValidateDrawable(&pWin->drawable); From f48087b6c33c1f84bf2cfc0744b1c38697321c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 9 Nov 2007 05:49:26 -0500 Subject: [PATCH 27/28] Regenerate GLX dispatch code for recent gl_API.xml changes (#12935). --- GL/glx/indirect_dispatch.c | 25 ------------------------- GL/glx/indirect_dispatch.h | 4 ---- GL/glx/indirect_dispatch_swap.c | 25 ------------------------- GL/glx/indirect_size_get.c | 4 ++++ GL/glx/indirect_table.c | 2 +- 5 files changed, 5 insertions(+), 55 deletions(-) diff --git a/GL/glx/indirect_dispatch.c b/GL/glx/indirect_dispatch.c index 00a9f9659..2afd3eb22 100644 --- a/GL/glx/indirect_dispatch.c +++ b/GL/glx/indirect_dispatch.c @@ -5169,31 +5169,6 @@ void __glXDisp_LoadProgramNV(GLbyte * pc) ) ); } -void __glXDisp_ProgramParameter4dvNV(GLbyte * pc) -{ -#ifdef __GLX_ALIGN64 - if ((unsigned long)(pc) & 7) { - (void) memmove(pc-4, pc, 40); - pc -= 4; - } -#endif - - CALL_ProgramParameter4dvNV( GET_DISPATCH(), ( - *(GLenum *)(pc + 0), - *(GLuint *)(pc + 4), - (const GLdouble *)(pc + 8) - ) ); -} - -void __glXDisp_ProgramParameter4fvNV(GLbyte * pc) -{ - CALL_ProgramParameter4fvNV( GET_DISPATCH(), ( - *(GLenum *)(pc + 0), - *(GLuint *)(pc + 4), - (const GLfloat *)(pc + 8) - ) ); -} - void __glXDisp_ProgramParameters4dvNV(GLbyte * pc) { const GLuint num = *(GLuint *)(pc + 8); diff --git a/GL/glx/indirect_dispatch.h b/GL/glx/indirect_dispatch.h index bb39638fd..e81c382f0 100644 --- a/GL/glx/indirect_dispatch.h +++ b/GL/glx/indirect_dispatch.h @@ -149,8 +149,6 @@ extern HIDDEN int __glXDisp_GetProgramNamedParameterfvNV(struct __GLXclientState extern HIDDEN int __glXDispSwap_GetProgramNamedParameterfvNV(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN void __glXDisp_PointParameterfEXT(GLbyte * pc); extern HIDDEN void __glXDispSwap_PointParameterfEXT(GLbyte * pc); -extern HIDDEN void __glXDisp_ProgramParameter4dvNV(GLbyte * pc); -extern HIDDEN void __glXDispSwap_ProgramParameter4dvNV(GLbyte * pc); extern HIDDEN void __glXDisp_TexCoord2sv(GLbyte * pc); extern HIDDEN void __glXDispSwap_TexCoord2sv(GLbyte * pc); extern HIDDEN void __glXDisp_Vertex4dv(GLbyte * pc); @@ -425,8 +423,6 @@ extern HIDDEN void __glXDisp_FramebufferTexture1DEXT(GLbyte * pc); extern HIDDEN void __glXDispSwap_FramebufferTexture1DEXT(GLbyte * pc); extern HIDDEN int __glXDisp_GetDrawableAttributes(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDispSwap_GetDrawableAttributes(struct __GLXclientStateRec *, GLbyte *); -extern HIDDEN void __glXDisp_ProgramParameter4fvNV(GLbyte * pc); -extern HIDDEN void __glXDispSwap_ProgramParameter4fvNV(GLbyte * pc); extern HIDDEN void __glXDisp_RasterPos2sv(GLbyte * pc); extern HIDDEN void __glXDispSwap_RasterPos2sv(GLbyte * pc); extern HIDDEN void __glXDisp_Color4ubv(GLbyte * pc); diff --git a/GL/glx/indirect_dispatch_swap.c b/GL/glx/indirect_dispatch_swap.c index c0bb71cc4..f137cbe98 100644 --- a/GL/glx/indirect_dispatch_swap.c +++ b/GL/glx/indirect_dispatch_swap.c @@ -5325,31 +5325,6 @@ void __glXDispSwap_LoadProgramNV(GLbyte * pc) ) ); } -void __glXDispSwap_ProgramParameter4dvNV(GLbyte * pc) -{ -#ifdef __GLX_ALIGN64 - if ((unsigned long)(pc) & 7) { - (void) memmove(pc-4, pc, 40); - pc -= 4; - } -#endif - - CALL_ProgramParameter4dvNV( GET_DISPATCH(), ( - (GLenum )bswap_ENUM ( pc + 0 ), - (GLuint )bswap_CARD32 ( pc + 4 ), - (const GLdouble *)bswap_64_array( (uint64_t *) (pc + 8), 4 ) - ) ); -} - -void __glXDispSwap_ProgramParameter4fvNV(GLbyte * pc) -{ - CALL_ProgramParameter4fvNV( GET_DISPATCH(), ( - (GLenum )bswap_ENUM ( pc + 0 ), - (GLuint )bswap_CARD32 ( pc + 4 ), - (const GLfloat *)bswap_32_array( (uint32_t *) (pc + 8), 4 ) - ) ); -} - void __glXDispSwap_ProgramParameters4dvNV(GLbyte * pc) { const GLuint num = (GLuint )bswap_CARD32 ( pc + 8 ); diff --git a/GL/glx/indirect_size_get.c b/GL/glx/indirect_size_get.c index 928571440..f64fb7ece 100644 --- a/GL/glx/indirect_size_get.c +++ b/GL/glx/indirect_size_get.c @@ -652,6 +652,10 @@ __glGetBooleanv_size(GLenum e) case GL_WEIGHT_ARRAY_SIZE_ARB: case GL_WEIGHT_ARRAY_ARB: case GL_PACK_INVERT_MESA: + case GL_STENCIL_BACK_FUNC_ATI: + case GL_STENCIL_BACK_FAIL_ATI: + case GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI: + case GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI: case GL_FRAGMENT_PROGRAM_ARB: case GL_MAX_DRAW_BUFFERS_ARB: /* case GL_MAX_DRAW_BUFFERS_ATI:*/ diff --git a/GL/glx/indirect_table.c b/GL/glx/indirect_table.c index 3da1f437c..cb3202605 100644 --- a/GL/glx/indirect_table.c +++ b/GL/glx/indirect_table.c @@ -644,7 +644,7 @@ static const void *Render_function_table[400][2] = { /* [ 301] = 4181 */ {__glXDisp_ExecuteProgramNV, __glXDispSwap_ExecuteProgramNV}, /* [ 302] = 4182 */ {__glXDisp_RequestResidentProgramsNV, __glXDispSwap_RequestResidentProgramsNV}, /* [ 303] = 4183 */ {__glXDisp_LoadProgramNV, __glXDispSwap_LoadProgramNV}, - /* [ 304] = 4184 */ {__glXDisp_ProgramParameter4fvNV, __glXDispSwap_ProgramParameter4fvNV}, + /* [ 304] = 4184 */ {__glXDisp_ProgramEnvParameter4fvARB, __glXDispSwap_ProgramEnvParameter4fvARB}, /* [ 305] = 4185 */ {__glXDisp_ProgramEnvParameter4dvARB, __glXDispSwap_ProgramEnvParameter4dvARB}, /* [ 306] = 4186 */ {__glXDisp_ProgramParameters4fvNV, __glXDispSwap_ProgramParameters4fvNV}, /* [ 307] = 4187 */ {__glXDisp_ProgramParameters4dvNV, __glXDispSwap_ProgramParameters4dvNV}, From f7dd0c72b8f861f4d5443a43d1013e3fe3db43ca Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Mon, 12 Nov 2007 15:11:03 +0100 Subject: [PATCH 28/28] Only clear crtc of output if it is the one we're actually working on. Upon recreation of the RandR internal data structures in RRCrtcNotify() the crtc of an output could be NULLed if the crtc was shared (cloned) between two outputs and one of them got another crtc assigned. --- randr/rrcrtc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index db5007e28..43cfb2923 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -150,7 +150,8 @@ RRCrtcNotify (RRCrtcPtr crtc, break; if (i == numOutputs) { - crtc->outputs[j]->crtc = NULL; + if (crtc->outputs[j]->crtc == crtc) + crtc->outputs[j]->crtc = NULL; RROutputChanged (crtc->outputs[j], FALSE); RRCrtcChanged (crtc, FALSE); }