You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

811 lines
20KB

  1. /* ----
  2. * ---- file : lglw_linux.c (**stub**)
  3. * ---- author : bsp
  4. * ---- legal : Distributed under terms of the MIT LICENSE (MIT).
  5. * ----
  6. * ---- Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * ---- of this software and associated documentation files (the "Software"), to deal
  8. * ---- in the Software without restriction, including without limitation the rights
  9. * ---- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * ---- copies of the Software, and to permit persons to whom the Software is
  11. * ---- furnished to do so, subject to the following conditions:
  12. * ----
  13. * ---- The above copyright notice and this permission notice shall be included in
  14. * ---- all copies or substantial portions of the Software.
  15. * ----
  16. * ---- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * ---- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * ---- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. * ---- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * ---- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * ---- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * ---- THE SOFTWARE.
  23. * ----
  24. * ---- info : This is part of the "lglw" package.
  25. * ----
  26. * ---- created: 04Aug2018
  27. * ---- changed: 05Aug2018, 06Aug2018, 07Aug2018, 08Aug2018, 09Aug2018, 18Aug2018, 10Oct2018
  28. * ----
  29. * ----
  30. */
  31. #include "lglw.h"
  32. #include <stdlib.h>
  33. #include <stdio.h>
  34. #include <string.h>
  35. #define Dprintf if(0);else printf
  36. // #define Dprintf if(1);else printf
  37. // ---------------------------------------------------------------------------- macros and defines
  38. #define LGLW(a) lglw_int_t *lglw = ((lglw_int_t*)(a))
  39. #define LGLW_DEFAULT_HIDDEN_W (800)
  40. #define LGLW_DEFAULT_HIDDEN_H (600)
  41. #define LGLW_MOUSE_TOUCH_LMB_TIMEOUT (250u)
  42. #define LGLW_MOUSE_TOUCH_RMB_TIMEOUT (500u)
  43. #define LGLW_MOUSE_TOUCH_RMB_STATE_IDLE (0u)
  44. #define LGLW_MOUSE_TOUCH_RMB_STATE_LMB (1u)
  45. #define LGLW_MOUSE_TOUCH_RMB_STATE_WAIT (2u)
  46. #define LGLW_MOUSE_TOUCH_RMB_STATE_RMB (3u)
  47. #define LGLW_MOUSE_TOUCH_RMB_MOVE_THRESHOLD (7u)
  48. #define sABS(x) (((x)>0)?(x):-(x))
  49. // ---------------------------------------------------------------------------- structs and typedefs
  50. typedef struct lglw_int_s {
  51. void *user_data; // arbitrary user data
  52. struct {
  53. lglw_vec2i_t size;
  54. } hidden;
  55. struct {
  56. lglw_vec2i_t size;
  57. int32_t swap_interval;
  58. } win;
  59. struct {
  60. } prev;
  61. struct {
  62. uint32_t kmod_state; // See LGLW_KMOD_xxx
  63. lglw_keyboard_fxn_t cbk;
  64. } keyboard;
  65. struct {
  66. lglw_vec2i_t p; // last seen mouse position
  67. uint32_t button_state;
  68. lglw_mouse_fxn_t cbk;
  69. struct {
  70. uint32_t mode;
  71. lglw_vec2i_t p; // grab-start mouse position
  72. lglw_bool_t b_queue_warp;
  73. lglw_vec2i_t last_p;
  74. } grab;
  75. struct {
  76. lglw_bool_t b_enable;
  77. lglw_bool_t b_update_queued;
  78. lglw_bool_t b_syn_rmb;
  79. uint32_t syn_rmb_hold_state; // see LGLW_MOUSE_TOUCH_RMB_STATE_xxx
  80. uint32_t hold_start_ms;
  81. lglw_vec2i_t hold_start_p;
  82. } touch;
  83. } mouse;
  84. struct {
  85. uint32_t state;
  86. lglw_focus_fxn_t cbk;
  87. } focus;
  88. struct {
  89. lglw_bool_t b_running;
  90. lglw_timer_fxn_t cbk;
  91. } timer;
  92. struct {
  93. lglw_dropfiles_fxn_t cbk;
  94. } dropfiles;
  95. struct {
  96. lglw_redraw_fxn_t cbk;
  97. } redraw;
  98. } lglw_int_t;
  99. // ---------------------------------------------------------------------------- module fxn fwd decls
  100. static lglw_bool_t loc_create_hidden_window (lglw_int_t *lglw, int32_t _w, int32_t _h);
  101. static void loc_destroy_hidden_window(lglw_int_t *lglw);
  102. static void loc_key_hook(lglw_int_t *lglw);
  103. static void loc_key_unhook(lglw_int_t *lglw);
  104. static lglw_bool_t loc_handle_key (lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _vkey);
  105. // static lglw_bool_t loc_touchkeyboard_get_rect (RECT *rect);
  106. // static lglw_bool_t loc_touchkeyboard_is_visible (void);
  107. extern lglw_bool_t lglw_int_touchkeyboard_toggle (void);
  108. static void loc_handle_mouseleave (lglw_int_t *lglw);
  109. static void loc_handle_mouseenter (lglw_int_t *lglw);
  110. static void loc_handle_mousebutton (lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _button);
  111. static void loc_handle_mousemotion (lglw_int_t *lglw);
  112. static void loc_handle_queued_mouse_warp (lglw_int_t *lglw);
  113. static void loc_touchinput_update (lglw_int_t *lglw);
  114. static void loc_enable_dropfiles (lglw_int_t *lglw, lglw_bool_t _bEnable);
  115. // ---------------------------------------------------------------------------- module vars
  116. static lglw_int_t *khook_lglw = NULL; // currently key-hooked lglw instance (one at a time)
  117. // ---------------------------------------------------------------------------- lglw_init
  118. lglw_t lglw_init(int32_t _w, int32_t _h) {
  119. lglw_int_t *lglw = malloc(sizeof(lglw_int_t));
  120. if(NULL != lglw)
  121. {
  122. memset(lglw, 0, sizeof(lglw_int_t));
  123. if(_w <= 16)
  124. _w = LGLW_DEFAULT_HIDDEN_W;
  125. if(_h <= 16)
  126. _h = LGLW_DEFAULT_HIDDEN_H;
  127. if(!loc_create_hidden_window(lglw, _w, _h))
  128. {
  129. free(lglw);
  130. lglw = NULL;
  131. }
  132. }
  133. return lglw;
  134. }
  135. // ---------------------------------------------------------------------------- lglw_exit
  136. void lglw_exit(lglw_t _lglw) {
  137. LGLW(_lglw);
  138. if(NULL != lglw)
  139. {
  140. loc_destroy_hidden_window(lglw);
  141. free(lglw);
  142. }
  143. }
  144. // ---------------------------------------------------------------------------- lglw_userdata_set
  145. void lglw_userdata_set(lglw_t _lglw, void *_userData) {
  146. LGLW(_lglw);
  147. if(NULL != lglw)
  148. {
  149. lglw->user_data = _userData;
  150. }
  151. }
  152. // ---------------------------------------------------------------------------- lglw_userdata_get
  153. void *lglw_userdata_get(lglw_t _lglw) {
  154. LGLW(_lglw);
  155. if(NULL != lglw)
  156. {
  157. return lglw->user_data;
  158. }
  159. return NULL;
  160. }
  161. // ---------------------------------------------------------------------------- loc_create_hidden_window
  162. static lglw_bool_t loc_create_hidden_window(lglw_int_t *lglw, int32_t _w, int32_t _h) {
  163. // (todo) implement me
  164. lglw->hidden.size.x = _w;
  165. lglw->hidden.size.y = _h;
  166. return LGLW_FALSE;
  167. }
  168. // ---------------------------------------------------------------------------- loc_destroy_hidden_window
  169. static void loc_destroy_hidden_window(lglw_int_t *lglw) {
  170. // (todo) implement me
  171. }
  172. // ---------------------------------------------------------------------------- lglw_window_open
  173. lglw_bool_t lglw_window_open (lglw_t _lglw, void *_parentHWNDOrNull, int32_t _x, int32_t _y, int32_t _w, int32_t _h) {
  174. lglw_bool_t r = LGLW_FALSE;
  175. LGLW(_lglw);
  176. // (todo) implement me
  177. if(NULL != lglw)
  178. {
  179. if(_w <= 16)
  180. _w = lglw->hidden.size.x;
  181. if(_h <= 16)
  182. _h = lglw->hidden.size.y;
  183. lglw->win.size.x = _w;
  184. lglw->win.size.y = _h;
  185. loc_enable_dropfiles(lglw, (NULL != lglw->dropfiles.cbk));
  186. }
  187. return r;
  188. }
  189. // ---------------------------------------------------------------------------- lglw_window_resize
  190. lglw_bool_t lglw_window_resize (lglw_t _lglw, int32_t _w, int32_t _h) {
  191. lglw_bool_t r = LGLW_FALSE;
  192. LGLW(_lglw);
  193. // (todo) implement me
  194. if(NULL != lglw)
  195. {
  196. }
  197. return r;
  198. }
  199. // ---------------------------------------------------------------------------- lglw_window_close
  200. void lglw_window_close (lglw_t _lglw) {
  201. LGLW(_lglw);
  202. // (todo) implement me
  203. if(NULL != lglw)
  204. {
  205. // if(NULL != lglw->win.hwnd)
  206. {
  207. lglw_timer_stop(_lglw);
  208. loc_key_unhook(lglw);
  209. }
  210. }
  211. }
  212. // ---------------------------------------------------------------------------- lglw_window_show
  213. void lglw_window_show(lglw_t _lglw) {
  214. LGLW(_lglw);
  215. // (todo) implement me
  216. if(NULL != lglw)
  217. {
  218. }
  219. }
  220. // ---------------------------------------------------------------------------- lglw_window_hide
  221. void lglw_window_hide(lglw_t _lglw) {
  222. LGLW(_lglw);
  223. // (todo) implement me
  224. if(NULL != lglw)
  225. {
  226. }
  227. }
  228. // ---------------------------------------------------------------------------- lglw_window_is_visible
  229. lglw_bool_t lglw_window_is_visible(lglw_t _lglw) {
  230. lglw_bool_t r = LGLW_FALSE;
  231. LGLW(_lglw);
  232. // (todo) implement me
  233. if(NULL != lglw)
  234. {
  235. }
  236. return r;
  237. }
  238. // ---------------------------------------------------------------------------- lglw_window_size_get
  239. void lglw_window_size_get(lglw_t _lglw, int32_t *_retX, int32_t *_retY) {
  240. LGLW(_lglw);
  241. // (todo) implement me
  242. if(NULL != lglw)
  243. {
  244. }
  245. }
  246. // ---------------------------------------------------------------------------- lglw_redraw
  247. void lglw_redraw(lglw_t _lglw) {
  248. LGLW(_lglw);
  249. // (todo) implement me
  250. if(NULL != lglw)
  251. {
  252. }
  253. }
  254. // ---------------------------------------------------------------------------- lglw_redraw_callback_set
  255. void lglw_redraw_callback_set(lglw_t _lglw, lglw_redraw_fxn_t _cbk) {
  256. LGLW(_lglw);
  257. if(NULL != lglw)
  258. {
  259. lglw->redraw.cbk = _cbk;
  260. }
  261. }
  262. // ---------------------------------------------------------------------------- lglw_glcontext_push
  263. void lglw_glcontext_push(lglw_t _lglw) {
  264. LGLW(_lglw);
  265. // (todo) implement me
  266. if(NULL != lglw)
  267. {
  268. }
  269. }
  270. // ---------------------------------------------------------------------------- lglw_glcontext_pop
  271. void lglw_glcontext_pop(lglw_t _lglw) {
  272. LGLW(_lglw);
  273. // (todo) implement me
  274. if(NULL != lglw)
  275. {
  276. }
  277. }
  278. // ---------------------------------------------------------------------------- lglw_swap_buffers
  279. void lglw_swap_buffers(lglw_t _lglw) {
  280. LGLW(_lglw);
  281. // (todo) implement me
  282. if(NULL != lglw)
  283. {
  284. }
  285. }
  286. // ---------------------------------------------------------------------------- lglw_swap_interval_set
  287. void lglw_swap_interval_set(lglw_t _lglw, int32_t _ival) {
  288. LGLW(_lglw);
  289. // (todo) implement me
  290. if(NULL != lglw)
  291. {
  292. }
  293. }
  294. // ---------------------------------------------------------------------------- lglw_swap_interval_get
  295. int32_t lglw_swap_interval_get(lglw_t _lglw) {
  296. LGLW(_lglw);
  297. int32_t r = 0;
  298. if(NULL != lglw)
  299. {
  300. r = lglw->win.swap_interval;
  301. }
  302. return r;
  303. }
  304. // ---------------------------------------------------------------------------- loc_key_hook
  305. static void loc_key_hook(lglw_int_t *lglw) {
  306. loc_key_unhook(lglw);
  307. // (todo) implement me
  308. khook_lglw = lglw;
  309. }
  310. // ---------------------------------------------------------------------------- loc_key_unhook
  311. static void loc_key_unhook(lglw_int_t *lglw) {
  312. // (todo) implement me
  313. if(khook_lglw == lglw)
  314. khook_lglw = NULL;
  315. }
  316. // ---------------------------------------------------------------------------- loc_handle_mouseleave
  317. static void loc_handle_mouseleave(lglw_int_t *lglw) {
  318. loc_key_unhook(lglw);
  319. lglw->focus.state &= ~LGLW_FOCUS_MOUSE;
  320. if(NULL != lglw->focus.cbk)
  321. {
  322. lglw->focus.cbk(lglw, lglw->focus.state, LGLW_FOCUS_MOUSE);
  323. }
  324. Dprintf("xxx lglw:loc_handle_mouseleave: LEAVE\n");
  325. }
  326. // ---------------------------------------------------------------------------- loc_handle_mouseenter
  327. static void loc_handle_mouseenter(lglw_int_t *lglw) {
  328. loc_key_hook(lglw);
  329. lglw->focus.state |= LGLW_FOCUS_MOUSE;
  330. if(NULL != lglw->focus.cbk)
  331. {
  332. lglw->focus.cbk(lglw, lglw->focus.state, LGLW_FOCUS_MOUSE);
  333. }
  334. Dprintf("xxx lglw:loc_handle_mouseenter: LEAVE\n");
  335. }
  336. // ---------------------------------------------------------------------------- loc_handle_mousebutton
  337. static void loc_handle_mousebutton(lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _button) {
  338. if(_bPressed)
  339. lglw->mouse.button_state |= _button;
  340. else
  341. lglw->mouse.button_state &= ~_button;
  342. if(NULL != lglw->mouse.cbk)
  343. {
  344. lglw->mouse.cbk(lglw, lglw->mouse.p.x, lglw->mouse.p.y, lglw->mouse.button_state, _button);
  345. }
  346. }
  347. // ---------------------------------------------------------------------------- loc_handle_mousemotion
  348. static void loc_handle_mousemotion(lglw_int_t *lglw) {
  349. if(NULL != lglw->mouse.cbk)
  350. {
  351. lglw->mouse.cbk(lglw, lglw->mouse.p.x, lglw->mouse.p.y, lglw->mouse.button_state, 0u/*changedbuttonstate*/);
  352. }
  353. }
  354. // ---------------------------------------------------------------------------- lglw_mouse_callback_set
  355. void lglw_mouse_callback_set(lglw_t _lglw, lglw_mouse_fxn_t _cbk) {
  356. LGLW(_lglw);
  357. if(NULL != lglw)
  358. {
  359. lglw->mouse.cbk = _cbk;
  360. }
  361. }
  362. // ---------------------------------------------------------------------------- lglw_mouse_callback_set
  363. void lglw_focus_callback_set(lglw_t _lglw, lglw_focus_fxn_t _cbk) {
  364. LGLW(_lglw);
  365. if(NULL != lglw)
  366. {
  367. lglw->focus.cbk = _cbk;
  368. }
  369. }
  370. // ---------------------------------------------------------------------------- loc_handle_key
  371. static lglw_bool_t loc_handle_key(lglw_int_t *lglw, lglw_bool_t _bPressed, uint32_t _vkey) {
  372. lglw_bool_t r = LGLW_FALSE;
  373. if(NULL != lglw->keyboard.cbk)
  374. {
  375. r = lglw->keyboard.cbk(lglw, _vkey, lglw->keyboard.kmod_state, _bPressed);
  376. }
  377. return r;
  378. }
  379. // ---------------------------------------------------------------------------- lglw_keyboard_callback_set
  380. void lglw_keyboard_callback_set(lglw_t _lglw, lglw_keyboard_fxn_t _cbk) {
  381. LGLW(_lglw);
  382. if(NULL != lglw)
  383. {
  384. lglw->keyboard.cbk = _cbk;
  385. }
  386. }
  387. // ---------------------------------------------------------------------------- lglw_keyboard_get_modifiers
  388. uint32_t lglw_keyboard_get_modifiers(lglw_t _lglw) {
  389. uint32_t r = 0u;
  390. LGLW(_lglw);
  391. if(NULL != lglw)
  392. {
  393. r = lglw->keyboard.kmod_state;
  394. }
  395. return r;
  396. }
  397. // ---------------------------------------------------------------------------- lglw_touchkeyboard_show
  398. void lglw_touchkeyboard_show(lglw_t _lglw, lglw_bool_t _bEnable) {
  399. LGLW(_lglw);
  400. // (todo) implement me
  401. if(NULL != lglw)
  402. {
  403. }
  404. }
  405. // ---------------------------------------------------------------------------- lglw_mouse_get_buttons
  406. uint32_t lglw_mouse_get_buttons(lglw_t _lglw) {
  407. uint32_t r = 0u;
  408. LGLW(_lglw);
  409. if(NULL != lglw)
  410. {
  411. r = lglw->mouse.button_state;
  412. }
  413. return r;
  414. }
  415. // ---------------------------------------------------------------------------- lglw_mouse_grab
  416. void lglw_mouse_grab(lglw_t _lglw, uint32_t _grabMode) {
  417. LGLW(_lglw);
  418. if(NULL != lglw)
  419. {
  420. // (todo) implement me
  421. // if(NULL != lglw->win.hwnd)
  422. {
  423. if(!lglw->mouse.touch.b_enable)
  424. {
  425. if(lglw->mouse.grab.mode != _grabMode)
  426. {
  427. lglw_mouse_ungrab(_lglw);
  428. }
  429. switch(_grabMode)
  430. {
  431. default:
  432. case LGLW_MOUSE_GRAB_NONE:
  433. break;
  434. case LGLW_MOUSE_GRAB_CAPTURE:
  435. // (todo) implement me
  436. // (void)SetCapture(lglw->win.hwnd);
  437. lglw->mouse.grab.mode = _grabMode;
  438. break;
  439. case LGLW_MOUSE_GRAB_WARP:
  440. // (todo) implement me
  441. // (void)SetCapture(lglw->win.hwnd);
  442. lglw_mouse_cursor_show(_lglw, LGLW_FALSE);
  443. lglw->mouse.grab.p = lglw->mouse.p;
  444. lglw->mouse.grab.last_p = lglw->mouse.p;
  445. lglw->mouse.grab.mode = _grabMode;
  446. break;
  447. }
  448. }
  449. }
  450. }
  451. }
  452. // ---------------------------------------------------------------------------- lglw_mouse_ungrab
  453. void lglw_mouse_ungrab(lglw_t _lglw) {
  454. LGLW(_lglw);
  455. if(NULL != lglw)
  456. {
  457. // (todo) implement me
  458. // if(NULL != lglw->win.hwnd)
  459. {
  460. if(!lglw->mouse.touch.b_enable)
  461. {
  462. switch(lglw->mouse.grab.mode)
  463. {
  464. default:
  465. case LGLW_MOUSE_GRAB_NONE:
  466. break;
  467. case LGLW_MOUSE_GRAB_CAPTURE:
  468. // (todo) implement me
  469. // (void)ReleaseCapture();
  470. lglw->mouse.grab.mode = LGLW_MOUSE_GRAB_NONE;
  471. break;
  472. case LGLW_MOUSE_GRAB_WARP:
  473. // (todo) implement me
  474. // (void)ReleaseCapture();
  475. lglw->mouse.grab.mode = LGLW_MOUSE_GRAB_NONE;
  476. lglw->mouse.grab.b_queue_warp = LGLW_TRUE;
  477. lglw_mouse_cursor_show(_lglw, LGLW_TRUE);
  478. break;
  479. }
  480. }
  481. }
  482. }
  483. }
  484. // ---------------------------------------------------------------------------- lglw_mouse_warp
  485. void lglw_mouse_warp(lglw_t _lglw, int32_t _x, int32_t _y) {
  486. LGLW(_lglw);
  487. // (todo) implement me
  488. if(NULL != lglw)
  489. {
  490. }
  491. }
  492. // ---------------------------------------------------------------------------- loc_handle_queued_mouse_warp
  493. static void loc_handle_queued_mouse_warp(lglw_int_t *lglw) {
  494. if(lglw->mouse.grab.b_queue_warp)
  495. {
  496. lglw->mouse.grab.b_queue_warp = LGLW_FALSE;
  497. lglw_mouse_warp(lglw, lglw->mouse.grab.p.x, lglw->mouse.grab.p.y);
  498. lglw->mouse.grab.last_p = lglw->mouse.grab.p;
  499. }
  500. }
  501. // ---------------------------------------------------------------------------- lglw_mouse_cursor_show
  502. void lglw_mouse_cursor_show (lglw_t _lglw, lglw_bool_t _bShow) {
  503. LGLW(_lglw);
  504. // (todo) implement me
  505. if(NULL != lglw)
  506. {
  507. }
  508. }
  509. // ---------------------------------------------------------------------------- lglw_timer_start
  510. void lglw_timer_start(lglw_t _lglw, uint32_t _millisec) {
  511. LGLW(_lglw);
  512. // (todo) implement me
  513. if(NULL != lglw)
  514. {
  515. }
  516. }
  517. // ---------------------------------------------------------------------------- lglw_timer_stop
  518. void lglw_timer_stop(lglw_t _lglw) {
  519. LGLW(_lglw);
  520. // (todo) implement me
  521. if(NULL != lglw)
  522. {
  523. }
  524. }
  525. // ---------------------------------------------------------------------------- lglw_timer_callback_set
  526. void lglw_timer_callback_set(lglw_t _lglw, lglw_timer_fxn_t _cbk) {
  527. LGLW(_lglw);
  528. if(NULL != lglw)
  529. {
  530. lglw->timer.cbk = _cbk;
  531. }
  532. }
  533. // ---------------------------------------------------------------------------- loc_enable_dropfiles
  534. static void loc_enable_dropfiles(lglw_int_t *lglw, lglw_bool_t _bEnable) {
  535. // (todo) implement me
  536. }
  537. // ---------------------------------------------------------------------------- lglw_dropfiles_callback_set
  538. void lglw_dropfiles_callback_set(lglw_t _lglw, lglw_dropfiles_fxn_t _cbk) {
  539. LGLW(_lglw);
  540. if(NULL != _lglw)
  541. {
  542. lglw->dropfiles.cbk = _cbk;
  543. loc_enable_dropfiles(lglw, (NULL != _cbk));
  544. }
  545. }
  546. // ---------------------------------------------------------------------------- loc_touchinput_update
  547. static void loc_touchinput_update(lglw_int_t *lglw) {
  548. // (todo) implement me
  549. }
  550. // ---------------------------------------------------------------------------- lglw_touchinput_set
  551. void lglw_touchinput_set(lglw_t _lglw, lglw_bool_t _bEnable) {
  552. LGLW(_lglw);
  553. if(NULL != _lglw)
  554. {
  555. lglw->mouse.touch.b_enable = _bEnable;
  556. lglw->mouse.touch.b_update_queued = LGLW_TRUE;
  557. }
  558. }
  559. // ---------------------------------------------------------------------------- lglw_touchinput_get
  560. lglw_bool_t lglw_touchinput_get(lglw_t _lglw) {
  561. lglw_bool_t r = LGLW_FALSE;
  562. LGLW(_lglw);
  563. if(NULL != _lglw)
  564. {
  565. r = lglw->mouse.touch.b_enable;
  566. }
  567. return r;
  568. }
  569. // ---------------------------------------------------------------------------- lglw_clipboard_text_set
  570. void lglw_clipboard_text_set(lglw_t _lglw, const uint32_t _numChars, const char *_text) {
  571. LGLW(_lglw);
  572. (void)_numChars;
  573. // (todo) implement me
  574. if(NULL != _text)
  575. {
  576. }
  577. }
  578. // ---------------------------------------------------------------------------- lglw_clipboard_text_get
  579. void lglw_clipboard_text_get(lglw_t _lglw, uint32_t _maxChars, uint32_t *_retNumChars, char *_retText) {
  580. LGLW(_lglw);
  581. if(NULL != _retNumChars)
  582. *_retNumChars = 0u;
  583. if(NULL != _retText)
  584. *_retText = 0;
  585. if(_maxChars > 0u)
  586. {
  587. if(NULL != _lglw)
  588. {
  589. // (todo) implement me
  590. }
  591. }
  592. }