mirror of
https://github.com/jjsullivan5196/wvkbd.git
synced 2025-03-12 18:32:48 +01:00
128 lines
3.7 KiB
C
128 lines
3.7 KiB
C
#ifndef __KEYBOARD_H
|
|
#define __KEYBOARD_H
|
|
|
|
#include "drw.h"
|
|
|
|
#define MAX_LAYERS 25
|
|
|
|
enum key_type;
|
|
enum key_modifier_type;
|
|
struct clr_scheme;
|
|
struct key;
|
|
struct layout;
|
|
struct kbd;
|
|
|
|
enum key_type {
|
|
Pad = 0, // Padding, not a pressable key
|
|
Code, // A normal key emitting a keycode
|
|
Mod, // A modifier key
|
|
Copy, // Copy key, copies the unicode value specified in code (creates and
|
|
// activates temporary keymap)
|
|
// used for keys that are not part of the keymap
|
|
Layout, // Layout switch to a specific layout
|
|
BackLayer, // Layout switch to the layout that was previously active
|
|
NextLayer, // Layout switch to the next layout in the layers sequence
|
|
Compose, // Compose modifier key, switches to a specific associated layout
|
|
// upon next keypress
|
|
EndRow, // Incidates the end of a key row
|
|
Last, // Indicated the end of a layout
|
|
};
|
|
|
|
/* Modifiers passed to the virtual_keyboard protocol. They are based on
|
|
* wayland's wl_keyboard, which doesn't document them.
|
|
*/
|
|
enum key_modifier_type {
|
|
NoMod = 0,
|
|
Shift = 1,
|
|
CapsLock = 2,
|
|
Ctrl = 4,
|
|
Alt = 8,
|
|
Super = 64,
|
|
AltGr = 128,
|
|
};
|
|
|
|
struct clr_scheme {
|
|
Color fg;
|
|
Color bg;
|
|
Color high;
|
|
Color text;
|
|
};
|
|
|
|
struct key {
|
|
const char *label; // primary label
|
|
const char *shift_label; // secondary label
|
|
const double width; // relative width (1.0)
|
|
const enum key_type type;
|
|
|
|
const uint32_t
|
|
code; /* code: key scancode or modifier name (see
|
|
* `/usr/include/linux/input-event-codes.h` for scancode names, and
|
|
* `keyboard.h` for modifiers)
|
|
* XKB keycodes are +8 */
|
|
struct layout *layout; // pointer back to the parent layout that holds this
|
|
// key
|
|
const uint32_t code_mod; /* modifier to force when this key is pressed */
|
|
uint8_t scheme; // index of the scheme to use
|
|
bool reset_mod; /* reset modifiers when clicked */
|
|
|
|
// actual coordinates on the surface (pixels), will be computed automatically
|
|
// for all keys
|
|
uint32_t x, y, w, h;
|
|
};
|
|
|
|
struct layout {
|
|
struct key *keys;
|
|
const char *keymap_name;
|
|
const char *name;
|
|
uint32_t keyheight; // absolute height (pixels)
|
|
};
|
|
|
|
struct kbd {
|
|
bool debug;
|
|
|
|
struct layout *layout;
|
|
struct clr_scheme scheme;
|
|
struct clr_scheme scheme1;
|
|
|
|
bool print;
|
|
uint32_t w, h, s;
|
|
bool landscape;
|
|
uint8_t mods;
|
|
uint8_t compose;
|
|
struct key *last_press;
|
|
struct layout *prevlayout;
|
|
size_t layer_index;
|
|
|
|
struct layout *layouts;
|
|
enum layout_id *layers;
|
|
enum layout_id *landscape_layers;
|
|
|
|
struct drwsurf *surf;
|
|
struct zwp_virtual_keyboard_v1 *vkbd;
|
|
};
|
|
|
|
void draw_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width,
|
|
uint32_t height, uint32_t border, Color color);
|
|
|
|
void kbd_init(struct kbd *kb, struct layout *layouts, char *layer_names_list);
|
|
void kbd_init_layout(struct layout *l, uint32_t width, uint32_t height);
|
|
struct key *kbd_get_key(struct kbd *kb, uint32_t x, uint32_t y);
|
|
void kbd_unpress_key(struct kbd *kb, uint32_t time);
|
|
void kbd_press_key(struct kbd *kb, struct key *k, uint32_t time);
|
|
void kbd_print_key_stdout(struct kbd *kb, struct key *k);
|
|
void kbd_draw_key(struct kbd *kb, struct key *k, bool pressed);
|
|
void kbd_draw_layout(struct kbd *kb);
|
|
void kbd_resize(struct kbd *kb, struct layout *layouts, uint8_t layoutcount);
|
|
uint8_t kbd_get_rows(struct layout *l);
|
|
double kbd_get_row_length(struct key *k);
|
|
void kbd_switch_layout(struct kbd *kb, struct layout *l);
|
|
|
|
void create_and_upload_keymap(struct kbd *kb, const char *name,
|
|
uint32_t comp_unichr, uint32_t comp_shift_unichr);
|
|
|
|
#ifndef LAYOUT
|
|
#error "make sure to define LAYOUT"
|
|
#endif
|
|
#include LAYOUT
|
|
#endif
|