diff --git a/dix/dix_priv.h b/dix/dix_priv.h index 46f503074..6f97456d0 100644 --- a/dix/dix_priv.h +++ b/dix/dix_priv.h @@ -268,6 +268,8 @@ extern Bool enableBackingStore; /* in generated BuiltInAtoms.c */ void MakePredeclaredAtoms(void); +void dixFreeScreen(ScreenPtr pScreen); + /* * @brief mark event ID as critical * @param event the event to add to the critical events bitmap diff --git a/dix/main.c b/dix/main.c index 516916991..759b8a2a2 100644 --- a/dix/main.c +++ b/dix/main.c @@ -325,23 +325,16 @@ dix_main(int argc, char *argv[], char *envp[]) CloseDownEvents(); for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) { - ScreenPtr pScreen = screenInfo.gpuscreens[i]; - dixFreeScreenSpecificPrivates(pScreen); - (*pScreen->CloseScreen) (pScreen); - dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN); - free(pScreen); + dixFreeScreen(screenInfo.gpuscreens[i]); screenInfo.numGPUScreens = i; } + memset(&screenInfo.numGPUScreens, 0, sizeof(screenInfo.numGPUScreens)); for (i = screenInfo.numScreens - 1; i >= 0; i--) { - FreeGCperDepth(screenInfo.screens[i]); - dixDestroyPixmap(screenInfo.screens[i]->defaultStipple, 0); - dixFreeScreenSpecificPrivates(screenInfo.screens[i]); - (*screenInfo.screens[i]->CloseScreen) (screenInfo.screens[i]); - dixFreePrivates(screenInfo.screens[i]->devPrivates, PRIVATE_SCREEN); - free(screenInfo.screens[i]); + dixFreeScreen(screenInfo.screens[i]); screenInfo.numScreens = i; } + memset(&screenInfo.screens, 0, sizeof(screenInfo.numGPUScreens)); ReleaseClientIds(serverClient); dixFreePrivates(serverClient->devPrivates, PRIVATE_CLIENT); diff --git a/dix/meson.build b/dix/meson.build index 78f3b1f9e..658f7f966 100644 --- a/dix/meson.build +++ b/dix/meson.build @@ -28,6 +28,7 @@ srcs_dix = [ 'registry.c', 'resource.c', 'selection.c', + 'screen.c', 'swaprep.c', 'swapreq.c', 'tables.c', diff --git a/dix/screen.c b/dix/screen.c new file mode 100644 index 000000000..c6fdfa3dc --- /dev/null +++ b/dix/screen.c @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: MIT OR X11 + * + * Copyright © 2024 Enrico Weigelt, metux IT consult + */ +#include + +#include "dix/dix_priv.h" +#include "dix/gc_priv.h" +#include "include/screenint.h" +#include "include/scrnintstr.h" + +void dixFreeScreen(ScreenPtr pScreen) +{ + if (!pScreen) + return; + + FreeGCperDepth(pScreen); + dixDestroyPixmap(pScreen->defaultStipple, 0); + dixFreeScreenSpecificPrivates(pScreen); + pScreen->CloseScreen(pScreen); + dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN); + free(pScreen); +}