| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- package glfw
- //#define GLFW_INCLUDE_NONE
- //#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
- }
- // PeripheralEvent corresponds to a peripheral(Monitor or Joystick)
- // configuration event.
- type PeripheralEvent 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.
- }
- // PeripheralEvent events.
- const (
- Connected PeripheralEvent = C.GLFW_CONNECTED
- Disconnected PeripheralEvent = 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 PeripheralEvent)
- //export goMonitorCB
- func goMonitorCB(monitor unsafe.Pointer, event C.int) {
- fMonitorHolder(&Monitor{(*C.GLFWmonitor)(monitor)}, PeripheralEvent(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)
- }
- // GetWorkarea returns the position, in screen coordinates, of the upper-left
- // corner of the work area of the specified monitor along with the work area
- // size in screen coordinates. The work area is defined as the area of the
- // monitor not occluded by the operating system task bar where present. If no
- // task bar exists then the work area is the monitor resolution in screen
- // coordinates.
- //
- // This function must only be called from the main thread.
- func (m *Monitor) GetWorkarea() (x, y, width, height int) {
- var cX, cY, cWidth, cHeight C.int
- C.glfwGetMonitorWorkarea(m.data, &cX, &cY, &cWidth, &cHeight)
- x, y, width, height = int(cX), int(cY), int(cWidth), int(cHeight)
- return
- }
- // GetContentScale function retrieves the content scale for the specified monitor.
- // The content scale is the ratio between the current DPI and the platform's
- // default DPI. If you scale all pixel dimensions by this scale then your content
- // should appear at an appropriate size. This is especially important for text
- // and any UI elements.
- //
- // This function must only be called from the main thread.
- func (m *Monitor) GetContentScale() (float32, float32) {
- var x, y C.float
- C.glfwGetMonitorContentScale(m.data, &x, &y)
- return float32(x), float32(y)
- }
- // SetUserPointer sets the user-defined pointer of the monitor. The current value
- // is retained until the monitor is disconnected. The initial value is nil.
- //
- // This function may be called from the monitor callback, even for a monitor
- // that is being disconnected.
- //
- // This function may be called from any thread. Access is not synchronized.
- func (m *Monitor) SetUserPointer(pointer unsafe.Pointer) {
- C.glfwSetMonitorUserPointer(m.data, pointer)
- }
- // GetUserPointer returns the current value of the user-defined pointer of the
- // monitor. The initial value is nil.
- //
- // This function may be called from the monitor callback, even for a monitor
- // that is being disconnected.
- //
- // This function may be called from any thread. Access is not synchronized.
- func (m *Monitor) GetUserPointer() unsafe.Pointer {
- return C.glfwGetMonitorUserPointer(m.data)
- }
- // 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)
- }
- // MonitorCallback is the signature for monitor configuration callback
- // functions.
- type MonitorCallback func(monitor *Monitor, event PeripheralEvent)
- // 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.
- //
- // This function must only be called from the main thread.
- func SetMonitorCallback(cbfun MonitorCallback) MonitorCallback {
- previous := fMonitorHolder
- fMonitorHolder = cbfun
- if cbfun == nil {
- C.glfwSetMonitorCallback(nil)
- } else {
- C.glfwSetMonitorCallbackCB()
- }
- return previous
- }
- // 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()
- }
|