mirror of
https://github.com/jjsullivan5196/wvkbd.git
synced 2025-03-13 10:52:47 +01:00
Compare commits
98 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
ca53099c9d | ||
|
29639c28d5 | ||
|
745a0b6f53 | ||
|
c742b58f51 | ||
|
97efb1de74 | ||
|
125664afd5 | ||
|
6041473421 | ||
|
9cc8931b46 | ||
|
7d195c8217 | ||
|
d5db545dcc | ||
|
7d677d23b7 | ||
|
fe3257450a | ||
|
1852b3ab06 | ||
|
9d130e7fd2 | ||
|
2f72b176cb | ||
|
ba778478e6 | ||
|
d423720553 | ||
|
e3081fb6e9 | ||
|
8106d7606d | ||
|
bb237f5afa | ||
|
b083169ee4 | ||
|
538b48d08d | ||
|
de3b9a77e4 | ||
|
77c6cf4fe6 | ||
|
927918ccc5 | ||
|
9f8e73b315 | ||
|
0e17680041 | ||
|
3cccdab2e8 | ||
|
2d01b8963b | ||
|
c457d697aa | ||
|
5471e2ea0e | ||
|
a126945401 | ||
|
aa9e8ab7ab | ||
|
d6439afcb9 | ||
|
6e52be343d | ||
|
aaff22a105 | ||
|
ab56a2748b | ||
|
7ff5605303 | ||
|
02027621af | ||
|
63c209ec7f | ||
|
eefd08f431 | ||
|
76b64f6a85 | ||
|
a152fd036f | ||
|
1a36f6d5f2 | ||
|
fbbf563d70 | ||
|
2747980a4e | ||
|
34d6ce5566 | ||
|
7af5410235 | ||
|
730e97038c | ||
|
50296daa46 | ||
|
21045044ba | ||
|
9e03e120c3 | ||
|
24e354ce9e | ||
|
b1890848d5 | ||
|
8bdc761d9b | ||
|
fa659b4584 | ||
|
3752d0e392 | ||
|
4444c6e664 | ||
|
8f7142b171 | ||
|
975bd2ec32 | ||
|
47a45d557b | ||
|
c45446a794 | ||
|
73130886cc | ||
|
67ef1d40f3 | ||
|
50c40863b8 | ||
|
d75d42aaa1 | ||
|
84020a9151 | ||
|
3504f83ca6 | ||
|
fda7007955 | ||
|
9687d839f9 | ||
|
dc7ee664f0 | ||
|
db44029d87 | ||
|
4ed89188d6 | ||
|
a573be707c | ||
|
dcca9e48c7 | ||
|
ca9b028795 | ||
|
29e32edf5c | ||
|
17863cdabc | ||
|
8c6baa800b | ||
|
81e5c01a22 | ||
|
bfcd3527dd | ||
|
0ca0409400 | ||
|
f402af96fa | ||
|
74695835ad | ||
|
46f4515477 | ||
|
6101db15b9 | ||
|
848e836713 | ||
|
8bffc1adc3 | ||
|
68ea69944d | ||
|
9134b0e8f6 | ||
|
f52345aaef | ||
|
048e25d660 | ||
|
2e476c6548 | ||
|
b6ec34fe3a | ||
|
79797fc837 | ||
|
83edf203a7 | ||
|
98e6c43d54 | ||
|
2d84f0e241 |
110
.clang-format
110
.clang-format
@ -1,107 +1,5 @@
|
||||
---
|
||||
Language: Cpp
|
||||
# BasedOnStyle: LLVM
|
||||
AccessModifierOffset: -2
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignConsecutiveAssignments: false
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignEscapedNewlines: Right
|
||||
AlignOperands: true
|
||||
AlignTrailingComments: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowShortBlocksOnASingleLine: false
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: All
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
BasedOnStyle: LLVM
|
||||
IndentWidth: 4
|
||||
AlwaysBreakAfterDefinitionReturnType: All
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: false
|
||||
BinPackArguments: true
|
||||
BinPackParameters: true
|
||||
BraceWrapping:
|
||||
AfterClass: false
|
||||
AfterControlStatement: false
|
||||
AfterEnum: false
|
||||
AfterFunction: false
|
||||
AfterNamespace: false
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: false
|
||||
AfterUnion: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: true
|
||||
SplitEmptyRecord: true
|
||||
SplitEmptyNamespace: true
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeBraces: Attach
|
||||
BreakBeforeInheritanceComma: false
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
BreakConstructorInitializers: BeforeColon
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakStringLiterals: true
|
||||
ColumnLimit: 80
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
CompactNamespaces: false
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 2
|
||||
ContinuationIndentWidth: 2
|
||||
Cpp11BracedListStyle: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
FixNamespaceComments: true
|
||||
ForEachMacros:
|
||||
- foreach
|
||||
- Q_FOREACH
|
||||
- BOOST_FOREACH
|
||||
IncludeCategories:
|
||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||
Priority: 2
|
||||
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
||||
Priority: 3
|
||||
- Regex: '.*'
|
||||
Priority: 1
|
||||
IncludeIsMainRegex: '(Test)?$'
|
||||
IndentCaseLabels: false
|
||||
IndentWidth: 2
|
||||
IndentWrappedFunctionNames: false
|
||||
JavaScriptQuotes: Leave
|
||||
JavaScriptWrapImports: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
ObjCBlockIndentWidth: 2
|
||||
ObjCSpaceAfterProperty: false
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
PenaltyBreakAssignment: 2
|
||||
PenaltyBreakBeforeFirstCallParameter: 19
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyExcessCharacter: 1000000
|
||||
PenaltyReturnTypeOnItsOwnLine: 60
|
||||
PointerAlignment: Right
|
||||
ReflowComments: true
|
||||
SortIncludes: false
|
||||
SortUsingDeclarations: true
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: false
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Cpp11
|
||||
TabWidth: 2
|
||||
UseTab: ForIndentation
|
||||
...
|
||||
BreakBeforeBraces: Linux
|
||||
SortIncludes: false
|
||||
|
9
.editorconfig
Normal file
9
.editorconfig
Normal file
@ -0,0 +1,9 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
[*.c]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
charset = utf-8
|
17
Makefile
17
Makefile
@ -10,9 +10,10 @@ PKGS = wayland-client xkbcommon pangocairo
|
||||
WVKBD_SOURCES += $(wildcard $(SRC)/*.c)
|
||||
WVKBD_HEADERS += $(wildcard $(SRC)/*.h)
|
||||
|
||||
PKG_CONFIG ?= pkg-config
|
||||
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
|
||||
CFLAGS += $(shell $(PKG_CONFIG) --cflags $(PKGS))
|
||||
LDFLAGS += $(shell $(PKG_CONFIG) --libs $(PKGS)) -lm -lutil -lrt
|
||||
|
||||
WAYLAND_HEADERS = $(wildcard proto/*.xml)
|
||||
|
||||
@ -20,11 +21,14 @@ HDRS = $(WAYLAND_HEADERS:.xml=-client-protocol.h)
|
||||
WAYLAND_SRC = $(HDRS:.h=.c)
|
||||
SOURCES = $(WVKBD_SOURCES) $(WAYLAND_SRC)
|
||||
|
||||
SCDOC=scdoc
|
||||
DOCS = wvkbd.1
|
||||
|
||||
OBJECTS = $(SOURCES:.c=.o)
|
||||
|
||||
all: ${BIN}
|
||||
all: ${BIN} ${DOCS}
|
||||
|
||||
config.h: config.def.h
|
||||
config.h:
|
||||
cp config.def.h config.h
|
||||
|
||||
proto/%-client-protocol.c: proto/%.xml
|
||||
@ -39,11 +43,14 @@ wvkbd-${LAYOUT}: config.h $(OBJECTS) layout.${LAYOUT}.h
|
||||
$(CC) -o wvkbd-${LAYOUT} $(OBJECTS) $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
rm -f $(OBJECTS) $(HDRS) $(WAYLAND_SRC) ${BIN}
|
||||
rm -f $(OBJECTS) $(HDRS) $(WAYLAND_SRC) ${BIN} ${DOCS}
|
||||
|
||||
format:
|
||||
clang-format -i $(WVKBD_SOURCES) $(WVKBD_HEADERS)
|
||||
|
||||
%: %.scd
|
||||
$(SCDOC) < $< > $@
|
||||
|
||||
install: all
|
||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||
cp -f ${NAME}-${LAYOUT} ${DESTDIR}${PREFIX}/bin
|
||||
|
37
README.md
37
README.md
@ -1,6 +1,6 @@
|
||||
# wvkbd - On-screen keyboard for wlroots that sucks less
|
||||
|
||||
<img src="https://raw.githubusercontent.com/proycon/wvkbd/master/contrib/wvkbd-mobintl.jpg" width=300 /> <img src="https://raw.githubusercontent.com/proycon/wvkbd/master/contrib/wvkbd-mobintl-cyrillic.jpg" width=300 />
|
||||
<img src="https://raw.githubusercontent.com/jjsullivan5196/wvkbd/master/contrib/wvkbd-mobintl.jpg" width=300 /> <img src="https://raw.githubusercontent.com/jjsullivan5196/wvkbd/master/contrib/wvkbd-mobintl-cyrillic.jpg" width=300 />
|
||||
|
||||
This project aims to deliver a minimal but practically usable implementation of a wlroots on-screen
|
||||
keyboard in legible C. This will **only** be a keyboard, not a feedback buzzer,
|
||||
@ -17,7 +17,7 @@ new features.
|
||||
- Custom color schemes
|
||||
- Proper font drawing
|
||||
- Intuitive layouts
|
||||
- International layouts (cyrillic, arabic)
|
||||
- International layouts (cyrillic, arabic, persian, greek, georgian)
|
||||
- Support for 'Copy' keys which are not on the keymap
|
||||
- Emoji support
|
||||
- Compose key for character variants (e.g. diacritics)
|
||||
@ -25,7 +25,7 @@ new features.
|
||||
- Automatic portrait/landscape detection and subsequent layout switching
|
||||
|
||||
|
||||
<img src="https://raw.githubusercontent.com/proycon/wvkbd/master/contrib/wvkbd-mobintl-landscape.jpg" width=640 />
|
||||
<img src="https://raw.githubusercontent.com/jjsullivan5196/wvkbd/master/contrib/wvkbd-mobintl-landscape.jpg" width=640 />
|
||||
|
||||
There are some areas that still need work:
|
||||
|
||||
@ -42,6 +42,8 @@ You'll need the following developer packages
|
||||
- wayland-client
|
||||
- xkbcommon
|
||||
|
||||
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
|
||||
@ -55,10 +57,12 @@ the resulting binary will be `wvkbd-yourlayout`
|
||||
|
||||
Run `wvkbd-mobintl` (or the binary for your custom layout set).
|
||||
|
||||
You can switch between the layouts/layers of the keyboard by pressing the Abc/Sym key in the bottom-left. If you only
|
||||
want a subset of the available layers, you can define which wants you want and in what order you want to cycle through
|
||||
them using the `-l` parameter. This takes takes a ordered comma separated list of
|
||||
layout names that are defined in your 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
|
||||
forward). If you only want a subset of the available layers, you can define
|
||||
which you want and in what order you want to cycle through them using the
|
||||
`-l` parameter (or `--landscape-layers` for landscape mode). 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, 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.
|
||||
@ -73,6 +77,25 @@ Another output mode, `-O` will let the keyboard output keys which are swiped ove
|
||||
|
||||
`$ wvkbd-mobintl -O | swipeGuess.sh words.txt | completelyTypeWord.sh`
|
||||
|
||||
### Compose button
|
||||
|
||||
The default mobile international layout features a Compose button (`Cmp`)
|
||||
which, when combined with another key, opens up a layout that offers variants
|
||||
for that key. This is similar to functionality that other keyboards implemented
|
||||
using a *long press* (wvkbd has no such notion, holding a key will repeat
|
||||
it like on a physical keyboard).
|
||||
|
||||
For example, press Cmp + a to access variants with diacritics like á,à,â,ä, etc..
|
||||
|
||||
Most layouts also feature the following that are less obvious:
|
||||
|
||||
* Press Cmp + ``.`` to access more punctuation
|
||||
* Press Cmp + ``-`` or ``,`` to access 'mathematical' symbols (+,-,=,etc)
|
||||
* Press Cmp + ``'`` or ``0`` or ``9`` to access more brackets and quotes
|
||||
* Press Cmp + ``q`` to access emojis
|
||||
|
||||
Last, but not least, pressing Cmp + space or Cmp + ⌨ or Cmp + Abc opens up an index that allows you to immediately jump to any
|
||||
layout by name, even layouts not explicitly added to your layers on startup.
|
||||
|
||||
## Contribute
|
||||
|
||||
|
22
config.def.h
22
config.def.h
@ -1,38 +1,44 @@
|
||||
#ifndef config_def_h_INCLUDED
|
||||
#define config_def_h_INCLUDED
|
||||
|
||||
static const char *default_font = "Monospace 14";
|
||||
static const int transparency = 225;
|
||||
#define DEFAULT_FONT "Sans 14"
|
||||
#define DEFAULT_ROUNDING 5
|
||||
static const int transparency = 255;
|
||||
|
||||
struct clr_scheme scheme = {
|
||||
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},
|
||||
};
|
||||
struct clr_scheme scheme1 = {
|
||||
.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, Emoji, Simple, SimpleGrid, Nav, Dialer,
|
||||
Cyrillic, Arabic, Persian, Greek, Georgian,
|
||||
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[] = {
|
||||
Landscape, // First layout is the default layout on startup
|
||||
Special, Emoji, Nav, Greek,
|
||||
LandscapeSpecial,
|
||||
NumLayouts // signals the last item, may not be omitted
|
||||
};
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
VERSION = 0.12
|
||||
VERSION = 0.16.1
|
||||
CFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=700
|
||||
PREFIX = /usr/local
|
||||
MANPREFIX = ${PREFIX}/share/man
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 196 KiB After Width: | Height: | Size: 359 KiB |
Binary file not shown.
Before Width: | Height: | Size: 215 KiB After Width: | Height: | Size: 429 KiB |
195
drw.c
195
drw.c
@ -4,122 +4,165 @@
|
||||
|
||||
#include "drw.h"
|
||||
#include "shm_open.h"
|
||||
#include "math.h"
|
||||
|
||||
void
|
||||
drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, uint32_t s) {
|
||||
if (ds->buf) {
|
||||
munmap(ds->pool_data, ds->size);
|
||||
wl_buffer_destroy(ds->buf);
|
||||
ds->buf = NULL;
|
||||
}
|
||||
drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, double s)
|
||||
{
|
||||
if (ds->buf) {
|
||||
munmap(ds->pool_data, ds->size);
|
||||
wl_buffer_destroy(ds->buf);
|
||||
ds->buf = NULL;
|
||||
}
|
||||
|
||||
ds->scale = s;
|
||||
ds->width = w * s;
|
||||
ds->height = h * s;
|
||||
ds->scale = s;
|
||||
ds->width = ceil(w * s);
|
||||
ds->height = ceil(h * s);
|
||||
|
||||
setup_buffer(ds);
|
||||
setup_buffer(ds);
|
||||
}
|
||||
|
||||
void
|
||||
drwsurf_flip(struct drwsurf *ds) {
|
||||
wl_surface_attach(ds->surf, ds->buf, 0, 0);
|
||||
wl_surface_commit(ds->surf);
|
||||
drwsurf_flip(struct drwsurf *ds)
|
||||
{
|
||||
wl_surface_attach(ds->surf, ds->buf, 0, 0);
|
||||
wl_surface_commit(ds->surf);
|
||||
}
|
||||
|
||||
void
|
||||
drw_draw_text(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h, const char *label) {
|
||||
uint32_t w, uint32_t h, uint32_t b, const char *label,
|
||||
PangoFontDescription *font_description)
|
||||
{
|
||||
|
||||
cairo_save(d->cairo);
|
||||
cairo_save(d->cairo);
|
||||
|
||||
cairo_set_source_rgba(
|
||||
d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255,
|
||||
color.bgra[0] / (double)255, color.bgra[3] / (double)255);
|
||||
cairo_move_to(d->cairo, x + (double)w / 2.0, y + (double)h / 2.0);
|
||||
pango_layout_set_font_description(d->layout, font_description);
|
||||
|
||||
pango_layout_set_text(d->layout, label, -1);
|
||||
cairo_set_source_rgba(
|
||||
d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255,
|
||||
color.bgra[0] / (double)255, color.bgra[3] / (double)255);
|
||||
cairo_move_to(d->cairo, x + w / 2, y + h / 2);
|
||||
|
||||
int width, height;
|
||||
pango_layout_get_size(d->layout, &width, &height);
|
||||
pango_layout_set_text(d->layout, label, -1);
|
||||
pango_layout_set_width(d->layout, (w - (b * 2)) * PANGO_SCALE);
|
||||
pango_layout_set_height(d->layout, (h - (b * 2)) * PANGO_SCALE);
|
||||
|
||||
cairo_rel_move_to(d->cairo, -((double)width / PANGO_SCALE) / 2,
|
||||
-((double)height / PANGO_SCALE) / 2);
|
||||
pango_cairo_show_layout(d->cairo, d->layout);
|
||||
cairo_restore(d->cairo);
|
||||
int width, height;
|
||||
pango_layout_get_pixel_size(d->layout, &width, &height);
|
||||
|
||||
wl_surface_damage(d->surf, x, y, w, h);
|
||||
cairo_rel_move_to(d->cairo, -width / 2, -height / 2);
|
||||
|
||||
pango_cairo_show_layout(d->cairo, d->layout);
|
||||
cairo_restore(d->cairo);
|
||||
}
|
||||
|
||||
void
|
||||
drw_do_clear(struct drwsurf *d, uint32_t x, uint32_t y, uint32_t w, uint32_t h)
|
||||
{
|
||||
cairo_save(d->cairo);
|
||||
|
||||
cairo_set_operator(d->cairo, CAIRO_OPERATOR_CLEAR);
|
||||
cairo_rectangle(d->cairo, x, y, w, h);
|
||||
cairo_fill(d->cairo);
|
||||
|
||||
cairo_restore(d->cairo);
|
||||
}
|
||||
|
||||
void
|
||||
drw_do_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h, bool over) {
|
||||
cairo_save(d->cairo);
|
||||
uint32_t w, uint32_t h, bool over, int rounding)
|
||||
{
|
||||
cairo_save(d->cairo);
|
||||
|
||||
if (over) {
|
||||
cairo_set_operator(d->cairo, CAIRO_OPERATOR_OVER);
|
||||
} else {
|
||||
cairo_set_operator(d->cairo, CAIRO_OPERATOR_SOURCE);
|
||||
}
|
||||
if (over) {
|
||||
cairo_set_operator(d->cairo, CAIRO_OPERATOR_OVER);
|
||||
} else {
|
||||
cairo_set_operator(d->cairo, CAIRO_OPERATOR_SOURCE);
|
||||
}
|
||||
|
||||
cairo_rectangle(d->cairo, x, y, w, h);
|
||||
cairo_set_source_rgba(
|
||||
d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255,
|
||||
color.bgra[0] / (double)255, color.bgra[3] / (double)255);
|
||||
cairo_fill(d->cairo);
|
||||
if (rounding > 0) {
|
||||
double radius = rounding / 1.0;
|
||||
double degrees = M_PI / 180.0;
|
||||
|
||||
cairo_restore(d->cairo);
|
||||
cairo_new_sub_path (d->cairo);
|
||||
cairo_arc (d->cairo, x + w - radius, y + radius, radius, -90 * degrees, 0 * degrees);
|
||||
cairo_arc (d->cairo, x + w - radius, y + h - radius, radius, 0 * degrees, 90 * degrees);
|
||||
cairo_arc (d->cairo, x + radius, y + h - radius, radius, 90 * degrees, 180 * degrees);
|
||||
cairo_arc (d->cairo, x + radius, y + radius, radius, 180 * degrees, 270 * degrees);
|
||||
cairo_close_path (d->cairo);
|
||||
|
||||
wl_surface_damage(d->surf, x, y, w, h);
|
||||
cairo_set_source_rgba(
|
||||
d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255,
|
||||
color.bgra[0] / (double)255, color.bgra[3] / (double)255);
|
||||
cairo_fill (d->cairo);
|
||||
cairo_set_source_rgba(d->cairo, 0, 0, 0, 0.9);
|
||||
cairo_set_line_width(d->cairo, 1.0);
|
||||
cairo_stroke(d->cairo);
|
||||
|
||||
cairo_restore(d->cairo);
|
||||
}
|
||||
else {
|
||||
cairo_rectangle(d->cairo, x, y, w, h);
|
||||
cairo_set_source_rgba(
|
||||
d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255,
|
||||
color.bgra[0] / (double)255, color.bgra[3] / (double)255);
|
||||
cairo_fill(d->cairo);
|
||||
|
||||
cairo_restore(d->cairo);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
drw_fill_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h) {
|
||||
drw_do_rectangle(d, color, x, y, w, h, false);
|
||||
uint32_t w, uint32_t h, int rounding)
|
||||
{
|
||||
drw_do_rectangle(d, color, x, y, w, h, false, rounding);
|
||||
}
|
||||
|
||||
void
|
||||
drw_over_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h) {
|
||||
drw_do_rectangle(d, color, x, y, w, h, true);
|
||||
uint32_t w, uint32_t h, int rounding)
|
||||
{
|
||||
drw_do_rectangle(d, color, x, y, w, h, true, rounding);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
setup_buffer(struct drwsurf *drwsurf) {
|
||||
int stride = drwsurf->width * 4;
|
||||
drwsurf->size = stride * drwsurf->height;
|
||||
setup_buffer(struct drwsurf *drwsurf)
|
||||
{
|
||||
int stride = drwsurf->width * 4;
|
||||
drwsurf->size = stride * drwsurf->height;
|
||||
|
||||
int fd = allocate_shm_file(drwsurf->size);
|
||||
if (fd == -1) {
|
||||
return 1;
|
||||
}
|
||||
int fd = allocate_shm_file(drwsurf->size);
|
||||
if (fd == -1) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
drwsurf->pool_data =
|
||||
mmap(NULL, drwsurf->size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
if (drwsurf->pool_data == MAP_FAILED) {
|
||||
close(fd);
|
||||
return 1;
|
||||
}
|
||||
drwsurf->pool_data =
|
||||
mmap(NULL, drwsurf->size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
if (drwsurf->pool_data == MAP_FAILED) {
|
||||
close(fd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct wl_shm_pool *pool =
|
||||
wl_shm_create_pool(drwsurf->ctx->shm, fd, drwsurf->size);
|
||||
drwsurf->buf = wl_shm_pool_create_buffer(
|
||||
pool, 0, drwsurf->width, drwsurf->height, stride, WL_SHM_FORMAT_ARGB8888);
|
||||
wl_shm_pool_destroy(pool);
|
||||
close(fd);
|
||||
struct wl_shm_pool *pool =
|
||||
wl_shm_create_pool(drwsurf->ctx->shm, fd, drwsurf->size);
|
||||
drwsurf->buf =
|
||||
wl_shm_pool_create_buffer(pool, 0, drwsurf->width, drwsurf->height,
|
||||
stride, WL_SHM_FORMAT_ARGB8888);
|
||||
wl_shm_pool_destroy(pool);
|
||||
close(fd);
|
||||
|
||||
cairo_surface_t *s = cairo_image_surface_create_for_data(
|
||||
drwsurf->pool_data, CAIRO_FORMAT_ARGB32, drwsurf->width, drwsurf->height,
|
||||
stride);
|
||||
cairo_surface_t *s = cairo_image_surface_create_for_data(
|
||||
drwsurf->pool_data, CAIRO_FORMAT_ARGB32, drwsurf->width,
|
||||
drwsurf->height, stride);
|
||||
|
||||
drwsurf->cairo = cairo_create(s);
|
||||
cairo_scale(drwsurf->cairo, drwsurf->scale, drwsurf->scale);
|
||||
drwsurf->layout = pango_cairo_create_layout(drwsurf->cairo);
|
||||
pango_layout_set_font_description(drwsurf->layout,
|
||||
drwsurf->ctx->font_description);
|
||||
cairo_save(drwsurf->cairo);
|
||||
drwsurf->cairo = cairo_create(s);
|
||||
cairo_scale(drwsurf->cairo, drwsurf->scale, drwsurf->scale);
|
||||
cairo_set_antialias(drwsurf->cairo, CAIRO_ANTIALIAS_NONE);
|
||||
drwsurf->layout = pango_cairo_create_layout(drwsurf->cairo);
|
||||
pango_layout_set_auto_dir(drwsurf->layout, false);
|
||||
cairo_save(drwsurf->cairo);
|
||||
|
||||
wl_surface_set_buffer_scale(drwsurf->surf, drwsurf->scale);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
17
drw.h
17
drw.h
@ -6,10 +6,10 @@
|
||||
|
||||
struct drw {
|
||||
struct wl_shm *shm;
|
||||
PangoFontDescription *font_description;
|
||||
};
|
||||
struct drwsurf {
|
||||
uint32_t width, height, scale, size;
|
||||
uint32_t width, height, size;
|
||||
double scale;
|
||||
|
||||
struct drw *ctx;
|
||||
struct wl_surface *surf;
|
||||
@ -22,7 +22,7 @@ struct drwsurf {
|
||||
};
|
||||
struct kbd;
|
||||
|
||||
void drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, uint32_t s);
|
||||
void drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, double s);
|
||||
void drwsurf_flip(struct drwsurf *ds);
|
||||
|
||||
typedef union {
|
||||
@ -30,15 +30,18 @@ typedef union {
|
||||
uint32_t color;
|
||||
} Color;
|
||||
|
||||
void drw_do_clear(struct drwsurf *d, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h);
|
||||
void drw_do_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h, bool fill);
|
||||
uint32_t w, uint32_t h, bool fill, int rounding);
|
||||
void drw_fill_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h);
|
||||
uint32_t w, uint32_t h, int rounding);
|
||||
void drw_over_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h);
|
||||
uint32_t w, uint32_t h, int rounding);
|
||||
|
||||
void drw_draw_text(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||
uint32_t w, uint32_t h, const char *label);
|
||||
uint32_t w, uint32_t h, uint32_t b, const char *label,
|
||||
PangoFontDescription *font_description);
|
||||
|
||||
uint32_t setup_buffer(struct drwsurf *drwsurf);
|
||||
|
||||
|
1046
keyboard.c
1046
keyboard.c
File diff suppressed because it is too large
Load Diff
30
keyboard.h
30
keyboard.h
@ -42,7 +42,8 @@ enum key_modifier_type {
|
||||
};
|
||||
|
||||
enum key_draw_type {
|
||||
Unpress = 0,
|
||||
None = 0,
|
||||
Unpress,
|
||||
Press,
|
||||
Swipe,
|
||||
};
|
||||
@ -53,6 +54,9 @@ struct clr_scheme {
|
||||
Color high;
|
||||
Color swipe;
|
||||
Color text;
|
||||
char *font;
|
||||
int rounding;
|
||||
PangoFontDescription *font_description;
|
||||
};
|
||||
|
||||
struct key {
|
||||
@ -81,6 +85,7 @@ struct layout {
|
||||
struct key *keys;
|
||||
const char *keymap_name;
|
||||
const char *name;
|
||||
bool abc; //is this an alphabetical/abjad layout or not? (i.e. something that is a primary input layout)
|
||||
uint32_t keyheight; // absolute height (pixels)
|
||||
};
|
||||
|
||||
@ -88,48 +93,57 @@ struct kbd {
|
||||
bool debug;
|
||||
|
||||
struct layout *layout;
|
||||
struct clr_scheme scheme;
|
||||
struct clr_scheme scheme1;
|
||||
struct clr_scheme *schemes;
|
||||
|
||||
bool print;
|
||||
bool print_intersect;
|
||||
uint32_t w, h, s;
|
||||
uint32_t w, h;
|
||||
double scale;
|
||||
double preferred_scale, preferred_fractional_scale;
|
||||
bool landscape;
|
||||
uint8_t mods;
|
||||
uint8_t compose;
|
||||
struct key *last_press;
|
||||
struct key *last_swipe;
|
||||
struct layout *prevlayout;
|
||||
struct layout *prevlayout; //the previous layout, needed to keep track of keymap changes
|
||||
size_t layer_index;
|
||||
struct layout *last_abc_layout; //the last alphabetical layout to fall back to (may be further away than prevlayout)
|
||||
size_t last_abc_index; //the layer index of the last alphabetical layout
|
||||
|
||||
struct layout *layouts;
|
||||
enum layout_id *layers;
|
||||
enum layout_id *landscape_layers;
|
||||
|
||||
struct drwsurf *surf;
|
||||
struct drwsurf *popup_surf;
|
||||
struct zwp_virtual_keyboard_v1 *vkbd;
|
||||
|
||||
uint32_t last_popup_x, last_popup_y, last_popup_w, last_popup_h;
|
||||
};
|
||||
|
||||
void draw_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width,
|
||||
uint32_t height, uint32_t border, Color color);
|
||||
uint32_t height, uint32_t border, Color color, int rounding);
|
||||
void draw_over_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width,
|
||||
uint32_t height, uint32_t border, Color color);
|
||||
uint32_t height, uint32_t border, Color color, int rounding);
|
||||
|
||||
void kbd_init(struct kbd *kb, struct layout *layouts,
|
||||
char *layer_names_list, char *landscape_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);
|
||||
size_t kbd_get_layer_index(struct kbd *kb, struct layout *l);
|
||||
void kbd_unpress_key(struct kbd *kb, uint32_t time);
|
||||
void kbd_release_key(struct kbd *kb, uint32_t time);
|
||||
void kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y);
|
||||
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_clear_last_popup(struct kbd *kb);
|
||||
void kbd_draw_key(struct kbd *kb, struct key *k, enum key_draw_type);
|
||||
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 kbd_next_layer(struct kbd *kb, struct key *k, bool invert);
|
||||
void kbd_switch_layout(struct kbd *kb, struct layout *l, size_t layer_index);
|
||||
|
||||
void create_and_upload_keymap(struct kbd *kb, const char *name,
|
||||
uint32_t comp_unichr, uint32_t comp_shift_unichr);
|
||||
|
1466
keymap.mobintl.h
1466
keymap.mobintl.h
File diff suppressed because it is too large
Load Diff
1025
layout.mobintl.h
1025
layout.mobintl.h
File diff suppressed because it is too large
Load Diff
@ -35,89 +35,94 @@
|
||||
#include "os-compatibility.h"
|
||||
|
||||
int
|
||||
os_fd_set_cloexec(int fd) {
|
||||
long flags;
|
||||
os_fd_set_cloexec(int fd)
|
||||
{
|
||||
long flags;
|
||||
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
|
||||
flags = fcntl(fd, F_GETFD);
|
||||
if (flags == -1)
|
||||
return -1;
|
||||
flags = fcntl(fd, F_GETFD);
|
||||
if (flags == -1)
|
||||
return -1;
|
||||
|
||||
if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1)
|
||||
return -1;
|
||||
if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
set_cloexec_or_close(int fd) {
|
||||
if (os_fd_set_cloexec(fd) != 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
set_cloexec_or_close(int fd)
|
||||
{
|
||||
if (os_fd_set_cloexec(fd) != 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
int
|
||||
os_socketpair_cloexec(int domain, int type, int protocol, int *sv) {
|
||||
int ret;
|
||||
os_socketpair_cloexec(int domain, int type, int protocol, int *sv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
#ifdef SOCK_CLOEXEC
|
||||
ret = socketpair(domain, type | SOCK_CLOEXEC, protocol, sv);
|
||||
if (ret == 0 || errno != EINVAL)
|
||||
return ret;
|
||||
ret = socketpair(domain, type | SOCK_CLOEXEC, protocol, sv);
|
||||
if (ret == 0 || errno != EINVAL)
|
||||
return ret;
|
||||
#endif
|
||||
|
||||
ret = socketpair(domain, type, protocol, sv);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = socketpair(domain, type, protocol, sv);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
sv[0] = set_cloexec_or_close(sv[0]);
|
||||
sv[1] = set_cloexec_or_close(sv[1]);
|
||||
sv[0] = set_cloexec_or_close(sv[0]);
|
||||
sv[1] = set_cloexec_or_close(sv[1]);
|
||||
|
||||
if (sv[0] != -1 && sv[1] != -1)
|
||||
return 0;
|
||||
if (sv[0] != -1 && sv[1] != -1)
|
||||
return 0;
|
||||
|
||||
close(sv[0]);
|
||||
close(sv[1]);
|
||||
return -1;
|
||||
close(sv[0]);
|
||||
close(sv[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
os_epoll_create_cloexec(void) {
|
||||
int fd;
|
||||
os_epoll_create_cloexec(void)
|
||||
{
|
||||
int fd;
|
||||
|
||||
#ifdef EPOLL_CLOEXEC
|
||||
fd = epoll_create1(EPOLL_CLOEXEC);
|
||||
if (fd >= 0)
|
||||
return fd;
|
||||
if (errno != EINVAL)
|
||||
return -1;
|
||||
fd = epoll_create1(EPOLL_CLOEXEC);
|
||||
if (fd >= 0)
|
||||
return fd;
|
||||
if (errno != EINVAL)
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
fd = epoll_create(1);
|
||||
return set_cloexec_or_close(fd);
|
||||
fd = epoll_create(1);
|
||||
return set_cloexec_or_close(fd);
|
||||
}
|
||||
|
||||
static int
|
||||
create_tmpfile_cloexec(char *tmpname) {
|
||||
int fd;
|
||||
create_tmpfile_cloexec(char *tmpname)
|
||||
{
|
||||
int fd;
|
||||
|
||||
#ifdef HAVE_MKOSTEMP
|
||||
fd = mkostemp(tmpname, O_CLOEXEC);
|
||||
if (fd >= 0)
|
||||
unlink(tmpname);
|
||||
fd = mkostemp(tmpname, O_CLOEXEC);
|
||||
if (fd >= 0)
|
||||
unlink(tmpname);
|
||||
#else
|
||||
fd = mkstemp(tmpname);
|
||||
if (fd >= 0) {
|
||||
fd = set_cloexec_or_close(fd);
|
||||
unlink(tmpname);
|
||||
}
|
||||
fd = mkstemp(tmpname);
|
||||
if (fd >= 0) {
|
||||
fd = set_cloexec_or_close(fd);
|
||||
unlink(tmpname);
|
||||
}
|
||||
#endif
|
||||
|
||||
return fd;
|
||||
return fd;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -142,60 +147,62 @@ create_tmpfile_cloexec(char *tmpname) {
|
||||
* SIGBUS on accessing mmap()'ed file contents instead.
|
||||
*/
|
||||
int
|
||||
os_create_anonymous_file(off_t size) {
|
||||
static const char template[] = "/weston-shared-XXXXXX";
|
||||
const char *path;
|
||||
char *name;
|
||||
int fd;
|
||||
int ret;
|
||||
os_create_anonymous_file(off_t size)
|
||||
{
|
||||
static const char template[] = "/weston-shared-XXXXXX";
|
||||
const char *path;
|
||||
char *name;
|
||||
int fd;
|
||||
int ret;
|
||||
|
||||
path = getenv("XDG_RUNTIME_DIR");
|
||||
if (!path) {
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
path = getenv("XDG_RUNTIME_DIR");
|
||||
if (!path) {
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
name = malloc(strlen(path) + sizeof(template));
|
||||
if (!name)
|
||||
return -1;
|
||||
name = malloc(strlen(path) + sizeof(template));
|
||||
if (!name)
|
||||
return -1;
|
||||
|
||||
strcpy(name, path);
|
||||
strcat(name, template);
|
||||
strcpy(name, path);
|
||||
strcat(name, template);
|
||||
|
||||
fd = create_tmpfile_cloexec(name);
|
||||
fd = create_tmpfile_cloexec(name);
|
||||
|
||||
free(name);
|
||||
free(name);
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
#ifdef HAVE_POSIX_FALLOCATE
|
||||
do {
|
||||
ret = posix_fallocate(fd, 0, size);
|
||||
} while (ret == EINTR);
|
||||
if (ret != 0) {
|
||||
close(fd);
|
||||
errno = ret;
|
||||
return -1;
|
||||
}
|
||||
do {
|
||||
ret = posix_fallocate(fd, 0, size);
|
||||
} while (ret == EINTR);
|
||||
if (ret != 0) {
|
||||
close(fd);
|
||||
errno = ret;
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
do {
|
||||
ret = ftruncate(fd, size);
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
if (ret < 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
do {
|
||||
ret = ftruncate(fd, size);
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
if (ret < 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
return fd;
|
||||
return fd;
|
||||
}
|
||||
|
||||
#ifndef MISSING_STRCHRNUL
|
||||
char *
|
||||
strchrnul(const char *s, int c) {
|
||||
while (*s && *s != c)
|
||||
s++;
|
||||
return (char *)s;
|
||||
strchrnul(const char *s, int c)
|
||||
{
|
||||
while (*s && *s != c)
|
||||
s++;
|
||||
return (char *)s;
|
||||
}
|
||||
#endif
|
||||
|
102
proto/fractional-scale-v1.xml
Normal file
102
proto/fractional-scale-v1.xml
Normal file
@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="fractional_scale_v1">
|
||||
<copyright>
|
||||
Copyright © 2022 Kenny Levinsen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<description summary="Protocol for requesting fractional surface scales">
|
||||
This protocol allows a compositor to suggest for surfaces to render at
|
||||
fractional scales.
|
||||
|
||||
A client can submit scaled content by utilizing wp_viewport. This is done by
|
||||
creating a wp_viewport object for the surface and setting the destination
|
||||
rectangle to the surface size before the scale factor is applied.
|
||||
|
||||
The buffer size is calculated by multiplying the surface size by the
|
||||
intended scale.
|
||||
|
||||
The wl_surface buffer scale should remain set to 1.
|
||||
|
||||
If a surface has a surface-local size of 100 px by 50 px and wishes to
|
||||
submit buffers with a scale of 1.5, then a buffer of 150px by 75 px should
|
||||
be used and the wp_viewport destination rectangle should be 100 px by 50 px.
|
||||
|
||||
For toplevel surfaces, the size is rounded halfway away from zero. The
|
||||
rounding algorithm for subsurface position and size is not defined.
|
||||
</description>
|
||||
|
||||
<interface name="wp_fractional_scale_manager_v1" version="1">
|
||||
<description summary="fractional surface scale information">
|
||||
A global interface for requesting surfaces to use fractional scales.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="unbind the fractional surface scale interface">
|
||||
Informs the server that the client will not be using this protocol
|
||||
object anymore. This does not affect any other objects,
|
||||
wp_fractional_scale_v1 objects included.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="fractional_scale_exists" value="0"
|
||||
summary="the surface already has a fractional_scale object associated"/>
|
||||
</enum>
|
||||
|
||||
<request name="get_fractional_scale">
|
||||
<description summary="extend surface interface for scale information">
|
||||
Create an add-on object for the the wl_surface to let the compositor
|
||||
request fractional scales. If the given wl_surface already has a
|
||||
wp_fractional_scale_v1 object associated, the fractional_scale_exists
|
||||
protocol error is raised.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_fractional_scale_v1"
|
||||
summary="the new surface scale info interface id"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_fractional_scale_v1" version="1">
|
||||
<description summary="fractional scale interface to a wl_surface">
|
||||
An additional interface to a wl_surface object which allows the compositor
|
||||
to inform the client of the preferred scale.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="remove surface scale information for surface">
|
||||
Destroy the fractional scale object. When this object is destroyed,
|
||||
preferred_scale events will no longer be sent.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<event name="preferred_scale">
|
||||
<description summary="notify of new preferred scale">
|
||||
Notification of a new preferred scale for this surface that the
|
||||
compositor suggests that the client should use.
|
||||
|
||||
The sent scale is the numerator of a fraction with a denominator of 120.
|
||||
</description>
|
||||
<arg name="scale" type="uint" summary="the new preferred scale"/>
|
||||
</event>
|
||||
</interface>
|
||||
</protocol>
|
180
proto/viewporter.xml
Normal file
180
proto/viewporter.xml
Normal file
@ -0,0 +1,180 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="viewporter">
|
||||
|
||||
<copyright>
|
||||
Copyright © 2013-2016 Collabora, Ltd.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice (including the next
|
||||
paragraph) shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="wp_viewporter" version="1">
|
||||
<description summary="surface cropping and scaling">
|
||||
The global interface exposing surface cropping and scaling
|
||||
capabilities is used to instantiate an interface extension for a
|
||||
wl_surface object. This extended interface will then allow
|
||||
cropping and scaling the surface contents, effectively
|
||||
disconnecting the direct relationship between the buffer and the
|
||||
surface size.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="unbind from the cropping and scaling interface">
|
||||
Informs the server that the client will not be using this
|
||||
protocol object anymore. This does not affect any other objects,
|
||||
wp_viewport objects included.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="viewport_exists" value="0"
|
||||
summary="the surface already has a viewport object associated"/>
|
||||
</enum>
|
||||
|
||||
<request name="get_viewport">
|
||||
<description summary="extend surface interface for crop and scale">
|
||||
Instantiate an interface extension for the given wl_surface to
|
||||
crop and scale its content. If the given wl_surface already has
|
||||
a wp_viewport object associated, the viewport_exists
|
||||
protocol error is raised.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="wp_viewport"
|
||||
summary="the new viewport interface id"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"
|
||||
summary="the surface"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="wp_viewport" version="1">
|
||||
<description summary="crop and scale interface to a wl_surface">
|
||||
An additional interface to a wl_surface object, which allows the
|
||||
client to specify the cropping and scaling of the surface
|
||||
contents.
|
||||
|
||||
This interface works with two concepts: the source rectangle (src_x,
|
||||
src_y, src_width, src_height), and the destination size (dst_width,
|
||||
dst_height). The contents of the source rectangle are scaled to the
|
||||
destination size, and content outside the source rectangle is ignored.
|
||||
This state is double-buffered, and is applied on the next
|
||||
wl_surface.commit.
|
||||
|
||||
The two parts of crop and scale state are independent: the source
|
||||
rectangle, and the destination size. Initially both are unset, that
|
||||
is, no scaling is applied. The whole of the current wl_buffer is
|
||||
used as the source, and the surface size is as defined in
|
||||
wl_surface.attach.
|
||||
|
||||
If the destination size is set, it causes the surface size to become
|
||||
dst_width, dst_height. The source (rectangle) is scaled to exactly
|
||||
this size. This overrides whatever the attached wl_buffer size is,
|
||||
unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface
|
||||
has no content and therefore no size. Otherwise, the size is always
|
||||
at least 1x1 in surface local coordinates.
|
||||
|
||||
If the source rectangle is set, it defines what area of the wl_buffer is
|
||||
taken as the source. If the source rectangle is set and the destination
|
||||
size is not set, then src_width and src_height must be integers, and the
|
||||
surface size becomes the source rectangle size. This results in cropping
|
||||
without scaling. If src_width or src_height are not integers and
|
||||
destination size is not set, the bad_size protocol error is raised when
|
||||
the surface state is applied.
|
||||
|
||||
The coordinate transformations from buffer pixel coordinates up to
|
||||
the surface-local coordinates happen in the following order:
|
||||
1. buffer_transform (wl_surface.set_buffer_transform)
|
||||
2. buffer_scale (wl_surface.set_buffer_scale)
|
||||
3. crop and scale (wp_viewport.set*)
|
||||
This means, that the source rectangle coordinates of crop and scale
|
||||
are given in the coordinates after the buffer transform and scale,
|
||||
i.e. in the coordinates that would be the surface-local coordinates
|
||||
if the crop and scale was not applied.
|
||||
|
||||
If src_x or src_y are negative, the bad_value protocol error is raised.
|
||||
Otherwise, if the source rectangle is partially or completely outside of
|
||||
the non-NULL wl_buffer, then the out_of_buffer protocol error is raised
|
||||
when the surface state is applied. A NULL wl_buffer does not raise the
|
||||
out_of_buffer error.
|
||||
|
||||
If the wl_surface associated with the wp_viewport is destroyed,
|
||||
all wp_viewport requests except 'destroy' raise the protocol error
|
||||
no_surface.
|
||||
|
||||
If the wp_viewport object is destroyed, the crop and scale
|
||||
state is removed from the wl_surface. The change will be applied
|
||||
on the next wl_surface.commit.
|
||||
</description>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="remove scaling and cropping from the surface">
|
||||
The associated wl_surface's crop and scale state is removed.
|
||||
The change is applied on the next wl_surface.commit.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="bad_value" value="0"
|
||||
summary="negative or zero values in width or height"/>
|
||||
<entry name="bad_size" value="1"
|
||||
summary="destination size is not integer"/>
|
||||
<entry name="out_of_buffer" value="2"
|
||||
summary="source rectangle extends outside of the content area"/>
|
||||
<entry name="no_surface" value="3"
|
||||
summary="the wl_surface was destroyed"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_source">
|
||||
<description summary="set the source rectangle for cropping">
|
||||
Set the source rectangle of the associated wl_surface. See
|
||||
wp_viewport for the description, and relation to the wl_buffer
|
||||
size.
|
||||
|
||||
If all of x, y, width and height are -1.0, the source rectangle is
|
||||
unset instead. Any other set of values where width or height are zero
|
||||
or negative, or x or y are negative, raise the bad_value protocol
|
||||
error.
|
||||
|
||||
The crop and scale state is double-buffered state, and will be
|
||||
applied on the next wl_surface.commit.
|
||||
</description>
|
||||
<arg name="x" type="fixed" summary="source rectangle x"/>
|
||||
<arg name="y" type="fixed" summary="source rectangle y"/>
|
||||
<arg name="width" type="fixed" summary="source rectangle width"/>
|
||||
<arg name="height" type="fixed" summary="source rectangle height"/>
|
||||
</request>
|
||||
|
||||
<request name="set_destination">
|
||||
<description summary="set the surface size for scaling">
|
||||
Set the destination size of the associated wl_surface. See
|
||||
wp_viewport for the description, and relation to the wl_buffer
|
||||
size.
|
||||
|
||||
If width is -1 and height is -1, the destination size is unset
|
||||
instead. Any other pair of values for width and height that
|
||||
contains zero or negative values raises the bad_value protocol
|
||||
error.
|
||||
|
||||
The crop and scale state is double-buffered state, and will be
|
||||
applied on the next wl_surface.commit.
|
||||
</description>
|
||||
<arg name="width" type="int" summary="surface width"/>
|
||||
<arg name="height" type="int" summary="surface height"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
@ -25,7 +25,7 @@
|
||||
THIS SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="zwlr_layer_shell_v1" version="3">
|
||||
<interface name="zwlr_layer_shell_v1" version="4">
|
||||
<description summary="create surfaces that are layers of the desktop">
|
||||
Clients can use this interface to assign the surface_layer role to
|
||||
wl_surfaces. Such surfaces are assigned to a "layer" of the output and
|
||||
@ -100,7 +100,7 @@
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="zwlr_layer_surface_v1" version="3">
|
||||
<interface name="zwlr_layer_surface_v1" version="4">
|
||||
<description summary="layer metadata interface">
|
||||
An interface that may be implemented by a wl_surface, for surfaces that
|
||||
are designed to be rendered as a layer of a stacked desktop-like
|
||||
@ -203,21 +203,85 @@
|
||||
<arg name="left" type="int"/>
|
||||
</request>
|
||||
|
||||
<enum name="keyboard_interactivity">
|
||||
<description summary="types of keyboard interaction possible for a layer shell surface">
|
||||
Types of keyboard interaction possible for layer shell surfaces. The
|
||||
rationale for this is twofold: (1) some applications are not interested
|
||||
in keyboard events and not allowing them to be focused can improve the
|
||||
desktop experience; (2) some applications will want to take exclusive
|
||||
keyboard focus.
|
||||
</description>
|
||||
|
||||
<entry name="none" value="0">
|
||||
<description summary="no keyboard focus is possible">
|
||||
This value indicates that this surface is not interested in keyboard
|
||||
events and the compositor should never assign it the keyboard focus.
|
||||
|
||||
This is the default value, set for newly created layer shell surfaces.
|
||||
|
||||
This is useful for e.g. desktop widgets that display information or
|
||||
only have interaction with non-keyboard input devices.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="exclusive" value="1">
|
||||
<description summary="request exclusive keyboard focus">
|
||||
Request exclusive keyboard focus if this surface is above the shell surface layer.
|
||||
|
||||
For the top and overlay layers, the seat will always give
|
||||
exclusive keyboard focus to the top-most layer which has keyboard
|
||||
interactivity set to exclusive. If this layer contains multiple
|
||||
surfaces with keyboard interactivity set to exclusive, the compositor
|
||||
determines the one receiving keyboard events in an implementation-
|
||||
defined manner. In this case, no guarantee is made when this surface
|
||||
will receive keyboard focus (if ever).
|
||||
|
||||
For the bottom and background layers, the compositor is allowed to use
|
||||
normal focus semantics.
|
||||
|
||||
This setting is mainly intended for applications that need to ensure
|
||||
they receive all keyboard events, such as a lock screen or a password
|
||||
prompt.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="on_demand" value="2" since="4">
|
||||
<description summary="request regular keyboard focus semantics">
|
||||
This requests the compositor to allow this surface to be focused and
|
||||
unfocused by the user in an implementation-defined manner. The user
|
||||
should be able to unfocus this surface even regardless of the layer
|
||||
it is on.
|
||||
|
||||
Typically, the compositor will want to use its normal mechanism to
|
||||
manage keyboard focus between layer shell surfaces with this setting
|
||||
and regular toplevels on the desktop layer (e.g. click to focus).
|
||||
Nevertheless, it is possible for a compositor to require a special
|
||||
interaction to focus or unfocus layer shell surfaces (e.g. requiring
|
||||
a click even if focus follows the mouse normally, or providing a
|
||||
keybinding to switch focus between layers).
|
||||
|
||||
This setting is mainly intended for desktop shell components (e.g.
|
||||
panels) that allow keyboard interaction. Using this option can allow
|
||||
implementing a desktop shell that can be fully usable without the
|
||||
mouse.
|
||||
</description>
|
||||
</entry>
|
||||
</enum>
|
||||
|
||||
<request name="set_keyboard_interactivity">
|
||||
<description summary="requests keyboard events">
|
||||
Set to 1 to request that the seat send keyboard events to this layer
|
||||
surface. For layers below the shell surface layer, the seat will use
|
||||
normal focus semantics. For layers above the shell surface layers, the
|
||||
seat will always give exclusive keyboard focus to the top-most layer
|
||||
which has keyboard interactivity set to true.
|
||||
Set how keyboard events are delivered to this surface. By default,
|
||||
layer shell surfaces do not receive keyboard events; this request can
|
||||
be used to change this.
|
||||
|
||||
This setting is inherited by child surfaces set by the get_popup
|
||||
request.
|
||||
|
||||
Layer surfaces receive pointer, touch, and tablet events normally. If
|
||||
you do not want to receive them, set the input region on your surface
|
||||
to an empty region.
|
||||
|
||||
Events is double-buffered, see wl_surface.commit.
|
||||
Keyboard interactivity is double-buffered, see wl_surface.commit.
|
||||
</description>
|
||||
<arg name="keyboard_interactivity" type="uint"/>
|
||||
<arg name="keyboard_interactivity" type="uint" enum="keyboard_interactivity"/>
|
||||
</request>
|
||||
|
||||
<request name="get_popup">
|
||||
@ -302,6 +366,7 @@
|
||||
<entry name="invalid_surface_state" value="0" summary="provided surface state is invalid"/>
|
||||
<entry name="invalid_size" value="1" summary="size is invalid"/>
|
||||
<entry name="invalid_anchor" value="2" summary="anchor bitfield is invalid"/>
|
||||
<entry name="invalid_keyboard_interactivity" value="3" summary="keyboard interactivity is invalid"/>
|
||||
</enum>
|
||||
|
||||
<enum name="anchor" bitfield="true">
|
||||
|
@ -29,7 +29,7 @@
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
</copyright>
|
||||
|
||||
<interface name="xdg_wm_base" version="2">
|
||||
<interface name="xdg_wm_base" version="6">
|
||||
<description summary="create desktop-style surfaces">
|
||||
The xdg_wm_base interface is exposed as a global object enabling clients
|
||||
to turn their wl_surfaces into windows in a desktop environment. It
|
||||
@ -50,6 +50,8 @@
|
||||
summary="the client provided an invalid surface state"/>
|
||||
<entry name="invalid_positioner" value="5"
|
||||
summary="the client provided an invalid positioner"/>
|
||||
<entry name="unresponsive" value="6"
|
||||
summary="the client didn’t respond to a ping event in time"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
@ -58,7 +60,7 @@
|
||||
|
||||
Destroying a bound xdg_wm_base object while there are surfaces
|
||||
still alive created by this xdg_wm_base object instance is illegal
|
||||
and will result in a protocol error.
|
||||
and will result in a defunct_surfaces error.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
@ -75,7 +77,9 @@
|
||||
<description summary="create a shell surface from a surface">
|
||||
This creates an xdg_surface for the given surface. While xdg_surface
|
||||
itself is not a role, the corresponding surface may only be assigned
|
||||
a role extending xdg_surface, such as xdg_toplevel or xdg_popup.
|
||||
a role extending xdg_surface, such as xdg_toplevel or xdg_popup. It is
|
||||
illegal to create an xdg_surface for a wl_surface which already has an
|
||||
assigned role and this will result in a role error.
|
||||
|
||||
This creates an xdg_surface for the given surface. An xdg_surface is
|
||||
used as basis to define a role to a given surface, such as xdg_toplevel
|
||||
@ -92,7 +96,8 @@
|
||||
<request name="pong">
|
||||
<description summary="respond to a ping event">
|
||||
A client must respond to a ping event with a pong request or
|
||||
the client may be deemed unresponsive. See xdg_wm_base.ping.
|
||||
the client may be deemed unresponsive. See xdg_wm_base.ping
|
||||
and xdg_wm_base.error.unresponsive.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="serial of the ping event"/>
|
||||
</request>
|
||||
@ -101,12 +106,14 @@
|
||||
<description summary="check if the client is alive">
|
||||
The ping event asks the client if it's still alive. Pass the
|
||||
serial specified in the event back to the compositor by sending
|
||||
a "pong" request back with the specified serial. See xdg_wm_base.ping.
|
||||
a "pong" request back with the specified serial. See xdg_wm_base.pong.
|
||||
|
||||
Compositors can use this to determine if the client is still
|
||||
alive. It's unspecified what will happen if the client doesn't
|
||||
respond to the ping request, or in what timeframe. Clients should
|
||||
try to respond in a reasonable amount of time.
|
||||
try to respond in a reasonable amount of time. The “unresponsive”
|
||||
error is provided for compositors that wish to disconnect unresponsive
|
||||
clients.
|
||||
|
||||
A compositor is free to ping in any way it wants, but a client must
|
||||
always respond to any xdg_wm_base object it created.
|
||||
@ -115,7 +122,7 @@
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_positioner" version="2">
|
||||
<interface name="xdg_positioner" version="6">
|
||||
<description summary="child surface positioner">
|
||||
The xdg_positioner provides a collection of rules for the placement of a
|
||||
child surface relative to a parent surface. Rules can be defined to ensure
|
||||
@ -135,7 +142,7 @@
|
||||
For an xdg_positioner object to be considered complete, it must have a
|
||||
non-zero size set by set_size, and a non-zero anchor rectangle set by
|
||||
set_anchor_rect. Passing an incomplete xdg_positioner object when
|
||||
positioning a surface raises an error.
|
||||
positioning a surface raises an invalid_positioner error.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
@ -223,7 +230,8 @@
|
||||
specified (e.g. 'bottom_right' or 'top_left'), then the child surface
|
||||
will be placed towards the specified gravity; otherwise, the child
|
||||
surface will be centered over the anchor point on any axis that had no
|
||||
gravity specified.
|
||||
gravity specified. If the gravity is not in the ‘gravity’ enum, an
|
||||
invalid_input error is raised.
|
||||
</description>
|
||||
<arg name="gravity" type="uint" enum="gravity"
|
||||
summary="gravity direction"/>
|
||||
@ -357,9 +365,49 @@
|
||||
<arg name="x" type="int" summary="surface position x offset"/>
|
||||
<arg name="y" type="int" summary="surface position y offset"/>
|
||||
</request>
|
||||
|
||||
<!-- Version 3 additions -->
|
||||
|
||||
<request name="set_reactive" since="3">
|
||||
<description summary="continuously reconstrain the surface">
|
||||
When set reactive, the surface is reconstrained if the conditions used
|
||||
for constraining changed, e.g. the parent window moved.
|
||||
|
||||
If the conditions changed and the popup was reconstrained, an
|
||||
xdg_popup.configure event is sent with updated geometry, followed by an
|
||||
xdg_surface.configure event.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<request name="set_parent_size" since="3">
|
||||
<description summary="">
|
||||
Set the parent window geometry the compositor should use when
|
||||
positioning the popup. The compositor may use this information to
|
||||
determine the future state the popup should be constrained using. If
|
||||
this doesn't match the dimension of the parent the popup is eventually
|
||||
positioned against, the behavior is undefined.
|
||||
|
||||
The arguments are given in the surface-local coordinate space.
|
||||
</description>
|
||||
<arg name="parent_width" type="int"
|
||||
summary="future window geometry width of parent"/>
|
||||
<arg name="parent_height" type="int"
|
||||
summary="future window geometry height of parent"/>
|
||||
</request>
|
||||
|
||||
<request name="set_parent_configure" since="3">
|
||||
<description summary="set parent configure this is a response to">
|
||||
Set the serial of an xdg_surface.configure event this positioner will be
|
||||
used in response to. The compositor may use this information together
|
||||
with set_parent_size to determine what future state the popup should be
|
||||
constrained using.
|
||||
</description>
|
||||
<arg name="serial" type="uint"
|
||||
summary="serial of parent configure event"/>
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_surface" version="2">
|
||||
<interface name="xdg_surface" version="6">
|
||||
<description summary="desktop user interface surface base interface">
|
||||
An interface that may be implemented by a wl_surface, for
|
||||
implementations that provide a desktop-style user interface.
|
||||
@ -386,6 +434,13 @@
|
||||
manipulate a buffer prior to the first xdg_surface.configure call must
|
||||
also be treated as errors.
|
||||
|
||||
After creating a role-specific object and setting it up, the client must
|
||||
perform an initial commit without any buffer attached. The compositor
|
||||
will reply with initial wl_surface state such as
|
||||
wl_surface.preferred_buffer_scale followed by an xdg_surface.configure
|
||||
event. The client must acknowledge it and is then allowed to attach a
|
||||
buffer to map the surface.
|
||||
|
||||
Mapping an xdg_surface-based role surface is defined as making it
|
||||
possible for the surface to be shown by the compositor. Note that
|
||||
a mapped surface is not guaranteed to be visible once it is mapped.
|
||||
@ -399,19 +454,30 @@
|
||||
|
||||
A newly-unmapped surface is considered to have met condition (1) out
|
||||
of the 3 required conditions for mapping a surface if its role surface
|
||||
has not been destroyed.
|
||||
has not been destroyed, i.e. the client must perform the initial commit
|
||||
again before attaching a buffer.
|
||||
</description>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="not_constructed" value="1"/>
|
||||
<entry name="already_constructed" value="2"/>
|
||||
<entry name="unconfigured_buffer" value="3"/>
|
||||
<entry name="not_constructed" value="1"
|
||||
summary="Surface was not fully constructed"/>
|
||||
<entry name="already_constructed" value="2"
|
||||
summary="Surface was already constructed"/>
|
||||
<entry name="unconfigured_buffer" value="3"
|
||||
summary="Attaching a buffer to an unconfigured surface"/>
|
||||
<entry name="invalid_serial" value="4"
|
||||
summary="Invalid serial number when acking a configure event"/>
|
||||
<entry name="invalid_size" value="5"
|
||||
summary="Width or height was zero or negative"/>
|
||||
<entry name="defunct_role_object" value="6"
|
||||
summary="Surface was destroyed before its role object"/>
|
||||
</enum>
|
||||
|
||||
<request name="destroy" type="destructor">
|
||||
<description summary="destroy the xdg_surface">
|
||||
Destroy the xdg_surface object. An xdg_surface must only be destroyed
|
||||
after its role object has been destroyed.
|
||||
after its role object has been destroyed, otherwise
|
||||
a defunct_role_object error is raised.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
@ -466,13 +532,22 @@
|
||||
commit. This unset is meant for extremely simple clients.
|
||||
|
||||
The arguments are given in the surface-local coordinate space of
|
||||
the wl_surface associated with this xdg_surface.
|
||||
the wl_surface associated with this xdg_surface, and may extend outside
|
||||
of the wl_surface itself to mark parts of the subsurface tree as part of
|
||||
the window geometry.
|
||||
|
||||
The width and height must be greater than zero. Setting an invalid size
|
||||
will raise an error. When applied, the effective window geometry will be
|
||||
the set window geometry clamped to the bounding rectangle of the
|
||||
combined geometry of the surface of the xdg_surface and the associated
|
||||
When applied, the effective window geometry will be the set window
|
||||
geometry clamped to the bounding rectangle of the combined
|
||||
geometry of the surface of the xdg_surface and the associated
|
||||
subsurfaces.
|
||||
|
||||
The effective geometry will not be recalculated unless a new call to
|
||||
set_window_geometry is done and the new pending surface state is
|
||||
subsequently applied.
|
||||
|
||||
The width and height of the effective window geometry must be
|
||||
greater than zero. Setting an invalid size will raise an
|
||||
invalid_size error.
|
||||
</description>
|
||||
<arg name="x" type="int"/>
|
||||
<arg name="y" type="int"/>
|
||||
@ -493,6 +568,8 @@
|
||||
|
||||
If the client receives multiple configure events before it
|
||||
can respond to one, it only has to ack the last configure event.
|
||||
Acking a configure event that was never sent raises an invalid_serial
|
||||
error.
|
||||
|
||||
A client is not required to commit immediately after sending
|
||||
an ack_configure request - it may even ack_configure several times
|
||||
@ -501,6 +578,17 @@
|
||||
A client may send multiple ack_configure requests before committing, but
|
||||
only the last request sent before a commit indicates which configure
|
||||
event the client really is responding to.
|
||||
|
||||
Sending an ack_configure request consumes the serial number sent with
|
||||
the request, as well as serial numbers sent by all configure events
|
||||
sent on this xdg_surface prior to the configure event referenced by
|
||||
the committed serial.
|
||||
|
||||
It is an error to issue multiple ack_configure requests referencing a
|
||||
serial from the same configure event, or to issue an ack_configure
|
||||
request referencing a serial from a configure event issued before the
|
||||
event identified by the last ack_configure request for the same
|
||||
xdg_surface. Doing so will raise an invalid_serial error.
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="the serial from the configure event"/>
|
||||
</request>
|
||||
@ -526,9 +614,10 @@
|
||||
</description>
|
||||
<arg name="serial" type="uint" summary="serial of the configure event"/>
|
||||
</event>
|
||||
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_toplevel" version="2">
|
||||
<interface name="xdg_toplevel" version="6">
|
||||
<description summary="toplevel surface">
|
||||
This interface defines an xdg_surface role which allows a surface to,
|
||||
among other things, set window-like properties such as maximize,
|
||||
@ -540,7 +629,11 @@
|
||||
by the compositor until it is explicitly mapped again.
|
||||
All active operations (e.g., move, resize) are canceled and all
|
||||
attributes (e.g. title, state, stacking, ...) are discarded for
|
||||
an xdg_toplevel surface when it is unmapped.
|
||||
an xdg_toplevel surface when it is unmapped. The xdg_toplevel returns to
|
||||
the state it had right after xdg_surface.get_toplevel. The client
|
||||
can re-map the toplevel by perfoming a commit without any buffer
|
||||
attached, waiting for a configure event and handling it as usual (see
|
||||
xdg_surface description).
|
||||
|
||||
Attaching a null buffer to a toplevel unmaps the surface.
|
||||
</description>
|
||||
@ -552,24 +645,37 @@
|
||||
</description>
|
||||
</request>
|
||||
|
||||
<enum name="error">
|
||||
<entry name="invalid_resize_edge" value="0" summary="provided value is
|
||||
not a valid variant of the resize_edge enum"/>
|
||||
<entry name="invalid_parent" value="1"
|
||||
summary="invalid parent toplevel"/>
|
||||
<entry name="invalid_size" value="2"
|
||||
summary="client provided an invalid min or max size"/>
|
||||
</enum>
|
||||
|
||||
<request name="set_parent">
|
||||
<description summary="set the parent of this surface">
|
||||
Set the "parent" of this surface. This surface should be stacked
|
||||
above the parent surface and all other ancestor surfaces.
|
||||
|
||||
Parent windows should be set on dialogs, toolboxes, or other
|
||||
Parent surfaces should be set on dialogs, toolboxes, or other
|
||||
"auxiliary" surfaces, so that the parent is raised when the dialog
|
||||
is raised.
|
||||
|
||||
Setting a null parent for a child window removes any parent-child
|
||||
relationship for the child. Setting a null parent for a window which
|
||||
currently has no parent is a no-op.
|
||||
Setting a null parent for a child surface unsets its parent. Setting
|
||||
a null parent for a surface which currently has no parent is a no-op.
|
||||
|
||||
If the parent is unmapped then its children are managed as
|
||||
though the parent of the now-unmapped parent has become the
|
||||
parent of this surface. If no parent exists for the now-unmapped
|
||||
parent then the children are managed as though they have no
|
||||
parent surface.
|
||||
Only mapped surfaces can have child surfaces. Setting a parent which
|
||||
is not mapped is equivalent to setting a null parent. If a surface
|
||||
becomes unmapped, its children's parent is set to the parent of
|
||||
the now-unmapped surface. If the now-unmapped surface has no parent,
|
||||
its children's parent is unset. If the now-unmapped surface becomes
|
||||
mapped again, its parent-child relationship is not restored.
|
||||
|
||||
The parent toplevel must not be one of the child toplevel's
|
||||
descendants, and the parent must be different from the child toplevel,
|
||||
otherwise the invalid_parent protocol error is raised.
|
||||
</description>
|
||||
<arg name="parent" type="object" interface="xdg_toplevel" allow-null="true"/>
|
||||
</request>
|
||||
@ -604,11 +710,14 @@
|
||||
For example, "org.freedesktop.FooViewer" where the .desktop file is
|
||||
"org.freedesktop.FooViewer.desktop".
|
||||
|
||||
Like other properties, a set_app_id request can be sent after the
|
||||
xdg_toplevel has been mapped to update the property.
|
||||
|
||||
See the desktop-entry specification [0] for more details on
|
||||
application identifiers and how they relate to well-known D-Bus
|
||||
names and .desktop files.
|
||||
|
||||
[0] http://standards.freedesktop.org/desktop-entry-spec/
|
||||
[0] https://standards.freedesktop.org/desktop-entry-spec/
|
||||
</description>
|
||||
<arg name="app_id" type="string"/>
|
||||
</request>
|
||||
@ -622,7 +731,8 @@
|
||||
This request asks the compositor to pop up such a window menu at
|
||||
the given position, relative to the local surface coordinates of
|
||||
the parent surface. There are no guarantees as to what menu items
|
||||
the window menu contains.
|
||||
the window menu contains, or even if a window menu will be drawn
|
||||
at all.
|
||||
|
||||
This request must be used in response to some sort of user action
|
||||
like a button press, key press, or touch down event.
|
||||
@ -698,16 +808,17 @@
|
||||
guarantee that the device focus will return when the resize is
|
||||
completed.
|
||||
|
||||
The edges parameter specifies how the surface should be resized,
|
||||
and is one of the values of the resize_edge enum. The compositor
|
||||
may use this information to update the surface position for
|
||||
example when dragging the top left corner. The compositor may also
|
||||
use this information to adapt its behavior, e.g. choose an
|
||||
appropriate cursor image.
|
||||
The edges parameter specifies how the surface should be resized, and
|
||||
is one of the values of the resize_edge enum. Values not matching
|
||||
a variant of the enum will cause the invalid_resize_edge protocol error.
|
||||
The compositor may use this information to update the surface position
|
||||
for example when dragging the top left corner. The compositor may also
|
||||
use this information to adapt its behavior, e.g. choose an appropriate
|
||||
cursor image.
|
||||
</description>
|
||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
||||
<arg name="serial" type="uint" summary="the serial of the user event"/>
|
||||
<arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
|
||||
<arg name="edges" type="uint" enum="resize_edge" summary="which edge or corner is being dragged"/>
|
||||
</request>
|
||||
|
||||
<enum name="state">
|
||||
@ -723,7 +834,8 @@
|
||||
<entry name="maximized" value="1" summary="the surface is maximized">
|
||||
<description summary="the surface is maximized">
|
||||
The surface is maximized. The window geometry specified in the configure
|
||||
event must be obeyed by the client.
|
||||
event must be obeyed by the client, or the xdg_wm_base.invalid_surface_state
|
||||
error is raised.
|
||||
|
||||
The client should draw without shadow or other
|
||||
decoration outside of the window geometry.
|
||||
@ -754,29 +866,36 @@
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="tiled_left" value="5" since="2">
|
||||
<description summary="the surface is tiled">
|
||||
<description summary="the surface’s left edge is tiled">
|
||||
The window is currently in a tiled layout and the left edge is
|
||||
considered to be adjacent to another part of the tiling grid.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="tiled_right" value="6" since="2">
|
||||
<description summary="the surface is tiled">
|
||||
<description summary="the surface’s right edge is tiled">
|
||||
The window is currently in a tiled layout and the right edge is
|
||||
considered to be adjacent to another part of the tiling grid.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="tiled_top" value="7" since="2">
|
||||
<description summary="the surface is tiled">
|
||||
<description summary="the surface’s top edge is tiled">
|
||||
The window is currently in a tiled layout and the top edge is
|
||||
considered to be adjacent to another part of the tiling grid.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="tiled_bottom" value="8" since="2">
|
||||
<description summary="the surface is tiled">
|
||||
<description summary="the surface’s bottom edge is tiled">
|
||||
The window is currently in a tiled layout and the bottom edge is
|
||||
considered to be adjacent to another part of the tiling grid.
|
||||
</description>
|
||||
</entry>
|
||||
<entry name="suspended" value="9" since="6">
|
||||
<description summary="surface repaint is suspended">
|
||||
The surface is currently not ordinarily being repainted; for
|
||||
example because its content is occluded by another window, or its
|
||||
outputs are switched off due to screen locking.
|
||||
</description>
|
||||
</entry>
|
||||
</enum>
|
||||
|
||||
<request name="set_max_size">
|
||||
@ -810,11 +929,11 @@
|
||||
request.
|
||||
|
||||
Requesting a maximum size to be smaller than the minimum size of
|
||||
a surface is illegal and will result in a protocol error.
|
||||
a surface is illegal and will result in an invalid_size error.
|
||||
|
||||
The width and height must be greater than or equal to zero. Using
|
||||
strictly negative values for width and height will result in a
|
||||
protocol error.
|
||||
strictly negative values for width or height will result in a
|
||||
invalid_size error.
|
||||
</description>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
@ -851,11 +970,11 @@
|
||||
request.
|
||||
|
||||
Requesting a minimum size to be larger than the maximum size of
|
||||
a surface is illegal and will result in a protocol error.
|
||||
a surface is illegal and will result in an invalid_size error.
|
||||
|
||||
The width and height must be greater than or equal to zero. Using
|
||||
strictly negative values for width and height will result in a
|
||||
protocol error.
|
||||
invalid_size error.
|
||||
</description>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
@ -1014,9 +1133,68 @@
|
||||
a dialog to ask the user to save their data, etc.
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<!-- Version 4 additions -->
|
||||
|
||||
<event name="configure_bounds" since="4">
|
||||
<description summary="recommended window geometry bounds">
|
||||
The configure_bounds event may be sent prior to a xdg_toplevel.configure
|
||||
event to communicate the bounds a window geometry size is recommended
|
||||
to constrain to.
|
||||
|
||||
The passed width and height are in surface coordinate space. If width
|
||||
and height are 0, it means bounds is unknown and equivalent to as if no
|
||||
configure_bounds event was ever sent for this surface.
|
||||
|
||||
The bounds can for example correspond to the size of a monitor excluding
|
||||
any panels or other shell components, so that a surface isn't created in
|
||||
a way that it cannot fit.
|
||||
|
||||
The bounds may change at any point, and in such a case, a new
|
||||
xdg_toplevel.configure_bounds will be sent, followed by
|
||||
xdg_toplevel.configure and xdg_surface.configure.
|
||||
</description>
|
||||
<arg name="width" type="int"/>
|
||||
<arg name="height" type="int"/>
|
||||
</event>
|
||||
|
||||
<!-- Version 5 additions -->
|
||||
|
||||
<enum name="wm_capabilities" since="5">
|
||||
<entry name="window_menu" value="1" summary="show_window_menu is available"/>
|
||||
<entry name="maximize" value="2" summary="set_maximized and unset_maximized are available"/>
|
||||
<entry name="fullscreen" value="3" summary="set_fullscreen and unset_fullscreen are available"/>
|
||||
<entry name="minimize" value="4" summary="set_minimized is available"/>
|
||||
</enum>
|
||||
|
||||
<event name="wm_capabilities" since="5">
|
||||
<description summary="compositor capabilities">
|
||||
This event advertises the capabilities supported by the compositor. If
|
||||
a capability isn't supported, clients should hide or disable the UI
|
||||
elements that expose this functionality. For instance, if the
|
||||
compositor doesn't advertise support for minimized toplevels, a button
|
||||
triggering the set_minimized request should not be displayed.
|
||||
|
||||
The compositor will ignore requests it doesn't support. For instance,
|
||||
a compositor which doesn't advertise support for minimized will ignore
|
||||
set_minimized requests.
|
||||
|
||||
Compositors must send this event once before the first
|
||||
xdg_surface.configure event. When the capabilities change, compositors
|
||||
must send this event again and then send an xdg_surface.configure
|
||||
event.
|
||||
|
||||
The configured state should not be applied immediately. See
|
||||
xdg_surface.configure for details.
|
||||
|
||||
The capabilities are sent as an array of 32-bit unsigned integers in
|
||||
native endianness.
|
||||
</description>
|
||||
<arg name="capabilities" type="array" summary="array of 32-bit capabilities"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="xdg_popup" version="2">
|
||||
<interface name="xdg_popup" version="6">
|
||||
<description summary="short-lived, popup surfaces for menus">
|
||||
A popup surface is a short-lived, temporary surface. It can be used to
|
||||
implement for example menus, popovers, tooltips and other similar user
|
||||
@ -1040,12 +1218,6 @@
|
||||
The parent of an xdg_popup must be mapped (see the xdg_surface
|
||||
description) before the xdg_popup itself.
|
||||
|
||||
The x and y arguments passed when creating the popup object specify
|
||||
where the top left of the popup should be placed, relative to the
|
||||
local surface coordinates of the parent surface. See
|
||||
xdg_surface.get_popup. An xdg_popup must intersect with or be at least
|
||||
partially adjacent to its parent surface.
|
||||
|
||||
The client must call wl_surface.commit on the corresponding wl_surface
|
||||
for the xdg_popup state to take effect.
|
||||
</description>
|
||||
@ -1060,8 +1232,8 @@
|
||||
This destroys the popup. Explicitly destroying the xdg_popup
|
||||
object will also dismiss the popup, and unmap the surface.
|
||||
|
||||
If this xdg_popup is not the "topmost" popup, a protocol error
|
||||
will be sent.
|
||||
If this xdg_popup is not the "topmost" popup, the
|
||||
xdg_wm_base.not_the_topmost_popup protocol error will be sent.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
@ -1093,10 +1265,6 @@
|
||||
nested grabbing popup as well. When a compositor dismisses popups, it
|
||||
will follow the same dismissing order as required from the client.
|
||||
|
||||
The parent of a grabbing popup must either be another xdg_popup with an
|
||||
active explicit grab, or an xdg_popup or xdg_toplevel, if there are no
|
||||
explicit grabs already taken.
|
||||
|
||||
If the topmost grabbing popup is destroyed, the grab will be returned to
|
||||
the parent of the popup, if that parent previously had an explicit grab.
|
||||
|
||||
@ -1123,6 +1291,11 @@
|
||||
The x and y arguments represent the position the popup was placed at
|
||||
given the xdg_positioner rule, relative to the upper left corner of the
|
||||
window geometry of the parent surface.
|
||||
|
||||
For version 2 or older, the configure event for an xdg_popup is only
|
||||
ever sent once for the initial configuration. Starting with version 3,
|
||||
it may be sent again if the popup is setup with an xdg_positioner with
|
||||
set_reactive requested, or in response to xdg_popup.reposition requests.
|
||||
</description>
|
||||
<arg name="x" type="int"
|
||||
summary="x position relative to parent surface window geometry"/>
|
||||
@ -1140,5 +1313,58 @@
|
||||
</description>
|
||||
</event>
|
||||
|
||||
<!-- Version 3 additions -->
|
||||
|
||||
<request name="reposition" since="3">
|
||||
<description summary="recalculate the popup's location">
|
||||
Reposition an already-mapped popup. The popup will be placed given the
|
||||
details in the passed xdg_positioner object, and a
|
||||
xdg_popup.repositioned followed by xdg_popup.configure and
|
||||
xdg_surface.configure will be emitted in response. Any parameters set
|
||||
by the previous positioner will be discarded.
|
||||
|
||||
The passed token will be sent in the corresponding
|
||||
xdg_popup.repositioned event. The new popup position will not take
|
||||
effect until the corresponding configure event is acknowledged by the
|
||||
client. See xdg_popup.repositioned for details. The token itself is
|
||||
opaque, and has no other special meaning.
|
||||
|
||||
If multiple reposition requests are sent, the compositor may skip all
|
||||
but the last one.
|
||||
|
||||
If the popup is repositioned in response to a configure event for its
|
||||
parent, the client should send an xdg_positioner.set_parent_configure
|
||||
and possibly an xdg_positioner.set_parent_size request to allow the
|
||||
compositor to properly constrain the popup.
|
||||
|
||||
If the popup is repositioned together with a parent that is being
|
||||
resized, but not in response to a configure event, the client should
|
||||
send an xdg_positioner.set_parent_size request.
|
||||
</description>
|
||||
<arg name="positioner" type="object" interface="xdg_positioner"/>
|
||||
<arg name="token" type="uint" summary="reposition request token"/>
|
||||
</request>
|
||||
|
||||
<event name="repositioned" since="3">
|
||||
<description summary="signal the completion of a repositioned request">
|
||||
The repositioned event is sent as part of a popup configuration
|
||||
sequence, together with xdg_popup.configure and lastly
|
||||
xdg_surface.configure to notify the completion of a reposition request.
|
||||
|
||||
The repositioned event is to notify about the completion of a
|
||||
xdg_popup.reposition request. The token argument is the token passed
|
||||
in the xdg_popup.reposition request.
|
||||
|
||||
Immediately after this event is emitted, xdg_popup.configure and
|
||||
xdg_surface.configure will be sent with the updated size and position,
|
||||
as well as a new configure serial.
|
||||
|
||||
The client should optionally update the content of the popup, but must
|
||||
acknowledge the new popup configuration for the new position to take
|
||||
effect. See xdg_surface.ack_configure for details.
|
||||
</description>
|
||||
<arg name="token" type="uint" summary="reposition request token"/>
|
||||
</event>
|
||||
|
||||
</interface>
|
||||
</protocol>
|
||||
|
75
shm_open.c
75
shm_open.c
@ -6,46 +6,49 @@
|
||||
#include <unistd.h>
|
||||
|
||||
static void
|
||||
randname(char *buf) {
|
||||
struct timespec ts;
|
||||
long r;
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
r = ts.tv_nsec;
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
buf[i] = 'A' + (r & 15) + (r & 16) * 2;
|
||||
r >>= 5;
|
||||
}
|
||||
randname(char *buf)
|
||||
{
|
||||
struct timespec ts;
|
||||
long r;
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
r = ts.tv_nsec;
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
buf[i] = 'A' + (r & 15) + (r & 16) * 2;
|
||||
r >>= 5;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
create_shm_file(void) {
|
||||
int retries = 100;
|
||||
int fd;
|
||||
do {
|
||||
char name[] = "/wl_shm-XXXXXX";
|
||||
randname(name + sizeof(name) - 7);
|
||||
--retries;
|
||||
fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||
if (fd >= 0) {
|
||||
shm_unlink(name);
|
||||
return fd;
|
||||
}
|
||||
} while (retries > 0 && errno == EEXIST);
|
||||
return -1;
|
||||
create_shm_file(void)
|
||||
{
|
||||
int retries = 100;
|
||||
int fd;
|
||||
do {
|
||||
char name[] = "/wl_shm-XXXXXX";
|
||||
randname(name + sizeof(name) - 7);
|
||||
--retries;
|
||||
fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||
if (fd >= 0) {
|
||||
shm_unlink(name);
|
||||
return fd;
|
||||
}
|
||||
} while (retries > 0 && errno == EEXIST);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
allocate_shm_file(size_t size) {
|
||||
int fd = create_shm_file();
|
||||
int ret;
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
do {
|
||||
ret = ftruncate(fd, size);
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
if (ret < 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
allocate_shm_file(size_t size)
|
||||
{
|
||||
int fd = create_shm_file();
|
||||
int ret;
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
do {
|
||||
ret = ftruncate(fd, size);
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
if (ret < 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
76
wvkbd.1
76
wvkbd.1
@ -1,76 +0,0 @@
|
||||
.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--landscape-layers\fR
|
||||
.RS 4
|
||||
comma separated list of layers used in landscape mode
|
||||
.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>.
|
129
wvkbd.1.scd
Normal file
129
wvkbd.1.scd
Normal file
@ -0,0 +1,129 @@
|
||||
wvkbd(1)
|
||||
|
||||
# NAME
|
||||
|
||||
wvkbd - on-screen virtual keyboard for wayland compositors using wlroots
|
||||
|
||||
# SYNOPSIS
|
||||
|
||||
wvkbd-mobintl [OPTIONS]...
|
||||
|
||||
*NOTE*: Your binary may have a different suffix depending on which layout you compiled.
|
||||
|
||||
# DESCRIPTION
|
||||
|
||||
This project aims to deliver a minimal but practically usable implementation of
|
||||
a wlroots on-screen keyboard in legible C. This will _only_ be a keyboard, not
|
||||
a feedback buzzer, led blinker, or anything that requires more than what's
|
||||
needed to input text quickly. The end product should be a static codebase that
|
||||
can be patched to add new features.
|
||||
|
||||
## OPTIONS
|
||||
|
||||
*-D*
|
||||
enable debug mode.
|
||||
|
||||
*-o*
|
||||
print pressed keys to standard output.
|
||||
|
||||
*-O*
|
||||
print intersected keys to standard output.
|
||||
|
||||
*-l* _layers_
|
||||
comma separated list of layers in vertical/portrait mode.
|
||||
|
||||
*--landscape-layers* _layers_
|
||||
comma separated list of layers used in horizontal/landscape mode.
|
||||
|
||||
*--list-layers*
|
||||
prints a list of all available layers.
|
||||
|
||||
*-H* _pixels_
|
||||
Height of the keyboard in pixels, for vertical/portrait mode.
|
||||
|
||||
*-L* _pixels_
|
||||
Height of the keyboard in pixels, for horizontal/landscape mode
|
||||
|
||||
*--fn* _font_
|
||||
set font and size (e.g. DejaVu Sans 20)
|
||||
|
||||
*--hidden*
|
||||
Start hidden (send SIGUSR2 to show).
|
||||
|
||||
*--alpha* _int_
|
||||
Set alpha value (i.e. transparency) for all colors [0-255]
|
||||
|
||||
*--bg* _rrggbb|aa_
|
||||
Set color of background
|
||||
|
||||
*--fg* _rrggbb|aa_
|
||||
Set color of keys
|
||||
|
||||
*--fg-sp* _rrggbb|aa_
|
||||
Set color of special keys
|
||||
|
||||
*--press* _rrggbb|aa_
|
||||
Set color of pressed keys
|
||||
|
||||
*--press-sp* _rrggbb|aa_
|
||||
Set color of pressed special keys
|
||||
|
||||
*--swipe* _rrggbb|aa_
|
||||
Set color of swiped keys
|
||||
|
||||
*--swipe-sp* _rrggbb|aa_
|
||||
Set color of swiped special keys
|
||||
|
||||
*--text* _rrggbb|aa_
|
||||
Set color text on keys
|
||||
|
||||
*--text-sp* _rrggbb|aa_
|
||||
Set color text on special keys
|
||||
|
||||
*--version*
|
||||
Print version information
|
||||
|
||||
*-h*, *--help*
|
||||
Print usage help
|
||||
|
||||
|
||||
# SIGNALS
|
||||
|
||||
You can send signals to wvkbd to hide/show it (e.g. using _kill_(1) with _-s_):
|
||||
|
||||
*SIGUSR1*
|
||||
Hide the keyboard.
|
||||
|
||||
*SIGUSR2*
|
||||
Show the keyboard
|
||||
|
||||
*SIGRTMIN*
|
||||
Toggle visibility
|
||||
|
||||
# COMPOSE BUTTON
|
||||
|
||||
The default mobile international layout features a Compose button (*Cmp*)
|
||||
which, when combined with another key, opens up a layout that offers variants
|
||||
for that key. This is similar to functionality that other keyboards implemented
|
||||
using a *long press* (wvkbd has no such notion, holding a key will repeat
|
||||
it like on a physical keyboard).
|
||||
|
||||
For example, press Cmp + a to access variants with diacritics like á,à,â,ä, etc..
|
||||
|
||||
Most layouts also feature the following that are less obvious:
|
||||
|
||||
- Press Cmp and . to access more punctuation
|
||||
- Press Cmp and - or , to access 'mathematical' symbols (+,-,=,etc)
|
||||
- Press Cmp and ' or 0 or 9 to access more brackets and quotes
|
||||
- Press Cmp and q to access emojis
|
||||
|
||||
Last, but not least, pressing Cmp + space or Cmp + ⌨ or Cmp + Abc opens up an
|
||||
index that allows you to immediately jump to any layout by name, even layouts
|
||||
not explicitly added to your layers on startup.
|
||||
|
||||
# AUTHORS
|
||||
|
||||
Created by John Sullivan <jsullivan@csumb.edu>, maintained by the Sxmo project
|
||||
<https://sxmo.org> 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>.
|
Loading…
x
Reference in New Issue
Block a user