46 Commits
v0.7 ... v0.10

Author SHA1 Message Date
acf38cf46e Add a --list-layers option
To get a list of available layers for the -l option.

Signed-off-by: Emmanuel LE TRONG <emmanuel.le-trong@cnrs-orleans.fr>
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-08-16 17:29:50 +02:00
7af52d695d version bump 2022-07-27 18:41:48 +02:00
f446bf9147 fixup: code indentation fixes after last patch 2022-07-27 18:39:11 +02:00
e29b029308 add: args to customize keyboard colors (takes rrggbb or rrggbbaa values) add: function to set keyboard colors from rrggbb or rrggbbaa values fix: handle empty font arg
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-27 18:30:11 +02:00
12c0d67f41 version bump prior to release 2022-07-26 22:04:22 +02:00
5de2fcc39d fix: arabic key layout
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-25 10:54:20 +02:00
a10b504cda allow modifiers with next layer button to switch to first/previous layer
- shift (or capslock) switch to the previous layer in the defined order
- control, alt or compose resets the view to the first layer

related fix: compose key resets on layer switch (doesn't stick now)
2022-07-15 22:03:27 +02:00
14f0f0824b shift key: change icon when shifted
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-10 22:57:55 +02:00
f9bf42129a border: display around all sides
(not just top and left edges)

Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-10 22:52:22 +02:00
0cd0d5e1a1 layout: Implement spacing better
to no longer need overscan

Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-10 22:52:22 +02:00
1843e60a74 only commit surface when it changed
Previously wvkbd would commit an (usually) unchanged surface at the
framerate of the compositor, this only commits the buffer when we render
something new.

Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-05 22:13:21 +02:00
a2cacb7e25 use signalfd instead of signal
Switch to using signalfds because using the signal syscall was causing
problems without the frame callbacks (the change in the next commit), I
think this is because it would end up with multiple tasks polling the
same wayland file descriptor.

Previously this would exit after the second SIGPIPE signal. I checked
with earboxer on irc, and confirmed that handling all occurrences is the
correct behavior.

Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-05 22:12:54 +02:00
dbe1e01fe9 call show instead of duplicating in startshidden check
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-05 22:12:48 +02:00
c1b95f2700 reset layer index on rotation
If there are more layers in one orientation than the other this can
cause wvkbd to overshoot the end of the layer list when switching
layers. It also means that switching layers after rotating will jump to
the next layer in the list, which is somewhat unexpected.

Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-05 18:08:14 +02:00
9d6696fb23 call kbd_resize when showing
Since layer_surface_configure was changed to only call kbd_resize when
an output dimension changed, kbd_resize doesn't get called if the
keyboard was hidden and is being shown again, meaning it doesn't tell
the compositor about the scale.

This causes it to only output the top-right quarter of the keybaord
stretched to the entire window size after a SIGUSR1 + SIGUSR2 cycle with
the display scale set to 2.

Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-05 18:08:06 +02:00
f540cf36fa Use output dimensions to detect landscape mode
Most displays are in landscape mode by default, so checking to see if
it's rotated will produce the exact opposite of the expected results.

Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-07-05 18:08:02 +02:00
b974877be4 Add + sign in dialer. 2022-07-05 06:39:23 -05:00
6d34f5af59 version bump 2022-06-25 15:21:43 +02:00
22ff01fb8b Keyboard: Avoid unnecessary resizes
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-06-25 15:19:33 +02:00
28c24749ba version bump: previous version had Makefile issues 2022-06-17 20:48:08 +02:00
cc73ab2c7c Makefile: fix for installing man pages 2022-06-17 20:47:15 +02:00
97fad52ee9 version bump 2022-06-17 19:54:31 +02:00
c3afabcdce Added manpage to Makefile and updated manpage 2022-06-17 19:52:23 +02:00
cc81e74997 version bump 2022-06-14 00:23:11 +02:00
11d6924a13 Draw compose key as pressed when compose is enabled
Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-06-14 00:21:28 +02:00
7be30a6a56 Check for surface in display_handle_geometry
Fixes #23

Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
2022-06-14 00:10:31 +02:00
94ca075563 reran clang-format 2022-06-13 23:05:14 +02:00
88bbdb0c64 Add some math and punctiation symbols from simple grid 2022-06-13 22:47:25 +02:00
6ab0361d80 Replace , to - in simple layout 2022-06-13 22:47:13 +02:00
c8bd29ecd1 Use a simple transparency value 2022-06-13 22:42:13 +02:00
aa258a01dd Reverse nav backspace and whitespace 2022-06-13 22:41:52 +02:00
e6c7d0ff2a main.c: add a real-time signal for toggling visibility of the keyboard
Previously it was only possible to either show or hide the keyboard.
When you want to control the keyboard with a single button in, i.e.
a window manager, this requires a separate script to keep track of
state. This solves this by only needing one signal to toggle.

Since there are only 2 USR signals, I had to use real-time signals,
which are in the [POSIX
standard](https://standards.ieee.org/standard/1003_1b-1993.html) and
available in the [Linux kernel since
2.2](https://www.man7.org/linux/man-pages/man7/signal.7.html).
2022-06-13 22:18:03 +02:00
07b9f293c0 Add documentation for using the real-time signal 2022-06-13 22:17:15 +02:00
1b7f5c4968 Change in maintainership: support both sourcehut and the original github 2022-06-13 22:00:11 +02:00
0a680c0a7a More symbols and layout improvement 2022-06-13 21:58:26 +02:00
a8ba3c02a9 Modern Greek keyboard added 2022-06-13 21:58:19 +02:00
b77f0582fc Add Persian layout 2022-06-13 21:58:09 +02:00
35ac0d1d72 Include LDFLAGS from the environment
While working on packageing wvkbd for the aur, I got a warning from
namcap (an arch package verification tool) that RELRO wasn't enabled.
From what I can tell, this is because make was ignoring the LDFLAGS set
by makepkg.
2022-06-13 21:57:55 +02:00
718d2bdff3 update README.md 2022-06-13 21:57:43 +02:00
fc0da6aa18 add man page 2022-06-13 21:57:10 +02:00
c27f876634 main: prevent crash on sigpipe
This is commonly caused by a bad program in the output chain, e.g.

wvkbd -O | false
2022-06-13 21:56:49 +02:00
f74fe9a182 layout.mobintl.h: fix hungarian ő and Ő characters
Before this, the bigger one was typed for pressing the smaller,
and vica versa.
2022-06-13 21:56:35 +02:00
de4b4dcd2e layout.mobintl.h: fix same big/little issue for ų 2022-06-13 21:56:23 +02:00
849f4600e9 project: rerun clang-format
TODO make a commit or PR hook for this
2022-06-13 21:55:47 +02:00
78d2667818 config: update version number 2022-06-13 21:55:32 +02:00
905a0d100a version: Output newline 2022-06-13 21:55:15 +02:00
11 changed files with 3504 additions and 200 deletions

View File

@ -3,6 +3,7 @@ include config.mk
NAME=wvkbd
BIN=${NAME}-${LAYOUT}
SRC=.
MAN1 = ${NAME}.1
PKGS = wayland-client xkbcommon pangocairo
@ -11,7 +12,7 @@ WVKBD_HEADERS += $(wildcard $(SRC)/*.h)
CFLAGS += -std=gnu99 -Wall -g -DWITH_WAYLAND_SHM -DLAYOUT=\"layout.${LAYOUT}.h\" -DKEYMAP=\"keymap.${LAYOUT}.h\"
CFLAGS += $(shell pkg-config --cflags $(PKGS))
LDFLAGS =$(shell pkg-config --libs $(PKGS)) -lm -lutil -lrt
LDFLAGS += $(shell pkg-config --libs $(PKGS)) -lm -lutil -lrt
WAYLAND_HEADERS = $(wildcard proto/*.xml)
@ -47,3 +48,6 @@ install: all
mkdir -p ${DESTDIR}${PREFIX}/bin
cp -f ${NAME}-${LAYOUT} ${DESTDIR}${PREFIX}/bin
chmod 755 ${DESTDIR}${PREFIX}/bin/${NAME}-${LAYOUT}
mkdir -p "${DESTDIR}${MANPREFIX}/man1"
sed "s/VERSION/${VERSION}/g" < ${MAN1} > ${DESTDIR}${MANPREFIX}/man1/${MAN1}
chmod 644 ${DESTDIR}${MANPREFIX}/man1/${MAN1}

View File

@ -21,7 +21,7 @@ new features.
- Support for 'Copy' keys which are not on the keymap
- Emoji support
- Compose key for character variants (e.g. diacritics)
- Show/hide keyboard on signals (SIGUSR1 = hide, SIGUSR2 = show)
- Show/hide keyboard on signals (SIGUSR1 = hide, SIGUSR2 = show, SIGRTMIN = toggle)
- Automatic portrait/landscape detection and subsequent layout switching
@ -37,7 +37,8 @@ There are some areas that still need work:
You'll need the following developer packages
- pangocairo
- cairo
- pango
- wayland-client
- xkbcommon
@ -46,7 +47,7 @@ Make any customizations you would like in `config.def.h` and run `make`
The default set of layouts is called `mobintl` *(mobile international)*, which groups various layouts aimed at mobile devices
and also attempts to accommodate various international users. The resulting binary is called `wvkbd-mobintl`.
You can, however, define your own layouts by copying and and modifying `layout.mobintl.h` and `keymap.mobintl.h`
You can, however, define your own layouts by copying and modifying `layout.mobintl.h` and `keymap.mobintl.h`
(replace `mobintl` for something like `yourlayout`). Then make your layout set using `make LAYOUT=yourlayout`, and
the resulting binary will be `wvkbd-yourlayout`
@ -59,8 +60,8 @@ want a subset of the available layers, you can define which wants you want and i
them using the `-l` parameter. This takes takes a ordered comma separated list of
layout names that are defined in your layout set.
The keyboard can be hidden by sending it a `SIGUSR1` signal and shown again by sending it `SIGUSR2`. This saves some
start up time and may be appropriate in some low-resource environments.
The keyboard can be hidden by sending it a `SIGUSR1` signal, shown again by sending it `SIGUSR2` or toggled by sending it `SIGRTMIN`.
This saves some start up time and may be appropriate in some low-resource environments.
Wvkbd has an output mode `-o` that will echo its output to standard output. This facility can be used if users want
audio/haptic feedback, a feature explicitly out of scope for wvkbd. To achieve this, simply pipe wvkbd's output through the external tool
@ -75,11 +76,17 @@ Another output mode, `-O` will let the keyboard output keys which are swiped ove
## Contribute
Any contributions are welcome, please tell me what I did wrong in issues or
PRs. I could also use some nice branding if that tickles your fancy.
Any contributions are welcome, there are two ways to contribute, the first one is **preferred**:
For code contributions, all I ask for now is you run `make format` (requires
`clang-format`) before opening a PR and include as much relevant detail as
1. [Sourcehut](https://git.sr.ht/~proycon/wvkbd) - Submit your patches using `git mail` to [~mil/sxmo-devel@lists.sr.ht](mailto:~mil/sxmo-devel@lists.sr.ht), follow [these contribution guidelines](https://sxmo.org/contribute/). Questions can also be asked on Sxmo's [mailing lists](https://sxmo.org/support/).
2. [Github](https://github.com/jjsullivan5196/wvkbd/) - Submit a pull request or open an issue *(legacy method)*
This project was started by [John Sullivan](https://jsullivan.cc/) and is
currently being maintained by the [Sxmo](https://sxmo.org) project, whose
maintainers will ensure both git remotes are kept in sync at all times.
For code contributions, please run `make format` (requires `clang-format`)
before sending a patch (opening a PR) and include as much relevant detail as
possible.
## Related projects

View File

@ -2,20 +2,21 @@
#define config_def_h_INCLUDED
static const char *default_font = "Monospace 14";
static const int transparency = 225;
struct clr_scheme scheme = {
/* colors */
.bg = {.bgra = {15, 15, 15, 225}},
.fg = {.bgra = {45, 45, 45, 225}},
.high = {.bgra = {100, 100, 100, 225}},
.bg = {.bgra = {15, 15, 15, transparency}},
.fg = {.bgra = {45, 45, 45, transparency}},
.high = {.bgra = {100, 100, 100, transparency}},
.swipe = {.bgra = {100, 255, 100, 64}},
.text = {.color = UINT32_MAX},
};
struct clr_scheme scheme1 = {
/* colors */
.bg = {.bgra = {15, 15, 15, 225}},
.fg = {.bgra = {32, 32, 32, 225}},
.high = {.bgra = {100, 100, 100, 225}},
.bg = {.bgra = {15, 15, 15, transparency}},
.fg = {.bgra = {32, 32, 32, transparency}},
.high = {.bgra = {100, 100, 100, transparency}},
.swipe = {.bgra = {100, 255, 100, 64}},
.text = {.color = UINT32_MAX},
};
@ -23,14 +24,15 @@ struct clr_scheme scheme1 = {
/* layers is an ordered list of layouts, used to cycle through */
static enum layout_id layers[] = {
Full, // First layout is the default layout on startup
Special, Emoji, Simple, SimpleGrid, Nav, Dialer, Cyrillic, Arabic, Georgian,
Special, Emoji, Simple, SimpleGrid, Nav, Dialer,
Cyrillic, Arabic, Persian, Greek, Georgian,
NumLayouts // signals the last item, may not be omitted
};
/* layers is an ordered list of layouts, used to cycle through */
static enum layout_id landscape_layers[] = {
Landscape, // First layout is the default layout on startup
Special, Emoji, Nav,
Special, Emoji, Nav, Greek,
NumLayouts // signals the last item, may not be omitted
};

View File

@ -1,3 +1,5 @@
VERSION = 0.2
VERSION = 0.10
CFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=700
PREFIX = /usr/local
MANPREFIX = ${PREFIX}/share/man
LAYOUT = mobintl

19
drw.c
View File

@ -20,30 +20,12 @@ drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, uint32_t s) {
setup_buffer(ds);
}
static void surface_frame_callback(void *data, struct wl_callback *cb,
uint32_t time);
static struct wl_callback_listener frame_listener = {.done =
surface_frame_callback};
void
drwsurf_flip(struct drwsurf *ds) {
ds->cb = wl_surface_frame(ds->surf);
wl_callback_add_listener(ds->cb, &frame_listener, (void *)ds);
wl_surface_attach(ds->surf, ds->buf, 0, 0);
wl_surface_commit(ds->surf);
}
void
surface_frame_callback(void *data, struct wl_callback *cb, uint32_t time) {
struct drwsurf *ds = (struct drwsurf *)data;
wl_callback_destroy(cb);
ds->cb = NULL;
drwsurf_flip(ds);
}
void
drw_draw_text(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
uint32_t w, uint32_t h, const char *label) {
@ -85,7 +67,6 @@ drw_do_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
color.bgra[0] / (double)255, color.bgra[3] / (double)255);
cairo_fill(d->cairo);
cairo_restore(d->cairo);
wl_surface_damage(d->surf, x, y, w, h);

1
drw.h
View File

@ -15,7 +15,6 @@ struct drwsurf {
struct wl_surface *surf;
struct wl_buffer *buf;
struct wl_shm *shm;
struct wl_callback *cb;
unsigned char *pool_data;
cairo_t *cairo;

View File

@ -122,16 +122,23 @@ kbd_init_layout(struct layout *l, uint32_t width, uint32_t height) {
struct key *k = l->keys;
double rowlength = kbd_get_row_length(k);
double rowwidth = 0.0;
while (k->type != Last) {
if (k->type == EndRow) {
y += l->keyheight;
x = 0;
rowwidth = 0.0;
rowlength = kbd_get_row_length(k + 1);
} else if (k->width > 0) {
k->x = x;
k->y = y;
k->w = ((double)width / rowlength) * k->width;
x += k->w;
rowwidth += k->width;
if (x < (rowwidth / rowlength) * (double)width) {
k->w++;
x++;
}
}
k->h = l->keyheight;
k++;
@ -166,17 +173,17 @@ kbd_get_key(struct kbd *kb, uint32_t x, uint32_t y) {
void
kbd_unpress_key(struct kbd *kb, uint32_t time) {
bool unlatch_shift = false;
bool unlatch_shift = false;
if (kb->last_press) {
unlatch_shift = (kb->mods & Shift) == Shift;
unlatch_shift = (kb->mods & Shift) == Shift;
if (unlatch_shift) {
kb->mods ^= Shift;
zwp_virtual_keyboard_v1_modifiers(kb->vkbd, kb->mods, 0, 0, 0);
}
if (unlatch_shift) {
kb->mods ^= Shift;
zwp_virtual_keyboard_v1_modifiers(kb->vkbd, kb->mods, 0, 0, 0);
}
if (kb->last_press->type == Copy) {
if (kb->last_press->type == Copy) {
zwp_virtual_keyboard_v1_key(kb->vkbd, time, 127, // COMP key
WL_KEYBOARD_KEY_STATE_RELEASED);
} else {
@ -190,14 +197,15 @@ kbd_unpress_key(struct kbd *kb, uint32_t time) {
} else if (unlatch_shift) {
kbd_draw_layout(kb);
} else {
kbd_draw_key(kb, kb->last_press, Unpress);
}
kbd_draw_key(kb, kb->last_press, Unpress);
}
kb->last_press = NULL;
}
}
void kbd_release_key(struct kbd *kb, uint32_t time) {
void
kbd_release_key(struct kbd *kb, uint32_t time) {
kbd_unpress_key(kb, time);
if (kb->print_intersect && kb->last_swipe) {
printf("\n");
@ -206,9 +214,12 @@ void kbd_release_key(struct kbd *kb, uint32_t time) {
kbd_draw_layout(kb);
kb->last_swipe = NULL;
}
drwsurf_flip(kb->surf);
}
void kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y) {
void
kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y) {
// Output intersecting keys
// (for external 'swiping'-based accelerators).
if (kb->print_intersect) {
@ -220,7 +231,7 @@ void kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y) {
struct key *intersect_key;
intersect_key = kbd_get_key(kb, x, y);
if (intersect_key &&
(! kb->last_swipe || intersect_key->label != kb->last_swipe->label)) {
(!kb->last_swipe || intersect_key->label != kb->last_swipe->label)) {
kbd_print_key_stdout(kb, intersect_key);
kb->last_swipe = intersect_key;
kbd_draw_key(kb, kb->last_swipe, Swipe);
@ -228,12 +239,14 @@ void kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y) {
} else {
kbd_unpress_key(kb, time);
}
drwsurf_flip(kb->surf);
}
void
kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
if ((kb->compose == 1) && (k->type != Compose) && (k->type != Mod) &&
(k->layout)) {
if ((kb->compose == 1) && (k->type != Compose) && (k->type != Mod) &&
(k->type != NextLayer) && (k->layout)) {
kb->compose++;
if (kb->debug)
fprintf(stderr, "showing compose %d\n", kb->compose);
@ -295,8 +308,30 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
}
break;
case NextLayer:
// switch to the next layout in the layer sequence
kb->layer_index++;
if ((kb->mods & Ctrl) || (kb->mods & Alt) || (kb->mods & AltGr) || ((bool)kb->compose)) {
// with modifiers: switch to the first layer
kb->layer_index = 0;
kb->mods = 0;
} else if ((kb->mods & Shift) || (kb->mods & CapsLock)) {
// with modifiers: switch to the previous layout in the layer sequence
if (kb->layer_index > 0) {
kb->layer_index--;
} else {
size_t layercount = 0;
for (size_t i = 0; layercount == 0; i++) {
if (kb->landscape) {
if (kb->landscape_layers[i] == NumLayouts) layercount = i;
} else {
if (kb->layers[i] == NumLayouts) layercount = i;
}
}
kb->layer_index = layercount - 1;
}
kb->mods = 0;
} else {
// normal behaviour: switch to the next layout in the layer sequence
kb->layer_index++;
}
enum layout_id layer;
if (kb->landscape) {
layer = kb->landscape_layers[kb->layer_index];
@ -311,6 +346,10 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
layer = kb->layers[kb->layer_index];
}
}
if ((bool)kb->compose) {
kb->compose = 0;
kbd_draw_key(kb, k, Unpress);
}
kbd_switch_layout(kb, &kb->layouts[layer]);
break;
case BackLayer:
@ -334,6 +373,8 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) {
default:
break;
}
drwsurf_flip(kb->surf);
}
void
@ -411,7 +452,8 @@ kbd_draw_layout(struct kbd *kb) {
next_key++;
continue;
}
if (next_key->type == Mod && kb->mods & next_key->code) {
if ((next_key->type == Mod && kb->mods & next_key->code) ||
(next_key->type == Compose && kb->compose)) {
kbd_draw_key(kb, next_key, Press);
} else {
kbd_draw_key(kb, next_key, Unpress);
@ -437,14 +479,14 @@ kbd_resize(struct kbd *kb, struct layout *layouts, uint8_t layoutcount) {
void
draw_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width,
uint32_t height, uint32_t border, Color color) {
drw_fill_rectangle(ds, color, x + border, y + border, width - border,
height - border);
drw_fill_rectangle(ds, color, x + border, y + border, width - (border * 2),
height - (border * 2));
}
void
draw_over_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width,
uint32_t height, uint32_t border, Color color) {
drw_over_rectangle(ds, color, x + border, y + border, width - border,
height - border);
drw_over_rectangle(ds, color, x + border, y + border, width - (border * 2),
height - (border * 2));
}
void

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,12 @@
/* constants */
/* how tall the keyboard should be by default (can be overriden) */
#define KBD_PIXEL_HEIGHT 240
/* how tall the keyboard should be by default (can be overriden) */
#define KBD_PIXEL_LANDSCAPE_HEIGHT 120
/* if your layout leaves an empty margin, increase this to fix it */
#define KBD_PIXEL_OVERSCAN_WIDTH 5
/* spacing between keys */
#define KBD_KEY_BORDER 2
/* spacing around each key */
#define KBD_KEY_BORDER 1
/* layout declarations */
enum layout_id {
@ -21,6 +17,8 @@ enum layout_id {
Dialer,
Cyrillic,
Arabic,
Persian,
Greek,
Georgian,
Emoji,
Nav,
@ -67,18 +65,19 @@ enum layout_id {
};
static struct key keys_full[], keys_special[], keys_simple[], keys_simplegrid[],
keys_cyrillic[], keys_arabic[], keys_georgian[], keys_emoji[], keys_nav[], keys_landscape[],
keys_compose_a[], keys_compose_e[], keys_compose_y[], keys_compose_u[],
keys_compose_i[], keys_compose_o[], keys_compose_w[], keys_compose_r[],
keys_compose_t[], keys_compose_p[], keys_compose_s[], keys_compose_d[],
keys_compose_f[], keys_compose_g[], keys_compose_h[], keys_compose_j[],
keys_compose_k[], keys_compose_l[], keys_compose_z[], keys_compose_x[],
keys_compose_c[], keys_compose_v[], keys_compose_b[], keys_compose_n[],
keys_compose_m[], keys_compose_math[], keys_compose_punctuation[],
keys_compose_bracket[], keys_compose_cyr_i[], keys_compose_cyr_j[],
keys_compose_cyr_e[], keys_compose_cyr_u[], keys_compose_cyr_l[],
keys_compose_cyr_n[], keys_compose_cyr_tse[], keys_compose_cyr_che[],
keys_compose_cyr_g[], keys_compose_cyr_k[], keys_dialer[];
keys_cyrillic[], keys_arabic[], keys_persian[], keys_georgian[], keys_greek[],
keys_emoji[], keys_nav[], keys_landscape[], keys_compose_a[],
keys_compose_e[], keys_compose_y[], keys_compose_u[], keys_compose_i[],
keys_compose_o[], keys_compose_w[], keys_compose_r[], keys_compose_t[],
keys_compose_p[], keys_compose_s[], keys_compose_d[], keys_compose_f[],
keys_compose_g[], keys_compose_h[], keys_compose_j[], keys_compose_k[],
keys_compose_l[], keys_compose_z[], keys_compose_x[], keys_compose_c[],
keys_compose_v[], keys_compose_b[], keys_compose_n[], keys_compose_m[],
keys_compose_math[], keys_compose_punctuation[], keys_compose_bracket[],
keys_compose_cyr_i[], keys_compose_cyr_j[], keys_compose_cyr_e[],
keys_compose_cyr_u[], keys_compose_cyr_l[], keys_compose_cyr_n[],
keys_compose_cyr_tse[], keys_compose_cyr_che[], keys_compose_cyr_g[],
keys_compose_cyr_k[], keys_dialer[];
static struct layout layouts[NumLayouts] = {
[Full] = {keys_full, "latin", "full"}, // second parameter is the keymap name
@ -90,6 +89,8 @@ static struct layout layouts[NumLayouts] = {
[Dialer] = {keys_dialer, "latin", "dialer"},
[Arabic] = {keys_arabic, "arabic", "arabic"},
[Georgian] = {keys_georgian, "georgian", "georgian"},
[Persian] = {keys_persian, "persian", "persian"},
[Greek] = {keys_greek, "greek", "greek"},
[Emoji] = {keys_emoji, "latin", "emoji"},
[Nav] = {keys_nav, "latin", "nav"},
[Landscape] = {keys_landscape, "latin", "landscape"},
@ -214,7 +215,7 @@ static struct key keys_full[] = {
{"", "", 0.5, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"z", "Z", 1.0, Code, KEY_Z, &layouts[ComposeZ]},
{"x", "X", 1.0, Code, KEY_X, &layouts[ComposeX]},
{"c", "C", 1.0, Code, KEY_C, &layouts[ComposeC]},
@ -274,7 +275,7 @@ static struct key keys_special[] = {
{"Del", "Del", 1.0, Code, KEY_DELETE, .scheme = 1},
{"", "", 0.0, EndRow},
{"", "", 2.0, Mod, Shift, .scheme = 1},
{"", "", 2.0, Mod, Shift, .scheme = 1},
{";", ":", 1.0, Code, KEY_SEMICOLON},
{"/", ">", 1.0, Code, KEY_SLASH},
{"<", "«", 1.0, Code, KEY_COMMA, 0, AltGr},
@ -323,7 +324,7 @@ static struct key keys_simple[] = {
{"'", "\"", 0.5, Code, KEY_APOSTROPHE, &layouts[ComposeBracket]},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"z", "Z", 1.0, Code, KEY_Z, &layouts[ComposeZ]},
{"x", "X", 1.0, Code, KEY_X, &layouts[ComposeX]},
{"c", "C", 1.0, Code, KEY_C, &layouts[ComposeC]},
@ -336,7 +337,7 @@ static struct key keys_simple[] = {
{"Abc", "Abc", 1.0, NextLayer, .scheme = 1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1},
{",", "'", 1.0, Code, KEY_COMMA, &layouts[ComposeMath]},
{"-", "_", 1.0, Code, KEY_MINUS, &layouts[ComposeMath]},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_DOT, &layouts[ComposePunctuation]},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1},
@ -346,8 +347,9 @@ static struct key keys_simple[] = {
};
static struct key keys_dialer[] = {
{"Esc", "Esc", 1.0, Code, KEY_ESC, .scheme = 1},
{"", "", 1.0, Code, KEY_BACKSPACE, .scheme = 1},
{"Esc", "Esc", 1.0, Code, KEY_ESC},
{"+","+", 1.0, Code, KEY_KPPLUS},
{"", "", 1.0, Code, KEY_BACKSPACE},
{"", "", 0.0, EndRow},
{"1", "1", 1.0, Code, KEY_1},
{"2", "2", 1.0, Code, KEY_2},
@ -397,7 +399,7 @@ static struct key keys_simplegrid[] = {
{"'", "\"", 1.0, Code, KEY_APOSTROPHE, &layouts[ComposeBracket]},
{"", "", 0.0, EndRow},
{"", "", 1.0, Mod, Shift, .scheme = 1},
{"", "", 1.0, Mod, Shift, .scheme = 1},
{"z", "Z", 1.0, Code, KEY_Z, &layouts[ComposeZ]},
{"x", "X", 1.0, Code, KEY_X, &layouts[ComposeX]},
{"c", "C", 1.0, Code, KEY_C, &layouts[ComposeC]},
@ -411,7 +413,7 @@ static struct key keys_simplegrid[] = {
{"Abc", "Abc", 1.0, NextLayer, .scheme = 1},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1},
{",", "'", 1.0, Code, KEY_COMMA, &layouts[ComposeMath]},
{"-", "_", 1.0, Code, KEY_MINUS, &layouts[ComposeMath]},
{"Cmp", "Cmp", 1.0, Compose, .scheme = 1},
{"", "", 3.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_DOT, &layouts[ComposePunctuation]},
@ -463,7 +465,7 @@ static struct key keys_cyrillic[] = {
{"ж", "Ж", 1.0, Code, KEY_SEMICOLON},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"я", "Я", 1.0, Code, KEY_Z},
{"ч", "Ч", 1.0, Code, KEY_X, &layouts[ComposeCyrChe]},
{"c", "С", 1.0, Code, KEY_C},
@ -508,9 +510,9 @@ static struct key keys_arabic[] = {
{"غ", "إ", 1.0, Code, KEY_Y},
{"ع", "`", 1.0, Code, KEY_U},
{"ه", "", 1.0, Code, KEY_I},
{"ج", ";", 1.0, Code, KEY_O},
{"خ", ";", 1.0, Code, KEY_O},
{"ح", "", 1.0, Code, KEY_P},
{"خ", "<", 1.0, Code, KEY_LEFTBRACE},
{"ج", "<", 1.0, Code, KEY_LEFTBRACE},
{"", "", 0.0, EndRow},
{"ش", "ـِ", 1.0, Code, KEY_A},
@ -541,7 +543,7 @@ static struct key keys_arabic[] = {
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, NextLayer, .scheme = 1},
{"", "", 1.0, Mod, Shift, .scheme = 1},
{"", "", 1.0, Mod, Shift, .scheme = 1},
{"Cmp", "Cmp", 1.0, Compose, .scheme = 1},
{"", "", 5.0, Code, KEY_SPACE},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1},
@ -601,7 +603,7 @@ static struct key keys_georgian[] = {
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, NextLayer, .scheme = 1},
{"", "", 1.0, Mod, Shift, .scheme = 1},
{"", "", 1.0, Mod, Shift, .scheme = 1},
{"Cmp", "Cmp", 1.0, Compose, .scheme = 1},
{"", "", 5.0, Code, KEY_SPACE},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1},
@ -610,6 +612,134 @@ static struct key keys_georgian[] = {
{"", "", 0.0, Last},
};
static struct key keys_persian[] = {
{"۱", "|", 1.0, Code, KEY_1},
{"۲", "٬", 1.0, Code, KEY_2},
{"۳", "#", 1.0, Code, KEY_3},
{"۴", "", 1.0, Code, KEY_4},
{"۵", "٪", 1.0, Code, KEY_5},
{"۶", "×", 1.0, Code, KEY_6},
{"۷", "/", 1.0, Code, KEY_7},
{"۸", "*", 1.0, Code, KEY_8},
{"۹", ")", 1.0, Code, KEY_9},
{"۰", "(", 1.0, Code, KEY_0},
{"-", "_", 1.0, Code, KEY_MINUS},
{"=", "+", 1.0, Code, KEY_EQUAL},
{"", "", 0.0, EndRow},
{"ض", "ﹿ", 1.0, Code, KEY_Q},
{"ص", "ـٌ", 1.0, Code, KEY_W},
{"ث", "ـٍ", 1.0, Code, KEY_E},
{"ق", "ـً", 1.0, Code, KEY_R},
{"ف", "ـُ", 1.0, Code, KEY_T},
{"غ", "ـِ", 1.0, Code, KEY_Y},
{"ع", "ـَ", 1.0, Code, KEY_U},
{"ه", "", 1.0, Code, KEY_I},
{"خ", "]", 1.0, Code, KEY_O},
{"ح", "[", 1.0, Code, KEY_P},
{"ج", "}", 1.0, Code, KEY_LEFTBRACE},
{"چ", "{", 1.0, Code, KEY_RIGHTBRACE},
{"", "", 0.0, EndRow},
{"ش", "ؤ", 1.0, Code, KEY_A},
{"س", "ئ", 1.0, Code, KEY_S},
{"ی", "ي", 1.0, Code, KEY_D},
{"ب", "إ", 1.0, Code, KEY_F},
{"ل", "أ", 1.0, Code, KEY_G},
{"ا", "آ", 1.0, Code, KEY_H},
{"ت", "ة", 1.0, Code, KEY_J},
{"ن", "»", 1.0, Code, KEY_K},
{"م", "«", 1.0, Code, KEY_L},
{"ک", ":", 1.0, Code, KEY_SEMICOLON},
{"گ", "؛", 1.0, Code, KEY_APOSTROPHE},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"ظ", "ك", 1.0, Code, KEY_Z},
{"ط", "ـٓ", 1.0, Code, KEY_X},
{"ژ", ">", 1.0, Code, KEY_BACKSLASH},
{"ز", "<", 1.0, Code, KEY_C},
{"ر", "ـٰ", 1.0, Code, KEY_V},
{"ذ", "", 1.0, Code, KEY_B},
{"د", "ـٔ", 1.0, Code, KEY_N},
{"پ", "ء", 1.0, Code, KEY_M},
{"و", "\\", 1.0, Code, KEY_COMMA},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, NextLayer, .scheme = 1},
{"Cmp", "Cmp", 1.0, Compose, .scheme = 1},
{".", "،", 1.0, Code, KEY_DOT},
{"", "", 4.0, Code, KEY_SPACE},
{"", "", 1.0, Code, KEY_GRAVE},
{"؟", "!", 1.0, Code, KEY_SLASH},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1},
/* end of layout */
{"", "", 0.0, Last},
};
static struct key keys_greek[] = {
{"1", "!", 1.0, Code, KEY_1},
{"2", "@", 1.0, Code, KEY_2},
{"3", "#", 1.0, Code, KEY_3},
{"4", "$", 1.0, Code, KEY_4},
{"5", "%", 1.0, Code, KEY_5},
{"6", "^", 1.0, Code, KEY_6},
{"7", "&", 1.0, Code, KEY_7},
{"8", "*", 1.0, Code, KEY_8},
{"9", "(", 1.0, Code, KEY_9},
{"0", ")", 1.0, Code, KEY_0},
{"-", "_", 1.0, Code, KEY_MINUS},
{"=", "+", 1.0, Code, KEY_EQUAL},
{"", "", 0.0, EndRow},
{";", ":", 1.0, Code, KEY_Q},
{"ς", "Σ", 1.0, Code, KEY_W},
{"ε", "Ε", 1.0, Code, KEY_E},
{"ρ", "Ρ", 1.0, Code, KEY_R},
{"τ", "Τ", 1.0, Code, KEY_T},
{"υ", "Υ", 1.0, Code, KEY_Y},
{"θ", "Θ", 1.0, Code, KEY_U},
{"ι", "Ι", 1.0, Code, KEY_I},
{"ο", "Ο", 1.0, Code, KEY_O},
{"π", "Π", 1.0, Code, KEY_P},
{"", "", 0.0, EndRow},
{"α", "A", 1.0, Code, KEY_A},
{"σ", "Σ", 1.0, Code, KEY_S},
{"δ", "Δ", 1.0, Code, KEY_D},
{"φ", "Φ", 1.0, Code, KEY_F},
{"γ", "Γ", 1.0, Code, KEY_G},
{"η", "Η", 1.0, Code, KEY_H},
{"ξ", "Ξ", 1.0, Code, KEY_J},
{"κ", "Κ", 1.0, Code, KEY_K},
{"λ", "Λ", 1.0, Code, KEY_L},
{"΄", "¨", 1.0, Code, KEY_SEMICOLON},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"ζ", "Ζ", 1.0, Code, KEY_Z},
{"χ", "Χ", 1.0, Code, KEY_X},
{"ψ", "Ψ", 1.0, Code, KEY_C},
{"ω", "Ω", 1.0, Code, KEY_V},
{"β", "Β", 1.0, Code, KEY_B},
{"ν", "Ν", 1.0, Code, KEY_N},
{"μ", "Μ", 1.0, Code, KEY_M},
{"/", "\\", 1.0, Code, KEY_SLASH},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.5, NextLayer, .scheme = 1},
{",", "'", 1.0, Code, KEY_COMMA},
{"", "", 5, Code, KEY_SPACE},
{".", "\"", 1.0, Code, KEY_DOT},
{"Enter", "Enter", 2, Code, KEY_ENTER, .scheme = 1},
/* end of layout */
{"", "", 0.0, Last},
};
static struct key keys_compose_a[] = {
{"à", "À", 1.0, Copy, 0x00E0, 0, 0x00C0},
{"á", "Á", 1.0, Copy, 0x00E1, 0, 0x00C1},
@ -625,7 +755,7 @@ static struct key keys_compose_a[] = {
{"α", "Α", 1.0, Copy, 0x03B1, 0, 0x0391},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -653,7 +783,7 @@ static struct key keys_compose_e[] = {
{"ǝ", "Ə", 1.0, Copy, 0x0259, 0, 0x018F},
{"", "", 8.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift},
{"", "", 1.5, Mod, Shift},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE},
{"", "", 0.0, EndRow},
@ -674,7 +804,7 @@ static struct key keys_compose_y[] = {
{"", "", 0.0, EndRow},
{"υ", "Υ", 1.0, Copy, 0x03C5, 0, 0x03A5},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -697,12 +827,12 @@ static struct key keys_compose_u[] = {
{"ŭ", "Ŭ", 1.0, Copy, 0x016D, 0, 0x016C},
{"ů", "Ů", 1.0, Copy, 0x016F, 0, 0x016E},
{"ű", "Ű", 1.0, Copy, 0x0171, 0, 0x0170},
{"ų", "Ų", 1.0, Copy, 0x0172, 0, 0x0173},
{"ų", "Ų", 1.0, Copy, 0x0173, 0, 0x0172},
{"", "", 0.0, EndRow},
{"υ", "Υ", 1.0, Copy, 0x03C5, 0, 0x03A5},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -724,14 +854,14 @@ static struct key keys_compose_o[] = {
{"ø", "Ø", 1.0, Copy, 0x00F8, 0, 0x00D8},
{"ō", "Ō", 1.0, Copy, 0x014D, 0, 0x014C},
{"ŏ", "Ŏ", 1.0, Copy, 0x014F, 0, 0x014E},
{"ő", "Ő", 1.0, Copy, 0x0150, 0, 0x0151},
{"ő", "Ő", 1.0, Copy, 0x0151, 0, 0x0150},
{"œ", "Œ", 1.0, Copy, 0x0153, 0, 0x0152},
{"", "", 0.0, EndRow},
{"ο", "Ο", 1.0, Copy, 0x03BF, 0, 0x039F},
{"ω", "Ο", 1.0, Copy, 0x03C9, 0, 0x03A9},
{"", "", 8.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -760,7 +890,7 @@ static struct key keys_compose_i[] = {
{"η", "Η", 1.0, Copy, 0x03B7, 0, 0x0397},
{"", "", 8.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -796,7 +926,7 @@ static struct key keys_emoji[] = {
{"😒", "👀", 1.0, Copy, 0x1f612, 0, 0x1f440},
{"😓", "💀", 1.0, Copy, 0x1f613, 0, 0x1f480},
{"", "", 0.0, EndRow},
{"", "", 1.0, Mod, Shift, .scheme = 1},
{"", "", 1.0, Mod, Shift, .scheme = 1},
{"😛", "😜", 1.0, Copy, 0x1f61b, 0, 0x1f61c},
{"😮", "😝", 1.0, Copy, 0x1f62e, 0, 0x1f61d},
{"😟", "😞", 1.0, Copy, 0x1f61f, 0, 0x1f61e},
@ -821,7 +951,7 @@ static struct key keys_emoji[] = {
static struct key keys_nav[] = {
{"Esc", "Esc", 1.0, Code, KEY_ESC, .scheme = 1},
{"", "", 1.0, Code, KEY_SPACE, .scheme = 1},
{"", "", 1.0, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 1.0, Code, KEY_UP, .scheme = 1},
{"", "", 1.0, Code, KEY_PAGEUP, .scheme = 1},
{"", "", 0.0, EndRow},
@ -833,7 +963,7 @@ static struct key keys_nav[] = {
{"", "", 0.0, EndRow},
{"Sym", "Sym", 1.0, NextLayer, .scheme = 1},
{"", "", 1.0, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 1.0, Code, KEY_SPACE, .scheme = 1},
{"", "", 1.0, Code, KEY_DOWN, .scheme = 1},
{"", "", 1.0, Code, KEY_PAGEDOWN, .scheme = 1},
{"", "", 0.0, Last},
@ -871,7 +1001,7 @@ static struct key keys_landscape[] = {
{"-", "_", 0.5, Code, KEY_MINUS, &layouts[ComposeBracket], .scheme = 1},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"z", "Z", 1.0, Code, KEY_Z, &layouts[ComposeZ]},
{"x", "X", 1.0, Code, KEY_X, &layouts[ComposeX]},
{"c", "C", 1.0, Code, KEY_C, &layouts[ComposeC]},
@ -903,7 +1033,7 @@ static struct key keys_compose_w[] = {
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -925,7 +1055,7 @@ static struct key keys_compose_r[] = {
{"ρ", "Ρ", 1.0, Copy, 0x03C1, 0, 0x03A1},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -949,7 +1079,7 @@ static struct key keys_compose_t[] = {
{"θ", "Θ", 1.0, Copy, 0x03B8, 0, 0x0398},
{"", "", 8.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -968,7 +1098,7 @@ static struct key keys_compose_p[] = {
{"π", "Π", 1.0, Copy, 0x03C0, 0, 0x03A0},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -993,7 +1123,7 @@ static struct key keys_compose_s[] = {
{"ς", "Σ", 1.0, Copy, 0x03C2, 0, 0x03A3},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1015,7 +1145,7 @@ static struct key keys_compose_d[] = {
{"δ", "Δ", 1.0, Copy, 0x03B4, 0, 0x0394},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1034,7 +1164,7 @@ static struct key keys_compose_f[] = {
{"φ", "Φ", 1.0, Copy, 0x03C6, 0, 0x03A6},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1055,7 +1185,7 @@ static struct key keys_compose_g[] = {
{"γ", "Γ", 1.0, Copy, 0x03B3, 0, 0x0393},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1076,7 +1206,7 @@ static struct key keys_compose_h[] = {
{"η", "Η", 1.0, Copy, 0x03B7, 0, 0x0397},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1095,7 +1225,7 @@ static struct key keys_compose_j[] = {
{"", "", 0.0, EndRow},
{"", "", 10.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1116,7 +1246,7 @@ static struct key keys_compose_k[] = {
{"κ", "Κ", 1.0, Copy, 0x03BA, 0, 0x039A},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1138,7 +1268,7 @@ static struct key keys_compose_l[] = {
{"λ", "Λ", 1.0, Copy, 0x03BB, 0, 0x039B},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1160,7 +1290,7 @@ static struct key keys_compose_z[] = {
{"ζ", "Ζ", 1.0, Copy, 0x03B6, 0, 0x0396},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1180,7 +1310,7 @@ static struct key keys_compose_x[] = {
{"ξ", "Ξ", 1.0, Copy, 0x03BE, 0, 0x039E},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1204,7 +1334,7 @@ static struct key keys_compose_c[] = {
{"χ", "Χ", 1.0, Copy, 0x03C7, 0, 0x03A7},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1222,7 +1352,7 @@ static struct key keys_compose_v[] = {
{"", "", 0.0, EndRow},
{"", "", 10.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1241,7 +1371,7 @@ static struct key keys_compose_b[] = {
{"β", "Β", 1.0, Copy, 0x03B2, 0, 0x0392},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1265,7 +1395,7 @@ static struct key keys_compose_n[] = {
{"ν", "Ν", 1.0, Copy, 0x03BD, 0, 0x039D},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1284,7 +1414,7 @@ static struct key keys_compose_m[] = {
{"μ", "Μ", 1.0, Copy, 0x03BC, 0, 0x039C},
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1303,7 +1433,7 @@ static struct key keys_compose_cyr_i[] = {
{"", "", 8.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1321,7 +1451,7 @@ static struct key keys_compose_cyr_j[] = {
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1339,7 +1469,7 @@ static struct key keys_compose_cyr_e[] = {
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1357,7 +1487,7 @@ static struct key keys_compose_cyr_u[] = {
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1375,7 +1505,7 @@ static struct key keys_compose_cyr_l[] = {
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1393,7 +1523,7 @@ static struct key keys_compose_cyr_n[] = {
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1412,7 +1542,7 @@ static struct key keys_compose_cyr_che[] = {
{"", "", 8.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1431,7 +1561,7 @@ static struct key keys_compose_cyr_tse[] = {
{"", "", 8.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1449,7 +1579,7 @@ static struct key keys_compose_cyr_g[] = {
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1467,7 +1597,7 @@ static struct key keys_compose_cyr_k[] = {
{"", "", 9.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 0.0, EndRow},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 1.5, Mod, Shift, .scheme = 1},
{"", "", 7, Pad},
{"", "", 1.5, Code, KEY_BACKSPACE, .scheme = 1},
{"", "", 0.0, EndRow},
@ -1494,18 +1624,18 @@ static struct key keys_compose_math[] = {
{"", "", 0.0, EndRow},
{"", "", 10.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 2, Mod, Shift, .scheme = 1},
{"-", "-", 1, Code, KEY_MINUS},
{"", "", 2, Mod, Shift, .scheme = 1},
{"+", "+", 1, Code, KEY_EQUAL, 0, Shift},
{"/", "/", 1, Code, KEY_SLASH},
{"*", "*", 1, Code, KEY_8, 0, Shift},
{"=", "=", 1, Code, KEY_EQUAL},
{"_", "_", 1, Code, KEY_MINUS, 0, Shift},
{"", "", 1, Copy, 0x2014, 0, 0x2014},
{"", "", 2, Pad},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, BackLayer},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1},
{",", "'", 1.0, Code, KEY_COMMA, &layouts[ComposeMath]},
{"-", "-", 1, Code, KEY_MINUS},
{"", "", 4.0, Code, KEY_SPACE},
{".", "?", 1.0, Code, KEY_DOT, &layouts[ComposePunctuation]},
{"Enter", "Enter", 2.0, Code, KEY_ENTER, .scheme = 1},
@ -1526,14 +1656,15 @@ static struct key keys_compose_punctuation[] = {
{"", "", 0.0, EndRow},
{"", "", 10.0, Pad},
{"", "", 0.0, EndRow},
{"", "", 2, Mod, Shift, .scheme = 1},
{"", "", 1, Pad},
{"", "", 2, Mod, Shift, .scheme = 1},
{"", "", 1, Copy, 0x2026, 0, 0x2026},
{":", ":", 1, Code, KEY_SEMICOLON, 0, Shift},
{";", ";", 1, Code, KEY_SEMICOLON, 0},
{"!", "!", 1, Code, KEY_1, 0, Shift},
{"?", "?", 1, Code, KEY_DOT, 0, Shift},
{",", ",", 1, Code, KEY_COMMA},
{"", "", 2, Pad},
{"·", "·", 1, Copy, 0x2027, 0, 0x2027},
{"", "", 1, Pad},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, BackLayer},
{"Ctr", "Ctr", 1.0, Mod, Ctrl, .scheme = 1},
@ -1558,7 +1689,7 @@ static struct key keys_compose_bracket[] = {
{"\"", "\"", 1, Code, KEY_APOSTROPHE, 0, Shift},
{"'", "'", 1, Code, KEY_APOSTROPHE},
{"", "", 0.0, EndRow},
{"", "", 2, Mod, Shift, .scheme = 1},
{"", "", 2, Mod, Shift, .scheme = 1},
{"", "", 8, Pad},
{"", "", 0.0, EndRow},
{"Abc", "Abc", 1.0, BackLayer},

252
main.c
View File

@ -5,6 +5,8 @@
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/signalfd.h>
#include <poll.h>
#include <unistd.h>
#include <wayland-client.h>
#include <wchar.h>
@ -45,6 +47,7 @@ static int cur_x = -1, cur_y = -1;
static bool cur_press = false;
static struct kbd keyboard;
static uint32_t height, normal_height, landscape_height;
static bool hidden = false;
/* event handler prototypes */
static void wl_pointer_enter(void *data, struct wl_pointer *wl_pointer,
@ -250,29 +253,35 @@ static void
display_handle_geometry(void *data, struct wl_output *wl_output, int x, int y,
int physical_width, int physical_height, int subpixel,
const char *make, const char *model, int transform) {
if (transform % 2 == 0 && keyboard.landscape) {
keyboard.landscape = false;
height = normal_height;
} else if (transform % 2 != 0 && !keyboard.landscape) {
keyboard.landscape = true;
height = landscape_height;
} else {
return; // no changes
// Swap width and height on rotated displays
if (transform % 2 != 0) {
int tmp = physical_width;
physical_width = physical_height;
physical_height = tmp;
}
bool landscape = physical_width > physical_height;
if (landscape == keyboard.landscape) return;
keyboard.landscape = landscape;
enum layout_id layer;
if (keyboard.landscape) {
layer = keyboard.landscape_layers[0];
height = landscape_height;
} else {
layer = keyboard.layers[0];
height = normal_height;
}
keyboard.layout = &keyboard.layouts[layer];
keyboard.prevlayout = keyboard.layout;
keyboard.layer_index = 0;
zwlr_layer_surface_v1_set_size(layer_surface, 0, height);
zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, height);
wl_surface_commit(draw_surf.surf);
if (layer_surface) {
zwlr_layer_surface_v1_set_size(layer_surface, 0, height);
zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, height);
wl_surface_commit(draw_surf.surf);
}
}
static void
@ -325,11 +334,15 @@ handle_global_remove(void *data, struct wl_registry *registry, uint32_t name) {}
void
layer_surface_configure(void *data, struct zwlr_layer_surface_v1 *surface,
uint32_t serial, uint32_t w, uint32_t h) {
keyboard.w = w + KBD_PIXEL_OVERSCAN_WIDTH;
keyboard.h = h;
kbd_resize(&keyboard, layouts, NumLayouts);
if (keyboard.w != w || keyboard.h != h) {
keyboard.w = w;
keyboard.h = h;
kbd_resize(&keyboard, layouts, NumLayouts);
}
zwlr_layer_surface_v1_ack_configure(surface, serial);
drwsurf_flip(&draw_surf);
}
void
@ -346,19 +359,38 @@ usage(char *argv0) {
"layers]\n",
argv0);
fprintf(stderr, "Options:\n");
fprintf(stderr, " -D - Enable debug\n");
fprintf(stderr, " -o - Print pressed keys to standard output\n");
fprintf(stderr, " -O - Print intersected keys to standard output\n");
fprintf(stderr, " -l - Comma separated list of layers\n");
fprintf(stderr, " -H [int] - Height in pixels\n");
fprintf(stderr, " -L [int] - Landscape height in pixels\n");
fprintf(stderr, " -D - Enable debug\n");
fprintf(stderr, " -o - Print pressed keys to standard output\n");
fprintf(stderr, " -O - Print intersected keys to standard output\n");
fprintf(stderr, " -l - Comma separated list of layers\n");
fprintf(stderr, " -H [int] - Height in pixels\n");
fprintf(stderr, " -L [int] - Landscape height in pixels\n");
fprintf(stderr, " --fn [font] - Set font (e.g: DejaVu Sans 20)\n");
fprintf(stderr, " --hidden - Start hidden (send SIGUSR2 to show)\n");
fprintf(stderr, " --hidden - Start hidden (send SIGUSR2 to show)\n");
fprintf(stderr, " --bg [rrggbb|aa] - Set color of background\n");
fprintf(stderr, " --fg [rrggbb|aa] - Set color of keys\n");
fprintf(stderr, " --fg-sp [rrggbb|aa] - Set color of special keys\n");
fprintf(stderr, " --press [rrggbb|aa] - Set color of pressed keys\n");
fprintf(stderr, " --press-sp [rrggbb|aa] - Set color of pressed special keys\n");
fprintf(stderr, " --swipe [rrggbb|aa] - Set color of swiped keys\n");
fprintf(stderr, " --swipe-sp [rrggbb|aa] - Set color of swiped special keys\n");
fprintf(stderr, " --text [rrggbb|aa] - Set color of text on keys\n");
fprintf(stderr, " --text-sp [rrggbb|aa] - Set color of text on special keys\n");
fprintf(stderr, " --list-layers - Print the list of available layers\n");
}
void
hide(int sigint) {
signal(SIGUSR1, hide);
list_layers() {
int i;
for (i = 0; i < NumLayouts - 1; i++) {
if (layouts[i].name) {
puts(layouts[i].name);
}
}
}
void
hide() {
if (!layer_surface) {
return;
}
@ -366,15 +398,11 @@ hide(int sigint) {
zwlr_layer_surface_v1_destroy(layer_surface);
wl_surface_destroy(draw_surf.surf);
layer_surface = NULL;
if (draw_surf.cb) {
wl_callback_destroy(draw_surf.cb);
draw_surf.cb = NULL;
}
hidden = true;
}
void
show(int sigint) {
signal(SIGUSR2, show);
show() {
if (layer_surface) {
return;
}
@ -382,7 +410,6 @@ show(int sigint) {
wl_display_sync(display);
draw_surf.surf = wl_compositor_create_surface(compositor);
;
layer_surface = zwlr_layer_shell_v1_get_layer_surface(
layer_shell, draw_surf.surf, wl_output, layer, namespace);
@ -395,7 +422,40 @@ show(int sigint) {
wl_surface_commit(draw_surf.surf);
wl_display_roundtrip(display);
kbd_resize(&keyboard, layouts, NumLayouts);
drwsurf_flip(&draw_surf);
hidden = false;
}
void
toggle_visibility() {
if (hidden) show();
else hide();
}
void
pipewarn() {
fprintf(stderr, "wvkbd: cannot pipe data out.\n");
}
void
set_kbd_colors(uint8_t * bgra, char * hex) {
// bg, fg, text, high, swipe
int length = strlen(hex);
if (length == 6 || length == 8) {
char subhex[2];
memcpy(subhex, hex, 2);
bgra[2] = (int)strtol(subhex, NULL, 16);
memcpy(subhex, hex+2, 2);
bgra[1] = (int)strtol(subhex, NULL, 16);
memcpy(subhex, hex+4, 2);
bgra[0] = (int)strtol(subhex, NULL, 16);
if (length == 8) {
memcpy(subhex, hex+6, 2);
bgra[3] = (int)strtol(subhex, NULL, 16);
}
}
}
int
@ -420,14 +480,11 @@ main(int argc, char **argv) {
keyboard.scheme = scheme;
keyboard.layer_index = 0;
keyboard.scheme1 = scheme1;
keyboard.scheme1 = scheme1;
bool starthidden = false;
int i;
for (i = 1; argv[i]; i++) {
if ((!strcmp(argv[i], "-v")) || (!strcmp(argv[i], "--version"))) {
printf("wvkbd-%s", VERSION);
printf("wvkbd-%s\n", VERSION);
exit(0);
} else if ((!strcmp(argv[i], "-h")) || (!strcmp(argv[i], "--help"))) {
usage(argv[0]);
@ -440,6 +497,60 @@ main(int argc, char **argv) {
if (layer_names_list)
free(layer_names_list);
layer_names_list = estrdup(argv[++i]);
} else if ((!strcmp(argv[i], "-bg")) || (!strcmp(argv[i], "--bg"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme.bg.bgra, argv[++i]);
} else if ((!strcmp(argv[i], "-fg")) || (!strcmp(argv[i], "--fg"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme.fg.bgra, argv[++i]);
} else if ((!strcmp(argv[i], "-fg-sp")) || (!strcmp(argv[i], "--fg-sp"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme1.fg.bgra, argv[++i]);
} else if ((!strcmp(argv[i], "-press")) || (!strcmp(argv[i], "--press"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme.high.bgra, argv[++i]);
} else if ((!strcmp(argv[i], "-press-sp")) || (!strcmp(argv[i], "--press-sp"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme1.high.bgra, argv[++i]);
} else if ((!strcmp(argv[i], "-swipe")) || (!strcmp(argv[i], "--swipe"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme.swipe.bgra, argv[++i]);
} else if ((!strcmp(argv[i], "-swipe-sp")) || (!strcmp(argv[i], "--swipe-sp"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme1.swipe.bgra, argv[++i]);
} else if ((!strcmp(argv[i], "-text")) || (!strcmp(argv[i], "--text"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme.text.bgra, argv[++i]);
} else if ((!strcmp(argv[i], "-text-sp")) || (!strcmp(argv[i], "--text-sp"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
set_kbd_colors(keyboard.scheme1.text.bgra, argv[++i]);
} else if (!strcmp(argv[i], "-H")) {
if (i >= argc - 1) {
usage(argv[0]);
@ -455,13 +566,22 @@ main(int argc, char **argv) {
} else if (!strcmp(argv[i], "-D")) {
keyboard.debug = true;
} else if ((!strcmp(argv[i], "-fn")) || (!strcmp(argv[i], "--fn"))) {
if (i >= argc - 1) {
usage(argv[0]);
exit(1);
}
fc_font_pattern = estrdup(argv[++i]);
} else if (!strcmp(argv[i], "-o")) {
keyboard.print = true;
} else if (!strcmp(argv[i], "-O")) {
keyboard.print_intersect = true;
} else if ((!strcmp(argv[i], "-hidden")) || (!strcmp(argv[i], "--hidden"))) {
starthidden = true;
} else if ((!strcmp(argv[i], "-hidden")) ||
(!strcmp(argv[i], "--hidden"))) {
hidden = true;
} else if ((!strcmp(argv[i], "-list-layers")) ||
(!strcmp(argv[i], "--list-layers"))) {
list_layers();
exit(0);
} else {
fprintf(stderr, "Invalid argument: %s\n", argv[i]);
usage(argv[0]);
@ -509,34 +629,50 @@ main(int argc, char **argv) {
draw_ctx.font_description =
pango_font_description_from_string(fc_font_pattern);
if (!hidden) show();
if (!starthidden) {
draw_surf.surf = wl_compositor_create_surface(compositor);
struct pollfd fds[2];
int WAYLAND_FD = 0;
int SIGNAL_FD = 1;
fds[WAYLAND_FD].events = POLLIN;
fds[SIGNAL_FD].events = POLLIN;
layer_surface = zwlr_layer_shell_v1_get_layer_surface(
layer_shell, draw_surf.surf, wl_output, layer, namespace);
zwlr_layer_surface_v1_set_size(layer_surface, 0, height);
zwlr_layer_surface_v1_set_anchor(layer_surface, anchor);
zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, height);
zwlr_layer_surface_v1_set_keyboard_interactivity(layer_surface, false);
zwlr_layer_surface_v1_add_listener(layer_surface, &layer_surface_listener,
NULL);
wl_surface_commit(draw_surf.surf);
wl_display_roundtrip(display);
drwsurf_flip(&draw_surf);
fds[WAYLAND_FD].fd = wl_display_get_fd(display);
if (fds[WAYLAND_FD].fd == -1) {
die("Failed to get wayland_fd: %d\n", errno);
}
signal(SIGUSR1, hide);
signal(SIGUSR2, show);
sigset_t signal_mask;
sigemptyset(&signal_mask);
sigaddset(&signal_mask, SIGUSR1);
sigaddset(&signal_mask, SIGUSR2);
sigaddset(&signal_mask, SIGRTMIN);
sigaddset(&signal_mask, SIGPIPE);
if (sigprocmask(SIG_BLOCK, &signal_mask, NULL) == -1) {
die("Failed to disable handled signals: %d\n", errno);
}
fds[SIGNAL_FD].fd = signalfd(-1, &signal_mask, 0);
if (fds[SIGNAL_FD].fd == -1) {
die("Failed to get signalfd: %d\n", errno);
}
while (run_display) {
while (wl_display_dispatch(display) != -1 && layer_surface) {
}
wl_display_roundtrip(display);
while (run_display && !layer_surface) {
sleep(1);
wl_display_flush(display);
poll(fds, 2, -1);
if (fds[WAYLAND_FD].revents & POLLIN)
wl_display_dispatch(display);
if (fds[SIGNAL_FD].revents & POLLIN) {
struct signalfd_siginfo si;
if (read(fds[SIGNAL_FD].fd, &si, sizeof(si)) != sizeof(si))
fprintf(stderr, "Signal read error: %d", errno);
else if (si.ssi_signo == SIGUSR1) hide();
else if (si.ssi_signo == SIGUSR2) show();
else if (si.ssi_signo == SIGRTMIN) toggle_visibility();
else if (si.ssi_signo == SIGPIPE) pipewarn();
}
}

71
wvkbd.1 Normal file
View File

@ -0,0 +1,71 @@
.TH "wvkbd" "1" "2022-03-12"
.P
.SH NAME
.P
wvkbd - on-screen keyboard for wlroots
.P
.SH SYNOPSIS
.P
wvkbd-mobintl [OPTION]...
.P
.SH DESCRIPTION
.P
wvkbd is an on-screen keyboard for wlroots that sucks less.
.P
.SH OPTIONS
.P
\fB-D\fR
.RS 4
enable debug
.P
.RE
\fB-o\fR
.RS 4
print pressed keys to standard output
.P
.RE
\fB-O\fR
.RS 4
print intersected keys to standard output
.P
.RE
\fB-l\fR
.RS 4
comma separated list of layers
.P
.RE
\fB-H\fR \fIPX\fR
.RS 4
height in pixels
.P
.RE
\fB-L\fR \fIPX\fR
.RS 4
landscape height in pixels
.P
.RE
\fB--fn\fR \fIFONT\fR
.RS 4
set font (e.g: DejaVu Sans 20)
.P
.RE
\fB--hidden\fR
.RS 4
start hidden (send SIGUSR2 to show, SIGUSR1 to hide, SIGRTMIN to toggle)
.P
.RE
\fB-v\fR, \fB--version\fR
.RS 4
print version
.P
.RE
\fB-h\fR, \fB--help\fR
.RS 4
show help
.P
.RE
.SH AUTHORS
.P
Created by John Sullivan <jsullivan@csumb.edu>, maintained by the Sxmo project in
collaboration with other open source contributors. For more information about wvkbd development, see
<https://git.sr.ht/~proycon/wvkbd> or <https://github.com/jjsullivan5196/wvkbd>.