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 # define WAIT_FOR_PRESS_OR_CLICK_OR_TOUCH {lg_wait_for_finger_down(NULL, NULL);} /* ???? - whatever */
21 #endif
22 
23 #define SPECIAL_KEYS_REPEAT_DELAY 200 /* In ms */
24 
25 /* LPK = Last Pressed_Key */
26 #define LPK_MOUSE_CLICK_ACTIVITY 50000 /* Returned (+ in->tzw_i) by lg_get_user_input() as last pressed key in case of mouse activity */
27 
28 #define LPK_TOUCH_ACTIVITY 100000 /* Returned (+ in->tzw_i) by lg_get_user_input() as last pressed key in case of touch activity */
29 
30 typedef struct {
31  /* Linux */
32  uint8_t arrow_keys_state; /* LEFT, RIGHT, UP, DOWN */
33  zboolean kmod_ctrl;
34  zboolean kmod_shift;
35  zboolean kmod_alt;
36  uint32_t last_pressed_key;
37  /* Android (touchscreen) */
38  lg_finger_down_loc finger_down_loc; /* Logical OR of values */
39  float x;
40  float y;
41  /* Mouse or touchscreen */
42  uint32_t tzw_i; /* Index + 1 of clicked/tapped TZW area in array */
43  /* Cam/object motions and rotations = -1, 0, 1 */
44  int move_forward; /* Z transl */
45  int move_up; /* Y transl - not an aircraft motion */
46  int cam_truck; /* X transl - not an aircraft motion */
47  /* Yaw/Pitch/Roll = -1, 0, 1 */ /* Aircraft/flight simulator standard order */
48  int yaw;
49  int pitch;
50  int roll;
51  /* Orbit cam */
52  int h_orbit;
53  int v_orbit;
54  /* Mouse inputs */
55  zboolean left_click;
56  zboolean right_click;
57  int mouse_x;
58  int mouse_y;
59  int dx;
60  int dy;
61  int dz_wheel; /* Mouse wheel also set move_forward */
62  float thrust;
63  /* Appply for keyboard and mouse */
64  zboolean slow_motion;
66 
67 /*
68  * TZ/tz means Touch Zone (not Time Zone)
69  */
70 typedef enum {
71  TZ_LEFT,
72  TZ_H_CENTER,
73  TZ_RIGHT,
74  TZ_BOTTOM,
75  TZ_V_CENTER,
76  TZ_TOP
77 } lg_touch_zone;
78 
79 typedef struct {
80  LG_Window win;
81  LG_Color_u color;
82  Rec2Di area;
84 
85 #define TZW_ARROW_POINTS_NUM 7
86 
87 typedef enum {
88  TZW_RECTANGLE,
89  TZW_RECT_CORNERS,
90  TZW_ARROW_UP,
91  TZW_ARROW_DOWN,
92  TZW_ARROW_LEFT,
93  TZW_ARROW_RIGHT,
94  TZW_DOUBLE_ARROW_HORIZ,
95  TZW_DOUBLE_ARROW_VERT,
96  TZW_TRIANGLE_LEFT,
97  TZW_TRIANGLE_RIGHT,
98  TZW_TRIANGLE_UP,
99  TZW_TRIANGLE_DOWN
100 } lg_tzw_type;
101 
102 #define N_TZW_MAX 256
103 
104 /* Array of all TZ wins for one frame */
105 typedef struct {
106  LG_TouchZoneWindow *tzw[N_TZW_MAX];
107 } LG_TZW_Array;
108 
109 /* Helper struct to deal with TZ win area rects */
110 typedef struct {
111  Rec2Di *r[N_TZW_MAX];
112  Rec2Di r0[N_TZW_MAX];
114 
115 const char **lg_camcontrols_keys_str();
116 
118 
120 
121 LG_TouchZoneWindow *lg_tzwin_new(const char *, zboolean, LG_Color_u, int, int, TTF_Font *);
122 
123 void lg_tzwin_show(LG_TouchZoneWindow *, lg_tzw_type);
124 
126 
128 
130 
131 void lg_draw_arrow(Rec2Di r, LG_Color_u c, lg_tzw_type);
132 
133 void lg_rectangle_to_arrow(Rec2Di, lg_tzw_type, Point2Di *[]);
134 
135 void lg_draw_triangle(Rec2Di, LG_Color_u, lg_tzw_type);
136 
137 void lg_set_special_keys_repeat_delay(uint32_t);
138 
140 
142 
144 
146 
148 
150 
152 
154 
155 #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:30
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:105
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:110
LG_TouchZoneWindow
Definition: lg_ui.h:79
Rec2Di
Definition: lg_gr_func.h:49