mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
bed7440ebb
added getexepath() to os module added some wrapper functions to glfw removed hardcored path in gg module better tetris example exit and resource loading
317 lines
6.1 KiB
Go
317 lines
6.1 KiB
Go
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
|
|
// Use of this source code is governed by an MIT license
|
|
// that can be found in the LICENSE file.
|
|
|
|
module glfw
|
|
|
|
// Debugging a custom build
|
|
#flag darwin -L/var/tmp/glfw/src/
|
|
#flag darwin -lglfw
|
|
#flag linux -lglfw
|
|
#flag windows -I/usr/local/Cellar/glfw/3.2.1/include/
|
|
// #include <glad/glad.h> // !gen.go include GLFW.v
|
|
#include <GLFW/glfw3.h>
|
|
// #flag darwin -framework Carbon
|
|
// #flag darwin -framework Cocoa
|
|
// #flag darwin -framework CoreVideo
|
|
// #flag darwin -framework IOKit
|
|
// struct C.GL
|
|
// @GLFWwindow* C.glfwCreateWindow
|
|
// #int gconst_init = 0;
|
|
const (
|
|
RESIZABLE = 1
|
|
DECORATED = 2
|
|
)
|
|
|
|
import const (
|
|
GLFW_RESIZABLE
|
|
GLFW_DECORATED
|
|
)
|
|
|
|
import const (
|
|
GLFW_KEY_ENTER
|
|
GLFW_KEY_A
|
|
GLFW_KEY_B
|
|
GLFW_KEY_P
|
|
GLFW_KEY_F
|
|
GLFW_KEY_M
|
|
GLFW_KEY_L
|
|
GLFW_KEY_V
|
|
GLFW_KEY_R
|
|
GLFW_KEY_D
|
|
GLFW_KEY_7
|
|
GLFW_KEY_Z
|
|
GLFW_KEY_UP
|
|
GLFW_KEY_DOWN
|
|
GLFW_KEY_UP
|
|
GLFW_KEY_LEFT
|
|
GLFW_KEY_RIGHT
|
|
GLFW_KEY_BACKSPACE
|
|
GLFW_KEY_ENTER
|
|
GLFW_KEY_ESCAPE
|
|
GLFW_KEY_N
|
|
GLFW_KEY_PERIOD
|
|
GLFW_KEY_SLASH
|
|
GLFW_KEY_F5
|
|
GLFW_KEY_F6
|
|
GLFW_KEY_MINUS
|
|
GLFW_KEY_EQUAL
|
|
GLFW_KEY_C
|
|
GLFW_KEY_G
|
|
GLFW_KEY_I
|
|
GLFW_KEY_J
|
|
GLFW_KEY_E
|
|
GLFW_KEY_K
|
|
GLFW_KEY_O
|
|
GLFW_KEY_T
|
|
GLFW_KEY_H
|
|
GLFW_KEY_L
|
|
GLFW_KEY_N
|
|
GLFW_KEY_U
|
|
GLFW_KEY_X
|
|
GLFW_KEY_W
|
|
GLFW_KEY_Y
|
|
GLFW_KEY_Q
|
|
GLFW_KEY_RIGHT_BRACKET
|
|
GLFW_KEY_LEFT_BRACKET
|
|
GLFW_KEY_8
|
|
GLFW_KEY_TAB
|
|
GLFW_KEY_COMMA
|
|
GLFW_KEY_QUESTION
|
|
)
|
|
|
|
const (
|
|
KEY_ESCAPE = 256
|
|
KEY_LEFT_SUPER = 343
|
|
)
|
|
|
|
const (
|
|
KeyUp = 265
|
|
KeyLeft = 263
|
|
KeyRight = 262
|
|
KeyDown = 264
|
|
)
|
|
|
|
// TODO COPY PASTA
|
|
struct WinCfg {
|
|
width int
|
|
height int
|
|
title string
|
|
ptr voidptr
|
|
borderless bool
|
|
is_modal int
|
|
is_browser bool
|
|
url string
|
|
}
|
|
|
|
// data *C.GLFWwindow
|
|
// TODO change data to cobj
|
|
struct Window {
|
|
data voidptr
|
|
title string
|
|
mx int
|
|
my int
|
|
}
|
|
|
|
struct Size {
|
|
pub:
|
|
width int
|
|
height int
|
|
}
|
|
|
|
struct Pos {
|
|
x int
|
|
y int
|
|
}
|
|
|
|
// type clickpub fn pub fn (window * GLFWwindow, button, action, mods int)
|
|
type clickpubfn fn (window voidptr, button, action, mods int)
|
|
|
|
pub fn init() {
|
|
C.glfwInit()
|
|
# glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
# glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
|
# glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
|
# glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
}
|
|
|
|
pub fn (w &Window) destroy() {
|
|
C.glfwDestroyWindow(w.data)
|
|
}
|
|
|
|
pub fn terminate() {
|
|
C.glfwTerminate()
|
|
}
|
|
|
|
// pub fn mouse_move(w * GLFWwindow, x, y double) {
|
|
pub fn mouse_move(w voidptr, x, y f64) {
|
|
// #printf("%f : %f => %d \n", x,y);
|
|
}
|
|
|
|
// pub fn create_window(title string, w, h int) * Window {
|
|
pub fn window_hint(key, val int) {
|
|
C.glfwWindowHint(key, val)
|
|
}
|
|
|
|
pub fn create_window(c WinCfg) *Window {
|
|
// TODO why i need this in stdlib? extern?
|
|
// # if (!gconst_init) { init_consts(); gconst_init = 1; }
|
|
// ChatsRepo
|
|
if c.borderless {
|
|
window_hint(GLFW_RESIZABLE, 0)
|
|
window_hint(GLFW_DECORATED, 0)
|
|
}
|
|
cwindow := C.glfwCreateWindow(c.width, c.height, c.title.str, 0, 0)
|
|
# if (!cwindow)
|
|
// if cwindow == 0
|
|
{
|
|
println('failed to credate glfw window')
|
|
C.glfwTerminate()
|
|
}
|
|
// # glfwSetCursorPosCallback(cwindow, glfw__mouse_move) ;
|
|
// C.glfwSetCursorPosCallback(cwindow, mouse_move)
|
|
C.printf('create window wnd=%p ptr==%p\n', cwindow, c.ptr)
|
|
C.glfwSetWindowUserPointer(cwindow, c.ptr)
|
|
// # void *a =glfwGetWindowUserPointer(cwindow);
|
|
// # printf("aaaaaa=%p d=%d\n", a,a);
|
|
window := &Window {
|
|
data: cwindow,
|
|
title: c.title,
|
|
}
|
|
// user_ptr: ptr,
|
|
// repo: repo,
|
|
// for !C.glfwWindowShouldClose(cwindow) {
|
|
// C.glfwPollEvents()
|
|
// wait_events()
|
|
// }
|
|
// C.glfwTerminate()
|
|
return window
|
|
}
|
|
|
|
pub fn (w &Window) set_title(title string) {
|
|
C.glfwSetWindowTitle(w.data, title.str)
|
|
}
|
|
|
|
pub fn (w &Window) make_context_current() {
|
|
// ChatsRepo
|
|
kkk := 0
|
|
// println('making context current' )
|
|
C.glfwMakeContextCurrent(w.data)
|
|
}
|
|
|
|
pub fn swap_interval(interval int) {
|
|
C.glfwSwapInterval(interval)
|
|
}
|
|
|
|
pub fn wait_events() {
|
|
C.glfwWaitEvents()
|
|
}
|
|
|
|
pub fn poll_events() {
|
|
C.glfwPollEvents()
|
|
}
|
|
|
|
pub fn set_should_close(w voidptr, close bool) {
|
|
C.glfwSetWindowShouldClose(w, close)
|
|
}
|
|
|
|
pub fn (w &Window) should_close() bool {
|
|
// ChatsRepo
|
|
return C.glfwWindowShouldClose(w.data)
|
|
}
|
|
|
|
pub fn (w &Window) swap_buffers() {
|
|
C.glfwSwapBuffers(w.data)
|
|
}
|
|
|
|
pub fn (w mut Window) onmousemove(cb voidptr) {
|
|
C.glfwSetCursorPosCallback(w.data, cb)
|
|
}
|
|
|
|
pub fn (w mut Window) set_mouse_button_callback(cb voidptr) {
|
|
C.glfwSetMouseButtonCallback(w.data, cb)
|
|
}
|
|
|
|
pub fn (w mut Window) on_click(cb voidptr) {
|
|
C.glfwSetMouseButtonCallback(w.data, cb)
|
|
}
|
|
|
|
pub fn (w &Window) set_scroll_callback(cb voidptr) {
|
|
C.glfwSetScrollCallback(w.data, cb)
|
|
}
|
|
|
|
pub fn (w &Window) on_scroll(cb voidptr) {
|
|
C.glfwSetScrollCallback(w.data, cb)
|
|
}
|
|
|
|
pub fn post_empty_event() {
|
|
C.glfwPostEmptyEvent()
|
|
}
|
|
|
|
pub fn (w mut Window) onkeydown(cb voidptr) {
|
|
C.glfwSetKeyCallback(w.data, cb)
|
|
}
|
|
|
|
pub fn (w mut Window) onchar(cb voidptr) {
|
|
C.glfwSetCharModsCallback(w.data, cb)
|
|
}
|
|
|
|
pub fn get_time() f64 {
|
|
return C.glfwGetTime()
|
|
}
|
|
|
|
pub fn key_pressed(wnd voidptr, key int) bool {
|
|
# return glfwGetKey(wnd, key) == GLFW_PRESS;
|
|
return false
|
|
}
|
|
|
|
// TODO not mut
|
|
pub fn (w mut Window) get_clipboard_text() string {
|
|
return string(byteptr(C.glfwGetClipboardString(w.data)))
|
|
}
|
|
|
|
pub fn (w &Window) set_clipboard_text(s string) {
|
|
C.glfwSetClipboardString(w.data, s.str)
|
|
}
|
|
|
|
pub fn (w &Window) get_cursor_pos() Pos {
|
|
x := f64(0)
|
|
y := f64(0)
|
|
C.glfwGetCursorPos(w.data, &x, &y)
|
|
return Pos {
|
|
x: int(x)
|
|
y: int(y)
|
|
}
|
|
}
|
|
|
|
pub fn (w &Window) user_ptr() voidptr {
|
|
return C.glfwGetWindowUserPointer(w.data)
|
|
}
|
|
|
|
pub fn (w &Window) set_user_ptr(ptr voidptr) {
|
|
C.glfwSetWindowUserPointer(w.data, ptr)
|
|
}
|
|
|
|
pub fn C.glfwGetVideoMode() C.GLFWvideoMode
|
|
|
|
pub fn get_monitor_size() Size {
|
|
# GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor());
|
|
// window_width = mode->width;
|
|
// window_height = mode->height;
|
|
// monitor := C.glfwGetPrimaryMonitor()
|
|
res := Size{}
|
|
# res.width=mode->width;
|
|
# res.height=mode->height;
|
|
// C.glfwGetMonitorPhysicalSize(monitor, &res.width, &res.height)
|
|
return res
|
|
}
|
|
|
|
pub fn (size Size) str() string {
|
|
return '{$size.width, $size.height}'
|
|
}
|
|
|
|
pub fn get_window_user_pointer(gwnd voidptr) voidptr {
|
|
return C.glfwGetWindowUserPointer(gwnd)
|
|
}
|
|
|