Merge branch 'wayland-fixes' of https://github.com/Nefsen402/kitty
This commit is contained in:
commit
064d0fa6f1
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;
|
||||||
|
|||||||
8
glfw/wl_platform.h
vendored
8
glfw/wl_platform.h
vendored
@ -127,11 +127,16 @@ typedef enum WaylandWindowState {
|
|||||||
|
|
||||||
static const WaylandWindowState TOPLEVEL_STATE_DOCKED = TOPLEVEL_STATE_MAXIMIZED | TOPLEVEL_STATE_FULLSCREEN | TOPLEVEL_STATE_TILED_TOP | TOPLEVEL_STATE_TILED_LEFT | TOPLEVEL_STATE_TILED_RIGHT | TOPLEVEL_STATE_TILED_BOTTOM;
|
static const WaylandWindowState TOPLEVEL_STATE_DOCKED = TOPLEVEL_STATE_MAXIMIZED | TOPLEVEL_STATE_FULLSCREEN | TOPLEVEL_STATE_TILED_TOP | TOPLEVEL_STATE_TILED_LEFT | TOPLEVEL_STATE_TILED_RIGHT | TOPLEVEL_STATE_TILED_BOTTOM;
|
||||||
|
|
||||||
|
enum WaylandWindowPendingState {
|
||||||
|
PENDING_STATE_TOPLEVEL = 1,
|
||||||
|
PENDING_STATE_DECORATION = 2
|
||||||
|
};
|
||||||
|
|
||||||
// Wayland-specific per-window data
|
// Wayland-specific per-window data
|
||||||
//
|
//
|
||||||
typedef struct _GLFWwindowWayland
|
typedef struct _GLFWwindowWayland
|
||||||
{
|
{
|
||||||
|
int width, height;
|
||||||
bool visible;
|
bool visible;
|
||||||
bool hovered;
|
bool hovered;
|
||||||
bool transparent;
|
bool transparent;
|
||||||
@ -216,10 +221,11 @@ typedef struct _GLFWwindowWayland
|
|||||||
unsigned int x, y;
|
unsigned int x, y;
|
||||||
} axis_discrete_count;
|
} axis_discrete_count;
|
||||||
|
|
||||||
|
uint32_t pending_state;
|
||||||
struct {
|
struct {
|
||||||
int width, height;
|
int width, height;
|
||||||
uint32_t toplevel_states;
|
uint32_t toplevel_states;
|
||||||
bool set;
|
uint32_t decoration_mode;
|
||||||
} current, pending;
|
} current, pending;
|
||||||
} _GLFWwindowWayland;
|
} _GLFWwindowWayland;
|
||||||
|
|
||||||
|
|||||||
90
glfw/wl_window.c
vendored
90
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);
|
||||||
@ -234,14 +234,14 @@ clipboard_mime(void) {
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static bool
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,6 +252,8 @@ dispatchChangesAfterConfigure(_GLFWwindow *window, int32_t width, int32_t height
|
|||||||
}
|
}
|
||||||
|
|
||||||
_glfwInputWindowDamage(window);
|
_glfwInputWindowDamage(window);
|
||||||
|
|
||||||
|
return size_changed || scale_changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -269,24 +271,8 @@ xdgDecorationHandleConfigure(void* data,
|
|||||||
uint32_t mode)
|
uint32_t mode)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = data;
|
_GLFWwindow* window = data;
|
||||||
|
window->wl.pending.decoration_mode = mode;
|
||||||
bool has_server_side_decorations = (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
window->wl.pending_state |= PENDING_STATE_DECORATION;
|
||||||
debug("XDG decoration configure event received: has_server_side_decorations: %d\n", has_server_side_decorations);
|
|
||||||
if (has_server_side_decorations == window->wl.decorations.serverSide) return;
|
|
||||||
window->wl.decorations.serverSide = has_server_side_decorations;
|
|
||||||
int width = window->wl.current.width, height = window->wl.current.height;
|
|
||||||
if (window->wl.decorations.serverSide) {
|
|
||||||
free_csd_surfaces(window);
|
|
||||||
height += window->wl.decorations.metrics.visible_titlebar_height;
|
|
||||||
} else {
|
|
||||||
ensure_csd_resources(window);
|
|
||||||
}
|
|
||||||
set_csd_window_geometry(window, &width, &height);
|
|
||||||
dispatchChangesAfterConfigure(window, width, height);
|
|
||||||
ensure_csd_resources(window);
|
|
||||||
wl_surface_commit(window->wl.surface);
|
|
||||||
debug("final window content size: %dx%d\n", window->wl.current.width, window->wl.current.height);
|
|
||||||
inform_compositor_of_window_geometry(window, "configure-decorations");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct zxdg_toplevel_decoration_v1_listener xdgDecorationListener = {
|
static const struct zxdg_toplevel_decoration_v1_listener xdgDecorationListener = {
|
||||||
@ -384,8 +370,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;
|
||||||
@ -479,7 +465,7 @@ xdgToplevelHandleConfigure(void* data,
|
|||||||
window->wl.pending.toplevel_states = new_states;
|
window->wl.pending.toplevel_states = new_states;
|
||||||
window->wl.pending.width = width;
|
window->wl.pending.width = width;
|
||||||
window->wl.pending.height = height;
|
window->wl.pending.height = height;
|
||||||
window->wl.pending.set = true;
|
window->wl.pending_state |= PENDING_STATE_TOPLEVEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xdgToplevelHandleClose(void* data,
|
static void xdgToplevelHandleClose(void* data,
|
||||||
@ -500,11 +486,10 @@ static void xdgSurfaceHandleConfigure(void* data,
|
|||||||
{
|
{
|
||||||
_GLFWwindow* window = data;
|
_GLFWwindow* window = data;
|
||||||
xdg_surface_ack_configure(surface, serial);
|
xdg_surface_ack_configure(surface, serial);
|
||||||
if (window->wl.pending.set) {
|
if (window->wl.pending_state & PENDING_STATE_TOPLEVEL) {
|
||||||
uint32_t new_states = window->wl.pending.toplevel_states;
|
uint32_t new_states = window->wl.pending.toplevel_states;
|
||||||
int width = window->wl.pending.width;
|
int width = window->wl.pending.width;
|
||||||
int height = window->wl.pending.height;
|
int height = window->wl.pending.height;
|
||||||
window->wl.pending.set = false;
|
|
||||||
|
|
||||||
if (new_states != window->wl.current.toplevel_states ||
|
if (new_states != window->wl.current.toplevel_states ||
|
||||||
width != window->wl.current.width ||
|
width != window->wl.current.width ||
|
||||||
@ -512,16 +497,41 @@ static void xdgSurfaceHandleConfigure(void* data,
|
|||||||
|
|
||||||
bool live_resize_done = !(new_states & TOPLEVEL_STATE_RESIZING) && (window->wl.current.toplevel_states & TOPLEVEL_STATE_RESIZING);
|
bool live_resize_done = !(new_states & TOPLEVEL_STATE_RESIZING) && (window->wl.current.toplevel_states & TOPLEVEL_STATE_RESIZING);
|
||||||
window->wl.current.toplevel_states = new_states;
|
window->wl.current.toplevel_states = new_states;
|
||||||
set_csd_window_geometry(window, &width, &height);
|
window->wl.current.width = width;
|
||||||
dispatchChangesAfterConfigure(window, width, height);
|
window->wl.current.height = 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);
|
|
||||||
inform_compositor_of_window_geometry(window, "configure");
|
|
||||||
if (live_resize_done) _glfwInputLiveResize(window, false);
|
if (live_resize_done) _glfwInputLiveResize(window, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wl_surface_commit(window->wl.surface);
|
|
||||||
|
if (window->wl.pending_state & PENDING_STATE_DECORATION) {
|
||||||
|
uint32_t mode = window->wl.pending.decoration_mode;
|
||||||
|
bool has_server_side_decorations = (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
||||||
|
debug("XDG decoration configure event received: has_server_side_decorations: %d\n", has_server_side_decorations);
|
||||||
|
window->wl.decorations.serverSide = has_server_side_decorations;
|
||||||
|
window->wl.current.decoration_mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool resized = false;
|
||||||
|
if (window->wl.pending_state) {
|
||||||
|
int width = window->wl.pending.width, height = window->wl.pending.height;
|
||||||
|
set_csd_window_geometry(window, &width, &height);
|
||||||
|
resized = dispatchChangesAfterConfigure(window, width, height);
|
||||||
|
if (window->wl.decorations.serverSide) {
|
||||||
|
free_csd_surfaces(window);
|
||||||
|
} else {
|
||||||
|
ensure_csd_resources(window);
|
||||||
|
}
|
||||||
|
debug("final window content size: %dx%d\n", width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
inform_compositor_of_window_geometry(window, "configure");
|
||||||
|
|
||||||
|
if (!resized) {
|
||||||
|
wl_surface_commit(window->wl.surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
window->wl.pending_state = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct xdg_surface_listener xdgSurfaceListener = {
|
static const struct xdg_surface_listener xdgSurfaceListener = {
|
||||||
@ -904,19 +914,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