LibGame  v0.4.0
The LG Game Engine - Copyright (C) 2024-2025 ETMSoftware
lg_ui.h
1 /*
2  * LibGame - Copyright (C) Emmanuel Thomas-Maurin 2011-2025
3  * All rights reserved
4  */
5 
6 #ifndef LG_UI_H
7 #define LG_UI_H
8 
9 #ifndef ANDROID_V
10 # define FLUSH_KEYB_OR_TOUCHSCREEN_BUF {lg_flush_keyb_events();} /* Don't call lg_flush_mouse_events() */
11 #else
12 # define FLUSH_KEYB_OR_TOUCHSCREEN_BUF {lg_flush_touch_events();}
13 #endif
14 
15 #ifndef ANDROID_V
16 # define WAIT_FOR_PRESS_OR_TOUCH {lg_wait_for_any_key_pressed();}
17 #else
18 # define WAIT_FOR_PRESS_OR_TOUCH {lg_wait_for_finger_down(NULL, NULL);}
19 #endif
20 
21 #define SPECIAL_KEYS_REPEAT_DELAY 200 /* In ms */
22 
23 /* LPK = Last Pressed_Key */
24 #define LPK_MOUSE_CLICK_ACTIVITY 50000 /* Returned (+ in->tzw_i) by lg_get_user_input() as last pressed key in case of mouse activity */
25 
26 #define LPK_TOUCH_ACTIVITY 100000 /* Returned (+ in->tzw_i) by lg_get_user_input() as last pressed key in case of touch activity */
27 
28 typedef struct {
29  /* Linux */
30  uint8_t arrow_keys_state; /* LEFT, RIGHT, UP, DOWN */
31  zboolean kmod_ctrl;
32  zboolean kmod_shift;
33  zboolean kmod_alt;
34  uint32_t last_pressed_key;
35  /* Android (touchscreen) */
36  lg_finger_down_loc finger_down_loc; /* Logical OR of values */
37  float x;
38  float y;
39  /* Mouse or touchscreen */
40  uint32_t tzw_i; /* Index + 1 of clicked/tapped TZW area in array */
41  /* Cam/object motions and rotations = -1, 0, 1 */
42  int move_forward; /* Z transl */
43  int move_up; /* Y transl - not an aircraft motion */
44  int cam_truck; /* X transl - not an aircraft motion */
45  /* Yaw/Pitch/Roll = -1, 0, 1 */ /* Aircraft/flight simulator standard order */
46  int yaw;
47  int pitch;
48  int roll;
49  /* Orbit cam */
50  int h_orbit;
51  int v_orbit;
52  /* Mouse inputs */
53  zboolean left_click;
54  zboolean right_click;
55  int mouse_x;
56  int mouse_y;
57  int dx;
58  int dy;
59  int dz_wheel; /* Mouse wheel also set move_forward */
60  float thrust;
61  /* Appply for keyboard and mouse */
62  zboolean slow_motion;
64 
65 /*
66  * TZ/tz means Touch Zone (not Time Zone)
67  */
68 typedef enum {
69  TZ_LEFT,
70  TZ_H_CENTER,
71  TZ_RIGHT,
72  TZ_BOTTOM,
73  TZ_V_CENTER,
74  TZ_TOP
75 } lg_touch_zone;
76 
77 typedef struct {
78  LG_Window win;
79  LG_Color_u color;
80  Rec2Di area;
82 
83 #define TZW_ARROW_POINTS_NUM 7
84 
85 typedef enum {
86  TZW_RECTANGLE,
87  TZW_RECT_CORNERS,
88  TZW_ARROW_UP,
89  TZW_ARROW_DOWN,
90  TZW_ARROW_LEFT,
91  TZW_ARROW_RIGHT,
92  TZW_DOUBLE_ARROW_HORIZ,
93  TZW_DOUBLE_ARROW_VERT,
94  TZW_TRIANGLE_LEFT,
95  TZW_TRIANGLE_RIGHT,
96  TZW_TRIANGLE_UP,
97  TZW_TRIANGLE_DOWN
98 } lg_tzw_type;
99 
100 #define N_TZW_MAX 256
101 
102 /* Array of all TZ wins for one frame */
103 typedef struct {
104  LG_TouchZoneWindow *tzw[N_TZW_MAX];
105 } LG_TZW_Array;
106 
107 /* Helper struct to deal with TZ win area rects */
108 typedef struct {
109  Rec2Di *r[N_TZW_MAX];
110  Rec2Di r0[N_TZW_MAX];
112 
113 const char **lg_camcontrols_keys_str();
114 
116 
117 LG_TouchZoneWindow *lg_tzwin_new(const char *, zboolean, LG_Color_u, int, int, TTF_Font *);
118 
119 void lg_tzwin_show(LG_TouchZoneWindow *, lg_tzw_type);
120 
122 
124 
126 
127 void lg_draw_arrow(Rec2Di r, LG_Color_u c, lg_tzw_type);
128 
129 void lg_rectangle_to_arrow(Rec2Di, lg_tzw_type, Point2Di *[]);
130 
131 void lg_draw_triangle(Rec2Di, LG_Color_u, lg_tzw_type);
132 
133 void lg_set_special_keys_repeat_delay(uint32_t);
134 
136 
138 
140 
142 
144 
146 
148 
150 
151 #endif /* LG_UI_H */
lg_draw_arrow
void lg_draw_arrow(Rec2Di r, LG_Color_u c, lg_tzw_type type)
Definition: lg_ui.c:549
lg_camcontrols_keys_str
const char ** lg_camcontrols_keys_str()
Definition: lg_ui.c:108
lg_tzwin_get_area
Rec2Di lg_tzwin_get_area(LG_TouchZoneWindow *tzwin)
Definition: lg_ui.c:501
lg_tzwin_show
void lg_tzwin_show(LG_TouchZoneWindow *tzwin, lg_tzw_type type)
Definition: lg_ui.c:434
lg_rectangle_to_arrow
void lg_rectangle_to_arrow(Rec2Di r, lg_tzw_type arrow_type, Point2Di *p[])
Definition: lg_ui.c:572
lg_draw_rect_corners
void lg_draw_rect_corners(Rec2Di r, LG_Color_u c, int len)
Definition: lg_ui.c:518
LG_InputState
Definition: lg_ui.h:28
lg_set_special_keys_repeat_delay
void lg_set_special_keys_repeat_delay(uint32_t delay)
Definition: lg_ui.c:729
Point2Di
Definition: lg_gr_func.h:15
LG_TZW_Array
Definition: lg_ui.h:103
lg_tzw_array_new
LG_TZW_Array * lg_tzw_array_new()
Definition: lg_ui.c:786
lg_flush_in_clicks
void lg_flush_in_clicks(LG_InputState *in)
Definition: lg_ui.c:887
lg_tzw_array_free
void lg_tzw_array_free(LG_TZW_Array *tzw_array)
Definition: lg_ui.c:877
lg_draw_triangle
void lg_draw_triangle(Rec2Di r, LG_Color_u c, lg_tzw_type type)
Definition: lg_ui.c:695
lg_tzwin_add_to_array
zboolean lg_tzwin_add_to_array(LG_TZW_Array *tzw_array, LG_TouchZoneWindow *tzwin)
Definition: lg_ui.c:805
LG_Color_u
Definition: lg_vertex.h:111
lg_tzw_array_free_all_tzwin_after
void lg_tzw_array_free_all_tzwin_after(LG_TZW_Array *tzw_array, uint32_t next_index)
Definition: lg_ui.c:858
lg_input_state_info
void lg_input_state_info(LG_InputState *in)
Definition: lg_ui.c:900
lg_tzwin_new
LG_TouchZoneWindow * lg_tzwin_new(const char *str, zboolean no_margin, LG_Color_u text_color, int x_loc, int y_loc, TTF_Font *f)
Definition: lg_ui.c:359
lg_rec2di_array_from_tzw_array
LG_TZRec_Array lg_rec2di_array_from_tzw_array(LG_TZW_Array *tzw_array)
Definition: lg_ui.c:825
lg_tzw_array_free_all_tzwin
void lg_tzw_array_free_all_tzwin(LG_TZW_Array *tzw_array)
Definition: lg_ui.c:847
LG_Window
Definition: lg_wins.h:45
lg_get_user_input
uint32_t lg_get_user_input(LG_InputState *in, LG_TZW_Array *tzw_array)
Definition: lg_ui.c:179
lg_tzwin_free
void lg_tzwin_free(LG_TouchZoneWindow *tzwin)
Definition: lg_ui.c:488
LG_TZRec_Array
Definition: lg_ui.h:108
LG_TouchZoneWindow
Definition: lg_ui.h:77
Rec2Di
Definition: lg_gr_func.h:49