mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	Make sure we don't miss queue redraws between commit and ack.
This commit is contained in:
		
							parent
							
								
									c47303f2d2
								
							
						
					
					
						commit
						721f09f187
					
				
					 1 changed files with 22 additions and 12 deletions
				
			
		
							
								
								
									
										34
									
								
								terminal.c
									
										
									
									
									
								
							
							
						
						
									
										34
									
								
								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;
 | 
			
		||||
| 
						 | 
				
			
			@ -125,6 +125,17 @@ idle_redraw(void *data)
 | 
			
		|||
#define STATE_NORMAL 0
 | 
			
		||||
#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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue