Skip to content
Commits on Source (29)
......@@ -650,9 +650,8 @@ ProcShmGetImage(ClientPtr client)
wBorderWidth((WindowPtr) pDraw) + (int) pDraw->height)
return BadMatch;
visual = wVisual(((WindowPtr) pDraw));
pVisibleRegion = NotClippedByChildren((WindowPtr) pDraw);
if (pVisibleRegion)
RegionTranslate(pVisibleRegion, -pDraw->x, -pDraw->y);
if (pDraw->type == DRAWABLE_WINDOW)
pVisibleRegion = &((WindowPtr) pDraw)->borderClip;
}
else {
if (stuff->x < 0 ||
......@@ -715,9 +714,6 @@ ProcShmGetImage(ClientPtr client)
}
}
if (pVisibleRegion)
RegionDestroy(pVisibleRegion);
if (client->swapped) {
swaps(&xgi.sequenceNumber);
swapl(&xgi.length);
......
......@@ -39,6 +39,8 @@ extern _X_EXPORT Bool CompositeRegisterImplicitRedirectionException(ScreenPtr pS
VisualID parentVisual,
VisualID winVisual);
extern _X_EXPORT Bool compIsAlternateVisual(ScreenPtr pScreen, XID visual);
extern _X_EXPORT RESTYPE CompositeClientWindowType;
#endif /* _COMPOSITEEXT_H_ */
......@@ -320,18 +320,13 @@ compClipNotify(WindowPtr pWin, int dx, int dy)
}
}
/*
* Returns TRUE if the window needs server-provided automatic redirect,
* which is true if the child and parent aren't both regular or ARGB visuals
*/
static Bool
Bool
compIsAlternateVisual(ScreenPtr pScreen, XID visual)
{
CompScreenPtr cs = GetCompScreen(pScreen);
int i;
for (i = 0; i < cs->numAlternateVisuals; i++)
for (i = 0; cs && i < cs->numAlternateVisuals; i++)
if (cs->alternateVisuals[i] == visual)
return TRUE;
return FALSE;
......
......@@ -134,7 +134,8 @@ device_added(struct udev_device *udev_device)
}
#endif
if (!udev_device_get_property_value(udev_device, "ID_INPUT")) {
value = udev_device_get_property_value(udev_device, "ID_INPUT");
if (value && !strcmp(value, "0")) {
LogMessageVerb(X_INFO, 10,
"config/udev: ignoring device %s without "
"property ID_INPUT set\n", path);
......@@ -237,38 +238,36 @@ device_added(struct udev_device *udev_device)
else if (!strcmp(key, "ID_VENDOR")) {
LOG_PROPERTY(path, key, value);
attrs.vendor = strdup(value);
}
else if (!strcmp(key, "ID_INPUT_KEY")) {
LOG_PROPERTY(path, key, value);
attrs.flags |= ATTR_KEY;
}
else if (!strcmp(key, "ID_INPUT_KEYBOARD")) {
LOG_PROPERTY(path, key, value);
attrs.flags |= ATTR_KEYBOARD;
}
else if (!strcmp(key, "ID_INPUT_MOUSE")) {
LOG_PROPERTY(path, key, value);
attrs.flags |= ATTR_POINTER;
}
else if (!strcmp(key, "ID_INPUT_JOYSTICK")) {
LOG_PROPERTY(path, key, value);
attrs.flags |= ATTR_JOYSTICK;
}
else if (!strcmp(key, "ID_INPUT_TABLET")) {
} else if (!strncmp(key, "ID_INPUT_", 9)) {
const struct pfmap {
const char *property;
unsigned int flag;
} map[] = {
{ "ID_INPUT_KEY", ATTR_KEY },
{ "ID_INPUT_KEYBOARD", ATTR_KEYBOARD },
{ "ID_INPUT_MOUSE", ATTR_POINTER },
{ "ID_INPUT_JOYSTICK", ATTR_JOYSTICK },
{ "ID_INPUT_TABLET", ATTR_TABLET },
{ "ID_INPUT_TABLET_PAD", ATTR_TABLET_PAD },
{ "ID_INPUT_TOUCHPAD", ATTR_TOUCHPAD },
{ "ID_INPUT_TOUCHSCREEN", ATTR_TOUCHSCREEN },
{ NULL, 0 },
};
/* Anything but the literal string "0" is considered a
* boolean true. The empty string isn't a thing with udev
* properties anyway */
if (value && strcmp(value, "0")) {
const struct pfmap *m = map;
while (m->property != NULL) {
if (!strcmp(m->property, key)) {
LOG_PROPERTY(path, key, value);
attrs.flags |= ATTR_TABLET;
attrs.flags |= m->flag;
}
else if (!strcmp(key, "ID_INPUT_TABLET_PAD")) {
LOG_PROPERTY(path, key, value);
attrs.flags |= ATTR_TABLET_PAD;
m++;
}
else if (!strcmp(key, "ID_INPUT_TOUCHPAD")) {
LOG_PROPERTY(path, key, value);
attrs.flags |= ATTR_TOUCHPAD;
}
else if (!strcmp(key, "ID_INPUT_TOUCHSCREEN")) {
LOG_PROPERTY(path, key, value);
attrs.flags |= ATTR_TOUCHSCREEN;
}
}
......
......@@ -26,9 +26,9 @@ dnl
dnl Process this file with autoconf to create configure.
AC_PREREQ(2.60)
AC_INIT([xorg-server], 1.19.5, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
RELEASE_DATE="2017-10-12"
RELEASE_NAME="Shahi Paneer"
AC_INIT([xorg-server], 1.19.6, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
RELEASE_DATE="2017-12-20"
RELEASE_NAME="Lousiana Gumbo"
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
......
......@@ -2329,10 +2329,15 @@ int
ProcGetPointerControl(ClientPtr client)
{
DeviceIntPtr ptr = PickPointer(client);
PtrCtrl *ctrl = &ptr->ptrfeed->ctrl;
PtrCtrl *ctrl;
xGetPointerControlReply rep;
int rc;
if (ptr->ptrfeed)
ctrl = &ptr->ptrfeed->ctrl;
else
ctrl = &defaultPointerControl;
REQUEST_SIZE_MATCH(xReq);
rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
......
......@@ -215,6 +215,7 @@ __glXdirectContextCreate(__GLXscreen * screen,
if (context == NULL)
return NULL;
context->config = modes;
context->destroy = __glXdirectContextDestroy;
context->loseCurrent = __glXdirectContextLoseCurrent;
......@@ -631,7 +632,7 @@ DoMakeCurrent(__GLXclientState * cl,
/*
** Flush the previous context if needed.
*/
Bool need_flush = GL_TRUE;
Bool need_flush = !prevglxc->isDirect;
#ifdef GLX_CONTEXT_RELEASE_BEHAVIOR_ARB
if (prevglxc->releaseBehavior == GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB)
need_flush = GL_FALSE;
......@@ -1030,13 +1031,14 @@ __glXDisp_GetVisualConfigs(__GLXclientState * cl, GLbyte * pc)
buf[p++] = modes->samples;
buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
buf[p++] = modes->sampleBuffers;
buf[p++] = GLX_VISUAL_SELECT_GROUP_SGIX;
buf[p++] = modes->visualSelectGroup;
/* Add attribute only if its value is not default. */
if (modes->sRGBCapable != GL_FALSE) {
buf[p++] = GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT;
buf[p++] = modes->sRGBCapable;
}
/* Don't add visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)?
* Pad the remaining place with zeroes, so that attributes count is constant. */
/* Pad with zeroes, so that attributes count is constant. */
while (p < GLX_VIS_CONFIG_TOTAL) {
buf[p++] = 0;
buf[p++] = 0;
......@@ -1720,7 +1722,7 @@ DoQueryContext(__GLXclientState * cl, GLXContextID gcId)
ClientPtr client = cl->client;
__GLXcontext *ctx;
xGLXQueryContextInfoEXTReply reply;
int nProps = 3;
int nProps = 5;
int sendBuf[nProps * 2];
int nReplyBytes;
int err;
......@@ -1742,6 +1744,10 @@ DoQueryContext(__GLXclientState * cl, GLXContextID gcId)
sendBuf[3] = (int) (ctx->config->visualID);
sendBuf[4] = GLX_SCREEN_EXT;
sendBuf[5] = (int) (ctx->pGlxScreen->pScreen->myNum);
sendBuf[6] = GLX_FBCONFIG_ID;
sendBuf[7] = (int) (ctx->config->fbconfigID);
sendBuf[8] = GLX_RENDER_TYPE;
sendBuf[9] = (int) (ctx->config->renderType);
if (client->swapped) {
__glXSwapQueryContextInfoEXTReply(client, &reply, sendBuf);
......
......@@ -557,6 +557,7 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen,
return NULL;
}
context->base.config = glxConfig;
context->base.destroy = __glXDRIcontextDestroy;
context->base.makeCurrent = __glXDRIcontextMakeCurrent;
context->base.loseCurrent = __glXDRIcontextLoseCurrent;
......@@ -901,7 +902,7 @@ initializeExtensions(__GLXscreen * screen)
#ifdef __DRI2_FLUSH_CONTROL
if (strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0) {
__glXEnableExtension(screen->glx_enable_bits,
"GLX_ARB_context_flush_control\n");
"GLX_ARB_context_flush_control");
}
#endif
......
......@@ -139,13 +139,15 @@ render_type_is_pbuffer_only(unsigned renderType)
static __GLXconfig *
createModeFromConfig(const __DRIcoreExtension * core,
const __DRIconfig * driConfig,
unsigned int visualType)
unsigned int visualType,
GLboolean duplicateForComp)
{
__GLXDRIconfig *config;
GLint renderType = 0;
unsigned int attrib, value, drawableType = GLX_PBUFFER_BIT;
int i;
config = calloc(1, sizeof *config);
config->driConfig = driConfig;
......@@ -181,6 +183,13 @@ createModeFromConfig(const __DRIcoreExtension * core,
config->config.bindToTextureTargets |=
GLX_TEXTURE_RECTANGLE_BIT_EXT;
break;
case __DRI_ATTRIB_SWAP_METHOD:
/* Workaround for broken dri drivers */
if (value != GLX_SWAP_UNDEFINED_OML &&
value != GLX_SWAP_COPY_OML &&
value != GLX_SWAP_EXCHANGE_OML)
value = GLX_SWAP_UNDEFINED_OML;
/* Fall through. */
default:
setScalar(&config->config, attrib, value);
break;
......@@ -196,6 +205,28 @@ createModeFromConfig(const __DRIcoreExtension * core,
config->config.drawableType = drawableType;
config->config.yInverted = GL_TRUE;
#ifdef COMPOSITE
/*
* Here we decide what fbconfigs will be duplicated for compositing.
* fgbconfigs marked with duplicatedForConf will be reserved for
* compositing visuals.
* It might look strange to do this decision this late when translation
* from a __DRIConfig is already done, but using the __DRIConfig
* accessor function becomes worse both with respect to code complexity
* and CPU usage.
*/
if (duplicateForComp &&
(render_type_is_pbuffer_only(renderType) ||
config->config.rgbBits != 32 ||
config->config.visualRating != GLX_NONE ||
config->config.sampleBuffers != 0)) {
free(config);
return NULL;
}
config->config.duplicatedForComp = duplicateForComp;
#endif
return &config->config;
}
......@@ -210,21 +241,34 @@ glxConvertConfigs(const __DRIcoreExtension * core,
head.next = NULL;
for (i = 0; configs[i]; i++) {
tail->next = createModeFromConfig(core, configs[i], GLX_TRUE_COLOR);
tail->next = createModeFromConfig(core, configs[i], GLX_TRUE_COLOR,
GL_FALSE);
if (tail->next == NULL)
break;
tail = tail->next;
}
for (i = 0; configs[i]; i++) {
tail->next = createModeFromConfig(core, configs[i], GLX_DIRECT_COLOR);
tail->next = createModeFromConfig(core, configs[i], GLX_DIRECT_COLOR,
GL_FALSE);
if (tail->next == NULL)
break;
tail = tail->next;
}
#ifdef COMPOSITE
/* Duplicate fbconfigs for use with compositing visuals */
for (i = 0; configs[i]; i++) {
tail->next = createModeFromConfig(core, configs[i], GLX_TRUE_COLOR,
GL_TRUE);
if (tail->next == NULL)
continue;
tail = tail->next;
}
#endif
return head.next;
}
......
......@@ -244,6 +244,7 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen,
if (context == NULL)
return NULL;
context->base.config = glxConfig;
context->base.destroy = __glXDRIcontextDestroy;
context->base.makeCurrent = __glXDRIcontextMakeCurrent;
context->base.loseCurrent = __glXDRIcontextLoseCurrent;
......@@ -413,7 +414,7 @@ initializeExtensions(__GLXscreen * screen)
#ifdef __DRI2_FLUSH_CONTROL
if (strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0) {
__glXEnableExtension(screen->glx_enable_bits,
"GLX_ARB_context_flush_control\n");
"GLX_ARB_context_flush_control");
}
#endif
......
......@@ -43,6 +43,7 @@
#include "glxutil.h"
#include "glxext.h"
#include "protocol-versions.h"
#include "compositeext.h"
static DevPrivateKeyRec glxScreenPrivateKeyRec;
......@@ -277,7 +278,21 @@ pickFBConfig(__GLXscreen * pGlxScreen, VisualPtr visual)
/* Can't use the same FBconfig for multiple X visuals. I think. */
if (config->visualID != 0)
continue;
#ifdef COMPOSITE
/* Use only duplicated configs for compIsAlternateVisuals */
if (!!compIsAlternateVisual(pGlxScreen->pScreen, visual->vid) !=
!!config->duplicatedForComp)
continue;
#endif
/*
* If possible, use the same swapmethod for all built-in visual
* fbconfigs, to avoid getting the 32-bit composite visual when
* requesting, for example, a SWAP_COPY fbconfig.
*/
if (config->swapMethod == GLX_SWAP_UNDEFINED_OML)
score += 32;
if (config->swapMethod == GLX_SWAP_EXCHANGE_OML)
score += 16;
if (config->doubleBufferMode > 0)
score += 8;
if (config->depthBits > 0)
......@@ -336,6 +351,10 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
if (config) {
pGlxScreen->visuals[pGlxScreen->numVisuals++] = config;
config->visualID = visual->vid;
#ifdef COMPOSITE
if (compIsAlternateVisual(pScreen, visual->vid))
config->visualSelectGroup++;
#endif
}
}
......@@ -355,7 +374,12 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
* set up above is for.
*/
depth = config->redBits + config->greenBits + config->blueBits;
#ifdef COMPOSITE
if (config->duplicatedForComp) {
depth += config->alphaBits;
config->visualSelectGroup++;
}
#endif
/* Make sure that our FBconfig's depth can actually be displayed
* (corresponds to an existing visual).
*/
......@@ -378,6 +402,10 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
if (visual == NULL)
continue;
#ifdef COMPOSITE
if (config->duplicatedForComp)
(void) CompositeRegisterAlternateVisuals(pScreen, &visual->vid, 1);
#endif
pGlxScreen->visuals[pGlxScreen->numVisuals++] = config;
initGlxVisual(visual, config);
}
......
......@@ -39,7 +39,11 @@
typedef struct __GLXconfig __GLXconfig;
struct __GLXconfig {
/* Management */
__GLXconfig *next;
#ifdef COMPOSITE
GLboolean duplicatedForComp;
#endif
GLuint doubleBufferMode;
GLuint stereoMode;
......
......@@ -57,34 +57,22 @@ static PixmapPtr drmmode_create_pixmap_header(ScreenPtr pScreen, int width, int
static Bool
drmmode_zaphod_string_matches(ScrnInfoPtr scrn, const char *s, char *output_name)
{
int i = 0;
char s1[20];
do {
switch(*s) {
case ',':
s1[i] = '\0';
i = 0;
if (strcmp(s1, output_name) == 0)
return TRUE;
break;
case ' ':
case '\t':
case '\n':
case '\r':
break;
default:
s1[i] = *s;
i++;
break;
char **token = xstrtokenize(s, ", \t\n\r");
Bool ret = FALSE;
if (!token)
return FALSE;
for (int i = 0; token[i]; i++) {
if (strcmp(token[i], output_name) == 0)
ret = TRUE;
free(token[i]);
}
} while(*s++);
s1[i] = '\0';
if (strcmp(s1, output_name) == 0)
return TRUE;
free(token);
return FALSE;
return ret;
}
int
......
......@@ -976,8 +976,8 @@ handle_cea_svd(struct cea_video_block *video, void *data)
int vid;
vid = video->video_code & 0x7f;
if (vid < CEA_VIDEO_MODES_NUM) {
Mode = xf86DuplicateMode(CEAVideoModes + vid);
if (vid >= 1 && vid <= CEA_VIDEO_MODES_NUM) {
Mode = xf86DuplicateMode(CEAVideoModes + (vid - 1));
*Modes = xf86ModesAdd(*Modes, Mode);
}
}
......
......@@ -180,9 +180,16 @@ xf86ScreenSetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
xf86CursorScreenPtr ScreenPriv =
(xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
xf86CursorScreenKey);
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
xf86CursorInfoPtr infoPtr;
unsigned char *bits;
if (!ScreenPriv) { /* NULL if Option "SWCursor" */
return (pCurs == NullCursor);
}
infoPtr = ScreenPriv->CursorInfoPtr;
if (pCurs == NullCursor) {
(*infoPtr->HideCursor) (infoPtr->pScrn);
return TRUE;
......
......@@ -156,7 +156,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
memset(context, 0, sizeof *context);
context->base.pGlxScreen = screen;
context->base.config = conf;
context->base.destroy = __glXAquaContextDestroy;
context->base.makeCurrent = __glXAquaContextMakeCurrent;
context->base.loseCurrent = __glXAquaContextLoseCurrent;
......
......@@ -42,7 +42,7 @@ expand_source_and_mask(CursorPtr cursor, CARD32 *data)
(cursor->foreGreen & 0xff00) | (cursor->foreGreen >> 8);
bg = ((cursor->backRed & 0xff00) << 8) |
(cursor->backGreen & 0xff00) | (cursor->backGreen >> 8);
stride = (bits->width / 8 + 3) & ~3;
stride = BitmapBytePad(bits->width);
for (y = 0; y < bits->height; y++)
for (x = 0; x < bits->width; x++) {
i = y * stride + x / 8;
......
......@@ -248,7 +248,7 @@ padding_for_int32(const int bytes)
}
extern char **xstrtokenize(const char *str, const char *separators);
extern _X_EXPORT char **xstrtokenize(const char *str, const char *separators);
extern void FormatInt64(int64_t num, char *string);
extern void FormatUInt64(uint64_t num, char *string);
extern void FormatUInt64Hex(uint64_t num, char *string);
......
......@@ -1137,12 +1137,12 @@ ComputeLocalClient(ClientPtr client)
/* Cut off any colon and whatever comes after it, see
* https://lists.freedesktop.org/archives/xorg-devel/2015-December/048164.html
*/
cmd = strtok(cmd, ":");
char *tok = strtok(cmd, ":");
#if !defined(WIN32) || defined(__CYGWIN__)
ret = strcmp(basename(cmd), "ssh") != 0;
ret = strcmp(basename(tok), "ssh") != 0;
#else
ret = strcmp(cmd, "ssh") != 0;
ret = strcmp(tok, "ssh") != 0;
#endif
free(cmd);
......
......@@ -797,7 +797,7 @@ XdmcpDeadSession(const char *reason)
ErrorF("XDM: %s, declaring session dead\n", reason);
state = XDM_INIT_STATE;
isItTimeToYield = TRUE;
dispatchException |= DE_RESET;
dispatchException |= (OneSession ? DE_TERMINATE : DE_RESET);
TimerCancel(xdmcp_timer);
timeOutRtx = 0;
send_packet();
......