@ -39,72 +39,6 @@
# include <poll.h>
static void shellSurfaceHandlePing ( void * data ,
struct wl_shell_surface * shellSurface ,
uint32_t serial )
{
wl_shell_surface_pong ( shellSurface , serial ) ;
}
static void shellSurfaceHandleConfigure ( void * data ,
struct wl_shell_surface * shellSurface ,
uint32_t edges ,
int32_t width ,
int32_t height )
{
_GLFWwindow * window = data ;
float aspectRatio ;
float targetRatio ;
if ( ! window - > monitor )
{
if ( _glfw . wl . viewporter & & window - > decorated )
{
width - = _GLFW_DECORATION_HORIZONTAL ;
height - = _GLFW_DECORATION_VERTICAL ;
}
if ( width < 1 )
width = 1 ;
if ( height < 1 )
height = 1 ;
if ( window - > numer ! = GLFW_DONT_CARE & & window - > denom ! = GLFW_DONT_CARE )
{
aspectRatio = ( float ) width / ( float ) height ;
targetRatio = ( float ) window - > numer / ( float ) window - > denom ;
if ( aspectRatio < targetRatio )
height = width / targetRatio ;
else if ( aspectRatio > targetRatio )
width = height * targetRatio ;
}
if ( window - > minwidth ! = GLFW_DONT_CARE & & width < window - > minwidth )
width = window - > minwidth ;
else if ( window - > maxwidth ! = GLFW_DONT_CARE & & width > window - > maxwidth )
width = window - > maxwidth ;
if ( window - > minheight ! = GLFW_DONT_CARE & & height < window - > minheight )
height = window - > minheight ;
else if ( window - > maxheight ! = GLFW_DONT_CARE & & height > window - > maxheight )
height = window - > maxheight ;
}
_glfwInputWindowSize ( window , width , height ) ;
_glfwPlatformSetWindowSize ( window , width , height ) ;
_glfwInputWindowDamage ( window ) ;
}
static void shellSurfaceHandlePopupDone ( void * data ,
struct wl_shell_surface * shellSurface )
{
}
static const struct wl_shell_surface_listener shellSurfaceListener = {
shellSurfaceHandlePing ,
shellSurfaceHandleConfigure ,
shellSurfaceHandlePopupDone
} ;
static int createTmpfileCloexec ( char * tmpname )
{
int fd ;
@ -529,66 +463,11 @@ static void setFullscreen(_GLFWwindow* window, _GLFWmonitor* monitor,
window - > wl . xdg . toplevel ,
monitor - > wl . output ) ;
}
else if ( window - > wl . shellSurface )
{
wl_shell_surface_set_fullscreen (
window - > wl . shellSurface ,
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT ,
refreshRate * 1000 , // Convert Hz to mHz.
monitor - > wl . output ) ;
}
setIdleInhibitor ( window , GLFW_TRUE ) ;
if ( ! window - > wl . decorations . serverSide )
destroyDecorations ( window ) ;
}
static GLFWbool createShellSurface ( _GLFWwindow * window )
{
if ( ! _glfw . wl . shell )
{
_glfwInputError ( GLFW_PLATFORM_ERROR ,
" Wayland: wl_shell protocol not available " ) ;
return GLFW_FALSE ;
}
window - > wl . shellSurface = wl_shell_get_shell_surface ( _glfw . wl . shell ,
window - > wl . surface ) ;
if ( ! window - > wl . shellSurface )
{
_glfwInputError ( GLFW_PLATFORM_ERROR ,
" Wayland: Shell surface creation failed " ) ;
return GLFW_FALSE ;
}
wl_shell_surface_add_listener ( window - > wl . shellSurface ,
& shellSurfaceListener ,
window ) ;
if ( window - > wl . title )
wl_shell_surface_set_title ( window - > wl . shellSurface , window - > wl . title ) ;
if ( window - > monitor )
{
setFullscreen ( window , window - > monitor , 0 ) ;
}
else if ( window - > wl . maximized )
{
wl_shell_surface_set_maximized ( window - > wl . shellSurface , NULL ) ;
setIdleInhibitor ( window , GLFW_FALSE ) ;
createDecorations ( window ) ;
}
else
{
wl_shell_surface_set_toplevel ( window - > wl . shellSurface ) ;
setIdleInhibitor ( window , GLFW_FALSE ) ;
createDecorations ( window ) ;
}
wl_surface_commit ( window - > wl . surface ) ;
return GLFW_TRUE ;
}
static void xdgToplevelHandleConfigure ( void * data ,
struct xdg_toplevel * toplevel ,
int32_t width ,
@ -949,16 +828,8 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
if ( wndconfig - > visible )
{
if ( _glfw . wl . wmBase )
{
if ( ! createXdgSurface ( window ) )
return GLFW_FALSE ;
}
else
{
if ( ! createShellSurface ( window ) )
return GLFW_FALSE ;
}
if ( ! createXdgSurface ( window ) )
return GLFW_FALSE ;
window - > wl . visible = GLFW_TRUE ;
}
@ -966,7 +837,6 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
{
window - > wl . xdg . surface = NULL ;
window - > wl . xdg . toplevel = NULL ;
window - > wl . shellSurface = NULL ;
window - > wl . visible = GLFW_FALSE ;
}
@ -1008,9 +878,6 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
if ( window - > wl . native )
wl_egl_window_destroy ( window - > wl . native ) ;
if ( window - > wl . shellSurface )
wl_shell_surface_destroy ( window - > wl . shellSurface ) ;
if ( window - > wl . xdg . toplevel )
xdg_toplevel_destroy ( window - > wl . xdg . toplevel ) ;
@ -1031,8 +898,6 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
window - > wl . title = _glfw_strdup ( title ) ;
if ( window - > wl . xdg . toplevel )
xdg_toplevel_set_title ( window - > wl . xdg . toplevel , title ) ;
else if ( window - > wl . shellSurface )
wl_shell_surface_set_title ( window - > wl . shellSurface , title ) ;
}
void _glfwPlatformSetWindowIcon ( _GLFWwindow * window ,
@ -1078,23 +943,15 @@ void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
int minwidth , int minheight ,
int maxwidth , int maxheight )
{
if ( _glfw . wl . wmBase )
{
if ( window - > wl . xdg . toplevel )
{
if ( minwidth = = GLFW_DONT_CARE | | minheight = = GLFW_DONT_CARE )
minwidth = minheight = 0 ;
if ( maxwidth = = GLFW_DONT_CARE | | maxheight = = GLFW_DONT_CARE )
maxwidth = maxheight = 0 ;
xdg_toplevel_set_min_size ( window - > wl . xdg . toplevel , minwidth , minheight ) ;
xdg_toplevel_set_max_size ( window - > wl . xdg . toplevel , maxwidth , maxheight ) ;
wl_surface_commit ( window - > wl . surface ) ;
}
}
else
if ( window - > wl . xdg . toplevel )
{
// TODO: find out how to trigger a resize.
// The actual limits are checked in the wl_shell_surface::configure handler.
if ( minwidth = = GLFW_DONT_CARE | | minheight = = GLFW_DONT_CARE )
minwidth = minheight = 0 ;
if ( maxwidth = = GLFW_DONT_CARE | | maxheight = = GLFW_DONT_CARE )
maxwidth = maxheight = 0 ;
xdg_toplevel_set_min_size ( window - > wl . xdg . toplevel , minwidth , minheight ) ;
xdg_toplevel_set_max_size ( window - > wl . xdg . toplevel , maxwidth , maxheight ) ;
wl_surface_commit ( window - > wl . surface ) ;
}
}
@ -1102,7 +959,7 @@ void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window,
int numer , int denom )
{
// TODO: find out how to trigger a resize.
// The actual limits are checked in the wl_shell_surface ::configure handler.
// The actual limits are checked in the xdg_toplevel ::configure handler.
}
void _glfwPlatformGetFramebufferSize ( _GLFWwindow * window ,
@ -1141,16 +998,8 @@ void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
void _glfwPlatformIconifyWindow ( _GLFWwindow * window )
{
if ( _glfw . wl . wmBase )
{
if ( window - > wl . xdg . toplevel )
xdg_toplevel_set_minimized ( window - > wl . xdg . toplevel ) ;
}
else
{
_glfwInputError ( GLFW_PLATFORM_ERROR ,
" Wayland: Iconify window not supported on wl_shell " ) ;
}
if ( window - > wl . xdg . toplevel )
xdg_toplevel_set_minimized ( window - > wl . xdg . toplevel ) ;
}
void _glfwPlatformRestoreWindow ( _GLFWwindow * window )
@ -1162,12 +1011,7 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window)
if ( window - > wl . maximized )
xdg_toplevel_unset_maximized ( window - > wl . xdg . toplevel ) ;
// There is no way to unset minimized, or even to know if we are
// minimized, so there is nothing to do here.
}
else if ( window - > wl . shellSurface )
{
if ( window - > monitor | | window - > wl . maximized )
wl_shell_surface_set_toplevel ( window - > wl . shellSurface ) ;
// minimized, so there is nothing to do in this case.
}
_glfwInputWindowMonitor ( window , NULL ) ;
window - > wl . maximized = GLFW_FALSE ;
@ -1179,11 +1023,6 @@ void _glfwPlatformMaximizeWindow(_GLFWwindow* window)
{
xdg_toplevel_set_maximized ( window - > wl . xdg . toplevel ) ;
}
else if ( window - > wl . shellSurface )
{
// Let the compositor select the best output.
wl_shell_surface_set_maximized ( window - > wl . shellSurface , NULL ) ;
}
window - > wl . maximized = GLFW_TRUE ;
}
@ -1191,10 +1030,7 @@ void _glfwPlatformShowWindow(_GLFWwindow* window)
{
if ( ! window - > wl . visible )
{
if ( _glfw . wl . wmBase )
createXdgSurface ( window ) ;
else if ( ! window - > wl . shellSurface )
createShellSurface ( window ) ;
createXdgSurface ( window ) ;
window - > wl . visible = GLFW_TRUE ;
}
}
@ -1208,11 +1044,6 @@ void _glfwPlatformHideWindow(_GLFWwindow* window)
window - > wl . xdg . toplevel = NULL ;
window - > wl . xdg . surface = NULL ;
}
else if ( window - > wl . shellSurface )
{
wl_shell_surface_destroy ( window - > wl . shellSurface ) ;
window - > wl . shellSurface = NULL ;
}
window - > wl . visible = GLFW_FALSE ;
}
@ -1243,8 +1074,6 @@ void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
{
if ( window - > wl . xdg . toplevel )
xdg_toplevel_unset_fullscreen ( window - > wl . xdg . toplevel ) ;
else if ( window - > wl . shellSurface )
wl_shell_surface_set_toplevel ( window - > wl . shellSurface ) ;
setIdleInhibitor ( window , GLFW_FALSE ) ;
if ( ! _glfw . wl . decorationManager )
createDecorations ( window ) ;
@ -1259,8 +1088,8 @@ int _glfwPlatformWindowFocused(_GLFWwindow* window)
int _glfwPlatformWindowIconified ( _GLFWwindow * window )
{
// wl_shell doesn't have any iconified concept, and xdg-shell doesn’t give
// any way to request whether a surface is iconified.
// xdg-shell doesn’t give any way to request whether a surface is
// iconified.
return GLFW_FALSE ;
}