wayland: Fix CSD size calculations
This is a partial revert of e359094cff68ec6cc26af407c2b924e5991eeec1
window->wl.{width, height} and window->wl.current.{width, height}
represent different things. The former represents the actual size of the
egl surface viewport used for terminal rendering. The former represents
the size of the entire window including the CSD (client side decorations).
These numbers should be the same if CSD is disabled.
This commit is contained in:
parent
4013544efb
commit
d4b048735d
18
glfw/wl_client_side_decorations.c
vendored
18
glfw/wl_client_side_decorations.c
vendored
@ -263,11 +263,11 @@ static bool
|
|||||||
create_shm_buffers(_GLFWwindow* window) {
|
create_shm_buffers(_GLFWwindow* window) {
|
||||||
const unsigned scale = window->wl.scale >= 1 ? window->wl.scale : 1;
|
const unsigned scale = window->wl.scale >= 1 ? window->wl.scale : 1;
|
||||||
|
|
||||||
const size_t vertical_width = decs.metrics.width, vertical_height = window->wl.current.height + decs.metrics.top;
|
const size_t vertical_width = decs.metrics.width, vertical_height = window->wl.height + decs.metrics.top;
|
||||||
const size_t horizontal_height = decs.metrics.width, horizontal_width = window->wl.current.width + 2 * decs.metrics.width;
|
const size_t horizontal_height = decs.metrics.width, horizontal_width = window->wl.width + 2 * decs.metrics.width;
|
||||||
|
|
||||||
decs.mapping.size = 0;
|
decs.mapping.size = 0;
|
||||||
decs.mapping.size += init_buffer_pair(&decs.top.buffer, window->wl.current.width, decs.metrics.top, scale);
|
decs.mapping.size += init_buffer_pair(&decs.top.buffer, window->wl.width, decs.metrics.top, scale);
|
||||||
decs.mapping.size += init_buffer_pair(&decs.left.buffer, vertical_width, vertical_height, scale);
|
decs.mapping.size += init_buffer_pair(&decs.left.buffer, vertical_width, vertical_height, scale);
|
||||||
decs.mapping.size += init_buffer_pair(&decs.bottom.buffer, horizontal_width, horizontal_height, scale);
|
decs.mapping.size += init_buffer_pair(&decs.bottom.buffer, horizontal_width, horizontal_height, scale);
|
||||||
decs.mapping.size += init_buffer_pair(&decs.right.buffer, vertical_width, vertical_height, scale);
|
decs.mapping.size += init_buffer_pair(&decs.right.buffer, vertical_width, vertical_height, scale);
|
||||||
@ -347,8 +347,8 @@ ensure_csd_resources(_GLFWwindow *window) {
|
|||||||
const bool is_focused = window->id == _glfw.focusedWindowId;
|
const bool is_focused = window->id == _glfw.focusedWindowId;
|
||||||
const bool focus_changed = is_focused != decs.for_window_state.focused;
|
const bool focus_changed = is_focused != decs.for_window_state.focused;
|
||||||
const bool size_changed = (
|
const bool size_changed = (
|
||||||
decs.for_window_state.width != window->wl.current.width ||
|
decs.for_window_state.width != window->wl.width ||
|
||||||
decs.for_window_state.height != window->wl.current.height ||
|
decs.for_window_state.height != window->wl.height ||
|
||||||
decs.for_window_state.scale != window->wl.scale ||
|
decs.for_window_state.scale != window->wl.scale ||
|
||||||
!decs.mapping.data
|
!decs.mapping.data
|
||||||
);
|
);
|
||||||
@ -368,11 +368,11 @@ ensure_csd_resources(_GLFWwindow *window) {
|
|||||||
if (!decs.left.surface) create_csd_surfaces(window, &decs.left);
|
if (!decs.left.surface) create_csd_surfaces(window, &decs.left);
|
||||||
position_csd_surface(&decs.left, x, y, scale);
|
position_csd_surface(&decs.left, x, y, scale);
|
||||||
|
|
||||||
x = -decs.metrics.width; y = window->wl.current.height;
|
x = -decs.metrics.width; y = window->wl.height;
|
||||||
if (!decs.bottom.surface) create_csd_surfaces(window, &decs.bottom);
|
if (!decs.bottom.surface) create_csd_surfaces(window, &decs.bottom);
|
||||||
position_csd_surface(&decs.bottom, x, y, scale);
|
position_csd_surface(&decs.bottom, x, y, scale);
|
||||||
|
|
||||||
x = window->wl.current.width; y = -decs.metrics.top;
|
x = window->wl.width; y = -decs.metrics.top;
|
||||||
if (!decs.right.surface) create_csd_surfaces(window, &decs.right);
|
if (!decs.right.surface) create_csd_surfaces(window, &decs.right);
|
||||||
position_csd_surface(&decs.right, x, y, scale);
|
position_csd_surface(&decs.right, x, y, scale);
|
||||||
|
|
||||||
@ -382,8 +382,8 @@ ensure_csd_resources(_GLFWwindow *window) {
|
|||||||
damage_csd(bottom, is_focused ? decs.bottom.buffer.front : decs.bottom.buffer.back);
|
damage_csd(bottom, is_focused ? decs.bottom.buffer.front : decs.bottom.buffer.back);
|
||||||
damage_csd(right, is_focused ? decs.right.buffer.front : decs.right.buffer.back);
|
damage_csd(right, is_focused ? decs.right.buffer.front : decs.right.buffer.back);
|
||||||
|
|
||||||
decs.for_window_state.width = window->wl.current.width;
|
decs.for_window_state.width = window->wl.width;
|
||||||
decs.for_window_state.height = window->wl.current.height;
|
decs.for_window_state.height = window->wl.height;
|
||||||
decs.for_window_state.scale = window->wl.scale;
|
decs.for_window_state.scale = window->wl.scale;
|
||||||
decs.for_window_state.focused = is_focused;
|
decs.for_window_state.focused = is_focused;
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
4
glfw/wl_init.c
vendored
4
glfw/wl_init.c
vendored
@ -206,7 +206,7 @@ static void pointerHandleMotion(void* data UNUSED,
|
|||||||
case BOTTOM_DECORATION:
|
case BOTTOM_DECORATION:
|
||||||
if (x < window->wl.decorations.metrics.width)
|
if (x < window->wl.decorations.metrics.width)
|
||||||
cursorShape = GLFW_SW_RESIZE_CURSOR;
|
cursorShape = GLFW_SW_RESIZE_CURSOR;
|
||||||
else if (x > window->wl.current.width + window->wl.decorations.metrics.width)
|
else if (x > window->wl.width + window->wl.decorations.metrics.width)
|
||||||
cursorShape = GLFW_SE_RESIZE_CURSOR;
|
cursorShape = GLFW_SE_RESIZE_CURSOR;
|
||||||
else
|
else
|
||||||
cursorShape = GLFW_VRESIZE_CURSOR;
|
cursorShape = GLFW_VRESIZE_CURSOR;
|
||||||
@ -274,7 +274,7 @@ static void pointerHandleButton(void* data UNUSED,
|
|||||||
case BOTTOM_DECORATION:
|
case BOTTOM_DECORATION:
|
||||||
if (x < window->wl.decorations.metrics.width)
|
if (x < window->wl.decorations.metrics.width)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT;
|
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT;
|
||||||
else if (x > window->wl.current.width + window->wl.decorations.metrics.width)
|
else if (x > window->wl.width + window->wl.decorations.metrics.width)
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT;
|
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT;
|
||||||
else
|
else
|
||||||
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM;
|
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM;
|
||||||
|
|||||||
1
glfw/wl_platform.h
vendored
1
glfw/wl_platform.h
vendored
@ -132,6 +132,7 @@ static const WaylandWindowState TOPLEVEL_STATE_DOCKED = TOPLEVEL_STATE_MAXIMIZED
|
|||||||
//
|
//
|
||||||
typedef struct _GLFWwindowWayland
|
typedef struct _GLFWwindowWayland
|
||||||
{
|
{
|
||||||
|
int width, height;
|
||||||
bool visible;
|
bool visible;
|
||||||
bool hovered;
|
bool hovered;
|
||||||
bool transparent;
|
bool transparent;
|
||||||
|
|||||||
26
glfw/wl_window.c
vendored
26
glfw/wl_window.c
vendored
@ -206,7 +206,7 @@ static void setOpaqueRegion(_GLFWwindow* window)
|
|||||||
if (!region)
|
if (!region)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wl_region_add(region, 0, 0, window->wl.current.width, window->wl.current.height);
|
wl_region_add(region, 0, 0, window->wl.width, window->wl.height);
|
||||||
wl_surface_set_opaque_region(window->wl.surface, region);
|
wl_surface_set_opaque_region(window->wl.surface, region);
|
||||||
wl_surface_commit(window->wl.surface);
|
wl_surface_commit(window->wl.surface);
|
||||||
wl_region_destroy(region);
|
wl_region_destroy(region);
|
||||||
@ -216,9 +216,9 @@ static void setOpaqueRegion(_GLFWwindow* window)
|
|||||||
static void
|
static void
|
||||||
resizeFramebuffer(_GLFWwindow* window) {
|
resizeFramebuffer(_GLFWwindow* window) {
|
||||||
int scale = window->wl.scale;
|
int scale = window->wl.scale;
|
||||||
int scaledWidth = window->wl.current.width * scale;
|
int scaledWidth = window->wl.width * scale;
|
||||||
int scaledHeight = window->wl.current.height * scale;
|
int scaledHeight = window->wl.height * scale;
|
||||||
debug("Resizing framebuffer to: %dx%d at scale: %d\n", window->wl.current.width, window->wl.current.height, scale);
|
debug("Resizing framebuffer to: %dx%d at scale: %d\n", window->wl.width, window->wl.height, scale);
|
||||||
wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0);
|
wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0);
|
||||||
if (!window->wl.transparent) setOpaqueRegion(window);
|
if (!window->wl.transparent) setOpaqueRegion(window);
|
||||||
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight);
|
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight);
|
||||||
@ -236,12 +236,12 @@ clipboard_mime(void) {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
dispatchChangesAfterConfigure(_GLFWwindow *window, int32_t width, int32_t height) {
|
dispatchChangesAfterConfigure(_GLFWwindow *window, int32_t width, int32_t height) {
|
||||||
bool size_changed = width != window->wl.current.width || height != window->wl.current.height;
|
bool size_changed = width != window->wl.width || height != window->wl.height;
|
||||||
bool scale_changed = checkScaleChange(window);
|
bool scale_changed = checkScaleChange(window);
|
||||||
|
|
||||||
if (size_changed) {
|
if (size_changed) {
|
||||||
_glfwInputWindowSize(window, width, height);
|
_glfwInputWindowSize(window, width, height);
|
||||||
window->wl.current.width = width; window->wl.current.height = height;
|
window->wl.width = width; window->wl.height = height;
|
||||||
resizeFramebuffer(window);
|
resizeFramebuffer(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,8 +384,8 @@ static bool createSurface(_GLFWwindow* window,
|
|||||||
if (!window->wl.native)
|
if (!window->wl.native)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
window->wl.current.width = wndconfig->width;
|
window->wl.width = wndconfig->width;
|
||||||
window->wl.current.height = wndconfig->height;
|
window->wl.height = wndconfig->height;
|
||||||
window->wl.user_requested_content_size.width = wndconfig->width;
|
window->wl.user_requested_content_size.width = wndconfig->width;
|
||||||
window->wl.user_requested_content_size.height = wndconfig->height;
|
window->wl.user_requested_content_size.height = wndconfig->height;
|
||||||
window->wl.scale = 1;
|
window->wl.scale = 1;
|
||||||
@ -514,6 +514,8 @@ static void xdgSurfaceHandleConfigure(void* data,
|
|||||||
window->wl.current.toplevel_states = new_states;
|
window->wl.current.toplevel_states = new_states;
|
||||||
set_csd_window_geometry(window, &width, &height);
|
set_csd_window_geometry(window, &width, &height);
|
||||||
dispatchChangesAfterConfigure(window, width, height);
|
dispatchChangesAfterConfigure(window, width, height);
|
||||||
|
window->wl.current.width = width;
|
||||||
|
window->wl.current.height = height;
|
||||||
debug("final window content size: %dx%d\n", window->wl.current.width, window->wl.current.height);
|
debug("final window content size: %dx%d\n", window->wl.current.width, window->wl.current.height);
|
||||||
_glfwInputWindowFocus(window, window->wl.current.toplevel_states & TOPLEVEL_STATE_ACTIVATED);
|
_glfwInputWindowFocus(window, window->wl.current.toplevel_states & TOPLEVEL_STATE_ACTIVATED);
|
||||||
ensure_csd_resources(window);
|
ensure_csd_resources(window);
|
||||||
@ -904,19 +906,19 @@ void _glfwPlatformSetWindowPos(_GLFWwindow* window UNUSED, int xpos UNUSED, int
|
|||||||
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
||||||
{
|
{
|
||||||
if (width)
|
if (width)
|
||||||
*width = window->wl.current.width;
|
*width = window->wl.width;
|
||||||
if (height)
|
if (height)
|
||||||
*height = window->wl.current.height;
|
*height = window->wl.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
if (width != window->wl.current.width || height != window->wl.current.height) {
|
if (width != window->wl.width || height != window->wl.height) {
|
||||||
window->wl.user_requested_content_size.width = width;
|
window->wl.user_requested_content_size.width = width;
|
||||||
window->wl.user_requested_content_size.height = height;
|
window->wl.user_requested_content_size.height = height;
|
||||||
int32_t w = 0, h = 0;
|
int32_t w = 0, h = 0;
|
||||||
set_csd_window_geometry(window, &w, &h);
|
set_csd_window_geometry(window, &w, &h);
|
||||||
window->wl.current.width = w; window->wl.current.height = h;
|
window->wl.width = w; window->wl.height = h;
|
||||||
resizeFramebuffer(window);
|
resizeFramebuffer(window);
|
||||||
ensure_csd_resources(window);
|
ensure_csd_resources(window);
|
||||||
wl_surface_commit(window->wl.surface);
|
wl_surface_commit(window->wl.surface);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user