diff --git a/dix/dix_priv.h b/dix/dix_priv.h index 44229bc08..81d33ad92 100644 --- a/dix/dix_priv.h +++ b/dix/dix_priv.h @@ -38,6 +38,19 @@ extern HWEventQueuePtr checkForInput[2]; /* -retro mode */ extern Bool party_like_its_1989; +/* + * @brief callback right after one screen's root window has been initialized + * + * For extensions that need additional setup after root window is completely + * initialized (eg. possible to create new windows), but before any client + * can connect. Called once per screen (supplied as arg) - the screen's + * CreateWindow proc already had been called on the root window. + * + * Not for DDXs / drivers: those already informed by screen's CreateWindow + * proc being called on the root window. + */ +extern CallbackListPtr PostInitRootWindowCallback; + static inline _X_NOTSAN Bool InputCheckPending(void) { diff --git a/dix/main.c b/dix/main.c index 5dbee7fdb..b02854915 100644 --- a/dix/main.c +++ b/dix/main.c @@ -130,6 +130,7 @@ Equipment Corporation. extern void Dispatch(void); CallbackListPtr RootWindowFinalizeCallback = NULL; +CallbackListPtr PostInitRootWindowCallback = NULL; int dix_main(int argc, char *argv[], char *envp[]) @@ -251,8 +252,10 @@ dix_main(int argc, char *argv[], char *envp[]) PanoramiXConsolidate(); #endif /* XINERAMA */ - for (i = 0; i < screenInfo.numScreens; i++) + for (i = 0; i < screenInfo.numScreens; i++) { InitRootWindow(screenInfo.screens[i]->root); + CallCallbacks(&PostInitRootWindowCallback, screenInfo.screens[i]); + } InitCoreDevices(); InitInput(argc, argv);