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 # define WAIT_FOR_PRESS_OR_CLICK_OR_TOUCH {lg_wait_for_any_key_pressed_or_left_click();}
18 #else
19 # define WAIT_FOR_PRESS_OR_TOUCH {lg_wait_for_finger_down(NULL, NULL);}
20 #endif
21 
22 #define SPECIAL_KEYS_REPEAT_DELAY 200 /* In ms */
23 
24 /* LPK = Last Pressed_Key */
25 #define LPK_MOUSE_CLICK_ACTIVITY 50000 /* Returned (+ in->tzw_i) by lg_get_user_input() as last pressed key in case of mouse activity */
26 
27 #define LPK_TOUCH_ACTIVITY 100000 /* Returned (+ in->tzw_i) by lg_get_user_input() as last pressed key in case of touch activity */
28 
29 typedef struct {
30  /* Linux */
31  uint8_t arrow_keys_state; /* LEFT, RIGHT, UP, DOWN */
32  zboolean kmod_ctrl;
33  zboolean kmod_shift;
34  zboolean kmod_alt;
35  uint32_t last_pressed_key;
36  /* Android (touchscreen) */
37  lg_finger_down_loc finger_down_loc; /* Logical OR of values */
38  float x;
39  float y;
40  /* Mouse or touchscreen */
41  uint32_t tzw_i; /* Index + 1 of clicked/tapped TZW area in array */
42  /* Cam/object motions and rotations = -1, 0, 1 */
43  int move_forward; /* Z transl */
44  int move_up; /* Y transl - not an aircraft motion */
45  int cam_truck; /* X transl - not an aircraft motion */
46  /* Yaw/Pitch/Roll = -1, 0, 1 */ /* Aircraft/flight simulator standard order */
47  int yaw;
48  int pitch;
49  int roll;
50  /* Orbit cam */
51  int h_orbit;
52  int v_orbit;
53  /* Mouse inputs */
54  zboolean left_click;
55  zboolean right_click;
56  int mouse_x;
57  int mouse_y;
58  int dx;
59  int dy;
60  int dz_wheel; /* Mouse wheel also set move_forward */
61  float thrust;
62  /* Appply for keyboard and mouse */
63  zboolean slow_motion;
65 
66 /*
67  * TZ/tz means Touch Zone (not Time Zone)
68  */
69 typedef enum {
70  TZ_LEFT,
71  TZ_H_CENTER,
72  TZ_RIGHT,
73  TZ_BOTTOM,
74  TZ_V_CENTER,
75  TZ_TOP
76 } lg_touch_zone;
77 
78 typedef struct {
79  LG_Window win;
80  LG_Color_u color;
81  Rec2Di area;
83 
84 #define TZW_ARROW_POINTS_NUM 7
85 
86 typedef enum {
87  TZW_RECTANGLE,
88  TZW_RECT_CORNERS,
89  TZW_ARROW_UP,
90  TZW_ARROW_DOWN,
91  TZW_ARROW_LEFT,
92  TZW_ARROW_RIGHT,
93  TZW_DOUBLE_ARROW_HORIZ,
94  TZW_DOUBLE_ARROW_VERT,
95  TZW_TRIANGLE_LEFT,
96  TZW_TRIANGLE_RIGHT,
97  TZW_TRIANGLE_UP,
98  TZW_TRIANGLE_DOWN
99 } lg_tzw_type;
100 
101 #define N_TZW_MAX 256
102 
103 /* Array of all TZ wins for one frame */
104 typedef struct {
105  LG_TouchZoneWindow *tzw[N_TZW_MAX];
106 } LG_TZW_Array;
107 
108 /* Helper struct to deal with TZ win area rects */
109 typedef struct {
110  Rec2Di *r[N_TZW_MAX];
111  Rec2Di r0[N_TZW_MAX];
113 
114 const char **lg_camcontrols_keys_str();
115 
117 
119 
120 LG_TouchZoneWindow *lg_tzwin_new(const char *, zboolean, LG_Color_u, int, int, TTF_Font *);
121 
122 void lg_tzwin_show(LG_TouchZoneWindow *, lg_tzw_type);
123 
125 
127 
129 
130 void lg_draw_arrow(Rec2Di r, LG_Color_u c, lg_tzw_type);
131 
132 void lg_rectangle_to_arrow(Rec2Di, lg_tzw_type, Point2Di *[]);
133 
134 void lg_draw_triangle(Rec2Di, LG_Color_u, lg_tzw_type);
135 
136 void lg_set_special_keys_repeat_delay(uint32_t);
137 
139 
141 
143 
145 
147 
149 
151 
153 
154 #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:563
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:515
lg_tzwin_show
void lg_tzwin_show(LG_TouchZoneWindow *tzwin, lg_tzw_type type)
Definition: lg_ui.c:448
lg_rectangle_to_arrow
void lg_rectangle_to_arrow(Rec2Di r, lg_tzw_type arrow_type, Point2Di *p[])
Definition: lg_ui.c:586
lg_draw_rect_corners
void lg_draw_rect_corners(Rec2Di r, LG_Color_u c, int len)
Definition: lg_ui.c:532
LG_InputState
Definition: lg_ui.h:29
lg_set_special_keys_repeat_delay
void lg_set_special_keys_repeat_delay(uint32_t delay)
Definition: lg_ui.c:743
lg_zero_input_state
void lg_zero_input_state(LG_InputState *u_in)
Definition: lg_ui.c:348
Point2Di
Definition: lg_gr_func.h:15
LG_TZW_Array
Definition: lg_ui.h:104
lg_tzw_array_new
LG_TZW_Array * lg_tzw_array_new()
Definition: lg_ui.c:800
lg_flush_in_clicks
void lg_flush_in_clicks(LG_InputState *in)
Definition: lg_ui.c:901
lg_tzw_array_free
void lg_tzw_array_free(LG_TZW_Array *tzw_array)
Definition: lg_ui.c:891
lg_draw_triangle
void lg_draw_triangle(Rec2Di r, LG_Color_u c, lg_tzw_type type)
Definition: lg_ui.c:709
lg_tzwin_add_to_array
zboolean lg_tzwin_add_to_array(LG_TZW_Array *tzw_array, LG_TouchZoneWindow *tzwin)
Definition: lg_ui.c:819
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:872
lg_input_state_info
void lg_input_state_info(LG_InputState *in)
Definition: lg_ui.c:914
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:373
lg_rec2di_array_from_tzw_array
LG_TZRec_Array lg_rec2di_array_from_tzw_array(LG_TZW_Array *tzw_array)
Definition: lg_ui.c:839
lg_tzw_array_free_all_tzwin
void lg_tzw_array_free_all_tzwin(LG_TZW_Array *tzw_array)
Definition: lg_ui.c:861
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:502
LG_TZRec_Array
Definition: lg_ui.h:109
LG_TouchZoneWindow
Definition: lg_ui.h:78
Rec2Di
Definition: lg_gr_func.h:49