Change the maximize icon to restore when window is maximized

This commit is contained in:
Kovid Goyal 2024-04-08 09:36:38 +05:30
parent aebfab3777
commit d630b3d8a7
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
2 changed files with 10 additions and 6 deletions

View file

@ -172,6 +172,7 @@ csd_initialize_metrics(_GLFWwindow *window) {
static void
render_title_bar(_GLFWwindow *window, bool to_front_buffer) {
const bool is_focused = window->id == _glfw.focusedWindowId;
const bool is_maximized = window->wl.current.toplevel_states & TOPLEVEL_STATE_MAXIMIZED;
const uint32_t light_fg = is_focused ? 0xff444444 : 0xff888888, light_bg = is_focused ? 0xffdddad6 : 0xffeeeeee;
const uint32_t dark_fg = is_focused ? 0xffffffff : 0xffcccccc, dark_bg = is_focused ? 0xff303030 : 0xff242424;
static const uint32_t hover_dark_bg = 0xff444444, hover_light_bg = 0xffbbbbbb;
@ -210,7 +211,7 @@ render_buttons:
decs.which.left = left; decs.which.width = button_size; left += button_size; \
}
if (window->wl.wm_capabilities.minimize) draw(minimize, "🗕", hover_bg);
if (window->wl.wm_capabilities.maximize) draw(maximize, "🗖", hover_bg);
if (window->wl.wm_capabilities.maximize) draw(maximize, is_maximized ? "🗗" : "🗖", hover_bg);
draw(close, "🗙", is_dark ? 0xff880000: 0xffc80000);
#undef draw
}
@ -413,9 +414,10 @@ ensure_csd_resources(_GLFWwindow *window) {
decs.for_window_state.fscale != _glfwWaylandWindowScale(window) ||
!decs.mapping.data
);
const bool needs_update = focus_changed || size_changed || !decs.titlebar.surface || decs.buffer_destroyed;
debug("CSD: old.size: %dx%d new.size: %dx%d needs_update: %d size_changed: %d buffer_destroyed: %d\n",
decs.for_window_state.width, decs.for_window_state.height, window->wl.width, window->wl.height, needs_update, size_changed, decs.buffer_destroyed);
const bool state_changed = decs.for_window_state.toplevel_states != window->wl.current.toplevel_states;
const bool needs_update = focus_changed || size_changed || !decs.titlebar.surface || decs.buffer_destroyed || state_changed;
debug("CSD: old.size: %dx%d new.size: %dx%d needs_update: %d size_changed: %d state_changed: %d buffer_destroyed: %d\n",
decs.for_window_state.width, decs.for_window_state.height, window->wl.width, window->wl.height, needs_update, size_changed, state_changed, decs.buffer_destroyed);
if (!needs_update) return false;
if (size_changed || decs.buffer_destroyed) {
free_csd_buffers(window);
@ -437,7 +439,7 @@ ensure_csd_resources(_GLFWwindow *window) {
setup_surface(shadow_lower_left, decs.shadow_left.x, decs.shadow_bottom.y);
setup_surface(shadow_lower_right, decs.shadow_right.x, decs.shadow_bottom.y);
if (focus_changed) update_title_bar(window);
if (focus_changed || state_changed) update_title_bar(window);
damage_csd(titlebar, decs.titlebar.buffer.front);
#define d(which) damage_csd(which, is_focused ? decs.which.buffer.front : decs.which.buffer.back);
d(shadow_left); d(shadow_right); d(shadow_top); d(shadow_bottom);
@ -448,6 +450,7 @@ ensure_csd_resources(_GLFWwindow *window) {
decs.for_window_state.height = window->wl.height;
decs.for_window_state.fscale = _glfwWaylandWindowScale(window);
decs.for_window_state.focused = is_focused;
decs.for_window_state.toplevel_states = window->wl.current.toplevel_states;
return true;
}

3
glfw/wl_platform.h vendored
View file

@ -213,6 +213,7 @@ typedef struct _GLFWwindowWayland
int width, height;
bool focused;
float fscale;
WaylandWindowState toplevel_states;
} for_window_state;
struct {
@ -263,7 +264,7 @@ typedef struct _GLFWwindowWayland
uint32_t pending_state;
struct {
int width, height;
uint32_t toplevel_states;
WaylandWindowState toplevel_states;
uint32_t decoration_mode;
} current, pending;
} _GLFWwindowWayland;