diff options
author | Pauli Nieminen <ext-pauli.nieminen@nokia.com> | 2010-12-30 19:19:33 +0200 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2010-12-31 12:52:51 +0000 |
commit | 6d0e9e5d6e1b847961ab52a11aae96981a1cf1c0 (patch) | |
tree | a9e0baed2fdeb04d2bd4c33cc829db54e89f1a02 | |
parent | aa8cea953dc66bcf4cb4d08f2681f9e6cb1bc8c5 (diff) |
render: Enable animated cursor block handler only when needed
Calling BlockHandlers takes some time for each iteration in main loop
which adds up quickly over multiple request. To reduce the round-trip
costs to xserver BlockHandlers should be registered only when required.
AnimCurScreenBlockHandler is the first victim for this optimization.
Signed-off-by: Pauli Nieminen <ext-pauli.nieminen@nokia.com>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
-rw-r--r-- | render/animcur.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/render/animcur.c b/render/animcur.c index 1a8ca43ba..31cbab9a6 100644 --- a/render/animcur.c +++ b/render/animcur.c @@ -95,8 +95,6 @@ AnimCurCloseScreen (int index, ScreenPtr pScreen) Bool ret; Unwrap(as, pScreen, CloseScreen); - - Unwrap(as, pScreen, BlockHandler); Unwrap(as, pScreen, CursorLimits); Unwrap(as, pScreen, DisplayCursor); @@ -196,7 +194,10 @@ AnimCurScreenBlockHandler (int screenNum, Unwrap (as, pScreen, BlockHandler); (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask); - Wrap (as, pScreen, BlockHandler, AnimCurScreenBlockHandler); + if (activeDevice) + Wrap (as, pScreen, BlockHandler, AnimCurScreenBlockHandler); + else + as->BlockHandler = NULL; } static Bool @@ -222,6 +223,9 @@ AnimCurDisplayCursor (DeviceIntPtr pDev, pDev->spriteInfo->anim.time = GetTimeInMillis () + ac->elts[0].delay; pDev->spriteInfo->anim.pCursor = pCursor; pDev->spriteInfo->anim.pScreen = pScreen; + + if (!as->BlockHandler) + Wrap(as, pScreen, BlockHandler, AnimCurScreenBlockHandler); } } else @@ -248,8 +252,12 @@ AnimCurSetCursorPosition (DeviceIntPtr pDev, Bool ret; Unwrap (as, pScreen, SetCursorPosition); - if (pDev->spriteInfo->anim.pCursor) + if (pDev->spriteInfo->anim.pCursor) { pDev->spriteInfo->anim.pScreen = pScreen; + + if (!as->BlockHandler) + Wrap(as, pScreen, BlockHandler, AnimCurScreenBlockHandler); + } ret = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent); Wrap (as, pScreen, SetCursorPosition, AnimCurSetCursorPosition); return ret; @@ -334,7 +342,7 @@ AnimCurInit (ScreenPtr pScreen) return FALSE; Wrap(as, pScreen, CloseScreen, AnimCurCloseScreen); - Wrap(as, pScreen, BlockHandler, AnimCurScreenBlockHandler); + as->BlockHandler = NULL; Wrap(as, pScreen, CursorLimits, AnimCurCursorLimits); Wrap(as, pScreen, DisplayCursor, AnimCurDisplayCursor); |