summaryrefslogtreecommitdiff
path: root/twin_fbdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'twin_fbdev.c')
-rw-r--r--twin_fbdev.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/twin_fbdev.c b/twin_fbdev.c
index b8b6fdb..a81a658 100644
--- a/twin_fbdev.c
+++ b/twin_fbdev.c
@@ -42,6 +42,8 @@
#include "twin_fbdev.h"
+#define _IMMEDIATE_REFRESH
+
/* We might want to have more error logging options */
#define SERROR(fmt...) do { fprintf(stderr, fmt); \
fprintf(stderr, " : %s\n", strerror(errno)); \
@@ -170,12 +172,13 @@ static void twin_fbdev_switch(twin_fbdev_t *tf, int activate)
/* Restore fbdev settings */
if (twin_fbdev_apply_config(tf)) {
+ tf->active = 1;
+
/* Mark entire screen for refresh */
if (tf->screen)
twin_screen_damage (tf->screen, 0, 0,
tf->screen->width,
tf->screen->height);
- tf->active = 1;
}
} else {
/* Allow switch. Maybe we want to expose some option
@@ -200,12 +203,32 @@ static twin_bool_t twin_fbdev_work(void *closure)
vt_switch_pending = 0;
}
+#ifndef _IMMEDIATE_REFRESH
if (tf->screen && tf->active &&
twin_screen_damaged (tf->screen))
twin_screen_update(tf->screen);
+#endif /* _IMMEDIATE_REFRESH */
+
return TWIN_TRUE;
}
+#ifdef _IMMEDIATE_REFRESH
+static void twin_fbdev_damaged(void *closure)
+{
+ twin_fbdev_t *tf = closure;
+
+#if 0
+ DEBUG("fbdev damaged %d,%d,%d,%d, active=%d\n",
+ tf->screen->damage.left, tf->screen->damage.top,
+ tf->screen->damage.right, tf->screen->damage.bottom,
+ tf->active);
+#endif
+
+ if (tf->active && twin_screen_damaged (tf->screen))
+ twin_screen_update(tf->screen);
+}
+#endif /* _IMMEDIATE_REFRESH */
+
static void twin_fbdev_vtswitch(int sig)
{
signal(sig, twin_fbdev_vtswitch);
@@ -464,6 +487,9 @@ twin_fbdev_t *twin_fbdev_create(int wanted_vt, int switch_sig)
twin_set_file(twin_fbdev_read_events, tf->vt_fd, TWIN_READ, tf);
+#ifdef _IMMEDIATE_REFRESH
+ twin_screen_register_damaged(tf->screen, twin_fbdev_damaged, tf);
+#endif
twin_fb = tf;
return tf;