wvkbd/keyboard.h
2021-10-19 23:12:01 -07:00

126 lines
3.6 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;
uint8_t mods;
uint8_t compose;
struct key *last_press;
struct layout *prevlayout;
size_t layer_index;
struct layout *layouts;
enum layout_id *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(const char *name, uint32_t comp_unichr,
uint32_t comp_shift_unichr);
#ifndef LAYOUT
#error "make sure to define LAYOUT"
#endif
#include LAYOUT
#endif