xfixes: use CloseScreen hook

Wrapping ScreenRec's function pointers is problematic for many reasons,
so use the new screen close notify hook instead.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-10-04 20:34:37 +02:00
parent 4497e36cb5
commit 600803e659

View File

@ -47,6 +47,7 @@
#include "dix/cursor_priv.h" #include "dix/cursor_priv.h"
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/input_priv.h" #include "dix/input_priv.h"
#include "dix/screen_hooks_priv.h"
#include "xfixesint.h" #include "xfixesint.h"
#include "scrnintstr.h" #include "scrnintstr.h"
@ -118,7 +119,6 @@ typedef struct _CursorHideCountRec {
typedef struct _CursorScreen { typedef struct _CursorScreen {
DisplayCursorProcPtr DisplayCursor; DisplayCursorProcPtr DisplayCursor;
CloseScreenProcPtr CloseScreen;
CursorHideCountPtr pCursorHideCounts; CursorHideCountPtr pCursorHideCounts;
} CursorScreenRec, *CursorScreenPtr; } CursorScreenRec, *CursorScreenPtr;
@ -190,18 +190,15 @@ CursorDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
return ret; return ret;
} }
static Bool static void CursorScreenClose(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused)
CursorCloseScreen(ScreenPtr pScreen)
{ {
CursorScreenPtr cs = GetCursorScreen(pScreen); CursorScreenPtr cs = GetCursorScreen(pScreen);
_X_UNUSED CloseScreenProcPtr close_proc;
_X_UNUSED DisplayCursorProcPtr display_proc; _X_UNUSED DisplayCursorProcPtr display_proc;
Unwrap(cs, pScreen, CloseScreen, close_proc); dixScreenUnhookClose(pScreen, CursorScreenClose);
Unwrap(cs, pScreen, DisplayCursor, display_proc); Unwrap(cs, pScreen, DisplayCursor, display_proc);
deleteCursorHideCountsForScreen(pScreen); deleteCursorHideCountsForScreen(pScreen);
return pScreen->CloseScreen(pScreen);
} }
#define CursorAllEvents (XFixesDisplayCursorNotifyMask) #define CursorAllEvents (XFixesDisplayCursorNotifyMask)
@ -1060,7 +1057,7 @@ XFixesCursorInit(void)
for (i = 0; i < screenInfo.numScreens; i++) { for (i = 0; i < screenInfo.numScreens; i++) {
ScreenPtr pScreen = screenInfo.screens[i]; ScreenPtr pScreen = screenInfo.screens[i];
CursorScreenPtr cs = GetCursorScreen(pScreen); CursorScreenPtr cs = GetCursorScreen(pScreen);
Wrap(cs, pScreen, CloseScreen, CursorCloseScreen); dixScreenHookClose(pScreen, CursorScreenClose);
Wrap(cs, pScreen, DisplayCursor, CursorDisplayCursor); Wrap(cs, pScreen, DisplayCursor, CursorDisplayCursor);
cs->pCursorHideCounts = NULL; cs->pCursorHideCounts = NULL;
} }