aminal/vendor/github.com/go-gl/glfw/v3.3/glfw/window.go

1179 lines
40 KiB
Go

package glfw
//#include <stdlib.h>
//#include "glfw/include/GLFW/glfw3.h"
//void glfwSetWindowPosCallbackCB(GLFWwindow *window);
//void glfwSetWindowSizeCallbackCB(GLFWwindow *window);
//void glfwSetFramebufferSizeCallbackCB(GLFWwindow *window);
//void glfwSetWindowCloseCallbackCB(GLFWwindow *window);
//void glfwSetWindowRefreshCallbackCB(GLFWwindow *window);
//void glfwSetWindowFocusCallbackCB(GLFWwindow *window);
//void glfwSetWindowIconifyCallbackCB(GLFWwindow *window);
//void glfwSetWindowMaximizeCallbackCB(GLFWwindow *window);
//void glfwSetWindowContentScaleCallbackCB(GLFWwindow *window);
import "C"
import (
"image"
"image/draw"
"sync"
"unsafe"
)
// Internal window list stuff
type windowList struct {
l sync.Mutex
m map[*C.GLFWwindow]*Window
}
var windows = windowList{m: map[*C.GLFWwindow]*Window{}}
func (w *windowList) put(wnd *Window) {
w.l.Lock()
defer w.l.Unlock()
w.m[wnd.data] = wnd
}
func (w *windowList) remove(wnd *C.GLFWwindow) {
w.l.Lock()
defer w.l.Unlock()
delete(w.m, wnd)
}
func (w *windowList) get(wnd *C.GLFWwindow) *Window {
w.l.Lock()
defer w.l.Unlock()
return w.m[wnd]
}
// Hint can correspond to hints that can be set before initializing GLFW,
// creating a window or to the attributes of the window that can be get after
// its creation.
type Hint int
// Init related hints.
const (
JoystickHatButtons Hint = C.GLFW_JOYSTICK_HAT_BUTTONS
CocoaChdirResources Hint = C.GLFW_COCOA_CHDIR_RESOURCES
CocoaMenubar Hint = C.GLFW_COCOA_MENUBAR
)
// Window related hints/attribs.
const (
// Specifies whether the window will be given input focus when created.
// This hint is ignored for full screen and initially hidden windows.
Focused Hint = C.GLFW_FOCUSED
// Specifies whether the window will be minimized.
Iconified Hint = C.GLFW_ICONIFIED
// Specifies whether the window is maximized.
Maximized Hint = C.GLFW_MAXIMIZED
// Specifies whether the cursor is currently directly over the client area
// of the window, with no other windows between
Hovered Hint = C.GLFW_HOVERED
// Specifies whether the window will be initially visible.
Visible Hint = C.GLFW_VISIBLE
// Specifies whether the window will be resizable by the user.
Resizable Hint = C.GLFW_RESIZABLE
// Specifies whether the window will have window decorations such as a
// border, a close widget, etc.
Decorated Hint = C.GLFW_DECORATED
// Specifies whether the window will be always-on-top.
Floating Hint = C.GLFW_FLOATING
// Specifies whether fullscreen windows automatically iconify (and restore
// the previous video mode) on focus loss.
AutoIconify Hint = C.GLFW_AUTO_ICONIFY
// Specifies whether the cursor should be centered over newly created full
// screen windows. This hint is ignored for windowed mode windows.
CenterCursor Hint = C.GLFW_CENTER_CURSOR
)
// Context related hints.
const (
// Specifies which client API to create the context for. Hard constraint.
ClientAPI Hint = C.GLFW_CLIENT_API
// Specifies the client API version that the created context must be
// compatible with.
ContextVersionMajor Hint = C.GLFW_CONTEXT_VERSION_MAJOR
// Specifies the client API version that the created context must be
// compatible with.
ContextVersionMinor Hint = C.GLFW_CONTEXT_VERSION_MINOR
// Specifies the robustness strategy to be used by the context.
ContextRobustness Hint = C.GLFW_CONTEXT_ROBUSTNESS
// Specifies the release behavior to be used by the context.
ContextReleaseBehavior Hint = C.GLFW_CONTEXT_RELEASE_BEHAVIOR
// Specifies whether the OpenGL context should be forward-compatible.
// Hard constraint.
OpenGLForwardCompatible Hint = C.GLFW_OPENGL_FORWARD_COMPAT
// Specifies whether to create a debug OpenGL context, which may have
// additional error and performance issue reporting functionality. If
// OpenGL ES is requested, this hint is ignored.
OpenGLDebugContext Hint = C.GLFW_OPENGL_DEBUG_CONTEXT
// Specifies which OpenGL profile to create the context for.
// Hard constraint.
OpenGLProfile Hint = C.GLFW_OPENGL_PROFILE
// Specifies which context creation API to use to create the context.
ContextCreationAPI Hint = C.GLFW_CONTEXT_CREATION_API
)
// Framebuffer related hints.
const (
ContextRevision Hint = C.GLFW_CONTEXT_REVISION
// Specifies the desired bit depth of the default framebuffer.
RedBits Hint = C.GLFW_RED_BITS
// Specifies the desired bit depth of the default framebuffer.
GreenBits Hint = C.GLFW_GREEN_BITS
// Specifies the desired bit depth of the default framebuffer.
BlueBits Hint = C.GLFW_BLUE_BITS
// Specifies the desired bit depth of the default framebuffer.
AlphaBits Hint = C.GLFW_ALPHA_BITS
// Specifies the desired bit depth of the default framebuffer.
DepthBits Hint = C.GLFW_DEPTH_BITS
// Specifies the desired bit depth of the default framebuffer.
StencilBits Hint = C.GLFW_STENCIL_BITS
// Specifies the desired bit depth of the accumulation buffer.
AccumRedBits Hint = C.GLFW_ACCUM_RED_BITS
// Specifies the desired bit depth of the accumulation buffer.
AccumGreenBits Hint = C.GLFW_ACCUM_GREEN_BITS
// Specifies the desired bit depth of the accumulation buffer.
AccumBlueBits Hint = C.GLFW_ACCUM_BLUE_BITS
// Specifies the desired bit depth of the accumulation buffer.
AccumAlphaBits Hint = C.GLFW_ACCUM_ALPHA_BITS
// Specifies the desired number of auxiliary buffers.
AuxBuffers Hint = C.GLFW_AUX_BUFFERS
// Specifies whether to use stereoscopic rendering. Hard constraint.
Stereo Hint = C.GLFW_STEREO
// Specifies the desired number of samples to use for multisampling. Zero
// disables multisampling.
Samples Hint = C.GLFW_SAMPLES
// Specifies whether the framebuffer should be sRGB capable.
SRGBCapable Hint = C.GLFW_SRGB_CAPABLE
// Specifies the desired refresh rate for full screen windows. If set to
// zero, the highest available refresh rate will be used. This hint is
// ignored for windowed mode windows.
RefreshRate Hint = C.GLFW_REFRESH_RATE
// Specifies whether the framebuffer should be double buffered. You nearly
// always want to use double buffering. This is a hard constraint.
DoubleBuffer Hint = C.GLFW_DOUBLEBUFFER
// Specifies whether the framebuffer should be transparent.
TransparentFramebuffer Hint = C.GLFW_TRANSPARENT_FRAMEBUFFER
)
// Values for the ClientAPI hint.
const (
OpenGLAPI int = C.GLFW_OPENGL_API
OpenGLESAPI int = C.GLFW_OPENGL_ES_API
NoAPI int = C.GLFW_NO_API
)
// Values for ContextCreationAPI hint.
const (
NativeContextAPI int = C.GLFW_NATIVE_CONTEXT_API
EGLContextAPI int = C.GLFW_EGL_CONTEXT_API
OSMesaContextAPI int = C.GLFW_OSMESA_CONTEXT_API
)
// Values for the ContextRobustness hint.
const (
NoRobustness int = C.GLFW_NO_ROBUSTNESS
NoResetNotification int = C.GLFW_NO_RESET_NOTIFICATION
LoseContextOnReset int = C.GLFW_LOSE_CONTEXT_ON_RESET
)
// Values for ContextReleaseBehavior hint.
const (
AnyReleaseBehavior int = C.GLFW_ANY_RELEASE_BEHAVIOR
ReleaseBehaviorFlush int = C.GLFW_RELEASE_BEHAVIOR_FLUSH
ReleaseBehaviorNone int = C.GLFW_RELEASE_BEHAVIOR_NONE
)
// Values for the OpenGLProfile hint.
const (
OpenGLAnyProfile int = C.GLFW_OPENGL_ANY_PROFILE
OpenGLCoreProfile int = C.GLFW_OPENGL_CORE_PROFILE
OpenGLCompatProfile int = C.GLFW_OPENGL_COMPAT_PROFILE
)
// Other values.
const (
True int = C.GL_TRUE
False int = C.GL_FALSE
DontCare int = C.GLFW_DONT_CARE
)
// PosCallback is the function signature for window position callback functions.
type PosCallback func(w *Window, xpos int, ypos int)
// SizeCallback is the function signature for window size callback functions.
type SizeCallback func(w *Window, width int, height int)
// CloseCallback is the function signature for window close callback functions.
type CloseCallback func(w *Window)
// RefreshCallback is the function signature for window refresh callback
// functions.
type RefreshCallback func(w *Window)
// FocusCallback is the function signature for window focus callback functions.
type FocusCallback func(w *Window, focused bool)
// IconifyCallback is the function signature for window iconification callback
// functions.
type IconifyCallback func(w *Window, iconified bool)
// MaximizeCallback is the function signature for window maximize callback
// functions.
type MaximizeCallback func(w *Window, iconified bool)
// FramebufferSizeCallback is the function signature for framebuffer size
// callback functions.
type FramebufferSizeCallback func(w *Window, width int, height int)
// ContentScaleCallback is the function signature for window content scale
// callback functions.
type ContentScaleCallback func(w *Window, x float32, y float32)
// Window represents a window.
type Window struct {
data *C.GLFWwindow
// Window
fPosHolder PosCallback
fSizeHolder SizeCallback
fFramebufferSizeHolder FramebufferSizeCallback
fCloseHolder CloseCallback
fMaximizeHolder MaximizeCallback
fRefreshHolder RefreshCallback
fFocusHolder FocusCallback
fIconifyHolder IconifyCallback
fContentScaleHolder ContentScaleCallback
// Input
fMouseButtonHolder MouseButtonCallback
fCursorPosHolder CursorPosCallback
fCursorEnterHolder CursorEnterCallback
fScrollHolder ScrollCallback
fKeyHolder KeyCallback
fCharHolder CharCallback
fCharModsHolder CharModsCallback
fDropHolder DropCallback
}
//export goWindowPosCB
func goWindowPosCB(window unsafe.Pointer, xpos, ypos C.int) {
w := windows.get((*C.GLFWwindow)(window))
w.fPosHolder(w, int(xpos), int(ypos))
}
//export goWindowSizeCB
func goWindowSizeCB(window unsafe.Pointer, width, height C.int) {
w := windows.get((*C.GLFWwindow)(window))
w.fSizeHolder(w, int(width), int(height))
}
//export goFramebufferSizeCB
func goFramebufferSizeCB(window unsafe.Pointer, width, height C.int) {
w := windows.get((*C.GLFWwindow)(window))
w.fFramebufferSizeHolder(w, int(width), int(height))
}
//export goWindowCloseCB
func goWindowCloseCB(window unsafe.Pointer) {
w := windows.get((*C.GLFWwindow)(window))
w.fCloseHolder(w)
}
//export goWindowMaximizeCB
func goWindowMaximizeCB(window unsafe.Pointer, iconified C.int) {
w := windows.get((*C.GLFWwindow)(window))
w.fMaximizeHolder(w, glfwbool(iconified))
}
//export goWindowRefreshCB
func goWindowRefreshCB(window unsafe.Pointer) {
w := windows.get((*C.GLFWwindow)(window))
w.fRefreshHolder(w)
}
//export goWindowFocusCB
func goWindowFocusCB(window unsafe.Pointer, focused C.int) {
w := windows.get((*C.GLFWwindow)(window))
w.fFocusHolder(w, glfwbool(focused))
}
//export goWindowIconifyCB
func goWindowIconifyCB(window unsafe.Pointer, iconified C.int) {
w := windows.get((*C.GLFWwindow)(window))
w.fIconifyHolder(w, glfwbool(iconified))
}
//export goWindowContentScaleCB
func goWindowContentScaleCB(window unsafe.Pointer, x C.float, y C.float) {
w := windows.get((*C.GLFWwindow)(window))
w.fContentScaleHolder(w, float32(x), float32(y))
}
// DefaultWindowHints resets all window hints to their default values.
//
// This function must only be called from the main thread.
func DefaultWindowHints() {
C.glfwDefaultWindowHints()
}
// WindowHint sets hints for the next call to CreateWindow. The hints,
// once set, retain their values until changed by a call to WindowHint or
// DefaultWindowHints, or until the library is terminated with Terminate.
//
// Only integer value hints can be set with this function. String value hints
// are set with WindowHintString.
//
// This function does not check whether the specified hint values are valid. If
// you set hints to invalid values this will instead be reported by the next
// call to CreateWindow.
//
// Some hints are platform specific. These may be set on any platform but they
// will only affect their specific platform. Other platforms will ignore them.
// Setting these hints requires no platform specific headers or functions.
//
// This function must only be called from the main thread.
func WindowHint(hint Hint, value int) {
C.glfwWindowHint(C.int(hint), C.int(value))
}
// WindowHintString sets hints for the next call to CreateWindow. The hints,
// once set, retain their values until changed by a call to this function or
// DefaultWindowHints, or until the library is terminated.
//
// Only string type hints can be set with this function. Integer value hints are
// set with WindowHint.
//
// This function does not check whether the specified hint values are valid. If
// you set hints to invalid values this will instead be reported by the next
// call to CreateWindow.
//
// Some hints are platform specific. These may be set on any platform but they
// will only affect their specific platform. Other platforms will ignore them.
// Setting these hints requires no platform specific headers or functions.
//
// This function must only be called from the main thread.
func WindowHintString(hint Hint, value string) {
str := C.CString(value)
defer C.free(unsafe.Pointer(str))
C.glfwWindowHintString(C.int(hint), str)
}
// CreateWindow creates a window and its associated OpenGL or OpenGL ES context.
// Most of the options controlling how the window and its context should be
// created are specified with window hints.
//
// Successful creation does not change which context is current. Before you can
// use the newly created context, you need to make it current. For information
// about the share parameter, see Context object sharing.
//
// The created window, framebuffer and context may differ from what you
// requested, as not all parameters and hints are hard constraints. This
// includes the size of the window, especially for full screen windows. To query
// the actual attributes of the created window, framebuffer and context, see
// GetAttrib, GetSize and GetFramebufferSize.
//
// To create a full screen window, you need to specify the monitor the window
// will cover. If no monitor is specified, the window will be windowed mode.
// Unless you have a way for the user to choose a specific monitor, it is
// recommended that you pick the primary monitor. For more information on how to
// query connected monitors, see Retrieving monitors.
//
// For full screen windows, the specified size becomes the resolution of the
// window's desired video mode. As long as a full screen window is not
// iconified, the supported video mode most closely matching the desired video
// mode is set for the specified monitor. For more information about full screen
// windows, including the creation of so called windowed full screen or
// borderless full screen windows, see "Windowed full screen" windows.
//
// Once you have created the window, you can switch it between windowed and full
// screen mode with SetMonitor. This will not affect its OpenGL or OpenGL ES
// context.
//
// By default, newly created windows use the placement recommended by the window
// system. To create the window at a specific position, make it initially
// invisible using the Visible window hint, set its position and then show it.
//
// As long as at least one full screen window is not iconified, the screensaver
// is prohibited from starting.
//
// 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
// actual size after creation.
//
// The swap interval is not set during window creation and the initial value may
// vary depending on driver settings and defaults.
//
// This function must only be called from the main thread.
func CreateWindow(
width, height int,
title string,
monitor *Monitor,
share *Window,
) *Window {
var (
m *C.GLFWmonitor
s *C.GLFWwindow
)
t := C.CString(title)
defer C.free(unsafe.Pointer(t))
if monitor != nil {
m = monitor.data
}
if share != nil {
s = share.data
}
w := C.glfwCreateWindow(C.int(width), C.int(height), t, m, s)
if w == nil {
return nil
}
wnd := &Window{data: w}
windows.put(wnd)
return wnd
}
// Destroy destroys the specified window and its context. On calling this
// function, no further callbacks will be called for that window.
//
// If the context of the specified window is current on the main thread, it is
// detached before being destroyed.
//
// This function must only be called from the main thread.
func (w *Window) Destroy() {
windows.remove(w.data)
C.glfwDestroyWindow(w.data)
}
// ShouldClose reports the value of the close flag of the specified window.
//
// This function may be called from any thread. Access is not synchronized.
func (w *Window) ShouldClose() bool {
return glfwbool(C.glfwWindowShouldClose(w.data))
}
// SetShouldClose sets the value of the close flag of the window. This can be
// used to override the user's attempt to close the window, or to signal that it
// should be closed.
//
// This function may be called from any thread. Access is not synchronized.
func (w *Window) SetShouldClose(value bool) {
if !value {
C.glfwSetWindowShouldClose(w.data, C.GL_FALSE)
} else {
C.glfwSetWindowShouldClose(w.data, C.GL_TRUE)
}
}
// SetTitle sets the window title, encoded as UTF-8, of the window.
//
// This function must only be called from the main thread.
func (w *Window) SetTitle(title string) {
t := C.CString(title)
defer C.free(unsafe.Pointer(t))
C.glfwSetWindowTitle(w.data, t)
}
// SetIcon sets the icon of the specified window. If passed an array of
// candidate images, those of or closest to the sizes desired by the system are
// selected. If no images are specified, the window reverts to its default icon.
//
// The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight bits
// per channel with the red channel first. They are arranged canonically as
// packed sequential rows, starting from the top-left corner.
//
// The desired image sizes varies depending on platform and system settings. The
// selected images will be rescaled as needed. Good sizes include 16x16, 32x32
// and 48x48.
//
// This function must only be called from the main thread.
func (w *Window) SetIcon(images []image.Image) {
count := len(images)
cimages := make([]C.GLFWimage, count)
freePixels := make([]func(), count)
for i, img := range images {
var pixels []uint8
b := img.Bounds()
switch img := img.(type) {
case *image.NRGBA:
pixels = img.Pix
default:
m := image.NewNRGBA(image.Rect(0, 0, b.Dx(), b.Dy()))
draw.Draw(m, m.Bounds(), img, b.Min, draw.Src)
pixels = m.Pix
}
pix, free := bytes(pixels)
freePixels[i] = free
cimages[i].width = C.int(b.Dx())
cimages[i].height = C.int(b.Dy())
cimages[i].pixels = (*C.uchar)(pix)
}
var p *C.GLFWimage
if count > 0 {
p = &cimages[0]
}
C.glfwSetWindowIcon(w.data, C.int(count), p)
for _, v := range freePixels {
v()
}
}
// GetPos returns the position, in screen coordinates, of the upper-left
// corner of the client area of the window.
//
// This function must only be called from the main thread.
func (w *Window) GetPos() (x, y int) {
var xpos, ypos C.int
C.glfwGetWindowPos(w.data, &xpos, &ypos)
return int(xpos), int(ypos)
}
// SetPos sets the position, in screen coordinates, of the upper-left corner of
// the client area of the specified windowed mode window. If the window is a
// full screen window, this function does nothing.
//
// Do not use this function to move an already visible window unless you have
// very good reasons for doing so, as it will confuse and annoy the user.
//
// The window manager may put limits on what positions are allowed. GLFW cannot
// and should not override these limits.
//
// This function must only be called from the main thread.
func (w *Window) SetPos(xpos, ypos int) {
C.glfwSetWindowPos(w.data, C.int(xpos), C.int(ypos))
}
// GetSize retrieves the size, in screen coordinates, of the client area of the
// specified window. If you wish to retrieve the size of the framebuffer of the
// window in pixels, see GetFramebufferSize.
//
// This function must only be called from the main thread.
func (w *Window) GetSize() (width, height int) {
var wi, h C.int
C.glfwGetWindowSize(w.data, &wi, &h)
return int(wi), int(h)
}
// SetSizeLimits sets the size limits of the client area of the specified
// window. If the window is full screen, the size limits only take effect once
// it is made windowed. If the window is not resizable, this function does
// nothing.
//
// The size limits are applied immediately to a windowed mode window and may
// cause it to be resized.
//
// The maximum dimensions must be greater than or equal to the minimum
// dimensions and all must be greater than or equal to zero.
//
// This function may only be called from the main thread.
func (w *Window) SetSizeLimits(minw, minh, maxw, maxh int) {
C.glfwSetWindowSizeLimits(
w.data,
C.int(minw),
C.int(minh),
C.int(maxw),
C.int(maxh),
)
}
// SetAspectRatio sets the required aspect ratio of the client area of the
// 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.
//
// The aspect ratio is specified as a numerator and a denominator and both
// values must be greater than zero. For example, the common 16:9 aspect ratio
// is specified as 16 and 9, respectively.
//
// If the numerator and denominator is set to DontCare then the aspect ratio
// limit is disabled.
//
// The aspect ratio is applied immediately to a windowed mode window and may
// cause it to be resized.
//
// This function may only be called from the main thread.
func (w *Window) SetAspectRatio(numer, denom int) {
C.glfwSetWindowAspectRatio(w.data, C.int(numer), C.int(denom))
}
// SetSize sets the size, in screen coordinates, of the client area of the
// specified window.
//
// For full screen windows, this function updates the resolution of its desired
// video mode and switches to the video mode closest to it, without affecting
// the window's context. As the context is unaffected, the bit depths of the
// framebuffer remain unchanged.
//
// If you wish to update the refresh rate of the desired video mode in addition
// to its resolution, see SetMonitor.
//
// The window manager may put limits on what sizes are allowed. GLFW cannot and
// should not override these limits.
//
// This function may only be called from the main thread.
func (w *Window) SetSize(width, height int) {
C.glfwSetWindowSize(w.data, C.int(width), C.int(height))
}
// GetFramebufferSize retrieves the size, in pixels, of the framebuffer of the
// specified window. If you wish to retrieve the size of the window in screen
// coordinates, see GetSize.
//
// This function may only be called from the main thread.
func (w *Window) GetFramebufferSize() (width, height int) {
var wi, h C.int
C.glfwGetFramebufferSize(w.data, &wi, &h)
return int(wi), int(h)
}
// GetFrameSize retrieves the size, in screen coordinates, of each edge of the
// frame of the specified window. This size includes the title bar, if the
// window has one. The size of the frame may vary depending on the
// window-related hints used to create it.
//
// Because this function retrieves the size of each window frame edge and not
// the offset along a particular coordinate axis, the retrieved values will
// always be zero or positive.
//
// This function may only be called from the main thread.
func (w *Window) GetFrameSize() (left, top, right, bottom int) {
var l, t, r, b C.int
C.glfwGetWindowFrameSize(w.data, &l, &t, &r, &b)
return int(l), int(t), int(r), int(b)
}
// GetContentScale function retrieves the content scale for the specified
// window. The content scale is the ratio between the current DPI and the
// platform's default DPI. If you scale all pixel dimensions by this scale then
// your content should appear at an appropriate size. This is especially
// important for text and any UI elements.
//
// This function may only be called from the main thread.
func (w *Window) GetContentScale() (float32, float32) {
var x, y C.float
C.glfwGetWindowContentScale(w.data, &x, &y)
return float32(x), float32(y)
}
// GetOpacity function returns the opacity of the window, including any
// decorations.
//
// The opacity (or alpha) value is a positive finite number between zero and
// one, where zero is fully transparent and one is fully opaque. If the system
// does not support whole window transparency, this function always returns one.
//
// The initial opacity value for newly created windows is one.
//
// This function may only be called from the main thread.
func (w *Window) GetOpacity() float32 {
return float32(C.glfwGetWindowOpacity(w.data))
}
// SetOpacity function sets the opacity of the window, including any
// decorations. The opacity (or alpha) value is a positive finite number between
// zero and one, where zero is fully transparent and one is fully opaque.
//
// The initial opacity value for newly created windows is one.
//
// A window created with framebuffer transparency may not use whole window
// transparency. The results of doing this are undefined.
//
// This function may only be called from the main thread.
func (w *Window) SetOpacity(opacity float32) {
C.glfwSetWindowOpacity(w.data, C.float(opacity))
}
// Iconify iconifies (minimizes) the specified window if it was previously
// restored. If the window is already iconified, this function does nothing.
//
// If the specified window is a full screen window, the original monitor
// resolution is restored until the window is restored.
//
// This function may only be called from the main thread.
func (w *Window) Iconify() {
C.glfwIconifyWindow(w.data)
}
// Restore restores the specified window if it was previously iconified
// (minimized) or maximized. If the window is already restored, this function
// does nothing.
//
// If the specified window is a full screen window, the resolution chosen for
// the window is restored on the selected monitor.
//
// This function may only be called from the main thread.
func (w *Window) Restore() {
C.glfwRestoreWindow(w.data)
}
// Maximize maximizes the specified window if it was previously not maximized.
// If the window is already maximized, this function does nothing.
//
// If the specified window is a full screen window, this function does nothing.
//
// This function may only be called from the main thread.
func (w *Window) Maximize() {
C.glfwMaximizeWindow(w.data)
}
// Show makes the specified window visible if it was previously hidden. If the
// window is already visible or is in full screen mode, this function does
// nothing.
//
// This function may only be called from the main thread.
func (w *Window) Show() {
C.glfwShowWindow(w.data)
}
// Hide hides the specified window if it was previously visible. If the window
// is already hidden or is in full screen mode, this function does nothing.
//
// This function may only be called from the main thread.
func (w *Window) Hide() {
C.glfwHideWindow(w.data)
}
// Focus brings the specified window to front and sets input focus. The window
// should already be visible and not iconified.
//
// By default, both windowed and full screen mode windows are focused when
// initially created. Set the Focused to disable this behavior.
//
// Do not use this function to steal focus from other applications unless you
// are certain that is what the user wants. Focus stealing can be extremely
// disruptive.
//
// For a less disruptive way of getting the user's attention, see attention
// requests.
//
// This function may only be called from the main thread.
func (w *Window) Focus() {
C.glfwFocusWindow(w.data)
}
// RequestAttention function requests user attention to the specified window.
// On platforms where this is not supported, attention is requested to the
// application as a whole.
//
// Once the user has given attention, usually by focusing the window or
// application, the system will end the request automatically.
//
// This function may only be called from the main thread.
func (w *Window) RequestAttention() {
C.glfwRequestWindowAttention(w.data)
}
// GetMonitor returns the handle of the monitor that the window is in
// fullscreen on.
//
// Returns nil if the window is in windowed mode.
//
// This function may only be called from the main thread.
func (w *Window) GetMonitor() *Monitor {
m := C.glfwGetWindowMonitor(w.data)
if m == nil {
return nil
}
return &Monitor{m}
}
// SetMonitor 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 SetSize.
//
// 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..
//
// This function may only be called from the main thread.
func (w *Window) SetMonitor(
monitor *Monitor,
xpos, ypos, width, height, refreshRate int,
) {
var m *C.GLFWmonitor
if monitor == nil {
m = nil
} else {
m = monitor.data
}
C.glfwSetWindowMonitor(
w.data,
m,
C.int(xpos),
C.int(ypos),
C.int(width),
C.int(height),
C.int(refreshRate),
)
}
// GetAttrib returns the value of an attribute of the specified window or its
// OpenGL or OpenGL ES context.
//
// This function may only be called from the main thread.
func (w *Window) GetAttrib(attrib Hint) int {
return int(C.glfwGetWindowAttrib(w.data, C.int(attrib)))
}
// SetAttrib function sets the value of an attribute of the specified window.
//
// The supported attributes are Decorated, Resizeable, Floating and AutoIconify.
//
// Some of these attributes are ignored for full screen windows. The new value
// will take effect if the window is later made windowed.
//
// Some of these attributes are ignored for windowed mode windows. The new value
// will take effect if the window is later made full screen.
//
// This function may only be called from the main thread.
func (w *Window) SetAttrib(attrib Hint, value int) {
C.glfwSetWindowAttrib(w.data, C.int(attrib), C.int(value))
}
// SetUserPointer sets the user-defined pointer of the window. The current value
// is retained until the window is destroyed. The initial value is nil.
//
// This function may be called from any thread. Access is not synchronized.
func (w *Window) SetUserPointer(pointer unsafe.Pointer) {
C.glfwSetWindowUserPointer(w.data, pointer)
}
// GetUserPointer returns the current value of the user-defined pointer of the
// window. The initial value is nil.
//
// This function may be called from any thread. Access is not synchronized.
func (w *Window) GetUserPointer() unsafe.Pointer {
return C.glfwGetWindowUserPointer(w.data)
}
// SetPosCallback sets the position callback of the window, which is called
// when the window is moved. The callback is provided with the screen position
// of the upper-left corner of the client area of the window.
//
// This function must only be called from the main thread.
func (w *Window) SetPosCallback(cbfun PosCallback) PosCallback {
previous := w.fPosHolder
w.fPosHolder = cbfun
if cbfun == nil {
C.glfwSetWindowPosCallback(w.data, nil)
} else {
C.glfwSetWindowPosCallbackCB(w.data)
}
return previous
}
// SetSizeCallback sets the size callback of the window, which is called when
// the window is resized. The callback is provided with the size, in screen
// coordinates, of the client area of the window.
//
// This function must only be called from the main thread.
func (w *Window) SetSizeCallback(cbfun SizeCallback) SizeCallback {
previous := w.fSizeHolder
w.fSizeHolder = cbfun
if cbfun == nil {
C.glfwSetWindowSizeCallback(w.data, nil)
} else {
C.glfwSetWindowSizeCallbackCB(w.data)
}
return previous
}
// SetFramebufferSizeCallback sets the framebuffer resize callback of the
// specified window, which is called when the framebuffer of the specified
// window is resized.
//
// This function must only be called from the main thread.
func (w *Window) SetFramebufferSizeCallback(
cbfun FramebufferSizeCallback,
) FramebufferSizeCallback {
previous := w.fFramebufferSizeHolder
w.fFramebufferSizeHolder = cbfun
if cbfun == nil {
C.glfwSetFramebufferSizeCallback(w.data, nil)
} else {
C.glfwSetFramebufferSizeCallbackCB(w.data)
}
return previous
}
// SetCloseCallback sets the close callback of the window, which is called when
// the user attempts to close the window, for example by clicking the close
// widget in the title bar.
//
// The close flag is set before this callback is called, but you can modify it
// at any time with SetShouldClose.
//
// The close callback is not triggered by Destroy.
//
// This function must only be called from the main thread.
func (w *Window) SetCloseCallback(cbfun CloseCallback) CloseCallback {
previous := w.fCloseHolder
w.fCloseHolder = cbfun
if cbfun == nil {
C.glfwSetWindowCloseCallback(w.data, nil)
} else {
C.glfwSetWindowCloseCallbackCB(w.data)
}
return previous
}
// SetMaximizeCallback sets the maximization callback of the specified window,
// which is called when the window is maximized or restored.
//
// This function must only be called from the main thread.
func (w *Window) SetMaximizeCallback(cbfun MaximizeCallback) MaximizeCallback {
previous := w.fMaximizeHolder
w.fMaximizeHolder = cbfun
if cbfun == nil {
C.glfwSetWindowMaximizeCallback(w.data, nil)
} else {
C.glfwSetWindowMaximizeCallbackCB(w.data)
}
return previous
}
// SetContentScaleCallback function sets the window content scale callback of
// the specified window, which is called when the content scale of the specified
// window changes.
//
// This function must only be called from the main thread.
func (w *Window) SetContentScaleCallback(
cbfun ContentScaleCallback,
) ContentScaleCallback {
previous := w.fContentScaleHolder
w.fContentScaleHolder = cbfun
if cbfun == nil {
C.glfwSetWindowContentScaleCallback(w.data, nil)
} else {
C.glfwSetWindowContentScaleCallbackCB(w.data)
}
return previous
}
// SetRefreshCallback sets the refresh callback of the window, which
// is called when the client area of the window needs to be redrawn, for example
// if the window has been exposed after having been covered by another window.
//
// On compositing window systems such as Aero, Compiz or Aqua, where the window
// contents are saved off-screen, this callback may be called only very
// infrequently or never at all.
//
// This function must only be called from the main thread.
func (w *Window) SetRefreshCallback(cbfun RefreshCallback) RefreshCallback {
previous := w.fRefreshHolder
w.fRefreshHolder = cbfun
if cbfun == nil {
C.glfwSetWindowRefreshCallback(w.data, nil)
} else {
C.glfwSetWindowRefreshCallbackCB(w.data)
}
return previous
}
// SetFocusCallback sets the focus callback of the window, which is called when
// the window gains or loses focus.
//
// After the focus callback is called for a window that lost focus, synthetic
// key and mouse button release events will be generated for all such that had
// been pressed. For more information, see SetKeyCallback and
// SetMouseButtonCallback.
//
// This function must only be called from the main thread.
func (w *Window) SetFocusCallback(cbfun FocusCallback) FocusCallback {
previous := w.fFocusHolder
w.fFocusHolder = cbfun
if cbfun == nil {
C.glfwSetWindowFocusCallback(w.data, nil)
} else {
C.glfwSetWindowFocusCallbackCB(w.data)
}
return previous
}
// SetIconifyCallback sets the iconification callback of the window, which is
// called when the window is iconified or restored.
//
// This function must only be called from the main thread.
func (w *Window) SetIconifyCallback(cbfun IconifyCallback) IconifyCallback {
previous := w.fIconifyHolder
w.fIconifyHolder = cbfun
if cbfun == nil {
C.glfwSetWindowIconifyCallback(w.data, nil)
} else {
C.glfwSetWindowIconifyCallbackCB(w.data)
}
return previous
}
// SetClipboardString sets the system clipboard to the specified UTF-8 encoded
// string.
//
// This function must only be called from the main thread.
func (w *Window) SetClipboardString(str string) {
cp := C.CString(str)
defer C.free(unsafe.Pointer(cp))
C.glfwSetClipboardString(w.data, cp)
}
// GetClipboardString returns the contents of the system clipboard, if it
// contains or is convertible to a UTF-8 encoded string.
//
// This function must only be called from the main thread.
func (w *Window) GetClipboardString() string {
cs := C.glfwGetClipboardString(w.data)
if cs == nil {
return ""
}
return C.GoString(cs)
}
// PollEvents processes only those events that have already been received and
// then returns immediately. Processing events will cause the window and input
// callbacks associated with those events to be called.
//
// This function is not required for joystick input to work.
//
// This function may not be called from a callback.
//
// This function must only be called from the main thread.
func PollEvents() {
C.glfwPollEvents()
}
// WaitEvents puts the calling thread to sleep until at least one event has been
// received. Once one or more events have been recevied, it behaves as if
// PollEvents was called, i.e. the events are processed and the function then
// returns immediately. Processing events will cause the window and input
// callbacks associated with those events to be called.
//
// Since not all events are associated with callbacks, this function may return
// without a callback having been called even if you are monitoring all
// callbacks.
//
// This function may not be called from a callback.
//
// This function must only be called from the main thread.
func WaitEvents() {
C.glfwWaitEvents()
}
// WaitEventsTimeout puts the calling thread to sleep until at least one event
// is available in the event queue, or until the specified timeout is reached.
// If one or more events are available, it behaves exactly like PollEvents, i.e.
// the events in the queue are processed and the function then returns
// immediately. Processing events will cause the window and input callbacks
// associated with those events to be called.
//
// The timeout value must be a positive finite number.
//
// Since not all events are associated with callbacks, this function may return
// without a callback having been called even if you are monitoring all
// callbacks.
//
// On some platforms, a window move, resize or menu operation will cause event
// processing to block. This is due to how event processing is designed on those
// platforms. You can use the window refresh callback to redraw the contents of
// your window when necessary during such operations.
//
// On some platforms, certain callbacks may be called outside of a call to one
// of the event processing functions.
//
// If no windows exist, this function returns immediately. For synchronization
// of threads in applications that do not create windows, use native Go
// primitives.
//
// Event processing is not required for joystick input to work.
//
// This function must only be called from the main thread.
func WaitEventsTimeout(timeout float64) {
C.glfwWaitEventsTimeout(C.double(timeout))
}
// PostEmptyEvent posts an empty event from the current thread to the main
// thread event queue, causing WaitEvents to return.
//
// If no windows exist, this function returns immediately. For synchronization
// of threads in applications that do not create windows, use native Go
// primitives.
//
// This function may be called from any thread.
func PostEmptyEvent() {
C.glfwPostEmptyEvent()
}
// SwapBuffers swaps the front and back buffers of the specified window when
// rendering with OpenGL or OpenGL ES. If the swap interval is greater than
// zero, the GPU driver waits the specified number of screen updates before
// swapping the buffers.
//
// The specified window must have an OpenGL or OpenGL ES context. Specifying a
// window without a context will generate a NoWindowContext error.
//
// This function does not apply to Vulkan.
//
// This function may be called from any thread.
func (w *Window) SwapBuffers() {
C.glfwSwapBuffers(w.data)
}
// Handle returns a *C.GLFWwindow reference (i.e. the GLFW window itself).
// This can be used for passing the GLFW window handle to external libraries
// like vulkan-go.
func (w *Window) Handle() uintptr {
return uintptr(unsafe.Pointer(w.data))
}