Files
xserver/dix/screenint_priv.h
Enrico Weigelt, metux IT consult 0fbb681fce treewide: use helper dixGetScreenPtr() for retrieving ScreenPtr's
Instead of directly accessing the global screenInfo.screens[] array,
let everybody go through a little inline helper. This one also checks
for array bounds - if the screen doesn't exist, return NULL.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-10-30 09:44:24 +01:00

130 lines
4.0 KiB
C

/* SPDX-License-Identifier: MIT OR X11
*
* Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
* Copyright © 1987, 1998 The Open Group
*/
#ifndef _XSERVER_DIX_SCREENINT_PRIV_H
#define _XSERVER_DIX_SCREENINT_PRIV_H
#include <stdbool.h>
#include <X11/Xdefs.h>
#include "include/callback.h"
#include "include/screenint.h"
#include "include/scrnintstr.h" /* for screenInfo */
typedef Bool (*ScreenInitProcPtr)(ScreenPtr pScreen, int argc, char **argv);
int AddScreen(ScreenInitProcPtr pfnInit, int argc, char **argv);
int AddGPUScreen(ScreenInitProcPtr pfnInit, int argc, char **argv);
void RemoveGPUScreen(ScreenPtr pScreen);
void AttachUnboundGPU(ScreenPtr pScreen, ScreenPtr newScreen);
void DetachUnboundGPU(ScreenPtr unbound);
void AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr newScreen);
void DetachOffloadGPU(ScreenPtr slave);
void InitOutput(int argc, char **argv);
static inline ScreenPtr dixGetMasterScreen(void) {
return screenInfo.screens[0];
}
/*
* retrieve pointer to screen by it's index. If index is above the total
* number of screens, returns NULL
*
* @param idx screen index
* @return pointer to idx'th screen or NULL
*/
static inline ScreenPtr dixGetScreenPtr(unsigned int idx) {
if (idx < screenInfo.numScreens)
return screenInfo.screens[idx];
return NULL;
}
/*
* check whether screen with given index exists
*
* @param idx screen index
* @return TRUE if the screen at this index exists
*/
static inline bool dixScreenExists(unsigned int idx) {
return ((idx < screenInfo.numScreens) &&
(screenInfo.screens[idx] != NULL));
}
/*
* macro for looping over all screens (up to `screenInfo.numScreens`).
* 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.
*/
#define DIX_FOR_EACH_SCREEN(__LAMBDA__) \
do { \
for (unsigned walkScreenIdx = 0; walkScreenIdx < screenInfo.numScreens; walkScreenIdx++) { \
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx]; \
(void)walkScreen; \
__LAMBDA__; \
} \
} while (0);
/*
* macro for looping over all screens (up to `screenInfo.numScreens`),
* but if XINERAMA enabled only hit the first screen.
*
* @param __LAMBDA__ the code to be executed in each iteration step.
*/
#ifdef XINERAMA
#define DIX_FOR_EACH_SCREEN_XINERAMA(__LAMBDA__) \
do { \
unsigned int __num_screens = screenInfo.numScreens; \
if (!noPanoramiXExtension) \
__num_screens = 1; \
for (unsigned walkScreenIdx = 0; walkScreenIdx < __num_screens; walkScreenIdx++) { \
ScreenPtr walkScreen = screenInfo.screens[walkScreenIdx]; \
(void)walkScreen; \
__LAMBDA__; \
} \
} while (0);
#else
#define DIX_FOR_EACH_SCREEN_XINERAMA DIX_FOR_EACH_SCREEN
#endif
/*
* macro for looping over all GPU screens (up to `screenInfo.numScreens`).
* 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.
*/
#define DIX_FOR_EACH_GPU_SCREEN(__LAMBDA__) \
do { \
for (unsigned walkScreenIdx = 0; walkScreenIdx < screenInfo.numGPUScreens; walkScreenIdx++) { \
ScreenPtr walkScreen = screenInfo.gpuscreens[walkScreenIdx]; \
(void)walkScreen; \
__LAMBDA__; \
} \
} while (0);
extern CallbackListPtr ScreenAccessCallback;
typedef struct {
ClientPtr client;
ScreenPtr screen;
Mask access_mode;
int status;
} ScreenAccessCallbackParam;
static inline int dixCallScreenAccessCallback(ClientPtr client, ScreenPtr screen, Mask access_mode)
{
ScreenAccessCallbackParam rec = { client, screen, access_mode, Success };
CallCallbacks(&ScreenAccessCallback, &rec);
return rec.status;
}
#endif /* _XSERVER_DIX_SCREENINT_PRIV_H */