diff options
26 files changed, 346 insertions, 98 deletions
diff --git a/fontconfig/configure.in b/fontconfig/configure.in index b77c52a29..b2174d99b 100644 --- a/fontconfig/configure.in +++ b/fontconfig/configure.in @@ -110,7 +110,6 @@ dnl ========================================================================== AC_ARG_WITH(arch, [AC_HELP_STRING([--with-arch=ARCH], [Force architecture to ARCH])], - , arch="$withval", arch=auto) if test "x$arch" != xauto; then diff --git a/fontconfig/src/fcarch.c b/fontconfig/src/fcarch.c index 09d24b31b..5fe7d97d8 100644 --- a/fontconfig/src/fcarch.c +++ b/fontconfig/src/fcarch.c @@ -56,7 +56,9 @@ FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcStrSet *)); FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcCharLeaf **)); FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcChar16 *)); -FC_ASSERT_STATIC (0x08 + 1*ALIGNOF_DOUBLE == sizeof (FcValue)); +#define FC_MAX(a,b) ((a) > (b) ? (a) : (b)) + +FC_ASSERT_STATIC (0x08 + 1*FC_MAX(4,ALIGNOF_DOUBLE) == sizeof (FcValue)); FC_ASSERT_STATIC (0x00 + 2*SIZEOF_VOID_P == sizeof (FcPatternElt)); FC_ASSERT_STATIC (0x08 + 2*SIZEOF_VOID_P == sizeof (FcPattern)); FC_ASSERT_STATIC (0x08 + 2*SIZEOF_VOID_P == sizeof (FcCharSet)); diff --git a/fontconfig/src/fccfg.c b/fontconfig/src/fccfg.c index 0d0b778d2..f9cdaaf46 100644 --- a/fontconfig/src/fccfg.c +++ b/fontconfig/src/fccfg.c @@ -1302,7 +1302,7 @@ FcConfigAdd (FcValueListPtr *head, if (FcDebug () & FC_DBG_EDIT) { printf ("%s list before ", append ? "Append" : "Prepend"); - FcValueListPrint (*head); + FcValueListPrintWithPosition (*head, *prev); printf ("\n"); } diff --git a/fontconfig/src/fcdbg.c b/fontconfig/src/fcdbg.c index cf2ff0870..10f3cc9aa 100644 --- a/fontconfig/src/fcdbg.c +++ b/fontconfig/src/fcdbg.c @@ -26,59 +26,92 @@ #include <stdio.h> #include <stdlib.h> -void -FcValuePrint (const FcValue v) +static void +_FcValuePrint (const FcValue v) { switch (v.type) { case FcTypeVoid: - printf (" <void>"); + printf ("<void>"); break; case FcTypeInteger: - printf (" %d(i)", v.u.i); + printf ("%d(i)", v.u.i); break; case FcTypeDouble: - printf (" %g(f)", v.u.d); + printf ("%g(f)", v.u.d); break; case FcTypeString: - printf (" \"%s\"", v.u.s); + printf ("\"%s\"", v.u.s); break; case FcTypeBool: - printf (" %s", v.u.b ? "FcTrue" : "FcFalse"); + printf ("%s", v.u.b ? "FcTrue" : "FcFalse"); break; case FcTypeMatrix: - printf (" (%f %f; %f %f)", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy); + printf ("(%f %f; %f %f)", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy); break; case FcTypeCharSet: /* XXX */ - printf (" "); FcCharSetPrint (v.u.c); break; case FcTypeLangSet: - printf (" "); FcLangSetPrint (v.u.l); break; case FcTypeFTFace: - printf (" face"); + printf ("face"); break; } } void +FcValuePrint (const FcValue v) +{ + printf (" "); + _FcValuePrint (v); +} + +void +FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark) +{ + if (show_pos_mark) + printf (" [insert here] "); + else + printf (" "); + _FcValuePrint (v); +} + +static void +FcValueBindingPrint (const FcValueListPtr l) +{ + switch (l->binding) { + case FcValueBindingWeak: + printf ("(w)"); + break; + case FcValueBindingStrong: + printf ("(s)"); + break; + case FcValueBindingSame: + printf ("(=)"); + break; + } +} + +void +FcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos) +{ + for (; l != NULL; l = FcValueListNext(l)) + { + FcValuePrintWithPosition (FcValueCanonicalize (&l->value), pos != NULL && l == pos); + FcValueBindingPrint (l); + } + if (!pos) + printf (" [insert here]"); +} + +void FcValueListPrint (FcValueListPtr l) { for (; l != NULL; l = FcValueListNext(l)) { - FcValuePrint (FcValueCanonicalize(&l->value)); - switch (l->binding) { - case FcValueBindingWeak: - printf ("(w)"); - break; - case FcValueBindingStrong: - printf ("(s)"); - break; - case FcValueBindingSame: - printf ("(=)"); - break; - } + FcValuePrint (FcValueCanonicalize (&l->value)); + FcValueBindingPrint (l); } } diff --git a/fontconfig/src/fcint.h b/fontconfig/src/fcint.h index 0a59f70ac..1ed2df3e1 100644 --- a/fontconfig/src/fcint.h +++ b/fontconfig/src/fcint.h @@ -703,7 +703,13 @@ FcCharSetGetNumbers(const FcCharSet *c); /* fcdbg.c */ FcPrivate void -FcValueListPrint (const FcValueListPtr l); +FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark); + +FcPrivate void +FcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos); + +FcPrivate void +FcValueListPrint (FcValueListPtr l); FcPrivate void FcLangSetPrint (const FcLangSet *ls); diff --git a/mesalib/include/GL/internal/dri_interface.h b/mesalib/include/GL/internal/dri_interface.h index af3a42ad7..eb1b6f28d 100644 --- a/mesalib/include/GL/internal/dri_interface.h +++ b/mesalib/include/GL/internal/dri_interface.h @@ -910,6 +910,7 @@ struct __DRIdri2ExtensionRec { #define __DRI_IMAGE_FORMAT_XRGB8888 0x1002 #define __DRI_IMAGE_FORMAT_ARGB8888 0x1003 #define __DRI_IMAGE_FORMAT_ABGR8888 0x1004 +#define __DRI_IMAGE_FORMAT_XBGR8888 0x1005 #define __DRI_IMAGE_USE_SHARE 0x0001 #define __DRI_IMAGE_USE_SCANOUT 0x0002 diff --git a/mesalib/src/glsl/TODO b/mesalib/src/glsl/TODO index c99d7e152..eb73fc2e8 100644 --- a/mesalib/src/glsl/TODO +++ b/mesalib/src/glsl/TODO @@ -6,22 +6,10 @@ constant index values. For others it is more complicated. Perhaps these cases should be silently converted to uniforms? -- Implement support for ir_binop_dot in ir_algebraic.cpp. Perform +- Implement support for ir_binop_dot in opt_algebraic.cpp. Perform transformations such as "dot(v, vec3(0.0, 1.0, 0.0))" -> v.y. - Track source locations throughout the IR. There are currently several places where we cannot emit line numbers for errors (and currently emit 0:0) because we've "lost" the line number information. This is particularly noticeable at link time. - -1.30 features: - -- Implement AST-to-HIR conversion of switch-statements - - switch - - case - - Update break to correcly handle mixed nexting of switch-statements - and loops. - -- Implement support for gl_ClipDistance. This is non-trivial because - gl_ClipDistance is exposed as a float[8], but all hardware actually - implements it as vec4[2].
\ No newline at end of file diff --git a/mesalib/src/glsl/opt_copy_propagation_elements.cpp b/mesalib/src/glsl/opt_copy_propagation_elements.cpp index 314db4e18..11d9d7baf 100644 --- a/mesalib/src/glsl/opt_copy_propagation_elements.cpp +++ b/mesalib/src/glsl/opt_copy_propagation_elements.cpp @@ -93,6 +93,7 @@ public: ir_copy_propagation_elements_visitor() { this->progress = false; + this->killed_all = false; this->mem_ctx = ralloc_context(NULL); this->shader_mem_ctx = NULL; this->acp = new(mem_ctx) exec_list; diff --git a/mesalib/src/mesa/main/teximage.c b/mesalib/src/mesa/main/teximage.c index 23486467d..50095d2c6 100644 --- a/mesalib/src/mesa/main/teximage.c +++ b/mesalib/src/mesa/main/teximage.c @@ -2692,6 +2692,13 @@ _mesa_EGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image) texObj = _mesa_get_current_tex_object(ctx, target); _mesa_lock_texture(ctx, texObj); + if (texObj->Immutable) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glEGLImageTargetTexture2D(texture is immutable)"); + _mesa_unlock_texture(ctx, texObj); + return; + } + texImage = _mesa_get_tex_image(ctx, texObj, target, 0); if (!texImage) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEGLImageTargetTexture2D"); diff --git a/xorg-server/Xi/xiqueryversion.c b/xorg-server/Xi/xiqueryversion.c index fc0ca751b..6081c413d 100644 --- a/xorg-server/Xi/xiqueryversion.c +++ b/xorg-server/Xi/xiqueryversion.c @@ -70,28 +70,29 @@ ProcXIQueryVersion(ClientPtr client) pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey); - if (pXIClient->major_version && - (stuff->major_version != pXIClient->major_version || - stuff->minor_version != pXIClient->minor_version)) - { - client->errorValue = stuff->major_version; - return BadValue; + if (pXIClient->major_version) { + if (version_compare(stuff->major_version, stuff->minor_version, + pXIClient->major_version, pXIClient->minor_version) < 0) { + client->errorValue = stuff->major_version; + return BadValue; + } + major = pXIClient->major_version; + minor = pXIClient->minor_version; + } else { + if (version_compare(XIVersion.major_version, XIVersion.minor_version, + stuff->major_version, stuff->minor_version) > 0) { + major = stuff->major_version; + minor = stuff->minor_version; + } + else { + major = XIVersion.major_version; + minor = XIVersion.minor_version; + } + + pXIClient->major_version = major; + pXIClient->minor_version = minor; } - - if (version_compare(XIVersion.major_version, XIVersion.minor_version, - stuff->major_version, stuff->minor_version) > 0) { - major = stuff->major_version; - minor = stuff->minor_version; - } - else { - major = XIVersion.major_version; - minor = XIVersion.minor_version; - } - - pXIClient->major_version = major; - pXIClient->minor_version = minor; - memset(&rep, 0, sizeof(xXIQueryVersionReply)); rep.repType = X_Reply; rep.RepType = X_XIQueryVersion; diff --git a/xorg-server/dix/devices.c b/xorg-server/dix/devices.c index d5ad08e16..21179ee59 100644 --- a/xorg-server/dix/devices.c +++ b/xorg-server/dix/devices.c @@ -441,6 +441,7 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent) if (*prev != dev) return FALSE; + ReleaseButtonsAndKeys(dev); SyncRemoveDeviceIdleTime(dev->idle_counter); dev->idle_counter = NULL; diff --git a/xorg-server/dix/getevents.c b/xorg-server/dix/getevents.c index 0a6a997ca..e0ef18365 100644 --- a/xorg-server/dix/getevents.c +++ b/xorg-server/dix/getevents.c @@ -1619,6 +1619,9 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type, /* Now turn the smooth-scrolling axes back into emulated button presses * for legacy clients, based on the integer delta between before and now */ for (i = 0; i < valuator_mask_size(&mask); i++) { + if (i >= pDev->valuator->numAxes) + break; + if (!valuator_mask_isset(&mask, i)) continue; diff --git a/xorg-server/dix/globals.c b/xorg-server/dix/globals.c index a564575f3..332b91f5c 100644 --- a/xorg-server/dix/globals.c +++ b/xorg-server/dix/globals.c @@ -128,6 +128,7 @@ int defaultColorVisualClass = -1; int monitorResolution = 0; char *display; +int displayfd; char *ConnectionInfo; CARD32 TimeOutValue = DEFAULT_TIMEOUT * MILLI_PER_SECOND; diff --git a/xorg-server/dix/touch.c b/xorg-server/dix/touch.c index dd16367d0..401cb981a 100644 --- a/xorg-server/dix/touch.c +++ b/xorg-server/dix/touch.c @@ -966,6 +966,11 @@ TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti, int listener, int nev; int i; + BUG_WARN(listener < 0); + BUG_WARN(listener >= ti->num_listeners); + if (listener < 0 || listener >= ti->num_listeners) + return BadMatch; + if (listener > 0) { if (mode == XIRejectTouch) TouchRejected(dev, ti, ti->listeners[listener].listener, NULL); diff --git a/xorg-server/hw/dmx/dmxlog.c b/xorg-server/hw/dmx/dmxlog.c index 33aee590a..3249c4867 100644 --- a/xorg-server/hw/dmx/dmxlog.c +++ b/xorg-server/hw/dmx/dmxlog.c @@ -86,6 +86,8 @@ ErrorF(const char *format, ...) /** Provide an VFatalError function when used stand-alone. */ static void +VFatalError(const char *format, va_list args) _X_ATTRIBUTE_PRINTF(1, 0) _X_NORETURN; +static void VFatalError(const char *format, va_list args) { vfprintf(stderr, format, args); /* RATS: We assume the format string @@ -104,7 +106,9 @@ VErrorF(const char *format, va_list args) } #else /** This function was removed between XFree86 4.3.0 and XFree86 4.4.0. */ -extern void AbortServer(void); +extern void AbortServer(void) _X_NORETURN; +static void +VFatalError(const char *format, va_list args) _X_ATTRIBUTE_PRINTF(1, 0) _X_NORETURN; static void VFatalError(const char *format, va_list args) { @@ -163,6 +167,8 @@ dmxHeader(dmxLogLevel logLevel, DMXInputInfo * dmxInput, /* Prints the error message with the appropriate low-level X output * routine. */ static void +dmxMessage(dmxLogLevel logLevel, const char *format, va_list args) _X_ATTRIBUTE_PRINTF(2, 0); +static void dmxMessage(dmxLogLevel logLevel, const char *format, va_list args) { if (logLevel == dmxFatal || logLevel >= dmxCurrentLogLevel) { @@ -300,10 +306,11 @@ dmxLogVisual(DMXScreenInfo * dmxScreen, XVisualInfo * vi, int defaultVisual) class = "DirectColor"; break; } +#define VisualLogFormat "0x%02lx %s %2db %db/rgb %3d 0x%04lx 0x%04lx 0x%04lx%s\n" if (dmxScreen) { dmxLogOutput(dmxScreen, - "0x%02x %s %2db %db/rgb %3d 0x%04x 0x%04x 0x%04x%s\n", + VisualLogFormat, vi->visualid, class, vi->depth, vi->bits_per_rgb, vi->colormap_size, vi->red_mask, vi->green_mask, vi->blue_mask, @@ -311,7 +318,7 @@ dmxLogVisual(DMXScreenInfo * dmxScreen, XVisualInfo * vi, int defaultVisual) } else { dmxLog(dmxInfo, - " 0x%02x %s %2db %db/rgb %3d 0x%04x 0x%04x 0x%04x%s\n", + " " VisualLogFormat, vi->visualid, class, vi->depth, vi->bits_per_rgb, vi->colormap_size, vi->red_mask, vi->green_mask, vi->blue_mask, diff --git a/xorg-server/hw/dmx/dmxlog.h b/xorg-server/hw/dmx/dmxlog.h index 4d4cd269a..162484b34 100644 --- a/xorg-server/hw/dmx/dmxlog.h +++ b/xorg-server/hw/dmx/dmxlog.h @@ -55,18 +55,23 @@ typedef enum { /* Logging functions used by Xserver/hw/dmx routines. */ extern dmxLogLevel dmxSetLogLevel(dmxLogLevel newLevel); extern dmxLogLevel dmxGetLogLevel(void); -extern void dmxLog(dmxLogLevel logLevel, const char *format, ...); -extern void dmxLogCont(dmxLogLevel logLevel, const char *format, ...); +extern void dmxLog(dmxLogLevel logLevel, const char *format, + ...) _X_ATTRIBUTE_PRINTF(2, 3); +extern void dmxLogCont(dmxLogLevel logLevel, const char *format, + ...) _X_ATTRIBUTE_PRINTF(2, 3); extern const char *dmxEventName(int type); #ifndef DMX_LOG_STANDALONE -extern void dmxLogOutput(DMXScreenInfo * dmxScreen, const char *format, ...); +extern void dmxLogOutput(DMXScreenInfo * dmxScreen, const char *format, + ...) _X_ATTRIBUTE_PRINTF(2, 3); extern void dmxLogOutputCont(DMXScreenInfo * dmxScreen, const char *format, - ...); + ...) _X_ATTRIBUTE_PRINTF(2, 3); extern void dmxLogOutputWarning(DMXScreenInfo * dmxScreen, const char *format, - ...); -extern void dmxLogInput(DMXInputInfo * dmxInput, const char *format, ...); -extern void dmxLogInputCont(DMXInputInfo * dmxInput, const char *format, ...); + ...) _X_ATTRIBUTE_PRINTF(2, 3); +extern void dmxLogInput(DMXInputInfo * dmxInput, const char *format, + ...) _X_ATTRIBUTE_PRINTF(2, 3); +extern void dmxLogInputCont(DMXInputInfo * dmxInput, const char *format, + ...) _X_ATTRIBUTE_PRINTF(2, 3); extern void dmxLogArgs(dmxLogLevel logLevel, int argc, char **argv); extern void dmxLogVisual(DMXScreenInfo * dmxScreen, XVisualInfo * vi, int defaultVisual); diff --git a/xorg-server/include/opaque.h b/xorg-server/include/opaque.h index 9ca408ae1..b76ab6e6b 100644 --- a/xorg-server/include/opaque.h +++ b/xorg-server/include/opaque.h @@ -50,6 +50,7 @@ extern _X_EXPORT int ScreenSaverAllowExposures; extern _X_EXPORT int defaultScreenSaverBlanking; extern _X_EXPORT int defaultScreenSaverAllowExposures; extern _X_EXPORT char *display; +extern _X_EXPORT int displayfd; extern _X_EXPORT int defaultBackingStore; extern _X_EXPORT Bool disableBackingStore; diff --git a/xorg-server/man/Xserver.man b/xorg-server/man/Xserver.man index 0cd9b941c..8d243d6b7 100644 --- a/xorg-server/man/Xserver.man +++ b/xorg-server/man/Xserver.man @@ -127,6 +127,13 @@ Not obeyed by all servers. .B \-core causes the server to generate a core dump on fatal errors. .TP 8 +.B \-displayfd \fIfd\fP +specifies a file descriptor in the launching process. Rather than specify +a display number, the X server will attempt to listen on successively higher +display numbers, and upon finding a free one, will write the port number back +on this file descriptor as a newline-terminated string. The \-pn option is +ignored when using \-displayfd. +.TP 8 .B \-deferglyphs \fIwhichfonts\fP specifies the types of fonts for which the server should attempt to use deferred glyph loading. \fIwhichfonts\fP can be all (all fonts), diff --git a/xorg-server/os/WaitFor.c b/xorg-server/os/WaitFor.c index 6c8ede29d..95762ef18 100644 --- a/xorg-server/os/WaitFor.c +++ b/xorg-server/os/WaitFor.c @@ -388,6 +388,7 @@ CheckAllTimers(void) OsTimerPtr timer; CARD32 now; + OsBlockSignals(); start: now = GetTimeInMillis(); @@ -397,6 +398,7 @@ CheckAllTimers(void) goto start; } } + OsReleaseSignals(); } static void @@ -404,11 +406,13 @@ DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev) { CARD32 newTime; + OsBlockSignals(); *prev = timer->next; timer->next = NULL; newTime = (*timer->callback) (timer, now, timer->arg); if (newTime) TimerSet(timer, 0, newTime, timer->callback, timer->arg); + OsReleaseSignals(); } OsTimerPtr @@ -424,6 +428,7 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis, return NULL; } else { + OsBlockSignals(); for (prev = &timers; *prev; prev = &(*prev)->next) { if (*prev == timer) { *prev = timer->next; @@ -432,6 +437,7 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis, break; } } + OsReleaseSignals(); } if (!millis) return timer; @@ -451,26 +457,32 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis, if (!millis) return timer; } + OsBlockSignals(); for (prev = &timers; *prev && (int) ((*prev)->expires - millis) <= 0; prev = &(*prev)->next); timer->next = *prev; *prev = timer; + OsReleaseSignals(); return timer; } Bool TimerForce(OsTimerPtr timer) { + int rc = FALSE; OsTimerPtr *prev; + OsBlockSignals(); for (prev = &timers; *prev; prev = &(*prev)->next) { if (*prev == timer) { DoTimer(timer, GetTimeInMillis(), prev); - return TRUE; + rc = TRUE; + break; } } - return FALSE; + OsReleaseSignals(); + return rc; } void @@ -480,12 +492,14 @@ TimerCancel(OsTimerPtr timer) if (!timer) return; + OsBlockSignals(); for (prev = &timers; *prev; prev = &(*prev)->next) { if (*prev == timer) { *prev = timer->next; break; } } + OsReleaseSignals(); } void diff --git a/xorg-server/os/connection.c b/xorg-server/os/connection.c index 53a6ca005..1685292ce 100644 --- a/xorg-server/os/connection.c +++ b/xorg-server/os/connection.c @@ -152,6 +152,7 @@ static Pid_t ParentProcess; #endif Bool RunFromSigStopParent; /* send SIGSTOP to our own process; Upstart (or equivalent) will send SIGCONT back. */ +static char dynamic_display[7]; /* display name */ Bool PartialNetwork; /* continue even if unable to bind all addrs */ static Bool debug_conns = FALSE; @@ -376,6 +377,10 @@ void NotifyParentProcess(void) { #if !defined(WIN32) + if (dynamic_display[0]) { + write(displayfd, dynamic_display, strlen(dynamic_display)); + close(displayfd); + } if (RunFromSmartParent) { if (ParentProcess > 1) { kill(ParentProcess, SIGUSR1); @@ -386,6 +391,18 @@ NotifyParentProcess(void) #endif } +static Bool +TryCreateSocket(int num, int *partial) +{ + char port[20]; + + snprintf(port, sizeof(port), "%d", num); + + return (_XSERVTransMakeAllCOTSServerListeners(port, partial, + &ListenTransCount, + &ListenTransConns) >= 0); +} + /***************** * CreateWellKnownSockets * At initialization, create the sockets to listen on for new clients. @@ -396,7 +413,6 @@ CreateWellKnownSockets(void) { int i; int partial; - char port[20]; FD_ZERO(&AllSockets); FD_ZERO(&AllClients); @@ -412,31 +428,44 @@ CreateWellKnownSockets(void) FD_ZERO(&WellKnownConnections); - snprintf(port, sizeof(port), "%d", atoi(display)); - - if ((_XSERVTransMakeAllCOTSServerListeners(port, &partial, - &ListenTransCount, - &ListenTransConns) >= 0) && - (ListenTransCount >= 1)) { - if (!PartialNetwork && partial) { - FatalError("Failed to establish all listening sockets"); + /* display is initialized to "0" by main(). It is then set to the display + * number if specified on the command line, or to NULL when the -displayfd + * option is used. */ + if (display) { + if (TryCreateSocket(atoi(display), &partial) && + ListenTransCount >= 1) + if (!PartialNetwork && partial) + FatalError ("Failed to establish all listening sockets"); + } + else { /* -displayfd */ + Bool found = 0; + for (i = 0; i < 65535 - X_TCP_PORT; i++) { + if (TryCreateSocket(i, &partial) && !partial) { + found = 1; + break; + } + else + CloseWellKnownConnections(); } - else { - ListenTransFds = malloc(ListenTransCount * sizeof(int)); + if (!found) + FatalError("Failed to find a socket to listen on"); + snprintf(dynamic_display, sizeof(dynamic_display), "%d", i); + display = dynamic_display; + } - for (i = ListenTransCount; i > 0; i--) { - int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i-1]); + ListenTransFds = malloc(ListenTransCount * sizeof (int)); - ListenTransFds[i-1] = fd; - FD_SET(fd, &WellKnownConnections); + for (i = ListenTransCount; i > 0; i--) { + int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i-1]); - if (!_XSERVTransIsLocal (ListenTransConns[i-1])) { - int protocol = 0; - if (!strcmp("inet", ListenTransConns[i-1]->transptr->TransName)) protocol = 4; - else if (!strcmp("inet6", ListenTransConns[i-1]->transptr->TransName)) protocol = 6; - DefineSelf (fd, protocol); - } - } + ListenTransFds[i-1] = fd; + FD_SET(fd, &WellKnownConnections); + + if (!_XSERVTransIsLocal (ListenTransConns[i-1])) { + int protocol = 0; + if (!strcmp("inet", ListenTransConns[i-1]->transptr->TransName)) protocol = 4; + else if (!strcmp("inet6", ListenTransConns[i-1]->transptr->TransName)) protocol = 6; + DefineSelf (fd, protocol); } } diff --git a/xorg-server/os/utils.c b/xorg-server/os/utils.c index dbed76132..47bc7b5c3 100644 --- a/xorg-server/os/utils.c +++ b/xorg-server/os/utils.c @@ -687,6 +687,15 @@ ProcessCommandLine(int argc, char *argv[]) else UseMsg(); } + else if (strcmp(argv[i], "-displayfd") == 0) { + if (++i < argc) { + displayfd = atoi(argv[i]); + display = NULL; + nolock = TRUE; + } + else + UseMsg(); + } #ifdef DPMSExtension else if (strcmp(argv[i], "dpms") == 0) /* ignored for compatibility */ ; diff --git a/xorg-server/test/Makefile.am b/xorg-server/test/Makefile.am index 85823977b..b2a53aa64 100644 --- a/xorg-server/test/Makefile.am +++ b/xorg-server/test/Makefile.am @@ -36,7 +36,7 @@ misc_LDADD=$(TEST_LDADD) fixes_LDADD=$(TEST_LDADD) xfree86_LDADD=$(TEST_LDADD) touch_LDADD=$(TEST_LDADD) -hashtabletest_LDADD=$(TEST_LDADD) ../Xext/hashtable.c +hashtabletest_LDADD=$(TEST_LDADD) $(top_srcdir)/Xext/hashtable.c libxservertest_la_LIBADD = $(XSERVER_LIBS) if XORG diff --git a/xorg-server/test/xi2/protocol-xiqueryversion.c b/xorg-server/test/xi2/protocol-xiqueryversion.c index 2552307f2..1347e866c 100644 --- a/xorg-server/test/xi2/protocol-xiqueryversion.c +++ b/xorg-server/test/xi2/protocol-xiqueryversion.c @@ -54,6 +54,8 @@ struct test_data { int minor_client; int major_server; int minor_server; + int major_cached; + int minor_cached; }; static void @@ -82,6 +84,24 @@ reply_XIQueryVersion(ClientPtr client, int len, char *data, void *userdata) assert((sver > cver) ? ver == cver : ver == sver); } +static void +reply_XIQueryVersion_multiple(ClientPtr client, int len, char *data, void *userdata) +{ + xXIQueryVersionReply *rep = (xXIQueryVersionReply *) data; + struct test_data *versions = (struct test_data *) userdata; + + reply_check_defaults(rep, len, XIQueryVersion); + assert(rep->length == 0); + + if (versions->major_cached == -1) { + versions->major_cached = rep->major_version; + versions->minor_cached = rep->minor_version; + } + + assert(versions->major_cached == rep->major_version); + assert(versions->minor_cached == rep->minor_version); +} + /** * Run a single test with server version smaj.smin and client * version cmaj.cmin. Verify that return code is equal to 'error'. @@ -173,12 +193,105 @@ test_XIQueryVersion(void) reply_handler = NULL; } + +static void +test_XIQueryVersion_multiple(void) +{ + xXIQueryVersionReq request; + ClientRec client; + struct test_data versions; + int rc; + + request_init(&request, XIQueryVersion); + client = init_client(request.length, &request); + + /* Change the server to support 2.2 */ + XIVersion.major_version = 2; + XIVersion.minor_version = 2; + + reply_handler = reply_XIQueryVersion_multiple; + userdata = (void *) &versions; + + /* run 1 */ + versions.major_cached = -1; + versions.minor_cached = -1; + + /* client is lower than server, noncached */ + request.major_version = 2; + request.minor_version = 1; + rc = ProcXIQueryVersion(&client); + assert(rc == Success); + + /* client is higher than server, cached */ + request.major_version = 2; + request.minor_version = 3; + rc = ProcXIQueryVersion(&client); + assert(rc == Success); + + /* client is equal, cached */ + request.major_version = 2; + request.minor_version = 2; + rc = ProcXIQueryVersion(&client); + assert(rc == Success); + + /* client is low than cached */ + request.major_version = 2; + request.minor_version = 0; + rc = ProcXIQueryVersion(&client); + assert(rc == BadValue); + + /* run 2 */ + client = init_client(request.length, &request); + XIVersion.major_version = 2; + XIVersion.minor_version = 2; + versions.major_cached = -1; + versions.minor_cached = -1; + + request.major_version = 2; + request.minor_version = 2; + rc = ProcXIQueryVersion(&client); + assert(rc == Success); + + request.major_version = 2; + request.minor_version = 3; + rc = ProcXIQueryVersion(&client); + assert(rc == Success); + + request.major_version = 2; + request.minor_version = 1; + rc = ProcXIQueryVersion(&client); + assert(rc == BadValue); + + /* run 3 */ + client = init_client(request.length, &request); + XIVersion.major_version = 2; + XIVersion.minor_version = 2; + versions.major_cached = -1; + versions.minor_cached = -1; + + request.major_version = 2; + request.minor_version = 3; + rc = ProcXIQueryVersion(&client); + assert(rc == Success); + + request.major_version = 2; + request.minor_version = 2; + rc = ProcXIQueryVersion(&client); + assert(rc == Success); + + request.major_version = 2; + request.minor_version = 1; + rc = ProcXIQueryVersion(&client); + assert(rc == BadValue); +} + int main(int argc, char **argv) { init_simple(); test_XIQueryVersion(); + test_XIQueryVersion_multiple(); return 0; } diff --git a/xorg-server/xkeyboard-config/symbols/dk b/xorg-server/xkeyboard-config/symbols/dk index 1187a99bd..1deea28aa 100644 --- a/xorg-server/xkeyboard-config/symbols/dk +++ b/xorg-server/xkeyboard-config/symbols/dk @@ -69,4 +69,5 @@ xkb_symbols "dvorak" { include "no(dvorak)" name[Group1]= "Danish (Dvorak)"; + key <AD12> { [ asciitilde, asciicircum, dead_diaeresis, dead_tilde ] }; }; diff --git a/xorg-server/xkeyboard-config/symbols/latin b/xorg-server/xkeyboard-config/symbols/latin index 77b99d46c..424768ead 100644 --- a/xorg-server/xkeyboard-config/symbols/latin +++ b/xorg-server/xkeyboard-config/symbols/latin @@ -35,7 +35,7 @@ xkb_symbols "basic" { key <AC04> { [ f, F, dstroke, ordfeminine ] }; key <AC05> { [ g, G, eng, ENG ] }; key <AC06> { [ h, H, hstroke, Hstroke ] }; - key <AC07> { [ j, J, j, J ] }; + key <AC07> { [ j, J, dead_hook, dead_horn ] }; key <AC08> { [ k, K, kra, ampersand ] }; key <AC09> { [ l, L, lstroke, Lstroke ] }; key <AC10> { [ semicolon, colon, dead_acute, dead_doubleacute ] }; diff --git a/xorg-server/xkeyboard-config/symbols/me b/xorg-server/xkeyboard-config/symbols/me index dd81567c2..54d63e130 100644 --- a/xorg-server/xkeyboard-config/symbols/me +++ b/xorg-server/xkeyboard-config/symbols/me @@ -7,8 +7,10 @@ default partial alphanumeric_keys xkb_symbols "basic" { include "rs(latin)" name[Group1]= "Montenegrin"; -}; + key <AD06> { [ any, any, zacute, Zacute ] }; // z + key <AC02> { [ any, any, sacute, Sacute ] }; // s +}; partial alphanumeric_keys xkb_symbols "cyrillic" { @@ -16,7 +18,6 @@ xkb_symbols "cyrillic" { name[Group1]= "Montenegrin (Cyrillic)"; }; - partial alphanumeric_keys xkb_symbols "cyrillicyz" { include "rs(yz)" @@ -27,18 +28,27 @@ partial alphanumeric_keys xkb_symbols "latinunicode" { include "rs(latinunicode)" name[Group1]= "Montenegrin (Latin Unicode)"; + + key <AD06> { [ any, any, zacute, Zacute ] }; // z + key <AC02> { [ any, any, sacute, Sacute ] }; // s }; partial alphanumeric_keys xkb_symbols "latinyz" { include "rs(latinyz)" name[Group1]= "Montenegrin (Latin qwerty)"; + + key <AB02> { [ any, any, zacute, Zacute ] }; // z + key <AC02> { [ any, any, sacute, Sacute ] }; // s }; partial alphanumeric_keys xkb_symbols "latinunicodeyz" { include "rs(latinunicodeyz)" name[Group1]= "Montenegrin (Latin Unicode qwerty)"; + + key <AB02> { [ any, any, zacute, Zacute ] }; // z + key <AC02> { [ any, any, sacute, Sacute ] }; // s }; xkb_symbols "cyrillicalternatequotes" { @@ -49,4 +59,8 @@ xkb_symbols "cyrillicalternatequotes" { xkb_symbols "latinalternatequotes" { include "rs(latinalternatequotes)" name[Group1]= "Montenegrin (Latin with guillemets)"; + + key <AD06> { [ any, any, zacute, Zacute ] }; // z + key <AC02> { [ any, any, sacute, Sacute ] }; // s + key <LSGT> { [ any, any, guillemotleft, guillemotright ] }; // < }; |