From 7e385598613778de14c0feea0d32f17d7aa66a8e Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Fri, 6 Apr 2007 13:38:12 +0300 Subject: [PATCH 01/34] GLcore: fix after moving xf86glx_util.[hc] to Mesa. --- GL/mesa/.gitignore | 2 +- GL/mesa/X/Makefile.am | 5 +- GL/mesa/X/xf86glx_util.c | 149 --------------------------------------- GL/mesa/X/xf86glx_util.h | 105 --------------------------- GL/symlink-mesa.sh | 2 + 5 files changed, 5 insertions(+), 258 deletions(-) delete mode 100644 GL/mesa/X/xf86glx_util.c delete mode 100644 GL/mesa/X/xf86glx_util.h diff --git a/GL/mesa/.gitignore b/GL/mesa/.gitignore index a00885d6d..6b92b24bd 100644 --- a/GL/mesa/.gitignore +++ b/GL/mesa/.gitignore @@ -1,6 +1,6 @@ X/drivers X/glxheader.h -X/xmesaP.h +X/xm*.h X/xm*.c mesa/drivers mesa/glxheader.h diff --git a/GL/mesa/X/Makefile.am b/GL/mesa/X/Makefile.am index 056d31ab5..f8f16c39e 100644 --- a/GL/mesa/X/Makefile.am +++ b/GL/mesa/X/Makefile.am @@ -22,14 +22,13 @@ AM_CFLAGS = \ -DXFree86Server \ @GLX_DEFINES@ -libX_la_SOURCES = xf86glx.c \ - xf86glx_util.c \ - xf86glx_util.h +libX_la_SOURCES = xf86glx.c nodist_libX_la_SOURCES = \ xm_api.c \ xm_buffer.c \ xm_dd.c \ + xm_image.c \ xm_line.c \ xm_span.c \ xm_tri.c \ diff --git a/GL/mesa/X/xf86glx_util.c b/GL/mesa/X/xf86glx_util.c deleted file mode 100644 index 6af773f53..000000000 --- a/GL/mesa/X/xf86glx_util.c +++ /dev/null @@ -1,149 +0,0 @@ -/************************************************************************** - -Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. -All Rights Reserved. - -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, sub license, 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 NON-INFRINGEMENT. -IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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. - -**************************************************************************/ - -/* - * Authors: - * Kevin E. Martin - * Brian Paul - */ - -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - -#include - -#include "xf86glx_util.h" -#include - -#ifdef ROUNDUP -#undef ROUNDUP -#endif - -#define ROUNDUP(nbytes, pad) ((((nbytes) + ((pad)-1)) / (pad)) * ((pad)>>3)) - -XMesaImage *XMesaCreateImage(int bitsPerPixel, int width, int height, char *data) -{ - XMesaImage *image; - - image = (XMesaImage *)xalloc(sizeof(XMesaImage)); - - if (image) { - image->width = width; - image->height = height; - image->data = data; - /* Always pad to 32 bits */ - image->bytes_per_line = ROUNDUP((bitsPerPixel * width), 32); - image->bits_per_pixel = bitsPerPixel; - } - - return image; -} - -void XMesaDestroyImage(XMesaImage *image) -{ - if (image->data) - free(image->data); - xfree(image); -} - -unsigned long XMesaGetPixel(XMesaImage *image, int x, int y) -{ - CARD8 *row = (CARD8 *)(image->data + y*image->bytes_per_line); - CARD8 *i8; - CARD16 *i16; - CARD32 *i32; - switch (image->bits_per_pixel) { - case 8: - i8 = (CARD8 *)row; - return i8[x]; - break; - case 15: - case 16: - i16 = (CARD16 *)row; - return i16[x]; - break; - case 24: /* WARNING: architecture specific code */ - i8 = (CARD8 *)row; - return (((CARD32)i8[x*3]) | - (((CARD32)i8[x*3+1])<<8) | - (((CARD32)i8[x*3+2])<<16)); - break; - case 32: - i32 = (CARD32 *)row; - return i32[x]; - break; - } - return 0; -} - -#ifndef XMESA_USE_PUTPIXEL_MACRO -void XMesaPutPixel(XMesaImage *image, int x, int y, unsigned long pixel) -{ - CARD8 *row = (CARD8 *)(image->data + y*image->bytes_per_line); - CARD8 *i8; - CARD16 *i16; - CARD32 *i32; - switch (image->bits_per_pixel) { - case 8: - i8 = (CARD8 *)row; - i8[x] = (CARD8)pixel; - break; - case 15: - case 16: - i16 = (CARD16 *)row; - i16[x] = (CARD16)pixel; - break; - case 24: /* WARNING: architecture specific code */ - i8 = (CARD8 *)__row; - i8[x*3] = (CARD8)(p); - i8[x*3+1] = (CARD8)(p>>8); - i8[x*3+2] = (CARD8)(p>>16); - case 32: - i32 = (CARD32 *)row; - i32[x] = (CARD32)pixel; - break; - } -} -#endif - -void XMesaPutImageHelper(ScreenPtr display, - DrawablePtr d, GCPtr gc, - XMesaImage *image, - int src_x, int src_y, - int dest_x, int dest_y, - unsigned int width, unsigned int height) -{ - /* NOT_DONE: Verify that the following works for all depths */ - char *src = (image->data + - src_y * image->bytes_per_line + - ((src_x * image->bits_per_pixel) >> 3)); - - ValidateGC(d, gc); - (*gc->ops->PutImage)(d, gc, d->depth, dest_x, dest_y, width, height, - 0, ZPixmap, src); -} diff --git a/GL/mesa/X/xf86glx_util.h b/GL/mesa/X/xf86glx_util.h deleted file mode 100644 index bb314128d..000000000 --- a/GL/mesa/X/xf86glx_util.h +++ /dev/null @@ -1,105 +0,0 @@ -/************************************************************************** - -Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. -All Rights Reserved. - -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, sub license, 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 NON-INFRINGEMENT. -IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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. - -**************************************************************************/ - -/* - * Authors: - * Kevin E. Martin - * Brian Paul - */ - -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - -#ifndef _XF86GLX_UTIL_H_ -#define _XF86GLX_UTIL_H_ - -#ifdef __CYGWIN__ -#undef WIN32 -#undef _WIN32 -#endif - -#include -#include -#include -#include "GL/xmesa.h" - -#define XMESA_USE_PUTPIXEL_MACRO - -struct _XMesaImageRec { - int width, height; - char *data; - int bytes_per_line; /* Padded to 32 bits */ - int bits_per_pixel; -}; - -extern XMesaImage *XMesaCreateImage(int bitsPerPixel, int width, int height, - char *data); -extern void XMesaDestroyImage(XMesaImage *image); -extern unsigned long XMesaGetPixel(XMesaImage *image, int x, int y); -#ifdef XMESA_USE_PUTPIXEL_MACRO -#define XMesaPutPixel(__i,__x,__y,__p) \ -{ \ - CARD8 *__row = (CARD8 *)(__i->data + __y*__i->bytes_per_line); \ - CARD8 *__i8; \ - CARD16 *__i16; \ - CARD32 *__i32; \ - switch (__i->bits_per_pixel) { \ - case 8: \ - __i8 = (CARD8 *)__row; \ - __i8[__x] = (CARD8)__p; \ - break; \ - case 15: \ - case 16: \ - __i16 = (CARD16 *)__row; \ - __i16[__x] = (CARD16)__p; \ - break; \ - case 24: /* WARNING: architecture specific code */ \ - __i8 = (CARD8 *)__row; \ - __i8[__x*3] = (CARD8)(__p); \ - __i8[__x*3+1] = (CARD8)(__p>>8); \ - __i8[__x*3+2] = (CARD8)(__p>>16); \ - break; \ - case 32: \ - __i32 = (CARD32 *)__row; \ - __i32[__x] = (CARD32)__p; \ - break; \ - } \ -} -#else -extern void XMesaPutPixel(XMesaImage *image, int x, int y, - unsigned long pixel); -#endif - -extern void XMesaPutImageHelper(ScreenPtr display, - DrawablePtr d, GCPtr gc, - XMesaImage *image, - int src_x, int src_y, - int dest_x, int dest_y, - unsigned int width, unsigned int height); - -#endif /* _XF86GLX_UTIL_H_ */ diff --git a/GL/symlink-mesa.sh b/GL/symlink-mesa.sh index 3d96716d5..0cfe1c9b6 100755 --- a/GL/symlink-mesa.sh +++ b/GL/symlink-mesa.sh @@ -168,6 +168,8 @@ symlink_mesa_x() { action xm_api.c action xm_buffer.c action xm_dd.c + action xm_image.c + action xm_image.h action xm_line.c action xm_span.c action xm_tri.c From 0a6ac992363343487dfe0a0fc985ea55bd448382 Mon Sep 17 00:00:00 2001 From: Brian Date: Sat, 7 Apr 2007 12:41:57 -0600 Subject: [PATCH 02/34] regenerated to fix bug 10371 --- GL/glx/indirect_size_get.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GL/glx/indirect_size_get.c b/GL/glx/indirect_size_get.c index 150c6a182..ccb25f80e 100644 --- a/GL/glx/indirect_size_get.c +++ b/GL/glx/indirect_size_get.c @@ -639,7 +639,7 @@ __glGetBooleanv_size(GLenum e) case GL_PROGRAM_ERROR_POSITION_ARB: case GL_DEPTH_CLAMP_NV: case GL_NUM_COMPRESSED_TEXTURE_FORMATS: -/* case GL_NUM_TEXTURE_COMPRESSED_FORMATS_ARB:*/ +/* case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:*/ case GL_MAX_VERTEX_UNITS_ARB: case GL_ACTIVE_VERTEX_UNITS_ARB: case GL_WEIGHT_SUM_UNITY_ARB: @@ -699,6 +699,8 @@ __glGetBooleanv_size(GLenum e) /* case GL_POINT_SPRITE_NV:*/ case GL_POINT_SPRITE_R_MODE_NV: case GL_MAX_VERTEX_ATTRIBS_ARB: + case GL_MAX_TEXTURE_COORDS_ARB: + case GL_MAX_TEXTURE_IMAGE_UNITS_ARB: case GL_DEPTH_BOUNDS_TEST_EXT: case GL_STENCIL_TEST_TWO_SIDE_EXT: case GL_ACTIVE_STENCIL_FACE_EXT: @@ -1005,8 +1007,6 @@ __glGetProgramivARB_size(GLenum e) case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB: case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB: case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB: - case GL_MAX_TEXTURE_COORDS_ARB: - case GL_MAX_TEXTURE_IMAGE_UNITS_ARB: case GL_PROGRAM_FORMAT_ARB: case GL_PROGRAM_INSTRUCTIONS_ARB: case GL_MAX_PROGRAM_INSTRUCTIONS_ARB: From 4beeab8424774ea4c3142f29b90e33f1fc7cb154 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sun, 8 Apr 2007 13:39:06 +0300 Subject: [PATCH 03/34] XFree86: Treat evdev and vmmouse as mouse drivers (bug #10512, #10559) When we see an evdev or vmmouse section, assume that it's a mouse, and don't add a default mouse device. This will break users who have an evdev keyboard section but no mouse, and want the mouse to get added by default. --- hw/xfree86/common/xf86Config.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 4db844e19..cbeda0bd1 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -1287,9 +1287,13 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) * always synthesize a 'mouse' section configured to send core * events, unless a 'void' section is found, in which case the user * probably wants to run footless. + * + * If you're using an evdev keyboard and expect a default mouse + * section ... deal. */ for (i = servlayoutp->inputs; i->identifier && i->driver; i++) { - if (!strcmp(i->driver, "void") || !strcmp(i->driver, "mouse")) { + if (!strcmp(i->driver, "void") || !strcmp(i->driver, "mouse") || + !strcmp(i->driver, "vmmouse") || !strcmp(i->driver, "evdev")) { found = 1; break; } } From 4c2e28b0916b5f75cfefb6df9fa0a7a09675539a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 9 Apr 2007 12:28:53 -0700 Subject: [PATCH 04/34] Add setrlimit call in -core option to make dumps occur. Default core size limit for most environments is 0, which disables core dumps. Add code in the -core option processing path to set the core limit to the maximum value. --- os/utils.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/os/utils.c b/os/utils.c index e605a6c7a..5058285e8 100644 --- a/os/utils.c +++ b/os/utils.c @@ -64,6 +64,8 @@ OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include +#include #include "misc.h" #include #define XSERV_t @@ -795,7 +797,13 @@ ProcessCommandLine(int argc, char *argv[]) UseMsg(); } else if ( strcmp( argv[i], "-core") == 0) + { + struct rlimit core_limit; CoreDump = TRUE; + getrlimit (RLIMIT_CORE, &core_limit); + core_limit.rlim_cur = core_limit.rlim_max; + setrlimit (RLIMIT_CORE, &core_limit); + } else if ( strcmp( argv[i], "-dpi") == 0) { if(++i < argc) From f24391dbfd12a84253dfec794ee7884afd52e197 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 9 Apr 2007 12:30:31 -0700 Subject: [PATCH 05/34] In AIGLX EnterVT processing, invoke driver EnterVT before resuming glx. As the driver EnterVT function generally re-enables the hardware and prepares it for rendering, it must be called before any gl functions are called which could touch the hardware. --- GL/glx/glxdri.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c index 5e683a8ab..c30f372fd 100644 --- a/GL/glx/glxdri.c +++ b/GL/glx/glxdri.c @@ -829,12 +829,16 @@ static Bool glxDRIEnterVT (int index, int flags) { __GLXDRIscreen *screen = (__GLXDRIscreen *) __glXgetActiveScreen(index); + Bool ret; LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n"); + if (!(*screen->enterVT) (index, flags)) + return FALSE; + glxResumeClients(); - return (*screen->enterVT) (index, flags); + return TRUE; } static void From 1f6741db19d4c91b1eacb497dff1814acb1bf0c3 Mon Sep 17 00:00:00 2001 From: Stefan Huehner Date: Mon, 9 Apr 2007 14:33:15 -0700 Subject: [PATCH 06/34] Bug #10560: Code-Cleanup: function declarations () -> (void) X.Org Bugzilla #10560: Patch #9511 --- Xext/sync.c | 2 +- Xext/xvmain.c | 8 ++++---- Xext/xvmc.c | 2 +- config/config.c | 4 ++-- dix/atom.c | 6 +++--- dix/devices.c | 12 ++++++------ dix/dispatch.c | 8 ++++---- dix/dixfonts.c | 4 ++-- dix/dixutils.c | 4 ++-- dix/events.c | 16 ++++++++-------- dix/extension.c | 2 +- dix/getevents.c | 4 ++-- dix/initatoms.c | 2 +- dix/main.c | 2 +- dix/privates.c | 28 ++++++++++++++-------------- dix/resource.c | 4 ++-- hw/xnest/Display.c | 2 +- hw/xnest/Events.c | 8 ++++---- mi/micmap.c | 4 ++-- mi/mieq.c | 4 ++-- os/log.c | 4 ++-- os/oscolor.c | 2 +- render/glyph.c | 4 ++-- 23 files changed, 68 insertions(+), 68 deletions(-) diff --git a/Xext/sync.c b/Xext/sync.c index 531b48cc1..c5441a115 100644 --- a/Xext/sync.c +++ b/Xext/sync.c @@ -2509,7 +2509,7 @@ ServertimeBracketValues(pCounter, pbracket_less, pbracket_greater) } static void -SyncInitServerTime() +SyncInitServerTime(void) { CARD64 resolution; diff --git a/Xext/xvmain.c b/Xext/xvmain.c index 22339011c..ddf3d1d6b 100644 --- a/Xext/xvmain.c +++ b/Xext/xvmain.c @@ -153,7 +153,7 @@ static int XvdiSendVideoNotify(XvPortPtr, DrawablePtr, int); */ void -XvExtensionInit() +XvExtensionInit(void) { ExtensionEntry *extEntry; @@ -205,7 +205,7 @@ XvExtensionInit() } static Bool -CreateResourceTypes() +CreateResourceTypes(void) { @@ -335,13 +335,13 @@ XvResetProc(ExtensionEntry* extEntry) } _X_EXPORT int -XvGetScreenIndex() +XvGetScreenIndex(void) { return XvScreenIndex; } _X_EXPORT unsigned long -XvGetRTPort() +XvGetRTPort(void) { return XvRTPort; } diff --git a/Xext/xvmc.c b/Xext/xvmc.c index 737fc5dfd..ae358936e 100644 --- a/Xext/xvmc.c +++ b/Xext/xvmc.c @@ -675,7 +675,7 @@ SProcXvMCDispatch (ClientPtr client) } void -XvMCExtensionInit() +XvMCExtensionInit(void) { ExtensionEntry *extEntry; diff --git a/config/config.c b/config/config.c index 6c4014352..d72b588dc 100644 --- a/config/config.c +++ b/config/config.c @@ -410,13 +410,13 @@ configReconnect(OsTimerPtr timer, CARD32 time, pointer arg) } void -configInitialise() +configInitialise(void) { TimerSet(NULL, 0, 1, configReconnect, NULL); } void -configFini() +configFini(void) { DBusError error; diff --git a/dix/atom.c b/dix/atom.c index bd3223caa..6ae3e31df 100644 --- a/dix/atom.c +++ b/dix/atom.c @@ -167,7 +167,7 @@ NameForAtom(Atom atom) } void -AtomError() +AtomError(void) { FatalError("initializing atoms"); } @@ -185,7 +185,7 @@ FreeAtom(NodePtr patom) } void -FreeAllAtoms() +FreeAllAtoms(void) { if(atomRoot == (NodePtr)NULL) return; @@ -197,7 +197,7 @@ FreeAllAtoms() } void -InitAtoms() +InitAtoms(void) { FreeAllAtoms(); tableLength = InitialTableSize; diff --git a/dix/devices.c b/dix/devices.c index f622be756..9631c8678 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -314,7 +314,7 @@ CorePointerProc(DeviceIntPtr pDev, int what) } void -InitCoreDevices() +InitCoreDevices(void) { DeviceIntPtr dev; @@ -373,7 +373,7 @@ InitCoreDevices() } int -InitAndStartDevices() +InitAndStartDevices(void) { DeviceIntPtr dev, next; @@ -503,7 +503,7 @@ CloseDevice(DeviceIntPtr dev) } void -CloseDownDevices() +CloseDownDevices(void) { DeviceIntPtr dev, next; @@ -580,7 +580,7 @@ RemoveDevice(DeviceIntPtr dev) } int -NumMotionEvents() +NumMotionEvents(void) { return inputInfo.pointer->valuator->numMotionEvents; } @@ -598,13 +598,13 @@ RegisterKeyboardDevice(DeviceIntPtr device) } _X_EXPORT DevicePtr -LookupKeyboardDevice() +LookupKeyboardDevice(void) { return inputInfo.keyboard ? &inputInfo.keyboard->public : NULL; } _X_EXPORT DevicePtr -LookupPointerDevice() +LookupPointerDevice(void) { return inputInfo.pointer ? &inputInfo.pointer->public : NULL; } diff --git a/dix/dispatch.c b/dix/dispatch.c index 490b29c34..6aba9dbb1 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -218,7 +218,7 @@ SetInputCheck(HWEventQueuePtr c0, HWEventQueuePtr c1) } _X_EXPORT void -UpdateCurrentTime() +UpdateCurrentTime(void) { TimeStamp systime; @@ -237,7 +237,7 @@ UpdateCurrentTime() /* Like UpdateCurrentTime, but can't call ProcessInputEvents */ _X_EXPORT void -UpdateCurrentTimeIf() +UpdateCurrentTimeIf(void) { TimeStamp systime; @@ -250,7 +250,7 @@ UpdateCurrentTimeIf() } void -InitSelections() +InitSelections(void) { if (CurrentSelections) xfree(CurrentSelections); @@ -3654,7 +3654,7 @@ CloseDownClient(ClientPtr client) } static void -KillAllClients() +KillAllClients(void) { int i; for (i=1; imyNum; @@ -1114,7 +1114,7 @@ FreezeThaw(DeviceIntPtr dev, Bool frozen) } void -ComputeFreezes() +ComputeFreezes(void) { DeviceIntPtr replayDev = syncEvents.replayDev; int i; @@ -2047,7 +2047,7 @@ CheckMotion(xEvent *xE) } _X_EXPORT void -WindowsRestructured() +WindowsRestructured(void) { (void) CheckMotion((xEvent *)NULL); } @@ -3970,7 +3970,7 @@ ProcQueryPointer(ClientPtr client) } void -InitEvents() +InitEvents(void) { int i; diff --git a/dix/extension.c b/dix/extension.c index 88dff15e2..186574d76 100644 --- a/dix/extension.c +++ b/dix/extension.c @@ -278,7 +278,7 @@ MinorOpcodeOfRequest(ClientPtr client) } void -CloseDownExtensions() +CloseDownExtensions(void) { int i,j; diff --git a/dix/getevents.c b/dix/getevents.c index 3f636bc80..62f3bcb7f 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -73,7 +73,7 @@ extern Bool XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies); * Pick some arbitrary size for Xi motion history. */ _X_EXPORT int -GetMotionHistorySize() +GetMotionHistorySize(void) { return MOTION_HISTORY_SIZE; } @@ -183,7 +183,7 @@ updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator, * xEvent *events = xcalloc(sizeof(xEvent), GetMaximumEventsNum()); */ _X_EXPORT int -GetMaximumEventsNum() { +GetMaximumEventsNum(void) { /* Two base events -- core and device, plus valuator events. Multiply * by two if we're doing key repeats. */ int ret = 2 + MAX_VALUATOR_EVENTS; diff --git a/dix/initatoms.c b/dix/initatoms.c index a5972afd6..de101bd0f 100644 --- a/dix/initatoms.c +++ b/dix/initatoms.c @@ -11,7 +11,7 @@ #include #include "misc.h" #include "dix.h" -void MakePredeclaredAtoms() +void MakePredeclaredAtoms(void) { if (MakeAtom("PRIMARY", 7, 1) != XA_PRIMARY) AtomError(); if (MakeAtom("SECONDARY", 9, 1) != XA_SECONDARY) AtomError(); diff --git a/dix/main.c b/dix/main.c index 92c30b639..9a67ed9bb 100644 --- a/dix/main.c +++ b/dix/main.c @@ -544,7 +544,7 @@ static int padlength[4] = {0, 3, 2, 1}; static #endif Bool -CreateConnectionBlock() +CreateConnectionBlock(void) { xConnSetup setup; xWindowRoot root; diff --git a/dix/privates.c b/dix/privates.c index a66fc3df0..246597117 100644 --- a/dix/privates.c +++ b/dix/privates.c @@ -60,7 +60,7 @@ unsigned *extensionPrivateSizes; unsigned totalExtensionSize; void -ResetExtensionPrivates() +ResetExtensionPrivates(void) { extensionPrivateCount = 0; extensionPrivateLen = 0; @@ -71,7 +71,7 @@ ResetExtensionPrivates() } _X_EXPORT int -AllocateExtensionPrivateIndex() +AllocateExtensionPrivateIndex(void) { return extensionPrivateCount++; } @@ -117,7 +117,7 @@ unsigned *clientPrivateSizes; unsigned totalClientSize; void -ResetClientPrivates() +ResetClientPrivates(void) { clientPrivateCount = 0; clientPrivateLen = 0; @@ -128,7 +128,7 @@ ResetClientPrivates() } _X_EXPORT int -AllocateClientPrivateIndex() +AllocateClientPrivateIndex(void) { return clientPrivateCount++; } @@ -171,7 +171,7 @@ AllocateClientPrivate(int index2, unsigned amount) int screenPrivateCount; void -ResetScreenPrivates() +ResetScreenPrivates(void) { screenPrivateCount = 0; } @@ -180,7 +180,7 @@ ResetScreenPrivates() * so we have to worry about resizing existing devPrivates */ _X_EXPORT int -AllocateScreenPrivateIndex() +AllocateScreenPrivateIndex(void) { int idx; int i; @@ -213,13 +213,13 @@ AllocateScreenPrivateIndex() static int windowPrivateCount; void -ResetWindowPrivates() +ResetWindowPrivates(void) { windowPrivateCount = 0; } _X_EXPORT int -AllocateWindowPrivateIndex() +AllocateWindowPrivateIndex(void) { return windowPrivateCount++; } @@ -263,13 +263,13 @@ AllocateWindowPrivate(ScreenPtr pScreen, int index2, unsigned amount) static int gcPrivateCount; void -ResetGCPrivates() +ResetGCPrivates(void) { gcPrivateCount = 0; } _X_EXPORT int -AllocateGCPrivateIndex() +AllocateGCPrivateIndex(void) { return gcPrivateCount++; } @@ -312,13 +312,13 @@ AllocateGCPrivate(ScreenPtr pScreen, int index2, unsigned amount) static int pixmapPrivateCount; void -ResetPixmapPrivates() +ResetPixmapPrivates(void) { pixmapPrivateCount = 0; } _X_EXPORT int -AllocatePixmapPrivateIndex() +AllocatePixmapPrivateIndex(void) { return pixmapPrivateCount++; } @@ -363,7 +363,7 @@ AllocatePixmapPrivate(ScreenPtr pScreen, int index2, unsigned amount) int colormapPrivateCount; void -ResetColormapPrivates() +ResetColormapPrivates(void) { colormapPrivateCount = 0; } @@ -424,7 +424,7 @@ AllocateColormapPrivateIndex (InitCmapPrivFunc initPrivFunc) static int devicePrivateIndex = 0; _X_EXPORT int -AllocateDevicePrivateIndex() +AllocateDevicePrivateIndex(void) { return devicePrivateIndex++; } diff --git a/dix/resource.c b/dix/resource.c index a5a7eed80..f4bf1fcf6 100644 --- a/dix/resource.c +++ b/dix/resource.c @@ -235,7 +235,7 @@ CreateNewResourceType(DeleteType deleteFunc) } _X_EXPORT RESTYPE -CreateNewResourceClass() +CreateNewResourceClass(void) { RESTYPE next = lastResourceClass >> 1; @@ -844,7 +844,7 @@ FreeClientResources(ClientPtr client) } void -FreeAllResources() +FreeAllResources(void) { int i; diff --git a/hw/xnest/Display.c b/hw/xnest/Display.c index 1ec0609d9..01290417c 100644 --- a/hw/xnest/Display.c +++ b/hw/xnest/Display.c @@ -176,7 +176,7 @@ xnestOpenDisplay(int argc, char *argv[]) } void -xnestCloseDisplay() +xnestCloseDisplay(void) { if (!xnestDoFullGeneration || !xnestDisplay) return; diff --git a/hw/xnest/Events.c b/hw/xnest/Events.c index a20924128..38fefa7a2 100644 --- a/hw/xnest/Events.c +++ b/hw/xnest/Events.c @@ -52,7 +52,7 @@ ProcessInputEvents() } int -TimeSinceLastInputEvent() +TimeSinceLastInputEvent(void) { if (lastEventTime == 0) lastEventTime = GetTimeInMillis(); @@ -60,7 +60,7 @@ TimeSinceLastInputEvent() } void -SetTimeSinceLastInputEvent() +SetTimeSinceLastInputEvent(void) { lastEventTime = GetTimeInMillis(); } @@ -78,7 +78,7 @@ xnestNotExposurePredicate(Display *display, XEvent *event, char *args) } void -xnestCollectExposures() +xnestCollectExposures(void) { XEvent X; WindowPtr pWin; @@ -113,7 +113,7 @@ xnestQueueKeyEvent(int type, unsigned int keycode) } void -xnestCollectEvents() +xnestCollectEvents(void) { XEvent X; xEvent x; diff --git a/mi/micmap.c b/mi/micmap.c index 977c587a0..33d948179 100644 --- a/mi/micmap.c +++ b/mi/micmap.c @@ -385,7 +385,7 @@ static int miVisualPriority[] = { static miVisualsPtr miVisuals; _X_EXPORT void -miClearVisualTypes() +miClearVisualTypes(void) { miVisualsPtr v; @@ -690,7 +690,7 @@ miDoInitVisuals(VisualPtr *visualp, DepthPtr *depthp, int *nvisualp, } void -miResetInitVisuals() +miResetInitVisuals(void) { miInitVisualsProc = miDoInitVisuals; } diff --git a/mi/mieq.c b/mi/mieq.c index 5bd87ebdb..34509cd3f 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -80,7 +80,7 @@ typedef struct _EventQueue { static EventQueueRec miEventQueue; Bool -mieqInit() +mieqInit(void) { int i; @@ -195,7 +195,7 @@ mieqSetHandler(int event, mieqHandler handler) /* Call this from ProcessInputEvents(). */ void -mieqProcessInputEvents() +mieqProcessInputEvents(void) { EventRec *e = NULL; int x = 0, y = 0; diff --git a/os/log.c b/os/log.c index b1d628c3f..e8aa3fa01 100644 --- a/os/log.c +++ b/os/log.c @@ -221,7 +221,7 @@ LogInit(const char *fname, const char *backup) } void -LogClose() +LogClose(void) { if (logFile) { fclose(logFile); @@ -616,7 +616,7 @@ Error(char *str) } void -LogPrintMarkers() +LogPrintMarkers(void) { /* Show what the message marker symbols mean. */ ErrorF("Markers: "); diff --git a/os/oscolor.c b/os/oscolor.c index a13a3a68c..d53e4d8ff 100644 --- a/os/oscolor.c +++ b/os/oscolor.c @@ -102,7 +102,7 @@ typedef struct _builtinColor { #define NUM_BUILTIN_COLORS (sizeof (BuiltinColors) / sizeof (BuiltinColors[0])) Bool -OsInitColors() +OsInitColors(void) { return TRUE; } diff --git a/render/glyph.c b/render/glyph.c index 5987cbc70..583a52ba3 100644 --- a/render/glyph.c +++ b/render/glyph.c @@ -86,13 +86,13 @@ static int globalTotalGlyphPrivateSize = 0; static int glyphPrivateCount = 0; void -ResetGlyphPrivates () +ResetGlyphPrivates (void) { glyphPrivateCount = 0; } int -AllocateGlyphPrivateIndex () +AllocateGlyphPrivateIndex (void) { return glyphPrivateCount++; } From 72b477f964c748a1ab668781643cc11877f19738 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 9 Apr 2007 18:59:01 -0400 Subject: [PATCH 07/34] Don't write out empty sections from the parser. --- hw/xfree86/parser/write.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/hw/xfree86/parser/write.c b/hw/xfree86/parser/write.c index 1869f56a6..3924001f7 100644 --- a/hw/xfree86/parser/write.c +++ b/hw/xfree86/parser/write.c @@ -107,13 +107,19 @@ doWriteConfigFile (const char *filename, XF86ConfigPtr cptr) xf86printLayoutSection (cf, cptr->conf_layout_lst); - fprintf (cf, "Section \"Files\"\n"); - xf86printFileSection (cf, cptr->conf_files); - fprintf (cf, "EndSection\n\n"); + if (cptr->conf_files != NULL) + { + fprintf (cf, "Section \"Files\"\n"); + xf86printFileSection (cf, cptr->conf_files); + fprintf (cf, "EndSection\n\n"); + } - fprintf (cf, "Section \"Module\"\n"); - xf86printModuleSection (cf, cptr->conf_modules); - fprintf (cf, "EndSection\n\n"); + if (cptr->conf_modules != NULL) + { + fprintf (cf, "Section \"Module\"\n"); + xf86printModuleSection (cf, cptr->conf_modules); + fprintf (cf, "EndSection\n\n"); + } xf86printVendorSection (cf, cptr->conf_vendor_lst); From a08d5157f70567a0aa9583d4a15e62437340cf34 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 9 Apr 2007 19:04:56 -0400 Subject: [PATCH 08/34] VT activate or waitactive are fatal if they fail. Also, be sure to waitactive on the way down, to make sure we're off the VT before exiting. --- hw/xfree86/os-support/linux/lnx_init.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c index 85b6def56..9775180a8 100644 --- a/hw/xfree86/os-support/linux/lnx_init.c +++ b/hw/xfree86/os-support/linux/lnx_init.c @@ -245,15 +245,15 @@ xf86OpenConsole(void) lnx_savefont(); #endif /* - * now get the VT + * now get the VT. This _must_ succeed, or else fail completely. */ if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) < 0) - xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed: %s\n", - strerror(errno)); + FatalError("xf86OpenConsole: VT_ACTIVATE failed: %s\n", + strerror(errno)); if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) < 0) - xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed: %s\n", - strerror(errno)); + FatalError("xf86OpenConsole: VT_WAITACTIVE failed: %s\n", + strerror(errno)); if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0) FatalError("xf86OpenConsole: VT_GETMODE failed %s\n", @@ -350,6 +350,10 @@ xf86CloseConsole() if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, activeVT) < 0) xf86Msg(X_WARNING, "xf86CloseConsole: VT_ACTIVATE failed: %s\n", strerror(errno)); + if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, activeVT) < 0) + xf86Msg(X_WARNING, + "xf86CloseConsole: VT_WAITACTIVE failed: %s\n", + strerror(errno)); activeVT = -1; } From 67e1c98895a566f927e1ae2384d56cfca104f971 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 9 Apr 2007 19:08:52 -0400 Subject: [PATCH 09/34] Look for the PCI ROM file elsewhere in sysfs. /sys/devices reflects the bus topology, and we don't care that much. Easier (and more reliable) to just look in /sys/bus/pci/devices, which is a flat view. --- hw/xfree86/os-support/bus/linuxPci.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c index 55ed87859..2aaa89cc2 100644 --- a/hw/xfree86/os-support/bus/linuxPci.c +++ b/hw/xfree86/os-support/bus/linuxPci.c @@ -773,8 +773,8 @@ xf86ReadDomainMemory(PCITAG Tag, ADDRESS Base, int Len, unsigned char *Buf) bus = PCI_BUS_NO_DOMAIN(PCI_BUS_FROM_TAG(Tag)); dev = PCI_DEV_FROM_TAG(Tag); func = PCI_FUNC_FROM_TAG(Tag); - sprintf(file, "/sys/devices/pci%04x:%02x/%04x:%02x:%02x.%1x/rom", - dom, bus, dom, bus, dev, func); + sprintf(file, "/sys/bus/pci/devices/%04x:%02x:%02x.%1x/rom", + dom, bus, dev, func); /* * If the caller wants the ROM and the sysfs rom interface exists, From bcf17df69a232e5e84609abacdca36274316e170 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 9 Apr 2007 14:12:27 -0700 Subject: [PATCH 10/34] Disable CRTC when SetSingleMode has no matching mode. Update RandR as well. xf86SetSingleMode tries to resize all crtcs to match the selected mode. When a CRTC has no matching mode, it now disables the CRTC (instead of crashing). Also, poke the RandR extension when xf86SetSingleMode is done so that appropriate events can be delivered, and so that future RandR queries return correct information. (cherry picked from commit dc6c4f6989f87149d8605604f4514f5cbf11de67) --- hw/xfree86/modes/xf86Crtc.c | 10 ++++++++-- hw/xfree86/modes/xf86RandR12.c | 22 ++++++++++++++++++++++ hw/xfree86/modes/xf86RandR12.h | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 0fe03d372..7e7c7e7ec 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -233,8 +233,6 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, int saved_x, saved_y; Rotation saved_rotation; - adjusted_mode = xf86DuplicateMode(mode); - crtc->enabled = xf86CrtcInUse (crtc); if (!crtc->enabled) @@ -243,6 +241,8 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, return TRUE; } + adjusted_mode = xf86DuplicateMode(mode); + didLock = crtc->funcs->lock (crtc); saved_mode = crtc->mode; @@ -1833,6 +1833,11 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation) else crtc_mode = xf86OutputFindClosestMode (output, desired); } + if (!crtc_mode) + { + crtc->enabled = FALSE; + continue; + } if (!xf86CrtcSetMode (crtc, crtc_mode, rotation, 0, 0)) ok = FALSE; else @@ -1844,6 +1849,7 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation) } } xf86DisableUnusedFunctions(pScrn); + xf86RandR12TellChanged (pScrn->pScreen); return ok; } diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 6f52ee2d9..90de585f5 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -1048,6 +1048,28 @@ xf86RandR12CreateScreenResources12 (ScreenPtr pScreen) return TRUE; } +/* + * Something happened within the screen configuration due + * to DGA, VidMode or hot key. Tell RandR + */ + +void +xf86RandR12TellChanged (ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); + int c; + + if (!randrp) + return; + xf86RandR12SetInfo12 (pScreen); + for (c = 0; c < config->num_crtc; c++) + xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc); + + RRTellChanged (pScreen); +} + static void xf86RandR12PointerMoved (int scrnIndex, int x, int y) { diff --git a/hw/xfree86/modes/xf86RandR12.h b/hw/xfree86/modes/xf86RandR12.h index 8a4668b46..0d3346a77 100644 --- a/hw/xfree86/modes/xf86RandR12.h +++ b/hw/xfree86/modes/xf86RandR12.h @@ -33,5 +33,6 @@ Bool xf86RandR12SetConfig(ScreenPtr pScreen, Rotation rotation, int rate, Rotation xf86RandR12GetRotation(ScreenPtr pScreen); void xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y); Bool xf86RandR12PreInit (ScrnInfoPtr pScrn); +void xf86RandR12TellChanged (ScreenPtr pScreen); #endif /* _XF86_RANDR_H_ */ From f77a8ea849d171a8ca00b2b7334866ace1ffbf73 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 9 Apr 2007 14:29:46 -0700 Subject: [PATCH 11/34] Rotate screen size as needed from RandR 1.1 change requests. Screen size must reflect rotated mode size when setting rotated mode using RandR 1.1 SetScreenConfig request. (cherry picked from commit efcec7dbd3c2736c7b421d29c4d37e231aa681d2) --- randr/rrscreen.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/randr/rrscreen.c b/randr/rrscreen.c index f83fce320..d92a0ffee 100644 --- a/randr/rrscreen.c +++ b/randr/rrscreen.c @@ -741,6 +741,7 @@ ProcRRSetScreenConfig (ClientPtr client) RRModePtr mode; RR10DataPtr pData = NULL; RRScreenSizePtr pSize; + int width, height; UpdateCurrentTime (); @@ -883,8 +884,14 @@ ProcRRSetScreenConfig (ClientPtr client) * If the screen size is changing, adjust all of the other outputs * to fit the new size, mirroring as much as possible */ - if (mode->mode.width != pScreen->width || - mode->mode.height != pScreen->height) + width = mode->mode.width; + height = mode->mode.height; + if (rotation & (RR_Rotate_90|RR_Rotate_270)) + { + width = mode->mode.height; + height = mode->mode.width; + } + if (width != pScreen->width || height != pScreen->height) { int c; @@ -898,7 +905,7 @@ ProcRRSetScreenConfig (ClientPtr client) goto sendReply; } } - if (!RRScreenSizeSet (pScreen, mode->mode.width, mode->mode.height, + if (!RRScreenSizeSet (pScreen, width, height, pScreen->mmWidth, pScreen->mmHeight)) { rep.status = RRSetConfigFailed; From 4aae2de74b9224bac2b2e2522637dac09abc3837 Mon Sep 17 00:00:00 2001 From: "Jared D. McNeill" Date: Tue, 10 Apr 2007 12:57:15 -0700 Subject: [PATCH 12/34] Add a real xf86EnableIO/xf86DisableIO for NetBSD/PPC. --- hw/xfree86/os-support/bsd/Makefile.am | 3 +-- hw/xfree86/os-support/bsd/ppc_video.c | 33 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/os-support/bsd/Makefile.am b/hw/xfree86/os-support/bsd/Makefile.am index 099240467..0432ba931 100644 --- a/hw/xfree86/os-support/bsd/Makefile.am +++ b/hw/xfree86/os-support/bsd/Makefile.am @@ -38,8 +38,7 @@ ARCH_SOURCES = i386_video.c endif if PPC_VIDEO -ARCH_SOURCES = ppc_video.c \ - $(srcdir)/../shared/ioperm_noop.c +ARCH_SOURCES = ppc_video.c endif if SPARC64_VIDEO diff --git a/hw/xfree86/os-support/bsd/ppc_video.c b/hw/xfree86/os-support/bsd/ppc_video.c index ae65c8f15..6a23b4e5c 100644 --- a/hw/xfree86/os-support/bsd/ppc_video.c +++ b/hw/xfree86/os-support/bsd/ppc_video.c @@ -56,6 +56,9 @@ static pointer ppcMapVidMem(int, unsigned long, unsigned long, int flags); static void ppcUnmapVidMem(int, pointer, unsigned long); +Bool xf86EnableIO(void); +void xf86DisableIO(void); + void xf86OSInitVidMem(VidMemInfoPtr pVidMem) { @@ -63,6 +66,7 @@ xf86OSInitVidMem(VidMemInfoPtr pVidMem) pVidMem->mapMem = ppcMapVidMem; pVidMem->unmapMem = ppcUnmapVidMem; pVidMem->initialised = TRUE; + xf86EnableIO(); } @@ -138,3 +142,32 @@ xf86EnableInterrupts() return; } + +Bool xf86EnableIO() +{ + int fd = xf86Info.screenFd; + + xf86MsgVerb(X_WARNING, 3, "xf86EnableIO %d\n", fd); + if (ioBase == MAP_FAILED) + { + ioBase=mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, + 0xf2000000); + xf86MsgVerb(X_INFO, 3, "xf86EnableIO: %08x\n", ioBase); + if (ioBase == MAP_FAILED) { + xf86MsgVerb(X_WARNING, 3, "Can't map IO space!\n"); + return FALSE; + } + } + return TRUE; +} + +void xf86DisableIO() +{ + + if (ioBase != MAP_FAILED) + { + munmap(__UNVOLATILE(ioBase), 0x10000); + ioBase = MAP_FAILED; + } +} + From e49f836d6fa2768cd6d2a6d0227b5dbf516013dc Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sun, 8 Apr 2007 13:56:41 +0300 Subject: [PATCH 13/34] mieq: Use larger default queue size Use a default queue size of 512 rather than 256, else Xephyr is too slow without a host cursor, so events get stuck in the queue. --- mi/mieq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mi/mieq.c b/mi/mieq.c index 34509cd3f..a03fff1f0 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -58,7 +58,7 @@ in this Software without prior written authorization from The Open Group. # include #endif -#define QUEUE_SIZE 256 +#define QUEUE_SIZE 512 typedef struct _Event { xEvent event[7]; From e92743bc9839c36914a44f3e5bc8cd85773ac794 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sun, 8 Apr 2007 14:02:02 +0300 Subject: [PATCH 14/34] getevents: Copy modifier state from extended to core devices Make core events carry the same modifier state as the extended events, so that holding down Ctrl on keyboard A and pressing Q on keyboard B won't cause your app to quit. --- dix/getevents.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dix/getevents.c b/dix/getevents.c index 62f3bcb7f..6969f782f 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -714,6 +714,7 @@ _X_EXPORT void SwitchCoreKeyboard(DeviceIntPtr pDev) { KeyClassPtr ckeyc = inputInfo.keyboard->key; + int i = 0; if (inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr != pDev) { memcpy(ckeyc->modifierMap, pDev->key->modifierMap, MAP_LENGTH); @@ -728,6 +729,25 @@ SwitchCoreKeyboard(DeviceIntPtr pDev) ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode; SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms); + /* + * Copy state from the extended keyboard to core. If you omit this, + * holding Ctrl on keyboard one, and pressing Q on keyboard two, will + * cause your app to quit. This feels wrong to me, hence the below + * code. + * + * XXX: If you synthesise core modifier events, the state will get + * clobbered here. You'll have to work out something sensible + * to fix that. Good luck. + */ + +#define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \ + Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) + ckeyc->state &= ~(KEYBOARD_MASK); + ckeyc->state |= (pDev->key->state & KEYBOARD_MASK); +#undef KEYBOARD_MASK + for (i = 0; i < 8; i++) + ckeyc->modifierKeyCount[i] = pDev->key->modifierKeyCount[i]; + #ifdef XKB if (!noXkbExtension && pDev->key->xkbInfo && pDev->key->xkbInfo->desc) { if (!XkbCopyKeymap(pDev->key->xkbInfo->desc, ckeyc->xkbInfo->desc, From 07c56abf84080c020a3e7b7703a447c7f996975c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:43:58 +0300 Subject: [PATCH 15/34] Input: Plug memory leak in device free Remember to also free the motion history, if we're using the DIX-managed history. --- dix/devices.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dix/devices.c b/dix/devices.c index 9631c8678..004cb13fc 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -431,8 +431,13 @@ CloseDevice(DeviceIntPtr dev) xfree(dev->key); } - if (dev->valuator) + if (dev->valuator) { + /* Counterpart to 'biggest hack ever' in init. */ + if (dev->valuator->motion && + dev->valuator->GetMotionProc == GetMotionHistory) + xfree(dev->valuator->motion); xfree(dev->valuator); + } if (dev->button) { #ifdef XKB From 4771fa8747791498e504d73afccfb5833499a38b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:48:00 +0300 Subject: [PATCH 16/34] XFree86: Fix memory leak in option parsing Fix option parsing functions and callers thereof to not leak memory. --- hw/xfree86/common/xf86Config.c | 6 +++--- hw/xfree86/common/xf86Configure.c | 15 +++++++++------ hw/xfree86/common/xf86Option.c | 4 ++-- hw/xfree86/parser/Flags.c | 28 ++++++++++++++-------------- hw/xfree86/utils/xorgcfg/text-mode.c | 4 ++-- 5 files changed, 30 insertions(+), 27 deletions(-) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index cbeda0bd1..0421bf94b 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -1271,7 +1271,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) (count + 1) * sizeof(IDevRec)); indp[count - 1] = Pointer; indp[count - 1].extraOptions = - xf86addNewOption(NULL, "CorePointer", NULL); + xf86addNewOption(NULL, xnfstrdup("CorePointer"), NULL); indp[count].identifier = NULL; servlayoutp->inputs = indp; } @@ -1310,7 +1310,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) (count + 1) * sizeof(IDevRec)); indp[count - 1] = Pointer; indp[count - 1].extraOptions = - xf86addNewOption(NULL, "AlwaysCore", NULL); + xf86addNewOption(NULL, xnfstrdup("AlwaysCore"), NULL); indp[count].identifier = NULL; servlayoutp->inputs = indp; } @@ -1401,7 +1401,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) (count + 1) * sizeof(IDevRec)); indp[count - 1] = Keyboard; indp[count - 1].extraOptions = - xf86addNewOption(NULL, "CoreKeyboard", NULL); + xf86addNewOption(NULL, xnfstrdup("CoreKeyboard"), NULL); indp[count].identifier = NULL; servlayoutp->inputs = indp; } diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c index 4b482dfdc..7b04bd6bd 100644 --- a/hw/xfree86/common/xf86Configure.c +++ b/hw/xfree86/common/xf86Configure.c @@ -309,13 +309,16 @@ configureInputSection (void) mouse->inp_identifier = "Mouse0"; mouse->inp_driver = "mouse"; mouse->inp_option_lst = - xf86addNewOption(mouse->inp_option_lst, "Protocol", DFLT_MOUSE_PROTO); + xf86addNewOption(mouse->inp_option_lst, xstrdup("Protocol"), + xstrdup(DFLT_MOUSE_PROTO)); #ifndef __SCO__ mouse->inp_option_lst = - xf86addNewOption(mouse->inp_option_lst, "Device", DFLT_MOUSE_DEV); + xf86addNewOption(mouse->inp_option_lst, xstrdup("Device"), + xstrdup(DFLT_MOUSE_DEV)); #endif mouse->inp_option_lst = - xf86addNewOption(mouse->inp_option_lst, "ZAxisMapping", "4 5 6 7"); + xf86addNewOption(mouse->inp_option_lst, xstrdup("ZAxisMapping"), + xstrdup("4 5 6 7")); ptr = (XF86ConfInputPtr)xf86addListItem((glp)ptr, (glp)mouse); return ptr; } @@ -519,7 +522,7 @@ configureLayoutSection (void) iptr->iref_option_lst = NULL; iptr->iref_inputdev_str = "Mouse0"; iptr->iref_option_lst = - xf86addNewOption (iptr->iref_option_lst, "CorePointer", NULL); + xf86addNewOption (iptr->iref_option_lst, xstrdup("CorePointer"), NULL); ptr->lay_input_lst = (XF86ConfInputrefPtr) xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr); } @@ -532,7 +535,7 @@ configureLayoutSection (void) iptr->iref_option_lst = NULL; iptr->iref_inputdev_str = "Keyboard0"; iptr->iref_option_lst = - xf86addNewOption (iptr->iref_option_lst, "CoreKeyboard", NULL); + xf86addNewOption (iptr->iref_option_lst, xstrdup("CoreKeyboard"), NULL); ptr->lay_input_lst = (XF86ConfInputrefPtr) xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr); } @@ -751,7 +754,7 @@ configureDDCMonitorSection (int screennum) } if (ConfiguredMonitor->features.dpms) { - ptr->mon_option_lst = xf86addNewOption(ptr->mon_option_lst, "DPMS", NULL); + ptr->mon_option_lst = xf86addNewOption(ptr->mon_option_lst, xstrdup("DPMS"), NULL); } return ptr; diff --git a/hw/xfree86/common/xf86Option.c b/hw/xfree86/common/xf86Option.c index 7afb63a4d..50a7d9cb9 100644 --- a/hw/xfree86/common/xf86Option.c +++ b/hw/xfree86/common/xf86Option.c @@ -289,7 +289,7 @@ xf86CheckBoolOption(pointer optlist, const char *name, int deflt) _X_EXPORT pointer xf86ReplaceIntOption(pointer optlist, const char *name, const int val) { - char *tmp = xnfalloc(16); + char tmp[16]; sprintf(tmp,"%i",val); return xf86AddNewOption(optlist,name,tmp); } @@ -297,7 +297,7 @@ xf86ReplaceIntOption(pointer optlist, const char *name, const int val) _X_EXPORT pointer xf86ReplaceRealOption(pointer optlist, const char *name, const double val) { - char *tmp = xnfalloc(32); + char tmp[32]; snprintf(tmp,32,"%f",val); return xf86AddNewOption(optlist,name,tmp); } diff --git a/hw/xfree86/parser/Flags.c b/hw/xfree86/parser/Flags.c index 4adea1ade..5b60a5155 100644 --- a/hw/xfree86/parser/Flags.c +++ b/hw/xfree86/parser/Flags.c @@ -198,21 +198,21 @@ addNewOption2 (XF86OptionPtr head, char *name, char *val, int used) { XF86OptionPtr new, old = NULL; - /* Don't allow duplicates */ - if (head != NULL && (old = xf86findOption(head, name)) != NULL) - new = old; - else { + /* Don't allow duplicates, free old strings */ + if (head != NULL && (old = xf86findOption(head, name)) != NULL) { + new = old; + xf86conffree(new->opt_name); + xf86conffree(new->opt_val); + } + else new = xf86confcalloc (1, sizeof (XF86OptionRec)); - new->list.next = NULL; - } - new->opt_name = name; - new->opt_val = val; - new->opt_used = used; - - if (old == NULL) - return ((XF86OptionPtr) xf86addListItem ((glp) head, (glp) new)); - else - return head; + new->opt_name = name; + new->opt_val = val; + new->opt_used = used; + + if (old) + return head; + return ((XF86OptionPtr) xf86addListItem ((glp) head, (glp) new)); } XF86OptionPtr diff --git a/hw/xfree86/utils/xorgcfg/text-mode.c b/hw/xfree86/utils/xorgcfg/text-mode.c index 9797ca283..8800c29d7 100644 --- a/hw/xfree86/utils/xorgcfg/text-mode.c +++ b/hw/xfree86/utils/xorgcfg/text-mode.c @@ -2111,7 +2111,7 @@ LayoutConfig(void) else iref->iref_option_lst = xf86addNewOption(iref->iref_option_lst, - "CorePointer", NULL); + XtNewString("CorePointer"), NULL); option = xf86findOption(mref->iref_option_lst, "CorePointer"); XtFree(option->opt_name); @@ -2209,7 +2209,7 @@ LayoutConfig(void) else iref->iref_option_lst = xf86addNewOption(iref->iref_option_lst, - "CoreKeyboard", NULL); + XtNewString("CoreKeyboard"), NULL); option = xf86findOption(kref->iref_option_lst, "CoreKeyboard"); XtFree(option->opt_name); From 7b82a836c66ba88566255052caff63577e1a0384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:52:08 +0300 Subject: [PATCH 17/34] XFree86: Fix memory leaks, option parsing, in NewInputDeviceRequest Plugged some possible memory leaks, and added some more checks on the options, particular for driver/identifier. Added an unwind. --- hw/xfree86/common/xf86Xinput.c | 68 ++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 17ffed899..3800d9a6a 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -322,6 +322,7 @@ NewInputDeviceRequest (InputOption *options) InputInfoPtr pInfo = NULL; InputOption *option = NULL; DeviceIntPtr dev = NULL; + int rval = Success; idev = xcalloc(sizeof(*idev), 1); if (!idev) @@ -329,64 +330,101 @@ NewInputDeviceRequest (InputOption *options) for (option = options; option; option = option->next) { if (strcmp(option->key, "driver") == 0) { - if (!xf86LoadOneModule(option->value, NULL)) - return BadName; + if (idev->driver) { + rval = BadRequest; + goto unwind; + } + /* Memory leak for every attached device if we don't + * test if the module is already loaded first */ drv = xf86LookupInputDriver(option->value); + if (!drv) + if(xf86LoadOneModule(option->value, NULL)) + drv = xf86LookupInputDriver(option->value); if (!drv) { xf86Msg(X_ERROR, "No input driver matching `%s'\n", option->value); - return BadName; + rval = BadName; + goto unwind; } idev->driver = xstrdup(option->value); if (!idev->driver) { - xfree(idev); - return BadAlloc; + rval = BadAlloc; + goto unwind; } } if (strcmp(option->key, "name") == 0 || strcmp(option->key, "identifier") == 0) { + if (idev->identifier) { + rval = BadRequest; + goto unwind; + } idev->identifier = xstrdup(option->value); if (!idev->identifier) { - xfree(idev); - return BadAlloc; + rval = BadAlloc; + goto unwind; } } } + if(!idev->driver || !idev->identifier) { + xf86Msg(X_ERROR, "No input driver/identifier specified (ignoring)\n"); + rval = BadRequest; + goto unwind; + } if (!drv->PreInit) { xf86Msg(X_ERROR, "Input driver `%s' has no PreInit function (ignoring)\n", drv->driverName); - return BadImplementation; + rval = BadImplementation; + goto unwind; } - idev->commonOptions = NULL; - for (option = options; option; option = option->next) + for (option = options; option; option = option->next) { + /* Steal option key/value strings from the provided list. + * We need those strings, the InputOption list doesn't. */ idev->commonOptions = xf86addNewOption(idev->commonOptions, option->key, option->value); - idev->extraOptions = NULL; + option->key = NULL; + option->value = NULL; + } pInfo = drv->PreInit(drv, idev, 0); if (!pInfo) { xf86Msg(X_ERROR, "PreInit returned NULL for \"%s\"\n", idev->identifier); - return BadMatch; + rval = BadMatch; + goto unwind; } else if (!(pInfo->flags & XI86_CONFIGURED)) { xf86Msg(X_ERROR, "PreInit failed for input device \"%s\"\n", idev->identifier); - xf86DeleteInput(pInfo, 0); - return BadMatch; + rval = BadMatch; + goto unwind; } xf86ActivateDevice(pInfo); dev = pInfo->dev; - dev->inited = ((*dev->deviceProc)(dev, DEVICE_INIT) == Success); + ActivateDevice(dev); if (dev->inited && dev->startup) EnableDevice(dev); return Success; + +unwind: + if(pInfo) { + if(drv->UnInit) + drv->UnInit(drv, pInfo, 0); + else + xf86DeleteInput(pInfo, 0); + } + if(idev->driver) + xfree(idev->driver); + if(idev->identifier) + xfree(idev->identifier); + xf86optionListFree(idev->commonOptions); + xfree(idev); + return rval; } /* From 82962bbae2b4fda274625d1712ef839ce1ab9dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:54:32 +0300 Subject: [PATCH 18/34] Input: Add DeleteInputDeviceRequest Add DIDR, which asks the DDX to remove a device, analogous to NewInputDeviceRequest. Only implemented for XFree86 at the moment. --- Xi/stubs.c | 12 ++++++++++++ config/config.c | 2 +- hw/kdrive/src/kinput.c | 5 +++++ hw/xfree86/common/xf86Helper.c | 3 +++ hw/xfree86/common/xf86Xinput.c | 20 ++++++++++++++++++++ include/input.h | 2 ++ 6 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Xi/stubs.c b/Xi/stubs.c index ed041b815..d425fe9d4 100644 --- a/Xi/stubs.c +++ b/Xi/stubs.c @@ -230,3 +230,15 @@ NewInputDeviceRequest(InputOption *options) { return BadValue; } + +/**************************************************************************** + * + * Caller: configRemoveDevice (and others) + * + * Remove the specified device previously added. + * + */ +void +DeleteInputDeviceRequest(DeviceIntPtr dev) +{ +} diff --git a/config/config.c b/config/config.c index d72b588dc..b8d24289b 100644 --- a/config/config.c +++ b/config/config.c @@ -212,7 +212,7 @@ configRemoveDevice(DBusMessage *message, DBusMessageIter *iter, * already been removed. */ OsBlockSignals(); ProcessInputEvents(); - RemoveDevice(pDev); + DeleteInputDeviceRequest(pDev); OsReleaseSignals(); return Success; diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index 857f04f6d..a9a743ba8 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -2374,3 +2374,8 @@ NewInputDeviceRequest(InputOption *options) return Success; } + +void +DeleteInputDeviceRequest(DeviceIntPtr pDev) +{ +} diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c index 913735bc9..e0b758ffd 100644 --- a/hw/xfree86/common/xf86Helper.c +++ b/hw/xfree86/common/xf86Helper.c @@ -371,8 +371,11 @@ xf86DeleteInput(InputInfoPtr pInp, int flags) if (pInp->drv) pInp->drv->refCount--; + /* This should *really* be handled in drv->UnInit(dev) call instead */ +#if 0 if (pInp->private) xfree(pInp->private); +#endif /* Remove the entry from the list. */ if (pInp == xf86InputDevs) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 3800d9a6a..f662c170e 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -427,6 +427,26 @@ unwind: return rval; } +void +DeleteInputDeviceRequest(DeviceIntPtr pDev) +{ + LocalDevicePtr pInfo = (LocalDevicePtr) pDev->public.devicePrivate; + InputDriverPtr drv = pInfo->drv; + IDevRec *idev = pInfo->conf_idev; + + RemoveDevice(pDev); + + if(drv->UnInit) + drv->UnInit(drv, pInfo, 0); + else + xf86DeleteInput(pInfo, 0); + + xfree(idev->driver); + xfree(idev->identifier); + xf86optionListFree(idev->commonOptions); + xfree(idev); +} + /* * convenient functions to post events */ diff --git a/include/input.h b/include/input.h index fc607d35b..1e657099c 100644 --- a/include/input.h +++ b/include/input.h @@ -446,6 +446,8 @@ extern DeviceIntPtr LookupDeviceIntRec( /* Implemented by the DDX. */ extern int NewInputDeviceRequest( InputOption *options); +extern void DeleteInputDeviceRequest( + DeviceIntPtr dev); extern void DDXRingBell( int volume, From 20674dcbb2373a0af287883bc008fb6fb23d4466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:55:36 +0300 Subject: [PATCH 19/34] Config: Fix memory leaks Fix memory leaks that could occur along the error path. --- config/config.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/config/config.c b/config/config.c index b8d24289b..aae5c6e4d 100644 --- a/config/config.c +++ b/config/config.c @@ -110,6 +110,11 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) options->key = xstrdup("_source"); options->value = xstrdup("client/dbus"); + if(!options->key || !options->value) { + ErrorF("[config] couldn't allocate first key/value pair\n"); + ret = BadAlloc; + goto unwind; + } while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_ARRAY) { tmpo = (InputOption *) xcalloc(sizeof(InputOption), 1); @@ -118,6 +123,8 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) ret = BadAlloc; goto unwind; } + tmpo->next = options; + options = tmpo; dbus_message_iter_recurse(iter, &subiter); @@ -132,8 +139,8 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) tmp); MALFORMED_MESSAGE(); } - tmpo->key = xstrdup(tmp); - if (!tmpo->key) { + options->key = xstrdup(tmp); + if (!options->key) { ErrorF("[config] couldn't duplicate key!\n"); ret = BadAlloc; goto unwind; @@ -148,15 +155,13 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) dbus_message_iter_get_basic(&subiter, &tmp); if (!tmp) MALFORMED_MESSAGE(); - tmpo->value = xstrdup(tmp); - if (!tmpo->value) { + options->value = xstrdup(tmp); + if (!options->value) { ErrorF("[config] couldn't duplicate option!\n"); ret = BadAlloc; goto unwind; } - tmpo->next = options; - options = tmpo; dbus_message_iter_next(iter); } @@ -164,16 +169,8 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) if (ret != Success) DebugF("[config] NewInputDeviceRequest failed\n"); - return ret; - + /* Fall through, must deallocate memory we've allocated */ unwind: - if (tmpo->key) - xfree(tmpo->key); - if (tmpo->value) - xfree(tmpo->value); - if (tmpo) - xfree(tmpo); - while (options) { tmpo = options; options = options->next; From 4f05f9591e5492c72f3856bd7a2ff13378f59f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:57:48 +0300 Subject: [PATCH 20/34] Input: Always add devices with first available ID Scan the device list when adding a new device, and make sure we can use the first available ID, instead of always incrementing. --- dix/devices.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 004cb13fc..c2d4f22a5 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -86,15 +86,27 @@ DeviceIntPtr AddInputDevice(DeviceProc deviceProc, Bool autoStart) { DeviceIntPtr dev, *prev; /* not a typo */ + DeviceIntPtr devtmp; + int devid; + char devind[MAX_DEVICES]; - if (inputInfo.numDevices >= MAX_DEVICES) + /* Find next available id */ + memset(devind, 0, sizeof(char)*MAX_DEVICES); + for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next) + devind[devtmp->id]++; + for (devtmp = inputInfo.off_devices; devtmp; devtmp = devtmp->next) + devind[devtmp->id]++; + for (devid = 0; devid < MAX_DEVICES && devind[devid]; devid++) + ; + + if (devid >= MAX_DEVICES) return (DeviceIntPtr)NULL; dev = (DeviceIntPtr) xcalloc(sizeof(DeviceIntRec), 1); if (!dev) return (DeviceIntPtr)NULL; dev->name = (char *)NULL; dev->type = 0; - dev->id = inputInfo.numDevices; + dev->id = devid; inputInfo.numDevices++; dev->public.on = FALSE; dev->public.processInputProc = (ProcessInputProc)NoopDDA; @@ -572,6 +584,7 @@ RemoveDevice(DeviceIntPtr dev) } if (ret == Success) { + inputInfo.numDevices--; ev.type = DevicePresenceNotify; ev.time = currentTime.milliseconds; ev.devchange = 0; From aecbc712144dd1aaf462bd758821438b1d22d957 Mon Sep 17 00:00:00 2001 From: Remigiusz Marcinkiewicz Date: Wed, 11 Apr 2007 00:38:16 +0300 Subject: [PATCH 21/34] Input: Allow a pointer to a device to be returned in NIDR Allow a pointer to the first device added to be returned, so we know which device(s) were added by the NIDR call. --- Xi/stubs.c | 2 +- hw/kdrive/src/kinput.c | 8 +++++++- hw/xfree86/common/xf86Xinput.c | 3 ++- include/input.h | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Xi/stubs.c b/Xi/stubs.c index d425fe9d4..40cd02fe1 100644 --- a/Xi/stubs.c +++ b/Xi/stubs.c @@ -226,7 +226,7 @@ ChangeDeviceControl(ClientPtr client, DeviceIntPtr dev, * */ int -NewInputDeviceRequest(InputOption *options) +NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev) { return BadValue; } diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index a9a743ba8..7edcc5106 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -2307,7 +2307,7 @@ ChangeDeviceControl(register ClientPtr client, DeviceIntPtr pDev, } int -NewInputDeviceRequest(InputOption *options) +NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev) { InputOption *option = NULL; KdPointerInfo *pi = NULL; @@ -2372,6 +2372,12 @@ NewInputDeviceRequest(InputOption *options) } } + if (pi) { + *pdev = pi->dixdev; + } else if(ki) { + *pdev = ki->dixdev; + } + return Success; } diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index f662c170e..6ebb087cf 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -315,7 +315,7 @@ AddOtherInputDevices() #endif int -NewInputDeviceRequest (InputOption *options) +NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev) { IDevRec *idev = NULL; InputDriverPtr drv = NULL; @@ -409,6 +409,7 @@ NewInputDeviceRequest (InputOption *options) if (dev->inited && dev->startup) EnableDevice(dev); + *pdev = dev; return Success; unwind: diff --git a/include/input.h b/include/input.h index 1e657099c..b399d3ad1 100644 --- a/include/input.h +++ b/include/input.h @@ -445,7 +445,8 @@ extern DeviceIntPtr LookupDeviceIntRec( /* Implemented by the DDX. */ extern int NewInputDeviceRequest( - InputOption *options); + InputOption *options, + DeviceIntPtr *dev); extern void DeleteInputDeviceRequest( DeviceIntPtr dev); From 0910540e4322bba72a2fa0a907072eab2547a7b6 Mon Sep 17 00:00:00 2001 From: Remigiusz Marcinkiewicz Date: Wed, 11 Apr 2007 01:09:26 +0300 Subject: [PATCH 22/34] Config: Extend D-BUS API Return device ID where available. Add listDevices call, which does what it says on the box. --- config/config.c | 86 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/config/config.c b/config/config.c index aae5c6e4d..9828091f4 100644 --- a/config/config.c +++ b/config/config.c @@ -92,12 +92,15 @@ configTeardown(void) } static int -configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) +configAddDevice(DBusMessage *message, DBusMessageIter *iter, + DBusMessage *reply, DBusMessageIter *r_iter, + DBusError *error) { DBusMessageIter subiter; InputOption *tmpo = NULL, *options = NULL; char *tmp = NULL; int ret = BadMatch; + DeviceIntPtr dev = NULL; DebugF("[config] adding device\n"); @@ -165,12 +168,28 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) dbus_message_iter_next(iter); } - ret = NewInputDeviceRequest(options); - if (ret != Success) + ret = NewInputDeviceRequest(options, &dev); + if (ret != Success) { DebugF("[config] NewInputDeviceRequest failed\n"); + goto unwind; + } + + if (!dev) { + DebugF("[config] NewInputDeviceRequest succeeded, without device\n"); + ret = BadMatch; + goto unwind; + } + + if (!dbus_message_iter_append_basic(r_iter, DBUS_TYPE_INT32, &(dev->id))) { + ErrorF("[config] couldn't append to iterator\n"); + ret = BadAlloc; + goto unwind; + } - /* Fall through, must deallocate memory we've allocated */ unwind: + if (dev && ret != Success) + RemoveDevice(dev); + while (options) { tmpo = options; options = options->next; @@ -218,17 +237,47 @@ unwind: return ret; } +static int +configListDevices(DBusMessage *message, DBusMessageIter *iter, + DBusMessage *reply, DBusMessageIter *r_iter, + DBusError *error) +{ + DeviceIntPtr d; + int ret = BadMatch; + + for (d = inputInfo.devices; d; d = d->next) { + if (!dbus_message_iter_append_basic(r_iter, DBUS_TYPE_INT32, + &(d->id))) { + ErrorF("[config] couldn't append to iterator\n"); + ret = BadAlloc; + goto unwind; + } + if (!dbus_message_iter_append_basic(r_iter, DBUS_TYPE_STRING, + &(d->name))) { + ErrorF("[config] couldn't append to iterator\n"); + ret = BadAlloc; + goto unwind; + } + } + +unwind: + return ret; +} + static DBusHandlerResult configMessage(DBusConnection *connection, DBusMessage *message, void *closure) { DBusMessageIter iter; DBusError error; DBusMessage *reply; + DBusMessageIter r_iter; DBusConnection *bus = closure; int ret = BadDrawable; /* nonsensical value */ dbus_error_init(&error); + DebugF("[config] received a message\n"); + if (strcmp(dbus_message_get_interface(message), "org.x.config.input") == 0) { if (!dbus_message_iter_init(message, &iter)) { @@ -237,26 +286,33 @@ configMessage(DBusConnection *connection, DBusMessage *message, void *closure) return DBUS_HANDLER_RESULT_NEED_MEMORY; /* ?? */ } + if (!(reply = dbus_message_new_method_return(message))) { + ErrorF("[config] failed to create the reply message\n"); + dbus_error_free(&error); + return DBUS_HANDLER_RESULT_NEED_MEMORY; + } + dbus_message_iter_init_append(reply, &r_iter); + if (strcmp(dbus_message_get_member(message), "add") == 0) - ret = configAddDevice(message, &iter, &error); + ret = configAddDevice(message, &iter, reply, &r_iter, &error); else if (strcmp(dbus_message_get_member(message), "remove") == 0) ret = configRemoveDevice(message, &iter, &error); + else if (strcmp(dbus_message_get_member(message), "listDevices") == 0) + ret = configListDevices(message, &iter, reply, &r_iter, &error); if (ret != BadDrawable && ret != BadAlloc) { - reply = dbus_message_new_method_return(message); - dbus_message_iter_init_append(reply, &iter); - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret)) { - ErrorF("[config] couldn't append to iterator\n"); - dbus_error_free(&error); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (!strlen(dbus_message_get_signature(reply))) + if (!dbus_message_iter_append_basic(&r_iter, DBUS_TYPE_INT32, &ret)) { + ErrorF("[config] couldn't append to iterator\n"); + dbus_error_free(&error); + return DBUS_HANDLER_RESULT_HANDLED; + } if (!dbus_connection_send(bus, reply, NULL)) ErrorF("[config] failed to send reply\n"); - dbus_connection_flush(bus); - - dbus_message_unref(reply); } + dbus_message_unref(reply); + dbus_connection_flush(bus); } dbus_error_free(&error); From 33a5d9605e3e282f6aa1921d7321a2a12ef02c42 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Wed, 11 Apr 2007 18:28:57 +0300 Subject: [PATCH 23/34] XFree86: DGA: Don't call ProcessInputEvents from CloseScreen By the time CloseScreen gets called, we can't call ProcessInputEvents, as the event queue will get unhappy. So just unregister our hooks instantly, and hope that they don't get called. --- hw/xfree86/common/xf86DGA.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 43db1ee1a..9474ec8e0 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -249,14 +249,11 @@ DGACloseScreen(int i, ScreenPtr pScreen) DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen); if (XDGAEventBase) { - OsBlockSignals(); - ProcessInputEvents(); mieqSetHandler(*XDGAEventBase + MotionNotify, NULL); mieqSetHandler(*XDGAEventBase + ButtonPress, NULL); mieqSetHandler(*XDGAEventBase + ButtonRelease, NULL); mieqSetHandler(*XDGAEventBase + KeyPress, NULL); mieqSetHandler(*XDGAEventBase + KeyRelease, NULL); - OsReleaseSignals(); } FreeMarkedVisuals(pScreen); From 7ccebc50b98ac175fdbdfaab081bcead62e60ee3 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 13 Apr 2007 13:08:44 +0930 Subject: [PATCH 24/34] Documentation for events.c. --- dix/events.c | 450 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 444 insertions(+), 6 deletions(-) diff --git a/dix/events.c b/dix/events.c index 093a316b4..bc6b6ae97 100644 --- a/dix/events.c +++ b/dix/events.c @@ -107,6 +107,10 @@ of the copyright holder. ******************************************************************/ +/** @file + * This file handles event delivery and a big part of the server-side protocol + * handling (the parts for input devices). + */ #ifdef HAVE_DIX_CONFIG_H #include @@ -168,7 +172,9 @@ static xEvent *xeviexE; #include "dixevents.h" #include "dixgrabs.h" #include "dispatch.h" - +/** + * Extension events type numbering starts at EXTENSION_EVENT_BASE. + */ #define EXTENSION_EVENT_BASE 64 #define NoSuchEvent 0x80000000 /* so doesn't match NoEventMask */ @@ -214,6 +220,28 @@ _X_EXPORT CallbackListPtr DeviceEventCallback; Mask DontPropagateMasks[DNPMCOUNT]; static int DontPropagateRefCnts[DNPMCOUNT]; +/** + * Main input device struct. + * inputInfo.pointer + * is the core pointer. Referred to as "virtual core pointer", "VCP", + * "core pointer" or inputInfo.pointer. There is exactly one core pointer, + * but multiple devices may send core events. If a device generates core + * events, those events will appear to originate from the core pointer. + * + * inputInfo.keyboard + * is the core keyboard ("virtual core keyboard", "VCK", "core keyboard"). + * See inputInfo.pointer. + * + * inputInfo.devices + * linked list containing all devices including VCK and VCP. The VCK will + * always be the first entry, the VCP the second entry in the device list. + * + * inputInfo.off_devices + * Devices that have not been initialized and are thus turned off. + * + * inputInfo.numDevices + * Total number of devices. + */ _X_EXPORT InputInfo inputInfo; static struct { @@ -228,12 +256,19 @@ static struct { * The window trace information is used to avoid having to compute all the * windows between the root and the current pointer window each time a button * or key goes down. The grabs on each of those windows must be checked. + * + * @see XYToWindow() for a documentation on how the array is set up. */ static WindowPtr *spriteTrace = (WindowPtr *)NULL; #define ROOT spriteTrace[0] static int spriteTraceSize = 0; static int spriteTraceGood; +/** + * DIX sprite information. This is the sprite as seen from the DIX. It does + * not represent the actual sprite rendered to the screen. + * + */ static struct { CursorPtr current; BoxRec hotLimits; /* logical constraints of hot spot */ @@ -270,6 +305,9 @@ static WindowPtr XYToWindow( int y ); +/** + * Max event opcode. + */ extern int lastEvent; static Mask lastEventMask; @@ -849,6 +887,13 @@ PointerConfinedToScreen(void) return sprite.confined; } +/** + * Update the sprite cursor to the given cursor. + * + * ChangeToCursor() will display the new cursor and free the old cursor (if + * applicable). If the provided cursor is already the updated cursor, nothing + * happens. + */ static void ChangeToCursor(CursorPtr cursor) { @@ -873,7 +918,9 @@ ChangeToCursor(CursorPtr cursor) } } -/* returns true if b is a descendent of a */ +/** + * @returns true if b is a descendent of a + */ Bool IsParent(WindowPtr a, WindowPtr b) { @@ -882,6 +929,11 @@ IsParent(WindowPtr a, WindowPtr b) return FALSE; } +/** + * Update the cursor displayed on the screen. + * + * Called whenever a cursor may have changed shape or position. + */ static void PostNewCursor(void) { @@ -912,24 +964,36 @@ PostNewCursor(void) } } +/** + * @return root window of current active screen. + */ _X_EXPORT WindowPtr GetCurrentRootWindow(void) { return ROOT; } +/** + * @return window underneath the cursor sprite. + */ _X_EXPORT WindowPtr GetSpriteWindow(void) { return sprite.win; } +/** + * @return current sprite cursor. + */ _X_EXPORT CursorPtr GetSpriteCursor(void) { return sprite.current; } +/** + * Set x/y current sprite position in screen coordinates. + */ _X_EXPORT void GetSpritePosition(int *px, int *py) { @@ -1231,6 +1295,19 @@ CheckGrabForSyncs(DeviceIntPtr thisDev, Bool thisMode, Bool otherMode) ComputeFreezes(); } +/** + * Activate a pointer grab on the given device. A pointer grab will cause all + * core pointer events to be delivered to the grabbing client only. Can cause + * the cursor to change if a grab cursor is set. + * + * As a pointer grab can only be issued on the core devices, mouse is always + * inputInfo.pointer. Extension devices are set up for ActivateKeyboardGrab(). + * + * @param mouse The device to grab. + * @param grab The grab structure, needs to be setup. + * @param autoGrab True if the grab was caused by a button down event and not + * explicitely by a client. + */ void ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab, TimeStamp time, Bool autoGrab) @@ -1259,6 +1336,12 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab, CheckGrabForSyncs(mouse,(Bool)grab->pointerMode, (Bool)grab->keyboardMode); } +/** + * Delete grab on given device, update the sprite. + * + * As a pointer grab can only be issued on the core devices, mouse is always + * inputInfo.pointer. Extension devices are set up for ActivateKeyboardGrab(). + */ void DeactivatePointerGrab(DeviceIntPtr mouse) { @@ -1283,6 +1366,11 @@ DeactivatePointerGrab(DeviceIntPtr mouse) ComputeFreezes(); } +/** + * Activate a keyboard grab on the given device. + * + * Extension devices have ActivateKeyboardGrab() set as their grabbing proc. + */ void ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool passive) { @@ -1309,6 +1397,9 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass CheckGrabForSyncs(keybd, (Bool)grab->keyboardMode, (Bool)grab->pointerMode); } +/** + * Delete keyboard grab for the given device. + */ void DeactivateKeyboardGrab(DeviceIntPtr keybd) { @@ -1441,6 +1532,11 @@ AllowSome(ClientPtr client, TimeStamp time, DeviceIntPtr thisDev, int newState) } } +/** + * Server-side protocol handling for AllowEvents request. + * + * Release some events from a frozen device. Only applicable for core devices. + */ int ProcAllowEvents(ClientPtr client) { @@ -1484,6 +1580,9 @@ ProcAllowEvents(ClientPtr client) return Success; } +/** + * Deactivate grabs from any device that has been grabbed by the client. + */ void ReleaseActiveGrabs(ClientPtr client) { @@ -1510,6 +1609,30 @@ ReleaseActiveGrabs(ClientPtr client) * The following procedures deal with delivering events * **************************************************************************/ +/** + * Deliver the given events to the given client. + * + * More than one event may be delivered at a time. This is the case with + * DeviceMotionNotifies which may be followed by DeviceValuator events. + * + * TryClientEvents() is the last station before actually writing the events to + * the socket. Anything that is not filtered here, will get delivered to the + * client. + * An event is only delivered if + * - mask and filter match up. + * - no other client has a grab on the device that caused the event. + * + * + * @param client The target client to deliver to. + * @param pEvents The events to be delivered. + * @param count Number of elements in pEvents. + * @param mask Event mask as set by the window. + * @param filter Mask based on event type. + * @param grab Possible grab on the device that caused the event. + * + * @return 1 if event was delivered, 0 if not or -1 if grab was not set by the + * client. + */ _X_EXPORT int TryClientEvents (ClientPtr client, xEvent *pEvents, int count, Mask mask, Mask filter, GrabPtr grab) @@ -1588,6 +1711,23 @@ TryClientEvents (ClientPtr client, xEvent *pEvents, int count, Mask mask, } } +/** + * Deliver events to a window. At this point, we do not yet know if the event + * actually needs to be delivered. May activate a grab if the event is a + * button press. + * + * More than one event may be delivered at a time. This is the case with + * DeviceMotionNotifies which may be followed by DeviceValuator events. + * + * @param pWin The window that would get the event. + * @param pEvents The events to be delivered. + * @param count Number of elements in pEvents. + * @param filter Mask based on event type. + * @param grab Possible grab on the device that caused the event. + * @param mskidx Mask index, depending on device that caused event. + * + * @return Number of events delivered to various clients. + */ int DeliverEventsToWindow(WindowPtr pWin, xEvent *pEvents, int count, Mask filter, GrabPtr grab, int mskidx) @@ -1707,6 +1847,15 @@ XineramaTryClientEventsResult( } #endif +/** + * Try to deliver events to the interested parties. + * + * @param pWin The window that would get the event. + * @param pEvents The events to be delivered. + * @param count Number of elements in pEvents. + * @param filter Mask based on event type. + * @param dontClient Don't deliver to the dontClient. + */ int MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents, int count, Mask filter, ClientPtr dontClient) @@ -1744,6 +1893,14 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents, return 2; } +/** + * Adjust event fields to comply with the window properties. + * + * @param xE Event to be modified in place + * @param pWin The window to get the information from. + * @param child Child window setting for event (if applicable) + * @param calcChild If True, calculate the child window. + */ static void FixUpEventFromWindow( xEvent *xE, @@ -1798,6 +1955,22 @@ FixUpEventFromWindow( } } +/** + * Deliver events caused by input devices. Called for all core input events + * and XI events. No filtering of events happens before DeliverDeviceEvents(), + * it will be called for any event that comes out of the event queue. + * + * For all core events, dev is either inputInfo.pointer or inputInfo.keyboard. + * For all extension events, dev is the device that caused the event. + * + * @param pWin Window to deliver event to. + * @param xE Events to deliver. + * @param grab Possible grab on a device. + * @param stopAt Don't recurse up to the root window. + * @param dev The device that is responsible for the event. + * @param count number of events in xE. + * + */ int DeliverDeviceEvents(WindowPtr pWin, xEvent *xE, GrabPtr grab, WindowPtr stopAt, DeviceIntPtr dev, int count) @@ -1861,7 +2034,19 @@ DeliverDeviceEvents(WindowPtr pWin, xEvent *xE, GrabPtr grab, return 0; } -/* not useful for events that propagate up the tree or extension events */ +/** + * Deliver event to a window and it's immediate parent. Used for most window + * events (CreateNotify, ConfigureNotify, etc.). Not useful for events that + * propagate up the tree or extension events + * + * In case of a ReparentNotify event, the event will be delivered to the + * otherParent as well. + * + * @param pWin Window to deliver events to. + * @param xE Events to deliver. + * @param count number of events in xE. + * @param otherParent Used for ReparentNotify events. + */ _X_EXPORT int DeliverEvents(WindowPtr pWin, xEvent *xE, int count, WindowPtr otherParent) @@ -1926,6 +2111,17 @@ PointInBorderSize(WindowPtr pWin, int x, int y) return FALSE; } +/** + * Traversed from the root window to the window at the position x/y. While + * traversing, it sets up the traversal history in the spriteTrace array. + * After completing, the spriteTrace history is set in the following way: + * spriteTrace[0] ... root window + * spriteTrace[1] ... top level window that encloses x/y + * ... + * spriteTrace[spriteTraceGood - 1] ... window at x/y + * + * @returns the window at the given coordinates. + */ static WindowPtr XYToWindow(int x, int y) { @@ -1974,6 +2170,12 @@ XYToWindow(int x, int y) return spriteTrace[spriteTraceGood-1]; } +/** + * Update the sprite coordinates based on the event. Update the cursor + * position, then update the event with the new coordinates that may have been + * changed. If the window underneath the sprite has changed, change to new + * cursor and send enter/leave events. + */ static Bool CheckMotion(xEvent *xE) { @@ -2046,6 +2248,10 @@ CheckMotion(xEvent *xE) return TRUE; } +/** + * Windows have restructured, we need to update the sprite position and the + * sprite's cursor. + */ _X_EXPORT void WindowsRestructured(void) { @@ -2091,6 +2297,10 @@ void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff) } #endif +/** + * Set the given window to sane values, display the cursor in the center of + * the screen. Called from main() with the root window on the first screen. + */ void DefineInitialRootWindow(WindowPtr win) { @@ -2297,6 +2507,10 @@ XineramaWarpPointer(ClientPtr client) #endif +/** + * Server-side protocol handling for WarpPointer request. + * Warps the cursor position to the coordinates given in the request. + */ int ProcWarpPointer(ClientPtr client) { @@ -2405,8 +2619,15 @@ BorderSizeNotEmpty(WindowPtr pWin) return FALSE; } -/* "CheckPassiveGrabsOnWindow" checks to see if the event passed in causes a - passive grab set on the window to be activated. */ +/** + * "CheckPassiveGrabsOnWindow" checks to see if the event passed in causes a + * passive grab set on the window to be activated. + * + * @param pWin The window that may be subject to a passive grab. + * @param device Device that caused the event. + * @param xE List of events (multiple ones for DeviceMotionNotify) + * @count number of elements in xE. + */ static Bool CheckPassiveGrabsOnWindow( @@ -2556,6 +2777,16 @@ CheckDeviceGrabs(DeviceIntPtr device, xEvent *xE, return FALSE; } +/** + * Called for keyboard events to deliver event to whatever client owns the + * focus. Event is delivered to the keyboard's focus window, the root window + * or to the window owning the input focus. + * + * @param keybd The keyboard originating the event. + * @param xE The event list. + * @param window Window underneath the sprite. + * @param count number of events in xE. + */ void DeliverFocusedEvent(DeviceIntPtr keybd, xEvent *xE, WindowPtr window, int count) { @@ -2584,6 +2815,13 @@ DeliverFocusedEvent(DeviceIntPtr keybd, xEvent *xE, WindowPtr window, int count) NullGrab, mskidx); } +/** + * Deliver an event from a device that is currently grabbed. Uses + * DeliverDeviceEvents() for further delivery if a ownerEvents is set on the + * grab. If not, TryClientEvents() is used. + * + * @param deactivateGrab True if the device's grab should be deactivated. + */ void DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev, Bool deactivateGrab, int count) @@ -2666,6 +2904,17 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev, } } +/** + * Main keyboard event processing function for core keyboard events. + * Updates the events fields from the current pointer state and delivers the + * event. + * + * For key events, xE will always be a single event. + * + * @param xE Event list + * @param keybd The device that caused an event. + * @param count Number of elements in xE. + */ void #ifdef XKB CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count) @@ -2861,6 +3110,18 @@ FixKeyState (xEvent *xE, DeviceIntPtr keybd) } #endif +/** + * Main pointer event processing function for core pointer events. + * For motion events: update the sprite. + * For all other events: Update the event fields based on the current sprite + * state. + * + * For core pointer events, xE will always be a single event. + * + * @param xE Event list + * @param mouse The device that caused an event. + * @param count Number of elements in xE. + */ void #ifdef XKB CoreProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count) @@ -2974,6 +3235,18 @@ ProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count) #define AtMostOneClient \ (SubstructureRedirectMask | ResizeRedirectMask | ButtonPressMask) +/** + * Recalculate which events may be deliverable for the given window. + * Recalculated mask is used for quicker determination which events may be + * delivered to a window. + * + * The otherEventMasks on a WindowOptional is the combination of all event + * masks set by all clients on the window. + * deliverableEventMask is the combination of the eventMask and the + * otherEventMask. + * + * Traverses to siblings and parents of the window. + */ void RecalculateDeliverableEvents(pWin) WindowPtr pWin; @@ -3172,6 +3445,9 @@ EventSuppressForWindow(WindowPtr pWin, ClientPtr client, return Success; } +/** + * @return The window that is the first ancestor of both a and b. + */ static WindowPtr CommonAncestor( WindowPtr a, @@ -3182,6 +3458,10 @@ CommonAncestor( return NullWindow; } +/** + * Assembles an EnterNotify or LeaveNotify and sends it event to the client. + * The core devices are used to fill in the event fields. + */ static void EnterLeaveEvent( int type, @@ -3264,6 +3544,10 @@ EnterLeaveEvent( } } +/** + * Send enter notifies to all parent windows up to ancestor. + * This function recurses. + */ static void EnterNotifies(WindowPtr ancestor, WindowPtr child, int mode, int detail) { @@ -3275,6 +3559,11 @@ EnterNotifies(WindowPtr ancestor, WindowPtr child, int mode, int detail) EnterLeaveEvent(EnterNotify, mode, detail, parent, child->drawable.id); } + +/** + * Send leave notifies to all parent windows up to ancestor. + * This function recurses. + */ static void LeaveNotifies(WindowPtr child, WindowPtr ancestor, int mode, int detail) { @@ -3289,6 +3578,13 @@ LeaveNotifies(WindowPtr child, WindowPtr ancestor, int mode, int detail) } } +/** + * Figure out if enter/leave events are necessary and send them to the + * appropriate windows. + * + * @param fromWin Window the sprite moved out of. + * @param toWin Window the sprite moved into. + */ static void DoEnterLeaveEvents(WindowPtr fromWin, WindowPtr toWin, int mode) { @@ -3522,6 +3818,23 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) } } +/** + * Set the input focus to the given window. Subsequent keyboard events will be + * delivered to the given window. + * + * Usually called from ProcSetInputFocus as result of a client request. If so, + * the device is the inputInfo.keyboard. + * If called from ProcXSetInputFocus as result of a client xinput request, the + * device is set to the device specified by the client. + * + * @param client Client that requested input focus change. + * @param dev Focus device. + * @param focusID The window to obtain the focus. Can be PointerRoot or None. + * @param revertTo Specifies where the focus reverts to when window becomes + * unviewable. + * @param ctime Specifies the time. + * @param followOK True if pointer is allowed to follow the keyboard. + */ int SetInputFocus( ClientPtr client, @@ -3598,6 +3911,11 @@ SetInputFocus( return Success; } +/** + * Server-side protocol handling for SetInputFocus request. + * + * Sets the input focus for the virtual core keyboard. + */ int ProcSetInputFocus(client) ClientPtr client; @@ -3613,6 +3931,12 @@ ProcSetInputFocus(client) stuff->revertTo, stuff->time, FALSE); } +/** + * Server-side protocol handling for GetInputFocus request. + * + * Sends the current input focus for the virtual core keyboard back to the + * client. + */ int ProcGetInputFocus(ClientPtr client) { @@ -3634,6 +3958,12 @@ ProcGetInputFocus(ClientPtr client) return Success; } +/** + * Server-side protocol handling for Grabpointer request. + * + * Sets an active grab on the inputInfo.pointer and returns success status to + * client. + */ int ProcGrabPointer(ClientPtr client) { @@ -3741,6 +4071,14 @@ ProcGrabPointer(ClientPtr client) return Success; } +/** + * Server-side protocol handling for ChangeActivePointerGrab request. + * + * Changes properties of the grab hold by the client. If the client does not + * hold an active grab on the device, nothing happens. + * + * Works on the core pointer only. + */ int ProcChangeActivePointerGrab(ClientPtr client) { @@ -3787,6 +4125,11 @@ ProcChangeActivePointerGrab(ClientPtr client) return Success; } +/** + * Server-side protocol handling for UngrabPointer request. + * + * Deletes the pointer grab on the core pointer device. + */ int ProcUngrabPointer(ClientPtr client) { @@ -3806,6 +4149,24 @@ ProcUngrabPointer(ClientPtr client) return Success; } +/** + * Sets a grab on the given device. + * + * Called from ProcGrabKeyboard to work on the inputInfo.keyboard. + * Called from ProcXGrabDevice to work on the device specified by the client. + * + * The parameters this_mode and other_mode represent the keyboard_mode and + * pointer_mode parameters of XGrabKeyboard(). + * See man page for details on all the parameters + * + * @param client Client that owns the grab. + * @param dev The device to grab. + * @param this_mode GrabModeSync or GrabModeAsync + * @param other_mode GrabModeSync or GrabModeAsync + * @param status Return code to be returned to the caller. + * + * @returns Success or BadValue. + */ int GrabDevice(ClientPtr client, DeviceIntPtr dev, unsigned this_mode, unsigned other_mode, Window grabWindow, @@ -3864,6 +4225,11 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev, return Success; } +/** + * Server-side protocol handling for GrabKeyboard request. + * + * Grabs the inputInfo.keyboad and returns success status to client. + */ int ProcGrabKeyboard(ClientPtr client) { @@ -3892,6 +4258,11 @@ ProcGrabKeyboard(ClientPtr client) return Success; } +/** + * Server-side protocol handling for UngrabKeyboard request. + * + * Deletes a possible grab on the inputInfo.keyboard. + */ int ProcUngrabKeyboard(ClientPtr client) { @@ -3911,6 +4282,11 @@ ProcUngrabKeyboard(ClientPtr client) return Success; } +/** + * Server-side protocol handling for QueryPointer request. + * + * Returns the current state and position of the core pointer to the client. + */ int ProcQueryPointer(ClientPtr client) { @@ -3969,6 +4345,10 @@ ProcQueryPointer(ClientPtr client) return(Success); } +/** + * Initializes the device list and the DIX sprite to sane values. Allocates + * trace memory used for quick window traversal. + */ void InitEvents(void) { @@ -4030,6 +4410,11 @@ CloseDownEvents(void) spriteTraceSize = 0; } +/** + * Server-side protocol handling for SendEvent request. + * + * Locates the window to send the event to and forwards the event. + */ int ProcSendEvent(ClientPtr client) { @@ -4117,6 +4502,12 @@ ProcSendEvent(ClientPtr client) return Success; } +/** + * Server-side protocol handling for UngrabKey request. + * + * Deletes a passive grab for the given key. Only works on the + * inputInfo.keyboard. + */ int ProcUngrabKey(ClientPtr client) { @@ -4159,6 +4550,12 @@ ProcUngrabKey(ClientPtr client) return(Success); } +/** + * Server-side protocol handling for GrabKey request. + * + * Creates a grab for the inputInfo.keyboard and adds it to the list of + * passive grabs. + */ int ProcGrabKey(ClientPtr client) { @@ -4214,6 +4611,12 @@ ProcGrabKey(ClientPtr client) } +/** + * Server-side protocol handling for GrabButton request. + * + * Creates a grab for the inputInfo.pointer and adds it as a passive grab to + * the list. + */ int ProcGrabButton(ClientPtr client) { @@ -4287,6 +4690,11 @@ ProcGrabButton(ClientPtr client) return AddPassiveGrabToList(grab); } +/** + * Server-side protocol handling for UngrabButton request. + * + * Deletes a passive grab on the inputInfo.pointer from the list. + */ int ProcUngrabButton(ClientPtr client) { @@ -4320,6 +4728,17 @@ ProcUngrabButton(ClientPtr client) return(Success); } +/** + * Deactivate any grab that may be on the window, remove the focus. + * Delete any XInput extension events from the window too. Does not change the + * window mask. Use just before the window is deleted. + * + * If freeResources is set, passive grabs on the window are deleted. + * + * @param pWin The window to delete events from. + * @param freeResources True if resources associated with the window should be + * deleted. + */ void DeleteWindowFromAnyEvents(WindowPtr pWin, Bool freeResources) { @@ -4409,7 +4828,9 @@ DeleteWindowFromAnyEvents(WindowPtr pWin, Bool freeResources) } /** - * Call this whenever some window at or below pWin has changed geometry + * Call this whenever some window at or below pWin has changed geometry. If + * there is a grab on the window, the cursor will be re-confined into the + * window. */ _X_EXPORT void CheckCursorConfinement(WindowPtr pWin) @@ -4445,6 +4866,9 @@ EventMaskForClient(WindowPtr pWin, ClientPtr client) return 0; } +/** + * Server-side protocol handling for RecolorCursor request. + */ int ProcRecolorCursor(ClientPtr client) { @@ -4486,6 +4910,20 @@ ProcRecolorCursor(ClientPtr client) return (Success); } +/** + * Write the given events to a client, swapping the byte order if necessary. + * To swap the byte ordering, a callback is called that has to be set up for + * the given event type. + * + * In the case of DeviceMotionNotify trailed by DeviceValuators, the events + * can be more than one. Usually it's just one event. + * + * Do not modify the event structure passed in. See comment below. + * + * @param pClient Client to send events to. + * @param count Number of events. + * @param events The event list. + */ _X_EXPORT void WriteEventsToClient(ClientPtr pClient, int count, xEvent *events) { From 2c833f60acb3dc358815a99cd295ef7fc695c45d Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Sat, 14 Apr 2007 18:29:25 +0300 Subject: [PATCH 25/34] glx: drop stray CAPI define. SI imports/exports were dropped from Mesa. --- GL/glx/glxcontext.h | 3 --- GL/glx/glxscreens.h | 3 --- 2 files changed, 6 deletions(-) diff --git a/GL/glx/glxcontext.h b/GL/glx/glxcontext.h index a54e323cc..eb10ee2a8 100644 --- a/GL/glx/glxcontext.h +++ b/GL/glx/glxcontext.h @@ -40,9 +40,6 @@ ** */ -/* XXX: should be defined somewhere globally */ -#define CAPI - #include "GL/internal/glcore.h" typedef struct __GLXtextureFromPixmap __GLXtextureFromPixmap; diff --git a/GL/glx/glxscreens.h b/GL/glx/glxscreens.h index a7700f649..bba45572f 100644 --- a/GL/glx/glxscreens.h +++ b/GL/glx/glxscreens.h @@ -40,9 +40,6 @@ ** */ -/* XXX: should be defined somewhere globally */ -#define CAPI - #include "GL/internal/glcore.h" /* From 6b040b79f0e247b6f2da8f7d239443743e96de67 Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Sat, 14 Apr 2007 18:29:52 +0300 Subject: [PATCH 26/34] glx: drop xmesaP.h include from xf86glx.c The declarations for the xfree86-specific XMesa functions were moved up to xmesa.h, requires Mesa as of 2007-04-13. --- GL/mesa/X/xf86glx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/GL/mesa/X/xf86glx.c b/GL/mesa/X/xf86glx.c index 6fffdeb1f..ecfa4d773 100644 --- a/GL/mesa/X/xf86glx.c +++ b/GL/mesa/X/xf86glx.c @@ -45,7 +45,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include -#include "xmesaP.h" #include "glcontextmodes.h" #include "os.h" From eba81a0a01f8a61151d8bf9f3d83bda85ca26e73 Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Sat, 14 Apr 2007 18:30:09 +0300 Subject: [PATCH 27/34] glx: move __glXMesaProvider from GLcore module to glx module. This treats the GLcore provider similar to DRI provider, using a subset of XMesa as the GLcore interface. --- GL/glx/Makefile.am | 3 ++- GL/{mesa/X/xf86glx.c => glx/glxglcore.c} | 0 GL/mesa/X/Makefile.am | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) rename GL/{mesa/X/xf86glx.c => glx/glxglcore.c} (100%) diff --git a/GL/glx/Makefile.am b/GL/glx/Makefile.am index cd1130d61..c4141bceb 100644 --- a/GL/glx/Makefile.am +++ b/GL/glx/Makefile.am @@ -46,12 +46,13 @@ libglx_la_SOURCES = \ glxdrawable.h \ glxext.c \ glxext.h \ - glxvisuals.c \ + glxglcore.c \ glxscreens.c \ glxscreens.h \ glxserver.h \ glxutil.c \ glxutil.h \ + glxvisuals.c \ indirect_dispatch.c \ indirect_dispatch.h \ indirect_dispatch_swap.c \ diff --git a/GL/mesa/X/xf86glx.c b/GL/glx/glxglcore.c similarity index 100% rename from GL/mesa/X/xf86glx.c rename to GL/glx/glxglcore.c diff --git a/GL/mesa/X/Makefile.am b/GL/mesa/X/Makefile.am index f8f16c39e..ace118170 100644 --- a/GL/mesa/X/Makefile.am +++ b/GL/mesa/X/Makefile.am @@ -22,8 +22,6 @@ AM_CFLAGS = \ -DXFree86Server \ @GLX_DEFINES@ -libX_la_SOURCES = xf86glx.c - nodist_libX_la_SOURCES = \ xm_api.c \ xm_buffer.c \ From cc4eb1c7ea1bace7ed69cfd80c99d22933282ae1 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 13 Apr 2007 15:04:29 -0300 Subject: [PATCH 28/34] Add quirk for Acer AL1706 monitor to force 60hz refresh. This Acer monitor reports support for 75hz refresh via EDID, and yet when that rate is delivered, the monitor does not sync and reports out of range. Use the existing 60hz quirk for this monitor. (cherry picked from commit 1328a288e9030a472a915077160f090d1afd4126) --- hw/xfree86/modes/xf86EdidModes.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hw/xfree86/modes/xf86EdidModes.c b/hw/xfree86/modes/xf86EdidModes.c index 7a8ec1935..18e42dd06 100644 --- a/hw/xfree86/modes/xf86EdidModes.c +++ b/hw/xfree86/modes/xf86EdidModes.c @@ -82,6 +82,11 @@ static Bool quirk_prefer_large_60 (int scrnIndex, xf86MonPtr DDC) DDC->vendor.prod_id == 1516) return TRUE; + /* Acer AL1706 */ + if (memcmp (DDC->vendor.name, "ACR", 4) == 0 && + DDC->vendor.prod_id == 44358) + return TRUE; + return FALSE; } From b5823ea3e1ed5a0449d44da05165a46719dcf287 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 15 Apr 2007 22:59:19 -0300 Subject: [PATCH 29/34] RandR 1.2 spec says CRTC info contains screen-relative geometry. Was reporting mode size instead of adjusting for rotation. (cherry picked from commit e2e7c47a528447e90cff6cf10d2ce457742ef48d) --- randr/rrcrtc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index 1dfc3bbb0..c8c2be264 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -518,6 +518,7 @@ ProcRRGetCrtcInfo (ClientPtr client) RROutput *outputs; RROutput *possible; int i, j, k, n; + int width, height; REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq); crtc = LookupCrtc(client, stuff->crtc, DixReadAccess); @@ -540,8 +541,9 @@ ProcRRGetCrtcInfo (ClientPtr client) rep.timestamp = pScrPriv->lastSetTime.milliseconds; rep.x = crtc->x; rep.y = crtc->y; - rep.width = mode ? mode->mode.width : 0; - rep.height = mode ? mode->mode.height : 0; + RRCrtcGetScanoutSize (crtc, &width, &height); + rep.width = width; + rep.height = height; rep.mode = mode ? mode->mode.id : 0; rep.rotation = crtc->rotation; rep.rotations = crtc->rotations; From 02d42f344ce020c9b84723671cb9c68d5c064933 Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Mon, 16 Apr 2007 17:24:53 +0200 Subject: [PATCH 30/34] Changes for single-entity multi-screen DRI. The entity (device) has a locking SAREA and a master file descriptor that optionally isn't closed between server generation. The locking SAREA contains the device hardware lock. Each DRI screen creates an new SAREA containing the drawable lock, drawable-and private info, the drawable SAREA. The first screen optionally shares its drawable SAREA with the device SAREA. Default is to close the master descriptor between server generations, and to share the drawable SAREA of the first screen with the device locking SAREA. Thus we should (hopefully) have full backwards compatibility. Mesa changes to support single-device multiple screens are pending. --- hw/xfree86/dri/dri.c | 508 ++++++++++++++++++++++++------------- hw/xfree86/dri/dri.h | 18 +- hw/xfree86/dri/dristruct.h | 24 ++ hw/xfree86/dri/sarea.h | 5 + 4 files changed, 382 insertions(+), 173 deletions(-) diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c index 7bd07c003..35da8a625 100644 --- a/hw/xfree86/dri/dri.c +++ b/hw/xfree86/dri/dri.c @@ -43,6 +43,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include #define NEED_REPLIES #define NEED_EVENTS @@ -77,6 +78,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. extern Bool noPanoramiXExtension; #endif +static int DRIEntPrivIndex = -1; static int DRIScreenPrivIndex = -1; static int DRIWindowPrivIndex = -1; static unsigned long DRIGeneration = 0; @@ -112,18 +114,203 @@ DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...) } +static void +DRIOpenDRMCleanup(DRIEntPrivPtr pDRIEntPriv) +{ + if (pDRIEntPriv->pLSAREA != NULL) { + drmUnmap(pDRIEntPriv->pLSAREA, pDRIEntPriv->sAreaSize); + pDRIEntPriv->pLSAREA = NULL; + } + if (pDRIEntPriv->hLSAREA != 0) { + drmRmMap(pDRIEntPriv->drmFD, pDRIEntPriv->hLSAREA); + } + if (pDRIEntPriv->drmFD >= 0) { + drmClose(pDRIEntPriv->drmFD); + pDRIEntPriv->drmFD = 0; + } +} + +int +DRIMasterFD(ScrnInfoPtr pScrn) +{ + return DRI_ENT_PRIV(pScrn)->drmFD; +} + +void * +DRIMasterSareaPointer(ScrnInfoPtr pScrn) +{ + return DRI_ENT_PRIV(pScrn)->pLSAREA; +} + +drm_handle_t +DRIMasterSareaHandle(ScrnInfoPtr pScrn) +{ + return DRI_ENT_PRIV(pScrn)->hLSAREA; +} + + +Bool +DRIOpenDRMMaster(ScrnInfoPtr pScrn, + unsigned long sAreaSize, + const char *busID, + const char *drmDriverName) +{ + drmSetVersion saveSv, sv; + Bool drmWasAvailable; + DRIEntPrivPtr pDRIEntPriv; + DRIEntPrivRec tmp; + drmVersionPtr drmlibv; + int drmlibmajor, drmlibminor; + const char *openBusID; + int count; + int err; + + if (DRIEntPrivIndex == -1) + DRIEntPrivIndex = xf86AllocateEntityPrivateIndex(); + + pDRIEntPriv = DRI_ENT_PRIV(pScrn); + + if (pDRIEntPriv && pDRIEntPriv->drmFD != -1) + return TRUE; + + drmWasAvailable = drmAvailable(); + + memset(&tmp, 0, sizeof(tmp)); + + /* Check the DRM lib version. + * drmGetLibVersion was not supported in version 1.0, so check for + * symbol first to avoid possible crash or hang. + */ + + drmlibmajor = 1; + drmlibminor = 0; + if (xf86LoaderCheckSymbol("drmGetLibVersion")) { + drmlibv = drmGetLibVersion(-1); + if (drmlibv != NULL) { + drmlibmajor = drmlibv->version_major; + drmlibminor = drmlibv->version_minor; + drmFreeVersion(drmlibv); + } + } + + /* Check if the libdrm can handle falling back to loading based on name + * if a busid string is passed. + */ + openBusID = (drmlibmajor == 1 && drmlibminor >= 2) ? busID : NULL; + + tmp.drmFD = -1; + sv.drm_di_major = 1; + sv.drm_di_minor = 1; + sv.drm_dd_major = -1; + + saveSv = sv; + count = 10; + while (count--) { + tmp.drmFD = drmOpen(drmDriverName, openBusID); + + if (tmp.drmFD < 0) { + DRIDrvMsg(-1, X_ERROR, "[drm] drmOpen failed.\n"); + goto out_err; + } + + err = drmSetInterfaceVersion(tmp.drmFD, &sv); + + if (err != -EPERM) + break; + + sv = saveSv; + drmClose(tmp.drmFD); + tmp.drmFD = -1; + usleep(100000); + } + + if (tmp.drmFD <= 0) { + DRIDrvMsg(-1, X_ERROR, "[drm] DRM was busy with another master.\n"); + goto out_err; + } + + if (!drmWasAvailable) { + DRIDrvMsg(-1, X_INFO, + "[drm] loaded kernel module for \"%s\" driver.\n", + drmDriverName); + } + + if (err != 0) { + sv.drm_di_major = 1; + sv.drm_di_minor = 0; + } + + DRIDrvMsg(-1, X_INFO, "[drm] DRM interface version %d.%d\n", + sv.drm_di_major, sv.drm_di_minor); + + if (sv.drm_di_major == 1 && sv.drm_di_minor >= 1) + err = 0; + else + err = drmSetBusid(tmp.drmFD, busID); + + if (err) { + DRIDrvMsg(-1, X_ERROR, "[drm] Could not set DRM device bus ID.\n"); + goto out_err; + } + + /* + * Create a lock-containing sarea. + */ + + if (drmAddMap( tmp.drmFD, 0, sAreaSize, DRM_SHM, + DRM_CONTAINS_LOCK, &tmp.hLSAREA) < 0) { + DRIDrvMsg(-1, X_INFO, "[drm] Could not create SAREA for DRM lock.\n"); + tmp.hLSAREA = 0; + goto out_err; + } + + if (drmMap( tmp.drmFD, tmp.hLSAREA, sAreaSize, + (drmAddressPtr)(&tmp.pLSAREA)) < 0) { + DRIDrvMsg(-1, X_INFO, "[drm] Mapping SAREA for DRM lock failed.\n"); + tmp.pLSAREA = NULL; + goto out_err; + } + + memset(tmp.pLSAREA, 0, sAreaSize); + + /* + * Reserved contexts are handled by the first opened screen. + */ + + tmp.resOwner = NULL; + + if (!pDRIEntPriv) + pDRIEntPriv = xnfcalloc(sizeof(*pDRIEntPriv), 1); + + if (!pDRIEntPriv) { + DRIDrvMsg(-1, X_INFO, "[drm] Failed to allocate memory for " + "DRM device.\n"); + goto out_err; + } + *pDRIEntPriv = tmp; + xf86GetEntityPrivate((pScrn)->entityList[0],DRIEntPrivIndex)->ptr = + pDRIEntPriv; + + DRIDrvMsg(-1, X_INFO, "[drm] DRM open master succeeded.\n"); + return TRUE; + + out_err: + + DRIOpenDRMCleanup(&tmp); + return FALSE; +} + + Bool DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD) { DRIScreenPrivPtr pDRIPriv; drm_context_t * reserved; int reserved_count; - int i, fd, drmWasAvailable; + int i; Bool xineramaInCore = FALSE; - int err = 0; - char *openbusid; - drmVersionPtr drmlibv; - int drmlibmajor, drmlibminor, drmdimajor, drmdiminor; + DRIEntPrivPtr pDRIEntPriv; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; if (DRIGeneration != serverGeneration) { if ((DRIScreenPrivIndex = AllocateScreenPrivateIndex()) < 0) @@ -153,47 +340,12 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD) } } - drmWasAvailable = drmAvailable(); + if (!DRIOpenDRMMaster(pScrn, pDRIInfo->SAREASize, + pDRIInfo->busIdString, + pDRIInfo->drmDriverName)) + return FALSE; - /* Check the DRM lib version. - * drmGetLibVersion was not supported in version 1.0, so check for - * symbol first to avoid possible crash or hang. - */ - drmlibmajor = 1; - drmlibminor = 0; - if (xf86LoaderCheckSymbol("drmGetLibVersion")) { - drmlibv = drmGetLibVersion(-1); - if (drmlibv != NULL) { - drmlibmajor = drmlibv->version_major; - drmlibminor = drmlibv->version_minor; - drmFreeVersion(drmlibv); - } - } - - /* Check if the libdrm can handle falling back to loading based on name - * if a busid string is passed. - */ - if (drmlibmajor == 1 && drmlibminor >= 2) - openbusid = pDRIInfo->busIdString; - else - openbusid = NULL; - - /* Note that drmOpen will try to load the kernel module, if needed. */ - fd = drmOpen(pDRIInfo->drmDriverName, openbusid); - if (fd < 0) { - /* failed to open DRM */ - pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL; - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] drmOpen failed\n"); - return FALSE; - } - - if (!drmWasAvailable) { - /* drmOpen loaded the kernel module, print a message to say so */ - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] loaded kernel module for \"%s\" driver\n", - pDRIInfo->drmDriverName); - } + pDRIEntPriv = DRI_ENT_PRIV(pScrn); pDRIPriv = (DRIScreenPrivPtr) xcalloc(1, sizeof(DRIScreenPrivRec)); if (!pDRIPriv) { @@ -202,7 +354,7 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD) } pScreen->devPrivates[DRIScreenPrivIndex].ptr = (pointer) pDRIPriv; - pDRIPriv->drmFD = fd; + pDRIPriv->drmFD = pDRIEntPriv->drmFD; pDRIPriv->directRenderingSupport = TRUE; pDRIPriv->pDriverInfo = pDRIInfo; pDRIPriv->nrWindows = 0; @@ -214,89 +366,54 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD) pDRIPriv->grabbedDRILock = FALSE; pDRIPriv->drmSIGIOHandlerInstalled = FALSE; - - if (drmlibmajor == 1 && drmlibminor >= 2) { - drmSetVersion sv; - - /* Get the interface version, asking for 1.1. */ - sv.drm_di_major = 1; - sv.drm_di_minor = 1; - sv.drm_dd_major = -1; - err = drmSetInterfaceVersion(pDRIPriv->drmFD, &sv); - if (err == 0) { - drmdimajor = sv.drm_di_major; - drmdiminor = sv.drm_di_minor; - } else { - /* failure, so set it to 1.0.0. */ - drmdimajor = 1; - drmdiminor = 0; - } - } - else { - /* We can't check the DI DRM interface version, so set it to 1.0.0. */ - drmdimajor = 1; - drmdiminor = 0; - } - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] DRM interface version %d.%d\n", drmdimajor, drmdiminor); - - /* If the interface minor number is 1.1, then we've opened a DRM device - * that already had the busid set through drmOpen. - */ - if (drmdimajor == 1 && drmdiminor >= 1) - err = 0; - else - err = drmSetBusid(pDRIPriv->drmFD, pDRIPriv->pDriverInfo->busIdString); - - if (err < 0) { - pDRIPriv->directRenderingSupport = FALSE; - pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL; - drmClose(pDRIPriv->drmFD); - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] drmSetBusid failed (%d, %s), %s\n", - pDRIPriv->drmFD, pDRIPriv->pDriverInfo->busIdString, strerror(-err)); - return FALSE; - } - *pDRMFD = pDRIPriv->drmFD; - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] created \"%s\" driver at busid \"%s\"\n", - pDRIPriv->pDriverInfo->drmDriverName, - pDRIPriv->pDriverInfo->busIdString); - if (drmAddMap( pDRIPriv->drmFD, - 0, - pDRIPriv->pDriverInfo->SAREASize, - DRM_SHM, - DRM_CONTAINS_LOCK, - &pDRIPriv->hSAREA) < 0) - { - pDRIPriv->directRenderingSupport = FALSE; - pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL; - drmClose(pDRIPriv->drmFD); - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] drmAddMap failed\n"); - return FALSE; - } - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] added %d byte SAREA at %p\n", - pDRIPriv->pDriverInfo->SAREASize, pDRIPriv->hSAREA); + if (pDRIEntPriv->sAreaGrabbed || pDRIInfo->allocSarea) { - if (drmMap( pDRIPriv->drmFD, - pDRIPriv->hSAREA, - pDRIPriv->pDriverInfo->SAREASize, - (drmAddressPtr)(&pDRIPriv->pSAREA)) < 0) - { - pDRIPriv->directRenderingSupport = FALSE; - pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL; - drmClose(pDRIPriv->drmFD); - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] drmMap failed\n"); - return FALSE; + if (drmAddMap( pDRIPriv->drmFD, + 0, + pDRIPriv->pDriverInfo->SAREASize, + DRM_SHM, + 0, + &pDRIPriv->hSAREA) < 0) + { + pDRIPriv->directRenderingSupport = FALSE; + pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL; + drmClose(pDRIPriv->drmFD); + DRIDrvMsg(pScreen->myNum, X_INFO, + "[drm] drmAddMap failed\n"); + return FALSE; + } + DRIDrvMsg(pScreen->myNum, X_INFO, + "[drm] added %d byte SAREA at %p\n", + pDRIPriv->pDriverInfo->SAREASize, pDRIPriv->hSAREA); + + /* Backwards compat. */ + if (drmMap( pDRIPriv->drmFD, + pDRIPriv->hSAREA, + pDRIPriv->pDriverInfo->SAREASize, + (drmAddressPtr)(&pDRIPriv->pSAREA)) < 0) + { + pDRIPriv->directRenderingSupport = FALSE; + pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL; + drmClose(pDRIPriv->drmFD); + DRIDrvMsg(pScreen->myNum, X_INFO, + "[drm] drmMap failed\n"); + return FALSE; + } + DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] mapped SAREA %p to %p\n", + pDRIPriv->hSAREA, pDRIPriv->pSAREA); + memset(pDRIPriv->pSAREA, 0, pDRIPriv->pDriverInfo->SAREASize); + } else { + DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] Using the DRM lock " + "SAREA also for drawables.\n"); + pDRIPriv->hSAREA = pDRIEntPriv->hLSAREA; + pDRIPriv->pSAREA = (XF86DRISAREAPtr) pDRIEntPriv->pLSAREA; + pDRIEntPriv->sAreaGrabbed = TRUE; } - memset(pDRIPriv->pSAREA, 0, pDRIPriv->pDriverInfo->SAREASize); - DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] mapped SAREA %p to %p\n", - pDRIPriv->hSAREA, pDRIPriv->pSAREA); + + pDRIPriv->hLSAREA = pDRIEntPriv->hLSAREA; + pDRIPriv->pLSAREA = pDRIEntPriv->pLSAREA; if (drmAddMap( pDRIPriv->drmFD, (drm_handle_t)pDRIPriv->pDriverInfo->frameBufferPhysicalAddress, @@ -316,22 +433,26 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD) DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] framebuffer handle = %p\n", pDRIPriv->hFrameBuffer); - /* Add tags for reserved contexts */ - if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD, - &reserved_count))) { - int i; - void *tag; + if (pDRIEntPriv->resOwner == NULL) { + pDRIEntPriv->resOwner = pScreen; - for (i = 0; i < reserved_count; i++) { - tag = DRICreateContextPrivFromHandle(pScreen, - reserved[i], - DRI_CONTEXT_RESERVED); - drmAddContextTag(pDRIPriv->drmFD, reserved[i], tag); + /* Add tags for reserved contexts */ + if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD, + &reserved_count))) { + int i; + void *tag; + + for (i = 0; i < reserved_count; i++) { + tag = DRICreateContextPrivFromHandle(pScreen, + reserved[i], + DRI_CONTEXT_RESERVED); + drmAddContextTag(pDRIPriv->drmFD, reserved[i], tag); + } + drmFreeReservedContextList(reserved); + DRIDrvMsg(pScreen->myNum, X_INFO, + "[drm] added %d reserved context%s for kernel\n", + reserved_count, reserved_count > 1 ? "s" : ""); } - drmFreeReservedContextList(reserved); - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] added %d reserved context%s for kernel\n", - reserved_count, reserved_count > 1 ? "s" : ""); } /* validate max drawable table entry set by driver */ @@ -349,6 +470,11 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD) pDRIPriv->pSAREA->drawableTable[i].flags = 0; } + pDRIPriv->pLockRefCount = &pDRIEntPriv->lockRefCount; + pDRIPriv->pLockingContext = &pDRIEntPriv->lockingContext; + + pDRIEntPriv->refCount++; + return TRUE; } @@ -490,6 +616,9 @@ DRICloseScreen(ScreenPtr pScreen) DRIInfoPtr pDRIInfo; drm_context_t * reserved; int reserved_count; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + DRIEntPrivPtr pDRIEntPriv = DRI_ENT_PRIV(pScrn); + Bool closeMaster; if (pDRIPriv && pDRIPriv->directRenderingSupport) { @@ -542,38 +671,55 @@ DRICloseScreen(ScreenPtr pScreen) } /* Remove tags for reserved contexts */ - if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD, - &reserved_count))) { - int i; + if (pDRIEntPriv->resOwner == pScreen) { + pDRIEntPriv->resOwner = NULL; - for (i = 0; i < reserved_count; i++) { - DRIDestroyContextPriv(drmGetContextTag(pDRIPriv->drmFD, - reserved[i])); + if ((reserved = drmGetReservedContextList(pDRIPriv->drmFD, + &reserved_count))) { + int i; + + for (i = 0; i < reserved_count; i++) { + DRIDestroyContextPriv(drmGetContextTag(pDRIPriv->drmFD, + reserved[i])); + } + drmFreeReservedContextList(reserved); + DRIDrvMsg(pScreen->myNum, X_INFO, + "[drm] removed %d reserved context%s for kernel\n", + reserved_count, reserved_count > 1 ? "s" : ""); } - drmFreeReservedContextList(reserved); - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] removed %d reserved context%s for kernel\n", - reserved_count, reserved_count > 1 ? "s" : ""); } /* Make sure signals get unblocked etc. */ drmUnlock(pDRIPriv->drmFD, pDRIPriv->myContext); - pDRIPriv->lockRefCount = 0; - DRIDrvMsg(pScreen->myNum, X_INFO, - "[drm] unmapping %d bytes of SAREA %p at %p\n", - pDRIInfo->SAREASize, - pDRIPriv->hSAREA, - pDRIPriv->pSAREA); - if (drmUnmap(pDRIPriv->pSAREA, pDRIInfo->SAREASize)) { - DRIDrvMsg(pScreen->myNum, X_ERROR, - "[drm] unable to unmap %d bytes" - " of SAREA %p at %p\n", + pDRIPriv->pLockRefCount = NULL; + closeMaster = (--pDRIEntPriv->refCount == 0) && + !pDRIEntPriv->keepFDOpen; + if (closeMaster || pDRIPriv->hSAREA != pDRIEntPriv->hLSAREA) { + DRIDrvMsg(pScreen->myNum, X_INFO, + "[drm] unmapping %d bytes of SAREA %p at %p\n", pDRIInfo->SAREASize, pDRIPriv->hSAREA, pDRIPriv->pSAREA); + if (drmUnmap(pDRIPriv->pSAREA, pDRIInfo->SAREASize)) { + DRIDrvMsg(pScreen->myNum, X_ERROR, + "[drm] unable to unmap %d bytes" + " of SAREA %p at %p\n", + pDRIInfo->SAREASize, + pDRIPriv->hSAREA, + pDRIPriv->pSAREA); + } + } else { + pDRIEntPriv->sAreaGrabbed = FALSE; } - drmClose(pDRIPriv->drmFD); + if (closeMaster || (pDRIEntPriv->drmFD != pDRIPriv->drmFD)) { + drmClose(pDRIPriv->drmFD); + if (pDRIEntPriv->drmFD == pDRIPriv->drmFD) { + DRIDrvMsg(pScreen->myNum, X_INFO, + "[drm] Closed DRM master.\n"); + pDRIEntPriv->drmFD = -1; + } + } xfree(pDRIPriv); pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL; @@ -2001,28 +2147,46 @@ void DRILock(ScreenPtr pScreen, int flags) { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); - if(!pDRIPriv) return; - if (!pDRIPriv->lockRefCount) - DRM_LOCK(pDRIPriv->drmFD, pDRIPriv->pSAREA, pDRIPriv->myContext, flags); - pDRIPriv->lockRefCount++; + if(!pDRIPriv || !pDRIPriv->pLockRefCount) return; + + if (!*pDRIPriv->pLockRefCount) { + DRM_LOCK(pDRIPriv->drmFD, pDRIPriv->pLSAREA, pDRIPriv->myContext, flags); + *pDRIPriv->pLockingContext = pDRIPriv->myContext; + } else if (*pDRIPriv->pLockingContext != pDRIPriv->myContext) { + DRIDrvMsg(pScreen->myNum, X_ERROR, + "[DRI] Locking deadlock.\n" + "\tAlready locked with context %d,\n" + "\ttrying to lock with context %d.\n", + pDRIPriv->pLockingContext, + pDRIPriv->myContext); + } + (*pDRIPriv->pLockRefCount)++; } void DRIUnlock(ScreenPtr pScreen) { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); - if(!pDRIPriv) return; - if (pDRIPriv->lockRefCount > 0) { - pDRIPriv->lockRefCount--; - } - else { - ErrorF("DRIUnlock called when not locked\n"); + if(!pDRIPriv || !pDRIPriv->pLockRefCount) return; + + if (*pDRIPriv->pLockRefCount > 0) { + if (pDRIPriv->myContext != *pDRIPriv->pLockingContext) { + DRIDrvMsg(pScreen->myNum, X_ERROR, + "[DRI] Unlocking inconsistency:\n" + "\tContext %d trying to unlock lock held by context %d\n", + pDRIPriv->pLockingContext, + pDRIPriv->myContext); + } + (*pDRIPriv->pLockRefCount)--; + } else { + DRIDrvMsg(pScreen->myNum, X_ERROR, + "DRIUnlock called when not locked.\n"); return; } - if (!pDRIPriv->lockRefCount) - DRM_UNLOCK(pDRIPriv->drmFD, pDRIPriv->pSAREA, pDRIPriv->myContext); + if (! *pDRIPriv->pLockRefCount) + DRM_UNLOCK(pDRIPriv->drmFD, pDRIPriv->pLSAREA, pDRIPriv->myContext); } void * diff --git a/hw/xfree86/dri/dri.h b/hw/xfree86/dri/dri.h index f65c57160..a21338a90 100644 --- a/hw/xfree86/dri/dri.h +++ b/hw/xfree86/dri/dri.h @@ -107,7 +107,7 @@ typedef struct { */ #define DRIINFO_MAJOR_VERSION 5 -#define DRIINFO_MINOR_VERSION 1 +#define DRIINFO_MINOR_VERSION 2 #define DRIINFO_PATCH_VERSION 0 typedef struct { @@ -176,9 +176,17 @@ typedef struct { /* New with DRI version 5.1.0 */ void (*ClipNotify)(ScreenPtr pScreen, WindowPtr *ppWin, int num); + + /* New with DRI version 5.2.0 */ + Bool allocSarea; + Bool keepFDOpen; } DRIInfoRec, *DRIInfoPtr; +extern Bool DRIOpenDRMMaster(ScrnInfoPtr pScrn, unsigned long sAreaSize, + const char *busID, + const char *drmDriverName); + extern Bool DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD); @@ -344,6 +352,14 @@ extern char *DRICreatePCIBusID(pciVideoPtr PciInfo); extern int drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *)); extern int drmRemoveSIGIOHandler(int fd); +extern int DRIMasterFD(ScrnInfoPtr pScrn); + +extern void *DRIMasterSareaPointer(ScrnInfoPtr pScrn); + +extern drm_handle_t DRIMasterSareaHandle(ScrnInfoPtr pScrn); + + + #define _DRI_H_ #endif diff --git a/hw/xfree86/dri/dristruct.h b/hw/xfree86/dri/dristruct.h index 9c42ff9cc..a3bac8556 100644 --- a/hw/xfree86/dri/dristruct.h +++ b/hw/xfree86/dri/dristruct.h @@ -73,6 +73,11 @@ struct _DRIContextPrivRec #define DRI_SCREEN_PRIV_FROM_INDEX(screenIndex) ((DRIScreenPrivPtr) \ (screenInfo.screens[screenIndex]->devPrivates[DRIScreenPrivIndex].ptr)) +#define DRI_ENT_PRIV(pScrn) \ + ((DRIEntPrivIndex < 0) ? \ + NULL: \ + ((DRIEntPrivPtr)(xf86GetEntityPrivate((pScrn)->entityList[0], \ + DRIEntPrivIndex)->ptr))) typedef struct _DRIScreenPrivRec { @@ -103,6 +108,25 @@ typedef struct _DRIScreenPrivRec Bool wrapped; Bool windowsTouched; int lockRefCount; + drm_handle_t hLSAREA; /* Handle to SAREA containing lock, for mapping */ + XF86DRILSAREAPtr pLSAREA; /* Mapped pointer to SAREA containing lock */ + int* pLockRefCount; + int* pLockingContext; } DRIScreenPrivRec, *DRIScreenPrivPtr; + +typedef struct _DRIEntPrivRec { + int drmFD; + Bool drmOpened; + Bool sAreaGrabbed; + drm_handle_t hLSAREA; + XF86DRILSAREAPtr pLSAREA; + unsigned long sAreaSize; + int lockRefCount; + int lockingContext; + ScreenPtr resOwner; + Bool keepFDOpen; + int refCount; +} DRIEntPrivRec, *DRIEntPrivPtr; + #endif /* DRI_STRUCT_H */ diff --git a/hw/xfree86/dri/sarea.h b/hw/xfree86/dri/sarea.h index a0d6084f3..1528cc191 100644 --- a/hw/xfree86/dri/sarea.h +++ b/hw/xfree86/dri/sarea.h @@ -89,4 +89,9 @@ typedef struct _XF86DRISAREA { drm_context_t dummy_context; } XF86DRISAREARec, *XF86DRISAREAPtr; +typedef struct _XF86DRILSAREA { + drmLock lock; + drmLock otherLocks[31]; +} XF86DRILSAREARec, *XF86DRILSAREAPtr; + #endif From deda7791dfa34d0563c8d7fa2a0660ac27e6858c Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 16 Apr 2007 11:35:22 -0600 Subject: [PATCH 31/34] remove sources deleted in Mesa --- GL/mesa/tnl/Makefile.am | 2 -- 1 file changed, 2 deletions(-) diff --git a/GL/mesa/tnl/Makefile.am b/GL/mesa/tnl/Makefile.am index 84301d3d8..b3c82066f 100644 --- a/GL/mesa/tnl/Makefile.am +++ b/GL/mesa/tnl/Makefile.am @@ -21,8 +21,6 @@ INCLUDES = -I@MESA_SOURCE@/include \ nodist_libtnl_la_SOURCES = t_context.c \ t_draw.c \ t_pipeline.c \ - t_vb_arbprogram.c \ - t_vb_arbprogram_sse.c \ t_vb_cull.c \ t_vb_fog.c \ t_vb_light.c \ From 97a2c2579c56c304705c934f3b536473645747df Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 16 Apr 2007 09:39:47 -0700 Subject: [PATCH 32/34] Using wrong log level in extension to built-in message was: typo in built-in module log message (cherry picked from commit 00cfd1f765895b4d1b2234f3203727a8871b64b0) --- hw/xfree86/loader/loadmod.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c index db12da466..6a1c65e4a 100644 --- a/hw/xfree86/loader/loadmod.c +++ b/hw/xfree86/loader/loadmod.c @@ -869,7 +869,7 @@ doLoadModule(const char *module, const char *path, const char **subdirlist, for (cim = compiled_in_modules; *cim; cim++) if (!strcmp (module, *cim)) { - xf86MsgVerb(X_INFO, 3, "Module already built-in\n"); + xf86MsgVerb(X_INFO, 0, "Module already built-in\n"); return (ModuleDescPtr) 1; } From c41e3bd713206c0bbd8ab8cef4c83eb7ba7e1c3c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 16 Apr 2007 09:53:42 -0700 Subject: [PATCH 33/34] Use default screen monitor for one of the outputs. By default, use the screen monitor section for output 0, however, a driver can change which output gets the screen monitor by calling xf86OutputUseScreenMonitor. (cherry picked from commit f4a8e54caf6b9431711383a39f55a18e7fd654f4) --- hw/xfree86/modes/xf86Crtc.c | 31 ++++++++++++++++++++++++++++++- hw/xfree86/modes/xf86Crtc.h | 12 +++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 7e7c7e7ec..87820ded4 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -414,10 +414,25 @@ xf86OutputSetMonitor (xf86OutputPtr output) xfree (option_name); output->conf_monitor = xf86findMonitor (monitor, xf86configptr->conf_monitor_lst); + /* + * Find the monitor section of the screen and use that + */ + if (!output->conf_monitor && output->use_screen_monitor) + output->conf_monitor = xf86findMonitor (output->scrn->monitor->id, + xf86configptr->conf_monitor_lst); if (output->conf_monitor) + { + xf86DrvMsg (output->scrn->scrnIndex, X_INFO, + "Output %s using monitor section %s\n", + output->name, output->conf_monitor->mon_identifier); xf86ProcessOptions (output->scrn->scrnIndex, output->conf_monitor->mon_option_lst, output->options); + } + else + xf86DrvMsg (output->scrn->scrnIndex, X_INFO, + "Output %s has no monitor section\n", + output->name); } static Bool @@ -463,7 +478,7 @@ xf86OutputInitialRotation (xf86OutputPtr output) xf86OutputPtr xf86OutputCreate (ScrnInfoPtr scrn, - const xf86OutputFuncsRec *funcs, + const xf86OutputFuncsRec *funcs, const char *name) { xf86OutputPtr output, *outputs; @@ -486,6 +501,10 @@ xf86OutputCreate (ScrnInfoPtr scrn, strcpy (output->name, name); } output->subpixel_order = SubPixelUnknown; + /* + * Use the old per-screen monitor section for the first output + */ + output->use_screen_monitor = (xf86_config->num_output == 0); #ifdef RANDR_12_INTERFACE output->randr_output = NULL; #endif @@ -536,6 +555,16 @@ xf86OutputRename (xf86OutputPtr output, const char *name) return TRUE; } +void +xf86OutputUseScreenMonitor (xf86OutputPtr output, Bool use_screen_monitor) +{ + if (use_screen_monitor != output->use_screen_monitor) + { + output->use_screen_monitor = use_screen_monitor; + xf86OutputSetMonitor (output); + } +} + void xf86OutputDestroy (xf86OutputPtr output) { diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 030f6bf3a..0c019e0e6 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -479,6 +479,9 @@ struct _xf86Output { /** driver private information */ void *driver_private; + /** Whether to use the old per-screen Monitor config section */ + Bool use_screen_monitor; + #ifdef RANDR_12_INTERFACE /** * RandR 1.2 output structure. @@ -618,9 +621,12 @@ xf86CrtcInUse (xf86CrtcPtr crtc); * Output functions */ xf86OutputPtr -xf86OutputCreate (ScrnInfoPtr scrn, - const xf86OutputFuncsRec *funcs, - const char *name); +xf86OutputCreate (ScrnInfoPtr scrn, + const xf86OutputFuncsRec *funcs, + const char *name); + +void +xf86OutputUseScreenMonitor (xf86OutputPtr output, Bool use_screen_monitor); Bool xf86OutputRename (xf86OutputPtr output, const char *name); From fc162c6cfa06f0b012743d6d79cef45cf0166229 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 16 Apr 2007 09:55:58 -0700 Subject: [PATCH 34/34] Allow outputs to be explicitly enabled in config, overriding detect. Option "Enable" "True" will force the server to enable an output at startup time, even if the output is not connected. This also causes the default modes to be added for this output, allowing even sync ranges to be used to pick out standard modes. (cherry picked from commit a3d73ba2cb7e13a6d129cd88d6a7f7d756e2ced2) --- hw/xfree86/modes/xf86Crtc.c | 45 ++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 87820ded4..ad0f5ff4b 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -436,15 +436,29 @@ xf86OutputSetMonitor (xf86OutputPtr output) } static Bool -xf86OutputEnabled (xf86OutputPtr output) +xf86OutputEnabled (xf86OutputPtr output) { - /* Check to see if this output was disabled in the config file */ - if (xf86ReturnOptValBool (output->options, OPTION_ENABLE, TRUE) == FALSE || - xf86ReturnOptValBool (output->options, OPTION_DISABLE, FALSE) == TRUE) + Bool enable, disable; + + /* check to see if this output was enabled in the config file */ + if (xf86GetOptValBool (output->options, OPTION_ENABLE, &enable) && enable) { + xf86DrvMsg (output->scrn->scrnIndex, X_INFO, + "Output %s enabled by config file\n", output->name); + return TRUE; + } + /* or if this output was disabled in the config file */ + if (xf86GetOptValBool (output->options, OPTION_DISABLE, &disable) && disable) + { + xf86DrvMsg (output->scrn->scrnIndex, X_INFO, + "Output %s disabled by config file\n", output->name); return FALSE; } - return TRUE; + /* otherwise, enable if it is not disconnected */ + enable = output->status != XF86OutputStatusDisconnected; + xf86DrvMsg (output->scrn->scrnIndex, X_INFO, + "Output %s %sconnected\n", output->name, enable ? "" : "dis"); + return enable; } static Bool @@ -1232,7 +1246,7 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) */ output->status = (*output->funcs->detect)(output); - if (output->status == XF86OutputStatusDisconnected) + if (!xf86OutputEnabled (output)) { xf86OutputSetEDID (output, NULL); continue; @@ -1543,8 +1557,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) xf86OutputPtr output = config->output[o]; modes[o] = NULL; - enabled[o] = (xf86OutputEnabled (output) && - output->status != XF86OutputStatusDisconnected); + enabled[o] = xf86OutputEnabled (output); } /* @@ -1589,8 +1602,20 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) { xf86OutputPtr output = config->output[o]; - if (enabled[o] && !modes[o]) - modes[o] = xf86ClosestMode (output, target_mode, target_rotation, width, height); + if (enabled[o]) + { + if (!modes[o]) + modes[o] = xf86ClosestMode (output, target_mode, + target_rotation, width, height); + if (!modes[o]) + xf86DrvMsg (scrn->scrnIndex, X_ERROR, + "Output %s enabled but has no modes\n", + output->name); + else + xf86DrvMsg (scrn->scrnIndex, X_INFO, + "Output %s using initial mode %s\n", + output->name, modes[o]->name); + } } /*