Use dep to vendor things
This commit is contained in:
10
vendor/github.com/go-gl/glfw/AUTHORS
generated
vendored
Normal file
10
vendor/github.com/go-gl/glfw/AUTHORS
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# This is the official list of glfw3-go authors for copyright purposes.
|
||||
|
||||
# Please keep the list sorted.
|
||||
|
||||
Coşku Baş
|
||||
Dmitri Shuralyov
|
||||
James Gray
|
||||
Peter Waller <p@pwaller.net> (github:pwaller)
|
||||
Robin Eklind
|
||||
Stephen Gutekanst
|
27
vendor/github.com/go-gl/glfw/LICENSE
generated
vendored
Normal file
27
vendor/github.com/go-gl/glfw/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
Copyright (c) 2012 The glfw3-go Authors. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
22
vendor/github.com/go-gl/glfw/v3.1/glfw/glfw/COPYING.txt
generated
vendored
Normal file
22
vendor/github.com/go-gl/glfw/v3.1/glfw/glfw/COPYING.txt
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
Copyright (c) 2002-2006 Marcus Geelnard
|
||||
Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would
|
||||
be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
1
vendor/github.com/go-gl/glfw/v3.2/glfw/GLFW_C_REVISION.txt
generated
vendored
Normal file
1
vendor/github.com/go-gl/glfw/v3.2/glfw/GLFW_C_REVISION.txt
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
999f3556fdd80983b10051746264489f2cb1ef16
|
43
vendor/github.com/go-gl/glfw/v3.2/glfw/build.go
generated
vendored
Normal file
43
vendor/github.com/go-gl/glfw/v3.2/glfw/build.go
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
package glfw
|
||||
|
||||
/*
|
||||
// Windows Build Tags
|
||||
// ----------------
|
||||
// GLFW Options:
|
||||
#cgo windows CFLAGS: -D_GLFW_WIN32 -Iglfw/deps/mingw
|
||||
|
||||
// Linker Options:
|
||||
#cgo windows LDFLAGS: -lopengl32 -lgdi32
|
||||
|
||||
|
||||
// Darwin Build Tags
|
||||
// ----------------
|
||||
// GLFW Options:
|
||||
#cgo darwin CFLAGS: -D_GLFW_COCOA -D_GLFW_USE_CHDIR -D_GLFW_USE_MENUBAR -D_GLFW_USE_RETINA -Wno-deprecated-declarations
|
||||
|
||||
// Linker Options:
|
||||
#cgo darwin LDFLAGS: -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
|
||||
|
||||
|
||||
// Linux Build Tags
|
||||
// ----------------
|
||||
// GLFW Options:
|
||||
#cgo linux,!wayland CFLAGS: -D_GLFW_X11
|
||||
#cgo linux,wayland CFLAGS: -D_GLFW_WAYLAND
|
||||
|
||||
// Linker Options:
|
||||
#cgo linux,!wayland LDFLAGS: -lGL -lX11 -lXrandr -lXxf86vm -lXi -lXcursor -lm -lXinerama -ldl -lrt
|
||||
#cgo linux,wayland LDFLAGS: -lGL -lX11 -lXrandr -lXxf86vm -lXi -lXcursor -lm -lXinerama -ldl -lrt
|
||||
|
||||
|
||||
// FreeBSD Build Tags
|
||||
// ----------------
|
||||
// GLFW Options:
|
||||
#cgo freebsd,!wayland CFLAGS: -D_GLFW_X11 -D_GLFW_HAS_GLXGETPROCADDRESSARB -D_GLFW_HAS_DLOPEN
|
||||
#cgo freebsd,wayland CFLAGS: -D_GLFW_WAYLAND -D_GLFW_HAS_DLOPEN
|
||||
|
||||
// Linker Options:
|
||||
#cgo freebsd,!wayland LDFLAGS: -lGL -lX11 -lXrandr -lXxf86vm -lXi -lXcursor -lm -lXinerama
|
||||
#cgo freebsd,wayland LDFLAGS: -lGL -lX11 -lXrandr -lXxf86vm -lXi -lXcursor -lm -lXinerama
|
||||
*/
|
||||
import "C"
|
11
vendor/github.com/go-gl/glfw/v3.2/glfw/c_glfw.go
generated
vendored
Normal file
11
vendor/github.com/go-gl/glfw/v3.2/glfw/c_glfw.go
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
package glfw
|
||||
|
||||
/*
|
||||
#include "glfw/src/context.c"
|
||||
#include "glfw/src/init.c"
|
||||
#include "glfw/src/input.c"
|
||||
#include "glfw/src/monitor.c"
|
||||
#include "glfw/src/vulkan.c"
|
||||
#include "glfw/src/window.c"
|
||||
*/
|
||||
import "C"
|
13
vendor/github.com/go-gl/glfw/v3.2/glfw/c_glfw_darwin.go
generated
vendored
Normal file
13
vendor/github.com/go-gl/glfw/v3.2/glfw/c_glfw_darwin.go
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
package glfw
|
||||
|
||||
/*
|
||||
#cgo CFLAGS: -x objective-c
|
||||
#include "glfw/src/cocoa_init.m"
|
||||
#include "glfw/src/cocoa_joystick.m"
|
||||
#include "glfw/src/cocoa_monitor.m"
|
||||
#include "glfw/src/cocoa_window.m"
|
||||
#include "glfw/src/cocoa_time.c"
|
||||
#include "glfw/src/posix_tls.c"
|
||||
#include "glfw/src/nsgl_context.m"
|
||||
*/
|
||||
import "C"
|
28
vendor/github.com/go-gl/glfw/v3.2/glfw/c_glfw_linbsd.go
generated
vendored
Normal file
28
vendor/github.com/go-gl/glfw/v3.2/glfw/c_glfw_linbsd.go
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
// +build linux freebsd
|
||||
|
||||
package glfw
|
||||
|
||||
/*
|
||||
#ifdef _GLFW_MIR
|
||||
#include "glfw/src/mir_init.c"
|
||||
#include "glfw/src/mir_monitor.c"
|
||||
#include "glfw/src/mir_window.c"
|
||||
#endif
|
||||
#ifdef _GLFW_WAYLAND
|
||||
#include "glfw/src/wl_init.c"
|
||||
#include "glfw/src/wl_monitor.c"
|
||||
#include "glfw/src/wl_window.c"
|
||||
#endif
|
||||
#ifdef _GLFW_X11
|
||||
#include "glfw/src/x11_init.c"
|
||||
#include "glfw/src/x11_monitor.c"
|
||||
#include "glfw/src/x11_window.c"
|
||||
#include "glfw/src/glx_context.c"
|
||||
#endif
|
||||
#include "glfw/src/linux_joystick.c"
|
||||
#include "glfw/src/posix_time.c"
|
||||
#include "glfw/src/posix_tls.c"
|
||||
#include "glfw/src/xkb_unicode.c"
|
||||
#include "glfw/src/egl_context.c"
|
||||
*/
|
||||
import "C"
|
13
vendor/github.com/go-gl/glfw/v3.2/glfw/c_glfw_windows.go
generated
vendored
Normal file
13
vendor/github.com/go-gl/glfw/v3.2/glfw/c_glfw_windows.go
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
package glfw
|
||||
|
||||
/*
|
||||
#include "glfw/src/win32_init.c"
|
||||
#include "glfw/src/win32_joystick.c"
|
||||
#include "glfw/src/win32_monitor.c"
|
||||
#include "glfw/src/win32_time.c"
|
||||
#include "glfw/src/win32_tls.c"
|
||||
#include "glfw/src/win32_window.c"
|
||||
#include "glfw/src/wgl_context.c"
|
||||
#include "glfw/src/egl_context.c"
|
||||
*/
|
||||
import "C"
|
77
vendor/github.com/go-gl/glfw/v3.2/glfw/context.go
generated
vendored
Normal file
77
vendor/github.com/go-gl/glfw/v3.2/glfw/context.go
generated
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
package glfw
|
||||
|
||||
//#include <stdlib.h>
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// MakeContextCurrent makes the context of the window current.
|
||||
// Originally GLFW 3 passes a null pointer to detach the context.
|
||||
// But since we're using receievers, DetachCurrentContext should
|
||||
// be used instead.
|
||||
func (w *Window) MakeContextCurrent() {
|
||||
C.glfwMakeContextCurrent(w.data)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// DetachCurrentContext detaches the current context.
|
||||
func DetachCurrentContext() {
|
||||
C.glfwMakeContextCurrent(nil)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetCurrentContext returns the window whose context is current.
|
||||
func GetCurrentContext() *Window {
|
||||
w := C.glfwGetCurrentContext()
|
||||
panicError()
|
||||
if w == nil {
|
||||
return nil
|
||||
}
|
||||
return windows.get(w)
|
||||
}
|
||||
|
||||
// SwapBuffers swaps the front and back buffers of the window. If the
|
||||
// swap interval is greater than zero, the GPU driver waits the specified number
|
||||
// of screen updates before swapping the buffers.
|
||||
func (w *Window) SwapBuffers() {
|
||||
C.glfwSwapBuffers(w.data)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// SwapInterval sets the swap interval for the current context, i.e. the number
|
||||
// of screen updates to wait before swapping the buffers of a window and
|
||||
// returning from SwapBuffers. This is sometimes called
|
||||
// 'vertical synchronization', 'vertical retrace synchronization' or 'vsync'.
|
||||
//
|
||||
// Contexts that support either of the WGL_EXT_swap_control_tear and
|
||||
// GLX_EXT_swap_control_tear extensions also accept negative swap intervals,
|
||||
// which allow the driver to swap even if a frame arrives a little bit late.
|
||||
// You can check for the presence of these extensions using
|
||||
// ExtensionSupported. For more information about swap tearing,
|
||||
// see the extension specifications.
|
||||
//
|
||||
// Some GPU drivers do not honor the requested swap interval, either because of
|
||||
// user settings that override the request or due to bugs in the driver.
|
||||
func SwapInterval(interval int) {
|
||||
C.glfwSwapInterval(C.int(interval))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// ExtensionSupported reports whether the specified OpenGL or context creation
|
||||
// API extension is supported by the current context. For example, on Windows
|
||||
// both the OpenGL and WGL extension strings are checked.
|
||||
//
|
||||
// As this functions searches one or more extension strings on each call, it is
|
||||
// recommended that you cache its results if it's going to be used frequently.
|
||||
// The extension strings will not change during the lifetime of a context, so
|
||||
// there is no danger in doing this.
|
||||
func ExtensionSupported(extension string) bool {
|
||||
e := C.CString(extension)
|
||||
defer C.free(unsafe.Pointer(e))
|
||||
ret := glfwbool(C.glfwExtensionSupported(e))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
9
vendor/github.com/go-gl/glfw/v3.2/glfw/error.c
generated
vendored
Normal file
9
vendor/github.com/go-gl/glfw/v3.2/glfw/error.c
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
#include "_cgo_export.h"
|
||||
|
||||
void glfwErrorCB(int code, const char *desc) {
|
||||
goErrorCB(code, (char*)desc);
|
||||
}
|
||||
|
||||
void glfwSetErrorCallbackCB() {
|
||||
glfwSetErrorCallback(glfwErrorCB);
|
||||
}
|
199
vendor/github.com/go-gl/glfw/v3.2/glfw/error.go
generated
vendored
Normal file
199
vendor/github.com/go-gl/glfw/v3.2/glfw/error.go
generated
vendored
Normal file
@@ -0,0 +1,199 @@
|
||||
package glfw
|
||||
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
//void glfwSetErrorCallbackCB();
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
)
|
||||
|
||||
// ErrorCode corresponds to an error code.
|
||||
type ErrorCode int
|
||||
|
||||
// Error codes that are translated to panics and the programmer should not
|
||||
// expect to handle.
|
||||
const (
|
||||
notInitialized ErrorCode = C.GLFW_NOT_INITIALIZED // GLFW has not been initialized.
|
||||
noCurrentContext ErrorCode = C.GLFW_NO_CURRENT_CONTEXT // No context is current.
|
||||
invalidEnum ErrorCode = C.GLFW_INVALID_ENUM // One of the enum parameters for the function was given an invalid enum.
|
||||
invalidValue ErrorCode = C.GLFW_INVALID_VALUE // One of the parameters for the function was given an invalid value.
|
||||
outOfMemory ErrorCode = C.GLFW_OUT_OF_MEMORY // A memory allocation failed.
|
||||
platformError ErrorCode = C.GLFW_PLATFORM_ERROR // A platform-specific error occurred that does not match any of the more specific categories.
|
||||
)
|
||||
|
||||
const (
|
||||
// APIUnavailable is the error code used when GLFW could not find support
|
||||
// for the requested client API on the system.
|
||||
//
|
||||
// The installed graphics driver does not support the requested client API,
|
||||
// or does not support it via the chosen context creation backend. Below
|
||||
// are a few examples.
|
||||
//
|
||||
// Some pre-installed Windows graphics drivers do not support OpenGL. AMD
|
||||
// only supports OpenGL ES via EGL, while Nvidia and Intel only supports it
|
||||
// via a WGL or GLX extension. OS X does not provide OpenGL ES at all. The
|
||||
// Mesa EGL, OpenGL and OpenGL ES libraries do not interface with the
|
||||
// Nvidia binary driver.
|
||||
APIUnavailable ErrorCode = C.GLFW_API_UNAVAILABLE
|
||||
|
||||
// VersionUnavailable is the error code used when the requested OpenGL or
|
||||
// OpenGL ES (including any requested profile or context option) is not
|
||||
// available on this machine.
|
||||
//
|
||||
// The machine does not support your requirements. If your application is
|
||||
// sufficiently flexible, downgrade your requirements and try again.
|
||||
// Otherwise, inform the user that their machine does not match your
|
||||
// requirements.
|
||||
//
|
||||
// Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if
|
||||
// 5.0 comes out before the 4.x series gets that far, also fail with this
|
||||
// error and not GLFW_INVALID_VALUE, because GLFW cannot know what future
|
||||
// versions will exist.
|
||||
VersionUnavailable ErrorCode = C.GLFW_VERSION_UNAVAILABLE
|
||||
|
||||
// FormatUnavailable is the error code used for both window creation and
|
||||
// clipboard querying format errors.
|
||||
//
|
||||
// If emitted during window creation, the requested pixel format is not
|
||||
// supported. This means one or more hard constraints did not match any of
|
||||
// the available pixel formats. If your application is sufficiently
|
||||
// flexible, downgrade your requirements and try again. Otherwise, inform
|
||||
// the user that their machine does not match your requirements.
|
||||
//
|
||||
// If emitted when querying the clipboard, the contents of the clipboard
|
||||
// could not be converted to the requested format. You should ignore the
|
||||
// error or report it to the user, as appropriate.
|
||||
FormatUnavailable ErrorCode = C.GLFW_FORMAT_UNAVAILABLE
|
||||
)
|
||||
|
||||
func (e ErrorCode) String() string {
|
||||
switch e {
|
||||
case notInitialized:
|
||||
return "NotInitialized"
|
||||
case noCurrentContext:
|
||||
return "NoCurrentContext"
|
||||
case invalidEnum:
|
||||
return "InvalidEnum"
|
||||
case invalidValue:
|
||||
return "InvalidValue"
|
||||
case outOfMemory:
|
||||
return "OutOfMemory"
|
||||
case platformError:
|
||||
return "PlatformError"
|
||||
case APIUnavailable:
|
||||
return "APIUnavailable"
|
||||
case VersionUnavailable:
|
||||
return "VersionUnavailable"
|
||||
case FormatUnavailable:
|
||||
return "FormatUnavailable"
|
||||
default:
|
||||
return fmt.Sprintf("ErrorCode(%d)", e)
|
||||
}
|
||||
}
|
||||
|
||||
// Error holds error code and description.
|
||||
type Error struct {
|
||||
Code ErrorCode
|
||||
Desc string
|
||||
}
|
||||
|
||||
// Error prints the error code and description in a readable format.
|
||||
func (e *Error) Error() string {
|
||||
return fmt.Sprintf("%s: %s", e.Code.String(), e.Desc)
|
||||
}
|
||||
|
||||
// Note: There are many cryptic caveats to proper error handling here.
|
||||
// See: https://github.com/go-gl/glfw3/pull/86
|
||||
|
||||
// Holds the value of the last error.
|
||||
var lastError = make(chan *Error, 1)
|
||||
|
||||
//export goErrorCB
|
||||
func goErrorCB(code C.int, desc *C.char) {
|
||||
flushErrors()
|
||||
err := &Error{ErrorCode(code), C.GoString(desc)}
|
||||
select {
|
||||
case lastError <- err:
|
||||
default:
|
||||
fmt.Println("GLFW: An uncaught error has occurred:", err)
|
||||
fmt.Println("GLFW: Please report this bug in the Go package immediately.")
|
||||
}
|
||||
}
|
||||
|
||||
// Set the glfw callback internally
|
||||
func init() {
|
||||
C.glfwSetErrorCallbackCB()
|
||||
}
|
||||
|
||||
// flushErrors is called by Terminate before it actually calls C.glfwTerminate,
|
||||
// this ensures that any uncaught errors buffered in lastError are printed
|
||||
// before the program exits.
|
||||
func flushErrors() {
|
||||
err := fetchError()
|
||||
if err != nil {
|
||||
fmt.Println("GLFW: An uncaught error has occurred:", err)
|
||||
fmt.Println("GLFW: Please report this bug in the Go package immediately.")
|
||||
}
|
||||
}
|
||||
|
||||
// acceptError fetches the next error from the error channel, it accepts only
|
||||
// errors with one of the given error codes. If any other error is encountered,
|
||||
// a panic will occur.
|
||||
//
|
||||
// Platform errors are always printed, for information why please see:
|
||||
//
|
||||
// https://github.com/go-gl/glfw/issues/127
|
||||
//
|
||||
func acceptError(codes ...ErrorCode) error {
|
||||
// Grab the next error, if there is one.
|
||||
err := fetchError()
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Only if the error has the specific error code accepted by the caller, do
|
||||
// we return the error.
|
||||
for _, code := range codes {
|
||||
if err.Code == code {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// The error isn't accepted by the caller. If the error code is not a code
|
||||
// defined in the GLFW C documentation as a programmer error, then the
|
||||
// caller should have accepted it. This is effectively a bug in this
|
||||
// package.
|
||||
switch err.Code {
|
||||
case platformError:
|
||||
log.Println(err)
|
||||
return nil
|
||||
case notInitialized, noCurrentContext, invalidEnum, invalidValue, outOfMemory:
|
||||
panic(err)
|
||||
default:
|
||||
fmt.Println("GLFW: An invalid error was not accepted by the caller:", err)
|
||||
fmt.Println("GLFW: Please report this bug in the Go package immediately.")
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// panicError is a helper used by functions which expect no errors (except
|
||||
// programmer errors) to occur. It will panic if it finds any such error.
|
||||
func panicError() {
|
||||
err := acceptError()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// fetchError fetches the next error from the error channel, it does not block
|
||||
// and returns nil if there is no error present.
|
||||
func fetchError() *Error {
|
||||
select {
|
||||
case err := <-lastError:
|
||||
return err
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
76
vendor/github.com/go-gl/glfw/v3.2/glfw/glfw.go
generated
vendored
Normal file
76
vendor/github.com/go-gl/glfw/v3.2/glfw/glfw.go
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
package glfw
|
||||
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
import "C"
|
||||
|
||||
// Version constants.
|
||||
const (
|
||||
VersionMajor = C.GLFW_VERSION_MAJOR // This is incremented when the API is changed in non-compatible ways.
|
||||
VersionMinor = C.GLFW_VERSION_MINOR // This is incremented when features are added to the API but it remains backward-compatible.
|
||||
VersionRevision = C.GLFW_VERSION_REVISION // This is incremented when a bug fix release is made that does not contain any API changes.
|
||||
)
|
||||
|
||||
// Init initializes the GLFW library. Before most GLFW functions can be used,
|
||||
// GLFW must be initialized, and before a program terminates GLFW should be
|
||||
// terminated in order to free any resources allocated during or after
|
||||
// initialization.
|
||||
//
|
||||
// If this function fails, it calls Terminate before returning. If it succeeds,
|
||||
// you should call Terminate before the program exits.
|
||||
//
|
||||
// Additional calls to this function after successful initialization but before
|
||||
// termination will succeed but will do nothing.
|
||||
//
|
||||
// This function may take several seconds to complete on some systems, while on
|
||||
// other systems it may take only a fraction of a second to complete.
|
||||
//
|
||||
// On Mac OS X, this function will change the current directory of the
|
||||
// application to the Contents/Resources subdirectory of the application's
|
||||
// bundle, if present.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func Init() error {
|
||||
C.glfwInit()
|
||||
return acceptError(APIUnavailable)
|
||||
}
|
||||
|
||||
// Terminate destroys all remaining windows, frees any allocated resources and
|
||||
// sets the library to an uninitialized state. Once this is called, you must
|
||||
// again call Init successfully before you will be able to use most GLFW
|
||||
// functions.
|
||||
//
|
||||
// If GLFW has been successfully initialized, this function should be called
|
||||
// before the program exits. If initialization fails, there is no need to call
|
||||
// this function, as it is called by Init before it returns failure.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func Terminate() {
|
||||
flushErrors()
|
||||
C.glfwTerminate()
|
||||
}
|
||||
|
||||
// GetVersion retrieves the major, minor and revision numbers of the GLFW
|
||||
// library. It is intended for when you are using GLFW as a shared library and
|
||||
// want to ensure that you are using the minimum required version.
|
||||
//
|
||||
// This function may be called before Init.
|
||||
func GetVersion() (major, minor, revision int) {
|
||||
var (
|
||||
maj C.int
|
||||
min C.int
|
||||
rev C.int
|
||||
)
|
||||
|
||||
C.glfwGetVersion(&maj, &min, &rev)
|
||||
return int(maj), int(min), int(rev)
|
||||
}
|
||||
|
||||
// GetVersionString returns a static string generated at compile-time according
|
||||
// to which configuration macros were defined. This is intended for use when
|
||||
// submitting bug reports, to allow developers to see which code paths are
|
||||
// enabled in a binary.
|
||||
//
|
||||
// This function may be called before Init.
|
||||
func GetVersionString() string {
|
||||
return C.GoString(C.glfwGetVersionString())
|
||||
}
|
22
vendor/github.com/go-gl/glfw/v3.2/glfw/glfw/COPYING.txt
generated
vendored
Normal file
22
vendor/github.com/go-gl/glfw/v3.2/glfw/glfw/COPYING.txt
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
Copyright (c) 2002-2006 Marcus Geelnard
|
||||
Copyright (c) 2006-2016 Camilla Berglund <elmindreda@glfw.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would
|
||||
be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
81
vendor/github.com/go-gl/glfw/v3.2/glfw/input.c
generated
vendored
Normal file
81
vendor/github.com/go-gl/glfw/v3.2/glfw/input.c
generated
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
#include "_cgo_export.h"
|
||||
|
||||
void glfwJoystickCB(int joy, int event) {
|
||||
goJoystickCB(joy, event);
|
||||
}
|
||||
|
||||
void glfwMouseButtonCB(GLFWwindow* window, int button, int action, int mods) {
|
||||
goMouseButtonCB(window, button, action, mods);
|
||||
}
|
||||
|
||||
void glfwCursorPosCB(GLFWwindow* window, double xpos, double ypos) {
|
||||
goCursorPosCB(window, xpos, ypos);
|
||||
}
|
||||
|
||||
void glfwCursorEnterCB(GLFWwindow* window, int entered) {
|
||||
goCursorEnterCB(window, entered);
|
||||
}
|
||||
|
||||
void glfwScrollCB(GLFWwindow* window, double xoff, double yoff) {
|
||||
goScrollCB(window, xoff, yoff);
|
||||
}
|
||||
|
||||
void glfwKeyCB(GLFWwindow* window, int key, int scancode, int action, int mods) {
|
||||
goKeyCB(window, key, scancode, action, mods);
|
||||
}
|
||||
|
||||
void glfwCharCB(GLFWwindow* window, unsigned int character) {
|
||||
goCharCB(window, character);
|
||||
}
|
||||
|
||||
void glfwCharModsCB(GLFWwindow* window, unsigned int character, int mods) {
|
||||
goCharModsCB(window, character, mods);
|
||||
}
|
||||
|
||||
void glfwDropCB(GLFWwindow* window, int count, const char **names) {
|
||||
goDropCB(window, count, (char**)names);
|
||||
}
|
||||
|
||||
void glfwSetJoystickCallbackCB() {
|
||||
glfwSetJoystickCallback(glfwJoystickCB);
|
||||
}
|
||||
|
||||
void glfwSetKeyCallbackCB(GLFWwindow *window) {
|
||||
glfwSetKeyCallback(window, glfwKeyCB);
|
||||
}
|
||||
|
||||
void glfwSetCharCallbackCB(GLFWwindow *window) {
|
||||
glfwSetCharCallback(window, glfwCharCB);
|
||||
}
|
||||
|
||||
void glfwSetCharModsCallbackCB(GLFWwindow *window) {
|
||||
glfwSetCharModsCallback(window, glfwCharModsCB);
|
||||
}
|
||||
|
||||
void glfwSetMouseButtonCallbackCB(GLFWwindow *window) {
|
||||
glfwSetMouseButtonCallback(window, glfwMouseButtonCB);
|
||||
}
|
||||
|
||||
void glfwSetCursorPosCallbackCB(GLFWwindow *window) {
|
||||
glfwSetCursorPosCallback(window, glfwCursorPosCB);
|
||||
}
|
||||
|
||||
void glfwSetCursorEnterCallbackCB(GLFWwindow *window) {
|
||||
glfwSetCursorEnterCallback(window, glfwCursorEnterCB);
|
||||
}
|
||||
|
||||
void glfwSetScrollCallbackCB(GLFWwindow *window) {
|
||||
glfwSetScrollCallback(window, glfwScrollCB);
|
||||
}
|
||||
|
||||
void glfwSetDropCallbackCB(GLFWwindow *window) {
|
||||
glfwSetDropCallback(window, glfwDropCB);
|
||||
}
|
||||
|
||||
float GetAxisAtIndex(float *axis, int i) {
|
||||
return axis[i];
|
||||
}
|
||||
|
||||
unsigned char GetButtonsAtIndex(unsigned char *buttons, int i) {
|
||||
return buttons[i];
|
||||
}
|
696
vendor/github.com/go-gl/glfw/v3.2/glfw/input.go
generated
vendored
Normal file
696
vendor/github.com/go-gl/glfw/v3.2/glfw/input.go
generated
vendored
Normal file
@@ -0,0 +1,696 @@
|
||||
package glfw
|
||||
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
//void glfwSetJoystickCallbackCB();
|
||||
//void glfwSetKeyCallbackCB(GLFWwindow *window);
|
||||
//void glfwSetCharCallbackCB(GLFWwindow *window);
|
||||
//void glfwSetCharModsCallbackCB(GLFWwindow *window);
|
||||
//void glfwSetMouseButtonCallbackCB(GLFWwindow *window);
|
||||
//void glfwSetCursorPosCallbackCB(GLFWwindow *window);
|
||||
//void glfwSetCursorEnterCallbackCB(GLFWwindow *window);
|
||||
//void glfwSetScrollCallbackCB(GLFWwindow *window);
|
||||
//void glfwSetDropCallbackCB(GLFWwindow *window);
|
||||
//float GetAxisAtIndex(float *axis, int i);
|
||||
//unsigned char GetButtonsAtIndex(unsigned char *buttons, int i);
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"image"
|
||||
"image/draw"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var fJoystickHolder func(joy, event int)
|
||||
|
||||
// Joystick corresponds to a joystick.
|
||||
type Joystick int
|
||||
|
||||
// Joystick IDs.
|
||||
const (
|
||||
Joystick1 Joystick = C.GLFW_JOYSTICK_1
|
||||
Joystick2 Joystick = C.GLFW_JOYSTICK_2
|
||||
Joystick3 Joystick = C.GLFW_JOYSTICK_3
|
||||
Joystick4 Joystick = C.GLFW_JOYSTICK_4
|
||||
Joystick5 Joystick = C.GLFW_JOYSTICK_5
|
||||
Joystick6 Joystick = C.GLFW_JOYSTICK_6
|
||||
Joystick7 Joystick = C.GLFW_JOYSTICK_7
|
||||
Joystick8 Joystick = C.GLFW_JOYSTICK_8
|
||||
Joystick9 Joystick = C.GLFW_JOYSTICK_9
|
||||
Joystick10 Joystick = C.GLFW_JOYSTICK_10
|
||||
Joystick11 Joystick = C.GLFW_JOYSTICK_11
|
||||
Joystick12 Joystick = C.GLFW_JOYSTICK_12
|
||||
Joystick13 Joystick = C.GLFW_JOYSTICK_13
|
||||
Joystick14 Joystick = C.GLFW_JOYSTICK_14
|
||||
Joystick15 Joystick = C.GLFW_JOYSTICK_15
|
||||
Joystick16 Joystick = C.GLFW_JOYSTICK_16
|
||||
JoystickLast Joystick = C.GLFW_JOYSTICK_LAST
|
||||
)
|
||||
|
||||
// Key corresponds to a keyboard key.
|
||||
type Key int
|
||||
|
||||
// These key codes are inspired by the USB HID Usage Tables v1.12 (p. 53-60),
|
||||
// but re-arranged to map to 7-bit ASCII for printable keys (function keys are
|
||||
// put in the 256+ range).
|
||||
const (
|
||||
KeyUnknown Key = C.GLFW_KEY_UNKNOWN
|
||||
KeySpace Key = C.GLFW_KEY_SPACE
|
||||
KeyApostrophe Key = C.GLFW_KEY_APOSTROPHE
|
||||
KeyComma Key = C.GLFW_KEY_COMMA
|
||||
KeyMinus Key = C.GLFW_KEY_MINUS
|
||||
KeyPeriod Key = C.GLFW_KEY_PERIOD
|
||||
KeySlash Key = C.GLFW_KEY_SLASH
|
||||
Key0 Key = C.GLFW_KEY_0
|
||||
Key1 Key = C.GLFW_KEY_1
|
||||
Key2 Key = C.GLFW_KEY_2
|
||||
Key3 Key = C.GLFW_KEY_3
|
||||
Key4 Key = C.GLFW_KEY_4
|
||||
Key5 Key = C.GLFW_KEY_5
|
||||
Key6 Key = C.GLFW_KEY_6
|
||||
Key7 Key = C.GLFW_KEY_7
|
||||
Key8 Key = C.GLFW_KEY_8
|
||||
Key9 Key = C.GLFW_KEY_9
|
||||
KeySemicolon Key = C.GLFW_KEY_SEMICOLON
|
||||
KeyEqual Key = C.GLFW_KEY_EQUAL
|
||||
KeyA Key = C.GLFW_KEY_A
|
||||
KeyB Key = C.GLFW_KEY_B
|
||||
KeyC Key = C.GLFW_KEY_C
|
||||
KeyD Key = C.GLFW_KEY_D
|
||||
KeyE Key = C.GLFW_KEY_E
|
||||
KeyF Key = C.GLFW_KEY_F
|
||||
KeyG Key = C.GLFW_KEY_G
|
||||
KeyH Key = C.GLFW_KEY_H
|
||||
KeyI Key = C.GLFW_KEY_I
|
||||
KeyJ Key = C.GLFW_KEY_J
|
||||
KeyK Key = C.GLFW_KEY_K
|
||||
KeyL Key = C.GLFW_KEY_L
|
||||
KeyM Key = C.GLFW_KEY_M
|
||||
KeyN Key = C.GLFW_KEY_N
|
||||
KeyO Key = C.GLFW_KEY_O
|
||||
KeyP Key = C.GLFW_KEY_P
|
||||
KeyQ Key = C.GLFW_KEY_Q
|
||||
KeyR Key = C.GLFW_KEY_R
|
||||
KeyS Key = C.GLFW_KEY_S
|
||||
KeyT Key = C.GLFW_KEY_T
|
||||
KeyU Key = C.GLFW_KEY_U
|
||||
KeyV Key = C.GLFW_KEY_V
|
||||
KeyW Key = C.GLFW_KEY_W
|
||||
KeyX Key = C.GLFW_KEY_X
|
||||
KeyY Key = C.GLFW_KEY_Y
|
||||
KeyZ Key = C.GLFW_KEY_Z
|
||||
KeyLeftBracket Key = C.GLFW_KEY_LEFT_BRACKET
|
||||
KeyBackslash Key = C.GLFW_KEY_BACKSLASH
|
||||
KeyRightBracket Key = C.GLFW_KEY_RIGHT_BRACKET
|
||||
KeyGraveAccent Key = C.GLFW_KEY_GRAVE_ACCENT
|
||||
KeyWorld1 Key = C.GLFW_KEY_WORLD_1
|
||||
KeyWorld2 Key = C.GLFW_KEY_WORLD_2
|
||||
KeyEscape Key = C.GLFW_KEY_ESCAPE
|
||||
KeyEnter Key = C.GLFW_KEY_ENTER
|
||||
KeyTab Key = C.GLFW_KEY_TAB
|
||||
KeyBackspace Key = C.GLFW_KEY_BACKSPACE
|
||||
KeyInsert Key = C.GLFW_KEY_INSERT
|
||||
KeyDelete Key = C.GLFW_KEY_DELETE
|
||||
KeyRight Key = C.GLFW_KEY_RIGHT
|
||||
KeyLeft Key = C.GLFW_KEY_LEFT
|
||||
KeyDown Key = C.GLFW_KEY_DOWN
|
||||
KeyUp Key = C.GLFW_KEY_UP
|
||||
KeyPageUp Key = C.GLFW_KEY_PAGE_UP
|
||||
KeyPageDown Key = C.GLFW_KEY_PAGE_DOWN
|
||||
KeyHome Key = C.GLFW_KEY_HOME
|
||||
KeyEnd Key = C.GLFW_KEY_END
|
||||
KeyCapsLock Key = C.GLFW_KEY_CAPS_LOCK
|
||||
KeyScrollLock Key = C.GLFW_KEY_SCROLL_LOCK
|
||||
KeyNumLock Key = C.GLFW_KEY_NUM_LOCK
|
||||
KeyPrintScreen Key = C.GLFW_KEY_PRINT_SCREEN
|
||||
KeyPause Key = C.GLFW_KEY_PAUSE
|
||||
KeyF1 Key = C.GLFW_KEY_F1
|
||||
KeyF2 Key = C.GLFW_KEY_F2
|
||||
KeyF3 Key = C.GLFW_KEY_F3
|
||||
KeyF4 Key = C.GLFW_KEY_F4
|
||||
KeyF5 Key = C.GLFW_KEY_F5
|
||||
KeyF6 Key = C.GLFW_KEY_F6
|
||||
KeyF7 Key = C.GLFW_KEY_F7
|
||||
KeyF8 Key = C.GLFW_KEY_F8
|
||||
KeyF9 Key = C.GLFW_KEY_F9
|
||||
KeyF10 Key = C.GLFW_KEY_F10
|
||||
KeyF11 Key = C.GLFW_KEY_F11
|
||||
KeyF12 Key = C.GLFW_KEY_F12
|
||||
KeyF13 Key = C.GLFW_KEY_F13
|
||||
KeyF14 Key = C.GLFW_KEY_F14
|
||||
KeyF15 Key = C.GLFW_KEY_F15
|
||||
KeyF16 Key = C.GLFW_KEY_F16
|
||||
KeyF17 Key = C.GLFW_KEY_F17
|
||||
KeyF18 Key = C.GLFW_KEY_F18
|
||||
KeyF19 Key = C.GLFW_KEY_F19
|
||||
KeyF20 Key = C.GLFW_KEY_F20
|
||||
KeyF21 Key = C.GLFW_KEY_F21
|
||||
KeyF22 Key = C.GLFW_KEY_F22
|
||||
KeyF23 Key = C.GLFW_KEY_F23
|
||||
KeyF24 Key = C.GLFW_KEY_F24
|
||||
KeyF25 Key = C.GLFW_KEY_F25
|
||||
KeyKP0 Key = C.GLFW_KEY_KP_0
|
||||
KeyKP1 Key = C.GLFW_KEY_KP_1
|
||||
KeyKP2 Key = C.GLFW_KEY_KP_2
|
||||
KeyKP3 Key = C.GLFW_KEY_KP_3
|
||||
KeyKP4 Key = C.GLFW_KEY_KP_4
|
||||
KeyKP5 Key = C.GLFW_KEY_KP_5
|
||||
KeyKP6 Key = C.GLFW_KEY_KP_6
|
||||
KeyKP7 Key = C.GLFW_KEY_KP_7
|
||||
KeyKP8 Key = C.GLFW_KEY_KP_8
|
||||
KeyKP9 Key = C.GLFW_KEY_KP_9
|
||||
KeyKPDecimal Key = C.GLFW_KEY_KP_DECIMAL
|
||||
KeyKPDivide Key = C.GLFW_KEY_KP_DIVIDE
|
||||
KeyKPMultiply Key = C.GLFW_KEY_KP_MULTIPLY
|
||||
KeyKPSubtract Key = C.GLFW_KEY_KP_SUBTRACT
|
||||
KeyKPAdd Key = C.GLFW_KEY_KP_ADD
|
||||
KeyKPEnter Key = C.GLFW_KEY_KP_ENTER
|
||||
KeyKPEqual Key = C.GLFW_KEY_KP_EQUAL
|
||||
KeyLeftShift Key = C.GLFW_KEY_LEFT_SHIFT
|
||||
KeyLeftControl Key = C.GLFW_KEY_LEFT_CONTROL
|
||||
KeyLeftAlt Key = C.GLFW_KEY_LEFT_ALT
|
||||
KeyLeftSuper Key = C.GLFW_KEY_LEFT_SUPER
|
||||
KeyRightShift Key = C.GLFW_KEY_RIGHT_SHIFT
|
||||
KeyRightControl Key = C.GLFW_KEY_RIGHT_CONTROL
|
||||
KeyRightAlt Key = C.GLFW_KEY_RIGHT_ALT
|
||||
KeyRightSuper Key = C.GLFW_KEY_RIGHT_SUPER
|
||||
KeyMenu Key = C.GLFW_KEY_MENU
|
||||
KeyLast Key = C.GLFW_KEY_LAST
|
||||
)
|
||||
|
||||
// ModifierKey corresponds to a modifier key.
|
||||
type ModifierKey int
|
||||
|
||||
// Modifier keys.
|
||||
const (
|
||||
ModShift ModifierKey = C.GLFW_MOD_SHIFT
|
||||
ModControl ModifierKey = C.GLFW_MOD_CONTROL
|
||||
ModAlt ModifierKey = C.GLFW_MOD_ALT
|
||||
ModSuper ModifierKey = C.GLFW_MOD_SUPER
|
||||
)
|
||||
|
||||
// MouseButton corresponds to a mouse button.
|
||||
type MouseButton int
|
||||
|
||||
// Mouse buttons.
|
||||
const (
|
||||
MouseButton1 MouseButton = C.GLFW_MOUSE_BUTTON_1
|
||||
MouseButton2 MouseButton = C.GLFW_MOUSE_BUTTON_2
|
||||
MouseButton3 MouseButton = C.GLFW_MOUSE_BUTTON_3
|
||||
MouseButton4 MouseButton = C.GLFW_MOUSE_BUTTON_4
|
||||
MouseButton5 MouseButton = C.GLFW_MOUSE_BUTTON_5
|
||||
MouseButton6 MouseButton = C.GLFW_MOUSE_BUTTON_6
|
||||
MouseButton7 MouseButton = C.GLFW_MOUSE_BUTTON_7
|
||||
MouseButton8 MouseButton = C.GLFW_MOUSE_BUTTON_8
|
||||
MouseButtonLast MouseButton = C.GLFW_MOUSE_BUTTON_LAST
|
||||
MouseButtonLeft MouseButton = C.GLFW_MOUSE_BUTTON_LEFT
|
||||
MouseButtonRight MouseButton = C.GLFW_MOUSE_BUTTON_RIGHT
|
||||
MouseButtonMiddle MouseButton = C.GLFW_MOUSE_BUTTON_MIDDLE
|
||||
)
|
||||
|
||||
// StandardCursor corresponds to a standard cursor icon.
|
||||
type StandardCursor int
|
||||
|
||||
// Standard cursors
|
||||
const (
|
||||
ArrowCursor StandardCursor = C.GLFW_ARROW_CURSOR
|
||||
IBeamCursor StandardCursor = C.GLFW_IBEAM_CURSOR
|
||||
CrosshairCursor StandardCursor = C.GLFW_CROSSHAIR_CURSOR
|
||||
HandCursor StandardCursor = C.GLFW_HAND_CURSOR
|
||||
HResizeCursor StandardCursor = C.GLFW_HRESIZE_CURSOR
|
||||
VResizeCursor StandardCursor = C.GLFW_VRESIZE_CURSOR
|
||||
)
|
||||
|
||||
// Action corresponds to a key or button action.
|
||||
type Action int
|
||||
|
||||
// Action types.
|
||||
const (
|
||||
Release Action = C.GLFW_RELEASE // The key or button was released.
|
||||
Press Action = C.GLFW_PRESS // The key or button was pressed.
|
||||
Repeat Action = C.GLFW_REPEAT // The key was held down until it repeated.
|
||||
)
|
||||
|
||||
// InputMode corresponds to an input mode.
|
||||
type InputMode int
|
||||
|
||||
// Input modes.
|
||||
const (
|
||||
CursorMode InputMode = C.GLFW_CURSOR // See Cursor mode values
|
||||
StickyKeysMode InputMode = C.GLFW_STICKY_KEYS // Value can be either 1 or 0
|
||||
StickyMouseButtonsMode InputMode = C.GLFW_STICKY_MOUSE_BUTTONS // Value can be either 1 or 0
|
||||
)
|
||||
|
||||
// Cursor mode values.
|
||||
const (
|
||||
CursorNormal int = C.GLFW_CURSOR_NORMAL
|
||||
CursorHidden int = C.GLFW_CURSOR_HIDDEN
|
||||
CursorDisabled int = C.GLFW_CURSOR_DISABLED
|
||||
)
|
||||
|
||||
// Cursor represents a cursor.
|
||||
type Cursor struct {
|
||||
data *C.GLFWcursor
|
||||
}
|
||||
|
||||
//export goJoystickCB
|
||||
func goJoystickCB(joy, event C.int) {
|
||||
fJoystickHolder(int(joy), int(event))
|
||||
}
|
||||
|
||||
//export goMouseButtonCB
|
||||
func goMouseButtonCB(window unsafe.Pointer, button, action, mods C.int) {
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
w.fMouseButtonHolder(w, MouseButton(button), Action(action), ModifierKey(mods))
|
||||
}
|
||||
|
||||
//export goCursorPosCB
|
||||
func goCursorPosCB(window unsafe.Pointer, xpos, ypos C.double) {
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
w.fCursorPosHolder(w, float64(xpos), float64(ypos))
|
||||
}
|
||||
|
||||
//export goCursorEnterCB
|
||||
func goCursorEnterCB(window unsafe.Pointer, entered C.int) {
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
hasEntered := glfwbool(entered)
|
||||
w.fCursorEnterHolder(w, hasEntered)
|
||||
}
|
||||
|
||||
//export goScrollCB
|
||||
func goScrollCB(window unsafe.Pointer, xoff, yoff C.double) {
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
w.fScrollHolder(w, float64(xoff), float64(yoff))
|
||||
}
|
||||
|
||||
//export goKeyCB
|
||||
func goKeyCB(window unsafe.Pointer, key, scancode, action, mods C.int) {
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
w.fKeyHolder(w, Key(key), int(scancode), Action(action), ModifierKey(mods))
|
||||
}
|
||||
|
||||
//export goCharCB
|
||||
func goCharCB(window unsafe.Pointer, character C.uint) {
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
w.fCharHolder(w, rune(character))
|
||||
}
|
||||
|
||||
//export goCharModsCB
|
||||
func goCharModsCB(window unsafe.Pointer, character C.uint, mods C.int) {
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
w.fCharModsHolder(w, rune(character), ModifierKey(mods))
|
||||
}
|
||||
|
||||
//export goDropCB
|
||||
func goDropCB(window unsafe.Pointer, count C.int, names **C.char) { // TODO: The types of name can be `**C.char` or `unsafe.Pointer`, use whichever is better.
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
namesSlice := make([]string, int(count)) // TODO: Make this better. This part is unfinished, hacky, probably not correct, and not idiomatic.
|
||||
for i := 0; i < int(count); i++ { // TODO: Make this better. It should be cleaned up and vetted.
|
||||
var x *C.char // TODO: Make this better.
|
||||
p := (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(names)) + uintptr(i)*unsafe.Sizeof(x))) // TODO: Make this better.
|
||||
namesSlice[i] = C.GoString(*p) // TODO: Make this better.
|
||||
}
|
||||
w.fDropHolder(w, namesSlice)
|
||||
}
|
||||
|
||||
// GetInputMode returns the value of an input option of the window.
|
||||
func (w *Window) GetInputMode(mode InputMode) int {
|
||||
ret := int(C.glfwGetInputMode(w.data, C.int(mode)))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// SetInputMode sets an input option for the window.
|
||||
func (w *Window) SetInputMode(mode InputMode, value int) {
|
||||
C.glfwSetInputMode(w.data, C.int(mode), C.int(value))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetKey returns the last reported state of a keyboard key. The returned state
|
||||
// is one of Press or Release. The higher-level state Repeat is only reported to
|
||||
// the key callback.
|
||||
//
|
||||
// If the StickyKeys input mode is enabled, this function returns Press the first
|
||||
// time you call this function after a key has been pressed, even if the key has
|
||||
// already been released.
|
||||
//
|
||||
// The key functions deal with physical keys, with key tokens named after their
|
||||
// use on the standard US keyboard layout. If you want to input text, use the
|
||||
// Unicode character callback instead.
|
||||
func (w *Window) GetKey(key Key) Action {
|
||||
ret := Action(C.glfwGetKey(w.data, C.int(key)))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetKeyName returns the localized name of the specified printable key.
|
||||
//
|
||||
// If the key is glfw.KeyUnknown, the scancode is used, otherwise the scancode is ignored.
|
||||
func GetKeyName(key Key, scancode int) string {
|
||||
ret := C.glfwGetKeyName(C.int(key), C.int(scancode))
|
||||
panicError()
|
||||
return C.GoString(ret)
|
||||
}
|
||||
|
||||
// GetMouseButton returns the last state reported for the specified mouse button.
|
||||
//
|
||||
// If the StickyMouseButtons input mode is enabled, this function returns Press
|
||||
// the first time you call this function after a mouse button has been pressed,
|
||||
// even if the mouse button has already been released.
|
||||
func (w *Window) GetMouseButton(button MouseButton) Action {
|
||||
ret := Action(C.glfwGetMouseButton(w.data, C.int(button)))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetCursorPos returns the last reported position of the cursor.
|
||||
//
|
||||
// If the cursor is disabled (with CursorDisabled) then the cursor position is
|
||||
// unbounded and limited only by the minimum and maximum values of a double.
|
||||
//
|
||||
// The coordinate can be converted to their integer equivalents with the floor
|
||||
// function. Casting directly to an integer type works for positive coordinates,
|
||||
// but fails for negative ones.
|
||||
func (w *Window) GetCursorPos() (x, y float64) {
|
||||
var xpos, ypos C.double
|
||||
C.glfwGetCursorPos(w.data, &xpos, &ypos)
|
||||
panicError()
|
||||
return float64(xpos), float64(ypos)
|
||||
}
|
||||
|
||||
// SetCursorPos sets the position of the cursor. The specified window must
|
||||
// be focused. If the window does not have focus when this function is called,
|
||||
// it fails silently.
|
||||
//
|
||||
// If the cursor is disabled (with CursorDisabled) then the cursor position is
|
||||
// unbounded and limited only by the minimum and maximum values of a double.
|
||||
func (w *Window) SetCursorPos(xpos, ypos float64) {
|
||||
C.glfwSetCursorPos(w.data, C.double(xpos), C.double(ypos))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// CreateCursor creates a new custom cursor image that can be set for a window with SetCursor.
|
||||
// The cursor can be destroyed with Destroy. Any remaining cursors are destroyed by Terminate.
|
||||
//
|
||||
// The image is ideally provided in the form of *image.NRGBA.
|
||||
// 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. If the image
|
||||
// type is not *image.NRGBA, it will be converted to it.
|
||||
//
|
||||
// The cursor hotspot is specified in pixels, relative to the upper-left corner of the cursor image.
|
||||
// Like all other coordinate systems in GLFW, the X-axis points to the right and the Y-axis points down.
|
||||
func CreateCursor(img image.Image, xhot, yhot int) *Cursor {
|
||||
var imgC C.GLFWimage
|
||||
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)
|
||||
|
||||
imgC.width = C.int(b.Dx())
|
||||
imgC.height = C.int(b.Dy())
|
||||
imgC.pixels = (*C.uchar)(pix)
|
||||
|
||||
c := C.glfwCreateCursor(&imgC, C.int(xhot), C.int(yhot))
|
||||
|
||||
free()
|
||||
panicError()
|
||||
|
||||
return &Cursor{c}
|
||||
}
|
||||
|
||||
// CreateStandardCursor returns a cursor with a standard shape,
|
||||
// that can be set for a window with SetCursor.
|
||||
func CreateStandardCursor(shape StandardCursor) *Cursor {
|
||||
c := C.glfwCreateStandardCursor(C.int(shape))
|
||||
panicError()
|
||||
return &Cursor{c}
|
||||
}
|
||||
|
||||
// Destroy destroys a cursor previously created with CreateCursor.
|
||||
// Any remaining cursors will be destroyed by Terminate.
|
||||
func (c *Cursor) Destroy() {
|
||||
C.glfwDestroyCursor(c.data)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// SetCursor sets the cursor image to be used when the cursor is over the client area
|
||||
// of the specified window. The set cursor will only be visible when the cursor mode of the
|
||||
// window is CursorNormal.
|
||||
//
|
||||
// On some platforms, the set cursor may not be visible unless the window also has input focus.
|
||||
func (w *Window) SetCursor(c *Cursor) {
|
||||
if c == nil {
|
||||
C.glfwSetCursor(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetCursor(w.data, c.data)
|
||||
}
|
||||
panicError()
|
||||
}
|
||||
|
||||
// JoystickCallback is the joystick configuration callback.
|
||||
type JoystickCallback func(joy, event int)
|
||||
|
||||
// SetJoystickCallback sets the joystick configuration callback, or removes the
|
||||
// currently set callback. This is called when a joystick is connected to or
|
||||
// disconnected from the system.
|
||||
func SetJoystickCallback(cbfun JoystickCallback) (previous JoystickCallback) {
|
||||
previous = fJoystickHolder
|
||||
fJoystickHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetJoystickCallback(nil)
|
||||
} else {
|
||||
C.glfwSetJoystickCallbackCB()
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// KeyCallback is the key callback.
|
||||
type KeyCallback func(w *Window, key Key, scancode int, action Action, mods ModifierKey)
|
||||
|
||||
// SetKeyCallback sets the key callback which is called when a key is pressed,
|
||||
// repeated or released.
|
||||
//
|
||||
// The key functions deal with physical keys, with layout independent key tokens
|
||||
// named after their values in the standard US keyboard layout. If you want to
|
||||
// input text, use the SetCharCallback instead.
|
||||
//
|
||||
// When a window loses focus, it will generate synthetic key release events for
|
||||
// all pressed keys. You can tell these events from user-generated events by the
|
||||
// fact that the synthetic ones are generated after the window has lost focus,
|
||||
// i.e. Focused will be false and the focus callback will have already been
|
||||
// called.
|
||||
func (w *Window) SetKeyCallback(cbfun KeyCallback) (previous KeyCallback) {
|
||||
previous = w.fKeyHolder
|
||||
w.fKeyHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetKeyCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetKeyCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// CharCallback is the character callback.
|
||||
type CharCallback func(w *Window, char rune)
|
||||
|
||||
// SetCharCallback sets the character callback which is called when a
|
||||
// Unicode character is input.
|
||||
//
|
||||
// The character callback is intended for Unicode text input. As it deals with
|
||||
// characters, it is keyboard layout dependent, whereas the
|
||||
// key callback is not. Characters do not map 1:1
|
||||
// to physical keys, as a key may produce zero, one or more characters. If you
|
||||
// want to know whether a specific physical key was pressed or released, see
|
||||
// the key callback instead.
|
||||
//
|
||||
// The character callback behaves as system text input normally does and will
|
||||
// not be called if modifier keys are held down that would prevent normal text
|
||||
// input on that platform, for example a Super (Command) key on OS X or Alt key
|
||||
// on Windows. There is a character with modifiers callback that receives these events.
|
||||
func (w *Window) SetCharCallback(cbfun CharCallback) (previous CharCallback) {
|
||||
previous = w.fCharHolder
|
||||
w.fCharHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetCharCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetCharCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// CharModsCallback is the character with modifiers callback.
|
||||
type CharModsCallback func(w *Window, char rune, mods ModifierKey)
|
||||
|
||||
// SetCharModsCallback sets the character with modifiers callback which is called when a
|
||||
// Unicode character is input regardless of what modifier keys are used.
|
||||
//
|
||||
// The character with modifiers callback is intended for implementing custom
|
||||
// Unicode character input. For regular Unicode text input, see the
|
||||
// character callback. Like the character callback, the character with modifiers callback
|
||||
// deals with characters and is keyboard layout dependent. Characters do not
|
||||
// map 1:1 to physical keys, as a key may produce zero, one or more characters.
|
||||
// If you want to know whether a specific physical key was pressed or released,
|
||||
// see the key callback instead.
|
||||
func (w *Window) SetCharModsCallback(cbfun CharModsCallback) (previous CharModsCallback) {
|
||||
previous = w.fCharModsHolder
|
||||
w.fCharModsHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetCharModsCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetCharModsCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// MouseButtonCallback is the mouse button callback.
|
||||
type MouseButtonCallback func(w *Window, button MouseButton, action Action, mod ModifierKey)
|
||||
|
||||
// SetMouseButtonCallback sets the mouse button callback which is called when a
|
||||
// mouse button is pressed or released.
|
||||
//
|
||||
// When a window loses focus, it will generate synthetic mouse button release
|
||||
// events for all pressed mouse buttons. You can tell these events from
|
||||
// user-generated events by the fact that the synthetic ones are generated after
|
||||
// the window has lost focus, i.e. Focused will be false and the focus
|
||||
// callback will have already been called.
|
||||
func (w *Window) SetMouseButtonCallback(cbfun MouseButtonCallback) (previous MouseButtonCallback) {
|
||||
previous = w.fMouseButtonHolder
|
||||
w.fMouseButtonHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetMouseButtonCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetMouseButtonCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// CursorPosCallback the cursor position callback.
|
||||
type CursorPosCallback func(w *Window, xpos float64, ypos float64)
|
||||
|
||||
// SetCursorPosCallback sets the cursor position callback which is called
|
||||
// when the cursor is moved. The callback is provided with the position relative
|
||||
// to the upper-left corner of the client area of the window.
|
||||
func (w *Window) SetCursorPosCallback(cbfun CursorPosCallback) (previous CursorPosCallback) {
|
||||
previous = w.fCursorPosHolder
|
||||
w.fCursorPosHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetCursorPosCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetCursorPosCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// CursorEnterCallback is the cursor boundary crossing callback.
|
||||
type CursorEnterCallback func(w *Window, entered bool)
|
||||
|
||||
// SetCursorEnterCallback the cursor boundary crossing callback which is called
|
||||
// when the cursor enters or leaves the client area of the window.
|
||||
func (w *Window) SetCursorEnterCallback(cbfun CursorEnterCallback) (previous CursorEnterCallback) {
|
||||
previous = w.fCursorEnterHolder
|
||||
w.fCursorEnterHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetCursorEnterCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetCursorEnterCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// ScrollCallback is the scroll callback.
|
||||
type ScrollCallback func(w *Window, xoff float64, yoff float64)
|
||||
|
||||
// SetScrollCallback sets the scroll callback which is called when a scrolling
|
||||
// device is used, such as a mouse wheel or scrolling area of a touchpad.
|
||||
func (w *Window) SetScrollCallback(cbfun ScrollCallback) (previous ScrollCallback) {
|
||||
previous = w.fScrollHolder
|
||||
w.fScrollHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetScrollCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetScrollCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// DropCallback is the drop callback.
|
||||
type DropCallback func(w *Window, names []string)
|
||||
|
||||
// SetDropCallback sets the drop callback which is called when an object
|
||||
// is dropped over the window.
|
||||
func (w *Window) SetDropCallback(cbfun DropCallback) (previous DropCallback) {
|
||||
previous = w.fDropHolder
|
||||
w.fDropHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetDropCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetDropCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// JoystickPresent reports whether the specified joystick is present.
|
||||
func JoystickPresent(joy Joystick) bool {
|
||||
ret := glfwbool(C.glfwJoystickPresent(C.int(joy)))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetJoystickAxes returns a slice of axis values.
|
||||
func GetJoystickAxes(joy Joystick) []float32 {
|
||||
var length int
|
||||
|
||||
axis := C.glfwGetJoystickAxes(C.int(joy), (*C.int)(unsafe.Pointer(&length)))
|
||||
panicError()
|
||||
if axis == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
a := make([]float32, length)
|
||||
for i := 0; i < length; i++ {
|
||||
a[i] = float32(C.GetAxisAtIndex(axis, C.int(i)))
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
// GetJoystickButtons returns a slice of button values.
|
||||
func GetJoystickButtons(joy Joystick) []byte {
|
||||
var length int
|
||||
|
||||
buttons := C.glfwGetJoystickButtons(C.int(joy), (*C.int)(unsafe.Pointer(&length)))
|
||||
panicError()
|
||||
if buttons == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
b := make([]byte, length)
|
||||
for i := 0; i < length; i++ {
|
||||
b[i] = byte(C.GetButtonsAtIndex(buttons, C.int(i)))
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// GetJoystickName returns the name, encoded as UTF-8, of the specified joystick.
|
||||
func GetJoystickName(joy Joystick) string {
|
||||
jn := C.glfwGetJoystickName(C.int(joy))
|
||||
panicError()
|
||||
return C.GoString(jn)
|
||||
}
|
25
vendor/github.com/go-gl/glfw/v3.2/glfw/monitor.c
generated
vendored
Normal file
25
vendor/github.com/go-gl/glfw/v3.2/glfw/monitor.c
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "_cgo_export.h"
|
||||
|
||||
GLFWmonitor *GetMonitorAtIndex(GLFWmonitor **monitors, int index) {
|
||||
return monitors[index];
|
||||
}
|
||||
|
||||
GLFWvidmode GetVidmodeAtIndex(GLFWvidmode *vidmodes, int index) {
|
||||
return vidmodes[index];
|
||||
}
|
||||
|
||||
void glfwMonitorCB(GLFWmonitor* monitor, int event) {
|
||||
goMonitorCB(monitor, event);
|
||||
}
|
||||
|
||||
void glfwSetMonitorCallbackCB() {
|
||||
glfwSetMonitorCallback(glfwMonitorCB);
|
||||
}
|
||||
|
||||
unsigned int GetGammaAtIndex(unsigned short *color, int i) {
|
||||
return color[i];
|
||||
}
|
||||
|
||||
void SetGammaAtIndex(unsigned short *color, int i, unsigned short value) {
|
||||
color[i] = value;
|
||||
}
|
208
vendor/github.com/go-gl/glfw/v3.2/glfw/monitor.go
generated
vendored
Normal file
208
vendor/github.com/go-gl/glfw/v3.2/glfw/monitor.go
generated
vendored
Normal file
@@ -0,0 +1,208 @@
|
||||
package glfw
|
||||
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
//GLFWmonitor* GetMonitorAtIndex(GLFWmonitor **monitors, int index);
|
||||
//GLFWvidmode GetVidmodeAtIndex(GLFWvidmode *vidmodes, int index);
|
||||
//void glfwSetMonitorCallbackCB();
|
||||
//unsigned int GetGammaAtIndex(unsigned short *color, int i);
|
||||
//void SetGammaAtIndex(unsigned short *color, int i, unsigned short value);
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// Monitor represents a monitor.
|
||||
type Monitor struct {
|
||||
data *C.GLFWmonitor
|
||||
}
|
||||
|
||||
// MonitorEvent corresponds to a monitor configuration event.
|
||||
type MonitorEvent int
|
||||
|
||||
// GammaRamp describes the gamma ramp for a monitor.
|
||||
type GammaRamp struct {
|
||||
Red []uint16 // A slice of value describing the response of the red channel.
|
||||
Green []uint16 // A slice of value describing the response of the green channel.
|
||||
Blue []uint16 // A slice of value describing the response of the blue channel.
|
||||
}
|
||||
|
||||
// Monitor events.
|
||||
const (
|
||||
Connected MonitorEvent = C.GLFW_CONNECTED
|
||||
Disconnected MonitorEvent = C.GLFW_DISCONNECTED
|
||||
)
|
||||
|
||||
// VidMode describes a single video mode.
|
||||
type VidMode struct {
|
||||
Width int // The width, in pixels, of the video mode.
|
||||
Height int // The height, in pixels, of the video mode.
|
||||
RedBits int // The bit depth of the red channel of the video mode.
|
||||
GreenBits int // The bit depth of the green channel of the video mode.
|
||||
BlueBits int // The bit depth of the blue channel of the video mode.
|
||||
RefreshRate int // The refresh rate, in Hz, of the video mode.
|
||||
}
|
||||
|
||||
var fMonitorHolder func(monitor *Monitor, event MonitorEvent)
|
||||
|
||||
//export goMonitorCB
|
||||
func goMonitorCB(monitor unsafe.Pointer, event C.int) {
|
||||
fMonitorHolder(&Monitor{(*C.GLFWmonitor)(monitor)}, MonitorEvent(event))
|
||||
}
|
||||
|
||||
// GetMonitors returns a slice of handles for all currently connected monitors.
|
||||
func GetMonitors() []*Monitor {
|
||||
var length int
|
||||
|
||||
mC := C.glfwGetMonitors((*C.int)(unsafe.Pointer(&length)))
|
||||
panicError()
|
||||
if mC == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
m := make([]*Monitor, length)
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
m[i] = &Monitor{C.GetMonitorAtIndex(mC, C.int(i))}
|
||||
}
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
// GetPrimaryMonitor returns the primary monitor. This is usually the monitor
|
||||
// where elements like the Windows task bar or the OS X menu bar is located.
|
||||
func GetPrimaryMonitor() *Monitor {
|
||||
m := C.glfwGetPrimaryMonitor()
|
||||
panicError()
|
||||
if m == nil {
|
||||
return nil
|
||||
}
|
||||
return &Monitor{m}
|
||||
}
|
||||
|
||||
// GetPos returns the position, in screen coordinates, of the upper-left
|
||||
// corner of the monitor.
|
||||
func (m *Monitor) GetPos() (x, y int) {
|
||||
var xpos, ypos C.int
|
||||
C.glfwGetMonitorPos(m.data, &xpos, &ypos)
|
||||
panicError()
|
||||
return int(xpos), int(ypos)
|
||||
}
|
||||
|
||||
// GetPhysicalSize returns the size, in millimetres, of the display area of the
|
||||
// monitor.
|
||||
//
|
||||
// Note: Some operating systems do not provide accurate information, either
|
||||
// because the monitor's EDID data is incorrect, or because the driver does not
|
||||
// report it accurately.
|
||||
func (m *Monitor) GetPhysicalSize() (width, height int) {
|
||||
var wi, h C.int
|
||||
C.glfwGetMonitorPhysicalSize(m.data, &wi, &h)
|
||||
panicError()
|
||||
return int(wi), int(h)
|
||||
}
|
||||
|
||||
// GetName returns a human-readable name of the monitor, encoded as UTF-8.
|
||||
func (m *Monitor) GetName() string {
|
||||
mn := C.glfwGetMonitorName(m.data)
|
||||
panicError()
|
||||
if mn == nil {
|
||||
return ""
|
||||
}
|
||||
return C.GoString(mn)
|
||||
}
|
||||
|
||||
// SetMonitorCallback sets the monitor configuration callback, or removes the
|
||||
// currently set callback. This is called when a monitor is connected to or
|
||||
// disconnected from the system.
|
||||
func SetMonitorCallback(cbfun func(monitor *Monitor, event MonitorEvent)) {
|
||||
if cbfun == nil {
|
||||
C.glfwSetMonitorCallback(nil)
|
||||
} else {
|
||||
fMonitorHolder = cbfun
|
||||
C.glfwSetMonitorCallbackCB()
|
||||
}
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetVideoModes returns an array of all video modes supported by the monitor.
|
||||
// The returned array is sorted in ascending order, first by color bit depth
|
||||
// (the sum of all channel depths) and then by resolution area (the product of
|
||||
// width and height).
|
||||
func (m *Monitor) GetVideoModes() []*VidMode {
|
||||
var length int
|
||||
|
||||
vC := C.glfwGetVideoModes(m.data, (*C.int)(unsafe.Pointer(&length)))
|
||||
panicError()
|
||||
if vC == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
v := make([]*VidMode, length)
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
t := C.GetVidmodeAtIndex(vC, C.int(i))
|
||||
v[i] = &VidMode{int(t.width), int(t.height), int(t.redBits), int(t.greenBits), int(t.blueBits), int(t.refreshRate)}
|
||||
}
|
||||
|
||||
return v
|
||||
}
|
||||
|
||||
// GetVideoMode returns the current video mode of the monitor. If you
|
||||
// are using a full screen window, the return value will therefore depend on
|
||||
// whether it is focused.
|
||||
func (m *Monitor) GetVideoMode() *VidMode {
|
||||
t := C.glfwGetVideoMode(m.data)
|
||||
if t == nil {
|
||||
return nil
|
||||
}
|
||||
panicError()
|
||||
return &VidMode{int(t.width), int(t.height), int(t.redBits), int(t.greenBits), int(t.blueBits), int(t.refreshRate)}
|
||||
}
|
||||
|
||||
// SetGamma generates a 256-element gamma ramp from the specified exponent and then calls
|
||||
// SetGamma with it.
|
||||
func (m *Monitor) SetGamma(gamma float32) {
|
||||
C.glfwSetGamma(m.data, C.float(gamma))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetGammaRamp retrieves the current gamma ramp of the monitor.
|
||||
func (m *Monitor) GetGammaRamp() *GammaRamp {
|
||||
var ramp GammaRamp
|
||||
|
||||
rampC := C.glfwGetGammaRamp(m.data)
|
||||
panicError()
|
||||
if rampC == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
length := int(rampC.size)
|
||||
ramp.Red = make([]uint16, length)
|
||||
ramp.Green = make([]uint16, length)
|
||||
ramp.Blue = make([]uint16, length)
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
ramp.Red[i] = uint16(C.GetGammaAtIndex(rampC.red, C.int(i)))
|
||||
ramp.Green[i] = uint16(C.GetGammaAtIndex(rampC.green, C.int(i)))
|
||||
ramp.Blue[i] = uint16(C.GetGammaAtIndex(rampC.blue, C.int(i)))
|
||||
}
|
||||
|
||||
return &ramp
|
||||
}
|
||||
|
||||
// SetGammaRamp sets the current gamma ramp for the monitor.
|
||||
func (m *Monitor) SetGammaRamp(ramp *GammaRamp) {
|
||||
var rampC C.GLFWgammaramp
|
||||
|
||||
length := len(ramp.Red)
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
C.SetGammaAtIndex(rampC.red, C.int(i), C.ushort(ramp.Red[i]))
|
||||
C.SetGammaAtIndex(rampC.green, C.int(i), C.ushort(ramp.Green[i]))
|
||||
C.SetGammaAtIndex(rampC.blue, C.int(i), C.ushort(ramp.Blue[i]))
|
||||
}
|
||||
|
||||
C.glfwSetGammaRamp(m.data, &rampC)
|
||||
panicError()
|
||||
}
|
39
vendor/github.com/go-gl/glfw/v3.2/glfw/native_darwin.go
generated
vendored
Normal file
39
vendor/github.com/go-gl/glfw/v3.2/glfw/native_darwin.go
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
package glfw
|
||||
|
||||
/*
|
||||
#define GLFW_EXPOSE_NATIVE_COCOA
|
||||
#define GLFW_EXPOSE_NATIVE_NSGL
|
||||
#include "glfw/include/GLFW/glfw3.h"
|
||||
#include "glfw/include/GLFW/glfw3native.h"
|
||||
|
||||
// workaround wrappers needed due to a cgo and/or LLVM bug.
|
||||
// See: https://github.com/go-gl/glfw/issues/136
|
||||
void *workaround_glfwGetCocoaWindow(GLFWwindow *w) {
|
||||
return (void *)glfwGetCocoaWindow(w);
|
||||
}
|
||||
void *workaround_glfwGetNSGLContext(GLFWwindow *w) {
|
||||
return (void *)glfwGetNSGLContext(w);
|
||||
}
|
||||
*/
|
||||
import "C"
|
||||
|
||||
// GetCocoaMonitor returns the CGDirectDisplayID of the monitor.
|
||||
func (m *Monitor) GetCocoaMonitor() uintptr {
|
||||
ret := uintptr(C.glfwGetCocoaMonitor(m.data))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetCocoaWindow returns the NSWindow of the window.
|
||||
func (w *Window) GetCocoaWindow() uintptr {
|
||||
ret := uintptr(C.workaround_glfwGetCocoaWindow(w.data))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetNSGLContext returns the NSOpenGLContext of the window.
|
||||
func (w *Window) GetNSGLContext() uintptr {
|
||||
ret := uintptr(C.workaround_glfwGetNSGLContext(w.data))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
50
vendor/github.com/go-gl/glfw/v3.2/glfw/native_linbsd.go
generated
vendored
Normal file
50
vendor/github.com/go-gl/glfw/v3.2/glfw/native_linbsd.go
generated
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
// +build linux freebsd
|
||||
|
||||
package glfw
|
||||
|
||||
//#define GLFW_EXPOSE_NATIVE_X11
|
||||
//#define GLFW_EXPOSE_NATIVE_GLX
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
//#include "glfw/include/GLFW/glfw3native.h"
|
||||
import "C"
|
||||
|
||||
func GetX11Display() *C.Display {
|
||||
ret := C.glfwGetX11Display()
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetX11Adapter returns the RRCrtc of the monitor.
|
||||
func (m *Monitor) GetX11Adapter() C.RRCrtc {
|
||||
ret := C.glfwGetX11Adapter(m.data)
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetX11Monitor returns the RROutput of the monitor.
|
||||
func (m *Monitor) GetX11Monitor() C.RROutput {
|
||||
ret := C.glfwGetX11Monitor(m.data)
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetX11Window returns the Window of the window.
|
||||
func (w *Window) GetX11Window() C.Window {
|
||||
ret := C.glfwGetX11Window(w.data)
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetGLXContext returns the GLXContext of the window.
|
||||
func (w *Window) GetGLXContext() C.GLXContext {
|
||||
ret := C.glfwGetGLXContext(w.data)
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetGLXWindow returns the GLXWindow of the window.
|
||||
func (w *Window) GetGLXWindow() C.GLXWindow {
|
||||
ret := C.glfwGetGLXWindow(w.data)
|
||||
panicError()
|
||||
return ret
|
||||
}
|
35
vendor/github.com/go-gl/glfw/v3.2/glfw/native_windows.go
generated
vendored
Normal file
35
vendor/github.com/go-gl/glfw/v3.2/glfw/native_windows.go
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
package glfw
|
||||
|
||||
//#define GLFW_EXPOSE_NATIVE_WIN32
|
||||
//#define GLFW_EXPOSE_NATIVE_WGL
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
//#include "glfw/include/GLFW/glfw3native.h"
|
||||
import "C"
|
||||
|
||||
// GetWin32Adapter returns the adapter device name of the monitor.
|
||||
func (m *Monitor) GetWin32Adapter() string {
|
||||
ret := C.glfwGetWin32Adapter(m.data)
|
||||
panicError()
|
||||
return C.GoString(ret)
|
||||
}
|
||||
|
||||
// GetWin32Monitor returns the display device name of the monitor.
|
||||
func (m *Monitor) GetWin32Monitor() string {
|
||||
ret := C.glfwGetWin32Monitor(m.data)
|
||||
panicError()
|
||||
return C.GoString(ret)
|
||||
}
|
||||
|
||||
// GetWin32Window returns the HWND of the window.
|
||||
func (w *Window) GetWin32Window() C.HWND {
|
||||
ret := C.glfwGetWin32Window(w.data)
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetWGLContext returns the HGLRC of the window.
|
||||
func (w *Window) GetWGLContext() C.HGLRC {
|
||||
ret := C.glfwGetWGLContext(w.data)
|
||||
panicError()
|
||||
return ret
|
||||
}
|
41
vendor/github.com/go-gl/glfw/v3.2/glfw/time.go
generated
vendored
Normal file
41
vendor/github.com/go-gl/glfw/v3.2/glfw/time.go
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
package glfw
|
||||
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
import "C"
|
||||
|
||||
// GetTime returns the value of the GLFW timer. Unless the timer has been set
|
||||
// using SetTime, the timer measures time elapsed since GLFW was initialized.
|
||||
//
|
||||
// The resolution of the timer is system dependent, but is usually on the order
|
||||
// of a few micro- or nanoseconds. It uses the highest-resolution monotonic time
|
||||
// source on each supported platform.
|
||||
func GetTime() float64 {
|
||||
ret := float64(C.glfwGetTime())
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// SetTime sets the value of the GLFW timer. It then continues to count up from
|
||||
// that value.
|
||||
//
|
||||
// The resolution of the timer is system dependent, but is usually on the order
|
||||
// of a few micro- or nanoseconds. It uses the highest-resolution monotonic time
|
||||
// source on each supported platform.
|
||||
func SetTime(time float64) {
|
||||
C.glfwSetTime(C.double(time))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetTimerFrequency returns frequency of the timer, in Hz, or zero if an error occurred.
|
||||
func GetTimerFrequency() uint64 {
|
||||
ret := uint64(C.glfwGetTimerFrequency())
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetTimerValue returns the current value of the raw timer, measured in 1 / frequency seconds.
|
||||
func GetTimerValue() uint64 {
|
||||
ret := uint64(C.glfwGetTimerValue())
|
||||
panicError()
|
||||
return ret
|
||||
}
|
37
vendor/github.com/go-gl/glfw/v3.2/glfw/util.go
generated
vendored
Normal file
37
vendor/github.com/go-gl/glfw/v3.2/glfw/util.go
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
package glfw
|
||||
|
||||
//#include <stdlib.h>
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func glfwbool(b C.int) bool {
|
||||
if b == C.GL_TRUE {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func bytes(origin []byte) (pointer *uint8, free func()) {
|
||||
n := len(origin)
|
||||
|
||||
if n == 0 {
|
||||
return nil, func() {}
|
||||
}
|
||||
|
||||
data := C.malloc(C.size_t(n))
|
||||
|
||||
dataSlice := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
||||
Data: uintptr(data),
|
||||
Len: n,
|
||||
Cap: n,
|
||||
}))
|
||||
|
||||
copy(dataSlice, origin)
|
||||
|
||||
return &dataSlice[0], func() { C.free(data) }
|
||||
}
|
14
vendor/github.com/go-gl/glfw/v3.2/glfw/vulkan.go
generated
vendored
Normal file
14
vendor/github.com/go-gl/glfw/v3.2/glfw/vulkan.go
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
package glfw
|
||||
|
||||
//#include "glfw/include/GLFW/glfw3.h"
|
||||
import "C"
|
||||
|
||||
// VulkanSupported reports whether the Vulkan loader has been found. This check is performed by Init.
|
||||
//
|
||||
// The availability of a Vulkan loader does not by itself guarantee that window surface creation or
|
||||
// even device creation is possible. Call GetRequiredInstanceExtensions to check whether the
|
||||
// extensions necessary for Vulkan surface creation are available and GetPhysicalDevicePresentationSupport
|
||||
// to check whether a queue family of a physical device supports image presentation.
|
||||
func VulkanSupported() bool {
|
||||
return glfwbool(C.glfwVulkanSupported())
|
||||
}
|
57
vendor/github.com/go-gl/glfw/v3.2/glfw/window.c
generated
vendored
Normal file
57
vendor/github.com/go-gl/glfw/v3.2/glfw/window.c
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
#include "_cgo_export.h"
|
||||
|
||||
void glfwWindowPosCB(GLFWwindow* window, int xpos, int ypos) {
|
||||
goWindowPosCB(window, xpos, ypos);
|
||||
}
|
||||
|
||||
void glfwWindowSizeCB(GLFWwindow* window, int width, int height) {
|
||||
goWindowSizeCB(window, width, height);
|
||||
}
|
||||
|
||||
void glfwFramebufferSizeCB(GLFWwindow* window, int width, int height) {
|
||||
goFramebufferSizeCB(window, width, height);
|
||||
}
|
||||
|
||||
void glfwWindowCloseCB(GLFWwindow* window) {
|
||||
goWindowCloseCB(window);
|
||||
}
|
||||
|
||||
void glfwWindowRefreshCB(GLFWwindow* window) {
|
||||
goWindowRefreshCB(window);
|
||||
}
|
||||
|
||||
void glfwWindowFocusCB(GLFWwindow* window, int focused) {
|
||||
goWindowFocusCB(window, focused);
|
||||
}
|
||||
|
||||
void glfwWindowIconifyCB(GLFWwindow* window, int iconified) {
|
||||
goWindowIconifyCB(window, iconified);
|
||||
}
|
||||
|
||||
void glfwSetWindowPosCallbackCB(GLFWwindow* window) {
|
||||
glfwSetWindowPosCallback(window, glfwWindowPosCB);
|
||||
}
|
||||
|
||||
void glfwSetWindowSizeCallbackCB(GLFWwindow* window) {
|
||||
glfwSetWindowSizeCallback(window, glfwWindowSizeCB);
|
||||
}
|
||||
|
||||
void glfwSetFramebufferSizeCallbackCB(GLFWwindow* window) {
|
||||
glfwSetFramebufferSizeCallback(window, glfwFramebufferSizeCB);
|
||||
}
|
||||
|
||||
void glfwSetWindowCloseCallbackCB(GLFWwindow* window) {
|
||||
glfwSetWindowCloseCallback(window, glfwWindowCloseCB);
|
||||
}
|
||||
|
||||
void glfwSetWindowRefreshCallbackCB(GLFWwindow* window) {
|
||||
glfwSetWindowRefreshCallback(window, glfwWindowRefreshCB);
|
||||
}
|
||||
|
||||
void glfwSetWindowFocusCallbackCB(GLFWwindow* window) {
|
||||
glfwSetWindowFocusCallback(window, glfwWindowFocusCB);
|
||||
}
|
||||
|
||||
void glfwSetWindowIconifyCallbackCB(GLFWwindow* window) {
|
||||
glfwSetWindowIconifyCallback(window, glfwWindowIconifyCB);
|
||||
}
|
830
vendor/github.com/go-gl/glfw/v3.2/glfw/window.go
generated
vendored
Normal file
830
vendor/github.com/go-gl/glfw/v3.2/glfw/window.go
generated
vendored
Normal file
@@ -0,0 +1,830 @@
|
||||
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);
|
||||
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 corresponds to hints that can be set before creating a window.
|
||||
//
|
||||
// Hint also corresponds to the attributes of the window that can be get after
|
||||
// its creation.
|
||||
type Hint int
|
||||
|
||||
// Window related hints.
|
||||
const (
|
||||
Focused Hint = C.GLFW_FOCUSED // Specifies whether the window will be given input focus when created. This hint is ignored for full screen and initially hidden windows.
|
||||
Iconified Hint = C.GLFW_ICONIFIED // Specifies whether the window will be minimized.
|
||||
Maximized Hint = C.GLFW_MAXIMIZED // Specifies whether the window is maximized.
|
||||
Visible Hint = C.GLFW_VISIBLE // Specifies whether the window will be initially visible.
|
||||
Resizable Hint = C.GLFW_RESIZABLE // Specifies whether the window will be resizable by the user.
|
||||
Decorated Hint = C.GLFW_DECORATED // Specifies whether the window will have window decorations such as a border, a close widget, etc.
|
||||
Floating Hint = C.GLFW_FLOATING // Specifies whether the window will be always-on-top.
|
||||
AutoIconify Hint = C.GLFW_AUTO_ICONIFY // Specifies whether fullscreen windows automatically iconify (and restore the previous video mode) on focus loss.
|
||||
)
|
||||
|
||||
// Context related hints.
|
||||
const (
|
||||
ClientAPI Hint = C.GLFW_CLIENT_API // Specifies which client API to create the context for. Hard constraint.
|
||||
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 client API version that the created context must be compatible with.
|
||||
ContextRobustness Hint = C.GLFW_CONTEXT_ROBUSTNESS // Specifies the robustness strategy to be used by the context.
|
||||
ContextReleaseBehavior Hint = C.GLFW_CONTEXT_RELEASE_BEHAVIOR // Specifies the release behavior to be used by the context.
|
||||
OpenGLForwardCompatible Hint = C.GLFW_OPENGL_FORWARD_COMPAT // Specifies whether the OpenGL context should be forward-compatible. Hard constraint.
|
||||
OpenGLDebugContext Hint = C.GLFW_OPENGL_DEBUG_CONTEXT // 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.
|
||||
OpenGLProfile Hint = C.GLFW_OPENGL_PROFILE // Specifies which OpenGL profile to create the context for. Hard constraint.
|
||||
ContextCreationAPI Hint = C.GLFW_CONTEXT_CREATION_API // Specifies which context creation API to use to create the context.
|
||||
)
|
||||
|
||||
// Framebuffer related hints.
|
||||
const (
|
||||
ContextRevision Hint = C.GLFW_CONTEXT_REVISION
|
||||
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 default framebuffer.
|
||||
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 bit depth of the accumulation buffer.
|
||||
AuxBuffers Hint = C.GLFW_AUX_BUFFERS // Specifies the desired number of auxiliary buffers.
|
||||
Stereo Hint = C.GLFW_STEREO // Specifies whether to use stereoscopic rendering. Hard constraint.
|
||||
Samples Hint = C.GLFW_SAMPLES // Specifies the desired number of samples to use for multisampling. Zero disables multisampling.
|
||||
SRGBCapable Hint = C.GLFW_SRGB_CAPABLE // Specifies whether the framebuffer should be sRGB capable.
|
||||
RefreshRate Hint = C.GLFW_REFRESH_RATE // 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.
|
||||
DoubleBuffer Hint = C.GLFW_DOUBLEBUFFER // Specifies whether the framebuffer should be double buffered. You nearly always want to use double buffering. This is a hard constraint.
|
||||
)
|
||||
|
||||
// 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
|
||||
)
|
||||
|
||||
// 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
|
||||
)
|
||||
|
||||
// Window represents a window.
|
||||
type Window struct {
|
||||
data *C.GLFWwindow
|
||||
|
||||
// Window.
|
||||
fPosHolder func(w *Window, xpos int, ypos int)
|
||||
fSizeHolder func(w *Window, width int, height int)
|
||||
fFramebufferSizeHolder func(w *Window, width int, height int)
|
||||
fCloseHolder func(w *Window)
|
||||
fRefreshHolder func(w *Window)
|
||||
fFocusHolder func(w *Window, focused bool)
|
||||
fIconifyHolder func(w *Window, iconified bool)
|
||||
|
||||
// Input.
|
||||
fMouseButtonHolder func(w *Window, button MouseButton, action Action, mod ModifierKey)
|
||||
fCursorPosHolder func(w *Window, xpos float64, ypos float64)
|
||||
fCursorEnterHolder func(w *Window, entered bool)
|
||||
fScrollHolder func(w *Window, xoff float64, yoff float64)
|
||||
fKeyHolder func(w *Window, key Key, scancode int, action Action, mods ModifierKey)
|
||||
fCharHolder func(w *Window, char rune)
|
||||
fCharModsHolder func(w *Window, char rune, mods ModifierKey)
|
||||
fDropHolder func(w *Window, names []string)
|
||||
}
|
||||
|
||||
// GLFWWindow returns a *C.GLFWwindow reference (i.e. the GLFW window itself). This can be used for
|
||||
// passing the GLFW window handle to external C libraries.
|
||||
func (w *Window) GLFWWindow() uintptr {
|
||||
return uintptr(unsafe.Pointer(w.data))
|
||||
}
|
||||
|
||||
//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 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))
|
||||
isFocused := glfwbool(focused)
|
||||
w.fFocusHolder(w, isFocused)
|
||||
}
|
||||
|
||||
//export goWindowIconifyCB
|
||||
func goWindowIconifyCB(window unsafe.Pointer, iconified C.int) {
|
||||
isIconified := glfwbool(iconified)
|
||||
w := windows.get((*C.GLFWwindow)(window))
|
||||
w.fIconifyHolder(w, isIconified)
|
||||
}
|
||||
|
||||
// DefaultWindowHints resets all window hints to their default values.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func DefaultWindowHints() {
|
||||
C.glfwDefaultWindowHints()
|
||||
panicError()
|
||||
}
|
||||
|
||||
// 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.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func WindowHint(target Hint, hint int) {
|
||||
C.glfwWindowHint(C.int(target), C.int(hint))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// CreateWindow creates a window and its associated context. Most of the options
|
||||
// controlling how the window and its context should be created are specified
|
||||
// through Hint.
|
||||
//
|
||||
// Successful creation does not change which context is current. Before you can
|
||||
// use the newly created context, you need to make it current using
|
||||
// MakeContextCurrent.
|
||||
//
|
||||
// Note that the created window 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 retrieve the actual
|
||||
// attributes of the created window and context, use queries like
|
||||
// GetWindowAttrib and GetWindowSize.
|
||||
//
|
||||
// To create the window at a specific position, make it initially invisible using
|
||||
// the Visible window hint, set its position and then show it.
|
||||
//
|
||||
// If a fullscreen window is active, the screensaver is prohibited from starting.
|
||||
//
|
||||
// Windows: If the executable has an icon resource named GLFW_ICON, it will be
|
||||
// set as the icon for the window. If no such icon is present, the IDI_WINLOGO
|
||||
// icon will be used instead.
|
||||
//
|
||||
// Mac OS X: The GLFW window has no icon, as it is not a document window, but the
|
||||
// dock icon will be the same as the application bundle's icon. Also, the first
|
||||
// time a window is opened the menu bar is populated with common commands like
|
||||
// Hide, Quit and About. The (minimal) about dialog uses information from the
|
||||
// application's bundle. For more information on bundles, see the Bundle
|
||||
// Programming Guide provided by Apple.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func CreateWindow(width, height int, title string, monitor *Monitor, share *Window) (*Window, error) {
|
||||
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, acceptError(APIUnavailable, VersionUnavailable)
|
||||
}
|
||||
|
||||
wnd := &Window{data: w}
|
||||
windows.put(wnd)
|
||||
return wnd, nil
|
||||
}
|
||||
|
||||
// Destroy destroys the specified window and its context. On calling this
|
||||
// function, no further callbacks will be called for that window.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func (w *Window) Destroy() {
|
||||
windows.remove(w.data)
|
||||
C.glfwDestroyWindow(w.data)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// ShouldClose reports the value of the close flag of the specified window.
|
||||
func (w *Window) ShouldClose() bool {
|
||||
ret := glfwbool(C.glfwWindowShouldClose(w.data))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// 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.
|
||||
func (w *Window) SetShouldClose(value bool) {
|
||||
if !value {
|
||||
C.glfwSetWindowShouldClose(w.data, C.GL_FALSE)
|
||||
} else {
|
||||
C.glfwSetWindowShouldClose(w.data, C.GL_TRUE)
|
||||
}
|
||||
panicError()
|
||||
}
|
||||
|
||||
// SetTitle sets the window title, encoded as UTF-8, of the window.
|
||||
//
|
||||
// This function may 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)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// 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 image is ideally provided in the form of *image.NRGBA.
|
||||
// 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. If the image
|
||||
// type is not *image.NRGBA, it will be converted to it.
|
||||
//
|
||||
// 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.
|
||||
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()
|
||||
}
|
||||
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetPos returns the position, in screen coordinates, of the upper-left
|
||||
// corner of the client area of the window.
|
||||
func (w *Window) GetPos() (x, y int) {
|
||||
var xpos, ypos C.int
|
||||
C.glfwGetWindowPos(w.data, &xpos, &ypos)
|
||||
panicError()
|
||||
return int(xpos), int(ypos)
|
||||
}
|
||||
|
||||
// SetPos sets the position, in screen coordinates, of the upper-left corner
|
||||
// of the client area of the window.
|
||||
//
|
||||
// If it is a full screen window, this function does nothing.
|
||||
//
|
||||
// If you wish to set an initial window position you should create a hidden
|
||||
// window (using Hint and Visible), set its position and then show it.
|
||||
//
|
||||
// It is very rarely a good idea to move an already visible window, as it will
|
||||
// confuse and annoy the user.
|
||||
//
|
||||
// The window manager may put limits on what positions are allowed.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func (w *Window) SetPos(xpos, ypos int) {
|
||||
C.glfwSetWindowPos(w.data, C.int(xpos), C.int(ypos))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetSize returns the size, in screen coordinates, of the client area of the
|
||||
// specified window.
|
||||
func (w *Window) GetSize() (width, height int) {
|
||||
var wi, h C.int
|
||||
C.glfwGetWindowSize(w.data, &wi, &h)
|
||||
panicError()
|
||||
return int(wi), int(h)
|
||||
}
|
||||
|
||||
// SetSize sets the size, in screen coordinates, of the client area of the
|
||||
// window.
|
||||
//
|
||||
// For full screen windows, this function selects and switches to the resolution
|
||||
// closest to the specified size, without affecting the window's context. As the
|
||||
// context is unaffected, the bit depths of the framebuffer remain unchanged.
|
||||
//
|
||||
// The window manager may put limits on what window sizes are allowed.
|
||||
//
|
||||
// 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))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// SetSizeLimits sets the size limits of the client area of the specified window.
|
||||
// If the window is full screen or not resizable, this function does nothing.
|
||||
//
|
||||
// The size limits are applied immediately and may cause the window to be resized.
|
||||
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))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// SetAspectRatio sets the required aspect ratio of the client area of the specified window.
|
||||
// If the window is full screen or not resizable, this function does nothing.
|
||||
//
|
||||
// The aspect ratio is specified as a numerator and a denominator 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 glfw.DontCare then the aspect ratio limit is disabled.
|
||||
//
|
||||
// The aspect ratio is applied immediately and may cause the window to be resized.
|
||||
func (w *Window) SetAspectRatio(numer, denom int) {
|
||||
C.glfwSetWindowAspectRatio(w.data, C.int(numer), C.int(denom))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetFramebufferSize retrieves the size, in pixels, of the framebuffer of the
|
||||
// specified window.
|
||||
func (w *Window) GetFramebufferSize() (width, height int) {
|
||||
var wi, h C.int
|
||||
C.glfwGetFramebufferSize(w.data, &wi, &h)
|
||||
panicError()
|
||||
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.
|
||||
func (w *Window) GetFrameSize() (left, top, right, bottom int) {
|
||||
var l, t, r, b C.int
|
||||
C.glfwGetWindowFrameSize(w.data, &l, &t, &r, &b)
|
||||
panicError()
|
||||
return int(l), int(t), int(r), int(b)
|
||||
}
|
||||
|
||||
// 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 glfw.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.
|
||||
func (w *Window) Focus() error {
|
||||
C.glfwFocusWindow(w.data)
|
||||
return acceptError(APIUnavailable)
|
||||
}
|
||||
|
||||
// Iconify iconifies/minimizes the window, if it was previously restored. If it
|
||||
// is a full screen window, the original monitor resolution is restored until the
|
||||
// window is restored. If the window is already iconified, this function does
|
||||
// nothing.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func (w *Window) Iconify() error {
|
||||
C.glfwIconifyWindow(w.data)
|
||||
return acceptError(APIUnavailable)
|
||||
}
|
||||
|
||||
// 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.
|
||||
func (w *Window) Maximize() error {
|
||||
C.glfwMaximizeWindow(w.data)
|
||||
return acceptError(APIUnavailable)
|
||||
}
|
||||
|
||||
// Restore restores the window, if it was previously iconified/minimized. If it
|
||||
// is a full screen window, the resolution chosen for the window is restored on
|
||||
// the selected monitor. If the window is already restored, this function does
|
||||
// nothing.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func (w *Window) Restore() error {
|
||||
C.glfwRestoreWindow(w.data)
|
||||
return acceptError(APIUnavailable)
|
||||
}
|
||||
|
||||
// Show makes the 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)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// Hide hides the 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)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetMonitor returns the handle of the monitor that the window is in
|
||||
// fullscreen on.
|
||||
//
|
||||
// Returns nil if the window is in windowed mode.
|
||||
func (w *Window) GetMonitor() *Monitor {
|
||||
m := C.glfwGetWindowMonitor(w.data)
|
||||
panicError()
|
||||
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 window.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..
|
||||
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))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetAttrib returns an attribute of the window. There are many attributes,
|
||||
// some related to the window and others to its context.
|
||||
func (w *Window) GetAttrib(attrib Hint) int {
|
||||
ret := int(C.glfwGetWindowAttrib(w.data, C.int(attrib)))
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// SetUserPointer sets the user-defined pointer of the window. The current value
|
||||
// is retained until the window is destroyed. The initial value is nil.
|
||||
func (w *Window) SetUserPointer(pointer unsafe.Pointer) {
|
||||
C.glfwSetWindowUserPointer(w.data, pointer)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetUserPointer returns the current value of the user-defined pointer of the
|
||||
// window. The initial value is nil.
|
||||
func (w *Window) GetUserPointer() unsafe.Pointer {
|
||||
ret := C.glfwGetWindowUserPointer(w.data)
|
||||
panicError()
|
||||
return ret
|
||||
}
|
||||
|
||||
// PosCallback is the window position callback.
|
||||
type PosCallback func(w *Window, xpos int, ypos int)
|
||||
|
||||
// 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.
|
||||
func (w *Window) SetPosCallback(cbfun PosCallback) (previous PosCallback) {
|
||||
previous = w.fPosHolder
|
||||
w.fPosHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetWindowPosCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetWindowPosCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// SizeCallback is the window size callback.
|
||||
type SizeCallback func(w *Window, width int, height int)
|
||||
|
||||
// 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.
|
||||
func (w *Window) SetSizeCallback(cbfun SizeCallback) (previous SizeCallback) {
|
||||
previous = w.fSizeHolder
|
||||
w.fSizeHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetWindowSizeCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetWindowSizeCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// FramebufferSizeCallback is the framebuffer size callback.
|
||||
type FramebufferSizeCallback func(w *Window, width int, height int)
|
||||
|
||||
// SetFramebufferSizeCallback sets the framebuffer resize callback of the specified
|
||||
// window, which is called when the framebuffer of the specified window is resized.
|
||||
func (w *Window) SetFramebufferSizeCallback(cbfun FramebufferSizeCallback) (previous FramebufferSizeCallback) {
|
||||
previous = w.fFramebufferSizeHolder
|
||||
w.fFramebufferSizeHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetFramebufferSizeCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetFramebufferSizeCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// CloseCallback is the window close callback.
|
||||
type CloseCallback func(w *Window)
|
||||
|
||||
// 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.
|
||||
//
|
||||
// Mac OS X: Selecting Quit from the application menu will trigger the close
|
||||
// callback for all windows.
|
||||
func (w *Window) SetCloseCallback(cbfun CloseCallback) (previous CloseCallback) {
|
||||
previous = w.fCloseHolder
|
||||
w.fCloseHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetWindowCloseCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetWindowCloseCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// RefreshCallback is the window refresh callback.
|
||||
type RefreshCallback func(w *Window)
|
||||
|
||||
// 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.
|
||||
func (w *Window) SetRefreshCallback(cbfun RefreshCallback) (previous RefreshCallback) {
|
||||
previous = w.fRefreshHolder
|
||||
w.fRefreshHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetWindowRefreshCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetWindowRefreshCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// FocusCallback is the window focus callback.
|
||||
type FocusCallback func(w *Window, focused bool)
|
||||
|
||||
// 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.
|
||||
func (w *Window) SetFocusCallback(cbfun FocusCallback) (previous FocusCallback) {
|
||||
previous = w.fFocusHolder
|
||||
w.fFocusHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetWindowFocusCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetWindowFocusCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// IconifyCallback is the window iconification callback.
|
||||
type IconifyCallback func(w *Window, iconified bool)
|
||||
|
||||
// SetIconifyCallback sets the iconification callback of the window, which is
|
||||
// called when the window is iconified or restored.
|
||||
func (w *Window) SetIconifyCallback(cbfun IconifyCallback) (previous IconifyCallback) {
|
||||
previous = w.fIconifyHolder
|
||||
w.fIconifyHolder = cbfun
|
||||
if cbfun == nil {
|
||||
C.glfwSetWindowIconifyCallback(w.data, nil)
|
||||
} else {
|
||||
C.glfwSetWindowIconifyCallbackCB(w.data)
|
||||
}
|
||||
panicError()
|
||||
return previous
|
||||
}
|
||||
|
||||
// SetClipboardString sets the system clipboard to the specified UTF-8 encoded
|
||||
// string.
|
||||
//
|
||||
// This function may 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)
|
||||
panicError()
|
||||
}
|
||||
|
||||
// GetClipboardString returns the contents of the system clipboard, if it
|
||||
// contains or is convertible to a UTF-8 encoded string.
|
||||
//
|
||||
// This function may only be called from the main thread.
|
||||
func (w *Window) GetClipboardString() (string, error) {
|
||||
cs := C.glfwGetClipboardString(w.data)
|
||||
if cs == nil {
|
||||
return "", acceptError(FormatUnavailable)
|
||||
}
|
||||
return C.GoString(cs), nil
|
||||
}
|
||||
|
||||
// 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 may only be called from the main thread.
|
||||
func PollEvents() {
|
||||
C.glfwPollEvents()
|
||||
panicError()
|
||||
}
|
||||
|
||||
// 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 may only be called from the main thread.
|
||||
func WaitEvents() {
|
||||
C.glfwWaitEvents()
|
||||
panicError()
|
||||
}
|
||||
|
||||
// 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.
|
||||
func WaitEventsTimeout(timeout float64) {
|
||||
C.glfwWaitEventsTimeout(C.double(timeout))
|
||||
panicError()
|
||||
}
|
||||
|
||||
// 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 secondary threads.
|
||||
func PostEmptyEvent() {
|
||||
C.glfwPostEmptyEvent()
|
||||
panicError()
|
||||
}
|
Reference in New Issue
Block a user