100 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
/* SPDX-License-Identifier: MIT OR X11
 | 
						|
 *
 | 
						|
 * Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
 | 
						|
 */
 | 
						|
 | 
						|
#include <dix-config.h>
 | 
						|
 | 
						|
#include <X11/Xdefs.h>
 | 
						|
 | 
						|
#include "dix/dix_priv.h"
 | 
						|
#include "dix/screen_hooks_priv.h"
 | 
						|
#include "include/dix.h"
 | 
						|
#include "include/os.h"
 | 
						|
#include "include/scrnintstr.h"
 | 
						|
#include "include/windowstr.h"
 | 
						|
 | 
						|
#define DECLARE_HOOK_PROC(NAME, FIELD, TYPE) \
 | 
						|
    void dixScreenHook##NAME(ScreenPtr pScreen, TYPE func) \
 | 
						|
    { \
 | 
						|
        AddCallback(&pScreen->FIELD, (CallbackProcPtr)func, pScreen); \
 | 
						|
    } \
 | 
						|
    \
 | 
						|
    void dixScreenUnhook##NAME(ScreenPtr pScreen, TYPE func) \
 | 
						|
    { \
 | 
						|
        DeleteCallback(&pScreen->FIELD, (CallbackProcPtr)func, pScreen); \
 | 
						|
    }
 | 
						|
 | 
						|
DECLARE_HOOK_PROC(WindowDestroy, hookWindowDestroy, XorgScreenWindowDestroyProcPtr);
 | 
						|
DECLARE_HOOK_PROC(WindowPosition, hookWindowPosition, XorgScreenWindowPositionProcPtr);
 | 
						|
DECLARE_HOOK_PROC(Close, hookClose, XorgScreenCloseProcPtr);
 | 
						|
DECLARE_HOOK_PROC(PixmapDestroy, hookPixmapDestroy, XorgScreenPixmapDestroyProcPtr);
 | 
						|
DECLARE_HOOK_PROC(PostCreateResources, hookPostCreateResources,
 | 
						|
                  XorgScreenPostCreateResourcesProcPtr);
 | 
						|
 | 
						|
int dixScreenRaiseWindowDestroy(WindowPtr pWin)
 | 
						|
{
 | 
						|
    if (!pWin)
 | 
						|
        return Success;
 | 
						|
 | 
						|
    ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
						|
 | 
						|
    CallCallbacks(&pScreen->hookWindowDestroy, pWin);
 | 
						|
 | 
						|
    return (pScreen->DestroyWindow ? pScreen->DestroyWindow(pWin) : Success);
 | 
						|
}
 | 
						|
 | 
						|
void dixScreenRaiseWindowPosition(WindowPtr pWin, uint32_t x, uint32_t y)
 | 
						|
{
 | 
						|
    if (!pWin)
 | 
						|
        return;
 | 
						|
 | 
						|
    ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
						|
 | 
						|
    XorgScreenWindowPositionParamRec param = {
 | 
						|
        .window = pWin,
 | 
						|
        .x = x,
 | 
						|
        .y = y,
 | 
						|
    };
 | 
						|
 | 
						|
    CallCallbacks(&pScreen->hookWindowPosition, ¶m);
 | 
						|
 | 
						|
    if (pScreen->PositionWindow)
 | 
						|
        pScreen->PositionWindow(pWin, x, y);
 | 
						|
}
 | 
						|
 | 
						|
void dixScreenRaiseClose(ScreenPtr pScreen) {
 | 
						|
    if (!pScreen)
 | 
						|
        return;
 | 
						|
 | 
						|
    CallCallbacks(&pScreen->hookClose, NULL);
 | 
						|
 | 
						|
    if (pScreen->CloseScreen)
 | 
						|
        pScreen->CloseScreen(pScreen);
 | 
						|
}
 | 
						|
 | 
						|
void dixScreenRaisePixmapDestroy(PixmapPtr pPixmap)
 | 
						|
{
 | 
						|
    if (!pPixmap)
 | 
						|
        return;
 | 
						|
 | 
						|
    ScreenPtr pScreen = pPixmap->drawable.pScreen;
 | 
						|
    CallCallbacks(&pScreen->hookPixmapDestroy, pPixmap);
 | 
						|
    /* we must not call the original ScreenRec->DestroyPixmap() here */
 | 
						|
}
 | 
						|
 | 
						|
Bool dixScreenRaiseCreateResources(ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    if (!pScreen)
 | 
						|
        return FALSE;
 | 
						|
 | 
						|
    if (pScreen->CreateScreenResources) {
 | 
						|
        if (!pScreen->CreateScreenResources(pScreen))
 | 
						|
            return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    Bool ret = TRUE;
 | 
						|
    CallCallbacks(&pScreen->hookPostCreateResources, &ret);
 | 
						|
    return ret;
 | 
						|
}
 |