mirror of
https://github.com/glfw/glfw.git
synced 2024-11-29 05:22:00 +00:00
Add glfwSetWindowMonitor
This adds the ability to switch between windowed and full screen modes, move a full screen window between monitors and update its desired resolution and refresh rate. Fixes #43.
This commit is contained in:
parent
fb8a31ba3f
commit
6570d0c4b7
@ -77,6 +77,8 @@ does not find Doxygen, the documentation will not be generated.
|
|||||||
- Added `glfwVulkanSupported`, `glfwGetRequiredInstanceExtensions`,
|
- Added `glfwVulkanSupported`, `glfwGetRequiredInstanceExtensions`,
|
||||||
`glfwGetInstanceProcAddress`, `glfwGetPhysicalDevicePresentationSupport` and
|
`glfwGetInstanceProcAddress`, `glfwGetPhysicalDevicePresentationSupport` and
|
||||||
`glfwCreateWindowSurface` for platform independent Vulkan support
|
`glfwCreateWindowSurface` for platform independent Vulkan support
|
||||||
|
- Added `glfwSetWindowMonitor` for switching between windowed and full screen
|
||||||
|
modes and updating the monitor and desired video mode of full screen windows
|
||||||
- Added `glfwMaximizeWindow` and `GLFW_MAXIMIZED` for window maximization
|
- Added `glfwMaximizeWindow` and `GLFW_MAXIMIZED` for window maximization
|
||||||
- Added `glfwFocusWindow` for giving windows input focus
|
- Added `glfwFocusWindow` for giving windows input focus
|
||||||
- Added `glfwSetWindowSizeLimits` and `glfwSetWindowAspectRatio` for setting
|
- Added `glfwSetWindowSizeLimits` and `glfwSetWindowAspectRatio` for setting
|
||||||
|
@ -95,8 +95,9 @@ a gamma ramp.
|
|||||||
@subsection monitor_modes Video modes
|
@subsection monitor_modes Video modes
|
||||||
|
|
||||||
GLFW generally does a good job selecting a suitable video mode when you create
|
GLFW generally does a good job selecting a suitable video mode when you create
|
||||||
a full screen window, but it is sometimes useful to know exactly which video
|
a full screen window, change its video mode or or make a windowed one full
|
||||||
modes are supported.
|
screen, but it is sometimes useful to know exactly which video modes are
|
||||||
|
supported.
|
||||||
|
|
||||||
Video modes are represented as @ref GLFWvidmode structures. You can get an
|
Video modes are represented as @ref GLFWvidmode structures. You can get an
|
||||||
array of the video modes supported by a monitor with @ref glfwGetVideoModes.
|
array of the video modes supported by a monitor with @ref glfwGetVideoModes.
|
||||||
|
@ -26,6 +26,13 @@ Vulkan header inclusion can be selected with
|
|||||||
[GLFW_INCLUDE_VULKAN](@ref build_macros).
|
[GLFW_INCLUDE_VULKAN](@ref build_macros).
|
||||||
|
|
||||||
|
|
||||||
|
@subsection news_32_setwindowmonitor Window mode switching
|
||||||
|
|
||||||
|
GLFW now supports switching between windowed and full screen modes and updating
|
||||||
|
the monitor and desired resolution and refresh rate of full screen windows with
|
||||||
|
@ref glfwSetWindowMonitor.
|
||||||
|
|
||||||
|
|
||||||
@subsection news_32_maximize Window maxmimization support
|
@subsection news_32_maximize Window maxmimization support
|
||||||
|
|
||||||
GLFW now supports window maximization with @ref glfwMaximizeWindow and the
|
GLFW now supports window maximization with @ref glfwMaximizeWindow and the
|
||||||
|
@ -56,6 +56,10 @@ GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", glfwGetPrimaryMonito
|
|||||||
Full screen windows cover the entire display area of a monitor, have no border
|
Full screen windows cover the entire display area of a monitor, have no border
|
||||||
or decorations.
|
or decorations.
|
||||||
|
|
||||||
|
Windowed mode windows can be made full screen by setting a monitor with @ref
|
||||||
|
glfwSetWindowMonitor, and full screen ones can be made windowed by unsetting it
|
||||||
|
with the same function.
|
||||||
|
|
||||||
Each field of the @ref GLFWvidmode structure corresponds to a function parameter
|
Each field of the @ref GLFWvidmode structure corresponds to a function parameter
|
||||||
or window hint and combine to form the _desired video mode_ for that window.
|
or window hint and combine to form the _desired video mode_ for that window.
|
||||||
The supported video mode most closely matching the desired video mode will be
|
The supported video mode most closely matching the desired video mode will be
|
||||||
@ -71,9 +75,11 @@ GLFWvidmode.greenBits | `GLFW_GREEN_BITS` hint
|
|||||||
GLFWvidmode.blueBits | `GLFW_BLUE_BITS` hint
|
GLFWvidmode.blueBits | `GLFW_BLUE_BITS` hint
|
||||||
GLFWvidmode.refreshRate | `GLFW_REFRESH_RATE` hint
|
GLFWvidmode.refreshRate | `GLFW_REFRESH_RATE` hint
|
||||||
|
|
||||||
Once you have a full screen window, you can change its resolution with @ref
|
Once you have a full screen window, you can change its resolution, refresh rate
|
||||||
glfwSetWindowSize. The new video mode will be selected and set the same way as
|
and monitor with @ref glfwSetWindowMonitor. If you just need change its
|
||||||
the video mode chosen by @ref glfwCreateWindow.
|
resolution you can also call @ref glfwSetWindowSize. In all cases, the new
|
||||||
|
video mode will be selected the same way as the video mode chosen by @ref
|
||||||
|
glfwCreateWindow.
|
||||||
|
|
||||||
By default, the original video mode of the monitor will be restored and the
|
By default, the original video mode of the monitor will be restored and the
|
||||||
window iconified if it loses input focus, to allow the user to switch back to
|
window iconified if it loses input focus, to allow the user to switch back to
|
||||||
@ -101,6 +107,18 @@ glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);
|
|||||||
GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, "My Title", monitor, NULL);
|
GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, "My Title", monitor, NULL);
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
|
This also works for windowed mode windows that are made full screen.
|
||||||
|
|
||||||
|
@code
|
||||||
|
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
||||||
|
|
||||||
|
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Note that @ref glfwGetVideoMode returns the _current_ video mode of a monitor,
|
||||||
|
so if you already have a full screen window on that monitor that you want to
|
||||||
|
make windowed full screen, you need to have saved the desktop resolution before.
|
||||||
|
|
||||||
|
|
||||||
@subsection window_destruction Window destruction
|
@subsection window_destruction Window destruction
|
||||||
|
|
||||||
@ -423,7 +441,7 @@ glfwSetWindowSize(window, 640, 480);
|
|||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
For full screen windows, the specified size becomes the new resolution of the
|
For full screen windows, the specified size becomes the new resolution of the
|
||||||
window's *desired video mode*. The video mode most closely matching the new
|
window's desired video mode. The video mode most closely matching the new
|
||||||
desired video mode is set immediately. The window is resized to fit the
|
desired video mode is set immediately. The window is resized to fit the
|
||||||
resolution of the set video mode.
|
resolution of the set video mode.
|
||||||
|
|
||||||
@ -648,8 +666,31 @@ GLFWmonitor* monitor = glfwGetWindowMonitor(window);
|
|||||||
|
|
||||||
This monitor handle is one of those returned by @ref glfwGetMonitors.
|
This monitor handle is one of those returned by @ref glfwGetMonitors.
|
||||||
|
|
||||||
For windowed mode windows, this function returns `NULL`. This is the
|
For windowed mode windows, this function returns `NULL`. This is how to tell
|
||||||
recommended way to tell full screen windows from windowed mode windows.
|
full screen windows from windowed mode windows.
|
||||||
|
|
||||||
|
You can move windows between monitors or between full screen and windowed mode
|
||||||
|
with @ref glfwSetWindowMonitor. When making a window full screen on the same or
|
||||||
|
on a different monitor, specify the desired monitor, resolution and refresh
|
||||||
|
rate. The position arguments are ignored.
|
||||||
|
|
||||||
|
@code
|
||||||
|
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
||||||
|
|
||||||
|
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
When making the window windowed, specify the desired position and size. The
|
||||||
|
refresh rate argument is ignored.
|
||||||
|
|
||||||
|
@code
|
||||||
|
glfwSetWindowMonitor(window, NULL, xpos, ypos, width, height, 0);
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
This restores any previous window settings such as whether it is decorated,
|
||||||
|
floating, resizable, has size or aspect ratio limits, etc.. To restore a window
|
||||||
|
that was originally windowed to its original size and position, save these
|
||||||
|
before making it full screen and then pass them in as above.
|
||||||
|
|
||||||
|
|
||||||
@subsection window_iconify Window iconification
|
@subsection window_iconify Window iconification
|
||||||
|
@ -89,6 +89,7 @@ typedef enum { DRAW_BALL, DRAW_BALL_SHADOW } DRAW_BALL_ENUM;
|
|||||||
typedef struct {float x; float y; float z;} vertex_t;
|
typedef struct {float x; float y; float z;} vertex_t;
|
||||||
|
|
||||||
/* Global vars */
|
/* Global vars */
|
||||||
|
int windowed_xpos, windowed_ypos, windowed_width, windowed_height;
|
||||||
int width, height;
|
int width, height;
|
||||||
GLfloat deg_rot_y = 0.f;
|
GLfloat deg_rot_y = 0.f;
|
||||||
GLfloat deg_rot_y_inc = 2.f;
|
GLfloat deg_rot_y_inc = 2.f;
|
||||||
@ -238,6 +239,26 @@ void key_callback( GLFWwindow* window, int key, int scancode, int action, int mo
|
|||||||
{
|
{
|
||||||
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||||||
|
if (key == GLFW_KEY_ENTER && action == GLFW_PRESS && mods == GLFW_MOD_ALT)
|
||||||
|
{
|
||||||
|
if (glfwGetWindowMonitor(window))
|
||||||
|
{
|
||||||
|
glfwSetWindowMonitor(window, NULL,
|
||||||
|
windowed_xpos, windowed_ypos,
|
||||||
|
windowed_width, windowed_height, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLFWmonitor* monitor = glfwGetPrimaryMonitor();
|
||||||
|
if (monitor)
|
||||||
|
{
|
||||||
|
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
||||||
|
glfwGetWindowPos(window, &windowed_xpos, &windowed_ypos);
|
||||||
|
glfwGetWindowSize(window, &windowed_width, &windowed_height);
|
||||||
|
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_ball_pos ( GLfloat x, GLfloat y )
|
static void set_ball_pos ( GLfloat x, GLfloat y )
|
||||||
|
@ -1718,17 +1718,17 @@ GLFWAPI void glfwWindowHint(int hint, int value);
|
|||||||
* glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize.
|
* glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize.
|
||||||
*
|
*
|
||||||
* To create a full screen window, you need to specify the monitor the window
|
* To create a full screen window, you need to specify the monitor the window
|
||||||
* will cover. If no monitor is specified, windowed mode will be used. Unless
|
* will cover. If no monitor is specified, the window will be windowed mode.
|
||||||
* you have a way for the user to choose a specific monitor, it is recommended
|
* Unless you have a way for the user to choose a specific monitor, it is
|
||||||
* that you pick the primary monitor. For more information on how to query
|
* recommended that you pick the primary monitor. For more information on how
|
||||||
* connected monitors, see @ref monitor_monitors.
|
* to query connected monitors, see @ref monitor_monitors.
|
||||||
*
|
*
|
||||||
* For full screen windows, the specified size becomes the resolution of the
|
* For full screen windows, the specified size becomes the resolution of the
|
||||||
* window's _desired video mode_. As long as a full screen window has input
|
* window's _desired video mode_. As long as a full screen window is not
|
||||||
* focus, the supported video mode most closely matching the desired video mode
|
* iconified, the supported video mode most closely matching the desired video
|
||||||
* is set for the specified monitor. For more information about full screen
|
* mode is set for the specified monitor. For more information about full
|
||||||
* windows, including the creation of so called _windowed full screen_ or
|
* screen windows, including the creation of so called _windowed full screen_
|
||||||
* _borderless full screen_ windows, see @ref window_windowed_full_screen.
|
* or _borderless full screen_ windows, see @ref window_windowed_full_screen.
|
||||||
*
|
*
|
||||||
* By default, newly created windows use the placement recommended by the
|
* By default, newly created windows use the placement recommended by the
|
||||||
* window system. To create the window at a specific position, make it
|
* window system. To create the window at a specific position, make it
|
||||||
@ -1736,8 +1736,8 @@ GLFWAPI void glfwWindowHint(int hint, int value);
|
|||||||
* hint, set its [position](@ref window_pos) and then [show](@ref window_hide)
|
* hint, set its [position](@ref window_pos) and then [show](@ref window_hide)
|
||||||
* it.
|
* it.
|
||||||
*
|
*
|
||||||
* If a full screen window has input focus, the screensaver is prohibited from
|
* As long as at least one full screen window is not iconified, the screensaver
|
||||||
* starting.
|
* is prohibited from starting.
|
||||||
*
|
*
|
||||||
* Window systems put limits on window sizes. Very large or very small window
|
* Window systems put limits on window sizes. Very large or very small window
|
||||||
* dimensions may be overridden by the window system on creation. Check the
|
* dimensions may be overridden by the window system on creation. Check the
|
||||||
@ -1751,7 +1751,7 @@ GLFWAPI void glfwWindowHint(int hint, int value);
|
|||||||
* @param[in] height The desired height, in screen coordinates, of the window.
|
* @param[in] height The desired height, in screen coordinates, of the window.
|
||||||
* This must be greater than zero.
|
* This must be greater than zero.
|
||||||
* @param[in] title The initial, UTF-8 encoded window title.
|
* @param[in] title The initial, UTF-8 encoded window title.
|
||||||
* @param[in] monitor The monitor to use for full screen mode, or `NULL` to use
|
* @param[in] monitor The monitor to use for full screen mode, or `NULL` for
|
||||||
* windowed mode.
|
* windowed mode.
|
||||||
* @param[in] share The window whose context to share resources with, or `NULL`
|
* @param[in] share The window whose context to share resources with, or `NULL`
|
||||||
* to not share resources.
|
* to not share resources.
|
||||||
@ -2044,11 +2044,12 @@ GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
|
|||||||
/*! @brief Sets the size limits of the specified window.
|
/*! @brief Sets the size limits of the specified window.
|
||||||
*
|
*
|
||||||
* This function sets the size limits of the client area of the specified
|
* 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
|
* window. If the window is full screen, the size limits only take effect if
|
||||||
* nothing.
|
* once it is made windowed. If the window is not resizable, this function
|
||||||
|
* does nothing.
|
||||||
*
|
*
|
||||||
* The size limits are applied immediately and may cause the window to be
|
* The size limits are applied immediately to a windowed mode window and may
|
||||||
* resized.
|
* cause it to be resized.
|
||||||
*
|
*
|
||||||
* @param[in] window The window to set limits for.
|
* @param[in] window The window to set limits for.
|
||||||
* @param[in] minwidth The minimum width, in screen coordinates, of the client
|
* @param[in] minwidth The minimum width, in screen coordinates, of the client
|
||||||
@ -2080,7 +2081,8 @@ GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minhe
|
|||||||
/*! @brief Sets the aspect ratio of the specified window.
|
/*! @brief Sets the aspect ratio of the specified window.
|
||||||
*
|
*
|
||||||
* This function sets the required aspect ratio of the client area of the
|
* 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
|
* specified window. If the window is full screen, the aspect ratio only takes
|
||||||
|
* effect once it is made windowed. If the window is not resizable, this
|
||||||
* function does nothing.
|
* function does nothing.
|
||||||
*
|
*
|
||||||
* The aspect ratio is specified as a numerator and a denominator and both
|
* The aspect ratio is specified as a numerator and a denominator and both
|
||||||
@ -2090,8 +2092,8 @@ GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minhe
|
|||||||
* If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect
|
* If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect
|
||||||
* ratio limit is disabled.
|
* ratio limit is disabled.
|
||||||
*
|
*
|
||||||
* The aspect ratio is applied immediately and may cause the window to be
|
* The aspect ratio is applied immediately to a windowed mode window and may
|
||||||
* resized.
|
* cause it to be resized.
|
||||||
*
|
*
|
||||||
* @param[in] window The window to set limits for.
|
* @param[in] window The window to set limits for.
|
||||||
* @param[in] numer The numerator of the desired aspect ratio, or
|
* @param[in] numer The numerator of the desired aspect ratio, or
|
||||||
@ -2121,17 +2123,22 @@ GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);
|
|||||||
* 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
|
||||||
* the specified window.
|
* the specified window.
|
||||||
*
|
*
|
||||||
* For full screen windows, this function selects and switches to the resolution
|
* For full screen windows, this function updates the resolution of its desired
|
||||||
* closest to the specified size, without affecting the window's context. As
|
* video mode and switches to the video mode closest to it, without affecting
|
||||||
* the context is unaffected, the bit depths of the framebuffer remain
|
* the window's context. As the context is unaffected, the bit depths of the
|
||||||
* unchanged.
|
* framebuffer remain unchanged.
|
||||||
|
*
|
||||||
|
* If you wish to update the refresh rate of the desired video mode in addition
|
||||||
|
* to its resolution, see @ref glfwSetWindowMonitor.
|
||||||
*
|
*
|
||||||
* The window manager may put limits on what sizes are allowed. GLFW cannot
|
* The window manager may put limits on what sizes are allowed. GLFW cannot
|
||||||
* and should not override these limits.
|
* and should not override these limits.
|
||||||
*
|
*
|
||||||
* @param[in] window The window to resize.
|
* @param[in] window The window to resize.
|
||||||
* @param[in] width The desired width of the specified window.
|
* @param[in] width The desired width, in screen coordinates, of the window
|
||||||
* @param[in] height The desired height of the specified window.
|
* client area.
|
||||||
|
* @param[in] height The desired height, in screen coordinates, of the window
|
||||||
|
* client area.
|
||||||
*
|
*
|
||||||
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
* GLFW_PLATFORM_ERROR.
|
* GLFW_PLATFORM_ERROR.
|
||||||
@ -2140,6 +2147,7 @@ GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);
|
|||||||
*
|
*
|
||||||
* @sa @ref window_size
|
* @sa @ref window_size
|
||||||
* @sa glfwGetWindowSize
|
* @sa glfwGetWindowSize
|
||||||
|
* @sa glfwSetWindowMonitor
|
||||||
*
|
*
|
||||||
* @since Added in version 1.0.
|
* @since Added in version 1.0.
|
||||||
* @glfw3 Added window handle parameter.
|
* @glfw3 Added window handle parameter.
|
||||||
@ -2376,6 +2384,7 @@ GLFWAPI void glfwFocusWindow(GLFWwindow* window);
|
|||||||
* @thread_safety This function must only be called from the main thread.
|
* @thread_safety This function must only be called from the main thread.
|
||||||
*
|
*
|
||||||
* @sa @ref window_monitor
|
* @sa @ref window_monitor
|
||||||
|
* @sa glfwSetWindowMonitor
|
||||||
*
|
*
|
||||||
* @since Added in version 3.0.
|
* @since Added in version 3.0.
|
||||||
*
|
*
|
||||||
@ -2383,6 +2392,54 @@ GLFWAPI void glfwFocusWindow(GLFWwindow* window);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window);
|
GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Sets the mode, monitor, video mode and placement of a window.
|
||||||
|
*
|
||||||
|
* This function sets the monitor that the window uses for full screen mode or,
|
||||||
|
* if the monitor is `NULL`, makes it windowed mode.
|
||||||
|
*
|
||||||
|
* When setting a monitor, this function updates the width, height and refresh
|
||||||
|
* rate of the desired video mode and switches to the video mode closest to it.
|
||||||
|
* The window position is ignored when setting a monitor.
|
||||||
|
*
|
||||||
|
* When the monitor is `NULL`, the position, width and height are used to
|
||||||
|
* place the window client area. The refresh rate is ignored when no monitor
|
||||||
|
* is specified.
|
||||||
|
*
|
||||||
|
* If you only wish to update the resolution of a full screen window or the
|
||||||
|
* size of a windowed mode window, see @ref glfwSetWindowSize.
|
||||||
|
*
|
||||||
|
* When a window transitions from full screen to windowed mode, this function
|
||||||
|
* restores any previous window settings such as whether it is decorated,
|
||||||
|
* floating, resizable, has size or aspect ratio limits, etc..
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose monitor, size or video mode to set.
|
||||||
|
* @param[in] monitor The desired monitor, or `NULL` to set windowed mode.
|
||||||
|
* @param[in] xpos The desired x-coordinate of the upper-left corner of the
|
||||||
|
* client area.
|
||||||
|
* @param[in] ypos The desired y-coordinate of the upper-left corner of the
|
||||||
|
* client area.
|
||||||
|
* @param[in] width The desired with, in screen coordinates, of the client area
|
||||||
|
* or video mode.
|
||||||
|
* @param[in] height The desired height, in screen coordinates, of the client
|
||||||
|
* area or video mode.
|
||||||
|
* @param[in] refreshRate The desired refresh rate, in Hz, of the video mode.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_PLATFORM_ERROR.
|
||||||
|
*
|
||||||
|
* @thread_safety This function must only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref window_monitor
|
||||||
|
* @sa @ref window_full_screen
|
||||||
|
* @sa glfwGetWindowMonitor
|
||||||
|
* @sa glfwSetWindowSize
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup window
|
||||||
|
*/
|
||||||
|
GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);
|
||||||
|
|
||||||
/*! @brief Returns an attribute of the specified window.
|
/*! @brief Returns an attribute of the specified window.
|
||||||
*
|
*
|
||||||
* This function returns the value of an attribute of the specified window or
|
* This function returns the value of an attribute of the specified window or
|
||||||
|
@ -56,6 +56,26 @@ static NSCursor* getStandardCursor(int shape)
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the style mask corresponding to the window settings
|
||||||
|
//
|
||||||
|
static NSUInteger getStyleMask(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
NSUInteger styleMask = 0;
|
||||||
|
|
||||||
|
if (window->monitor || !window->decorated)
|
||||||
|
styleMask |= NSBorderlessWindowMask;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
styleMask |= NSTitledWindowMask | NSClosableWindowMask |
|
||||||
|
NSMiniaturizableWindowMask;
|
||||||
|
|
||||||
|
if (window->resizable)
|
||||||
|
styleMask |= NSResizableWindowMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
return styleMask;
|
||||||
|
}
|
||||||
|
|
||||||
// Center the cursor in the view of the window
|
// Center the cursor in the view of the window
|
||||||
//
|
//
|
||||||
static void centerCursor(_GLFWwindow *window)
|
static void centerCursor(_GLFWwindow *window)
|
||||||
@ -86,7 +106,6 @@ static GLFWbool acquireMonitor(_GLFWwindow* window)
|
|||||||
|
|
||||||
[window->ns.object setFrame:frame display:YES];
|
[window->ns.object setFrame:frame display:YES];
|
||||||
|
|
||||||
_glfwPlatformFocusWindow(window);
|
|
||||||
_glfwInputMonitorWindowChange(window->monitor, window);
|
_glfwInputMonitorWindowChange(window->monitor, window);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -908,19 +927,6 @@ static GLFWbool createWindow(_GLFWwindow* window,
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int styleMask = 0;
|
|
||||||
|
|
||||||
if (window->monitor || !wndconfig->decorated)
|
|
||||||
styleMask = NSBorderlessWindowMask;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
styleMask = NSTitledWindowMask | NSClosableWindowMask |
|
|
||||||
NSMiniaturizableWindowMask;
|
|
||||||
|
|
||||||
if (wndconfig->resizable)
|
|
||||||
styleMask |= NSResizableWindowMask;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSRect contentRect;
|
NSRect contentRect;
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
@ -938,7 +944,7 @@ static GLFWbool createWindow(_GLFWwindow* window,
|
|||||||
|
|
||||||
window->ns.object = [[GLFWWindow alloc]
|
window->ns.object = [[GLFWWindow alloc]
|
||||||
initWithContentRect:contentRect
|
initWithContentRect:contentRect
|
||||||
styleMask:styleMask
|
styleMask:getStyleMask(window)
|
||||||
backing:NSBackingStoreBuffered
|
backing:NSBackingStoreBuffered
|
||||||
defer:NO];
|
defer:NO];
|
||||||
|
|
||||||
@ -948,15 +954,15 @@ static GLFWbool createWindow(_GLFWwindow* window,
|
|||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wndconfig->resizable)
|
|
||||||
[window->ns.object setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
|
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
[window->ns.object setLevel:NSMainMenuWindowLevel + 1];
|
[window->ns.object setLevel:NSMainMenuWindowLevel + 1];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
[window->ns.object center];
|
[window->ns.object center];
|
||||||
|
|
||||||
|
if (wndconfig->resizable)
|
||||||
|
[window->ns.object setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
|
||||||
|
|
||||||
if (wndconfig->floating)
|
if (wndconfig->floating)
|
||||||
[window->ns.object setLevel:NSFloatingWindowLevel];
|
[window->ns.object setLevel:NSFloatingWindowLevel];
|
||||||
|
|
||||||
@ -1005,6 +1011,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
{
|
{
|
||||||
_glfwPlatformShowWindow(window);
|
_glfwPlatformShowWindow(window);
|
||||||
|
_glfwPlatformFocusWindow(window);
|
||||||
if (!acquireMonitor(window))
|
if (!acquireMonitor(window))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
@ -1076,7 +1083,10 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
|||||||
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
|
{
|
||||||
|
if (window->monitor->window == window)
|
||||||
acquireMonitor(window);
|
acquireMonitor(window);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
[window->ns.object setContentSize:NSMakeSize(width, height)];
|
[window->ns.object setContentSize:NSMakeSize(width, height)];
|
||||||
}
|
}
|
||||||
@ -1174,6 +1184,103 @@ void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
|||||||
[window->ns.object makeKeyAndOrderFront:nil];
|
[window->ns.object makeKeyAndOrderFront:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
||||||
|
_GLFWmonitor* monitor,
|
||||||
|
int xpos, int ypos,
|
||||||
|
int width, int height,
|
||||||
|
int refreshRate)
|
||||||
|
{
|
||||||
|
if (window->monitor == monitor)
|
||||||
|
{
|
||||||
|
if (monitor)
|
||||||
|
{
|
||||||
|
if (monitor->window == window)
|
||||||
|
acquireMonitor(window);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const NSRect contentRect =
|
||||||
|
NSMakeRect(xpos, transformY(ypos + height), width, height);
|
||||||
|
const NSRect frameRect =
|
||||||
|
[window->ns.object frameRectForContentRect:contentRect
|
||||||
|
styleMask:getStyleMask(window)];
|
||||||
|
|
||||||
|
[window->ns.object setFrame:frameRect display:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->monitor)
|
||||||
|
releaseMonitor(window);
|
||||||
|
|
||||||
|
_glfwInputWindowMonitorChange(window, monitor);
|
||||||
|
|
||||||
|
const NSUInteger styleMask = getStyleMask(window);
|
||||||
|
[window->ns.object setStyleMask:styleMask];
|
||||||
|
[window->ns.object makeFirstResponder:window->ns.view];
|
||||||
|
|
||||||
|
NSRect contentRect;
|
||||||
|
|
||||||
|
if (monitor)
|
||||||
|
{
|
||||||
|
GLFWvidmode mode;
|
||||||
|
|
||||||
|
_glfwPlatformGetVideoMode(window->monitor, &mode);
|
||||||
|
_glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);
|
||||||
|
|
||||||
|
contentRect = NSMakeRect(xpos, transformY(ypos + mode.height),
|
||||||
|
mode.width, mode.height);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contentRect = NSMakeRect(xpos, transformY(ypos + height),
|
||||||
|
width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
NSRect frameRect = [window->ns.object frameRectForContentRect:contentRect
|
||||||
|
styleMask:styleMask];
|
||||||
|
[window->ns.object setFrame:frameRect display:YES];
|
||||||
|
|
||||||
|
if (monitor)
|
||||||
|
{
|
||||||
|
[window->ns.object setLevel:NSMainMenuWindowLevel + 1];
|
||||||
|
[window->ns.object setHasShadow:NO];
|
||||||
|
|
||||||
|
acquireMonitor(window);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (window->numer != GLFW_DONT_CARE &&
|
||||||
|
window->denom != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
[window->ns.object setContentAspectRatio:NSMakeSize(window->numer,
|
||||||
|
window->denom)];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->minwidth != GLFW_DONT_CARE &&
|
||||||
|
window->minheight != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
[window->ns.object setContentMinSize:NSMakeSize(window->minwidth,
|
||||||
|
window->minheight)];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->maxwidth != GLFW_DONT_CARE &&
|
||||||
|
window->maxheight != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
[window->ns.object setContentMaxSize:NSMakeSize(window->maxwidth,
|
||||||
|
window->maxheight)];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->floating)
|
||||||
|
[window->ns.object setLevel:NSFloatingWindowLevel];
|
||||||
|
else
|
||||||
|
[window->ns.object setLevel:NSNormalWindowLevel];
|
||||||
|
|
||||||
|
[window->ns.object setHasShadow:YES];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return [window->ns.object isKeyWindow];
|
return [window->ns.object isKeyWindow];
|
||||||
|
@ -339,6 +339,10 @@ struct _GLFWwindow
|
|||||||
_GLFWmonitor* monitor;
|
_GLFWmonitor* monitor;
|
||||||
_GLFWcursor* cursor;
|
_GLFWcursor* cursor;
|
||||||
|
|
||||||
|
int minwidth, minheight;
|
||||||
|
int maxwidth, maxheight;
|
||||||
|
int numer, denom;
|
||||||
|
|
||||||
// Window input state
|
// Window input state
|
||||||
GLFWbool stickyKeys;
|
GLFWbool stickyKeys;
|
||||||
GLFWbool stickyMouseButtons;
|
GLFWbool stickyMouseButtons;
|
||||||
@ -694,6 +698,11 @@ void _glfwPlatformHideWindow(_GLFWwindow* window);
|
|||||||
*/
|
*/
|
||||||
void _glfwPlatformFocusWindow(_GLFWwindow* window);
|
void _glfwPlatformFocusWindow(_GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @copydoc glfwSetWindowMonitor
|
||||||
|
* @ingroup platform
|
||||||
|
*/
|
||||||
|
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);
|
||||||
|
|
||||||
/*! @brief Returns whether the window is focused.
|
/*! @brief Returns whether the window is focused.
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
*/
|
*/
|
||||||
@ -856,6 +865,8 @@ void _glfwInputWindowDamage(_GLFWwindow* window);
|
|||||||
*/
|
*/
|
||||||
void _glfwInputWindowCloseRequest(_GLFWwindow* window);
|
void _glfwInputWindowCloseRequest(_GLFWwindow* window);
|
||||||
|
|
||||||
|
void _glfwInputWindowMonitorChange(_GLFWwindow* window, _GLFWmonitor* monitor);
|
||||||
|
|
||||||
/*! @brief Notifies shared code of a physical key event.
|
/*! @brief Notifies shared code of a physical key event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] key The key that was pressed or released.
|
* @param[in] key The key that was pressed or released.
|
||||||
|
@ -508,6 +508,16 @@ void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
|||||||
"Mir: Unsupported function %s", __PRETTY_FUNCTION__);
|
"Mir: Unsupported function %s", __PRETTY_FUNCTION__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
||||||
|
_GLFWmonitor* monitor,
|
||||||
|
int xpos, int ypos,
|
||||||
|
int width, int height,
|
||||||
|
int refreshRate)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"Mir: Unsupported function %s", __PRETTY_FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
@ -126,7 +126,11 @@ void _glfwInputMonitorChange(void)
|
|||||||
for (window = _glfw.windowListHead; window; window = window->next)
|
for (window = _glfw.windowListHead; window; window = window->next)
|
||||||
{
|
{
|
||||||
if (window->monitor == monitors[i])
|
if (window->monitor == monitors[i])
|
||||||
window->monitor = NULL;
|
{
|
||||||
|
int width, height;
|
||||||
|
_glfwPlatformGetWindowSize(window, &width, &height);
|
||||||
|
_glfwPlatformSetWindowMonitor(window, NULL, 0, 0, width, height, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.callbacks.monitor)
|
if (_glfw.callbacks.monitor)
|
||||||
|
@ -197,10 +197,6 @@ 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;
|
||||||
|
|
||||||
|
@ -42,15 +42,20 @@ static DWORD getWindowStyle(const _GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
DWORD style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
|
DWORD style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
|
||||||
|
|
||||||
if (window->decorated && !window->monitor)
|
if (window->monitor)
|
||||||
|
style |= WS_POPUP;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (window->decorated)
|
||||||
{
|
{
|
||||||
style |= WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
|
style |= WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
|
||||||
|
|
||||||
if (window->resizable)
|
if (window->resizable)
|
||||||
style |= WS_MAXIMIZEBOX | WS_SIZEBOX;
|
style |= WS_MAXIMIZEBOX | WS_THICKFRAME;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
style |= WS_POPUP;
|
style |= WS_POPUP;
|
||||||
|
}
|
||||||
|
|
||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
@ -61,8 +66,8 @@ static DWORD getWindowExStyle(const _GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
DWORD style = WS_EX_APPWINDOW;
|
DWORD style = WS_EX_APPWINDOW;
|
||||||
|
|
||||||
if (window->decorated && !window->monitor)
|
if (window->monitor || window->floating)
|
||||||
style |= WS_EX_WINDOWEDGE;
|
style |= WS_EX_TOPMOST;
|
||||||
|
|
||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
@ -190,8 +195,7 @@ static void getFullWindowSize(DWORD style, DWORD exStyle,
|
|||||||
static void applyAspectRatio(_GLFWwindow* window, int edge, RECT* area)
|
static void applyAspectRatio(_GLFWwindow* window, int edge, RECT* area)
|
||||||
{
|
{
|
||||||
int xoff, yoff;
|
int xoff, yoff;
|
||||||
const float ratio = (float) window->win32.numer /
|
const float ratio = (float) window->numer / (float) window->denom;
|
||||||
(float) window->win32.denom;
|
|
||||||
|
|
||||||
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
||||||
0, 0, &xoff, &yoff);
|
0, 0, &xoff, &yoff);
|
||||||
@ -342,7 +346,8 @@ static GLFWbool acquireMonitor(_GLFWwindow* window)
|
|||||||
_glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);
|
_glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);
|
||||||
|
|
||||||
SetWindowPos(window->win32.handle, HWND_TOPMOST,
|
SetWindowPos(window->win32.handle, HWND_TOPMOST,
|
||||||
xpos, ypos, mode.width, mode.height, SWP_NOCOPYBITS);
|
xpos, ypos, mode.width, mode.height,
|
||||||
|
SWP_NOACTIVATE | SWP_NOCOPYBITS);
|
||||||
|
|
||||||
_glfwInputMonitorWindowChange(window->monitor, window);
|
_glfwInputMonitorWindowChange(window->monitor, window);
|
||||||
return status;
|
return status;
|
||||||
@ -639,8 +644,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
|
|
||||||
case WM_SIZING:
|
case WM_SIZING:
|
||||||
{
|
{
|
||||||
if (window->win32.numer == GLFW_DONT_CARE ||
|
if (window->numer == GLFW_DONT_CARE ||
|
||||||
window->win32.denom == GLFW_DONT_CARE)
|
window->denom == GLFW_DONT_CARE)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -654,21 +659,24 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
int xoff, yoff;
|
int xoff, yoff;
|
||||||
MINMAXINFO* mmi = (MINMAXINFO*) lParam;
|
MINMAXINFO* mmi = (MINMAXINFO*) lParam;
|
||||||
|
|
||||||
|
if (window->monitor)
|
||||||
|
break;
|
||||||
|
|
||||||
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
||||||
0, 0, &xoff, &yoff);
|
0, 0, &xoff, &yoff);
|
||||||
|
|
||||||
if (window->win32.minwidth != GLFW_DONT_CARE &&
|
if (window->minwidth != GLFW_DONT_CARE &&
|
||||||
window->win32.minheight != GLFW_DONT_CARE)
|
window->minheight != GLFW_DONT_CARE)
|
||||||
{
|
{
|
||||||
mmi->ptMinTrackSize.x = window->win32.minwidth + xoff;
|
mmi->ptMinTrackSize.x = window->minwidth + xoff;
|
||||||
mmi->ptMinTrackSize.y = window->win32.minheight + yoff;
|
mmi->ptMinTrackSize.y = window->minheight + yoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->win32.maxwidth != GLFW_DONT_CARE &&
|
if (window->maxwidth != GLFW_DONT_CARE &&
|
||||||
window->win32.maxheight != GLFW_DONT_CARE)
|
window->maxheight != GLFW_DONT_CARE)
|
||||||
{
|
{
|
||||||
mmi->ptMaxTrackSize.x = window->win32.maxwidth + xoff;
|
mmi->ptMaxTrackSize.x = window->maxwidth + xoff;
|
||||||
mmi->ptMaxTrackSize.y = window->win32.maxheight + yoff;
|
mmi->ptMaxTrackSize.y = window->maxheight + yoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -827,23 +835,8 @@ static int createWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig)
|
|||||||
WM_COPYGLOBALDATA, MSGFLT_ALLOW, NULL);
|
WM_COPYGLOBALDATA, MSGFLT_ALLOW, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wndconfig->floating && !window->monitor)
|
|
||||||
{
|
|
||||||
SetWindowPos(window->win32.handle,
|
|
||||||
HWND_TOPMOST,
|
|
||||||
0, 0, 0, 0,
|
|
||||||
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
DragAcceptFiles(window->win32.handle, TRUE);
|
DragAcceptFiles(window->win32.handle, TRUE);
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -976,6 +969,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
{
|
{
|
||||||
_glfwPlatformShowWindow(window);
|
_glfwPlatformShowWindow(window);
|
||||||
|
_glfwPlatformFocusWindow(window);
|
||||||
if (!acquireMonitor(window))
|
if (!acquireMonitor(window))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
@ -1093,15 +1087,17 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
|
|||||||
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
|
{
|
||||||
|
if (window->monitor->window == window)
|
||||||
acquireMonitor(window);
|
acquireMonitor(window);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int fullWidth, fullHeight;
|
RECT rect = { 0, 0, width, height };
|
||||||
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
AdjustWindowRectEx(&rect, getWindowStyle(window),
|
||||||
width, height, &fullWidth, &fullHeight);
|
FALSE, getWindowExStyle(window));
|
||||||
|
|
||||||
SetWindowPos(window->win32.handle, HWND_TOP,
|
SetWindowPos(window->win32.handle, HWND_TOP,
|
||||||
0, 0, fullWidth, fullHeight,
|
0, 0, rect.right - rect.left, rect.bottom - rect.top,
|
||||||
SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER);
|
SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1112,11 +1108,6 @@ void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
RECT area;
|
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) &&
|
if ((minwidth == GLFW_DONT_CARE || minheight == GLFW_DONT_CARE) &&
|
||||||
(maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE))
|
(maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE))
|
||||||
{
|
{
|
||||||
@ -1134,9 +1125,6 @@ void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom
|
|||||||
{
|
{
|
||||||
RECT area;
|
RECT area;
|
||||||
|
|
||||||
window->win32.numer = numer;
|
|
||||||
window->win32.denom = denom;
|
|
||||||
|
|
||||||
if (numer == GLFW_DONT_CARE || denom == GLFW_DONT_CARE)
|
if (numer == GLFW_DONT_CARE || denom == GLFW_DONT_CARE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1207,6 +1195,92 @@ void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
|||||||
SetFocus(window->win32.handle);
|
SetFocus(window->win32.handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
||||||
|
_GLFWmonitor* monitor,
|
||||||
|
int xpos, int ypos,
|
||||||
|
int width, int height,
|
||||||
|
int refreshRate)
|
||||||
|
{
|
||||||
|
if (window->monitor == monitor)
|
||||||
|
{
|
||||||
|
if (monitor)
|
||||||
|
{
|
||||||
|
if (monitor->window == window)
|
||||||
|
acquireMonitor(window);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RECT rect = { xpos, ypos, xpos + width, ypos + height };
|
||||||
|
AdjustWindowRectEx(&rect, getWindowStyle(window),
|
||||||
|
FALSE, getWindowExStyle(window));
|
||||||
|
SetWindowPos(window->win32.handle, HWND_TOP,
|
||||||
|
rect.left, rect.top,
|
||||||
|
rect.right - rect.left, rect.bottom - rect.top,
|
||||||
|
SWP_NOCOPYBITS | SWP_NOACTIVATE | SWP_NOZORDER);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->monitor)
|
||||||
|
releaseMonitor(window);
|
||||||
|
|
||||||
|
_glfwInputWindowMonitorChange(window, monitor);
|
||||||
|
|
||||||
|
if (monitor)
|
||||||
|
{
|
||||||
|
GLFWvidmode mode;
|
||||||
|
DWORD style = GetWindowLongPtrW(window->win32.handle, GWL_STYLE);
|
||||||
|
UINT flags = SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOCOPYBITS;
|
||||||
|
|
||||||
|
if (window->decorated)
|
||||||
|
{
|
||||||
|
style &= ~WS_OVERLAPPEDWINDOW;
|
||||||
|
style |= getWindowStyle(window);
|
||||||
|
SetWindowLongPtrW(window->win32.handle, GWL_STYLE, style);
|
||||||
|
|
||||||
|
flags |= SWP_FRAMECHANGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
_glfwPlatformGetVideoMode(monitor, &mode);
|
||||||
|
_glfwPlatformGetMonitorPos(monitor, &xpos, &ypos);
|
||||||
|
|
||||||
|
SetWindowPos(window->win32.handle, HWND_TOPMOST,
|
||||||
|
xpos, ypos, mode.width, mode.height,
|
||||||
|
flags);
|
||||||
|
|
||||||
|
acquireMonitor(window);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HWND after;
|
||||||
|
RECT rect = { xpos, ypos, xpos + width, ypos + height };
|
||||||
|
DWORD style = GetWindowLongPtrW(window->win32.handle, GWL_STYLE);
|
||||||
|
UINT flags = SWP_NOACTIVATE | SWP_NOCOPYBITS;
|
||||||
|
|
||||||
|
if (window->decorated)
|
||||||
|
{
|
||||||
|
style &= ~WS_POPUP;
|
||||||
|
style |= getWindowStyle(window);
|
||||||
|
SetWindowLongPtrW(window->win32.handle, GWL_STYLE, style);
|
||||||
|
|
||||||
|
flags |= SWP_FRAMECHANGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->floating)
|
||||||
|
after = HWND_TOPMOST;
|
||||||
|
else
|
||||||
|
after = HWND_NOTOPMOST;
|
||||||
|
|
||||||
|
AdjustWindowRectEx(&rect, getWindowStyle(window),
|
||||||
|
FALSE, getWindowExStyle(window));
|
||||||
|
SetWindowPos(window->win32.handle, after,
|
||||||
|
rect.left, rect.top,
|
||||||
|
rect.right - rect.left, rect.bottom - rect.top,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
return window->win32.handle == GetActiveWindow();
|
return window->win32.handle == GetActiveWindow();
|
||||||
|
51
src/window.c
51
src/window.c
@ -110,6 +110,11 @@ void _glfwInputWindowCloseRequest(_GLFWwindow* window)
|
|||||||
window->callbacks.close((GLFWwindow*) window);
|
window->callbacks.close((GLFWwindow*) window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwInputWindowMonitorChange(_GLFWwindow* window, _GLFWmonitor* monitor)
|
||||||
|
{
|
||||||
|
window->monitor = monitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW public API //////
|
////// GLFW public API //////
|
||||||
@ -154,13 +159,6 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (monitor)
|
|
||||||
{
|
|
||||||
wndconfig.resizable = GLFW_TRUE;
|
|
||||||
wndconfig.visible = GLFW_TRUE;
|
|
||||||
wndconfig.focused = GLFW_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_glfwIsValidContextConfig(&ctxconfig))
|
if (!_glfwIsValidContextConfig(&ctxconfig))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -182,6 +180,13 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
|
|||||||
window->floating = wndconfig.floating;
|
window->floating = wndconfig.floating;
|
||||||
window->cursorMode = GLFW_CURSOR_NORMAL;
|
window->cursorMode = GLFW_CURSOR_NORMAL;
|
||||||
|
|
||||||
|
window->minwidth = GLFW_DONT_CARE;
|
||||||
|
window->minheight = GLFW_DONT_CARE;
|
||||||
|
window->maxwidth = GLFW_DONT_CARE;
|
||||||
|
window->maxheight = GLFW_DONT_CARE;
|
||||||
|
window->numer = GLFW_DONT_CARE;
|
||||||
|
window->denom = GLFW_DONT_CARE;
|
||||||
|
|
||||||
// Save the currently current context so it can be restored later
|
// Save the currently current context so it can be restored later
|
||||||
previous = _glfwPlatformGetCurrentContext();
|
previous = _glfwPlatformGetCurrentContext();
|
||||||
|
|
||||||
@ -510,11 +515,8 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow* handle, int width, int height)
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
if (window->monitor)
|
|
||||||
{
|
|
||||||
window->videoMode.width = width;
|
window->videoMode.width = width;
|
||||||
window->videoMode.height = height;
|
window->videoMode.height = height;
|
||||||
}
|
|
||||||
|
|
||||||
_glfwPlatformSetWindowSize(window, width, height);
|
_glfwPlatformSetWindowSize(window, width, height);
|
||||||
}
|
}
|
||||||
@ -528,6 +530,11 @@ GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* handle,
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
window->minwidth = minwidth;
|
||||||
|
window->minheight = minheight;
|
||||||
|
window->maxwidth = maxwidth;
|
||||||
|
window->maxheight = maxheight;
|
||||||
|
|
||||||
if (window->monitor || !window->resizable)
|
if (window->monitor || !window->resizable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -543,6 +550,9 @@ GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* handle, int numer, int denom)
|
|||||||
|
|
||||||
_GLFW_REQUIRE_INIT();
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
window->numer = numer;
|
||||||
|
window->denom = denom;
|
||||||
|
|
||||||
if (window->monitor || !window->resizable)
|
if (window->monitor || !window->resizable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -709,6 +719,27 @@ GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* handle)
|
|||||||
return (GLFWmonitor*) window->monitor;
|
return (GLFWmonitor*) window->monitor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetWindowMonitor(GLFWwindow* wh,
|
||||||
|
GLFWmonitor* mh,
|
||||||
|
int xpos, int ypos,
|
||||||
|
int width, int height,
|
||||||
|
int refreshRate)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) wh;
|
||||||
|
_GLFWmonitor* monitor = (_GLFWmonitor*) mh;
|
||||||
|
assert(window);
|
||||||
|
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
|
||||||
|
window->videoMode.width = width;
|
||||||
|
window->videoMode.height = height;
|
||||||
|
window->videoMode.refreshRate = refreshRate;
|
||||||
|
|
||||||
|
_glfwPlatformSetWindowMonitor(window, monitor,
|
||||||
|
xpos, ypos, width, height,
|
||||||
|
refreshRate);
|
||||||
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* handle, void* pointer)
|
GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* handle, void* pointer)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
@ -489,6 +489,16 @@ void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
|||||||
fprintf(stderr, "_glfwPlatformFocusWindow not implemented yet\n");
|
fprintf(stderr, "_glfwPlatformFocusWindow not implemented yet\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
||||||
|
_GLFWmonitor* monitor,
|
||||||
|
int xpos, int ypos,
|
||||||
|
int width, int height,
|
||||||
|
int refreshRate)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
fprintf(stderr, "_glfwPlatformSetWindowMonitor not implemented yet\n");
|
||||||
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
|
358
src/x11_window.c
358
src/x11_window.c
@ -199,6 +199,145 @@ static void sendEventToWM(_GLFWwindow* window, Atom type,
|
|||||||
&event);
|
&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Updates the normal hints according to the window settings
|
||||||
|
//
|
||||||
|
static void updateNormalHints(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
XSizeHints* hints = XAllocSizeHints();
|
||||||
|
|
||||||
|
if (!window->monitor)
|
||||||
|
{
|
||||||
|
if (window->resizable)
|
||||||
|
{
|
||||||
|
if (window->minwidth != GLFW_DONT_CARE &&
|
||||||
|
window->minwidth != GLFW_DONT_CARE &&
|
||||||
|
window->maxwidth != GLFW_DONT_CARE &&
|
||||||
|
window->maxwidth != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
hints->flags |= (PMinSize | PMaxSize);
|
||||||
|
hints->min_width = window->minwidth;
|
||||||
|
hints->min_height = window->minheight;
|
||||||
|
hints->max_width = window->maxwidth;
|
||||||
|
hints->max_height = window->maxheight;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->numer != GLFW_DONT_CARE &&
|
||||||
|
window->denom != GLFW_DONT_CARE)
|
||||||
|
{
|
||||||
|
hints->flags |= PAspect;
|
||||||
|
hints->min_aspect.x = hints->max_aspect.x = window->numer;
|
||||||
|
hints->min_aspect.y = hints->max_aspect.y = window->denom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int width, height;
|
||||||
|
_glfwPlatformGetWindowSize(window, &width, &height);
|
||||||
|
|
||||||
|
hints->flags |= (PMinSize | PMaxSize);
|
||||||
|
hints->min_width = hints->max_width = width;
|
||||||
|
hints->min_height = hints->max_height = height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);
|
||||||
|
XFree(hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updates the full screen status of the window
|
||||||
|
//
|
||||||
|
static void updateWindowMode(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
updateNormalHints(window);
|
||||||
|
|
||||||
|
if (window->monitor)
|
||||||
|
{
|
||||||
|
if (_glfw.x11.xinerama.available &&
|
||||||
|
_glfw.x11.NET_WM_FULLSCREEN_MONITORS)
|
||||||
|
{
|
||||||
|
sendEventToWM(window,
|
||||||
|
_glfw.x11.NET_WM_FULLSCREEN_MONITORS,
|
||||||
|
window->monitor->x11.index,
|
||||||
|
window->monitor->x11.index,
|
||||||
|
window->monitor->x11.index,
|
||||||
|
window->monitor->x11.index,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN)
|
||||||
|
{
|
||||||
|
sendEventToWM(window,
|
||||||
|
_glfw.x11.NET_WM_STATE,
|
||||||
|
_NET_WM_STATE_ADD,
|
||||||
|
_glfw.x11.NET_WM_STATE_FULLSCREEN,
|
||||||
|
0, 1, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This is the butcher's way of removing window decorations
|
||||||
|
// Setting the override-redirect attribute on a window makes the
|
||||||
|
// window manager ignore the window completely (ICCCM, section 4)
|
||||||
|
// The good thing is that this makes undecorated full screen windows
|
||||||
|
// easy to do; the bad thing is that we have to do everything
|
||||||
|
// manually and some things (like iconify/restore) won't work at
|
||||||
|
// all, as those are tasks usually performed by the window manager
|
||||||
|
|
||||||
|
XSetWindowAttributes attributes;
|
||||||
|
attributes.override_redirect = True;
|
||||||
|
XChangeWindowAttributes(_glfw.x11.display,
|
||||||
|
window->x11.handle,
|
||||||
|
CWOverrideRedirect,
|
||||||
|
&attributes);
|
||||||
|
|
||||||
|
window->x11.overrideRedirect = GLFW_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_glfw.x11.NET_WM_BYPASS_COMPOSITOR)
|
||||||
|
{
|
||||||
|
const unsigned long value = 1;
|
||||||
|
|
||||||
|
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||||
|
_glfw.x11.NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32,
|
||||||
|
PropModeReplace, (unsigned char*) &value, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_glfw.x11.xinerama.available &&
|
||||||
|
_glfw.x11.NET_WM_FULLSCREEN_MONITORS)
|
||||||
|
{
|
||||||
|
XDeleteProperty(_glfw.x11.display, window->x11.handle,
|
||||||
|
_glfw.x11.NET_WM_FULLSCREEN_MONITORS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN)
|
||||||
|
{
|
||||||
|
sendEventToWM(window,
|
||||||
|
_glfw.x11.NET_WM_STATE,
|
||||||
|
_NET_WM_STATE_REMOVE,
|
||||||
|
_glfw.x11.NET_WM_STATE_FULLSCREEN,
|
||||||
|
0, 1, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XSetWindowAttributes attributes;
|
||||||
|
attributes.override_redirect = False;
|
||||||
|
XChangeWindowAttributes(_glfw.x11.display,
|
||||||
|
window->x11.handle,
|
||||||
|
CWOverrideRedirect,
|
||||||
|
&attributes);
|
||||||
|
|
||||||
|
window->x11.overrideRedirect = GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_glfw.x11.NET_WM_BYPASS_COMPOSITOR)
|
||||||
|
{
|
||||||
|
XDeleteProperty(_glfw.x11.display, window->x11.handle,
|
||||||
|
_glfw.x11.NET_WM_BYPASS_COMPOSITOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Splits and translates a text/uri-list into separate file paths
|
// Splits and translates a text/uri-list into separate file paths
|
||||||
// NOTE: This function destroys the provided string
|
// NOTE: This function destroys the provided string
|
||||||
//
|
//
|
||||||
@ -300,30 +439,6 @@ static GLFWbool createWindow(_GLFWwindow* window,
|
|||||||
(XPointer) window);
|
(XPointer) window);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->monitor)
|
|
||||||
{
|
|
||||||
if (!_glfw.x11.NET_WM_STATE || !_glfw.x11.NET_WM_STATE_FULLSCREEN)
|
|
||||||
{
|
|
||||||
// This is the butcher's way of removing window decorations
|
|
||||||
// Setting the override-redirect attribute on a window makes the
|
|
||||||
// window manager ignore the window completely (ICCCM, section 4)
|
|
||||||
// The good thing is that this makes undecorated full screen windows
|
|
||||||
// easy to do; the bad thing is that we have to do everything
|
|
||||||
// manually and some things (like iconify/restore) won't work at
|
|
||||||
// all, as those are tasks usually performed by the window manager
|
|
||||||
|
|
||||||
XSetWindowAttributes attributes;
|
|
||||||
attributes.override_redirect = True;
|
|
||||||
XChangeWindowAttributes(_glfw.x11.display,
|
|
||||||
window->x11.handle,
|
|
||||||
CWOverrideRedirect,
|
|
||||||
&attributes);
|
|
||||||
|
|
||||||
window->x11.overrideRedirect = GLFW_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!wndconfig->decorated)
|
if (!wndconfig->decorated)
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
@ -350,15 +465,14 @@ static GLFWbool createWindow(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_ABOVE)
|
if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_ABOVE)
|
||||||
{
|
{
|
||||||
sendEventToWM(window,
|
Atom value = _glfw.x11.NET_WM_STATE_ABOVE;
|
||||||
_glfw.x11.NET_WM_STATE,
|
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||||
_NET_WM_STATE_ADD,
|
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||||
_glfw.x11.NET_WM_STATE_ABOVE,
|
PropModeReplace, (unsigned char*) &value, 1);
|
||||||
0, 1, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wndconfig->maximized)
|
if (wndconfig->maximized && !window->monitor)
|
||||||
{
|
{
|
||||||
if (_glfw.x11.NET_WM_STATE &&
|
if (_glfw.x11.NET_WM_STATE &&
|
||||||
_glfw.x11.NET_WM_STATE_MAXIMIZED_VERT &&
|
_glfw.x11.NET_WM_STATE_MAXIMIZED_VERT &&
|
||||||
@ -375,8 +489,6 @@ static GLFWbool createWindow(_GLFWwindow* window,
|
|||||||
PropModeReplace, (unsigned char*) &states, 2);
|
PropModeReplace, (unsigned char*) &states, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Declare the WM protocols supported by GLFW
|
// Declare the WM protocols supported by GLFW
|
||||||
{
|
{
|
||||||
@ -436,27 +548,7 @@ static GLFWbool createWindow(_GLFWwindow* window,
|
|||||||
XFree(hints);
|
XFree(hints);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set ICCCM WM_NORMAL_HINTS property (even if no parts are set)
|
updateNormalHints(window);
|
||||||
{
|
|
||||||
XSizeHints* hints = XAllocSizeHints();
|
|
||||||
hints->flags = 0;
|
|
||||||
|
|
||||||
if (window->monitor)
|
|
||||||
{
|
|
||||||
hints->flags |= PPosition;
|
|
||||||
_glfwPlatformGetMonitorPos(window->monitor, &hints->x, &hints->y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wndconfig->resizable)
|
|
||||||
{
|
|
||||||
hints->flags |= (PMinSize | PMaxSize);
|
|
||||||
hints->min_width = hints->max_width = wndconfig->width;
|
|
||||||
hints->min_height = hints->max_height = wndconfig->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);
|
|
||||||
XFree(hints);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set ICCCM WM_CLASS property
|
// Set ICCCM WM_CLASS property
|
||||||
// HACK: Until a mechanism for specifying the application name is added, the
|
// HACK: Until a mechanism for specifying the application name is added, the
|
||||||
@ -731,24 +823,17 @@ static GLFWbool acquireMonitor(_GLFWwindow* window)
|
|||||||
DefaultExposures);
|
DefaultExposures);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!window->monitor->window)
|
||||||
_glfw.x11.saver.count++;
|
_glfw.x11.saver.count++;
|
||||||
|
|
||||||
status = _glfwSetVideoModeX11(window->monitor, &window->videoMode);
|
status = _glfwSetVideoModeX11(window->monitor, &window->videoMode);
|
||||||
|
|
||||||
if (_glfw.x11.NET_WM_BYPASS_COMPOSITOR)
|
if (window->x11.overrideRedirect)
|
||||||
{
|
|
||||||
const unsigned long value = 1;
|
|
||||||
|
|
||||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
|
||||||
_glfw.x11.NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32,
|
|
||||||
PropModeReplace, (unsigned char*) &value, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Position the window over its monitor
|
|
||||||
{
|
{
|
||||||
int xpos, ypos;
|
int xpos, ypos;
|
||||||
GLFWvidmode mode;
|
GLFWvidmode mode;
|
||||||
|
|
||||||
|
// Manually position the window over its monitor
|
||||||
_glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);
|
_glfwPlatformGetMonitorPos(window->monitor, &xpos, &ypos);
|
||||||
_glfwPlatformGetVideoMode(window->monitor, &mode);
|
_glfwPlatformGetVideoMode(window->monitor, &mode);
|
||||||
|
|
||||||
@ -756,31 +841,6 @@ static GLFWbool acquireMonitor(_GLFWwindow* window)
|
|||||||
xpos, ypos, mode.width, mode.height);
|
xpos, ypos, mode.width, mode.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.x11.xinerama.available && _glfw.x11.NET_WM_FULLSCREEN_MONITORS)
|
|
||||||
{
|
|
||||||
sendEventToWM(window,
|
|
||||||
_glfw.x11.NET_WM_FULLSCREEN_MONITORS,
|
|
||||||
window->monitor->x11.index,
|
|
||||||
window->monitor->x11.index,
|
|
||||||
window->monitor->x11.index,
|
|
||||||
window->monitor->x11.index,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwPlatformFocusWindow(window);
|
|
||||||
|
|
||||||
if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN)
|
|
||||||
{
|
|
||||||
// Ask the window manager to make the GLFW window a full screen window
|
|
||||||
// Full screen windows are undecorated and, when focused, are kept
|
|
||||||
// on top of all other windows
|
|
||||||
sendEventToWM(window,
|
|
||||||
_glfw.x11.NET_WM_STATE,
|
|
||||||
_NET_WM_STATE_ADD,
|
|
||||||
_glfw.x11.NET_WM_STATE_FULLSCREEN,
|
|
||||||
0, 1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
_glfwInputMonitorWindowChange(window->monitor, window);
|
_glfwInputMonitorWindowChange(window->monitor, window);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -1124,9 +1184,6 @@ static void processEvent(XEvent *event)
|
|||||||
|
|
||||||
case ConfigureNotify:
|
case ConfigureNotify:
|
||||||
{
|
{
|
||||||
if (!window->x11.overrideRedirect && !event->xany.send_event)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (event->xconfigure.width != window->x11.width ||
|
if (event->xconfigure.width != window->x11.width ||
|
||||||
event->xconfigure.height != window->x11.height)
|
event->xconfigure.height != window->x11.height)
|
||||||
{
|
{
|
||||||
@ -1144,6 +1201,8 @@ static void processEvent(XEvent *event)
|
|||||||
|
|
||||||
if (event->xconfigure.x != window->x11.xpos ||
|
if (event->xconfigure.x != window->x11.xpos ||
|
||||||
event->xconfigure.y != window->x11.ypos)
|
event->xconfigure.y != window->x11.ypos)
|
||||||
|
{
|
||||||
|
if (window->x11.overrideRedirect || event->xany.send_event)
|
||||||
{
|
{
|
||||||
_glfwInputWindowPos(window,
|
_glfwInputWindowPos(window,
|
||||||
event->xconfigure.x,
|
event->xconfigure.x,
|
||||||
@ -1152,6 +1211,7 @@ static void processEvent(XEvent *event)
|
|||||||
window->x11.xpos = event->xconfigure.x;
|
window->x11.xpos = event->xconfigure.x;
|
||||||
window->x11.ypos = event->xconfigure.y;
|
window->x11.ypos = event->xconfigure.y;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1459,6 +1519,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
{
|
{
|
||||||
_glfwPlatformShowWindow(window);
|
_glfwPlatformShowWindow(window);
|
||||||
|
updateWindowMode(window);
|
||||||
if (!acquireMonitor(window))
|
if (!acquireMonitor(window))
|
||||||
return GLFW_FALSE;
|
return GLFW_FALSE;
|
||||||
}
|
}
|
||||||
@ -1654,31 +1715,13 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
{
|
{
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
{
|
{
|
||||||
_glfwSetVideoModeX11(window->monitor, &window->videoMode);
|
if (window->monitor->window == window)
|
||||||
|
acquireMonitor(window);
|
||||||
if (!_glfw.x11.NET_WM_STATE || !_glfw.x11.NET_WM_STATE_FULLSCREEN)
|
|
||||||
{
|
|
||||||
GLFWvidmode mode;
|
|
||||||
_glfwPlatformGetVideoMode(window->monitor, &mode);
|
|
||||||
XResizeWindow(_glfw.x11.display, window->x11.handle,
|
|
||||||
mode.width, mode.height);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!window->resizable)
|
if (!window->resizable)
|
||||||
{
|
updateNormalHints(window);
|
||||||
// Update window size restrictions to match new window size
|
|
||||||
|
|
||||||
XSizeHints* hints = XAllocSizeHints();
|
|
||||||
|
|
||||||
hints->flags |= (PMinSize | PMaxSize);
|
|
||||||
hints->min_width = hints->max_width = width;
|
|
||||||
hints->min_height = hints->max_height = height;
|
|
||||||
|
|
||||||
XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints);
|
|
||||||
XFree(hints);
|
|
||||||
}
|
|
||||||
|
|
||||||
XResizeWindow(_glfw.x11.display, window->x11.handle, width, height);
|
XResizeWindow(_glfw.x11.display, window->x11.handle, width, height);
|
||||||
}
|
}
|
||||||
@ -1690,55 +1733,14 @@ void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
|||||||
int minwidth, int minheight,
|
int minwidth, int minheight,
|
||||||
int maxwidth, int maxheight)
|
int maxwidth, int maxheight)
|
||||||
{
|
{
|
||||||
long supplied;
|
updateNormalHints(window);
|
||||||
XSizeHints* hints = XAllocSizeHints();
|
XFlush(_glfw.x11.display);
|
||||||
|
|
||||||
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)
|
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)
|
||||||
{
|
{
|
||||||
long supplied;
|
updateNormalHints(window);
|
||||||
XSizeHints* hints = XAllocSizeHints();
|
XFlush(_glfw.x11.display);
|
||||||
|
|
||||||
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)
|
||||||
@ -1907,6 +1909,48 @@ void _glfwPlatformFocusWindow(_GLFWwindow* window)
|
|||||||
XFlush(_glfw.x11.display);
|
XFlush(_glfw.x11.display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
|
||||||
|
_GLFWmonitor* monitor,
|
||||||
|
int xpos, int ypos,
|
||||||
|
int width, int height,
|
||||||
|
int refreshRate)
|
||||||
|
{
|
||||||
|
if (window->monitor == monitor)
|
||||||
|
{
|
||||||
|
if (monitor)
|
||||||
|
{
|
||||||
|
if (monitor->window == window)
|
||||||
|
acquireMonitor(window);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XMoveResizeWindow(_glfw.x11.display, window->x11.handle,
|
||||||
|
xpos, ypos, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window->monitor)
|
||||||
|
releaseMonitor(window);
|
||||||
|
|
||||||
|
_glfwInputWindowMonitorChange(window, monitor);
|
||||||
|
updateWindowMode(window);
|
||||||
|
|
||||||
|
if (window->monitor)
|
||||||
|
{
|
||||||
|
XMapRaised(_glfw.x11.display, window->x11.handle);
|
||||||
|
acquireMonitor(window);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XMoveResizeWindow(_glfw.x11.display, window->x11.handle,
|
||||||
|
xpos, ypos, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
XFlush(_glfw.x11.display);
|
||||||
|
}
|
||||||
|
|
||||||
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
int _glfwPlatformWindowFocused(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
Window focused;
|
Window focused;
|
||||||
|
@ -36,6 +36,8 @@
|
|||||||
|
|
||||||
#include "getopt.h"
|
#include "getopt.h"
|
||||||
|
|
||||||
|
static int windowed_xpos, windowed_ypos, windowed_width, windowed_height;
|
||||||
|
|
||||||
static void usage(void)
|
static void usage(void)
|
||||||
{
|
{
|
||||||
printf("Usage: iconify [-h] [-f [-a] [-n]]\n");
|
printf("Usage: iconify [-h] [-f [-a] [-n]]\n");
|
||||||
@ -74,6 +76,34 @@ static void key_callback(GLFWwindow* window, int key, int scancode, int action,
|
|||||||
case GLFW_KEY_ESCAPE:
|
case GLFW_KEY_ESCAPE:
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||||||
break;
|
break;
|
||||||
|
case GLFW_KEY_ENTER:
|
||||||
|
{
|
||||||
|
if (mods != GLFW_MOD_ALT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (glfwGetWindowMonitor(window))
|
||||||
|
{
|
||||||
|
glfwSetWindowMonitor(window, NULL,
|
||||||
|
windowed_xpos, windowed_ypos,
|
||||||
|
windowed_width, windowed_height,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GLFWmonitor* monitor = glfwGetPrimaryMonitor();
|
||||||
|
if (monitor)
|
||||||
|
{
|
||||||
|
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
||||||
|
glfwGetWindowPos(window, &windowed_xpos, &windowed_ypos);
|
||||||
|
glfwGetWindowSize(window, &windowed_width, &windowed_height);
|
||||||
|
glfwSetWindowMonitor(window, monitor,
|
||||||
|
0, 0, mode->width, mode->height,
|
||||||
|
mode->refreshRate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user