From 8990eb06ec4a9f4b3a2771cc39e25f711131859e Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Fri, 2 Aug 2019 11:33:49 +0200 Subject: [PATCH] Revert "remove vlib/glfw (it's a vpm module now)" This reverts commit cdfc4c83725a171c87227d49b3aa7975169036ec. --- vlib/glfw/glfw.v | 313 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 vlib/glfw/glfw.v diff --git a/vlib/glfw/glfw.v b/vlib/glfw/glfw.v new file mode 100644 index 0000000000..0598fdb293 --- /dev/null +++ b/vlib/glfw/glfw.v @@ -0,0 +1,313 @@ +// 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 + +import gl + +#flag -I @VROOT/thirdparty/glfw +#flag -L @VROOT/thirdparty/glfw + +// Debugging a custom build +//-#flag darwin -L/var/tmp/glfw/src/ + +// MacPorts +#flag darwin -L/opt/local/lib + +#flag darwin -lglfw +#flag linux -lglfw +#flag windows -lglfw3 +#include +// #flag darwin -framework Carbon +// #flag darwin -framework Cocoa +// #flag darwin -framework CoreVideo +// #flag darwin -framework IOKit +const ( + RESIZABLE = 1 + DECORATED = 2 +) + +import const ( + GLFW_RESIZABLE + GLFW_DECORATED + GLFW_FLOATING +) + +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 + always_on_top bool +} + +// 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 window_hint(key, val int) { + C.glfwWindowHint(key, val) +} + +pub fn create_window(c WinCfg) *Window { + if c.borderless { + window_hint(GLFW_RESIZABLE, 0) + window_hint(GLFW_DECORATED, 0) + } + if c.always_on_top { + window_hint(GLFW_FLOATING, 1) + } + cwindow := C.glfwCreateWindow(c.width, c.height, c.title.str, 0, 0) + if isnil(cwindow) { + println('failed to create 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, + } + 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) +} +