diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 0c019e0e6..2d6260030 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -562,6 +562,10 @@ typedef struct _xf86CrtcConfig { OptionInfoPtr options; Bool debug_modes; + + /* wrap screen BlockHandler for rotation */ + ScreenBlockHandlerProcPtr BlockHandler; + } xf86CrtcConfigRec, *xf86CrtcConfigPtr; extern int xf86CrtcConfigPrivateIndex; diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c index 359501e38..137993926 100644 --- a/hw/xfree86/modes/xf86Rotate.c +++ b/hw/xfree86/modes/xf86Rotate.c @@ -264,7 +264,7 @@ xf86RotatePrepare (ScreenPtr pScreen) } } -static void +static Bool xf86RotateRedisplay(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; @@ -273,7 +273,7 @@ xf86RotateRedisplay(ScreenPtr pScreen) RegionPtr region; if (!damage) - return; + return FALSE; xf86RotatePrepare (pScreen); region = DamageRegion(damage); if (REGION_NOTEMPTY(pScreen, region)) @@ -317,19 +317,25 @@ xf86RotateRedisplay(ScreenPtr pScreen) pScreen->SourceValidate = SourceValidate; DamageEmpty(damage); } + return TRUE; } static void -xf86RotateBlockHandler(pointer data, OSTimePtr pTimeout, pointer pRead) +xf86RotateBlockHandler(int screenNum, pointer blockData, + pointer pTimeout, pointer pReadmask) { - ScreenPtr pScreen = (ScreenPtr) data; + ScreenPtr pScreen = screenInfo.screens[screenNum]; + ScrnInfoPtr pScrn = xf86Screens[screenNum]; + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - xf86RotateRedisplay(pScreen); -} - -static void -xf86RotateWakeupHandler(pointer data, int i, pointer LastSelectMask) -{ + pScreen->BlockHandler = xf86_config->BlockHandler; + (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask); + if (xf86RotateRedisplay(pScreen)) + { + /* Re-wrap if rotation is still happening */ + xf86_config->BlockHandler = pScreen->BlockHandler; + pScreen->BlockHandler = xf86RotateBlockHandler; + } } static void @@ -367,10 +373,6 @@ xf86RotateDestroy (xf86CrtcPtr crtc) } DamageDestroy (xf86_config->rotation_damage); xf86_config->rotation_damage = NULL; - /* Free block/wakeup handler */ - RemoveBlockAndWakeupHandlers (xf86RotateBlockHandler, - xf86RotateWakeupHandler, - (pointer) pScreen); } } @@ -440,20 +442,12 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) if (!xf86_config->rotation_damage) goto bail2; - /* Assign block/wakeup handler */ - if (!RegisterBlockAndWakeupHandlers (xf86RotateBlockHandler, - xf86RotateWakeupHandler, - (pointer) pScreen)) - { - goto bail3; - } + /* Wrap block handler */ + xf86_config->BlockHandler = pScreen->BlockHandler; + pScreen->BlockHandler = xf86RotateBlockHandler; } if (0) { -bail3: - DamageDestroy (xf86_config->rotation_damage); - xf86_config->rotation_damage = NULL; - bail2: if (shadow || shadowData) {