Xinerama: lambda-esque macro for walking Xinerama screens

Move the walking loops on Xinerama screens into lambda-esque macros:
the callers look quite like we've been using lambda functions and
closures, but actually are just fancy macro trickery.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult
2025-08-12 13:33:38 +02:00
committed by Enrico Weigelt
parent e3d9f4c3ef
commit eb17b34362
15 changed files with 335 additions and 446 deletions

View File

@@ -2561,14 +2561,13 @@ PanoramiXRenderCreatePicture(ClientPtr client)
else
newPict->u.pict.root = FALSE;
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->pid = newPict->info[walkScreenIdx].id;
stuff->drawable = refDraw->info[walkScreenIdx].id;
result = ProcRenderCreatePicture(client);
if (result != Success)
break;
}
});
if (result == Success)
AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
@@ -2590,13 +2589,12 @@ PanoramiXRenderChangePicture(ClientPtr client)
VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->picture = pict->info[walkScreenIdx].id;
result = ProcRenderChangePicture(client);
if (result != Success)
break;
}
});
return result;
}
@@ -2612,13 +2610,12 @@ PanoramiXRenderSetPictureClipRectangles(ClientPtr client)
VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->picture = pict->info[walkScreenIdx].id;
result = ProcRenderSetPictureClipRectangles(client);
if (result != Success)
break;
}
});
return result;
}
@@ -2634,13 +2631,12 @@ PanoramiXRenderSetPictureTransform(ClientPtr client)
VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->picture = pict->info[walkScreenIdx].id;
result = ProcRenderSetPictureTransform(client);
if (result != Success)
break;
}
});
return result;
}
@@ -2656,13 +2652,12 @@ PanoramiXRenderSetPictureFilter(ClientPtr client)
VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess);
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->picture = pict->info[walkScreenIdx].id;
result = ProcRenderSetPictureFilter(client);
if (result != Success)
break;
}
});
return result;
}
@@ -2681,13 +2676,12 @@ PanoramiXRenderFreePicture(ClientPtr client)
VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess);
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->picture = pict->info[walkScreenIdx].id;
result = ProcRenderFreePicture(client);
if (result != Success)
break;
}
});
/* Since ProcRenderFreePicture is using FreeResource, it will free
our resource for us on the last pass through the loop above */
@@ -2712,9 +2706,7 @@ PanoramiXRenderComposite(ClientPtr client)
orig = *stuff;
unsigned int walkScreenIdx;
FOR_NSCREENS_FORWARD(walkScreenIdx) {
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx];
XINERAMA_FOR_EACH_SCREEN_FORWARD({
stuff->src = src->info[walkScreenIdx].id;
if (src->u.pict.root) {
stuff->xSrc = orig.xSrc - walkScreen->x;
@@ -2735,7 +2727,7 @@ PanoramiXRenderComposite(ClientPtr client)
result = ProcRenderComposite(client);
if (result != Success)
break;
}
});
return result;
}
@@ -2760,9 +2752,8 @@ PanoramiXRenderCompositeGlyphs(ClientPtr client)
origElt = *elt;
xSrc = stuff->xSrc;
ySrc = stuff->ySrc;
unsigned int walkScreenIdx;
FOR_NSCREENS_FORWARD(walkScreenIdx) {
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx];
XINERAMA_FOR_EACH_SCREEN_FORWARD({
stuff->src = src->info[walkScreenIdx].id;
if (src->u.pict.root) {
stuff->xSrc = xSrc - walkScreen->x;
@@ -2776,7 +2767,7 @@ PanoramiXRenderCompositeGlyphs(ClientPtr client)
result = ProcRenderCompositeGlyphs(client);
if (result != Success)
break;
}
});
}
return result;
@@ -2797,9 +2788,8 @@ PanoramiXRenderFillRectangles(ClientPtr client)
extra_len = (client->req_len << 2) - sizeof(xRenderFillRectanglesReq);
if (extra_len && (extra = calloc(1, extra_len))) {
memcpy(extra, stuff + 1, extra_len);
unsigned int walkScreenIdx;
FOR_NSCREENS_FORWARD(walkScreenIdx) {
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx];
XINERAMA_FOR_EACH_SCREEN_FORWARD({
if (walkScreenIdx) /* skip screen #0 */
memcpy(stuff + 1, extra, extra_len);
if (dst->u.pict.root) {
@@ -2821,7 +2811,8 @@ PanoramiXRenderFillRectangles(ClientPtr client)
result = ProcRenderFillRectangles(client);
if (result != Success)
break;
}
});
free(extra);
}
@@ -2848,9 +2839,7 @@ PanoramiXRenderTrapezoids(ClientPtr client)
if (extra_len && (extra = calloc(1, extra_len))) {
memcpy(extra, stuff + 1, extra_len);
unsigned int walkScreenIdx;
FOR_NSCREENS_FORWARD(walkScreenIdx) {
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx];
XINERAMA_FOR_EACH_SCREEN_FORWARD({
if (walkScreenIdx) /* skip screen #0 */
memcpy(stuff + 1, extra, extra_len);
if (dst->u.pict.root) {
@@ -2883,7 +2872,7 @@ PanoramiXRenderTrapezoids(ClientPtr client)
if (result != Success)
break;
}
});
free(extra);
}
@@ -2911,9 +2900,7 @@ PanoramiXRenderTriangles(ClientPtr client)
if (extra_len && (extra = calloc(1, extra_len))) {
memcpy(extra, stuff + 1, extra_len);
unsigned int walkScreenIdx;
FOR_NSCREENS_FORWARD(walkScreenIdx) {
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx];
XINERAMA_FOR_EACH_SCREEN_FORWARD({
if (walkScreenIdx) /* skip screen #0 */
memcpy(stuff + 1, extra, extra_len);
if (dst->u.pict.root) {
@@ -2942,7 +2929,7 @@ PanoramiXRenderTriangles(ClientPtr client)
if (result != Success)
break;
}
});
free(extra);
}
@@ -2970,9 +2957,7 @@ PanoramiXRenderTriStrip(ClientPtr client)
if (extra_len && (extra = calloc(1, extra_len))) {
memcpy(extra, stuff + 1, extra_len);
unsigned int walkScreenIdx;
FOR_NSCREENS_FORWARD(walkScreenIdx) {
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx];
XINERAMA_FOR_EACH_SCREEN_FORWARD({
if (walkScreenIdx) /* skip screen #0 */
memcpy(stuff + 1, extra, extra_len);
if (dst->u.pict.root) {
@@ -2997,7 +2982,7 @@ PanoramiXRenderTriStrip(ClientPtr client)
if (result != Success)
break;
}
});
free(extra);
}
@@ -3025,9 +3010,7 @@ PanoramiXRenderTriFan(ClientPtr client)
if (extra_len && (extra = calloc(1, extra_len))) {
memcpy(extra, stuff + 1, extra_len);
unsigned int walkScreenIdx;
FOR_NSCREENS_FORWARD(walkScreenIdx) {
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx];
XINERAMA_FOR_EACH_SCREEN_FORWARD({
if (walkScreenIdx) /* skip screen #0 */
memcpy(stuff + 1, extra, extra_len);
if (dst->u.pict.root) {
@@ -3052,7 +3035,7 @@ PanoramiXRenderTriFan(ClientPtr client)
if (result != Success)
break;
}
});
free(extra);
}
@@ -3079,9 +3062,7 @@ PanoramiXRenderAddTraps(ClientPtr client)
x_off = stuff->xOff;
y_off = stuff->yOff;
unsigned int walkScreenIdx;
FOR_NSCREENS_FORWARD(walkScreenIdx) {
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx];
XINERAMA_FOR_EACH_SCREEN_FORWARD({
if (walkScreenIdx) /* skip screen #0 */
memcpy(stuff + 1, extra, extra_len);
stuff->picture = picture->info[walkScreenIdx].id;
@@ -3093,7 +3074,8 @@ PanoramiXRenderAddTraps(ClientPtr client)
result = ProcRenderAddTraps(client);
if (result != Success)
break;
}
});
free(extra);
}
@@ -3116,13 +3098,12 @@ PanoramiXRenderCreateSolidFill(ClientPtr client)
panoramix_setup_ids(newPict, client, stuff->pid);
newPict->u.pict.root = FALSE;
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->pid = newPict->info[walkScreenIdx].id;
result = ProcRenderCreateSolidFill(client);
if (result != Success)
break;
}
});
if (result == Success)
AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
@@ -3148,13 +3129,12 @@ PanoramiXRenderCreateLinearGradient(ClientPtr client)
panoramix_setup_ids(newPict, client, stuff->pid);
newPict->u.pict.root = FALSE;
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->pid = newPict->info[walkScreenIdx].id;
result = ProcRenderCreateLinearGradient(client);
if (result != Success)
break;
}
});
if (result == Success)
AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
@@ -3180,13 +3160,12 @@ PanoramiXRenderCreateRadialGradient(ClientPtr client)
panoramix_setup_ids(newPict, client, stuff->pid);
newPict->u.pict.root = FALSE;
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->pid = newPict->info[walkScreenIdx].id;
result = ProcRenderCreateRadialGradient(client);
if (result != Success)
break;
}
});
if (result == Success)
AddResource(newPict->info[0].id, XRT_PICTURE, newPict);
@@ -3212,13 +3191,12 @@ PanoramiXRenderCreateConicalGradient(ClientPtr client)
panoramix_setup_ids(newPict, client, stuff->pid);
newPict->u.pict.root = FALSE;
int walkScreenIdx;
FOR_NSCREENS_BACKWARD(walkScreenIdx) {
XINERAMA_FOR_EACH_SCREEN_BACKWARD({
stuff->pid = newPict->info[walkScreenIdx].id;
result = ProcRenderCreateConicalGradient(client);
if (result != Success)
break;
}
});
if (result == Success)
AddResource(newPict->info[0].id, XRT_PICTURE, newPict);