113 lines
2.2 KiB
C
113 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-3.0-only */
|
|
/*
|
|
* Copyright (c) 2024, Richard Acayan. All rights reserved.
|
|
*/
|
|
|
|
#ifndef UFKBD_H
|
|
#define UFKBD_H
|
|
|
|
#include <stdbool.h>
|
|
#include <time.h>
|
|
#include <xkbcommon/xkbcommon.h>
|
|
|
|
#define UFKBD_PRESS_MAX 64
|
|
#define UFKBD_MOD_MAX 4
|
|
|
|
struct ufkbd_ctx;
|
|
struct ufkbd_graphics_ctx;
|
|
struct ufkbd_graphics_driver;
|
|
struct ufkbd_input_driver;
|
|
|
|
// These correspond to the key0..key8 properties in the layout definitions
|
|
enum ufkbd_part {
|
|
UFKBD_PART_CENTER,
|
|
UFKBD_PART_TL,
|
|
UFKBD_PART_TR,
|
|
UFKBD_PART_BL,
|
|
UFKBD_PART_BR,
|
|
UFKBD_PART_LEFT,
|
|
UFKBD_PART_RIGHT,
|
|
UFKBD_PART_TOP,
|
|
UFKBD_PART_BOTTOM,
|
|
UFKBD_PART_MAX
|
|
};
|
|
|
|
enum ufkbd_mod_state {
|
|
UFKBD_MOD_RELEASED,
|
|
UFKBD_MOD_PRESSED,
|
|
UFKBD_MOD_LATCHED,
|
|
UFKBD_MOD_LOCKED,
|
|
};
|
|
|
|
enum ufkbd_modifier {
|
|
UFKBD_MOD_SHIFT,
|
|
UFKBD_MOD_CTRL,
|
|
UFKBD_MOD_ALT,
|
|
};
|
|
|
|
struct ufkbd_key {
|
|
// Graphical parameters
|
|
size_t presses[UFKBD_PART_MAX];
|
|
void *labels_mask[UFKBD_PART_MAX * 2];
|
|
void *labels_color[UFKBD_PART_MAX * 2];
|
|
|
|
int keyids[UFKBD_PART_MAX];
|
|
xkb_keysym_t keysyms[UFKBD_PART_MAX];
|
|
enum ufkbd_part lut[16];
|
|
int latch_state;
|
|
};
|
|
|
|
struct ufkbd_driver {
|
|
void *(*init)(struct ufkbd_ctx *ufkbd);
|
|
void (*uninit)(void *data);
|
|
|
|
// Deprecated
|
|
void (*listen_one)(void *data, bool block);
|
|
|
|
void (*listen_step)(void *data, int timeout);
|
|
int (*send_key)(void *data, int code, bool repeat);
|
|
int (*send_mod)(void *data, enum ufkbd_modifier mod, bool pressed);
|
|
|
|
int (*draw_begin)(void *data, size_t *stride, void **ptr);
|
|
void (*draw_touch)(void *data, int x, int y, int width, int height);
|
|
void (*draw_end)(void *data);
|
|
};
|
|
|
|
struct ufkbd_press {
|
|
struct ufkbd_key *key;
|
|
int xl, xr, yt, yb;
|
|
|
|
struct timespec repeat;
|
|
|
|
// Coordinates of starting and ending position of keypress
|
|
int x1, y1, x2, y2;
|
|
|
|
// Cached section of the key that is pressed
|
|
enum ufkbd_part part;
|
|
};
|
|
|
|
struct ufkbd_ctx {
|
|
struct ufkbd_keymap *keymap;
|
|
struct ufkbd_layout *layout;
|
|
|
|
struct ufkbd_driver *drv;
|
|
void *drv_data;
|
|
|
|
struct ufkbd_graphics_ctx *graphics;
|
|
|
|
// Settings
|
|
int repeat_delay_ns;
|
|
int repeat_interval_ns;
|
|
int dist_squared;
|
|
|
|
uint32_t mods[(UFKBD_MOD_MAX + 15) / 16];
|
|
|
|
size_t n_presses;
|
|
struct ufkbd_press presses[UFKBD_PRESS_MAX];
|
|
|
|
bool terminate;
|
|
};
|
|
|
|
void ufkbd_terminate(struct ufkbd_ctx *ctx);
|
|
|
|
#endif /* UFKBD_H */
|