mirror of
https://github.com/jjsullivan5196/wvkbd.git
synced 2025-03-13 02:42:47 +01:00
Compare commits
100 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 | ||
|
a2b5b78051 | ||
|
b32509163d |
110
.clang-format
110
.clang-format
@ -1,107 +1,5 @@
|
|||||||
---
|
BasedOnStyle: LLVM
|
||||||
Language: Cpp
|
IndentWidth: 4
|
||||||
# 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
|
|
||||||
AlwaysBreakAfterDefinitionReturnType: All
|
AlwaysBreakAfterDefinitionReturnType: All
|
||||||
AlwaysBreakAfterReturnType: None
|
BreakBeforeBraces: Linux
|
||||||
AlwaysBreakBeforeMultilineStrings: false
|
SortIncludes: 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
|
|
||||||
...
|
|
||||||
|
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_SOURCES += $(wildcard $(SRC)/*.c)
|
||||||
WVKBD_HEADERS += $(wildcard $(SRC)/*.h)
|
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 += -std=gnu99 -Wall -g -DWITH_WAYLAND_SHM -DLAYOUT=\"layout.${LAYOUT}.h\" -DKEYMAP=\"keymap.${LAYOUT}.h\"
|
||||||
CFLAGS += $(shell pkg-config --cflags $(PKGS))
|
CFLAGS += $(shell $(PKG_CONFIG) --cflags $(PKGS))
|
||||||
LDFLAGS += $(shell pkg-config --libs $(PKGS)) -lm -lutil -lrt
|
LDFLAGS += $(shell $(PKG_CONFIG) --libs $(PKGS)) -lm -lutil -lrt
|
||||||
|
|
||||||
WAYLAND_HEADERS = $(wildcard proto/*.xml)
|
WAYLAND_HEADERS = $(wildcard proto/*.xml)
|
||||||
|
|
||||||
@ -20,11 +21,14 @@ HDRS = $(WAYLAND_HEADERS:.xml=-client-protocol.h)
|
|||||||
WAYLAND_SRC = $(HDRS:.h=.c)
|
WAYLAND_SRC = $(HDRS:.h=.c)
|
||||||
SOURCES = $(WVKBD_SOURCES) $(WAYLAND_SRC)
|
SOURCES = $(WVKBD_SOURCES) $(WAYLAND_SRC)
|
||||||
|
|
||||||
|
SCDOC=scdoc
|
||||||
|
DOCS = wvkbd.1
|
||||||
|
|
||||||
OBJECTS = $(SOURCES:.c=.o)
|
OBJECTS = $(SOURCES:.c=.o)
|
||||||
|
|
||||||
all: ${BIN}
|
all: ${BIN} ${DOCS}
|
||||||
|
|
||||||
config.h: config.def.h
|
config.h:
|
||||||
cp config.def.h config.h
|
cp config.def.h config.h
|
||||||
|
|
||||||
proto/%-client-protocol.c: proto/%.xml
|
proto/%-client-protocol.c: proto/%.xml
|
||||||
@ -39,11 +43,14 @@ wvkbd-${LAYOUT}: config.h $(OBJECTS) layout.${LAYOUT}.h
|
|||||||
$(CC) -o wvkbd-${LAYOUT} $(OBJECTS) $(LDFLAGS)
|
$(CC) -o wvkbd-${LAYOUT} $(OBJECTS) $(LDFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(OBJECTS) $(HDRS) $(WAYLAND_SRC) ${BIN}
|
rm -f $(OBJECTS) $(HDRS) $(WAYLAND_SRC) ${BIN} ${DOCS}
|
||||||
|
|
||||||
format:
|
format:
|
||||||
clang-format -i $(WVKBD_SOURCES) $(WVKBD_HEADERS)
|
clang-format -i $(WVKBD_SOURCES) $(WVKBD_HEADERS)
|
||||||
|
|
||||||
|
%: %.scd
|
||||||
|
$(SCDOC) < $< > $@
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||||
cp -f ${NAME}-${LAYOUT} ${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
|
# 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
|
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,
|
keyboard in legible C. This will **only** be a keyboard, not a feedback buzzer,
|
||||||
@ -17,7 +17,7 @@ new features.
|
|||||||
- Custom color schemes
|
- Custom color schemes
|
||||||
- Proper font drawing
|
- Proper font drawing
|
||||||
- Intuitive layouts
|
- Intuitive layouts
|
||||||
- International layouts (cyrillic, arabic)
|
- International layouts (cyrillic, arabic, persian, greek, georgian)
|
||||||
- Support for 'Copy' keys which are not on the keymap
|
- Support for 'Copy' keys which are not on the keymap
|
||||||
- Emoji support
|
- Emoji support
|
||||||
- Compose key for character variants (e.g. diacritics)
|
- Compose key for character variants (e.g. diacritics)
|
||||||
@ -25,7 +25,7 @@ new features.
|
|||||||
- Automatic portrait/landscape detection and subsequent layout switching
|
- 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:
|
There are some areas that still need work:
|
||||||
|
|
||||||
@ -42,6 +42,8 @@ You'll need the following developer packages
|
|||||||
- wayland-client
|
- wayland-client
|
||||||
- xkbcommon
|
- 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`
|
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
|
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).
|
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
|
You can switch between the layouts/layers of the keyboard by pressing the
|
||||||
want a subset of the available layers, you can define which wants you want and in what order you want to cycle through
|
⌨ key (little keyboard) the bottom-left (press shift to iterate back instead of
|
||||||
them using the `-l` parameter. This takes takes a ordered comma separated list of
|
forward). If you only want a subset of the available layers, you can define
|
||||||
layout names that are defined in your layout set.
|
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`.
|
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.
|
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`
|
`$ 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
|
## Contribute
|
||||||
|
|
||||||
|
22
config.def.h
22
config.def.h
@ -1,38 +1,44 @@
|
|||||||
#ifndef config_def_h_INCLUDED
|
#ifndef config_def_h_INCLUDED
|
||||||
#define config_def_h_INCLUDED
|
#define config_def_h_INCLUDED
|
||||||
|
|
||||||
static const char *default_font = "Monospace 14";
|
#define DEFAULT_FONT "Sans 14"
|
||||||
static const int transparency = 225;
|
#define DEFAULT_ROUNDING 5
|
||||||
|
static const int transparency = 255;
|
||||||
|
|
||||||
struct clr_scheme scheme = {
|
struct clr_scheme schemes[] = {
|
||||||
|
{
|
||||||
/* colors */
|
/* colors */
|
||||||
.bg = {.bgra = {15, 15, 15, transparency}},
|
.bg = {.bgra = {15, 15, 15, transparency}},
|
||||||
.fg = {.bgra = {45, 45, 45, transparency}},
|
.fg = {.bgra = {45, 45, 45, transparency}},
|
||||||
.high = {.bgra = {100, 100, 100, transparency}},
|
.high = {.bgra = {100, 100, 100, transparency}},
|
||||||
.swipe = {.bgra = {100, 255, 100, 64}},
|
.swipe = {.bgra = {100, 255, 100, 64}},
|
||||||
.text = {.color = UINT32_MAX},
|
.text = {.color = UINT32_MAX},
|
||||||
};
|
.font = DEFAULT_FONT,
|
||||||
struct clr_scheme scheme1 = {
|
.rounding = DEFAULT_ROUNDING,
|
||||||
|
},
|
||||||
|
{
|
||||||
/* colors */
|
/* colors */
|
||||||
.bg = {.bgra = {15, 15, 15, transparency}},
|
.bg = {.bgra = {15, 15, 15, transparency}},
|
||||||
.fg = {.bgra = {32, 32, 32, transparency}},
|
.fg = {.bgra = {32, 32, 32, transparency}},
|
||||||
.high = {.bgra = {100, 100, 100, transparency}},
|
.high = {.bgra = {100, 100, 100, transparency}},
|
||||||
.swipe = {.bgra = {100, 255, 100, 64}},
|
.swipe = {.bgra = {100, 255, 100, 64}},
|
||||||
.text = {.color = UINT32_MAX},
|
.text = {.color = UINT32_MAX},
|
||||||
|
.font = DEFAULT_FONT,
|
||||||
|
.rounding = DEFAULT_ROUNDING,
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* layers is an ordered list of layouts, used to cycle through */
|
/* layers is an ordered list of layouts, used to cycle through */
|
||||||
static enum layout_id layers[] = {
|
static enum layout_id layers[] = {
|
||||||
Full, // First layout is the default layout on startup
|
Full, // First layout is the default layout on startup
|
||||||
Special, Emoji, Simple, SimpleGrid, Nav, Dialer,
|
Special,
|
||||||
Cyrillic, Arabic, Persian, Greek, Georgian,
|
|
||||||
NumLayouts // signals the last item, may not be omitted
|
NumLayouts // signals the last item, may not be omitted
|
||||||
};
|
};
|
||||||
|
|
||||||
/* layers is an ordered list of layouts, used to cycle through */
|
/* layers is an ordered list of layouts, used to cycle through */
|
||||||
static enum layout_id landscape_layers[] = {
|
static enum layout_id landscape_layers[] = {
|
||||||
Landscape, // First layout is the default layout on startup
|
Landscape, // First layout is the default layout on startup
|
||||||
Special, Emoji, Nav, Greek,
|
LandscapeSpecial,
|
||||||
NumLayouts // signals the last item, may not be omitted
|
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
|
CFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=700
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
MANPREFIX = ${PREFIX}/share/man
|
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 "drw.h"
|
||||||
#include "shm_open.h"
|
#include "shm_open.h"
|
||||||
|
#include "math.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, uint32_t s) {
|
drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, double s)
|
||||||
if (ds->buf) {
|
{
|
||||||
munmap(ds->pool_data, ds->size);
|
if (ds->buf) {
|
||||||
wl_buffer_destroy(ds->buf);
|
munmap(ds->pool_data, ds->size);
|
||||||
ds->buf = NULL;
|
wl_buffer_destroy(ds->buf);
|
||||||
}
|
ds->buf = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ds->scale = s;
|
ds->scale = s;
|
||||||
ds->width = w * s;
|
ds->width = ceil(w * s);
|
||||||
ds->height = h * s;
|
ds->height = ceil(h * s);
|
||||||
|
|
||||||
setup_buffer(ds);
|
setup_buffer(ds);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
drwsurf_flip(struct drwsurf *ds) {
|
drwsurf_flip(struct drwsurf *ds)
|
||||||
wl_surface_attach(ds->surf, ds->buf, 0, 0);
|
{
|
||||||
wl_surface_commit(ds->surf);
|
wl_surface_attach(ds->surf, ds->buf, 0, 0);
|
||||||
|
wl_surface_commit(ds->surf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
drw_draw_text(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
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(
|
pango_layout_set_font_description(d->layout, font_description);
|
||||||
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_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_set_text(d->layout, label, -1);
|
||||||
pango_layout_get_size(d->layout, &width, &height);
|
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,
|
int width, height;
|
||||||
-((double)height / PANGO_SCALE) / 2);
|
pango_layout_get_pixel_size(d->layout, &width, &height);
|
||||||
pango_cairo_show_layout(d->cairo, d->layout);
|
|
||||||
cairo_restore(d->cairo);
|
|
||||||
|
|
||||||
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
|
void
|
||||||
drw_do_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
drw_do_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
||||||
uint32_t w, uint32_t h, bool over) {
|
uint32_t w, uint32_t h, bool over, int rounding)
|
||||||
cairo_save(d->cairo);
|
{
|
||||||
|
cairo_save(d->cairo);
|
||||||
|
|
||||||
if (over) {
|
if (over) {
|
||||||
cairo_set_operator(d->cairo, CAIRO_OPERATOR_OVER);
|
cairo_set_operator(d->cairo, CAIRO_OPERATOR_OVER);
|
||||||
} else {
|
} else {
|
||||||
cairo_set_operator(d->cairo, CAIRO_OPERATOR_SOURCE);
|
cairo_set_operator(d->cairo, CAIRO_OPERATOR_SOURCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_rectangle(d->cairo, x, y, w, h);
|
if (rounding > 0) {
|
||||||
cairo_set_source_rgba(
|
double radius = rounding / 1.0;
|
||||||
d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255,
|
double degrees = M_PI / 180.0;
|
||||||
color.bgra[0] / (double)255, color.bgra[3] / (double)255);
|
|
||||||
cairo_fill(d->cairo);
|
|
||||||
|
|
||||||
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
|
void
|
||||||
drw_fill_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
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)
|
||||||
drw_do_rectangle(d, color, x, y, w, h, false);
|
{
|
||||||
|
drw_do_rectangle(d, color, x, y, w, h, false, rounding);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
drw_over_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y,
|
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)
|
||||||
drw_do_rectangle(d, color, x, y, w, h, true);
|
{
|
||||||
|
drw_do_rectangle(d, color, x, y, w, h, true, rounding);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
setup_buffer(struct drwsurf *drwsurf) {
|
setup_buffer(struct drwsurf *drwsurf)
|
||||||
int stride = drwsurf->width * 4;
|
{
|
||||||
drwsurf->size = stride * drwsurf->height;
|
int stride = drwsurf->width * 4;
|
||||||
|
drwsurf->size = stride * drwsurf->height;
|
||||||
|
|
||||||
int fd = allocate_shm_file(drwsurf->size);
|
int fd = allocate_shm_file(drwsurf->size);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
drwsurf->pool_data =
|
drwsurf->pool_data =
|
||||||
mmap(NULL, drwsurf->size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
mmap(NULL, drwsurf->size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
if (drwsurf->pool_data == MAP_FAILED) {
|
if (drwsurf->pool_data == MAP_FAILED) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wl_shm_pool *pool =
|
struct wl_shm_pool *pool =
|
||||||
wl_shm_create_pool(drwsurf->ctx->shm, fd, drwsurf->size);
|
wl_shm_create_pool(drwsurf->ctx->shm, fd, drwsurf->size);
|
||||||
drwsurf->buf = wl_shm_pool_create_buffer(
|
drwsurf->buf =
|
||||||
pool, 0, drwsurf->width, drwsurf->height, stride, WL_SHM_FORMAT_ARGB8888);
|
wl_shm_pool_create_buffer(pool, 0, drwsurf->width, drwsurf->height,
|
||||||
wl_shm_pool_destroy(pool);
|
stride, WL_SHM_FORMAT_ARGB8888);
|
||||||
close(fd);
|
wl_shm_pool_destroy(pool);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
cairo_surface_t *s = cairo_image_surface_create_for_data(
|
cairo_surface_t *s = cairo_image_surface_create_for_data(
|
||||||
drwsurf->pool_data, CAIRO_FORMAT_ARGB32, drwsurf->width, drwsurf->height,
|
drwsurf->pool_data, CAIRO_FORMAT_ARGB32, drwsurf->width,
|
||||||
stride);
|
drwsurf->height, stride);
|
||||||
|
|
||||||
drwsurf->cairo = cairo_create(s);
|
drwsurf->cairo = cairo_create(s);
|
||||||
cairo_scale(drwsurf->cairo, drwsurf->scale, drwsurf->scale);
|
cairo_scale(drwsurf->cairo, drwsurf->scale, drwsurf->scale);
|
||||||
drwsurf->layout = pango_cairo_create_layout(drwsurf->cairo);
|
cairo_set_antialias(drwsurf->cairo, CAIRO_ANTIALIAS_NONE);
|
||||||
pango_layout_set_font_description(drwsurf->layout,
|
drwsurf->layout = pango_cairo_create_layout(drwsurf->cairo);
|
||||||
drwsurf->ctx->font_description);
|
pango_layout_set_auto_dir(drwsurf->layout, false);
|
||||||
cairo_save(drwsurf->cairo);
|
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 drw {
|
||||||
struct wl_shm *shm;
|
struct wl_shm *shm;
|
||||||
PangoFontDescription *font_description;
|
|
||||||
};
|
};
|
||||||
struct drwsurf {
|
struct drwsurf {
|
||||||
uint32_t width, height, scale, size;
|
uint32_t width, height, size;
|
||||||
|
double scale;
|
||||||
|
|
||||||
struct drw *ctx;
|
struct drw *ctx;
|
||||||
struct wl_surface *surf;
|
struct wl_surface *surf;
|
||||||
@ -22,7 +22,7 @@ struct drwsurf {
|
|||||||
};
|
};
|
||||||
struct kbd;
|
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);
|
void drwsurf_flip(struct drwsurf *ds);
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
@ -30,15 +30,18 @@ typedef union {
|
|||||||
uint32_t color;
|
uint32_t color;
|
||||||
} 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,
|
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,
|
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,
|
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,
|
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);
|
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 {
|
enum key_draw_type {
|
||||||
Unpress = 0,
|
None = 0,
|
||||||
|
Unpress,
|
||||||
Press,
|
Press,
|
||||||
Swipe,
|
Swipe,
|
||||||
};
|
};
|
||||||
@ -53,6 +54,9 @@ struct clr_scheme {
|
|||||||
Color high;
|
Color high;
|
||||||
Color swipe;
|
Color swipe;
|
||||||
Color text;
|
Color text;
|
||||||
|
char *font;
|
||||||
|
int rounding;
|
||||||
|
PangoFontDescription *font_description;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct key {
|
struct key {
|
||||||
@ -81,6 +85,7 @@ struct layout {
|
|||||||
struct key *keys;
|
struct key *keys;
|
||||||
const char *keymap_name;
|
const char *keymap_name;
|
||||||
const char *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)
|
uint32_t keyheight; // absolute height (pixels)
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -88,48 +93,57 @@ struct kbd {
|
|||||||
bool debug;
|
bool debug;
|
||||||
|
|
||||||
struct layout *layout;
|
struct layout *layout;
|
||||||
struct clr_scheme scheme;
|
struct clr_scheme *schemes;
|
||||||
struct clr_scheme scheme1;
|
|
||||||
|
|
||||||
bool print;
|
bool print;
|
||||||
bool print_intersect;
|
bool print_intersect;
|
||||||
uint32_t w, h, s;
|
uint32_t w, h;
|
||||||
|
double scale;
|
||||||
|
double preferred_scale, preferred_fractional_scale;
|
||||||
bool landscape;
|
bool landscape;
|
||||||
uint8_t mods;
|
uint8_t mods;
|
||||||
uint8_t compose;
|
uint8_t compose;
|
||||||
struct key *last_press;
|
struct key *last_press;
|
||||||
struct key *last_swipe;
|
struct key *last_swipe;
|
||||||
struct layout *prevlayout;
|
struct layout *prevlayout; //the previous layout, needed to keep track of keymap changes
|
||||||
size_t layer_index;
|
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;
|
struct layout *layouts;
|
||||||
enum layout_id *layers;
|
enum layout_id *layers;
|
||||||
enum layout_id *landscape_layers;
|
enum layout_id *landscape_layers;
|
||||||
|
|
||||||
struct drwsurf *surf;
|
struct drwsurf *surf;
|
||||||
|
struct drwsurf *popup_surf;
|
||||||
struct zwp_virtual_keyboard_v1 *vkbd;
|
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,
|
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,
|
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,
|
void kbd_init(struct kbd *kb, struct layout *layouts,
|
||||||
char *layer_names_list, char *landscape_layer_names_list);
|
char *layer_names_list, char *landscape_layer_names_list);
|
||||||
void kbd_init_layout(struct layout *l, uint32_t width, uint32_t height);
|
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);
|
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_unpress_key(struct kbd *kb, uint32_t time);
|
||||||
void kbd_release_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_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_press_key(struct kbd *kb, struct key *k, uint32_t time);
|
||||||
void kbd_print_key_stdout(struct kbd *kb, struct key *k);
|
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_key(struct kbd *kb, struct key *k, enum key_draw_type);
|
||||||
void kbd_draw_layout(struct kbd *kb);
|
void kbd_draw_layout(struct kbd *kb);
|
||||||
void kbd_resize(struct kbd *kb, struct layout *layouts, uint8_t layoutcount);
|
void kbd_resize(struct kbd *kb, struct layout *layouts, uint8_t layoutcount);
|
||||||
uint8_t kbd_get_rows(struct layout *l);
|
uint8_t kbd_get_rows(struct layout *l);
|
||||||
double kbd_get_row_length(struct key *k);
|
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,
|
void create_and_upload_keymap(struct kbd *kb, const char *name,
|
||||||
uint32_t comp_unichr, uint32_t comp_shift_unichr);
|
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
1027
layout.mobintl.h
1027
layout.mobintl.h
File diff suppressed because it is too large
Load Diff
@ -35,89 +35,94 @@
|
|||||||
#include "os-compatibility.h"
|
#include "os-compatibility.h"
|
||||||
|
|
||||||
int
|
int
|
||||||
os_fd_set_cloexec(int fd) {
|
os_fd_set_cloexec(int fd)
|
||||||
long flags;
|
{
|
||||||
|
long flags;
|
||||||
|
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
flags = fcntl(fd, F_GETFD);
|
flags = fcntl(fd, F_GETFD);
|
||||||
if (flags == -1)
|
if (flags == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1)
|
if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_cloexec_or_close(int fd) {
|
set_cloexec_or_close(int fd)
|
||||||
if (os_fd_set_cloexec(fd) != 0) {
|
{
|
||||||
close(fd);
|
if (os_fd_set_cloexec(fd) != 0) {
|
||||||
return -1;
|
close(fd);
|
||||||
}
|
return -1;
|
||||||
return fd;
|
}
|
||||||
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
os_socketpair_cloexec(int domain, int type, int protocol, int *sv) {
|
os_socketpair_cloexec(int domain, int type, int protocol, int *sv)
|
||||||
int ret;
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
#ifdef SOCK_CLOEXEC
|
#ifdef SOCK_CLOEXEC
|
||||||
ret = socketpair(domain, type | SOCK_CLOEXEC, protocol, sv);
|
ret = socketpair(domain, type | SOCK_CLOEXEC, protocol, sv);
|
||||||
if (ret == 0 || errno != EINVAL)
|
if (ret == 0 || errno != EINVAL)
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = socketpair(domain, type, protocol, sv);
|
ret = socketpair(domain, type, protocol, sv);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
sv[0] = set_cloexec_or_close(sv[0]);
|
sv[0] = set_cloexec_or_close(sv[0]);
|
||||||
sv[1] = set_cloexec_or_close(sv[1]);
|
sv[1] = set_cloexec_or_close(sv[1]);
|
||||||
|
|
||||||
if (sv[0] != -1 && sv[1] != -1)
|
if (sv[0] != -1 && sv[1] != -1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
close(sv[0]);
|
close(sv[0]);
|
||||||
close(sv[1]);
|
close(sv[1]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
os_epoll_create_cloexec(void) {
|
os_epoll_create_cloexec(void)
|
||||||
int fd;
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
#ifdef EPOLL_CLOEXEC
|
#ifdef EPOLL_CLOEXEC
|
||||||
fd = epoll_create1(EPOLL_CLOEXEC);
|
fd = epoll_create1(EPOLL_CLOEXEC);
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
return fd;
|
return fd;
|
||||||
if (errno != EINVAL)
|
if (errno != EINVAL)
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
fd = epoll_create(1);
|
fd = epoll_create(1);
|
||||||
return set_cloexec_or_close(fd);
|
return set_cloexec_or_close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
create_tmpfile_cloexec(char *tmpname) {
|
create_tmpfile_cloexec(char *tmpname)
|
||||||
int fd;
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
#ifdef HAVE_MKOSTEMP
|
#ifdef HAVE_MKOSTEMP
|
||||||
fd = mkostemp(tmpname, O_CLOEXEC);
|
fd = mkostemp(tmpname, O_CLOEXEC);
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
unlink(tmpname);
|
unlink(tmpname);
|
||||||
#else
|
#else
|
||||||
fd = mkstemp(tmpname);
|
fd = mkstemp(tmpname);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
fd = set_cloexec_or_close(fd);
|
fd = set_cloexec_or_close(fd);
|
||||||
unlink(tmpname);
|
unlink(tmpname);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -142,60 +147,62 @@ create_tmpfile_cloexec(char *tmpname) {
|
|||||||
* SIGBUS on accessing mmap()'ed file contents instead.
|
* SIGBUS on accessing mmap()'ed file contents instead.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
os_create_anonymous_file(off_t size) {
|
os_create_anonymous_file(off_t size)
|
||||||
static const char template[] = "/weston-shared-XXXXXX";
|
{
|
||||||
const char *path;
|
static const char template[] = "/weston-shared-XXXXXX";
|
||||||
char *name;
|
const char *path;
|
||||||
int fd;
|
char *name;
|
||||||
int ret;
|
int fd;
|
||||||
|
int ret;
|
||||||
|
|
||||||
path = getenv("XDG_RUNTIME_DIR");
|
path = getenv("XDG_RUNTIME_DIR");
|
||||||
if (!path) {
|
if (!path) {
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = malloc(strlen(path) + sizeof(template));
|
name = malloc(strlen(path) + sizeof(template));
|
||||||
if (!name)
|
if (!name)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
strcpy(name, path);
|
strcpy(name, path);
|
||||||
strcat(name, template);
|
strcat(name, template);
|
||||||
|
|
||||||
fd = create_tmpfile_cloexec(name);
|
fd = create_tmpfile_cloexec(name);
|
||||||
|
|
||||||
free(name);
|
free(name);
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
#ifdef HAVE_POSIX_FALLOCATE
|
#ifdef HAVE_POSIX_FALLOCATE
|
||||||
do {
|
do {
|
||||||
ret = posix_fallocate(fd, 0, size);
|
ret = posix_fallocate(fd, 0, size);
|
||||||
} while (ret == EINTR);
|
} while (ret == EINTR);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
errno = ret;
|
errno = ret;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
do {
|
do {
|
||||||
ret = ftruncate(fd, size);
|
ret = ftruncate(fd, size);
|
||||||
} while (ret < 0 && errno == EINTR);
|
} while (ret < 0 && errno == EINTR);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef MISSING_STRCHRNUL
|
#ifndef MISSING_STRCHRNUL
|
||||||
char *
|
char *
|
||||||
strchrnul(const char *s, int c) {
|
strchrnul(const char *s, int c)
|
||||||
while (*s && *s != c)
|
{
|
||||||
s++;
|
while (*s && *s != c)
|
||||||
return (char *)s;
|
s++;
|
||||||
|
return (char *)s;
|
||||||
}
|
}
|
||||||
#endif
|
#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.
|
THIS SOFTWARE.
|
||||||
</copyright>
|
</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">
|
<description summary="create surfaces that are layers of the desktop">
|
||||||
Clients can use this interface to assign the surface_layer role to
|
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
|
wl_surfaces. Such surfaces are assigned to a "layer" of the output and
|
||||||
@ -100,7 +100,7 @@
|
|||||||
</request>
|
</request>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="zwlr_layer_surface_v1" version="3">
|
<interface name="zwlr_layer_surface_v1" version="4">
|
||||||
<description summary="layer metadata interface">
|
<description summary="layer metadata interface">
|
||||||
An interface that may be implemented by a wl_surface, for surfaces that
|
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
|
are designed to be rendered as a layer of a stacked desktop-like
|
||||||
@ -203,21 +203,85 @@
|
|||||||
<arg name="left" type="int"/>
|
<arg name="left" type="int"/>
|
||||||
</request>
|
</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">
|
<request name="set_keyboard_interactivity">
|
||||||
<description summary="requests keyboard events">
|
<description summary="requests keyboard events">
|
||||||
Set to 1 to request that the seat send keyboard events to this layer
|
Set how keyboard events are delivered to this surface. By default,
|
||||||
surface. For layers below the shell surface layer, the seat will use
|
layer shell surfaces do not receive keyboard events; this request can
|
||||||
normal focus semantics. For layers above the shell surface layers, the
|
be used to change this.
|
||||||
seat will always give exclusive keyboard focus to the top-most layer
|
|
||||||
which has keyboard interactivity set to true.
|
This setting is inherited by child surfaces set by the get_popup
|
||||||
|
request.
|
||||||
|
|
||||||
Layer surfaces receive pointer, touch, and tablet events normally. If
|
Layer surfaces receive pointer, touch, and tablet events normally. If
|
||||||
you do not want to receive them, set the input region on your surface
|
you do not want to receive them, set the input region on your surface
|
||||||
to an empty region.
|
to an empty region.
|
||||||
|
|
||||||
Events is double-buffered, see wl_surface.commit.
|
Keyboard interactivity is double-buffered, see wl_surface.commit.
|
||||||
</description>
|
</description>
|
||||||
<arg name="keyboard_interactivity" type="uint"/>
|
<arg name="keyboard_interactivity" type="uint" enum="keyboard_interactivity"/>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
<request name="get_popup">
|
<request name="get_popup">
|
||||||
@ -302,6 +366,7 @@
|
|||||||
<entry name="invalid_surface_state" value="0" summary="provided surface state is invalid"/>
|
<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_size" value="1" summary="size is invalid"/>
|
||||||
<entry name="invalid_anchor" value="2" summary="anchor bitfield 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>
|
||||||
|
|
||||||
<enum name="anchor" bitfield="true">
|
<enum name="anchor" bitfield="true">
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
DEALINGS IN THE SOFTWARE.
|
DEALINGS IN THE SOFTWARE.
|
||||||
</copyright>
|
</copyright>
|
||||||
|
|
||||||
<interface name="xdg_wm_base" version="2">
|
<interface name="xdg_wm_base" version="6">
|
||||||
<description summary="create desktop-style surfaces">
|
<description summary="create desktop-style surfaces">
|
||||||
The xdg_wm_base interface is exposed as a global object enabling clients
|
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
|
to turn their wl_surfaces into windows in a desktop environment. It
|
||||||
@ -50,6 +50,8 @@
|
|||||||
summary="the client provided an invalid surface state"/>
|
summary="the client provided an invalid surface state"/>
|
||||||
<entry name="invalid_positioner" value="5"
|
<entry name="invalid_positioner" value="5"
|
||||||
summary="the client provided an invalid positioner"/>
|
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>
|
</enum>
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
<request name="destroy" type="destructor">
|
||||||
@ -58,7 +60,7 @@
|
|||||||
|
|
||||||
Destroying a bound xdg_wm_base object while there are surfaces
|
Destroying a bound xdg_wm_base object while there are surfaces
|
||||||
still alive created by this xdg_wm_base object instance is illegal
|
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>
|
</description>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
@ -75,7 +77,9 @@
|
|||||||
<description summary="create a shell surface from a surface">
|
<description summary="create a shell surface from a surface">
|
||||||
This creates an xdg_surface for the given surface. While xdg_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
|
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
|
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
|
used as basis to define a role to a given surface, such as xdg_toplevel
|
||||||
@ -92,7 +96,8 @@
|
|||||||
<request name="pong">
|
<request name="pong">
|
||||||
<description summary="respond to a ping event">
|
<description summary="respond to a ping event">
|
||||||
A client must respond to a ping event with a pong request or
|
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>
|
</description>
|
||||||
<arg name="serial" type="uint" summary="serial of the ping event"/>
|
<arg name="serial" type="uint" summary="serial of the ping event"/>
|
||||||
</request>
|
</request>
|
||||||
@ -101,12 +106,14 @@
|
|||||||
<description summary="check if the client is alive">
|
<description summary="check if the client is alive">
|
||||||
The ping event asks the client if it's still alive. Pass the
|
The ping event asks the client if it's still alive. Pass the
|
||||||
serial specified in the event back to the compositor by sending
|
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
|
Compositors can use this to determine if the client is still
|
||||||
alive. It's unspecified what will happen if the client doesn't
|
alive. It's unspecified what will happen if the client doesn't
|
||||||
respond to the ping request, or in what timeframe. Clients should
|
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
|
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.
|
always respond to any xdg_wm_base object it created.
|
||||||
@ -115,7 +122,7 @@
|
|||||||
</event>
|
</event>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="xdg_positioner" version="2">
|
<interface name="xdg_positioner" version="6">
|
||||||
<description summary="child surface positioner">
|
<description summary="child surface positioner">
|
||||||
The xdg_positioner provides a collection of rules for the placement of a
|
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
|
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
|
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
|
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
|
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>
|
</description>
|
||||||
|
|
||||||
<enum name="error">
|
<enum name="error">
|
||||||
@ -223,7 +230,8 @@
|
|||||||
specified (e.g. 'bottom_right' or 'top_left'), then the child surface
|
specified (e.g. 'bottom_right' or 'top_left'), then the child surface
|
||||||
will be placed towards the specified gravity; otherwise, the child
|
will be placed towards the specified gravity; otherwise, the child
|
||||||
surface will be centered over the anchor point on any axis that had no
|
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>
|
</description>
|
||||||
<arg name="gravity" type="uint" enum="gravity"
|
<arg name="gravity" type="uint" enum="gravity"
|
||||||
summary="gravity direction"/>
|
summary="gravity direction"/>
|
||||||
@ -357,9 +365,49 @@
|
|||||||
<arg name="x" type="int" summary="surface position x offset"/>
|
<arg name="x" type="int" summary="surface position x offset"/>
|
||||||
<arg name="y" type="int" summary="surface position y offset"/>
|
<arg name="y" type="int" summary="surface position y offset"/>
|
||||||
</request>
|
</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>
|
||||||
|
|
||||||
<interface name="xdg_surface" version="2">
|
<interface name="xdg_surface" version="6">
|
||||||
<description summary="desktop user interface surface base interface">
|
<description summary="desktop user interface surface base interface">
|
||||||
An interface that may be implemented by a wl_surface, for
|
An interface that may be implemented by a wl_surface, for
|
||||||
implementations that provide a desktop-style user interface.
|
implementations that provide a desktop-style user interface.
|
||||||
@ -386,6 +434,13 @@
|
|||||||
manipulate a buffer prior to the first xdg_surface.configure call must
|
manipulate a buffer prior to the first xdg_surface.configure call must
|
||||||
also be treated as errors.
|
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
|
Mapping an xdg_surface-based role surface is defined as making it
|
||||||
possible for the surface to be shown by the compositor. Note that
|
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.
|
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
|
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
|
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>
|
</description>
|
||||||
|
|
||||||
<enum name="error">
|
<enum name="error">
|
||||||
<entry name="not_constructed" value="1"/>
|
<entry name="not_constructed" value="1"
|
||||||
<entry name="already_constructed" value="2"/>
|
summary="Surface was not fully constructed"/>
|
||||||
<entry name="unconfigured_buffer" value="3"/>
|
<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>
|
</enum>
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
<request name="destroy" type="destructor">
|
||||||
<description summary="destroy the xdg_surface">
|
<description summary="destroy the xdg_surface">
|
||||||
Destroy the xdg_surface object. An xdg_surface must only be destroyed
|
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>
|
</description>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
@ -466,13 +532,22 @@
|
|||||||
commit. This unset is meant for extremely simple clients.
|
commit. This unset is meant for extremely simple clients.
|
||||||
|
|
||||||
The arguments are given in the surface-local coordinate space of
|
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
|
When applied, the effective window geometry will be the set window
|
||||||
will raise an error. When applied, the effective window geometry will be
|
geometry clamped to the bounding rectangle of the combined
|
||||||
the set window geometry clamped to the bounding rectangle of the
|
geometry of the surface of the xdg_surface and the associated
|
||||||
combined geometry of the surface of the xdg_surface and the associated
|
|
||||||
subsurfaces.
|
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>
|
</description>
|
||||||
<arg name="x" type="int"/>
|
<arg name="x" type="int"/>
|
||||||
<arg name="y" type="int"/>
|
<arg name="y" type="int"/>
|
||||||
@ -493,6 +568,8 @@
|
|||||||
|
|
||||||
If the client receives multiple configure events before it
|
If the client receives multiple configure events before it
|
||||||
can respond to one, it only has to ack the last configure event.
|
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
|
A client is not required to commit immediately after sending
|
||||||
an ack_configure request - it may even ack_configure several times
|
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
|
A client may send multiple ack_configure requests before committing, but
|
||||||
only the last request sent before a commit indicates which configure
|
only the last request sent before a commit indicates which configure
|
||||||
event the client really is responding to.
|
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>
|
</description>
|
||||||
<arg name="serial" type="uint" summary="the serial from the configure event"/>
|
<arg name="serial" type="uint" summary="the serial from the configure event"/>
|
||||||
</request>
|
</request>
|
||||||
@ -526,9 +614,10 @@
|
|||||||
</description>
|
</description>
|
||||||
<arg name="serial" type="uint" summary="serial of the configure event"/>
|
<arg name="serial" type="uint" summary="serial of the configure event"/>
|
||||||
</event>
|
</event>
|
||||||
|
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="xdg_toplevel" version="2">
|
<interface name="xdg_toplevel" version="6">
|
||||||
<description summary="toplevel surface">
|
<description summary="toplevel surface">
|
||||||
This interface defines an xdg_surface role which allows a surface to,
|
This interface defines an xdg_surface role which allows a surface to,
|
||||||
among other things, set window-like properties such as maximize,
|
among other things, set window-like properties such as maximize,
|
||||||
@ -540,7 +629,11 @@
|
|||||||
by the compositor until it is explicitly mapped again.
|
by the compositor until it is explicitly mapped again.
|
||||||
All active operations (e.g., move, resize) are canceled and all
|
All active operations (e.g., move, resize) are canceled and all
|
||||||
attributes (e.g. title, state, stacking, ...) are discarded for
|
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.
|
Attaching a null buffer to a toplevel unmaps the surface.
|
||||||
</description>
|
</description>
|
||||||
@ -552,24 +645,37 @@
|
|||||||
</description>
|
</description>
|
||||||
</request>
|
</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">
|
<request name="set_parent">
|
||||||
<description summary="set the parent of this surface">
|
<description summary="set the parent of this surface">
|
||||||
Set the "parent" of this surface. This surface should be stacked
|
Set the "parent" of this surface. This surface should be stacked
|
||||||
above the parent surface and all other ancestor surfaces.
|
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
|
"auxiliary" surfaces, so that the parent is raised when the dialog
|
||||||
is raised.
|
is raised.
|
||||||
|
|
||||||
Setting a null parent for a child window removes any parent-child
|
Setting a null parent for a child surface unsets its parent. Setting
|
||||||
relationship for the child. Setting a null parent for a window which
|
a null parent for a surface which currently has no parent is a no-op.
|
||||||
currently has no parent is a no-op.
|
|
||||||
|
|
||||||
If the parent is unmapped then its children are managed as
|
Only mapped surfaces can have child surfaces. Setting a parent which
|
||||||
though the parent of the now-unmapped parent has become the
|
is not mapped is equivalent to setting a null parent. If a surface
|
||||||
parent of this surface. If no parent exists for the now-unmapped
|
becomes unmapped, its children's parent is set to the parent of
|
||||||
parent then the children are managed as though they have no
|
the now-unmapped surface. If the now-unmapped surface has no parent,
|
||||||
parent surface.
|
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>
|
</description>
|
||||||
<arg name="parent" type="object" interface="xdg_toplevel" allow-null="true"/>
|
<arg name="parent" type="object" interface="xdg_toplevel" allow-null="true"/>
|
||||||
</request>
|
</request>
|
||||||
@ -604,11 +710,14 @@
|
|||||||
For example, "org.freedesktop.FooViewer" where the .desktop file is
|
For example, "org.freedesktop.FooViewer" where the .desktop file is
|
||||||
"org.freedesktop.FooViewer.desktop".
|
"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
|
See the desktop-entry specification [0] for more details on
|
||||||
application identifiers and how they relate to well-known D-Bus
|
application identifiers and how they relate to well-known D-Bus
|
||||||
names and .desktop files.
|
names and .desktop files.
|
||||||
|
|
||||||
[0] http://standards.freedesktop.org/desktop-entry-spec/
|
[0] https://standards.freedesktop.org/desktop-entry-spec/
|
||||||
</description>
|
</description>
|
||||||
<arg name="app_id" type="string"/>
|
<arg name="app_id" type="string"/>
|
||||||
</request>
|
</request>
|
||||||
@ -622,7 +731,8 @@
|
|||||||
This request asks the compositor to pop up such a window menu at
|
This request asks the compositor to pop up such a window menu at
|
||||||
the given position, relative to the local surface coordinates of
|
the given position, relative to the local surface coordinates of
|
||||||
the parent surface. There are no guarantees as to what menu items
|
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
|
This request must be used in response to some sort of user action
|
||||||
like a button press, key press, or touch down event.
|
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
|
guarantee that the device focus will return when the resize is
|
||||||
completed.
|
completed.
|
||||||
|
|
||||||
The edges parameter specifies how the surface should be resized,
|
The edges parameter specifies how the surface should be resized, and
|
||||||
and is one of the values of the resize_edge enum. The compositor
|
is one of the values of the resize_edge enum. Values not matching
|
||||||
may use this information to update the surface position for
|
a variant of the enum will cause the invalid_resize_edge protocol error.
|
||||||
example when dragging the top left corner. The compositor may also
|
The compositor may use this information to update the surface position
|
||||||
use this information to adapt its behavior, e.g. choose an
|
for example when dragging the top left corner. The compositor may also
|
||||||
appropriate cursor image.
|
use this information to adapt its behavior, e.g. choose an appropriate
|
||||||
|
cursor image.
|
||||||
</description>
|
</description>
|
||||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the user event"/>
|
<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="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>
|
</request>
|
||||||
|
|
||||||
<enum name="state">
|
<enum name="state">
|
||||||
@ -723,7 +834,8 @@
|
|||||||
<entry name="maximized" value="1" summary="the surface is maximized">
|
<entry name="maximized" value="1" summary="the surface is maximized">
|
||||||
<description summary="the surface is maximized">
|
<description summary="the surface is maximized">
|
||||||
The surface is maximized. The window geometry specified in the configure
|
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
|
The client should draw without shadow or other
|
||||||
decoration outside of the window geometry.
|
decoration outside of the window geometry.
|
||||||
@ -754,29 +866,36 @@
|
|||||||
</description>
|
</description>
|
||||||
</entry>
|
</entry>
|
||||||
<entry name="tiled_left" value="5" since="2">
|
<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
|
The window is currently in a tiled layout and the left edge is
|
||||||
considered to be adjacent to another part of the tiling grid.
|
considered to be adjacent to another part of the tiling grid.
|
||||||
</description>
|
</description>
|
||||||
</entry>
|
</entry>
|
||||||
<entry name="tiled_right" value="6" since="2">
|
<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
|
The window is currently in a tiled layout and the right edge is
|
||||||
considered to be adjacent to another part of the tiling grid.
|
considered to be adjacent to another part of the tiling grid.
|
||||||
</description>
|
</description>
|
||||||
</entry>
|
</entry>
|
||||||
<entry name="tiled_top" value="7" since="2">
|
<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
|
The window is currently in a tiled layout and the top edge is
|
||||||
considered to be adjacent to another part of the tiling grid.
|
considered to be adjacent to another part of the tiling grid.
|
||||||
</description>
|
</description>
|
||||||
</entry>
|
</entry>
|
||||||
<entry name="tiled_bottom" value="8" since="2">
|
<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
|
The window is currently in a tiled layout and the bottom edge is
|
||||||
considered to be adjacent to another part of the tiling grid.
|
considered to be adjacent to another part of the tiling grid.
|
||||||
</description>
|
</description>
|
||||||
</entry>
|
</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>
|
</enum>
|
||||||
|
|
||||||
<request name="set_max_size">
|
<request name="set_max_size">
|
||||||
@ -810,11 +929,11 @@
|
|||||||
request.
|
request.
|
||||||
|
|
||||||
Requesting a maximum size to be smaller than the minimum size of
|
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
|
The width and height must be greater than or equal to zero. Using
|
||||||
strictly negative values for width and height will result in a
|
strictly negative values for width or height will result in a
|
||||||
protocol error.
|
invalid_size error.
|
||||||
</description>
|
</description>
|
||||||
<arg name="width" type="int"/>
|
<arg name="width" type="int"/>
|
||||||
<arg name="height" type="int"/>
|
<arg name="height" type="int"/>
|
||||||
@ -851,11 +970,11 @@
|
|||||||
request.
|
request.
|
||||||
|
|
||||||
Requesting a minimum size to be larger than the maximum size of
|
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
|
The width and height must be greater than or equal to zero. Using
|
||||||
strictly negative values for width and height will result in a
|
strictly negative values for width and height will result in a
|
||||||
protocol error.
|
invalid_size error.
|
||||||
</description>
|
</description>
|
||||||
<arg name="width" type="int"/>
|
<arg name="width" type="int"/>
|
||||||
<arg name="height" type="int"/>
|
<arg name="height" type="int"/>
|
||||||
@ -1014,9 +1133,68 @@
|
|||||||
a dialog to ask the user to save their data, etc.
|
a dialog to ask the user to save their data, etc.
|
||||||
</description>
|
</description>
|
||||||
</event>
|
</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>
|
||||||
|
|
||||||
<interface name="xdg_popup" version="2">
|
<interface name="xdg_popup" version="6">
|
||||||
<description summary="short-lived, popup surfaces for menus">
|
<description summary="short-lived, popup surfaces for menus">
|
||||||
A popup surface is a short-lived, temporary surface. It can be used to
|
A popup surface is a short-lived, temporary surface. It can be used to
|
||||||
implement for example menus, popovers, tooltips and other similar user
|
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
|
The parent of an xdg_popup must be mapped (see the xdg_surface
|
||||||
description) before the xdg_popup itself.
|
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
|
The client must call wl_surface.commit on the corresponding wl_surface
|
||||||
for the xdg_popup state to take effect.
|
for the xdg_popup state to take effect.
|
||||||
</description>
|
</description>
|
||||||
@ -1060,8 +1232,8 @@
|
|||||||
This destroys the popup. Explicitly destroying the xdg_popup
|
This destroys the popup. Explicitly destroying the xdg_popup
|
||||||
object will also dismiss the popup, and unmap the surface.
|
object will also dismiss the popup, and unmap the surface.
|
||||||
|
|
||||||
If this xdg_popup is not the "topmost" popup, a protocol error
|
If this xdg_popup is not the "topmost" popup, the
|
||||||
will be sent.
|
xdg_wm_base.not_the_topmost_popup protocol error will be sent.
|
||||||
</description>
|
</description>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
@ -1093,10 +1265,6 @@
|
|||||||
nested grabbing popup as well. When a compositor dismisses popups, it
|
nested grabbing popup as well. When a compositor dismisses popups, it
|
||||||
will follow the same dismissing order as required from the client.
|
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
|
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.
|
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
|
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
|
given the xdg_positioner rule, relative to the upper left corner of the
|
||||||
window geometry of the parent surface.
|
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>
|
</description>
|
||||||
<arg name="x" type="int"
|
<arg name="x" type="int"
|
||||||
summary="x position relative to parent surface window geometry"/>
|
summary="x position relative to parent surface window geometry"/>
|
||||||
@ -1140,5 +1313,58 @@
|
|||||||
</description>
|
</description>
|
||||||
</event>
|
</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>
|
</interface>
|
||||||
</protocol>
|
</protocol>
|
||||||
|
75
shm_open.c
75
shm_open.c
@ -6,46 +6,49 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
static void
|
static void
|
||||||
randname(char *buf) {
|
randname(char *buf)
|
||||||
struct timespec ts;
|
{
|
||||||
long r;
|
struct timespec ts;
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
long r;
|
||||||
r = ts.tv_nsec;
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
for (int i = 0; i < 6; ++i) {
|
r = ts.tv_nsec;
|
||||||
buf[i] = 'A' + (r & 15) + (r & 16) * 2;
|
for (int i = 0; i < 6; ++i) {
|
||||||
r >>= 5;
|
buf[i] = 'A' + (r & 15) + (r & 16) * 2;
|
||||||
}
|
r >>= 5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
create_shm_file(void) {
|
create_shm_file(void)
|
||||||
int retries = 100;
|
{
|
||||||
int fd;
|
int retries = 100;
|
||||||
do {
|
int fd;
|
||||||
char name[] = "/wl_shm-XXXXXX";
|
do {
|
||||||
randname(name + sizeof(name) - 7);
|
char name[] = "/wl_shm-XXXXXX";
|
||||||
--retries;
|
randname(name + sizeof(name) - 7);
|
||||||
fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
|
--retries;
|
||||||
if (fd >= 0) {
|
fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||||
shm_unlink(name);
|
if (fd >= 0) {
|
||||||
return fd;
|
shm_unlink(name);
|
||||||
}
|
return fd;
|
||||||
} while (retries > 0 && errno == EEXIST);
|
}
|
||||||
return -1;
|
} while (retries > 0 && errno == EEXIST);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
allocate_shm_file(size_t size) {
|
allocate_shm_file(size_t size)
|
||||||
int fd = create_shm_file();
|
{
|
||||||
int ret;
|
int fd = create_shm_file();
|
||||||
if (fd < 0)
|
int ret;
|
||||||
return -1;
|
if (fd < 0)
|
||||||
do {
|
return -1;
|
||||||
ret = ftruncate(fd, size);
|
do {
|
||||||
} while (ret < 0 && errno == EINTR);
|
ret = ftruncate(fd, size);
|
||||||
if (ret < 0) {
|
} while (ret < 0 && errno == EINTR);
|
||||||
close(fd);
|
if (ret < 0) {
|
||||||
return -1;
|
close(fd);
|
||||||
}
|
return -1;
|
||||||
return fd;
|
}
|
||||||
|
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