mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	terminal: Window operations
Implement OSC 1 (set window title), and some basic CSI t window operations. Signed-off-by: Callum Lowcay <callum@callumscode.com>
This commit is contained in:
		
							parent
							
								
									9d708b07e4
								
							
						
					
					
						commit
						ef57a9b788
					
				
					 3 changed files with 87 additions and 3 deletions
				
			
		| 
						 | 
					@ -54,8 +54,8 @@ static int option_fullscreen;
 | 
				
			||||||
#define ATTRMASK_CONCEALED	0x10
 | 
					#define ATTRMASK_CONCEALED	0x10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Buffer sizes */
 | 
					/* Buffer sizes */
 | 
				
			||||||
#define MAX_RESPONSE		11
 | 
					#define MAX_RESPONSE		256
 | 
				
			||||||
#define MAX_ESCAPE		64
 | 
					#define MAX_ESCAPE		255
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Terminal modes */
 | 
					/* Terminal modes */
 | 
				
			||||||
#define MODE_SHOW_CURSOR	0x00000001
 | 
					#define MODE_SHOW_CURSOR	0x00000001
 | 
				
			||||||
| 
						 | 
					@ -377,7 +377,7 @@ struct terminal {
 | 
				
			||||||
	int fd, master;
 | 
						int fd, master;
 | 
				
			||||||
	GIOChannel *channel;
 | 
						GIOChannel *channel;
 | 
				
			||||||
	uint32_t modifiers;
 | 
						uint32_t modifiers;
 | 
				
			||||||
	char escape[MAX_ESCAPE];
 | 
						char escape[MAX_ESCAPE+1];
 | 
				
			||||||
	int escape_length;
 | 
						int escape_length;
 | 
				
			||||||
	enum escape_state state;
 | 
						enum escape_state state;
 | 
				
			||||||
	enum escape_state outer_state;
 | 
						enum escape_state outer_state;
 | 
				
			||||||
| 
						 | 
					@ -1058,6 +1058,24 @@ handle_dcs(struct terminal *terminal)
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
handle_osc(struct terminal *terminal)
 | 
					handle_osc(struct terminal *terminal)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						char *p;
 | 
				
			||||||
 | 
						int code;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						terminal->escape[terminal->escape_length++] = '\0';
 | 
				
			||||||
 | 
						p = &terminal->escape[2];
 | 
				
			||||||
 | 
						code = strtol(p, &p, 10);
 | 
				
			||||||
 | 
						if (*p == ';') p++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (code) {
 | 
				
			||||||
 | 
						case 0: /* Icon name and window title */
 | 
				
			||||||
 | 
						case 1: /* Icon label */
 | 
				
			||||||
 | 
						case 2: /* Window title*/
 | 
				
			||||||
 | 
							window_set_title(terminal->window, p);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							fprintf(stderr, "Unknown OSC escape code %d\n", code);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					@ -1069,6 +1087,7 @@ handle_escape(struct terminal *terminal)
 | 
				
			||||||
	int i, count, x, y, top, bottom;
 | 
						int i, count, x, y, top, bottom;
 | 
				
			||||||
	int args[10], set[10] = { 0, };
 | 
						int args[10], set[10] = { 0, };
 | 
				
			||||||
	char response[MAX_RESPONSE] = {0, };
 | 
						char response[MAX_RESPONSE] = {0, };
 | 
				
			||||||
 | 
						struct rectangle allocation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	terminal->escape[terminal->escape_length++] = '\0';
 | 
						terminal->escape[terminal->escape_length++] = '\0';
 | 
				
			||||||
	i = 0;
 | 
						i = 0;
 | 
				
			||||||
| 
						 | 
					@ -1391,6 +1410,51 @@ handle_escape(struct terminal *terminal)
 | 
				
			||||||
		terminal->saved_row = terminal->row;
 | 
							terminal->saved_row = terminal->row;
 | 
				
			||||||
		terminal->saved_column = terminal->column;
 | 
							terminal->saved_column = terminal->column;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case 't':    /* windowOps */
 | 
				
			||||||
 | 
							if (!set[0]) break;
 | 
				
			||||||
 | 
							switch (args[0]) {
 | 
				
			||||||
 | 
							case 4:  /* resize px */
 | 
				
			||||||
 | 
								if (set[1] && set[2]) {
 | 
				
			||||||
 | 
									window_set_child_size(terminal->window,
 | 
				
			||||||
 | 
											      args[2], args[1]);
 | 
				
			||||||
 | 
									resize_handler(terminal->window,
 | 
				
			||||||
 | 
										       args[2], args[1], terminal);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 8:  /* resize ch */
 | 
				
			||||||
 | 
								if (set[1] && set[2]) {
 | 
				
			||||||
 | 
									terminal_resize(terminal, args[2], args[1]);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 13: /* report position */
 | 
				
			||||||
 | 
								window_get_child_allocation(terminal->window, &allocation);
 | 
				
			||||||
 | 
								snprintf(response, MAX_RESPONSE, "\e[3;%d;%dt",
 | 
				
			||||||
 | 
									 allocation.x, allocation.y);
 | 
				
			||||||
 | 
								write(terminal->master, response, strlen(response));
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 14: /* report px */
 | 
				
			||||||
 | 
								window_get_child_allocation(terminal->window, &allocation);
 | 
				
			||||||
 | 
								snprintf(response, MAX_RESPONSE, "\e[4;%d;%dt",
 | 
				
			||||||
 | 
									 allocation.height, allocation.width);
 | 
				
			||||||
 | 
								write(terminal->master, response, strlen(response));
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 18: /* report ch */
 | 
				
			||||||
 | 
								snprintf(response, MAX_RESPONSE, "\e[9;%d;%dt",
 | 
				
			||||||
 | 
									 terminal->height, terminal->width);
 | 
				
			||||||
 | 
								write(terminal->master, response, strlen(response));
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 21: /* report title */
 | 
				
			||||||
 | 
								snprintf(response, MAX_RESPONSE, "\e]l%s\e\\",
 | 
				
			||||||
 | 
									 window_get_title(terminal->window));
 | 
				
			||||||
 | 
								write(terminal->master, response, strlen(response));
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								if (args[0] >= 24)
 | 
				
			||||||
 | 
									terminal_resize(terminal, terminal->width, args[0]);
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									fprintf(stderr, "Unimplemented windowOp %d\n", args[0]);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	case 'u':
 | 
						case 'u':
 | 
				
			||||||
		terminal->row = terminal->saved_row;
 | 
							terminal->row = terminal->saved_row;
 | 
				
			||||||
		terminal->column = terminal->saved_column;
 | 
							terminal->column = terminal->saved_column;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1207,6 +1207,19 @@ window_set_keyboard_focus_handler(struct window *window,
 | 
				
			||||||
	window->keyboard_focus_handler = handler;
 | 
						window->keyboard_focus_handler = handler;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					window_set_title(struct window *window, const char *title)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						free((void*) window->title);
 | 
				
			||||||
 | 
						window->title = strdup(title);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *
 | 
				
			||||||
 | 
					window_get_title(struct window *window)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return window->title;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
window_damage(struct window *window, int32_t x, int32_t y,
 | 
					window_damage(struct window *window, int32_t x, int32_t y,
 | 
				
			||||||
	      int32_t width, int32_t height)
 | 
						      int32_t width, int32_t height)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -139,6 +139,7 @@ window_draw(struct window *window);
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
window_get_child_allocation(struct window *window,
 | 
					window_get_child_allocation(struct window *window,
 | 
				
			||||||
			    struct rectangle *allocation);
 | 
								    struct rectangle *allocation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
window_set_child_size(struct window *window, int32_t width, int32_t height);
 | 
					window_set_child_size(struct window *window, int32_t width, int32_t height);
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -220,6 +221,12 @@ void
 | 
				
			||||||
window_set_frame_handler(struct window *window,
 | 
					window_set_frame_handler(struct window *window,
 | 
				
			||||||
			 window_frame_handler_t handler);
 | 
								 window_frame_handler_t handler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					window_set_title(struct window *window, const char *title);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *
 | 
				
			||||||
 | 
					window_get_title(struct window *window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
display_set_drag_offer_handler(struct display *display,
 | 
					display_set_drag_offer_handler(struct display *display,
 | 
				
			||||||
			       display_drag_offer_handler_t handler);
 | 
								       display_drag_offer_handler_t handler);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue