summaryrefslogtreecommitdiffstats
path: root/terminal.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2008-12-08 11:13:26 -0500
committerKristian Høgsberg <krh@redhat.com>2008-12-08 11:13:26 -0500
commit721f09f187c8a60e1084d8d88b423c4910048a20 (patch)
tree2b2129dd3118b7b8828a1db05db109153af34cd1 /terminal.c
parentc47303f2d23884bf7e76200f7582ac2f50d966d6 (diff)
downloadwayland-721f09f187c8a60e1084d8d88b423c4910048a20.tar.gz
wayland-721f09f187c8a60e1084d8d88b423c4910048a20.tar.xz
wayland-721f09f187c8a60e1084d8d88b423c4910048a20.zip
Make sure we don't miss queue redraws between commit and ack.
Diffstat (limited to 'terminal.c')
-rw-r--r--terminal.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/terminal.c b/terminal.c
index f210341..923539e 100644
--- a/terminal.c
+++ b/terminal.c
@@ -53,7 +53,7 @@ static const char socket_name[] = "\0wayland";
struct terminal {
struct window *window;
struct wl_display *display;
- int resize_scheduled;
+ int redraw_scheduled, redraw_pending;
char *data;
int width, height, tail, row, column, total_rows;
int fd, master;
@@ -126,6 +126,17 @@ idle_redraw(void *data)
#define STATE_SKIP_TO_ALPHA 1
static void
+terminal_schedule_redraw(struct terminal *terminal)
+{
+ if (!terminal->redraw_scheduled) {
+ g_idle_add(idle_redraw, terminal);
+ terminal->redraw_scheduled = 1;
+ } else {
+ terminal->redraw_pending = 1;
+ }
+}
+
+static void
terminal_data(struct terminal *terminal, const char *data, size_t length)
{
int i;
@@ -171,6 +182,8 @@ terminal_data(struct terminal *terminal, const char *data, size_t length)
break;
}
}
+
+ terminal_schedule_redraw(terminal);
}
static void
@@ -178,10 +191,7 @@ resize_handler(struct window *window, int32_t width, int32_t height, void *data)
{
struct terminal *terminal = data;
- if (!terminal->resize_scheduled) {
- g_idle_add(idle_redraw, terminal);
- terminal->resize_scheduled = 1;
- }
+ terminal_schedule_redraw(terminal);
}
static void
@@ -189,8 +199,13 @@ acknowledge_handler(struct window *window, uint32_t key, void *data)
{
struct terminal *terminal = data;
- terminal->resize_scheduled = 0;
+ terminal->redraw_scheduled = 0;
buffer_destroy(terminal->buffer, terminal->fd);
+
+ if (terminal->redraw_pending) {
+ terminal->redraw_pending = 0;
+ terminal_schedule_redraw(terminal);
+ }
}
struct key {
@@ -319,7 +334,7 @@ terminal_create(struct wl_display *display, int fd)
terminal->window = window_create(display, fd, "Wayland Terminal",
500, 100, 500, 400);
terminal->display = display;
- terminal->resize_scheduled = 1;
+ terminal->redraw_scheduled = 1;
terminal->width = 80;
terminal->height = 25;
size = (terminal->width + 1) * terminal->height;
@@ -348,11 +363,6 @@ io_handler(GIOChannel *source,
terminal_data(terminal, buffer, bytes_read);
- if (!terminal->resize_scheduled) {
- g_idle_add(idle_redraw, terminal);
- terminal->resize_scheduled = 1;
- }
-
return TRUE;
}