terminal: Only add the new size to the title when we're resizing
Add a new state_changed_handler callback to the window to know when the window has changed state; the terminal will use this to know when the window started and ended its resize operation, and modify the terminal's titlebar accordingly.
This commit is contained in:
committed by
Kristian Høgsberg
parent
5befdda84f
commit
de6809912e
+24
-14
@@ -833,13 +833,27 @@ terminal_resize_cells(struct terminal *terminal,
|
|||||||
ioctl(terminal->master, TIOCSWINSZ, &ws);
|
ioctl(terminal->master, TIOCSWINSZ, &ws);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_title(struct terminal *terminal)
|
||||||
|
{
|
||||||
|
if (window_is_resizing(terminal->window)) {
|
||||||
|
char *p;
|
||||||
|
if (asprintf(&p, "%s — [%dx%d]", terminal->title, terminal->width, terminal->height) > 0) {
|
||||||
|
window_set_title(terminal->window, p);
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
window_set_title(terminal->window, terminal->title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
resize_handler(struct widget *widget,
|
resize_handler(struct widget *widget,
|
||||||
int32_t width, int32_t height, void *data)
|
int32_t width, int32_t height, void *data)
|
||||||
{
|
{
|
||||||
struct terminal *terminal = data;
|
struct terminal *terminal = data;
|
||||||
int32_t columns, rows, m;
|
int32_t columns, rows, m;
|
||||||
char *p;
|
|
||||||
m = 2 * terminal->margin;
|
m = 2 * terminal->margin;
|
||||||
columns = (width - m) / (int32_t) terminal->average_width;
|
columns = (width - m) / (int32_t) terminal->average_width;
|
||||||
rows = (height - m) / (int32_t) terminal->extents.height;
|
rows = (height - m) / (int32_t) terminal->extents.height;
|
||||||
@@ -849,14 +863,17 @@ resize_handler(struct widget *widget,
|
|||||||
width = columns * terminal->average_width + m;
|
width = columns * terminal->average_width + m;
|
||||||
height = rows * terminal->extents.height + m;
|
height = rows * terminal->extents.height + m;
|
||||||
widget_set_size(terminal->widget, width, height);
|
widget_set_size(terminal->widget, width, height);
|
||||||
if (asprintf(&p, "%s — [%dx%d]", terminal->title, columns, rows) > 0) {
|
|
||||||
window_set_title(terminal->window, p);
|
|
||||||
terminal->size_in_title = 1;
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
terminal_resize_cells(terminal, columns, rows);
|
terminal_resize_cells(terminal, columns, rows);
|
||||||
|
update_title(terminal);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
state_changed_handler(struct window *window, void *data)
|
||||||
|
{
|
||||||
|
struct terminal *terminal = data;
|
||||||
|
update_title(terminal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -2745,14 +2762,6 @@ static int
|
|||||||
enter_handler(struct widget *widget,
|
enter_handler(struct widget *widget,
|
||||||
struct input *input, float x, float y, void *data)
|
struct input *input, float x, float y, void *data)
|
||||||
{
|
{
|
||||||
struct terminal *terminal = data;
|
|
||||||
|
|
||||||
/* Reset title to get rid of resizing '[WxH]' in titlebar */
|
|
||||||
if (terminal->size_in_title) {
|
|
||||||
window_set_title(terminal->window, terminal->title);
|
|
||||||
terminal->size_in_title = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CURSOR_IBEAM;
|
return CURSOR_IBEAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2860,6 +2869,7 @@ terminal_create(struct display *display)
|
|||||||
window_set_fullscreen_handler(terminal->window, fullscreen_handler);
|
window_set_fullscreen_handler(terminal->window, fullscreen_handler);
|
||||||
window_set_output_handler(terminal->window, output_handler);
|
window_set_output_handler(terminal->window, output_handler);
|
||||||
window_set_close_handler(terminal->window, close_handler);
|
window_set_close_handler(terminal->window, close_handler);
|
||||||
|
window_set_state_changed_handler(terminal->window, state_changed_handler);
|
||||||
|
|
||||||
window_set_data_handler(terminal->window, data_handler);
|
window_set_data_handler(terminal->window, data_handler);
|
||||||
window_set_drop_handler(terminal->window, drop_handler);
|
window_set_drop_handler(terminal->window, drop_handler);
|
||||||
|
|||||||
@@ -241,6 +241,7 @@ struct window {
|
|||||||
window_close_handler_t close_handler;
|
window_close_handler_t close_handler;
|
||||||
window_fullscreen_handler_t fullscreen_handler;
|
window_fullscreen_handler_t fullscreen_handler;
|
||||||
window_output_handler_t output_handler;
|
window_output_handler_t output_handler;
|
||||||
|
window_state_changed_handler_t state_changed_handler;
|
||||||
|
|
||||||
struct surface *main_surface;
|
struct surface *main_surface;
|
||||||
struct xdg_surface *xdg_surface;
|
struct xdg_surface *xdg_surface;
|
||||||
@@ -3887,6 +3888,9 @@ handle_surface_configure(void *data, struct xdg_surface *xdg_surface,
|
|||||||
}
|
}
|
||||||
|
|
||||||
window->next_attach_serial = serial;
|
window->next_attach_serial = serial;
|
||||||
|
|
||||||
|
if (window->state_changed_handler)
|
||||||
|
window->state_changed_handler(window, window->user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -4178,6 +4182,12 @@ window_set_maximized(struct window *window, int maximized)
|
|||||||
xdg_surface_unset_maximized(window->xdg_surface);
|
xdg_surface_unset_maximized(window->xdg_surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
window_is_resizing(struct window *window)
|
||||||
|
{
|
||||||
|
return window->resizing;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
window_set_minimized(struct window *window)
|
window_set_minimized(struct window *window)
|
||||||
{
|
{
|
||||||
@@ -4246,6 +4256,13 @@ window_set_output_handler(struct window *window,
|
|||||||
window->output_handler = handler;
|
window->output_handler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
window_set_state_changed_handler(struct window *window,
|
||||||
|
window_state_changed_handler_t handler)
|
||||||
|
{
|
||||||
|
window->state_changed_handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
window_set_title(struct window *window, const char *title)
|
window_set_title(struct window *window, const char *title)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -219,6 +219,8 @@ typedef void (*window_fullscreen_handler_t)(struct window *window, void *data);
|
|||||||
|
|
||||||
typedef void (*window_output_handler_t)(struct window *window, struct output *output,
|
typedef void (*window_output_handler_t)(struct window *window, struct output *output,
|
||||||
int enter, void *data);
|
int enter, void *data);
|
||||||
|
typedef void (*window_state_changed_handler_t)(struct window *window,
|
||||||
|
void *data);
|
||||||
|
|
||||||
typedef void (*widget_resize_handler_t)(struct widget *widget,
|
typedef void (*widget_resize_handler_t)(struct widget *widget,
|
||||||
int32_t width, int32_t height,
|
int32_t width, int32_t height,
|
||||||
@@ -381,6 +383,9 @@ window_is_maximized(struct window *window);
|
|||||||
void
|
void
|
||||||
window_set_maximized(struct window *window, int maximized);
|
window_set_maximized(struct window *window, int maximized);
|
||||||
|
|
||||||
|
int
|
||||||
|
window_is_resizing(struct window *window);
|
||||||
|
|
||||||
void
|
void
|
||||||
window_set_minimized(struct window *window);
|
window_set_minimized(struct window *window);
|
||||||
|
|
||||||
@@ -415,6 +420,9 @@ window_set_fullscreen_handler(struct window *window,
|
|||||||
void
|
void
|
||||||
window_set_output_handler(struct window *window,
|
window_set_output_handler(struct window *window,
|
||||||
window_output_handler_t handler);
|
window_output_handler_t handler);
|
||||||
|
void
|
||||||
|
window_set_state_changed_handler(struct window *window,
|
||||||
|
window_state_changed_handler_t handler);
|
||||||
|
|
||||||
void
|
void
|
||||||
window_set_title(struct window *window, const char *title);
|
window_set_title(struct window *window, const char *title);
|
||||||
|
|||||||
Reference in New Issue
Block a user