diff --git a/dep/lglw/lglw_stub.c b/dep/lglw/lglw_stub.c new file mode 100644 index 00000000..bb7974ac --- /dev/null +++ b/dep/lglw/lglw_stub.c @@ -0,0 +1,810 @@ +/* ---- + * ---- file : lglw_linux.c (**stub**) + * ---- author : bsp + * ---- legal : Distributed under terms of the MIT LICENSE (MIT). + * ---- + * ---- Permission is hereby granted, free of charge, to any person obtaining a copy + * ---- of this software and associated documentation files (the "Software"), to deal + * ---- in the Software without restriction, including without limitation the rights + * ---- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * ---- copies of the Software, and to permit persons to whom the Software is + * ---- furnished to do so, subject to the following conditions: + * ---- + * ---- The above copyright notice and this permission notice shall be included in + * ---- all copies or substantial portions of the Software. + * ---- + * ---- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * ---- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * ---- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * ---- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * ---- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * ---- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * ---- THE SOFTWARE. + * ---- + * ---- info : This is part of the "lglw" package. + * ---- + * ---- created: 04Aug2018 + * ---- changed: 05Aug2018, 06Aug2018, 07Aug2018, 08Aug2018, 09Aug2018, 18Aug2018, 10Oct2018 + * ---- + * ---- + */ + +#include "lglw.h" + +#include +#include +#include + +#define Dprintf if(0);else printf +// #define Dprintf if(1);else printf + +// ---------------------------------------------------------------------------- macros and defines +#define LGLW(a) lglw_int_t *lglw = ((lglw_int_t*)(a)) + +#define LGLW_DEFAULT_HIDDEN_W (800) +#define LGLW_DEFAULT_HIDDEN_H (600) + +#define LGLW_MOUSE_TOUCH_LMB_TIMEOUT (250u) +#define LGLW_MOUSE_TOUCH_RMB_TIMEOUT (500u) +#define LGLW_MOUSE_TOUCH_RMB_STATE_IDLE (0u) +#define LGLW_MOUSE_TOUCH_RMB_STATE_LMB (1u) +#define LGLW_MOUSE_TOUCH_RMB_STATE_WAIT (2u) +#define LGLW_MOUSE_TOUCH_RMB_STATE_RMB (3u) +#define LGLW_MOUSE_TOUCH_RMB_MOVE_THRESHOLD (7u) + +#define sABS(x) (((x)>0)?(x):-(x)) + + +// ---------------------------------------------------------------------------- structs and typedefs +typedef struct lglw_int_s { + void *user_data; // arbitrary user data + + struct { + lglw_vec2i_t size; + } hidden; + + struct { + lglw_vec2i_t size; + int32_t swap_interval; + } win; + + struct { + } prev; + + struct { + uint32_t kmod_state; // See LGLW_KMOD_xxx + lglw_keyboard_fxn_t cbk; + } keyboard; + + struct { + lglw_vec2i_t p; // last seen mouse position + uint32_t button_state; + lglw_mouse_fxn_t cbk; + struct { + uint32_t mode; + lglw_vec2i_t p; // grab-start mouse position + lglw_bool_t b_queue_warp; + lglw_vec2i_t last_p; + } grab; + struct { + lglw_bool_t b_enable; + lglw_bool_t b_update_queued; + lglw_bool_t b_syn_rmb; + uint32_t syn_rmb_hold_state; // see LGLW_MOUSE_TOUCH_RMB_STATE_xxx + uint32_t hold_start_ms; + lglw_vec2i_t hold_start_p; + } touch; + } mouse; + + struct { + uint32_t state; + lglw_focus_fxn_t cbk; + } focus; + + struct { + lglw_bool_t b_running; + lglw_timer_fxn_t cbk; + } timer; + + struct { + lglw_dropfiles_fxn_t cbk; + } dropfiles; + + struct { + lglw_redraw_fxn_t cbk; + } redraw; + +} lglw_int_t; + + +// ---------------------------------------------------------------------------- module fxn fwd decls +static lglw_bool_t loc_create_hidden_window (lglw_int_t *lglw, int32_t _w, int32_t _h); +static void loc_destroy_hidden_window(lglw_int_t *lglw); + +static void loc_key_hook(lglw_int_t *lglw); +static void loc_key_unhook(lglw_int_t *lglw); +static lglw_bool_t loc_handle_key (lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _vkey); +// static lglw_bool_t loc_touchkeyboard_get_rect (RECT *rect); +// static lglw_bool_t loc_touchkeyboard_is_visible (void); +extern lglw_bool_t lglw_int_touchkeyboard_toggle (void); + +static void loc_handle_mouseleave (lglw_int_t *lglw); +static void loc_handle_mouseenter (lglw_int_t *lglw); +static void loc_handle_mousebutton (lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _button); +static void loc_handle_mousemotion (lglw_int_t *lglw); +static void loc_handle_queued_mouse_warp (lglw_int_t *lglw); +static void loc_touchinput_update (lglw_int_t *lglw); + +static void loc_enable_dropfiles (lglw_int_t *lglw, lglw_bool_t _bEnable); + + +// ---------------------------------------------------------------------------- module vars +static lglw_int_t *khook_lglw = NULL; // currently key-hooked lglw instance (one at a time) + + +// ---------------------------------------------------------------------------- lglw_init +lglw_t lglw_init(int32_t _w, int32_t _h) { + lglw_int_t *lglw = malloc(sizeof(lglw_int_t)); + + if(NULL != lglw) + { + memset(lglw, 0, sizeof(lglw_int_t)); + + if(_w <= 16) + _w = LGLW_DEFAULT_HIDDEN_W; + + if(_h <= 16) + _h = LGLW_DEFAULT_HIDDEN_H; + + if(!loc_create_hidden_window(lglw, _w, _h)) + { + free(lglw); + lglw = NULL; + } + } + + return lglw; +} + + +// ---------------------------------------------------------------------------- lglw_exit +void lglw_exit(lglw_t _lglw) { + LGLW(_lglw); + + if(NULL != lglw) + { + loc_destroy_hidden_window(lglw); + + free(lglw); + } +} + + +// ---------------------------------------------------------------------------- lglw_userdata_set +void lglw_userdata_set(lglw_t _lglw, void *_userData) { + LGLW(_lglw); + + if(NULL != lglw) + { + lglw->user_data = _userData; + } +} + +// ---------------------------------------------------------------------------- lglw_userdata_get +void *lglw_userdata_get(lglw_t _lglw) { + LGLW(_lglw); + + if(NULL != lglw) + { + return lglw->user_data; + } + + return NULL; +} + + +// ---------------------------------------------------------------------------- loc_create_hidden_window +static lglw_bool_t loc_create_hidden_window(lglw_int_t *lglw, int32_t _w, int32_t _h) { + + // (todo) implement me + + lglw->hidden.size.x = _w; + lglw->hidden.size.y = _h; + + return LGLW_FALSE; +} + + +// ---------------------------------------------------------------------------- loc_destroy_hidden_window +static void loc_destroy_hidden_window(lglw_int_t *lglw) { + // (todo) implement me +} + + +// ---------------------------------------------------------------------------- lglw_window_open +lglw_bool_t lglw_window_open (lglw_t _lglw, void *_parentHWNDOrNull, int32_t _x, int32_t _y, int32_t _w, int32_t _h) { + lglw_bool_t r = LGLW_FALSE; + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + if(_w <= 16) + _w = lglw->hidden.size.x; + + if(_h <= 16) + _h = lglw->hidden.size.y; + + lglw->win.size.x = _w; + lglw->win.size.y = _h; + + loc_enable_dropfiles(lglw, (NULL != lglw->dropfiles.cbk)); + } + return r; +} + + +// ---------------------------------------------------------------------------- lglw_window_resize +lglw_bool_t lglw_window_resize (lglw_t _lglw, int32_t _w, int32_t _h) { + lglw_bool_t r = LGLW_FALSE; + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } + + return r; +} + + +// ---------------------------------------------------------------------------- lglw_window_close +void lglw_window_close (lglw_t _lglw) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + // if(NULL != lglw->win.hwnd) + { + lglw_timer_stop(_lglw); + + loc_key_unhook(lglw); + } + } +} + + +// ---------------------------------------------------------------------------- lglw_window_show +void lglw_window_show(lglw_t _lglw) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_window_hide +void lglw_window_hide(lglw_t _lglw) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_window_is_visible +lglw_bool_t lglw_window_is_visible(lglw_t _lglw) { + lglw_bool_t r = LGLW_FALSE; + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } + + return r; +} + + +// ---------------------------------------------------------------------------- lglw_window_size_get +void lglw_window_size_get(lglw_t _lglw, int32_t *_retX, int32_t *_retY) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_redraw +void lglw_redraw(lglw_t _lglw) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_redraw_callback_set +void lglw_redraw_callback_set(lglw_t _lglw, lglw_redraw_fxn_t _cbk) { + LGLW(_lglw); + + if(NULL != lglw) + { + lglw->redraw.cbk = _cbk; + } +} + + +// ---------------------------------------------------------------------------- lglw_glcontext_push +void lglw_glcontext_push(lglw_t _lglw) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_glcontext_pop +void lglw_glcontext_pop(lglw_t _lglw) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_swap_buffers +void lglw_swap_buffers(lglw_t _lglw) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_swap_interval_set +void lglw_swap_interval_set(lglw_t _lglw, int32_t _ival) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_swap_interval_get +int32_t lglw_swap_interval_get(lglw_t _lglw) { + LGLW(_lglw); + int32_t r = 0; + + if(NULL != lglw) + { + r = lglw->win.swap_interval; + } + + return r; +} + + +// ---------------------------------------------------------------------------- loc_key_hook +static void loc_key_hook(lglw_int_t *lglw) { + loc_key_unhook(lglw); + + // (todo) implement me + + khook_lglw = lglw; +} + + +// ---------------------------------------------------------------------------- loc_key_unhook +static void loc_key_unhook(lglw_int_t *lglw) { + + // (todo) implement me + if(khook_lglw == lglw) + khook_lglw = NULL; +} + + +// ---------------------------------------------------------------------------- loc_handle_mouseleave +static void loc_handle_mouseleave(lglw_int_t *lglw) { + loc_key_unhook(lglw); + + lglw->focus.state &= ~LGLW_FOCUS_MOUSE; + + if(NULL != lglw->focus.cbk) + { + lglw->focus.cbk(lglw, lglw->focus.state, LGLW_FOCUS_MOUSE); + } + + Dprintf("xxx lglw:loc_handle_mouseleave: LEAVE\n"); +} + + +// ---------------------------------------------------------------------------- loc_handle_mouseenter +static void loc_handle_mouseenter(lglw_int_t *lglw) { + + loc_key_hook(lglw); + + lglw->focus.state |= LGLW_FOCUS_MOUSE; + + if(NULL != lglw->focus.cbk) + { + lglw->focus.cbk(lglw, lglw->focus.state, LGLW_FOCUS_MOUSE); + } + + Dprintf("xxx lglw:loc_handle_mouseenter: LEAVE\n"); +} + + +// ---------------------------------------------------------------------------- loc_handle_mousebutton +static void loc_handle_mousebutton(lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _button) { + if(_bPressed) + lglw->mouse.button_state |= _button; + else + lglw->mouse.button_state &= ~_button; + + if(NULL != lglw->mouse.cbk) + { + lglw->mouse.cbk(lglw, lglw->mouse.p.x, lglw->mouse.p.y, lglw->mouse.button_state, _button); + } +} + + +// ---------------------------------------------------------------------------- loc_handle_mousemotion +static void loc_handle_mousemotion(lglw_int_t *lglw) { + + if(NULL != lglw->mouse.cbk) + { + lglw->mouse.cbk(lglw, lglw->mouse.p.x, lglw->mouse.p.y, lglw->mouse.button_state, 0u/*changedbuttonstate*/); + } +} + + +// ---------------------------------------------------------------------------- lglw_mouse_callback_set +void lglw_mouse_callback_set(lglw_t _lglw, lglw_mouse_fxn_t _cbk) { + LGLW(_lglw); + + if(NULL != lglw) + { + lglw->mouse.cbk = _cbk; + } +} + + +// ---------------------------------------------------------------------------- lglw_mouse_callback_set +void lglw_focus_callback_set(lglw_t _lglw, lglw_focus_fxn_t _cbk) { + LGLW(_lglw); + + if(NULL != lglw) + { + lglw->focus.cbk = _cbk; + } +} + + +// ---------------------------------------------------------------------------- loc_handle_key +static lglw_bool_t loc_handle_key(lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _vkey) { + lglw_bool_t r = LGLW_FALSE; + + if(NULL != lglw->keyboard.cbk) + { + r = lglw->keyboard.cbk(lglw, _vkey, lglw->keyboard.kmod_state, _bPressed); + } + + return r; +} + + +// ---------------------------------------------------------------------------- lglw_keyboard_callback_set +void lglw_keyboard_callback_set(lglw_t _lglw, lglw_keyboard_fxn_t _cbk) { + LGLW(_lglw); + + if(NULL != lglw) + { + lglw->keyboard.cbk = _cbk; + } +} + + +// ---------------------------------------------------------------------------- lglw_keyboard_get_modifiers +uint32_t lglw_keyboard_get_modifiers(lglw_t _lglw) { + uint32_t r = 0u; + LGLW(_lglw); + + if(NULL != lglw) + { + r = lglw->keyboard.kmod_state; + } + + return r; +} + + +// ---------------------------------------------------------------------------- lglw_touchkeyboard_show +void lglw_touchkeyboard_show(lglw_t _lglw, lglw_bool_t _bEnable) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_mouse_get_buttons +uint32_t lglw_mouse_get_buttons(lglw_t _lglw) { + uint32_t r = 0u; + LGLW(_lglw); + + if(NULL != lglw) + { + r = lglw->mouse.button_state; + } + + return r; +} + + +// ---------------------------------------------------------------------------- lglw_mouse_grab +void lglw_mouse_grab(lglw_t _lglw, uint32_t _grabMode) { + LGLW(_lglw); + + if(NULL != lglw) + { + // (todo) implement me + // if(NULL != lglw->win.hwnd) + { + if(!lglw->mouse.touch.b_enable) + { + if(lglw->mouse.grab.mode != _grabMode) + { + lglw_mouse_ungrab(_lglw); + } + + switch(_grabMode) + { + default: + case LGLW_MOUSE_GRAB_NONE: + break; + + case LGLW_MOUSE_GRAB_CAPTURE: + // (todo) implement me + // (void)SetCapture(lglw->win.hwnd); + lglw->mouse.grab.mode = _grabMode; + break; + + case LGLW_MOUSE_GRAB_WARP: + // (todo) implement me + // (void)SetCapture(lglw->win.hwnd); + lglw_mouse_cursor_show(_lglw, LGLW_FALSE); + lglw->mouse.grab.p = lglw->mouse.p; + lglw->mouse.grab.last_p = lglw->mouse.p; + lglw->mouse.grab.mode = _grabMode; + break; + } + } + } + } +} + + +// ---------------------------------------------------------------------------- lglw_mouse_ungrab +void lglw_mouse_ungrab(lglw_t _lglw) { + LGLW(_lglw); + + if(NULL != lglw) + { + // (todo) implement me + // if(NULL != lglw->win.hwnd) + { + if(!lglw->mouse.touch.b_enable) + { + switch(lglw->mouse.grab.mode) + { + default: + case LGLW_MOUSE_GRAB_NONE: + break; + + case LGLW_MOUSE_GRAB_CAPTURE: + // (todo) implement me + // (void)ReleaseCapture(); + lglw->mouse.grab.mode = LGLW_MOUSE_GRAB_NONE; + break; + + case LGLW_MOUSE_GRAB_WARP: + // (todo) implement me + // (void)ReleaseCapture(); + lglw->mouse.grab.mode = LGLW_MOUSE_GRAB_NONE; + lglw->mouse.grab.b_queue_warp = LGLW_TRUE; + lglw_mouse_cursor_show(_lglw, LGLW_TRUE); + break; + } + } + } + } +} + + +// ---------------------------------------------------------------------------- lglw_mouse_warp +void lglw_mouse_warp(lglw_t _lglw, int32_t _x, int32_t _y) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- loc_handle_queued_mouse_warp +static void loc_handle_queued_mouse_warp(lglw_int_t *lglw) { + if(lglw->mouse.grab.b_queue_warp) + { + lglw->mouse.grab.b_queue_warp = LGLW_FALSE; + lglw_mouse_warp(lglw, lglw->mouse.grab.p.x, lglw->mouse.grab.p.y); + lglw->mouse.grab.last_p = lglw->mouse.grab.p; + } +} + + +// ---------------------------------------------------------------------------- lglw_mouse_cursor_show +void lglw_mouse_cursor_show (lglw_t _lglw, lglw_bool_t _bShow) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_timer_start +void lglw_timer_start(lglw_t _lglw, uint32_t _millisec) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_timer_stop +void lglw_timer_stop(lglw_t _lglw) { + LGLW(_lglw); + + // (todo) implement me + + if(NULL != lglw) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_timer_callback_set +void lglw_timer_callback_set(lglw_t _lglw, lglw_timer_fxn_t _cbk) { + LGLW(_lglw); + + if(NULL != lglw) + { + lglw->timer.cbk = _cbk; + } +} + + +// ---------------------------------------------------------------------------- loc_enable_dropfiles +static void loc_enable_dropfiles(lglw_int_t *lglw, lglw_bool_t _bEnable) { + + // (todo) implement me +} + + +// ---------------------------------------------------------------------------- lglw_dropfiles_callback_set +void lglw_dropfiles_callback_set(lglw_t _lglw, lglw_dropfiles_fxn_t _cbk) { + LGLW(_lglw); + + if(NULL != _lglw) + { + lglw->dropfiles.cbk = _cbk; + + loc_enable_dropfiles(lglw, (NULL != _cbk)); + } +} + + +// ---------------------------------------------------------------------------- loc_touchinput_update +static void loc_touchinput_update(lglw_int_t *lglw) { + + // (todo) implement me +} + + +// ---------------------------------------------------------------------------- lglw_touchinput_set +void lglw_touchinput_set(lglw_t _lglw, lglw_bool_t _bEnable) { + LGLW(_lglw); + + if(NULL != _lglw) + { + lglw->mouse.touch.b_enable = _bEnable; + lglw->mouse.touch.b_update_queued = LGLW_TRUE; + } +} + + +// ---------------------------------------------------------------------------- lglw_touchinput_get +lglw_bool_t lglw_touchinput_get(lglw_t _lglw) { + lglw_bool_t r = LGLW_FALSE; + LGLW(_lglw); + + if(NULL != _lglw) + { + r = lglw->mouse.touch.b_enable; + } + + return r; +} + + +// ---------------------------------------------------------------------------- lglw_clipboard_text_set +void lglw_clipboard_text_set(lglw_t _lglw, const uint32_t _numChars, const char *_text) { + LGLW(_lglw); + (void)_numChars; + + // (todo) implement me + + if(NULL != _text) + { + } +} + + +// ---------------------------------------------------------------------------- lglw_clipboard_text_get +void lglw_clipboard_text_get(lglw_t _lglw, uint32_t _maxChars, uint32_t *_retNumChars, char *_retText) { + LGLW(_lglw); + + if(NULL != _retNumChars) + *_retNumChars = 0u; + + if(NULL != _retText) + *_retText = 0; + + if(_maxChars > 0u) + { + if(NULL != _lglw) + { + // (todo) implement me + } + } +}