|
@@ -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 <stdlib.h> |
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
|
|
|
#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 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |