mirror of
https://github.com/jjsullivan5196/wvkbd.git
synced 2025-12-24 05:46:23 +01:00
Compare commits
15 Commits
3826cd6050
...
v0.18
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed702f9562 | ||
|
|
ecc3d5ae1a | ||
|
|
74667dc2e8 | ||
|
|
cf60305a61 | ||
|
|
915a881111 | ||
|
|
5318ee9256 | ||
|
|
3a44beac1f | ||
|
|
b3a7e95c69 | ||
|
|
5689b6bd33 | ||
|
|
90ac0454cd | ||
|
|
49975e78ee | ||
|
|
b0fd6777fc | ||
|
|
3142271882 | ||
|
|
ace77b2aaa | ||
|
|
47d27e48d5 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -6,5 +6,7 @@ include/config.h
|
||||
.gdb_history
|
||||
*.log
|
||||
wvkbd
|
||||
*.1
|
||||
config.h
|
||||
wvkbd-mobintl
|
||||
wvkbd-deskintl
|
||||
|
||||
4
Makefile
4
Makefile
@@ -29,7 +29,7 @@ OBJECTS = $(SOURCES:.c=.o)
|
||||
all: ${BIN} ${DOCS}
|
||||
|
||||
config.h:
|
||||
cp config.def.h config.h
|
||||
cp config.${LAYOUT}.h config.h
|
||||
|
||||
proto/%-client-protocol.c: proto/%.xml
|
||||
wayland-scanner code < $? > $@
|
||||
@@ -43,7 +43,7 @@ wvkbd-${LAYOUT}: config.h $(OBJECTS) layout.${LAYOUT}.h
|
||||
$(CC) -o wvkbd-${LAYOUT} $(OBJECTS) $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
rm -f $(OBJECTS) $(HDRS) $(WAYLAND_SRC) ${BIN} ${DOCS}
|
||||
rm -f $(OBJECTS) config.h $(HDRS) $(WAYLAND_SRC) ${BIN} ${DOCS}
|
||||
|
||||
format:
|
||||
clang-format -i $(WVKBD_SOURCES) $(WVKBD_HEADERS)
|
||||
|
||||
18
README.md
18
README.md
@@ -44,18 +44,20 @@ You'll need the following developer packages
|
||||
|
||||
You also need [scdoc](https://git.sr.ht/~sircmpwn/scdoc/) to generate the documentation.
|
||||
|
||||
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`.
|
||||
and also attempts to accommodate various international users. Run `make`. The resulting binary is called `wvkbd-mobintl`.
|
||||
|
||||
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`
|
||||
The other set of layouts is called `deskintl` *(desktop international)*, which groups layouts aimed at desktop, laptop, and
|
||||
tablet devices with a larger touchscreen. The set is US-International English. Run `make LAYOUT=deskintl`. The resulting binary
|
||||
is called `wvkbd-deskintl`.
|
||||
|
||||
You can, however, define your own layouts by copying and modifying `config.mobintl.h`, `layout.mobintl.h` and `keymap.mobintl.h`
|
||||
(replace `mobintl` for something like `yourlayout`), or `config.deskintl.h`, `layout.deskintl.h` and `keymap.deskintl.h`. Then
|
||||
make your layout set using `make LAYOUT=yourlayout`, and the resulting binary will be `wvkbd-yourlayout`.
|
||||
|
||||
## Usage
|
||||
|
||||
Run `wvkbd-mobintl` (or the binary for your custom layout set).
|
||||
Run `wvkbd-mobintl`, `wvkbd-deskintl` or the binary for your custom layout set.
|
||||
|
||||
You can switch between the layouts/layers of the keyboard by pressing the
|
||||
⌨ key (little keyboard) the bottom-left (press shift to iterate back instead of
|
||||
@@ -101,7 +103,7 @@ layout by name, even layouts not explicitly added to your layers on startup.
|
||||
|
||||
Any contributions are welcome, there are two ways to contribute, the first one is **preferred**:
|
||||
|
||||
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/).
|
||||
1. [Sourcehut](https://git.sr.ht/~proycon/wvkbd) - Submit your patches using `git send-email` 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
|
||||
|
||||
45
config.deskintl.h
Normal file
45
config.deskintl.h
Normal file
@@ -0,0 +1,45 @@
|
||||
#ifndef config_h_INCLUDED
|
||||
#define config_h_INCLUDED
|
||||
|
||||
#define DEFAULT_FONT "Sans 18"
|
||||
#define DEFAULT_ROUNDING 5
|
||||
static const int transparency = 255;
|
||||
|
||||
struct clr_scheme schemes[] = {
|
||||
{
|
||||
/* colors */
|
||||
.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},
|
||||
.font = DEFAULT_FONT,
|
||||
.rounding = DEFAULT_ROUNDING,
|
||||
},
|
||||
{
|
||||
/* colors */
|
||||
.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},
|
||||
.font = DEFAULT_FONT,
|
||||
.rounding = DEFAULT_ROUNDING,
|
||||
}
|
||||
};
|
||||
|
||||
/* 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,
|
||||
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[] = {
|
||||
Full, // First layout is the default layout on startup
|
||||
Special,
|
||||
NumLayouts // signals the last item, may not be omitted
|
||||
};
|
||||
|
||||
#endif // config_h_INCLUDED
|
||||
@@ -1,4 +1,4 @@
|
||||
VERSION = 0.17
|
||||
VERSION = 0.18
|
||||
CFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=700
|
||||
PREFIX = /usr/local
|
||||
MANPREFIX = ${PREFIX}/share/man
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#ifndef config_def_h_INCLUDED
|
||||
#define config_def_h_INCLUDED
|
||||
#ifndef config_h_INCLUDED
|
||||
#define config_h_INCLUDED
|
||||
|
||||
#define DEFAULT_FONT "Sans 14"
|
||||
#define DEFAULT_ROUNDING 5
|
||||
#define SHIFT_SPACE_IS_TAB
|
||||
static const int transparency = 255;
|
||||
|
||||
struct clr_scheme schemes[] = {
|
||||
@@ -31,7 +32,7 @@ struct clr_scheme schemes[] = {
|
||||
/* 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,
|
||||
Special,
|
||||
NumLayouts // signals the last item, may not be omitted
|
||||
};
|
||||
|
||||
@@ -42,4 +43,4 @@ static enum layout_id landscape_layers[] = {
|
||||
NumLayouts // signals the last item, may not be omitted
|
||||
};
|
||||
|
||||
#endif // config_def_h_INCLUDED
|
||||
#endif // config_h_INCLUDED
|
||||
3
drw.c
3
drw.c
@@ -131,6 +131,7 @@ drw_draw_text(struct drwsurf *ds, Color color, uint32_t x, uint32_t y,
|
||||
{
|
||||
drwsurf_flip(ds);
|
||||
struct drwbuf *d = ds->back_buffer;
|
||||
drwsurf_damage(ds, x, y, w, h);
|
||||
|
||||
cairo_save(d->cairo);
|
||||
|
||||
@@ -159,6 +160,7 @@ drw_do_clear(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t w, uint32_t h)
|
||||
{
|
||||
drwsurf_flip(ds);
|
||||
struct drwbuf *d = ds->back_buffer;
|
||||
drwsurf_damage(ds, x, y, w, h);
|
||||
|
||||
cairo_save(d->cairo);
|
||||
|
||||
@@ -175,6 +177,7 @@ drw_do_rectangle(struct drwsurf *ds, Color color, uint32_t x, uint32_t y,
|
||||
{
|
||||
drwsurf_flip(ds);
|
||||
struct drwbuf *d = ds->back_buffer;
|
||||
drwsurf_damage(ds, x, y, w, h);
|
||||
|
||||
cairo_save(d->cairo);
|
||||
|
||||
|
||||
2
drw.h
2
drw.h
@@ -33,10 +33,8 @@ struct drwsurf {
|
||||
};
|
||||
struct kbd;
|
||||
|
||||
void drwsurf_damage(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t w, uint32_t h);
|
||||
void drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, double s);
|
||||
void drwsurf_attach(struct drwsurf *ds);
|
||||
void drwsurf_flip(struct drwsurf *ds);
|
||||
|
||||
typedef union {
|
||||
uint8_t bgra[4];
|
||||
|
||||
15
keyboard.c
15
keyboard.c
@@ -301,7 +301,7 @@ kbd_unpress_key(struct kbd *kb, uint32_t time)
|
||||
zwp_virtual_keyboard_v1_key(kb->vkbd, time, 127, // COMP key
|
||||
WL_KEYBOARD_KEY_STATE_RELEASED);
|
||||
} else {
|
||||
if ((kb->last_press->code == KEY_SPACE) && (unlatch_shift)) {
|
||||
if ((kb->shift_space_is_tab) && (kb->last_press->code == KEY_SPACE) && (unlatch_shift)) {
|
||||
// shift + space is tab
|
||||
zwp_virtual_keyboard_v1_key(kb->vkbd, time, KEY_TAB,
|
||||
WL_KEYBOARD_KEY_STATE_RELEASED);
|
||||
@@ -404,7 +404,7 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time)
|
||||
}
|
||||
kb->last_swipe = kb->last_press = k;
|
||||
kbd_draw_key(kb, k, Press);
|
||||
if ((k->code == KEY_SPACE) && (kb->mods & Shift)) {
|
||||
if ((kb->shift_space_is_tab) && (k->code == KEY_SPACE) && (kb->mods & Shift)) {
|
||||
// shift space is tab
|
||||
zwp_virtual_keyboard_v1_modifiers(kb->vkbd, 0, 0, 0, 0);
|
||||
zwp_virtual_keyboard_v1_key(kb->vkbd, time, KEY_TAB,
|
||||
@@ -544,14 +544,6 @@ kbd_clear_last_popup(struct kbd *kb)
|
||||
if (kb->last_popup_w && kb->last_popup_h) {
|
||||
drw_do_clear(kb->popup_surf, kb->last_popup_x, kb->last_popup_y,
|
||||
kb->last_popup_w, kb->last_popup_h);
|
||||
drwsurf_damage(
|
||||
kb->popup_surf,
|
||||
kb->last_popup_x,
|
||||
kb->last_popup_y,
|
||||
kb->last_popup_w,
|
||||
kb->last_popup_h
|
||||
);
|
||||
|
||||
kb->last_popup_w = kb->last_popup_h = 0;
|
||||
}
|
||||
}
|
||||
@@ -584,7 +576,6 @@ kbd_draw_key(struct kbd *kb, struct key *k, enum key_draw_type type)
|
||||
|
||||
drw_draw_text(kb->surf, scheme->text, k->x, k->y, k->w, k->h,
|
||||
KBD_KEY_BORDER, label, scheme->font_description);
|
||||
drwsurf_damage(kb->surf, k->x, k->y, k->w, k->h);
|
||||
|
||||
if (type == Press || type == Unpress) {
|
||||
kbd_clear_last_popup(kb);
|
||||
@@ -601,7 +592,6 @@ kbd_draw_key(struct kbd *kb, struct key *k, enum key_draw_type type)
|
||||
drw_draw_text(kb->popup_surf, scheme->text, k->x, kb->last_popup_y,
|
||||
k->w, k->h, KBD_KEY_BORDER, label,
|
||||
scheme->font_description);
|
||||
drwsurf_damage(kb->popup_surf, k->x, kb->last_popup_y, k->w, k->h);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -628,7 +618,6 @@ kbd_draw_layout(struct kbd *kb)
|
||||
}
|
||||
next_key++;
|
||||
}
|
||||
drwsurf_damage(d, 0, 0, kb->w, kb->h);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -101,6 +101,8 @@ struct kbd {
|
||||
double scale;
|
||||
double preferred_scale, preferred_fractional_scale;
|
||||
bool landscape;
|
||||
bool shift_space_is_tab;
|
||||
bool exclusive;
|
||||
uint8_t mods;
|
||||
uint8_t compose;
|
||||
struct key *last_press;
|
||||
@@ -111,6 +113,7 @@ struct kbd {
|
||||
size_t last_abc_index; //the layer index of the last alphabetical layout
|
||||
|
||||
struct layout *layouts;
|
||||
struct Output *output; //only used to keep track of landscape flipping, never dereferenced
|
||||
enum layout_id *layers;
|
||||
enum layout_id *landscape_layers;
|
||||
|
||||
|
||||
2934
keymap.deskintl.h
Normal file
2934
keymap.deskintl.h
Normal file
File diff suppressed because it is too large
Load Diff
1007
layout.deskintl.h
Normal file
1007
layout.deskintl.h
Normal file
File diff suppressed because it is too large
Load Diff
20
main.c
20
main.c
@@ -28,7 +28,7 @@
|
||||
#define countof(x) (sizeof(x) / sizeof(*x))
|
||||
|
||||
/* client state */
|
||||
static const char *namespace = "wlroots";
|
||||
static const char *namespace = "wvkbd";
|
||||
static struct wl_display *display;
|
||||
static struct wl_compositor *compositor;
|
||||
static struct wl_seat *seat;
|
||||
@@ -611,7 +611,7 @@ layer_surface_configure(void *data, struct zwlr_layer_surface_v1 *surface,
|
||||
}
|
||||
|
||||
if (keyboard.w != w || keyboard.h != h || keyboard.scale != scale ||
|
||||
hidden) {
|
||||
keyboard.output != current_output || hidden) {
|
||||
|
||||
keyboard.w = w;
|
||||
keyboard.h = h;
|
||||
@@ -665,6 +665,7 @@ layer_surface_configure(void *data, struct zwlr_layer_surface_v1 *surface,
|
||||
zwlr_layer_surface_v1_ack_configure(surface, serial);
|
||||
kbd_resize(&keyboard, layouts, NumLayouts);
|
||||
drwsurf_attach(&draw_surf);
|
||||
keyboard.output = current_output;
|
||||
} else {
|
||||
zwlr_layer_surface_v1_ack_configure(surface, serial);
|
||||
}
|
||||
@@ -716,6 +717,9 @@ usage(char *argv0)
|
||||
" -l - Comma separated list of layers\n");
|
||||
fprintf(stderr, " --landscape-layers - Comma separated list of "
|
||||
"landscape layers\n");
|
||||
fprintf(stderr, " --non-exclusive - Allow the keyboard to overlap"
|
||||
" windows. Do not request an exclusive zone from the"
|
||||
"compositor\n");
|
||||
}
|
||||
|
||||
void
|
||||
@@ -782,7 +786,9 @@ show()
|
||||
|
||||
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);
|
||||
if (keyboard.exclusive) {
|
||||
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);
|
||||
@@ -851,6 +857,7 @@ main(int argc, char **argv)
|
||||
keyboard.layer_index = 0;
|
||||
keyboard.preferred_scale = 1;
|
||||
keyboard.preferred_fractional_scale = 0;
|
||||
keyboard.exclusive = true;
|
||||
|
||||
uint8_t alpha = 0;
|
||||
bool alpha_defined = false;
|
||||
@@ -986,6 +993,8 @@ main(int argc, char **argv)
|
||||
(!strcmp(argv[i], "--list-layers"))) {
|
||||
list_layers();
|
||||
exit(0);
|
||||
} else if ((!strcmp(argv[i], "-non-exclusive")) || (!strcmp(argv[i], "--non-exclusive"))) {
|
||||
keyboard.exclusive = false;
|
||||
} else {
|
||||
fprintf(stderr, "Invalid argument: %s\n", argv[i]);
|
||||
usage(argv[0]);
|
||||
@@ -1057,6 +1066,11 @@ main(int argc, char **argv)
|
||||
if (keyboard.vkbd == NULL) {
|
||||
die("failed to init virtual keyboard_manager\n");
|
||||
}
|
||||
#ifdef SHIFT_SPACE_IS_TAB
|
||||
keyboard.shift_space_is_tab = true;
|
||||
#else
|
||||
keyboard.shift_space_is_tab = false;
|
||||
#endif
|
||||
|
||||
kbd_init(&keyboard, (struct layout *)&layouts, layer_names_list,
|
||||
landscape_layer_names_list);
|
||||
|
||||
@@ -7,6 +7,7 @@ wvkbd - on-screen virtual keyboard for wayland compositors using wlroots
|
||||
# SYNOPSIS
|
||||
|
||||
wvkbd-mobintl [OPTIONS]...
|
||||
wvkbd-deskintl [OPTIONS]...
|
||||
|
||||
*NOTE*: Your binary may have a different suffix depending on which layout you compiled.
|
||||
|
||||
@@ -50,6 +51,10 @@ can be patched to add new features.
|
||||
*--hidden*
|
||||
Start hidden (send SIGUSR2 to show).
|
||||
|
||||
*--non-exclusive*
|
||||
Allow keyboard to overlap existing windows, do not request an
|
||||
exclusive zone from the compositor.
|
||||
|
||||
*--alpha* _int_
|
||||
Set alpha value (i.e. transparency) for all colors [0-255]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user