GFXprim
2D bitmap graphics library with emphasis on speed and correctness
Loading...
Searching...
No Matches
gp_event.h
1// SPDX-License-Identifier: LGPL-2.1-or-later
2/*
3 * Copyright (C) 2009-2021 Cyril Hrubis <metan@ucw.cz>
4 */
5
6/*
7
8 Gfxprim event layer.
9
10 Events are lowlevel interface to input devices (human interface).
11
12 - Events are notifications that something has changed, eg. button pressed
13
14 */
15
16#ifndef INPUT_GP_EVENT_H
17#define INPUT_GP_EVENT_H
18
19#include <stdint.h>
20#include <string.h>
21
22#include <input/gp_types.h>
23#include <input/gp_keys.h>
24#include <input/gp_event_keys.h>
25
26enum gp_event_type {
27 GP_EV_KEY = 1, /* key/button press event */
28 GP_EV_REL = 2, /* relative event */
29 GP_EV_ABS = 3, /* absolute event */
30 GP_EV_SYS = 4, /* system events window close, resize... */
31 GP_EV_TMR = 5, /* timer expired event */
32 GP_EV_UTF = 6, /* unicode character typed on a keyboard */
33 GP_EV_MAX = 6, /* maximum, greater values are free */
34};
35
36enum gp_event_key_code {
37 GP_EV_KEY_UP = 0,
38 GP_EV_KEY_DOWN = 1,
39 GP_EV_KEY_REPEAT = 2,
40};
41
42enum gp_event_rel_code {
43 GP_EV_REL_POS = 0,
44 GP_EV_REL_WHEEL = 8,
45};
46
47enum gp_event_abs_code {
48 GP_EV_ABS_POS = 0,
49};
50
51enum gp_event_sys_code {
52 GP_EV_SYS_QUIT = 0,
53 GP_EV_SYS_RESIZE = 1,
54 /* clipboard request is ready */
55 GP_EV_SYS_CLIPBOARD = 2,
56};
57
58struct gp_ev_pos_rel {
59 int32_t rx;
60 int32_t ry;
61};
62
63struct gp_ev_pos_abs {
64 uint32_t x, x_max; /* the x is between 0 and x_max */
65 uint32_t y, y_max;
66 uint32_t pressure, pressure_max;
67};
68
69struct gp_ev_key {
70 uint32_t key;
71};
72
73struct gp_ev_sys {
74 uint32_t w, h;
75};
76
77struct gp_ev_utf {
78 uint32_t ch;
79};
80
81#define GP_EVENT_KEY_BITMAP_BYTES 56
82
83struct gp_events_state {
85 uint8_t keys_pressed[GP_EVENT_KEY_BITMAP_BYTES];
86
88 uint32_t cursor_x;
89 uint32_t cursor_y;
90
91 uint32_t saved_cursor_x;
92 uint32_t saved_cursor_y;
93};
94
95struct gp_event {
97 uint16_t type;
99 uint16_t code;
100 union {
101 /* generic one integer value */
102 int32_t val;
103 /* key */
104 struct gp_ev_key key;
105 /* position */
106 struct gp_ev_pos_rel rel;
107 struct gp_ev_pos_abs abs;
108 /* system event */
109 struct gp_ev_sys sys;
110 struct gp_ev_utf utf;
111 /* timer event */
112 gp_timer *tmr;
113 };
114
115 /* event timestamp */
116 uint64_t time;
117
119 struct gp_events_state *st;
120};
121
125static inline int gp_ev_utf_is_ctrl(gp_event *ev)
126{
127 return ev->utf.ch < 0x20 && ev->utf.ch != 0x7f;
128}
129
130/*
131 * Helpers for setting/getting key bits.
132 */
133static inline void gp_events_state_press(gp_events_state *self, uint32_t key)
134{
135 if (key >= GP_EVENT_KEY_BITMAP_BYTES * 8)
136 return;
137
138 self->keys_pressed[(key)/8] |= 1<<((key)%8);
139}
140
141static inline int gp_events_state_pressed(gp_events_state *self, uint32_t key)
142{
143 if (key >= GP_EVENT_KEY_BITMAP_BYTES * 8)
144 return 0;
145
146 return !!(self->keys_pressed[(key)/8] & (1<<((key)%8)));
147}
148
149static inline void gp_events_state_release(gp_events_state *self, uint32_t key)
150{
151 if (key >= GP_EVENT_KEY_BITMAP_BYTES * 8)
152 return;
153
154 self->keys_pressed[(key)/8] &= ~(1<<((key)%8));
155}
156
157static inline void gp_events_state_release_all(gp_events_state *self)
158{
159 memset(self->keys_pressed, 0, sizeof(self->keys_pressed));
160}
161
162static inline int gp_ev_key_pressed(gp_event *ev, uint32_t key)
163{
164 if (!ev->st)
165 return 0;
166
167 return gp_events_state_pressed(ev->st, key);
168}
169
170#define gp_ev_any_key_pressed(ev, ...) gp_ev_any_key_pressed_(ev, __VA_ARGS__, 0)
171#define gp_ev_all_keys_pressed(ev, ...) gp_ev_all_keys_pressed_(ev, __VA_ARGS__, 0)
172
176int gp_ev_any_key_pressed_(gp_event *ev, ...);
177
181int gp_ev_all_keys_pressed_(gp_event *ev, ...);
182
183/*
184 * Dumps event into stdout.
185 */
186void gp_ev_dump(gp_event *ev);
187
188#endif /* INPUT_GP_EVENT_H */
A timer.
Definition gp_timer.h:26