diff options
author | Kristian Høgsberg <krh@redhat.com> | 2008-12-08 11:13:26 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2008-12-08 11:13:26 -0500 |
commit | 721f09f187c8a60e1084d8d88b423c4910048a20 (patch) | |
tree | 2b2129dd3118b7b8828a1db05db109153af34cd1 /terminal.c | |
parent | c47303f2d23884bf7e76200f7582ac2f50d966d6 (diff) | |
download | wayland-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.c | 34 |
1 files changed, 22 insertions, 12 deletions
@@ -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; } |