panoramiX: make XINERAMA_FOR_EACH_SCREEN_* macros variadic
Some checks failed
Build X servers / ubuntu-fetch-pkg (push) Has been cancelled
Build X servers / xserver-build-macos (push) Has been cancelled
Build X servers / xserver-build-cygwin (push) Has been cancelled
Build X servers / xserver-build-arch (push) Has been cancelled
Build X servers / Check Signed-Off-By (push) Has been cancelled
Build X servers / xserver-build-ubuntu-no-gbm (push) Has been cancelled
Build X servers / xserver-build-ubuntu (push) Has been cancelled
Build X servers / drivers-prepare-ubuntu (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-elographics:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-evdev:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-joystick:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-keyboard:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-libinput:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-mouse:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-synaptics:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-vmmouse:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-void:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (input-wacom:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-amdgpu:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-apm:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-ark:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-ast:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-ati:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-chips:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-cirrus:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-dummy:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-fbdev:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-freedreno:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-geode:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-i128:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-i740:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-intel:25.0.1) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-mach64:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-mga:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-neomagic:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-nested:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-nouveau:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-nv:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-omap:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-qxl:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-r128:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-rendition:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-s3virge:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-savage:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-siliconmotion:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-sis:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-sisusb:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-suncg14:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-suncg3:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-suncg6:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-sunffb:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-sunleo:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-suntcx:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-tdfx:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-trident:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-v4l:25.0.1) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-vbox:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-vesa:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-vmware:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-voodoo:25.0.0) (push) Has been cancelled
Build X servers / drivers-build-ubuntu (video-xgi:25.0.0) (push) Has been cancelled
Build X servers / xserver-build-mingw32-ubuntu (push) Has been cancelled
Build X servers / xserver-build-freebsd (push) Has been cancelled
Build X servers / xserver-build-dragonflybsd (push) Has been cancelled
Build X servers / xserver-build-netbsd (push) Has been cancelled
Build X servers / xserver-build-alpine (push) Has been cancelled
Build X servers / Release pushed tag (push) Has been cancelled

The XINERAMA_FOR_EACH_SCREEN_FORWARD / _FORWARD_SKIP0 / _BACKWARD macros
took the loop body as a single macro parameter. Any top-level comma in
the body was therefore parsed as an argument separator, so a body
containing e.g. a designated initialiser (`Foo f = { .a = 1, .b = 2 };`)
failed to compile — the reason for the existing "static init would
confuse preprocessor" workarounds at the call sites.

Pass the body as a variadic argument (`...` / `__VA_ARGS__`) instead.
Commas in the body are then preserved, so ordinary designated
initialisers (and other comma-containing statements) can be used in the
loop body without compound-literal-cast or memset workarounds.

Pure enabling change: all existing call sites pass a single brace block,
which is unchanged as __VA_ARGS__. Build-verified (Xvfb/Xnest link).

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
(cherry picked from commit 486d71c5b0)
This commit is contained in:
Enrico Weigelt, metux IT consult 2026-07-02 17:05:21 +02:00 committed by Enrico Weigelt
commit a2fd9501d1

View file

@ -73,14 +73,18 @@ typedef struct {
* Makes a new scopes and declares `walkScreenIdx` as the current screen's
* index number as well as `walkScreen` as poiner to current ScreenRec
*
* @param __LAMBDA__ the code to be executed in each iteration step.
* The body is passed via a variadic parameter so it may contain top-level
* commas (e.g. a `Foo f = { .a = 1, .b = 2 };` designated initialiser)
* without being mis-parsed as multiple macro arguments.
*
* @param ... the code to be executed in each iteration step.
*/
#define XINERAMA_FOR_EACH_SCREEN_FORWARD(__LAMBDA__) \
#define XINERAMA_FOR_EACH_SCREEN_FORWARD(...) \
do { \
for (unsigned walkScreenIdx = 0; walkScreenIdx < PanoramiXNumScreens; walkScreenIdx++) { \
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx]; \
(void)walkScreen; \
__LAMBDA__; \
__VA_ARGS__; \
} \
} while (0);
@ -88,29 +92,37 @@ typedef struct {
* just like XINERAMA_FOR_EACH_SCREEN_FORWARD(), but skipping the first
* screen (which is the frontend to the client)
*
* @param __LAMBDA__ the code to be executed in each iteration step.
* The body is passed via a variadic parameter so it may contain top-level
* commas (e.g. a `Foo f = { .a = 1, .b = 2 };` designated initialiser)
* without being mis-parsed as multiple macro arguments.
*
* @param ... the code to be executed in each iteration step.
*/
#define XINERAMA_FOR_EACH_SCREEN_FORWARD_SKIP0(__LAMBDA__) \
#define XINERAMA_FOR_EACH_SCREEN_FORWARD_SKIP0(...) \
do { \
for (unsigned walkScreenIdx = 1; walkScreenIdx < PanoramiXNumScreens; walkScreenIdx++) { \
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx]; \
(void)walkScreen; \
__LAMBDA__; \
__VA_ARGS__; \
} \
} while (0);
/*
* like XINERAMA_FOR_EACH_SCREEN_FORWARD(), but traveling backwards.
*
* @param __LAMBDA__ the code to be executed in each iteration step.
* The body is passed via a variadic parameter so it may contain top-level
* commas (e.g. a `Foo f = { .a = 1, .b = 2 };` designated initialiser)
* without being mis-parsed as multiple macro arguments.
*
* @param ... the code to be executed in each iteration step.
*/
#define XINERAMA_FOR_EACH_SCREEN_BACKWARD(__LAMBDA__) \
#define XINERAMA_FOR_EACH_SCREEN_BACKWARD(...) \
do { \
for (unsigned __walkidx = PanoramiXNumScreens; __walkidx > 0; __walkidx--) { \
unsigned walkScreenIdx = __walkidx - 1; \
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx]; \
(void)walkScreen; \
__LAMBDA__; \
__VA_ARGS__; \
} \
} while (0);