diff --git a/dix/dix_priv.h b/dix/dix_priv.h index f0714d6b4..6e1e92b00 100644 --- a/dix/dix_priv.h +++ b/dix/dix_priv.h @@ -53,6 +53,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 d855fe659..d87bb2368 100644 --- a/dix/main.c +++ b/dix/main.c @@ -125,6 +125,7 @@ Equipment Corporation. extern void Dispatch(void); CallbackListPtr RootWindowFinalizeCallback = NULL; +CallbackListPtr PostInitRootWindowCallback = NULL; int dix_main(int argc, char *argv[], char *envp[]) @@ -247,8 +248,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]); + } LogMessageVerb(X_INFO, 1, "Screen(s) initialized\n");