diff options
author | Daniel Stone <daniel@fooishbar.org> | 2012-10-29 17:33:54 +1100 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2012-10-29 18:39:58 +1100 |
commit | ba3bb08291b6b13cce70aedfbc0665bef817b75a (patch) | |
tree | 8c47884d10c94f78ab3185f4a80f1aba9ebdc85f | |
parent | ad7e89625522997b5382b9d049be12091798e700 (diff) |
Convert flush callback to a block handler
The flush callback gets called pretty non-deterministically, so use the
block handler instead so we're actually guaranteed to flush damage at
some point.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
-rw-r--r-- | src/wlshm.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/wlshm.c b/src/wlshm.c index 74751e0..d1f0630 100644 --- a/src/wlshm.c +++ b/src/wlshm.c @@ -138,27 +138,31 @@ wlshm_adjust_frame(ADJUST_FRAME_ARGS_DECL) } static void -wlshm_flush_callback(CallbackListPtr *list, - pointer user_data, pointer call_data) +block_handler(pointer blockData, OSTimePtr pTimeout, pointer pReadMask) { - struct wlshm_device *wlshm = user_data; + struct wlshm_device *wlshm = (struct wlshm_device *) blockData; if (wlshm->xwl_screen) xwl_screen_post_damage(wlshm->xwl_screen); } +static void +wakeup_handler(pointer blockData, int result, pointer pReadMask) +{ +} + static Bool wlshm_close_screen(CLOSE_SCREEN_ARGS_DECL) { ScrnInfoPtr pScrn = xf86Screens[screen->myNum]; struct wlshm_device *wlshm = wlshm_scrninfo_priv(pScrn); - DeleteCallback(&FlushCallback, wlshm_flush_callback, wlshm); - if (wlshm->fb) free(wlshm->fb); wlshm->fb = NULL; + RemoveBlockAndWakeupHandlers(block_handler, wakeup_handler, wlshm); + xwl_screen_close(wlshm->xwl_screen); pScrn->vtSema = FALSE; @@ -384,14 +388,14 @@ wlshm_screen_init(SCREEN_INIT_ARGS_DECL) wlshm->SetWindowPixmap = screen->SetWindowPixmap; screen->SetWindowPixmap = wlshm_set_window_pixmap; - AddCallback(&FlushCallback, wlshm_flush_callback, wlshm); - /* Report any unused options (only for the first generation) */ if (serverGeneration == 1) xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); miScreenDevPrivateInit(screen, screen->width, wlshm->fb); + RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, wlshm); + if (wlshm->xwl_screen) return (xwl_screen_init(wlshm->xwl_screen, screen) == Success); |