mirror of
https://github.com/glfw/glfw.git
synced 2024-11-29 13:32:01 +00:00
parent
8e062afdd8
commit
d84772d620
@ -61,6 +61,8 @@ GLFW bundles a number of dependencies in the `deps/` directory.
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
- Added `glfwSetWindowSizeLimits` and `glfwSetWindowAspectRatio` for setting
|
||||||
|
absolute and relative window size limits
|
||||||
- Added `GLFW_TRUE` and `GLFW_FALSE` as client API independent boolean values
|
- Added `GLFW_TRUE` and `GLFW_FALSE` as client API independent boolean values
|
||||||
- Removed dependency on external OpenGL or OpenGL ES headers
|
- Removed dependency on external OpenGL or OpenGL ES headers
|
||||||
- [WGL] Removed dependency on external WGL headers
|
- [WGL] Removed dependency on external WGL headers
|
||||||
|
@ -4,6 +4,11 @@
|
|||||||
|
|
||||||
@section news_32 New features in 3.2
|
@section news_32 New features in 3.2
|
||||||
|
|
||||||
|
@subsection news_32_sizelimits Window size limit support
|
||||||
|
|
||||||
|
GLFW now supports setting both absolute and relative window size limits with
|
||||||
|
@ref glfwSetWindowSizeLimits and @ref glfwSetWindowAspectRatio.
|
||||||
|
|
||||||
|
|
||||||
@section news_31 New features in 3.1
|
@section news_31 New features in 3.1
|
||||||
|
|
||||||
|
@ -485,6 +485,45 @@ The size of a framebuffer may change independently of the size of a window, for
|
|||||||
example if the window is dragged between a regular monitor and a high-DPI one.
|
example if the window is dragged between a regular monitor and a high-DPI one.
|
||||||
|
|
||||||
|
|
||||||
|
@subsection window_sizelimits Window size limits
|
||||||
|
|
||||||
|
The minimum and maximum size of the client area of a windowed mode window can be
|
||||||
|
set with @ref glfwSetWindowSizeLimits. The user may resize the window to any
|
||||||
|
size and aspect ratio within the specified limits, unless the aspect ratio is
|
||||||
|
also set.
|
||||||
|
|
||||||
|
@code
|
||||||
|
glfwSetWindowSizeLimits(window, 200, 200, 400, 400);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
To disable size limits for a window, set them to `GLFW_DONT_CARE`.
|
||||||
|
|
||||||
|
@code
|
||||||
|
glfwSetWindowSizeLimits(window, GLFW_DONT_CARE, GLFW_DONT_CARE, GLFW_DONT_CARE, GLFW_DONT_CARE);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
The aspect ratio of the client area of a windowed mode window can be set with
|
||||||
|
@ref glfwSetWindowAspectRatio. The user may resize the window freely unless
|
||||||
|
size limits are also set, but the size will be constrained to maintain the
|
||||||
|
aspect ratio.
|
||||||
|
|
||||||
|
The aspect ratio is specified as a numerator and denominator, corresponding to
|
||||||
|
the width and height, respectively.
|
||||||
|
|
||||||
|
@code
|
||||||
|
glfwSetWindowAspectRatio(window, 16, 9);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
To disable aspect ratio for a window, set it to `GLFW_DONT_CARE`.
|
||||||
|
|
||||||
|
@code
|
||||||
|
glfwSetWindowAspectRatio(window, GLFW_DONT_CARE, GLFW_DONT_CARE);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
You can have both size limits and aspect ratio set for a window, but the results
|
||||||
|
are undefined if they conflict.
|
||||||
|
|
||||||
|
|
||||||
@subsection window_pos Window position
|
@subsection window_pos Window position
|
||||||
|
|
||||||
The position of a windowed-mode window can be changed with @ref
|
The position of a windowed-mode window can be changed with @ref
|
||||||
|
@ -611,6 +611,8 @@ int main( void )
|
|||||||
exit( EXIT_FAILURE );
|
exit( EXIT_FAILURE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glfwSetWindowAspectRatio(window, 1, 1);
|
||||||
|
|
||||||
glfwSetFramebufferSizeCallback(window, reshape);
|
glfwSetFramebufferSizeCallback(window, reshape);
|
||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
glfwSetMouseButtonCallback(window, mouse_button_callback);
|
||||||
|
@ -1845,6 +1845,78 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
|
GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
|
||||||
|
|
||||||
|
/*! @brief Sets the size limits of the specified window.
|
||||||
|
*
|
||||||
|
* This function sets the size limits of the client area of the specified
|
||||||
|
* window. If the window is full screen or not resizable, this function does
|
||||||
|
* nothing.
|
||||||
|
*
|
||||||
|
* The size limits are applied immediately and may cause the window to be
|
||||||
|
* resized.
|
||||||
|
*
|
||||||
|
* @param[in] window The window to set limits for.
|
||||||
|
* @param[in] minwidth The minimum width, in screen coordinates, of the client
|
||||||
|
* area, or `GLFW_DONT_CARE`.
|
||||||
|
* @param[in] minheight The minimum height, in screen coordinates, of the
|
||||||
|
* client area, or `GLFW_DONT_CARE`.
|
||||||
|
* @param[in] maxwidth The maximum width, in screen coordinates, of the client
|
||||||
|
* area, or `GLFW_DONT_CARE`.
|
||||||
|
* @param[in] maxheight The maximum height, in screen coordinates, of the
|
||||||
|
* client area, or `GLFW_DONT_CARE`.
|
||||||
|
*
|
||||||
|
* @remarks If you set size limits and an aspect ratio that conflict, the
|
||||||
|
* results are undefined.
|
||||||
|
*
|
||||||
|
* @par Thread Safety
|
||||||
|
* This function may only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref window_sizelimits
|
||||||
|
* @sa glfwSetWindowAspectRatio
|
||||||
|
*
|
||||||
|
* @since Added in GLFW 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup window
|
||||||
|
*/
|
||||||
|
GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
|
||||||
|
|
||||||
|
/*! @brief Sets the aspect ratio of the specified window.
|
||||||
|
*
|
||||||
|
* This function sets the required aspect ratio of the client area of the
|
||||||
|
* specified window. If the window is full screen or not resizable, this
|
||||||
|
* function does nothing.
|
||||||
|
*
|
||||||
|
* The aspect ratio is specified as a numerator and a denominator. For
|
||||||
|
* example, the common 16:9 aspect ratio is specified as 16 and 9,
|
||||||
|
* respectively. The denominator may not be zero.
|
||||||
|
*
|
||||||
|
* If the numerator and denominator is set to `GLFW_DONT_CARE` then the window
|
||||||
|
* may be resized to any aspect ratio permitted by the window system and any
|
||||||
|
* limits set by @ref glfwSetWindowSizeLimits.
|
||||||
|
*
|
||||||
|
* The aspect ratio is applied immediately and may cause the window to be
|
||||||
|
* resized.
|
||||||
|
*
|
||||||
|
* @param[in] window The window to set limits for.
|
||||||
|
* @param[in] numer The numerator of the desired aspect ratio, or
|
||||||
|
* `GLFW_DONT_CARE`.
|
||||||
|
* @param[in] denom The denominator of the desired aspect ratio, or
|
||||||
|
* `GLFW_DONT_CARE`.
|
||||||
|
*
|
||||||
|
* @remarks If you set size limits and an aspect ratio that conflict, the
|
||||||
|
* results are undefined.
|
||||||
|
*
|
||||||
|
* @par Thread Safety
|
||||||
|
* This function may only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref window_sizelimits
|
||||||
|
* @sa glfwSetWindowSizeLimits
|
||||||
|
*
|
||||||
|
* @since Added in GLFW 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup window
|
||||||
|
*/
|
||||||
|
GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);
|
||||||
|
|
||||||
/*! @brief Sets the size of the client area of the specified window.
|
/*! @brief Sets the size of the client area of the specified window.
|
||||||
*
|
*
|
||||||
* This function sets the size, in screen coordinates, of the client area of
|
* This function sets the size, in screen coordinates, of the client area of
|
||||||
|
@ -1004,6 +1004,29 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
[window->ns.object setContentSize:NSMakeSize(width, height)];
|
[window->ns.object setContentSize:NSMakeSize(width, height)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
||||||
|
int minwidth, int minheight,
|
||||||
|
int maxwidth, int maxheight)
|
||||||
|
{
|
||||||
|
if (minwidth == GLFW_DONT_CARE || minheight == GLFW_DONT_CARE)
|
||||||
|
[window->ns.object setContentMinSize:NSMakeSize(0, 0)];
|
||||||
|
else
|
||||||
|
[window->ns.object setContentMinSize:NSMakeSize(minwidth, minheight)];
|
||||||
|
|
||||||
|
if (maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE)
|
||||||
|
[window->ns.object setContentMaxSize:NSMakeSize(0, 0)];
|
||||||
|
else
|
||||||
|
[window->ns.object setContentMaxSize:NSMakeSize(maxwidth, maxheight)];
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)
|
||||||
|
{
|
||||||
|
if (numer == GLFW_DONT_CARE || denom == GLFW_DONT_CARE)
|
||||||
|
[window->ns.object setContentAspectRatio:NSMakeSize(0, 0)];
|
||||||
|
else
|
||||||
|
[window->ns.object setContentAspectRatio:NSMakeSize(numer, denom)];
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
||||||
{
|
{
|
||||||
const NSRect contentRect = [window->ns.view frame];
|
const NSRect contentRect = [window->ns.view frame];
|
||||||
|
@ -540,6 +540,16 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height);
|
|||||||
*/
|
*/
|
||||||
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
|
||||||
|
|
||||||
|
/*! @copydoc glfwSetWindowSizeLimits
|
||||||
|
* @ingroup platform
|
||||||
|
*/
|
||||||
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
|
||||||
|
|
||||||
|
/*! @copydoc glfwSetWindowAspectRatio
|
||||||
|
* @ingroup platform
|
||||||
|
*/
|
||||||
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom);
|
||||||
|
|
||||||
/*! @copydoc glfwGetFramebufferSize
|
/*! @copydoc glfwGetFramebufferSize
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
*/
|
*/
|
||||||
|
@ -529,6 +529,20 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
mir_surface_spec_release(spec);
|
mir_surface_spec_release(spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
||||||
|
int minwidth, int minheight,
|
||||||
|
int maxwidth, int maxheight)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Mir: Unsupported function %s", __PRETTY_FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Mir: Unsupported function %s", __PRETTY_FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
|
void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
@ -154,6 +154,10 @@ typedef struct _GLFWwindowWin32
|
|||||||
GLFWbool cursorTracked;
|
GLFWbool cursorTracked;
|
||||||
GLFWbool iconified;
|
GLFWbool iconified;
|
||||||
|
|
||||||
|
int minwidth, minheight;
|
||||||
|
int maxwidth, maxheight;
|
||||||
|
int numer, denom;
|
||||||
|
|
||||||
// The last received cursor position, regardless of source
|
// The last received cursor position, regardless of source
|
||||||
int cursorPosX, cursorPosY;
|
int cursorPosX, cursorPosY;
|
||||||
|
|
||||||
|
@ -69,6 +69,47 @@ static DWORD getWindowExStyle(const _GLFWwindow* window)
|
|||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Translate client window size to full window size (including window borders)
|
||||||
|
//
|
||||||
|
static void getFullWindowSize(_GLFWwindow* window,
|
||||||
|
int clientWidth, int clientHeight,
|
||||||
|
int* fullWidth, int* fullHeight)
|
||||||
|
{
|
||||||
|
RECT rect = { 0, 0, clientWidth, clientHeight };
|
||||||
|
AdjustWindowRectEx(&rect, getWindowStyle(window),
|
||||||
|
FALSE, getWindowExStyle(window));
|
||||||
|
*fullWidth = rect.right - rect.left;
|
||||||
|
*fullHeight = rect.bottom - rect.top;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enforce the client rect aspect ratio based on which edge is being dragged
|
||||||
|
//
|
||||||
|
static void applyAspectRatio(_GLFWwindow* window, int edge, RECT* area)
|
||||||
|
{
|
||||||
|
int xoff, yoff;
|
||||||
|
const float ratio = (float) window->win32.numer /
|
||||||
|
(float) window->win32.denom;
|
||||||
|
|
||||||
|
getFullWindowSize(window, 0, 0, &xoff, &yoff);
|
||||||
|
|
||||||
|
if (edge == WMSZ_LEFT || edge == WMSZ_BOTTOMLEFT ||
|
||||||
|
edge == WMSZ_RIGHT || edge == WMSZ_BOTTOMRIGHT)
|
||||||
|
{
|
||||||
|
area->bottom = area->top + yoff +
|
||||||
|
(int) ((area->right - area->left - xoff) / ratio);
|
||||||
|
}
|
||||||
|
else if (edge == WMSZ_TOPLEFT || edge == WMSZ_TOPRIGHT)
|
||||||
|
{
|
||||||
|
area->top = area->bottom - yoff -
|
||||||
|
(int) ((area->right - area->left - xoff) / ratio);
|
||||||
|
}
|
||||||
|
else if (edge == WMSZ_TOP || edge == WMSZ_BOTTOM)
|
||||||
|
{
|
||||||
|
area->right = area->left + xoff +
|
||||||
|
(int) ((area->bottom - area->top - yoff) * ratio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Updates the cursor clip rect
|
// Updates the cursor clip rect
|
||||||
//
|
//
|
||||||
static void updateClipRect(_GLFWwindow* window)
|
static void updateClipRect(_GLFWwindow* window)
|
||||||
@ -503,6 +544,41 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WM_SIZING:
|
||||||
|
{
|
||||||
|
if (window->win32.numer == GLFW_DONT_CARE ||
|
||||||
|
window->win32.denom == GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
applyAspectRatio(window, (int) wParam, (RECT*) lParam);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_GETMINMAXINFO:
|
||||||
|
{
|
||||||
|
int xoff, yoff;
|
||||||
|
MINMAXINFO* mmi = (MINMAXINFO*) lParam;
|
||||||
|
getFullWindowSize(window, 0, 0, &xoff, &yoff);
|
||||||
|
|
||||||
|
if (window->win32.minwidth != GLFW_DONT_CARE &&
|
||||||
|
window->win32.minheight != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
mmi->ptMinTrackSize.x = window->win32.minwidth + xoff;
|
||||||
|
mmi->ptMinTrackSize.y = window->win32.minheight + yoff;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->win32.maxwidth != GLFW_DONT_CARE &&
|
||||||
|
window->win32.maxheight != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
mmi->ptMaxTrackSize.x = window->win32.maxwidth + xoff;
|
||||||
|
mmi->ptMaxTrackSize.y = window->win32.maxheight + yoff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
{
|
{
|
||||||
_glfwInputWindowDamage(window);
|
_glfwInputWindowDamage(window);
|
||||||
@ -582,19 +658,6 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translate client window size to full window size (including window borders)
|
|
||||||
//
|
|
||||||
static void getFullWindowSize(_GLFWwindow* window,
|
|
||||||
int clientWidth, int clientHeight,
|
|
||||||
int* fullWidth, int* fullHeight)
|
|
||||||
{
|
|
||||||
RECT rect = { 0, 0, clientWidth, clientHeight };
|
|
||||||
AdjustWindowRectEx(&rect, getWindowStyle(window),
|
|
||||||
FALSE, getWindowExStyle(window));
|
|
||||||
*fullWidth = rect.right - rect.left;
|
|
||||||
*fullHeight = rect.bottom - rect.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creates the GLFW window and rendering context
|
// Creates the GLFW window and rendering context
|
||||||
//
|
//
|
||||||
static GLFWbool createWindow(_GLFWwindow* window,
|
static GLFWbool createWindow(_GLFWwindow* window,
|
||||||
@ -677,6 +740,13 @@ static GLFWbool createWindow(_GLFWwindow* window,
|
|||||||
if (!_glfwCreateContext(window, ctxconfig, fbconfig))
|
if (!_glfwCreateContext(window, ctxconfig, fbconfig))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
|
|
||||||
|
window->win32.minwidth = GLFW_DONT_CARE;
|
||||||
|
window->win32.minheight = GLFW_DONT_CARE;
|
||||||
|
window->win32.maxwidth = GLFW_DONT_CARE;
|
||||||
|
window->win32.maxheight = GLFW_DONT_CARE;
|
||||||
|
window->win32.numer = GLFW_DONT_CARE;
|
||||||
|
window->win32.denom = GLFW_DONT_CARE;
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -872,6 +942,48 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
||||||
|
int minwidth, int minheight,
|
||||||
|
int maxwidth, int maxheight)
|
||||||
|
{
|
||||||
|
RECT area;
|
||||||
|
|
||||||
|
window->win32.minwidth = minwidth;
|
||||||
|
window->win32.minheight = minheight;
|
||||||
|
window->win32.maxwidth = maxwidth;
|
||||||
|
window->win32.maxheight = maxheight;
|
||||||
|
|
||||||
|
if ((minwidth == GLFW_DONT_CARE || minheight == GLFW_DONT_CARE) &&
|
||||||
|
(maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GetWindowRect(window->win32.handle, &area);
|
||||||
|
MoveWindow(window->win32.handle,
|
||||||
|
area.left, area.top,
|
||||||
|
area.right - area.left,
|
||||||
|
area.bottom - area.top, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)
|
||||||
|
{
|
||||||
|
RECT area;
|
||||||
|
|
||||||
|
window->win32.numer = numer;
|
||||||
|
window->win32.denom = denom;
|
||||||
|
|
||||||
|
if (numer == GLFW_DONT_CARE || denom == GLFW_DONT_CARE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
GetWindowRect(window->win32.handle, &area);
|
||||||
|
applyAspectRatio(window, WMSZ_BOTTOMRIGHT, &area);
|
||||||
|
MoveWindow(window->win32.handle,
|
||||||
|
area.left, area.top,
|
||||||
|
area.right - area.left,
|
||||||
|
area.bottom - area.top, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
||||||
{
|
{
|
||||||
_glfwPlatformGetWindowSize(window, width, height);
|
_glfwPlatformGetWindowSize(window, width, height);
|
||||||
|
34
src/window.c
34
src/window.c
@ -481,6 +481,40 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow* handle, int width, int height)
|
|||||||
_glfwPlatformSetWindowSize(window, width, height);
|
_glfwPlatformSetWindowSize(window, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* handle,
|
||||||
|
int minwidth, int minheight,
|
||||||
|
int maxwidth, int maxheight)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
if (window->monitor || !window->resizable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_glfwPlatformSetWindowSizeLimits(window,
|
||||||
|
minwidth, minheight,
|
||||||
|
maxwidth, maxheight);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* handle, int numer, int denom)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
if (window->monitor || !window->resizable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!denom)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_INVALID_VALUE, "Denominator cannot be zero");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwPlatformSetWindowAspectRatio(window, numer, denom);
|
||||||
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwGetFramebufferSize(GLFWwindow* handle, int* width, int* height)
|
GLFWAPI void glfwGetFramebufferSize(GLFWwindow* handle, int* width, int* height)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
@ -302,6 +302,20 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
window->wl.height = height;
|
window->wl.height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
||||||
|
int minwidth, int minheight,
|
||||||
|
int maxwidth, int maxheight)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
fprintf(stderr, "_glfwPlatformSetWindowSizeLimits not implemented yet\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
fprintf(stderr, "_glfwPlatformSetWindowAspectRatio not implemented yet\n");
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
||||||
{
|
{
|
||||||
_glfwPlatformGetWindowSize(window, width, height);
|
_glfwPlatformGetWindowSize(window, width, height);
|
||||||
|
@ -1632,6 +1632,61 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
XFlush(_glfw.x11.display);
|
XFlush(_glfw.x11.display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
||||||
|
int minwidth, int minheight,
|
||||||
|
int maxwidth, int maxheight)
|
||||||
|
{
|
||||||
|
long supplied;
|
||||||
|
XSizeHints* hints = XAllocSizeHints();
|
||||||
|
|
||||||
|
if (XGetWMNormalHints(_glfw.x11.display, window->x11.handle, hints, &supplied))
|
||||||
|
{
|
||||||
|
if (minwidth == GLFW_DONT_CARE || minwidth == GLFW_DONT_CARE)
|
||||||
|
hints->flags &= ~PMinSize;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hints->flags |= PMinSize;
|
||||||
|
hints->min_width = minwidth;
|
||||||
|
hints->min_height = minheight;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxwidth == GLFW_DONT_CARE || maxwidth == GLFW_DONT_CARE)
|
||||||
|
hints->flags &= ~PMaxSize;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hints->flags |= PMaxSize;
|
||||||
|
hints->max_width = maxwidth;
|
||||||
|
hints->max_height = maxheight;
|
||||||
|
}
|
||||||
|
|
||||||
|
XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
XFree(hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)
|
||||||
|
{
|
||||||
|
long supplied;
|
||||||
|
XSizeHints* hints = XAllocSizeHints();
|
||||||
|
|
||||||
|
if (XGetWMNormalHints(_glfw.x11.display, window->x11.handle, hints, &supplied))
|
||||||
|
{
|
||||||
|
if (numer == GLFW_DONT_CARE || denom == GLFW_DONT_CARE)
|
||||||
|
hints->flags &= ~PAspect;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hints->flags |= PAspect;
|
||||||
|
hints->min_aspect.x = hints->max_aspect.x = numer;
|
||||||
|
hints->min_aspect.y = hints->max_aspect.y = denom;
|
||||||
|
}
|
||||||
|
|
||||||
|
XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
XFree(hints);
|
||||||
|
}
|
||||||
|
|
||||||
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
||||||
{
|
{
|
||||||
_glfwPlatformGetWindowSize(window, width, height);
|
_glfwPlatformGetWindowSize(window, width, height);
|
||||||
|
Loading…
Reference in New Issue
Block a user