25#ifndef BACKENDS_GP_BACKEND_H
26#define BACKENDS_GP_BACKEND_H
34#include <input/gp_ev_queue.h>
35#include <input/gp_task.h>
37#include <backends/gp_types.h>
39enum gp_backend_attrs {
45 GP_BACKEND_FULLSCREEN,
48enum gp_backend_cursors {
50 GP_BACKEND_CURSOR_ARROW,
52 GP_BACKEND_CURSOR_TEXT_EDIT,
54 GP_BACKEND_CURSOR_CROSSHAIR,
56 GP_BACKEND_CURSOR_HAND,
58 GP_BACKEND_CURSOR_MAX,
61 GP_BACKEND_CURSOR_SHOW = 0xc000,
63 GP_BACKEND_CURSOR_HIDE = 0x8000,
83 void (*flip)(gp_backend *self);
93 void (*update_rect)(gp_backend *self,
106 int (*set_attr)(gp_backend *self,
enum gp_backend_attrs attr,
112 int (*set_cursor)(gp_backend *self,
enum gp_backend_cursors cursor);
119 int (*resize_ack)(gp_backend *self);
124 void (*exit)(gp_backend *self);
132 void (*poll)(gp_backend *self);
137 int (*clipboard)(gp_backend *self, gp_clipboard *op);
149 void (*wait)(gp_backend *self);
157 gp_ev_queue *event_queue;
163 gp_task_queue *task_queue;
170 gp_dlist input_drivers;
172 void *clipboard_data;
183#define GP_BACKEND_PRIV(backend) ((void*)(backend)->priv)
185static inline void gp_backend_flip(gp_backend *self)
191void gp_backend_update_rect_xyxy(gp_backend *self,
195static inline void gp_backend_update_rect(gp_backend *self,
199 return gp_backend_update_rect_xyxy(self, x0, y0, x1, y1);
202static inline void gp_backend_update_rect_xywh(gp_backend *self,
206 gp_backend_update_rect_xyxy(self, x, y, x + w - 1, y + h - 1);
209static inline void gp_backend_poll_add(gp_backend *self,
gp_fd *fd)
214static inline void gp_backend_poll_rem(gp_backend *self,
gp_fd *fd)
219static inline gp_fd *gp_backend_poll_rem_by_fd(gp_backend *self,
int fd)
224static inline int gp_backend_cursor_set(gp_backend *self,
enum gp_backend_cursors cursor)
226 if (self->set_cursor)
227 return self->set_cursor(self, cursor);
232void gp_backend_exit(gp_backend *self);
237void gp_backend_poll(gp_backend *self);
242gp_event *gp_backend_poll_event(gp_backend *self);
247void gp_backend_wait(gp_backend *self);
252gp_event *gp_backend_wait_event(gp_backend *self);
262void gp_backend_add_timer(gp_backend *self,
gp_timer *timer);
267void gp_backend_rem_timer(gp_backend *self,
gp_timer *timer);
272static inline unsigned int gp_backend_timers_in_queue(gp_backend *self)
281int gp_backend_timer_timeout(gp_backend *self);
288static inline int gp_backend_set_caption(gp_backend *backend,
291 if (!backend->set_attr)
294 return backend->set_attr(backend, GP_BACKEND_TITLE, caption);
307int gp_backend_resize(gp_backend *backend, uint32_t w, uint32_t h);
317static inline int gp_backend_fullscreen(gp_backend *backend,
int val)
319 if (!backend->set_attr)
322 return backend->set_attr(backend, GP_BACKEND_FULLSCREEN, &val);
336int gp_backend_resize_ack(gp_backend *self);
347void gp_backend_task_ins(gp_backend *self, gp_task *task);
355void gp_backend_task_rem(gp_backend *self, gp_task *task);
367void gp_backend_task_queue_set(gp_backend *self, gp_task_queue *task_queue);
372static inline unsigned int gp_backend_events(gp_backend *self)
374 return gp_ev_queue_events(self->event_queue);
377static inline gp_event *gp_backend_get_event(gp_backend *self)
379 return gp_ev_queue_get(self->event_queue);
382static inline gp_event *gp_backend_peek_event(gp_backend *self)
384 return gp_ev_queue_peek(self->event_queue);
387static inline void gp_backend_put_event_back(gp_backend *self, gp_event *ev)
389 gp_ev_queue_put_back(self->event_queue, ev);
int gp_coord
Integer type for coordinates i.e. x, y, ...
unsigned int gp_size
Integer type for sizes i.e. w, h, ...
A linked list implementation.
int gp_poll_add(gp_poll *self, gp_fd *fd)
Adds a file descriptor.
gp_fd * gp_poll_rem_by_fd(gp_poll *self, int fd)
Looks up and removes a gp_fd by a fd.
int gp_poll_rem(gp_poll *self, gp_fd *fd)
Removes a file descriptor.
Timers and timer queue implementation.
static unsigned int gp_timer_queue_size(gp_timer *queue)
Returns size of the queue, i.e. number of timers.
An epoll file descriptor.