(!1714) render: 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:
		
							parent
							
								
									34f5d468f6
								
							
						
					
					
						commit
						dd6c682b08
					
				| 
						 | 
					@ -37,6 +37,7 @@
 | 
				
			||||||
#include <X11/Xmd.h>
 | 
					#include <X11/Xmd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "dix/cursor_priv.h"
 | 
					#include "dix/cursor_priv.h"
 | 
				
			||||||
 | 
					#include "dix/screen_hooks_priv.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "servermd.h"
 | 
					#include "servermd.h"
 | 
				
			||||||
#include "scrnintstr.h"
 | 
					#include "scrnintstr.h"
 | 
				
			||||||
| 
						 | 
					@ -60,7 +61,6 @@ typedef struct _AnimCur {
 | 
				
			||||||
} AnimCurRec, *AnimCurPtr;
 | 
					} AnimCurRec, *AnimCurPtr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _AnimScrPriv {
 | 
					typedef struct _AnimScrPriv {
 | 
				
			||||||
    CloseScreenProcPtr CloseScreen;
 | 
					 | 
				
			||||||
    CursorLimitsProcPtr CursorLimits;
 | 
					    CursorLimitsProcPtr CursorLimits;
 | 
				
			||||||
    DisplayCursorProcPtr DisplayCursor;
 | 
					    DisplayCursorProcPtr DisplayCursor;
 | 
				
			||||||
    SetCursorPositionProcPtr SetCursorPosition;
 | 
					    SetCursorPositionProcPtr SetCursorPosition;
 | 
				
			||||||
| 
						 | 
					@ -84,13 +84,11 @@ static DevPrivateKeyRec AnimCurScreenPrivateKeyRec;
 | 
				
			||||||
#define Wrap(as,s,elt,func) (((as)->elt = (s)->elt), (s)->elt = func)
 | 
					#define Wrap(as,s,elt,func) (((as)->elt = (s)->elt), (s)->elt = func)
 | 
				
			||||||
#define Unwrap(as,s,elt)    ((s)->elt = (as)->elt)
 | 
					#define Unwrap(as,s,elt)    ((s)->elt = (as)->elt)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static void AnimCurScreenClose(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused)
 | 
				
			||||||
AnimCurCloseScreen(ScreenPtr pScreen)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    AnimCurScreenPtr as = GetAnimCurScreen(pScreen);
 | 
					    AnimCurScreenPtr as = GetAnimCurScreen(pScreen);
 | 
				
			||||||
    Bool ret;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Unwrap(as, pScreen, CloseScreen);
 | 
					    dixScreenUnhookClose(pScreen, AnimCurScreenClose);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Unwrap(as, pScreen, CursorLimits);
 | 
					    Unwrap(as, pScreen, CursorLimits);
 | 
				
			||||||
    Unwrap(as, pScreen, DisplayCursor);
 | 
					    Unwrap(as, pScreen, DisplayCursor);
 | 
				
			||||||
| 
						 | 
					@ -98,8 +96,6 @@ AnimCurCloseScreen(ScreenPtr pScreen)
 | 
				
			||||||
    Unwrap(as, pScreen, RealizeCursor);
 | 
					    Unwrap(as, pScreen, RealizeCursor);
 | 
				
			||||||
    Unwrap(as, pScreen, UnrealizeCursor);
 | 
					    Unwrap(as, pScreen, UnrealizeCursor);
 | 
				
			||||||
    Unwrap(as, pScreen, RecolorCursor);
 | 
					    Unwrap(as, pScreen, RecolorCursor);
 | 
				
			||||||
    ret = (*pScreen->CloseScreen) (pScreen);
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					@ -286,7 +282,7 @@ AnimCurInit(ScreenPtr pScreen)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    as = GetAnimCurScreen(pScreen);
 | 
					    as = GetAnimCurScreen(pScreen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Wrap(as, pScreen, CloseScreen, AnimCurCloseScreen);
 | 
					    dixScreenHookClose(pScreen, AnimCurScreenClose);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Wrap(as, pScreen, CursorLimits, AnimCurCursorLimits);
 | 
					    Wrap(as, pScreen, CursorLimits, AnimCurCursorLimits);
 | 
				
			||||||
    Wrap(as, pScreen, DisplayCursor, AnimCurDisplayCursor);
 | 
					    Wrap(as, pScreen, DisplayCursor, AnimCurDisplayCursor);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,15 +77,11 @@ picture_window_destructor(CallbackListPtr *pcbl, ScreenPtr pScreen, WindowPtr pW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static void PictureScreenClose(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused)
 | 
				
			||||||
PictureCloseScreen(ScreenPtr pScreen)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PictureScreenPtr ps = GetPictureScreen(pScreen);
 | 
					    PictureScreenPtr ps = GetPictureScreen(pScreen);
 | 
				
			||||||
    Bool ret;
 | 
					 | 
				
			||||||
    int n;
 | 
					    int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pScreen->CloseScreen = ps->CloseScreen;
 | 
					 | 
				
			||||||
    ret = (*pScreen->CloseScreen) (pScreen);
 | 
					 | 
				
			||||||
    PictureResetFilters(pScreen);
 | 
					    PictureResetFilters(pScreen);
 | 
				
			||||||
    for (n = 0; n < ps->nformats; n++)
 | 
					    for (n = 0; n < ps->nformats; n++)
 | 
				
			||||||
        if (ps->formats[n].type == PictTypeIndexed)
 | 
					        if (ps->formats[n].type == PictTypeIndexed)
 | 
				
			||||||
| 
						 | 
					@ -94,7 +90,7 @@ PictureCloseScreen(ScreenPtr pScreen)
 | 
				
			||||||
    SetPictureScreen(pScreen, 0);
 | 
					    SetPictureScreen(pScreen, 0);
 | 
				
			||||||
    free(ps->formats);
 | 
					    free(ps->formats);
 | 
				
			||||||
    free(ps);
 | 
					    free(ps);
 | 
				
			||||||
    return ret;
 | 
					    dixScreenUnhookClose(pScreen, PictureScreenClose);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					@ -685,12 +681,11 @@ PictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ps->subpixel = SubPixelUnknown;
 | 
					    ps->subpixel = SubPixelUnknown;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ps->CloseScreen = pScreen->CloseScreen;
 | 
					 | 
				
			||||||
    ps->StoreColors = pScreen->StoreColors;
 | 
					    ps->StoreColors = pScreen->StoreColors;
 | 
				
			||||||
    pScreen->CloseScreen = PictureCloseScreen;
 | 
					 | 
				
			||||||
    pScreen->StoreColors = PictureStoreColors;
 | 
					    pScreen->StoreColors = PictureStoreColors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dixScreenHookWindowDestroy(pScreen, picture_window_destructor);
 | 
					    dixScreenHookWindowDestroy(pScreen, picture_window_destructor);
 | 
				
			||||||
 | 
					    dixScreenHookClose(pScreen, PictureScreenClose);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!PictureSetDefaultFilters(pScreen)) {
 | 
					    if (!PictureSetDefaultFilters(pScreen)) {
 | 
				
			||||||
        PictureResetFilters(pScreen);
 | 
					        PictureResetFilters(pScreen);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -294,8 +294,6 @@ typedef struct _PictureScreen {
 | 
				
			||||||
    GlyphsProcPtr Glyphs;       /* unused */
 | 
					    GlyphsProcPtr Glyphs;       /* unused */
 | 
				
			||||||
    CompositeRectsProcPtr CompositeRects;
 | 
					    CompositeRectsProcPtr CompositeRects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CloseScreenProcPtr CloseScreen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    StoreColorsProcPtr StoreColors;
 | 
					    StoreColorsProcPtr StoreColors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    InitIndexedProcPtr InitIndexed;
 | 
					    InitIndexedProcPtr InitIndexed;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue