|
|
|
@ -60,8 +60,8 @@ static void handleConfigure(void* data, |
|
|
|
|
{ |
|
|
|
|
if (window->decorated) |
|
|
|
|
{ |
|
|
|
|
width -= 2 * _GLFW_DECORATION_WIDTH; |
|
|
|
|
height -= _GLFW_DECORATION_TOP + _GLFW_DECORATION_WIDTH; |
|
|
|
|
width -= _GLFW_DECORATION_HORIZONTAL; |
|
|
|
|
height -= _GLFW_DECORATION_VERTICAL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE) |
|
|
|
@ -260,7 +260,7 @@ static void createDecorations(_GLFWwindow* window) |
|
|
|
|
_GLFW_DECORATION_WIDTH, window->wl.height + _GLFW_DECORATION_TOP); |
|
|
|
|
createDecoration(&window->wl.decorations.bottom, window->wl.surface, buffer, |
|
|
|
|
-_GLFW_DECORATION_WIDTH, window->wl.height, |
|
|
|
|
window->wl.width + 2 * _GLFW_DECORATION_WIDTH, _GLFW_DECORATION_WIDTH); |
|
|
|
|
window->wl.width + _GLFW_DECORATION_HORIZONTAL, _GLFW_DECORATION_WIDTH); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void destroyDecoration(_GLFWdecorationWayland* decoration) |
|
|
|
@ -281,15 +281,39 @@ static void destroyDecorations(_GLFWwindow* window) |
|
|
|
|
destroyDecoration(&window->wl.decorations.bottom); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void resizeWindow(_GLFWwindow* window, int width, int height) |
|
|
|
|
// Makes the surface considered as XRGB instead of ARGB.
|
|
|
|
|
static void setOpaqueRegion(_GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
wl_egl_window_resize(window->wl.native, width, height, 0, 0); |
|
|
|
|
struct wl_region* region; |
|
|
|
|
|
|
|
|
|
region = wl_compositor_create_region(_glfw.wl.compositor); |
|
|
|
|
if (!region) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
wl_region_add(region, 0, 0, window->wl.width, window->wl.height); |
|
|
|
|
wl_surface_set_opaque_region(window->wl.surface, region); |
|
|
|
|
wl_surface_commit(window->wl.surface); |
|
|
|
|
wl_region_destroy(region); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void resizeWindow(_GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
int scale = window->wl.scale; |
|
|
|
|
int scaledWidth = window->wl.width * scale; |
|
|
|
|
int scaledHeight = window->wl.height * scale; |
|
|
|
|
wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0); |
|
|
|
|
if (!window->wl.transparent) |
|
|
|
|
setOpaqueRegion(window); |
|
|
|
|
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight); |
|
|
|
|
_glfwInputWindowContentScale(window, scale, scale); |
|
|
|
|
|
|
|
|
|
if (!_glfw.wl.viewporter || !window->wl.decorations.top.surface) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
// Top decoration.
|
|
|
|
|
wp_viewport_set_destination(window->wl.decorations.top.viewport, width, _GLFW_DECORATION_TOP); |
|
|
|
|
wp_viewport_set_destination(window->wl.decorations.top.viewport, |
|
|
|
|
window->wl.width, _GLFW_DECORATION_TOP); |
|
|
|
|
wl_surface_commit(window->wl.decorations.top.surface); |
|
|
|
|
|
|
|
|
|
// Left decoration.
|
|
|
|
@ -308,13 +332,12 @@ static void resizeWindow(_GLFWwindow* window, int width, int height) |
|
|
|
|
wl_subsurface_set_position(window->wl.decorations.bottom.subsurface, |
|
|
|
|
-_GLFW_DECORATION_WIDTH, window->wl.height); |
|
|
|
|
wp_viewport_set_destination(window->wl.decorations.bottom.viewport, |
|
|
|
|
width + 2 * _GLFW_DECORATION_WIDTH, _GLFW_DECORATION_WIDTH); |
|
|
|
|
window->wl.width + _GLFW_DECORATION_HORIZONTAL, _GLFW_DECORATION_WIDTH); |
|
|
|
|
wl_surface_commit(window->wl.decorations.bottom.surface); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void checkScaleChange(_GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
int scaledWidth, scaledHeight; |
|
|
|
|
int scale = 1; |
|
|
|
|
int i; |
|
|
|
|
int monitorScale; |
|
|
|
@ -335,12 +358,8 @@ static void checkScaleChange(_GLFWwindow* window) |
|
|
|
|
if (scale != window->wl.scale) |
|
|
|
|
{ |
|
|
|
|
window->wl.scale = scale; |
|
|
|
|
scaledWidth = window->wl.width * scale; |
|
|
|
|
scaledHeight = window->wl.height * scale; |
|
|
|
|
wl_surface_set_buffer_scale(window->wl.surface, scale); |
|
|
|
|
resizeWindow(window, scaledWidth, scaledHeight); |
|
|
|
|
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight); |
|
|
|
|
_glfwInputWindowContentScale(window, scale, scale); |
|
|
|
|
resizeWindow(window); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -390,21 +409,6 @@ static const struct wl_surface_listener surfaceListener = { |
|
|
|
|
handleLeave |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Makes the surface considered as XRGB instead of ARGB.
|
|
|
|
|
static void setOpaqueRegion(_GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
struct wl_region* region; |
|
|
|
|
|
|
|
|
|
region = wl_compositor_create_region(_glfw.wl.compositor); |
|
|
|
|
if (!region) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
wl_region_add(region, 0, 0, window->wl.width, window->wl.height); |
|
|
|
|
wl_surface_set_opaque_region(window->wl.surface, region); |
|
|
|
|
wl_surface_commit(window->wl.surface); |
|
|
|
|
wl_region_destroy(region); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void setIdleInhibitor(_GLFWwindow* window, GLFWbool enable) |
|
|
|
|
{ |
|
|
|
|
if (enable && !window->wl.idleInhibitor && _glfw.wl.idleInhibitManager) |
|
|
|
@ -894,14 +898,9 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height) |
|
|
|
|
|
|
|
|
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) |
|
|
|
|
{ |
|
|
|
|
int scaledWidth = width * window->wl.scale; |
|
|
|
|
int scaledHeight = height * window->wl.scale; |
|
|
|
|
window->wl.width = width; |
|
|
|
|
window->wl.height = height; |
|
|
|
|
resizeWindow(window, scaledWidth, scaledHeight); |
|
|
|
|
if (!window->wl.transparent) |
|
|
|
|
setOpaqueRegion(window); |
|
|
|
|
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight); |
|
|
|
|
resizeWindow(window); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window, |
|
|
|
|