summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2012-10-29 17:33:54 +1100
committerDaniel Stone <daniel@fooishbar.org>2012-10-29 18:39:58 +1100
commitba3bb08291b6b13cce70aedfbc0665bef817b75a (patch)
tree8c47884d10c94f78ab3185f4a80f1aba9ebdc85f
parentad7e89625522997b5382b9d049be12091798e700 (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.c18
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);