mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
Compare commits
248 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd1a823fee | ||
|
|
4cdc6c435b | ||
|
|
df8e3d819c | ||
|
|
28cd504067 | ||
|
|
1e406dd649 | ||
|
|
df3ed58d5b | ||
|
|
261ec3c509 | ||
|
|
d8260feef2 | ||
|
|
be44991def | ||
|
|
7f67b9c866 | ||
|
|
eebf5b3e4e | ||
|
|
89fab2d449 | ||
|
|
c78a0fe1b4 | ||
|
|
77a11568a7 | ||
|
|
953249249c | ||
|
|
ef73431367 | ||
|
|
03c70e8a5e | ||
|
|
2b3aadb6af | ||
|
|
364a1d5207 | ||
|
|
babd7af8f8 | ||
|
|
27cc738985 | ||
|
|
da96513e70 | ||
|
|
40eed3915a | ||
|
|
e6f54a0fc8 | ||
|
|
5e8df27f84 | ||
|
|
5f981226c2 | ||
|
|
2f96664670 | ||
|
|
70e5beb5ec | ||
|
|
d94e5da815 | ||
|
|
e44a489530 | ||
|
|
6cdfe32af0 | ||
|
|
e1820adcd3 | ||
|
|
474c513ed6 | ||
|
|
c27d4955a4 | ||
|
|
7166efe7bf | ||
|
|
017152da52 | ||
|
|
814af0ae4d | ||
|
|
cb0a4b875e | ||
|
|
998ff9e7b5 | ||
|
|
bed0be8a88 | ||
|
|
0d0d1075cc | ||
|
|
4c1e66f6c8 | ||
|
|
389cef9c3b | ||
|
|
e558d0d619 | ||
|
|
c8581b3fed | ||
|
|
60d536304b | ||
|
|
9ec49144ac | ||
|
|
eb41c6a3b0 | ||
|
|
2ea0f6fff4 | ||
|
|
950c634cea | ||
|
|
286005e121 | ||
|
|
040e25f38e | ||
|
|
27f3097f8f | ||
|
|
c5cd1f691d | ||
|
|
46bd1fef95 | ||
|
|
7e27f78662 | ||
|
|
1043a9becc | ||
|
|
94c980c6be | ||
|
|
c9030dcc5b | ||
|
|
26bd02d457 | ||
|
|
1692c47fa0 | ||
|
|
bdc8e1c546 | ||
|
|
ee87b4fc30 | ||
|
|
34e52a40c7 | ||
|
|
139a5f0383 | ||
|
|
0bf2678f9d | ||
|
|
6bbdc3c6dc | ||
|
|
7a5b7aa378 | ||
|
|
5fdebedcd9 | ||
|
|
5765586636 | ||
|
|
7028e65154 | ||
|
|
ebce406b11 | ||
|
|
141f932efa | ||
|
|
24f39e3a41 | ||
|
|
2ac48116e1 | ||
|
|
af6a0df231 | ||
|
|
0db3b9309b | ||
|
|
387e62d87b | ||
|
|
c6503e299f | ||
|
|
268ef857db | ||
|
|
f09ace51bf | ||
|
|
d54051d9c1 | ||
|
|
5ce20b2b95 | ||
|
|
072d45d4b2 | ||
|
|
0ce10f6afa | ||
|
|
bca0ec07ac | ||
|
|
e17ec0203c | ||
|
|
f2639226c7 | ||
|
|
9f7e532852 | ||
|
|
3a3b873d0e | ||
|
|
3d670b772d | ||
|
|
574b20fbff | ||
|
|
b9b23f5931 | ||
|
|
fb3dcb7959 | ||
|
|
3923b27384 | ||
|
|
b02d7d0e18 | ||
|
|
d2ce31fcc9 | ||
|
|
b00873a988 | ||
|
|
7c185c1a85 | ||
|
|
e9f17dc4a2 | ||
|
|
a29bf5366f | ||
|
|
2b26a2c73f | ||
|
|
d14f5ca228 | ||
|
|
f129571779 | ||
|
|
ba426e2271 | ||
|
|
1188534876 | ||
|
|
502473f343 | ||
|
|
98c77cd6a7 | ||
|
|
130bbc9e6f | ||
|
|
a9f927047a | ||
|
|
f1f8782bb0 | ||
|
|
074b27fd47 | ||
|
|
02be24bf59 | ||
|
|
b5b257092d | ||
|
|
f9f4219ed4 | ||
|
|
6d2140c4b7 | ||
|
|
72a5df16ea | ||
|
|
e6b5d91b63 | ||
|
|
164b17c279 | ||
|
|
6ed2617394 | ||
|
|
66e26cd28a | ||
|
|
78d47c5c37 | ||
|
|
d1a9529239 | ||
|
|
f0ccbfed18 | ||
|
|
3499f40a6b | ||
|
|
a382389e5e | ||
|
|
2e9292b7a3 | ||
|
|
6e2805f692 | ||
|
|
92ee5083f0 | ||
|
|
57a1ea6cb5 | ||
|
|
f347a818e3 | ||
|
|
aa3dbb4f85 | ||
|
|
a59f98525e | ||
|
|
da90e62346 | ||
|
|
c8943ca242 | ||
|
|
80b28f16c7 | ||
|
|
ef766d16f0 | ||
|
|
4d1be7eada | ||
|
|
657c08aaa1 | ||
|
|
55ee96761a | ||
|
|
ebd39dfe0d | ||
|
|
888dbedeed | ||
|
|
943f5751ee | ||
|
|
48ba23fc8d | ||
|
|
1b575ce816 | ||
|
|
beb3c0fa09 | ||
|
|
9d49d19cd2 | ||
|
|
6dea8c0dcc | ||
|
|
3ee12b1e95 | ||
|
|
35ec696bd9 | ||
|
|
d1d4037335 | ||
|
|
7041accb56 | ||
|
|
b1a8eb7d3a | ||
|
|
6574c82aed | ||
|
|
28513cbdbe | ||
|
|
8d60fb27cd | ||
|
|
8bcea29a1c | ||
|
|
6fe61f8846 | ||
|
|
d9f7ccf3aa | ||
|
|
6e949e623a | ||
|
|
72e1945a4c | ||
|
|
2a039d4f24 | ||
|
|
2ce3f39c1f | ||
|
|
01a7ac7995 | ||
|
|
e05b924e4d | ||
|
|
09b4e9605e | ||
|
|
073fd02300 | ||
|
|
7c3a587015 | ||
|
|
6c3cf84b07 | ||
|
|
8a5a04cc1a | ||
|
|
c63d35c942 | ||
|
|
6fd14987dd | ||
|
|
fba73a0036 | ||
|
|
32e308b5d5 | ||
|
|
418f9cb059 | ||
|
|
02df0a15d7 | ||
|
|
55b495f398 | ||
|
|
d87ef7568a | ||
|
|
508df093c4 | ||
|
|
9557091a1a | ||
|
|
e530f43708 | ||
|
|
2547f96984 | ||
|
|
bc34461977 | ||
|
|
17d66e5603 | ||
|
|
bfaab101af | ||
|
|
2f183cdcb6 | ||
|
|
b0ff2911b6 | ||
|
|
6441bd58f3 | ||
|
|
4b0ac0234c | ||
|
|
03004cf44b | ||
|
|
00ed40454d | ||
|
|
5a50d87ee2 | ||
|
|
b9c84f9c38 | ||
|
|
15e3c32b5b | ||
|
|
6c50a62817 | ||
|
|
9fe1509e33 | ||
|
|
6e7c4a181e | ||
|
|
38e57891b5 | ||
|
|
ca8d98e80f | ||
|
|
d5c03ab7fb | ||
|
|
b966a1ed73 | ||
|
|
2e6b30eb50 | ||
|
|
e1475a1e47 | ||
|
|
e21fc065c4 | ||
|
|
2f414a438b | ||
|
|
ad970544e1 | ||
|
|
67f36d9e13 | ||
|
|
619cae67fa | ||
|
|
a865cc0777 | ||
|
|
ba00f57dad | ||
|
|
936c5f6df1 | ||
|
|
73dd3b8de1 | ||
|
|
a0d2e6a64b | ||
|
|
7adbfe88aa | ||
|
|
8ae2d72cef | ||
|
|
be31df097c | ||
|
|
433168457f | ||
|
|
9462457cc2 | ||
|
|
8881841098 | ||
|
|
503af10505 | ||
|
|
330c55e1b2 | ||
|
|
0d396f84a7 | ||
|
|
31d42b50e2 | ||
|
|
c9b576982d | ||
|
|
69b9122194 | ||
|
|
bdaf85eda1 | ||
|
|
b3b6715cdf | ||
|
|
024ab280a0 | ||
|
|
73095f75cb | ||
|
|
f7702af9e4 | ||
|
|
0d9384de74 | ||
|
|
d96656ccdc | ||
|
|
cb79eccea1 | ||
|
|
1747d9e961 | ||
|
|
7d2b5150e8 | ||
|
|
4afbfac528 | ||
|
|
a802d6b20a | ||
|
|
407a29aa23 | ||
|
|
681f9e9a7b | ||
|
|
b48c250177 | ||
|
|
8b7ae52a91 | ||
|
|
cd8a8c2bf6 | ||
|
|
ac47be3019 | ||
|
|
2bcd8277c4 | ||
|
|
254f526f71 | ||
|
|
13ff64f6e4 | ||
|
|
359dd8f3c7 | ||
|
|
bb2d34a5c1 |
222 changed files with 9667 additions and 6257 deletions
|
|
@ -12,14 +12,21 @@ UseTab: Always
|
|||
IndentWidth: 8
|
||||
ContinuationIndentWidth: 8
|
||||
AlignAfterOpenBracket: DontAlign
|
||||
AlignOperands: false
|
||||
AlwaysBreakAfterDefinitionReturnType: true
|
||||
BreakBeforeBinaryOperators: NonAssignment
|
||||
BreakBeforeBraces: Linux
|
||||
IndentCaseLabels: false
|
||||
PenaltyBreakOpenParenthesis: 100
|
||||
PenaltyReturnTypeOnItsOwnLine: 500
|
||||
SpaceBeforeParens: ControlStatementsExceptControlMacros
|
||||
ForEachMacros: ['for_each_view',
|
||||
'for_each_view_reverse',
|
||||
'wl_array_for_each',
|
||||
'wl_list_for_each',
|
||||
'wl_list_for_each_reverse',
|
||||
'wl_list_for_each_reverse_safe',
|
||||
'wl_list_for_each_safe']
|
||||
IncludeCategories:
|
||||
- Regex: '<.*>'
|
||||
- Regex: '.*'
|
||||
|
|
|
|||
23
.github/workflows/build.yml
vendored
23
.github/workflows/build.yml
vendored
|
|
@ -17,6 +17,8 @@ on:
|
|||
- 'src/**'
|
||||
- 'include/**'
|
||||
- 'protocols/**'
|
||||
- 'clients/**'
|
||||
- 't/**'
|
||||
- 'scripts/**'
|
||||
- '.github/workflows/**'
|
||||
|
||||
|
|
@ -82,7 +84,7 @@ jobs:
|
|||
pacman -Syu --noconfirm
|
||||
pacman -S --noconfirm git meson clang wlroots0.19 libdrm libinput \
|
||||
wayland-protocols cairo pango libxml2 xorg-xwayland librsvg \
|
||||
libdisplay-info gdb ttf-dejavu foot libsfdo
|
||||
libdisplay-info gdb ttf-dejavu foot libsfdo cmocka
|
||||
|
||||
- name: Install Debian Testing dependencies
|
||||
if: matrix.name == 'Debian'
|
||||
|
|
@ -92,7 +94,7 @@ jobs:
|
|||
apt-get upgrade -y
|
||||
apt-get install -y git gcc clang gdb xwayland
|
||||
apt-get build-dep -y labwc
|
||||
apt-get build-dep -y libwlroots-0.18-dev
|
||||
apt-get build-dep -y libwlroots-0.19-dev
|
||||
|
||||
- name: Install FreeBSD dependencies
|
||||
if: matrix.name == 'FreeBSD'
|
||||
|
|
@ -103,7 +105,8 @@ jobs:
|
|||
sed -i '' 's/quarterly/latest/' /etc/pkg/FreeBSD.conf
|
||||
pkg set -yn pkg:mesa-dri # hack to skip llvm dependency
|
||||
pkg install -y git meson gcc pkgconf cairo pango evdev-proto \
|
||||
hwdata wayland-protocols wlroots019 libdisplay-info
|
||||
hwdata wayland-protocols libdisplay-info libepoll-shim \
|
||||
wlroots019
|
||||
run: echo "setup done"
|
||||
|
||||
- name: Install Void Linux dependencies
|
||||
|
|
@ -167,6 +170,7 @@ jobs:
|
|||
meson setup build-gcc-release -Dxwayland=enabled \
|
||||
-Dbuildtype=release -Db_ndebug=true --werror
|
||||
meson configure build-gcc-release -Dwlroots:b_ndebug=false || true
|
||||
meson configure build-gcc-release -Dlibsfdo:b_ndebug=false || true
|
||||
meson compile -C build-gcc-release
|
||||
' | $TARGET
|
||||
|
||||
|
|
@ -189,6 +193,7 @@ jobs:
|
|||
meson setup build-clang-release -Dxwayland=enabled \
|
||||
-Dbuildtype=release -Db_ndebug=true --werror
|
||||
meson configure build-clang-release -Dwlroots:b_ndebug=false || true
|
||||
meson configure build-clang-release -Dlibsfdo:b_ndebug=false || true
|
||||
meson compile -C build-clang-release
|
||||
' | $TARGET
|
||||
|
||||
|
|
@ -204,6 +209,18 @@ jobs:
|
|||
meson compile -C build-gcc-no-feature
|
||||
' | $TARGET
|
||||
|
||||
# Unit tests, run on Arch only
|
||||
- name: Build with gcc - unit test
|
||||
if: matrix.name == 'Arch'
|
||||
run: |
|
||||
echo '
|
||||
cd "$GITHUB_WORKSPACE"
|
||||
export CC=gcc
|
||||
meson setup build-gcc-unit-test -Dtest=enabled --werror
|
||||
meson compile -C build-gcc-unit-test
|
||||
meson test -C build-gcc-unit-test --print-errorlogs
|
||||
' | $TARGET
|
||||
|
||||
# Runtime tests, these run on Arch and Void only (the later due to libmusl being used)
|
||||
- name: Build with gcc - runtime test
|
||||
if: matrix.name == 'Arch'
|
||||
|
|
|
|||
|
|
@ -10,9 +10,11 @@
|
|||
- [4.2 Devault Deviations](#devault-deviations)
|
||||
- [4.3 Labwc Specifics](#labwc-specifics)
|
||||
- [4.3.1 API](#api)
|
||||
- [4.3.2 The Use of glib](#the-use-of-glib)
|
||||
- [4.3.3 The use of GNU extensions](#the-use-of-gnu-extensions)
|
||||
- [4.3.2 The Use of GLib](#the-use-of-glib)
|
||||
- [4.3.3 The Use of GNU Extensions](#the-use-of-gnu-extensions)
|
||||
- [4.3.4 Naming Conventions](#naming-conventions)
|
||||
- [4.3.5 Switch Statements with Variable Declarations](#switch-statements-with-variable-declarations)
|
||||
- [4.3.6 Order of #includes](#order-of-includes)
|
||||
- [5. Commit Messages](#commit-messages)
|
||||
- [6. Unit Tests](#unit-tests)
|
||||
- [7. Submitting Patches](#submitting-patches)
|
||||
|
|
@ -21,14 +23,14 @@
|
|||
|
||||
# How to Contribute
|
||||
|
||||
1. Report bugs as github issues. We use a template prompting you to provide
|
||||
1. Report bugs as GitHub issues. We use a template prompting you to provide
|
||||
some sensible information such as what happened, what you expected to happen
|
||||
and steps to reproduce. If applicable try with default configuration. If
|
||||
you are able to, try to do some debugging (guidelines below).
|
||||
and steps to reproduce. If applicable try with default configuration. If
|
||||
you are able to, try debugging (guidelines below).
|
||||
|
||||
2. Submit patches as github pull-requests. If you wish to introduces significant
|
||||
2. Submit patches as GitHub pull requests. If you wish to introduce significant
|
||||
changes or new features, consult the [scope document], discuss on IRC or via
|
||||
a github issue first.
|
||||
a GitHub issue first.
|
||||
|
||||
# Debugging
|
||||
|
||||
|
|
@ -242,21 +244,21 @@ We have a very small, modest API and encourage you to use it.
|
|||
[common/array.h]: https://github.com/labwc/labwc/blob/master/include/common/array.h
|
||||
[common/macros.h]: https://github.com/labwc/labwc/blob/master/include/common/macros.h
|
||||
|
||||
### The Use of glib
|
||||
### The Use of GLib
|
||||
|
||||
We try to keep the use of glib pretty minimal for the following reasons:
|
||||
We try to keep the use of GLib pretty minimal for the following reasons:
|
||||
|
||||
- The use of glib has been known to make AddressSanitiser diagnose false
|
||||
- The use of GLib has been known to make AddressSanitiser diagnose false
|
||||
positives and negatives.
|
||||
- Log messages coming from glib functions look inconsistent.
|
||||
- The use of glib functions, naming-conventions and iterators in a code base
|
||||
- Log messages coming from GLib functions look inconsistent.
|
||||
- The use of GLib functions, naming-conventions and iterators in a codebase
|
||||
that is predominantly ANSI C creates a clash which makes readability and
|
||||
maintainability harder.
|
||||
- Mixing gmalloc()/malloc() and respective free()s can create problems with
|
||||
memory pools [^1]
|
||||
|
||||
Having said that, with our use of cairo and pango we depend on glib-2.0 anyway
|
||||
so linking with it and making use of some of its helper functions comes for free
|
||||
Having said that, with our use of cairo and pango we depend on glib-2.0 anyway,
|
||||
so linking with it and making use of some of its helper functions comes for free,
|
||||
and can keep the code simpler.
|
||||
|
||||
For example, if we were going to carry out extensive string manipulation,
|
||||
|
|
@ -272,7 +274,7 @@ devs:
|
|||
- `g_pattern_match_simple()`
|
||||
|
||||
When using these types of functions it is often desirable to support with some
|
||||
glib code, which is okay provided it is kept local and self-contained. See
|
||||
GLib code, which is okay provided it is kept local and self-contained. See
|
||||
example from `src/theme.c`:
|
||||
|
||||
```
|
||||
|
|
@ -287,9 +289,9 @@ match(const gchar *pattern, const gchar *string)
|
|||
}
|
||||
```
|
||||
|
||||
### The use of GNU extensions
|
||||
### The Use of GNU Extensions
|
||||
|
||||
We avoid [GNU C extensions] because we want to fit into the eco-system
|
||||
We avoid [GNU C extensions] because we want to fit into the ecosystem
|
||||
(wayland and wlroots) we live in.
|
||||
|
||||
We do use `__typeof__` which strictly speaking is a GNU C extension (`typeof`)
|
||||
|
|
@ -298,18 +300,18 @@ but through the use of `__` is supported by gcc and clang without defining
|
|||
in the [`wl_container_of()`] macro which is needed in `wl_list*` and it
|
||||
does provide pretty big benefits in terms of type safety.
|
||||
|
||||
We compile with `-std=c11` because that's what 'wlroots' uses and we do not
|
||||
We compile with `-std=c11` because that's what 'wlroots' uses, and we do not
|
||||
want to increase the entry-level for OSs without good reason (and currently
|
||||
we can't think of one).
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
There are three types of coordinate systems: surface, output and layout - for
|
||||
There are three types of coordinate systems: surface, output, and layout — for
|
||||
which the variables (sx, sy), (ox, oy) and (lx, ly) are used respectively in
|
||||
line with wlroots.
|
||||
|
||||
With the introduction of the scene-graph API, some wlroots functions also use
|
||||
node coordinates (nx, ny) but we prefer (sx, sy) where possible.
|
||||
node coordinates (nx, ny), but we prefer (sx, sy) where possible.
|
||||
|
||||
We do not worry about namespace issues too much and we try to not make the code
|
||||
a pain to use just to uniquify names. If we were writing a library we would
|
||||
|
|
@ -323,7 +325,7 @@ We use the prefix `handle_` for signal-handler-functions in order to be
|
|||
consistent with sway and rootston. For example
|
||||
`view->request_resize.notify = handle_request_resize`
|
||||
|
||||
### Switch statements with variable declarations
|
||||
### Switch Statements with Variable Declarations
|
||||
|
||||
Unlike many modern languages, C doesn't create a new scope after `case FOO:`.
|
||||
Therefore, we wrap codes following `case FOO:` that include variable
|
||||
|
|
@ -349,6 +351,26 @@ case BAZ:
|
|||
But please also consider refactoring the code into a separate function if it
|
||||
becomes lengthy.
|
||||
|
||||
### Order of #includes
|
||||
|
||||
In new files, please order `#include` lines as follows:
|
||||
|
||||
- In each `.c` file, first include the matching `.h` file, if there is
|
||||
one. For example, `#include "common/font.h"` should come first in
|
||||
`src/common/font.c`. This practice helps to ensure that each header
|
||||
compiles cleanly on its own, without implicit dependencies on other
|
||||
headers being included first.
|
||||
|
||||
- Then list any "system" headers (those not part of labwc) in alphabetical
|
||||
order, using angle brackets. This includes 3rd-party library headers
|
||||
such as `<cairo.h>`, as well as wlroots headers.
|
||||
|
||||
- Then list any other labwc headers in alphabetical order, using quotation
|
||||
marks and relative to the `include/` folder. Subfolders below `include/`,
|
||||
such as `common/`, should be specified even when including one header
|
||||
from another in the same folder (for example, `#include "common/buf.h"`
|
||||
from `include/common/grab-file.h`).
|
||||
|
||||
# Commit Messages
|
||||
|
||||
The log messages that explain changes are just as important as the changes
|
||||
|
|
@ -366,11 +388,11 @@ This first line should:
|
|||
- In most cases be prefixed with "area: " where area refers to a filename
|
||||
or identifier for the general area of the code being modified.
|
||||
- Not capitalize the first word following the "area: " prefix, unless
|
||||
it's a name, acronym or similar.
|
||||
it's a name, acronym, or similar.
|
||||
- Skip the full stop
|
||||
|
||||
And please wrap the commit message at max 74 characters, otherwise `git log`
|
||||
and similar look so weird. URLs and other references are exempt.
|
||||
and similar look very weird. URLs and other references are exempt.
|
||||
|
||||
# Unit Tests
|
||||
|
||||
|
|
@ -382,9 +404,9 @@ In the bigger scheme of validating that the compositor meets users' needs, unit
|
|||
tests do not contribute a great deal. However, they have a role to play in
|
||||
providing some verification that stand-alone functions behave as expected.
|
||||
|
||||
On this project, writing unit-tests is not compulsory nor do we measure
|
||||
On this project, writing unit-tests is not compulsory, nor do we measure
|
||||
coverage. The inclusion of the t/ directory does not signify a move towards
|
||||
test-driven development. We intend to use unit tests sparingly and only when
|
||||
test-driven development. We intend to use unit tests sparingly, and only when
|
||||
devs find them useful.
|
||||
|
||||
## Usage
|
||||
|
|
@ -410,17 +432,17 @@ and use the web interface. Adding new languages should work, otherwise the
|
|||
administrators can be contacted. Suggestions for improving existing translations
|
||||
can be added without account.
|
||||
|
||||
### Github Pull Request
|
||||
### GitHub Pull Request
|
||||
|
||||
Translators can add their `MY_LOCALE.po` files to the `po` directory
|
||||
based on `po/labwc.pot` and issue a pull request. To do this they can
|
||||
based on `po/labwc.pot`, and issue a pull request. To do this they can
|
||||
generate their `MY_LOCALE.po` file in a few steps:
|
||||
|
||||
1. Edit the `po/LINGUAS` file to add their locale code in English
|
||||
alphabetical order to the field of locale codes.
|
||||
2. Copy the `po/labwc.pot` to `po/MY_LOCALE.po`
|
||||
3. Edit the newly generated `MY_LOCALE.po` file with some of their
|
||||
contact and locale details in the header of the file then add the
|
||||
contact and locale details in the header of the file. Then, add the
|
||||
translation strings under each English string.
|
||||
|
||||
[See this tutorial for further guidance](https://www.labri.fr/perso/fleury/posts/programming/a-quick-gettext-tutorial.html)
|
||||
|
|
@ -461,13 +483,13 @@ follow the steps to be taken:
|
|||
2. Update `NEWS.md` with the release details and run
|
||||
`git commit -m 'NEWS.md: update notes for X.Y.Z'`
|
||||
Note: If new dependencies are needed, make this clear.
|
||||
3. In `meson.build` update the version and (if required) the wlroots
|
||||
3. In `meson.build`, update the version, and (if required) the wlroots
|
||||
dependency version. Then run `git commit -m 'build: bump version to X.Y.Z'`
|
||||
4. Run `git tag -a X.Y.Z`. The first line of the commit message should be
|
||||
"labwc X.Y.Z" and the body should be the `NEWS.md` additions removing
|
||||
hash characters (#) from the headings as these will otherwise be
|
||||
ignored by git.
|
||||
5. On github, create a 'Release' as some distros use this as a trigger. Set it
|
||||
5. On GitHub, create a 'Release' as some distros use this as a trigger. Set it
|
||||
as 'latest release'.
|
||||
|
||||
[scope document]: https://github.com/labwc/labwc-scope#readme
|
||||
|
|
@ -481,11 +503,10 @@ follow the steps to be taken:
|
|||
[GNU C extensions]: https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
|
||||
[`wl_container_of()`]: https://github.com/wayland-project/wayland/blob/985ab55d59db45ea62795c76dff5949343e86b2f/src/wayland-util.h#L409
|
||||
|
||||
[^1]: The reference documentation for glib notes that:
|
||||
[^1]: The reference documentation for GLib notes that:
|
||||
"It's important to match g_malloc() with g_free(), plain malloc() with
|
||||
free(), and (if you're using C++) new with delete and new[] with
|
||||
delete[]. Otherwise bad things can happen, since these allocators may use
|
||||
different memory pools (and new/delete call constructors and
|
||||
destructors)."
|
||||
See: https://developer.gimp.org/api/2.0/glib/glib-Memory-Allocation.html
|
||||
|
||||
See: https://docs.gtk.org/glib/memory.html
|
||||
|
|
|
|||
458
NEWS.md
458
NEWS.md
|
|
@ -9,6 +9,8 @@ The format is based on [Keep a Changelog]
|
|||
|
||||
| Date | All Changes | wlroots version | lines-of-code |
|
||||
|------------|---------------|-----------------|---------------|
|
||||
| 2025-10-10 | [0.9.2] | 0.19.1 | 28818 |
|
||||
| 2025-08-02 | [0.9.1] | 0.19.0 | 28605 |
|
||||
| 2025-07-11 | [0.9.0] | 0.19.0 | 28586 |
|
||||
| 2025-05-02 | [0.8.4] | 0.18.2 | 27679 |
|
||||
| 2025-02-21 | [0.8.3] | 0.18.2 | 27671 |
|
||||
|
|
@ -36,13 +38,58 @@ The format is based on [Keep a Changelog]
|
|||
| 2021-04-15 | [0.2.0] | 0.13.0 | 5011 |
|
||||
| 2021-03-05 | [0.1.0] | 0.12.0 | 4627 |
|
||||
|
||||
## [0.9.0]
|
||||
[unreleased]: NEWS.md#unreleased
|
||||
[0.9.2]: NEWS.md#092---2025-10-10
|
||||
[0.9.1]: NEWS.md#091---2025-08-02
|
||||
[0.9.0]: NEWS.md#090---2025-07-11
|
||||
[0.8.4]: NEWS.md#084---2025-05-02
|
||||
[0.8.3]: NEWS.md#083---2025-02-21
|
||||
[0.8.2]: NEWS.md#082---2024-12-13
|
||||
[0.8.1]: NEWS.md#081---2024-10-25
|
||||
[0.8.0]: NEWS.md#080---2024-08-16
|
||||
[0.7.4]: NEWS.md#074---2024-06-19
|
||||
[0.7.3]: NEWS.md#073---2024-06-12
|
||||
[0.7.2]: NEWS.md#072---2024-05-10
|
||||
[0.7.1]: NEWS.md#071---2024-03-01
|
||||
[0.7.0]: NEWS.md#070---2023-12-22
|
||||
[0.6.6]: NEWS.md#065---2023-11-25
|
||||
[0.6.5]: NEWS.md#064---2023-09-23
|
||||
[0.6.4]: NEWS.md#063---2023-07-14
|
||||
[0.6.3]: NEWS.md#062---2023-05-08
|
||||
[0.6.2]: NEWS.md#061---2023-03-20
|
||||
[0.6.1]: NEWS.md#060---2023-01-29
|
||||
[0.6.0]: NEWS.md#060---2022-11-17
|
||||
[0.5.3]: NEWS.md#053---2022-07-15
|
||||
[0.5.2]: NEWS.md#052---2022-05-17
|
||||
[0.5.1]: NEWS.md#051---2022-04-08
|
||||
[0.5.0]: NEWS.md#050---2022-02-18
|
||||
[0.4.0]: NEWS.md#040---2021-12-31
|
||||
[0.3.0]: NEWS.md#030---2021-06-28
|
||||
[0.2.0]: NEWS.md#020---2021-04-15
|
||||
[0.1.0]: NEWS.md#010---2021-03-05
|
||||
|
||||
The main focus has been to port labwc to wlroots 0.19 [#2388] and fix associated
|
||||
issues. Special thanks to @Consolatis @jlindgren90 for this.
|
||||
## Notes on wlroots-0.19
|
||||
|
||||
There is a regression warning worth noting for the switch to wlroots 0.19:
|
||||
There are some regression warnings worth noting for the switch to wlroots 0.19:
|
||||
|
||||
- The DRM backend now destroys/recreates outputs on VT switch and in some cases
|
||||
on suspend/resume too. The reason for this change was that (i) the KMS state
|
||||
is undefined when a VT is switched away; and (ii) the previous outputs had
|
||||
issues with restoration, particularly when the output configuration had
|
||||
changed whilst switched away. This change causes two issues for users:
|
||||
- Some layer-shell clients do not re-appear on output re-connection, or may
|
||||
appear on a different output. Whilst this has always been the case, it will
|
||||
now also happen in said situations. We recommend layer-shell clients to
|
||||
handle the new-output and surface-destroy signals to achieve desired
|
||||
behaviours.
|
||||
- Some Gtk clients issue critical warnings as they assume that at least one
|
||||
output is always available. This will be fixed in `Gtk-3.24.50`. It is
|
||||
believed to be a harmless warning, but it can be avoided by running labwc
|
||||
with the environment variable `LABWC_FALLBACK_OUTPUT=NOOP-fallback` to
|
||||
temporarily create a fallback-output when the last physical display
|
||||
disconnects. [#2914] [#2939] [wlroots-4878] [gtk-8792]
|
||||
- Due to a single-pixel protocol issue, `waylock` and `chayang` do not work.
|
||||
This will be fixed in `wlroots-0.19.1`. [#2943] [wlroots-5098]
|
||||
- Menu item can no longer be activated in any Gtk applications with a single
|
||||
press-drag-release mouse action. For context: This is due to ambiguity in the
|
||||
specifications and contrary implementations. For example, Gtk applications are
|
||||
|
|
@ -54,6 +101,204 @@ There is a regression warning worth noting for the switch to wlroots 0.19:
|
|||
around a bug on the wlroots side which is expected to be fixed in wlroots
|
||||
`0.19.1` [#2887]
|
||||
|
||||
With wlroots compiled with libwayland (>= 1.24.0), there is an invisible margin
|
||||
preventing pointer focus on some layer-shell surfaces including those created by
|
||||
Gtk. In simple words, this is because libwayland now rounds floats a bit
|
||||
differently [#3099]. There is a pending fix [wlroots-5159].
|
||||
|
||||
[wlroots-4878]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4878
|
||||
[wlroots-5098]:https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/5098
|
||||
[wlroots-5159]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/5159
|
||||
[gtk-8792]: https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/8792
|
||||
|
||||
## unreleased
|
||||
|
||||
[unreleased-commits]
|
||||
|
||||
### Added
|
||||
|
||||
- With the window-switcher custom field state specifiers 's' and 'S', show 's'
|
||||
for shaded window @domo141 [#2895]
|
||||
- Support `xdg-dialog` protocol to enable better handling of modal dialogs @xi
|
||||
[#3134]
|
||||
- labnag: add --keyboard-focus option @tokyo4j [#3120]
|
||||
- Allow window switcher to temporarily unshade windows using config option
|
||||
`<windowSwitcher unshade="yes|no"/>` @Amodio @Consolatis [#3124]
|
||||
- For the 'classic' style window-switcher, add the following theme options:
|
||||
- `osd.window-switcher.style-classic.item.active.border.color`
|
||||
- `osd.window-switcher.style-classic.item.active.bg.color`
|
||||
@tokyo4j [#3118]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Don't remove newlines when parsing config, menu and XBM because doing so can
|
||||
cause parser error in some unusual situations like the one shown below.
|
||||
@tokyo4j [#3148]
|
||||
|
||||
```
|
||||
<!--
|
||||
-
|
||||
- Some comments
|
||||
-
|
||||
-->
|
||||
```
|
||||
|
||||
### Changed
|
||||
|
||||
- If XML documents (like rc.xml and menu.xml) have an XML declaration (typically
|
||||
`<?xml version="1.0"?>`), this XML declaration must be the first thing in the
|
||||
document. In previous versions, line breaks (`\n`) were allowed before due to
|
||||
the way the files were parsed, but this is approach caused other issues like
|
||||
[#3145] and is contrary to XML syntax. [#3148] [#3153]
|
||||
- With the window-switcher custom field state specifiers 's' and 'S', change the
|
||||
display order from M|m|F to m|s|M|F; and increase the size from three
|
||||
characters wide to four. @domo141 [#2895]
|
||||
- Call labnag with on-demand keyboard interactivity by default @tokyo4j [#3120]
|
||||
- Temporarily unshade windows when switching windows. Restore old behaviour with
|
||||
`<windowSwitcher unshade="no"/>` @Amodio @Consolatis [#3124]
|
||||
- In the classic style window-switcher, the default color of the selected window
|
||||
item has been changed to inherit the border color but with 15% opacity
|
||||
@tokyo4j [#3118]
|
||||
|
||||
## 0.9.2 - 2025-10-10
|
||||
|
||||
[0.9.2-commits]
|
||||
|
||||
### Added
|
||||
|
||||
- Allow `SnapToEdge` and `ToggleSnapToEdge` to combine two cardinal directions
|
||||
with the config option `combine="yes|no"`. [#3081] @tokyo4j
|
||||
- Support `Border` context for mousebinds as an alias for `Top`...`BRCorner` to
|
||||
make configuration easier. @tokyo4j [#3047]
|
||||
- Add window-switcher mode with thumbnails. This can be enabled with:
|
||||
`<windowSwitcher style="thumbnail">`. @tokyo4j [#2981]
|
||||
- Add `toggle` option to `GoToDesktop` action. This has the effect of going back
|
||||
to the last desktop if already on the target. @RainerKuemmerle [#3024]
|
||||
- Add `<theme maximizedDecoration="titlebar|none"/>` to allow hiding titlebar
|
||||
when window is maximized. @CosmicFusion @tokyo4j [#3015]
|
||||
- Use client-send-to-menu as 'Workspace' submenu in built-in client-menu
|
||||
@johanmalm [#2995]
|
||||
- Allow overwriting submenu icon to increase flexibility and enhance Openbox
|
||||
compatibility. @tokyo4j [#2998]
|
||||
- Allow client-{list-combined,send-to}-menu as submenu of static menu @tokyo4j
|
||||
[#2994]
|
||||
- Add `labnag` (a dialog client with message and buttons) and associated
|
||||
`<prompt>` option in 'If' actions. @johanmalm @Consolatis @tokyo4j [#2699]
|
||||
- Support config option `<core><promptCommand>` @johanmalm [#3097]
|
||||
- Allow snapping to corner edges during interactive move with associated config
|
||||
options `<snapping><cornerRange>`. @tokyo4j [#2885]
|
||||
- Support new values "up-left", "up-right", "down-left" and "down-right" with
|
||||
`<action name="(Toggle)SnapToEdge" direction="[value]">` and
|
||||
`<query tiled="[value]">`. @tokyo4j [#2885]
|
||||
- XML parsing improvements as listed below. @tokyo4j [#2667] [#2967] [#2971]
|
||||
- Support nested `If` and `ForEach` actions
|
||||
- Parse CDATA as text all nodes
|
||||
- Remove ordering constraint of attributes in `<keybind>`, `<mousebind>` and
|
||||
`<windowRule>`
|
||||
- `If` actions now works for menus
|
||||
- For menus, the `name` argument no longer has to be the first argument of
|
||||
`<action>`; and the `label` argument no longer has to be the first argument
|
||||
of `<item>`
|
||||
- Toggle mousebinds with the `ToggleKeybinds` action @tokyo4j [#2942]
|
||||
- Add support for direction value 'any' with tiled queries. This allows users
|
||||
to query for any snap directions without using multiple query statements
|
||||
@lynxy [#2883]
|
||||
|
||||
### Fixed
|
||||
|
||||
- On detecting broken icon theme, fall back on 'hicolor' @Consolatis [#3126]
|
||||
- Restore initially-maximized window position after unplug/plug @tokyo4j [#3042]
|
||||
- Fix large client-side icon not being loaded when the rendered icon size is
|
||||
larger than icon sizes from the client. @tokyo4j [#3033]
|
||||
- Improve debug logging for configuring input devices @jlindgren90 [#3028]
|
||||
- Fix false positives when matching desktop entries @datMaffin [#3004]
|
||||
- Prevent accidental downcasting of scale in scaled-icon-buffer to avoid blurry
|
||||
icons on non-integer scales and a cairo assert when using a output scale < 1.
|
||||
@Consolatis #2984
|
||||
- Fix xdg-shell windows moving between outputs due to configure timeout
|
||||
@jlindgren90 [#2976]
|
||||
- Fix segfault with toplevel `<separator>` in `menu.xml` @tokyo4j [#2970]
|
||||
- Prevent hi-res mice triggering scroll actions too often @tokyo4j [#2933]
|
||||
|
||||
### Changed
|
||||
|
||||
- Change default keybind `W-<arrow>` to combine cardinal directions to support
|
||||
resizing of windows to fill a quarter of an output. This only affects users
|
||||
who do not use an `rc.xml` (thereby using default keybinds) or use the
|
||||
`<keyboard><default/>` option. Previous behavior can be restored by setting
|
||||
`combine="no"` as shown below. [#3081] @tokyo4j
|
||||
|
||||
```
|
||||
<keybind key="W-Left">
|
||||
<action name="SnapToEdge" direction="left" combine="no" />
|
||||
</keybind>
|
||||
<keybind key="W-Right">
|
||||
<action name="SnapToEdge" direction="right" combine="no" />
|
||||
</keybind>
|
||||
<keybind key="W-Up">
|
||||
<action name="SnapToEdge" direction="up" combine="no" />
|
||||
</keybind>
|
||||
<keybind key="W-Down">
|
||||
<action name="SnapToEdge" direction="down" combine="no" />
|
||||
</keybind>
|
||||
```
|
||||
|
||||
- `Focus` and `Raise` on window border press because it is probably what most
|
||||
people expect and it makes the behavior consistent with that of Openbox.
|
||||
@johanmalm [#3039] [#3049]
|
||||
- On interactive resize, only un-maximize the axis/axes that are being resized.
|
||||
@jlindgren90 [#3043]
|
||||
- Change theme setting `osd.window-switcher.*` to
|
||||
`osd.window-switcher.style-classic.*`. Backward compatibility is preserved.
|
||||
@tokyo4j [#2981]
|
||||
- In client-list menu, add brackets around the titles of any minimised windows
|
||||
@davidphilipbarr [#3002]
|
||||
- Respect client-initiated window resize of non-maximized axis, for example
|
||||
remember the width of vertically-maximized window resizing itself
|
||||
horizontally. @jlindgren90 [#3020]
|
||||
- Remember position of window along non-maximized axis during interactive move.
|
||||
@jlindgren90 [#3020]
|
||||
- Restore default libinput device values on reconfigure with empty value, rather
|
||||
than leaving the old configuration. This makes rc.xml more declarative.
|
||||
@tokyo4j [#3011]
|
||||
- Change `If` action when used without a focused window to execute the `<else>`
|
||||
branch (previously it was just ignored). The reason for this is to make things
|
||||
more consistent with `<prompt>`. It is not anticipated that this will affect
|
||||
anyone's workflow but is mentioned here for completeness.
|
||||
- Make `autoEnableOutputs=no` apply only to drm outputs @jlindgren90 [#2972]
|
||||
- Take into account `<core><gap>` for edge and region overlays @tokyo4j [#2965]
|
||||
|
||||
## 0.9.1 - 2025-08-02
|
||||
|
||||
[0.9.1-commits]
|
||||
|
||||
This is an earlier-than-usual release containinig bug fixes only. It has been
|
||||
done on a separate branch to avoid the inclusion of refactoring and new
|
||||
features.
|
||||
|
||||
```
|
||||
0.9.1 <--- bug-fixes only
|
||||
/
|
||||
/
|
||||
0.8.4--------0.9.0-------- <-- master
|
||||
```
|
||||
|
||||
### Fixed
|
||||
|
||||
- Prevent interaction with un-initialized xdg-shell windows after unmap to fix a
|
||||
bug exposed by `wlroots-0.19.0` resulting in a compositor crash in certain
|
||||
(unusual) circumstances [#2948] [#2937] [#2944] @Consolatis
|
||||
- Fix double-free in `img_svg_render()` failure path [#2910] @jlindgren90
|
||||
- Fix swapped width/height in XWayland client `_NET_WM_ICON` stride calculation
|
||||
[#2909] @jlindgren90
|
||||
|
||||
## 0.9.0 - 2025-07-11
|
||||
|
||||
[0.9.0-commits]
|
||||
|
||||
The main focus has been to port labwc to wlroots 0.19 [#2388] and fix associated
|
||||
issues. Special thanks to @Consolatis @jlindgren90 for this.
|
||||
|
||||
### Added
|
||||
|
||||
- Add client `lab-sensible-terminal` and add a `Terminal` entry to the default
|
||||
|
|
@ -170,7 +415,9 @@ window.*.title.bg.colorTo.splitTo:
|
|||
</libinput>
|
||||
```
|
||||
|
||||
## [0.8.4]
|
||||
## 0.8.4 - 2025-05-02
|
||||
|
||||
[0.8.4-commits]
|
||||
|
||||
This release predominantly consists of bug-fixes, code simplification and
|
||||
usability improvements. Amongst the new features the most noteworthy is the
|
||||
|
|
@ -234,7 +481,9 @@ release.
|
|||
- Increase default `<snapping><range>` to 10 to make it easier to snap windows
|
||||
on the edge between two monitors. @johanmalm [#2602] [#2608]
|
||||
|
||||
## [0.8.3]
|
||||
## 0.8.3 - 2025-02-21
|
||||
|
||||
[0.8.3-commits]
|
||||
|
||||
The eye-catching new features of this release are undoubtedly:
|
||||
1. Support for the `ext-workspace` protocol with big thanks to @Consolatis
|
||||
|
|
@ -352,7 +601,9 @@ Notes to package maintainers:
|
|||
and followMouseRequiresMovement="no" in rc.xml, keyboard-focus semantics
|
||||
have subtly changed when using the window-switcher. [#2455]
|
||||
|
||||
## [0.8.2]
|
||||
## 0.8.2 - 2024-12-13
|
||||
|
||||
[0.8.2-commits]
|
||||
|
||||
This is a shorter release cycle compared with the usual 10-week one because it
|
||||
contains a significant number of stability and cleanliness fixes which warrant
|
||||
|
|
@ -491,7 +742,9 @@ menu.border.color: #aaaaaa
|
|||
Openbox's behavior and (ii) behave as already described in our own
|
||||
documentation. [#2380]
|
||||
|
||||
## [0.8.1]
|
||||
## 0.8.1 - 2024-10-25
|
||||
|
||||
[0.8.1-commits]
|
||||
|
||||
The most noteworthy additions in this release are:
|
||||
|
||||
|
|
@ -639,7 +892,9 @@ window.inactive.button.shade.unpressed.image.color
|
|||
per-device configuration of scroll factor (e.g. setting different scroll
|
||||
factors for mice and touchpads). [#2057]
|
||||
|
||||
## [0.8.0]
|
||||
## 0.8.0 - 2024-08-16
|
||||
|
||||
[0.8.0-commits]
|
||||
|
||||
The main focus in this release has been to port labwc to wlroots 0.18 and to
|
||||
grind out associated regressions. Nonetheless, it contains a few non-related
|
||||
|
|
@ -720,7 +975,9 @@ have been attributed with a 'Written-by' against each relevant log entry.
|
|||
|
||||
- Make windows stay fullscreen when associated output is disconnected. [#2040]
|
||||
|
||||
## [0.7.4]
|
||||
## 0.7.4 - 2024-06-19
|
||||
|
||||
[0.7.4-commits]
|
||||
|
||||
### Fixed
|
||||
|
||||
|
|
@ -728,7 +985,9 @@ have been attributed with a 'Written-by' against each relevant log entry.
|
|||
- Fix magnifier by disabling direct scanout when active. [#1989]
|
||||
- Fix crash triggered by pipemenu without parent `<menu>` element. [#1988]
|
||||
|
||||
## [0.7.3]
|
||||
## 0.7.3 - 2024-06-12
|
||||
|
||||
[0.7.3-commits]
|
||||
|
||||
Following a couple of big releases, this one feels like more steady with lots of
|
||||
focus on bug fixes and stability. In terms of new features the most noteworthy
|
||||
|
|
@ -817,7 +1076,9 @@ joint effort by @spl237 and @Consolatis.
|
|||
- Action `MoveToCursor` is deprecated in favour of:
|
||||
`<action name="AutoPlace" policy="cursor"/>`.
|
||||
|
||||
## [0.7.2]
|
||||
## 0.7.2 - 2024-05-10
|
||||
|
||||
[0.7.2-commits]
|
||||
|
||||
This release shaped up to be the second in a row that is larger than usual in
|
||||
terms of both fixes and new features. Significant additions include
|
||||
|
|
@ -1085,7 +1346,9 @@ osd.window-switcher.preview.border.color: #ffffff,#00a2ff,#ffffff
|
|||
the DRM backend or by explicit request using environment variable
|
||||
`LABWC_UPDATE_ACTIVATION_ENV`.
|
||||
|
||||
## [0.7.1]
|
||||
## 0.7.1 - 2024-03-01
|
||||
|
||||
[0.7.1-commits]
|
||||
|
||||
### Added
|
||||
|
||||
|
|
@ -1256,7 +1519,9 @@ osd.window-switcher.preview.border.color: #ffffff,#00a2ff,#ffffff
|
|||
full `app_id`. Consult the labwc-config(5) manual page for more details.
|
||||
[#1309]
|
||||
|
||||
## [0.7.0] - 2023-12-22
|
||||
## 0.7.0 - 2023-12-22
|
||||
|
||||
[0.7.0-commits]
|
||||
|
||||
The main effort in this release has gone into porting labwc to wlroots 0.17
|
||||
and tidying up regressions. Nonetheless, it contains a significant number of
|
||||
|
|
@ -1316,7 +1581,9 @@ Should bug fixes be required against `0.6.6` (built with wlroots `0.16`), a
|
|||
- Use the GTK3 notebook header color as the default active title color
|
||||
(small change from `#dddad6` to `#e1dedb`). Written-by: @dimkr
|
||||
|
||||
## [0.6.6] - 2023-11-25
|
||||
## 0.6.6 - 2023-11-25
|
||||
|
||||
[0.6.6-commits]
|
||||
|
||||
We do not normally call out contributions by core devs in the changelog,
|
||||
but a special thanks goes to @jlindgren90 in this release for lots of work
|
||||
|
|
@ -1430,7 +1697,9 @@ relating to surface focus and keyboard issues, amongst others.
|
|||
will not appear anymore.
|
||||
- Always switch to the workspace containing the view being focused.
|
||||
|
||||
## [0.6.5] - 2023-09-23
|
||||
## 0.6.5 - 2023-09-23
|
||||
|
||||
[0.6.5-commits]
|
||||
|
||||
### Added
|
||||
|
||||
|
|
@ -1506,7 +1775,9 @@ relating to surface focus and keyboard issues, amongst others.
|
|||
- Do not expand environment variables in `Exec` action `<command>`
|
||||
argument (but still resolve tilde).
|
||||
|
||||
## [0.6.4] - 2023-07-14
|
||||
## 0.6.4 - 2023-07-14
|
||||
|
||||
[0.6.4-commits]
|
||||
|
||||
### Added
|
||||
|
||||
|
|
@ -1547,7 +1818,9 @@ relating to surface focus and keyboard issues, amongst others.
|
|||
- Make `ToggleKeybinds` applicable only to the window that has keyboard focus
|
||||
when the action is executed.
|
||||
|
||||
## [0.6.3] - 2023-05-08
|
||||
## 0.6.3 - 2023-05-08
|
||||
|
||||
[0.6.3-commits]
|
||||
|
||||
### Added
|
||||
|
||||
|
|
@ -1619,7 +1892,9 @@ relating to surface focus and keyboard issues, amongst others.
|
|||
- Default to follow="true" for SendToDesktop action as per Openbox 3.6
|
||||
specification.
|
||||
|
||||
## [0.6.2] - 2023-03-20
|
||||
## 0.6.2 - 2023-03-20
|
||||
|
||||
[0.6.2-commits]
|
||||
|
||||
This release contains refactoring and simplification relating to
|
||||
view-output association and xdg/xwayland configure/map events.
|
||||
|
|
@ -1681,7 +1956,9 @@ Unless otherwise stated all contributions are by the core-devs
|
|||
</core>
|
||||
```
|
||||
|
||||
## [0.6.1] - 2023-01-29
|
||||
## 0.6.1 - 2023-01-29
|
||||
|
||||
[0.6.1-commits]
|
||||
|
||||
As usual, this release contains lots of refactoring and bug fixes with
|
||||
particular thanks going to @Consolatis, @jlindgren90, @bi4k8, @Flrian and
|
||||
|
|
@ -1744,7 +2021,9 @@ particular thanks going to @Consolatis, @jlindgren90, @bi4k8, @Flrian and
|
|||
VS Code and Discord lagging over time. [#553] Written-by: @Joshua-Ashton
|
||||
- Do not switch output on SnapToEdge if view is maximized. Written-by: @Flrian
|
||||
|
||||
## [0.6.0] - 2022-11-17
|
||||
## 0.6.0 - 2022-11-17
|
||||
|
||||
[0.6.0-commits]
|
||||
|
||||
This release contains significant refactoring to use the wlroots
|
||||
scene-graph API. This touches many areas of the code, particularly
|
||||
|
|
@ -1911,7 +2190,9 @@ reported, tested and fixed issues. Particular mentions go to @bi4k8,
|
|||
exited the compositor by mistake trying to get out of alt-tab cycling
|
||||
or similar.
|
||||
|
||||
## [0.5.3] - 2022-07-15
|
||||
## 0.5.3 - 2022-07-15
|
||||
|
||||
[0.5.3-commits]
|
||||
|
||||
### Added
|
||||
|
||||
|
|
@ -1933,7 +2214,9 @@ reported, tested and fixed issues. Particular mentions go to @bi4k8,
|
|||
- Do not segfault on missing drag icon. Written-by: @Consolatis
|
||||
- Fix windows erratically sticking to edges during move/resize [#331] [#309]
|
||||
|
||||
## [0.5.2] - 2022-05-17
|
||||
## 0.5.2 - 2022-05-17
|
||||
|
||||
[0.5.2-commits]
|
||||
|
||||
This is a minor bugfix release mostly to ease packaging.
|
||||
|
||||
|
|
@ -1941,7 +2224,9 @@ This is a minor bugfix release mostly to ease packaging.
|
|||
|
||||
- Properly use system provided wlroots. Written-by: @eli-schwartz
|
||||
|
||||
## [0.5.1] - 2022-04-08
|
||||
## 0.5.1 - 2022-04-08
|
||||
|
||||
[0.5.1-commits]
|
||||
|
||||
### Added
|
||||
|
||||
|
|
@ -1968,7 +2253,9 @@ This is a minor bugfix release mostly to ease packaging.
|
|||
- Fix qt application crash on touchpad scroll [#225]
|
||||
Written-by: @Consolatis
|
||||
|
||||
## [0.5.0] - 2022-02-18
|
||||
## 0.5.0 - 2022-02-18
|
||||
|
||||
[0.5.0-commits]
|
||||
|
||||
As usual, this release contains a bunch of fixes and improvements, of
|
||||
which the most notable feature-type changes are listed below. A big
|
||||
|
|
@ -2005,7 +2292,9 @@ This release contains the following two breaking changes:
|
|||
updating any local `rc.xml` settings in accordance with
|
||||
`docs/rc.xml.all`
|
||||
|
||||
## [0.4.0] - 2021-12-31
|
||||
## 0.4.0 - 2021-12-31
|
||||
|
||||
[0.4.0-commits]
|
||||
|
||||
Compile with wlroots 0.15.0
|
||||
|
||||
|
|
@ -2080,7 +2369,9 @@ feature-type changes are listed below.
|
|||
- The config option `<lab><xdg_shell_server_side_deco>` has changed to
|
||||
`<core><decoration>` (breaking change)
|
||||
|
||||
## [0.3.0] - 2021-06-28
|
||||
## 0.3.0 - 2021-06-28
|
||||
|
||||
[0.3.0-commits]
|
||||
|
||||
Compile with wlroots 0.14.0
|
||||
|
||||
|
|
@ -2091,7 +2382,9 @@ Compile with wlroots 0.14.0
|
|||
- Do not use Clearlooks-3.4 theme by default, just use built-in theme
|
||||
- Fix bug which triggered Qt application segfault
|
||||
|
||||
## [0.2.0] - 2021-04-15
|
||||
## 0.2.0 - 2021-04-15
|
||||
|
||||
[0.2.0-commits]
|
||||
|
||||
Compile with wlroots 0.13.0
|
||||
|
||||
|
|
@ -2104,7 +2397,9 @@ Compile with wlroots 0.13.0
|
|||
- Add labwc-environment(5)
|
||||
- Call `wlr_output_enable_adaptive_sync()` if `LABWC_ADAPTIVE_SYNC` set
|
||||
|
||||
## [0.1.0] - 2021-03-05
|
||||
## 0.1.0 - 2021-03-05
|
||||
|
||||
[0.1.0-commits]
|
||||
|
||||
Compile with wlroots 0.12.0 and wayland-server >=1.16
|
||||
|
||||
|
|
@ -2123,33 +2418,35 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
|
|||
ShowMenu
|
||||
|
||||
[Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
|
||||
[unreleased]: https://github.com/labwc/labwc/compare/0.9.0...HEAD
|
||||
[0.9.0]: https://github.com/labwc/labwc/compare/0.8.4...0.9.0
|
||||
[0.8.4]: https://github.com/labwc/labwc/compare/0.8.3...0.8.4
|
||||
[0.8.3]: https://github.com/labwc/labwc/compare/0.8.2...0.8.3
|
||||
[0.8.2]: https://github.com/labwc/labwc/compare/0.8.1...0.8.2
|
||||
[0.8.1]: https://github.com/labwc/labwc/compare/0.8.0...0.8.1
|
||||
[0.8.0]: https://github.com/labwc/labwc/compare/0.7.3...0.8.0
|
||||
[0.7.4]: https://github.com/labwc/labwc/compare/0.7.3...0.7.4
|
||||
[0.7.3]: https://github.com/labwc/labwc/compare/0.7.2...0.7.3
|
||||
[0.7.2]: https://github.com/labwc/labwc/compare/0.7.1...0.7.2
|
||||
[0.7.1]: https://github.com/labwc/labwc/compare/0.7.0...0.7.1
|
||||
[0.7.0]: https://github.com/labwc/labwc/compare/0.6.6...0.7.0
|
||||
[0.6.6]: https://github.com/labwc/labwc/compare/0.6.5...0.6.6
|
||||
[0.6.5]: https://github.com/labwc/labwc/compare/0.6.4...0.6.5
|
||||
[0.6.4]: https://github.com/labwc/labwc/compare/0.6.3...0.6.4
|
||||
[0.6.3]: https://github.com/labwc/labwc/compare/0.6.2...0.6.3
|
||||
[0.6.2]: https://github.com/labwc/labwc/compare/0.6.1...0.6.2
|
||||
[0.6.1]: https://github.com/labwc/labwc/compare/0.6.0...0.6.1
|
||||
[0.6.0]: https://github.com/labwc/labwc/compare/0.5.0...0.6.0
|
||||
[0.5.3]: https://github.com/labwc/labwc/compare/0.5.2...0.5.3
|
||||
[0.5.2]: https://github.com/labwc/labwc/compare/0.5.1...0.5.2
|
||||
[0.5.1]: https://github.com/labwc/labwc/compare/0.5.0...0.5.1
|
||||
[0.5.0]: https://github.com/labwc/labwc/compare/0.4.0...0.5.0
|
||||
[0.4.0]: https://github.com/labwc/labwc/compare/0.3.0...0.4.0
|
||||
[0.3.0]: https://github.com/labwc/labwc/compare/0.2.0...0.3.0
|
||||
[0.2.0]: https://github.com/labwc/labwc/compare/0.1.0...0.2.0
|
||||
[0.1.0]: https://github.com/labwc/labwc/compare/081339e...0.1.0
|
||||
[unreleased-commits]: https://github.com/labwc/labwc/compare/0.9.2...HEAD
|
||||
[0.9.2-commits]: https://github.com/labwc/labwc/compare/0.9.1...0.9.2
|
||||
[0.9.1-commits]: https://github.com/labwc/labwc/compare/0.9.0...0.9.1
|
||||
[0.9.0-commits]: https://github.com/labwc/labwc/compare/0.8.4...0.9.0
|
||||
[0.8.4-commits]: https://github.com/labwc/labwc/compare/0.8.3...0.8.4
|
||||
[0.8.3-commits]: https://github.com/labwc/labwc/compare/0.8.2...0.8.3
|
||||
[0.8.2-commits]: https://github.com/labwc/labwc/compare/0.8.1...0.8.2
|
||||
[0.8.1-commits]: https://github.com/labwc/labwc/compare/0.8.0...0.8.1
|
||||
[0.8.0-commits]: https://github.com/labwc/labwc/compare/0.7.3...0.8.0
|
||||
[0.7.4-commits]: https://github.com/labwc/labwc/compare/0.7.3...0.7.4
|
||||
[0.7.3-commits]: https://github.com/labwc/labwc/compare/0.7.2...0.7.3
|
||||
[0.7.2-commits]: https://github.com/labwc/labwc/compare/0.7.1...0.7.2
|
||||
[0.7.1-commits]: https://github.com/labwc/labwc/compare/0.7.0...0.7.1
|
||||
[0.7.0-commits]: https://github.com/labwc/labwc/compare/0.6.6...0.7.0
|
||||
[0.6.6-commits]: https://github.com/labwc/labwc/compare/0.6.5...0.6.6
|
||||
[0.6.5-commits]: https://github.com/labwc/labwc/compare/0.6.4...0.6.5
|
||||
[0.6.4-commits]: https://github.com/labwc/labwc/compare/0.6.3...0.6.4
|
||||
[0.6.3-commits]: https://github.com/labwc/labwc/compare/0.6.2...0.6.3
|
||||
[0.6.2-commits]: https://github.com/labwc/labwc/compare/0.6.1...0.6.2
|
||||
[0.6.1-commits]: https://github.com/labwc/labwc/compare/0.6.0...0.6.1
|
||||
[0.6.0-commits]: https://github.com/labwc/labwc/compare/0.5.0...0.6.0
|
||||
[0.5.3-commits]: https://github.com/labwc/labwc/compare/0.5.2...0.5.3
|
||||
[0.5.2-commits]: https://github.com/labwc/labwc/compare/0.5.1...0.5.2
|
||||
[0.5.1-commits]: https://github.com/labwc/labwc/compare/0.5.0...0.5.1
|
||||
[0.5.0-commits]: https://github.com/labwc/labwc/compare/0.4.0...0.5.0
|
||||
[0.4.0-commits]: https://github.com/labwc/labwc/compare/0.3.0...0.4.0
|
||||
[0.3.0-commits]: https://github.com/labwc/labwc/compare/0.2.0...0.3.0
|
||||
[0.2.0-commits]: https://github.com/labwc/labwc/compare/0.1.0...0.2.0
|
||||
[0.1.0-commits]: https://github.com/labwc/labwc/compare/081339e...0.1.0
|
||||
|
||||
[#162]: https://github.com/labwc/labwc/pull/162
|
||||
[#163]: https://github.com/labwc/labwc/pull/163
|
||||
|
|
@ -2496,12 +2793,14 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
|
|||
[#2652]: https://github.com/labwc/labwc/pull/2652
|
||||
[#2653]: https://github.com/labwc/labwc/pull/2653
|
||||
[#2657]: https://github.com/labwc/labwc/pull/2657
|
||||
[#2667]: https://github.com/labwc/labwc/pull/2667
|
||||
[#2669]: https://github.com/labwc/labwc/pull/2669
|
||||
[#2678]: https://github.com/labwc/labwc/pull/2678
|
||||
[#2686]: https://github.com/labwc/labwc/pull/2686
|
||||
[#2688]: https://github.com/labwc/labwc/pull/2688
|
||||
[#2692]: https://github.com/labwc/labwc/pull/2692
|
||||
[#2693]: https://github.com/labwc/labwc/pull/2693
|
||||
[#2699]: https://github.com/labwc/labwc/pull/2699
|
||||
[#2700]: https://github.com/labwc/labwc/pull/2700
|
||||
[#2710]: https://github.com/labwc/labwc/pull/2710
|
||||
[#2713]: https://github.com/labwc/labwc/pull/2713
|
||||
|
|
@ -2545,6 +2844,53 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
|
|||
[#2873]: https://github.com/labwc/labwc/pull/2873
|
||||
[#2874]: https://github.com/labwc/labwc/pull/2874
|
||||
[#2877]: https://github.com/labwc/labwc/pull/2877
|
||||
[#2883]: https://github.com/labwc/labwc/pull/2883
|
||||
[#2885]: https://github.com/labwc/labwc/pull/2885
|
||||
[#2886]: https://github.com/labwc/labwc/pull/2886
|
||||
[#2887]: https://github.com/labwc/labwc/pull/2887
|
||||
[#2891]: https://github.com/labwc/labwc/pull/2891
|
||||
[#2895]: https://github.com/labwc/labwc/pull/2895
|
||||
[#2909]: https://github.com/labwc/labwc/pull/2909
|
||||
[#2910]: https://github.com/labwc/labwc/pull/2910
|
||||
[#2914]: https://github.com/labwc/labwc/pull/2914
|
||||
[#2933]: https://github.com/labwc/labwc/pull/2933
|
||||
[#2937]: https://github.com/labwc/labwc/pull/2937
|
||||
[#2939]: https://github.com/labwc/labwc/pull/2939
|
||||
[#2942]: https://github.com/labwc/labwc/pull/2942
|
||||
[#2943]: https://github.com/labwc/labwc/pull/2943
|
||||
[#2944]: https://github.com/labwc/labwc/pull/2944
|
||||
[#2948]: https://github.com/labwc/labwc/pull/2948
|
||||
[#2965]: https://github.com/labwc/labwc/pull/2965
|
||||
[#2967]: https://github.com/labwc/labwc/pull/2967
|
||||
[#2970]: https://github.com/labwc/labwc/pull/2970
|
||||
[#2971]: https://github.com/labwc/labwc/pull/2971
|
||||
[#2972]: https://github.com/labwc/labwc/pull/2972
|
||||
[#2976]: https://github.com/labwc/labwc/pull/2976
|
||||
[#2981]: https://github.com/labwc/labwc/pull/2981
|
||||
[#2994]: https://github.com/labwc/labwc/pull/2994
|
||||
[#2995]: https://github.com/labwc/labwc/pull/2995
|
||||
[#2998]: https://github.com/labwc/labwc/pull/2998
|
||||
[#3002]: https://github.com/labwc/labwc/pull/3002
|
||||
[#3004]: https://github.com/labwc/labwc/pull/3004
|
||||
[#3011]: https://github.com/labwc/labwc/pull/3011
|
||||
[#3015]: https://github.com/labwc/labwc/pull/3015
|
||||
[#3020]: https://github.com/labwc/labwc/pull/3020
|
||||
[#3024]: https://github.com/labwc/labwc/pull/3024
|
||||
[#3028]: https://github.com/labwc/labwc/pull/3028
|
||||
[#3033]: https://github.com/labwc/labwc/pull/3033
|
||||
[#3039]: https://github.com/labwc/labwc/pull/3039
|
||||
[#3042]: https://github.com/labwc/labwc/pull/3042
|
||||
[#3043]: https://github.com/labwc/labwc/pull/3043
|
||||
[#3047]: https://github.com/labwc/labwc/pull/3047
|
||||
[#3049]: https://github.com/labwc/labwc/pull/3049
|
||||
[#3081]: https://github.com/labwc/labwc/pull/3081
|
||||
[#3097]: https://github.com/labwc/labwc/pull/3097
|
||||
[#3099]: https://github.com/labwc/labwc/pull/3099
|
||||
[#3118]: https://github.com/labwc/labwc/pull/3118
|
||||
[#3120]: https://github.com/labwc/labwc/pull/3120
|
||||
[#3124]: https://github.com/labwc/labwc/pull/3124
|
||||
[#3126]: https://github.com/labwc/labwc/pull/3126
|
||||
[#3134]: https://github.com/labwc/labwc/pull/3134
|
||||
[#3145]: https://github.com/labwc/labwc/pull/3145
|
||||
[#3148]: https://github.com/labwc/labwc/pull/3148
|
||||
[#3153]: https://github.com/labwc/labwc/pull/3153
|
||||
|
|
|
|||
16
README.md
16
README.md
|
|
@ -101,21 +101,8 @@ spend our effort.
|
|||
|
||||
A lot of emphasis is put on code simplicity when considering features.
|
||||
|
||||
The main development effort is focused on producing a solid foundation for a
|
||||
stacking compositor rather than adding configuration and theming options.
|
||||
|
||||
See [scope] for full details on implemented features.
|
||||
|
||||
High-level summary of items that Labwc supports:
|
||||
|
||||
- [x] Config files (rc.xml, autostart, shutdown, environment, menu.xml)
|
||||
- [x] Theme files and xbm/png/svg icons
|
||||
- [x] Basic desktop and client menus
|
||||
- [x] HiDPI
|
||||
- [x] wlroots protocols such as `output-management`, `layer-shell` and
|
||||
`foreign-toplevel`
|
||||
- [x] Optionally xwayland
|
||||
|
||||
### 1.5 Videos
|
||||
|
||||
| video link | date | duration
|
||||
|
|
@ -249,7 +236,7 @@ Suggested apps to use with Labwc:
|
|||
- Screen shooter: [grim]
|
||||
- Screen recorder: [wf-recorder]
|
||||
- Background image: [swaybg]
|
||||
- Panel: [waybar], [yambar], [lavalauncher], [sfwbar], [xfce4-panel]
|
||||
- Panel: [waybar], [lavalauncher], [sfwbar], [xfce4-panel]
|
||||
- Launchers: [bemenu], [fuzzel], [wofi]
|
||||
- Output managers: [wlopm], [kanshi], [wlr-randr]
|
||||
- Screen locker: [swaylock]
|
||||
|
|
@ -292,7 +279,6 @@ The default window bar menu can be translated on the [weblate platform](https://
|
|||
[wf-recorder]: https://github.com/ammen99/wf-recorder
|
||||
[swaybg]: https://github.com/swaywm/swaybg
|
||||
[waybar]: https://github.com/Alexays/Waybar
|
||||
[yambar]: https://codeberg.org/dnkl/yambar
|
||||
[lavalauncher]: https://sr.ht/~leon_plickat/LavaLauncher
|
||||
[sfwbar]: https://github.com/LBCrion/sfwbar
|
||||
[xfce4-panel]: https://gitlab.xfce.org/xfce/xfce4-panel
|
||||
|
|
|
|||
1874
clients/labnag.c
Normal file
1874
clients/labnag.c
Normal file
File diff suppressed because it is too large
Load diff
59
clients/meson.build
Normal file
59
clients/meson.build
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
wayland_client = dependency('wayland-client')
|
||||
wayland_cursor = dependency('wayland-cursor')
|
||||
|
||||
nag_sources = files(
|
||||
'labnag.c',
|
||||
'pool-buffer.c',
|
||||
)
|
||||
|
||||
wl_protocol_dir = wayland_protos.get_variable('pkgdatadir')
|
||||
|
||||
protocols = [
|
||||
wl_protocol_dir / 'stable/tablet/tablet-v2.xml',
|
||||
wl_protocol_dir / 'stable/xdg-shell/xdg-shell.xml',
|
||||
wl_protocol_dir / 'staging/cursor-shape/cursor-shape-v1.xml',
|
||||
'../protocols/wlr-layer-shell-unstable-v1.xml',
|
||||
]
|
||||
|
||||
foreach xml : protocols
|
||||
nag_sources += custom_target(
|
||||
xml.underscorify() + '_c',
|
||||
input: xml,
|
||||
output: '@BASENAME@-protocol.c',
|
||||
command: [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@'],
|
||||
)
|
||||
nag_sources += custom_target(
|
||||
xml.underscorify() + '_client_h',
|
||||
input: xml,
|
||||
output: '@BASENAME@-client-protocol.h',
|
||||
command: [wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@'],
|
||||
)
|
||||
endforeach
|
||||
|
||||
if host_machine.system() in ['freebsd', 'openbsd']
|
||||
# For signalfd()
|
||||
epoll_dep = dependency('epoll-shim')
|
||||
else
|
||||
epoll_dep = []
|
||||
endif
|
||||
|
||||
executable(
|
||||
'labnag',
|
||||
nag_sources,
|
||||
dependencies: [
|
||||
cairo,
|
||||
pangocairo,
|
||||
glib,
|
||||
wayland_client,
|
||||
wayland_cursor,
|
||||
wlroots,
|
||||
server_protos,
|
||||
epoll_dep,
|
||||
xkbcommon,
|
||||
],
|
||||
include_directories: [labwc_inc],
|
||||
install: true,
|
||||
)
|
||||
|
||||
clients = files('lab-sensible-terminal')
|
||||
install_data(clients, install_dir: get_option('bindir'))
|
||||
141
clients/pool-buffer.c
Normal file
141
clients/pool-buffer.c
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copied from https://github.com/swaywm/sway
|
||||
*
|
||||
* Copyright (C) 2016-2017 Drew DeVault
|
||||
*/
|
||||
#define _POSIX_C_SOURCE 200809L
|
||||
#include <cairo.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <pango/pangocairo.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include "pool-buffer.h"
|
||||
|
||||
static int anonymous_shm_open(void)
|
||||
{
|
||||
int retries = 100;
|
||||
|
||||
do {
|
||||
// try a probably-unique name
|
||||
struct timespec ts;
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
pid_t pid = getpid();
|
||||
char name[50];
|
||||
snprintf(name, sizeof(name), "/labnag-%x-%x",
|
||||
(unsigned int)pid, (unsigned int)ts.tv_nsec);
|
||||
|
||||
// shm_open guarantees that O_CLOEXEC is set
|
||||
int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||
if (fd >= 0) {
|
||||
shm_unlink(name);
|
||||
return fd;
|
||||
}
|
||||
|
||||
--retries;
|
||||
} while (retries > 0 && errno == EEXIST);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void buffer_release(void *data, struct wl_buffer *wl_buffer)
|
||||
{
|
||||
struct pool_buffer *buffer = data;
|
||||
buffer->busy = false;
|
||||
}
|
||||
|
||||
static const struct wl_buffer_listener buffer_listener = {
|
||||
.release = buffer_release
|
||||
};
|
||||
|
||||
static struct pool_buffer *create_buffer(struct wl_shm *shm,
|
||||
struct pool_buffer *buf, int32_t width, int32_t height,
|
||||
uint32_t format)
|
||||
{
|
||||
uint32_t stride = width * 4;
|
||||
size_t size = stride * height;
|
||||
|
||||
int fd = anonymous_shm_open();
|
||||
if (fd == -1) {
|
||||
return NULL;
|
||||
}
|
||||
if (ftruncate(fd, size) < 0) {
|
||||
close(fd);
|
||||
return NULL;
|
||||
}
|
||||
void *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
struct wl_shm_pool *pool = wl_shm_create_pool(shm, fd, size);
|
||||
buf->buffer = wl_shm_pool_create_buffer(pool, 0,
|
||||
width, height, stride, format);
|
||||
wl_shm_pool_destroy(pool);
|
||||
close(fd);
|
||||
|
||||
buf->size = size;
|
||||
buf->width = width;
|
||||
buf->height = height;
|
||||
buf->data = data;
|
||||
buf->surface = cairo_image_surface_create_for_data(data,
|
||||
CAIRO_FORMAT_ARGB32, width, height, stride);
|
||||
buf->cairo = cairo_create(buf->surface);
|
||||
buf->pango = pango_cairo_create_context(buf->cairo);
|
||||
|
||||
wl_buffer_add_listener(buf->buffer, &buffer_listener, buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
void destroy_buffer(struct pool_buffer *buffer)
|
||||
{
|
||||
if (buffer->buffer) {
|
||||
wl_buffer_destroy(buffer->buffer);
|
||||
buffer->buffer = NULL;
|
||||
}
|
||||
if (buffer->cairo) {
|
||||
cairo_destroy(buffer->cairo);
|
||||
buffer->cairo = NULL;
|
||||
}
|
||||
if (buffer->surface) {
|
||||
cairo_surface_destroy(buffer->surface);
|
||||
buffer->surface = NULL;
|
||||
}
|
||||
if (buffer->pango) {
|
||||
g_object_unref(buffer->pango);
|
||||
buffer->pango = NULL;
|
||||
}
|
||||
if (buffer->data) {
|
||||
munmap(buffer->data, buffer->size);
|
||||
buffer->data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
struct pool_buffer *get_next_buffer(struct wl_shm *shm,
|
||||
struct pool_buffer pool[static 2], uint32_t width, uint32_t height)
|
||||
{
|
||||
struct pool_buffer *buffer = NULL;
|
||||
|
||||
for (size_t i = 0; i < 2; ++i) {
|
||||
if (pool[i].busy) {
|
||||
continue;
|
||||
}
|
||||
buffer = &pool[i];
|
||||
}
|
||||
|
||||
if (!buffer) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (buffer->width != width || buffer->height != height) {
|
||||
destroy_buffer(buffer);
|
||||
}
|
||||
|
||||
if (!buffer->buffer) {
|
||||
if (!create_buffer(shm, buffer, width, height,
|
||||
WL_SHM_FORMAT_ARGB8888)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
buffer->busy = true;
|
||||
return buffer;
|
||||
}
|
||||
30
clients/pool-buffer.h
Normal file
30
clients/pool-buffer.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copied from https://github.com/swaywm/sway
|
||||
*
|
||||
* Copyright (C) 2016-2017 Drew DeVault
|
||||
*/
|
||||
#ifndef LAB_POOL_BUFFER_H
|
||||
#define LAB_POOL_BUFFER_H
|
||||
#include <cairo.h>
|
||||
#include <pango/pangocairo.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <wayland-client.h>
|
||||
|
||||
struct pool_buffer {
|
||||
struct wl_buffer *buffer;
|
||||
cairo_surface_t *surface;
|
||||
cairo_t *cairo;
|
||||
PangoContext *pango;
|
||||
uint32_t width, height;
|
||||
void *data;
|
||||
size_t size;
|
||||
bool busy;
|
||||
};
|
||||
|
||||
struct pool_buffer *get_next_buffer(struct wl_shm *shm,
|
||||
struct pool_buffer pool[static 2], uint32_t width, uint32_t height);
|
||||
void destroy_buffer(struct pool_buffer *buffer);
|
||||
|
||||
#endif /* LAB_POOL_BUFFER_H */
|
||||
143
docs/labnag.1.scd
Normal file
143
docs/labnag.1.scd
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
labnag(1)
|
||||
|
||||
# NAME
|
||||
|
||||
labnag - Show dialog with message and buttons
|
||||
|
||||
# SYNOPSIS
|
||||
|
||||
_labnag_ [options...]
|
||||
|
||||
# OPTIONS
|
||||
|
||||
*-B, --button* <text> [<action>]
|
||||
Create a button with the text _text_ that optionally executes _action_
|
||||
when pressed. Multiple buttons can be defined by providing the flag
|
||||
multiple times. Buttons will appear in the order they are provided from
|
||||
left to right.
|
||||
|
||||
*-Z, --button-dismiss* <text> [<action>]
|
||||
Create a button with the text _text_ that optionally executes _action_
|
||||
when pressed, and dismisses labnag. Multiple buttons can be defined by
|
||||
providing the flag multiple times. Buttons will appear in the order
|
||||
they are provided from left to right.
|
||||
|
||||
*-d, --debug*
|
||||
Enable debugging.
|
||||
|
||||
*-e, --edge* top|bottom
|
||||
Set the edge to use.
|
||||
|
||||
*-y, --layer* overlay|top|bottom|background
|
||||
Set the layer to use.
|
||||
|
||||
*-k, --keyboard-focus none|exclusive|on-demand*
|
||||
Set the policy for keyboard focus.
|
||||
|
||||
*-f, --font* <font>
|
||||
Set the font to use.
|
||||
|
||||
*-h, --help*
|
||||
Show help message and quit.
|
||||
|
||||
*-l, --detailed-message*
|
||||
Read a detailed message from stdin. A button to toggle details will be
|
||||
added. Details are shown in a scrollable multi-line text area.
|
||||
|
||||
*-L, --detailed-button* <text>
|
||||
Set the text for the button that toggles details. This has no effect if
|
||||
there is not a detailed message. The default is _Toggle details_.
|
||||
|
||||
*-m, --message* <msg>
|
||||
Set the message text.
|
||||
|
||||
*-o, --output* <output>
|
||||
Set the output to use. This should be the name of a _xdg\_output_.
|
||||
|
||||
*-t, --timeout*
|
||||
Set duration to close dialog. Default is 5 seconds.
|
||||
|
||||
*-x, --exclusive-zone*
|
||||
Use exclusive zone. Default is false.
|
||||
|
||||
*-v, --version*
|
||||
Show the version number and quit.
|
||||
|
||||
# APPEARANCE OPTIONS
|
||||
|
||||
*--background-color* <RRGGBB[AA]>
|
||||
Set the color of the background.
|
||||
|
||||
*--button-border-color* <RRGGBB[AA]>
|
||||
Set the color of the button border.
|
||||
|
||||
*--border-bottom-color* <RRGGBB[AA]>
|
||||
Set the color of the bottom border.
|
||||
|
||||
*--button-background-color* <RRGGBB[AA]>
|
||||
Set the color for the background for buttons.
|
||||
|
||||
*--text-color* <RRGGBB[AA]>
|
||||
Set the text color.
|
||||
|
||||
*--button-text-color* <RRGGBB[AA]>
|
||||
Set the button text color.
|
||||
|
||||
*--border-bottom-size* <size>
|
||||
Set the thickness of the bottom border.
|
||||
|
||||
*--message-padding* <padding>
|
||||
Set the padding for the message.
|
||||
|
||||
*--details-background-color* <RRGGBB[AA]>
|
||||
Set the color for the background for details.
|
||||
|
||||
*--details-border-size* <size>
|
||||
Set the thickness for the details border.
|
||||
|
||||
*--button-border-size* <size>
|
||||
Set the thickness for the button border.
|
||||
|
||||
*--button-gap* <gap>
|
||||
Set the size of the gap between buttons.
|
||||
|
||||
*--button-dismiss-gap* <gap>
|
||||
Set the size of the gap between the dismiss button and another button.
|
||||
|
||||
*--button-margin-right* <margin>
|
||||
Set the margin from the right of the dismiss button to edge.
|
||||
|
||||
*--button-padding* <padding>
|
||||
Set the padding for the button text.
|
||||
|
||||
# EXAMPLE
|
||||
|
||||
This is a simple example of a _labnag_ logout GUI.
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
# logout with labnag
|
||||
|
||||
labnag \\
|
||||
-f "Hack Regular 10"\\
|
||||
-m "Choose your logout option"\\
|
||||
-Z " Lock " "gtklock -d"\\
|
||||
-Z " Logout " "labwc -e"\\
|
||||
-Z "Shutdown " "systemctl poweroff"\\
|
||||
-Z " Reboot " "systemctl reboot"\\
|
||||
-Z "Hibernate" "systemctl hibernate"\\
|
||||
-Z " Suspend " "systemctl suspend"\\
|
||||
-Z " Cancel "\\
|
||||
--background-color 00ffff\\
|
||||
--button-background-color 00ffff\\
|
||||
--button-border-color 00ccccaa\\
|
||||
--text-color 000000\\
|
||||
--button-text-color 000000\\
|
||||
--button-gap 8\\
|
||||
--button-margin-right 0\\
|
||||
--button-padding 5\\
|
||||
--button-border-size 2\\
|
||||
-t 60
|
||||
```
|
||||
|
||||
|
|
@ -92,10 +92,18 @@ Actions are used in menus and keyboard/mouse bindings.
|
|||
Move window relative to its current position. Positive value of x moves
|
||||
it right, negative left. Positive value of y moves it down, negative up.
|
||||
|
||||
*<action name="ToggleSnapToEdge" direction="value" />*++
|
||||
*<action name="SnapToEdge" direction="value" />*
|
||||
Resize window to fill half the output in the given direction. Supports
|
||||
directions "left", "up", "right", "down" and "center".
|
||||
*<action name="ToggleSnapToEdge" direction="value" combine="value" />*++
|
||||
*<action name="SnapToEdge" direction="value" combine="value" />*
|
||||
Resize window to fill half or quarter the output in the given direction.
|
||||
|
||||
*direction* [up|down|left|right|up-left|up-right|down-left|down-right|center]
|
||||
Direction in which to snap the window.
|
||||
|
||||
*combine* [yes|no]
|
||||
Allows to snap a window to an output corner by combining two
|
||||
directions. For example, snapping a window to *right* and then
|
||||
to *up* places it in the *up-right* quarter of the output.
|
||||
Default is no.
|
||||
|
||||
ToggleSnapToEdge additionally toggles the active window between
|
||||
tiled to the given direction and its untiled position.
|
||||
|
|
@ -227,10 +235,10 @@ Actions are used in menus and keyboard/mouse bindings.
|
|||
window.
|
||||
|
||||
*<action name="ToggleKeybinds" />*
|
||||
Stop handling keybinds other than ToggleKeybinds itself.
|
||||
This can be used to allow A-Tab and similar keybinds to be delivered
|
||||
to Virtual Machines, VNC clients or nested compositors.
|
||||
A second call will restore all original keybinds.
|
||||
Stop handling keybinds/mousebinds other than ToggleKeybinds itself.
|
||||
This can be used to allow A-Tab and similar keybinds/mousebinds to be
|
||||
delivered to Virtual Machines, VNC clients or nested compositors.
|
||||
A second call will restore all original keybinds/mousebinds.
|
||||
|
||||
This action will only affect the window that had keyboard focus when
|
||||
the binding was executed. Thus when switching to another window, all
|
||||
|
|
@ -277,7 +285,7 @@ Actions are used in menus and keyboard/mouse bindings.
|
|||
Resizes active window size to width and height of the output when the
|
||||
window size exceeds the output size.
|
||||
|
||||
*<action name="GoToDesktop" to="value" wrap="yes" />*
|
||||
*<action name="GoToDesktop" to="value" wrap="yes" toggle="no" />*
|
||||
Switch to workspace.
|
||||
|
||||
*to* The workspace to switch to. Supported values are "current", "last",
|
||||
|
|
@ -287,6 +295,9 @@ Actions are used in menus and keyboard/mouse bindings.
|
|||
*wrap* [yes|no] Wrap around from last desktop to first, and vice
|
||||
versa. Default yes.
|
||||
|
||||
*toggle* [yes|no] Toggle to “last” if already on the workspace that
|
||||
would be the actual destination. Default no.
|
||||
|
||||
*<action name="SendToDesktop" to="value" follow="yes" wrap="yes" />*
|
||||
Send active window to workspace.
|
||||
|
||||
|
|
@ -422,6 +433,7 @@ Actions that execute other actions. Used in keyboard/mouse bindings.
|
|||
```
|
||||
<action name="If">
|
||||
<query/>
|
||||
<prompt message=""/>
|
||||
<then><action/></then>
|
||||
<else><action/></else>
|
||||
</action>
|
||||
|
|
@ -474,7 +486,7 @@ Actions that execute other actions. Used in keyboard/mouse bindings.
|
|||
The "left" , "right", "left-occupied" and
|
||||
"right-occupied" directions will not wrap.
|
||||
|
||||
*tiled* [up|right|down|left|center]
|
||||
*tiled* [up|right|down|left|up-left|up-right|down-left|down-right|center|any]
|
||||
Whether the client is tiled (snapped) along the the
|
||||
indicated screen edge.
|
||||
|
||||
|
|
@ -493,6 +505,26 @@ Actions that execute other actions. Used in keyboard/mouse bindings.
|
|||
|
||||
This argument is optional.
|
||||
|
||||
*prompt*
|
||||
Display a yes/no prompt dialog (labnag by default). If 'yes' is
|
||||
selected, the *then* branch will be taken; and similarly with
|
||||
'no' and *else*. This argument is optional. Note that the syntax
|
||||
is different to that of Openbox where a prompt element is not
|
||||
tied to If-actions but would just be a child of the downstream
|
||||
action. The reason for this difference is increased flexibility
|
||||
and functionality gained by optionally using an *else* branch.
|
||||
|
||||
```
|
||||
<keybind key="W-q">
|
||||
<action name="If">
|
||||
<prompt message="Quit?"/>
|
||||
<then>
|
||||
<action name="Exit"/>
|
||||
</then>
|
||||
</action>
|
||||
</keybind>
|
||||
```
|
||||
|
||||
*then*
|
||||
A list of actions to be executed if the window matches any
|
||||
query. This argument is optional.
|
||||
|
|
|
|||
|
|
@ -178,6 +178,7 @@ this is for compatibility with Openbox.
|
|||
<reuseOutputMode>no</reuseOutputMode>
|
||||
<xwaylandPersistence>no</xwaylandPersistence>
|
||||
<primarySelection>yes</primarySelection>
|
||||
<promptCommand>[see details below]</promptCommand>
|
||||
</core>
|
||||
```
|
||||
|
||||
|
|
@ -216,12 +217,29 @@ this is for compatibility with Openbox.
|
|||
|
||||
*<core><autoEnableOutputs>* [yes|no]
|
||||
Automatically enable outputs at startup and when new outputs are
|
||||
connected. Default is yes.
|
||||
connected. This option applies only to drm outputs. Default is yes.
|
||||
|
||||
Caution: Disabling this option will make the labwc session unusable
|
||||
unless an external tool such as `wlr-randr` or `kanshi` is used to
|
||||
manage outputs.
|
||||
|
||||
The reason for the existance of this option is that after losing signal
|
||||
from the PC (e.g. by `wlopm -off`), some monitors do an input detection
|
||||
that makes it appear (from the PC side) to disconnect and reconnect a
|
||||
few seconds later, causing the monitor to turn back on again (as labwc
|
||||
auto-enables newly connected outputs by default).
|
||||
|
||||
An example usage pattern to avoid the above behavior looks as follows:
|
||||
- Set *<core><autoEnableOutputs>* to *no*
|
||||
- Run kanshi (e.g. from autostart) and rely on it to enable new outputs
|
||||
- Have swayidle kill and restart kanshi when entering powersave as
|
||||
follows:
|
||||
|
||||
```
|
||||
swayidle -w timeout 600 \\
|
||||
'pkill kanshi ; wlopm --off \*' resume 'kanshi & wlopm --on \*'
|
||||
```
|
||||
|
||||
*<core><reuseOutputMode>* [yes|no]
|
||||
Try to re-use the existing output mode (resolution / refresh rate).
|
||||
This may prevent unnecessary screenblank delays when starting labwc
|
||||
|
|
@ -242,6 +260,55 @@ this is for compatibility with Openbox.
|
|||
up/down) in Chromium and electron based clients without inadvertantly
|
||||
pasting the primary clipboard. Default is yes.
|
||||
|
||||
*<core><promptCommand>*
|
||||
Set command to be invoked for an action prompt (*<action><prompt>*)
|
||||
|
||||
The following conversion specifiers are supported:
|
||||
- *%m*: the *<prompt>* message option
|
||||
- *%n*: "No" (in local language if translation is available)
|
||||
- *%y*: "Yes" (in local language if translation is available)
|
||||
- *%b*: osd.bg.color
|
||||
- *%t*: osd.label.text.color
|
||||
|
||||
The default prompt command is:
|
||||
|
||||
```
|
||||
labnag \\
|
||||
--message '%m' \\
|
||||
--button-dismiss '%n' \\
|
||||
--button-dismiss '%y' \\
|
||||
--background-color '%b' \\
|
||||
--text-color '%t' \\
|
||||
--button-border-color '%t' \\
|
||||
--border-bottom-color '%t' \\
|
||||
--button-background-color '%b' \\
|
||||
--button-text-color '%t' \\
|
||||
--border-bottom-size 1 \\
|
||||
--button-border-size 3 \\
|
||||
--keyboard-focus on-demand \\
|
||||
--layer overlay \\
|
||||
--timeout 0
|
||||
```
|
||||
|
||||
Example 1: The prompt can be configured to use a different dialog client
|
||||
|
||||
```
|
||||
<core>
|
||||
<promptCommand>zenity --question --text="%m"</promptCommand>
|
||||
</core>
|
||||
```
|
||||
|
||||
Example 2: A more complex zenity command could be used:
|
||||
|
||||
```
|
||||
zenity \\
|
||||
--question \\
|
||||
--title="" \\
|
||||
--text="%m" \\
|
||||
--ok-label="%y" \\
|
||||
--cancel-label="%n"
|
||||
```
|
||||
|
||||
## PLACEMENT
|
||||
|
||||
```
|
||||
|
|
@ -272,7 +339,7 @@ this is for compatibility with Openbox.
|
|||
## WINDOW SWITCHER
|
||||
|
||||
```
|
||||
<windowSwitcher show="yes" preview="yes" outlines="yes" allWorkspaces="no">
|
||||
<windowSwitcher show="yes" style="classic" preview="yes" outlines="yes" allWorkspaces="no">
|
||||
<fields>
|
||||
<field content="icon" width="5%" />
|
||||
<field content="desktop_entry_name" width="30%" />
|
||||
|
|
@ -281,10 +348,14 @@ this is for compatibility with Openbox.
|
|||
</windowSwitcher>
|
||||
```
|
||||
|
||||
*<windowSwitcher show="" preview="" outlines="" allWorkspaces="">*
|
||||
*<windowSwitcher show="" style="" preview="" outlines="" allWorkspaces="" unshade="">*
|
||||
*show* [yes|no] Draw the OnScreenDisplay when switching between
|
||||
windows. Default is yes.
|
||||
|
||||
*style* [classic|thumbnail] Configures the style of the OnScreenDisplay.
|
||||
"classic" displays window information like icons and titles in a vertical list.
|
||||
"thumbnail" shows window thumbnail, icon and title in grids.
|
||||
|
||||
*preview* [yes|no] Preview the contents of the selected window when
|
||||
switching between windows. Default is yes.
|
||||
|
||||
|
|
@ -295,8 +366,11 @@ this is for compatibility with Openbox.
|
|||
they are on. Default no (that is only windows on the current workspace
|
||||
are shown).
|
||||
|
||||
*unshade* [yes|no] Temporarily unshade windows when switching between
|
||||
them and permanently unshade on the final selection. Default is yes.
|
||||
|
||||
*<windowSwitcher><fields><field content="" width="%">*
|
||||
Define window switcher fields.
|
||||
Define window switcher fields when using *<windowSwitcher style="classic" />*.
|
||||
|
||||
*content* defines what the field shows and can be any of:
|
||||
|
||||
|
|
@ -328,9 +402,9 @@ this is for compatibility with Openbox.
|
|||
fields are:
|
||||
- 'B' - shell type, values [xwayland|xdg-shell]
|
||||
- 'b' - shell type (short form), values [X|W]
|
||||
- 'S' - state of window, values [M|m|F] (3 spaces allocated)
|
||||
(maximized, minimized, fullscreen)
|
||||
- 's' - state of window (short form), values [M|m|F] (1 space)
|
||||
- 'S' - state of window, values [m|s|M|F] (4 spaces allocated)
|
||||
(minimized, shaded, maximized, fullscreen)
|
||||
- 's' - state of window (short form), values [m|s|M|F] (1 space)
|
||||
- 'I' - wm-class/app-id
|
||||
- 'i' - wm-class/app-id trimmed, remove "org." if available
|
||||
- 'n' - desktop entry/file application name, falls back to
|
||||
|
|
@ -412,11 +486,13 @@ activated with SnapToEdge actions or, optionally, by dragging windows to the
|
|||
edges of an output. Edge snapping causes a window to occupy half of its output,
|
||||
extending outward from the snapped edge.
|
||||
|
||||
*<snapping><range>*
|
||||
If an interactive move ends with the cursor a maximum distance *range*,
|
||||
(in pixels) from the edge of an output, the move will trigger a
|
||||
SnapToEdge action for that edge. A *range* of 0 disables snapping via
|
||||
interactive moves. Default is 10.
|
||||
*<snapping><range>*++
|
||||
*<snapping><cornerRange>*
|
||||
If an interactive move ends with the cursor within *<range>* pixels of an
|
||||
output edge, the window is snapped to the edge. If it's also within
|
||||
*<cornerRange>* pixels of an output corner, the window is snapped to the
|
||||
corner instead. A *<range>* of 0 disables snapping.
|
||||
Default is 10 for *<range>* and 50 for *<cornerRange>*.
|
||||
|
||||
*<snapping><overlay><enabled>* [yes|no]
|
||||
Show an overlay when snapping to a window to an edge. Default is yes.
|
||||
|
|
@ -526,6 +602,11 @@ extending outward from the snapped edge.
|
|||
Even when disabling server side decorations via ToggleDecorations,
|
||||
keep a small border (and resize area) around the window. Default is yes.
|
||||
|
||||
*<theme><maximizedDecoration>* [titlebar|none]
|
||||
Specify how server side decorations are shown for maximized windows.
|
||||
*titlebar* shows titlebar above a maximized window. *none* shows no server
|
||||
side decorations around a maximized window. Default is titlebar.
|
||||
|
||||
*<theme><dropShadows>* [yes|no]
|
||||
Should drop-shadows be rendered behind windows. Default is no.
|
||||
|
||||
|
|
@ -698,7 +779,7 @@ extending outward from the snapped edge.
|
|||
W-Return - lab-sensible-terminal
|
||||
A-F4 - close window
|
||||
W-a - toggle maximize
|
||||
W-<arrow> - resize window to fill half the output
|
||||
W-<arrow> - resize window to fill half or quarter of the output
|
||||
A-Space - show window menu
|
||||
```
|
||||
|
||||
|
|
@ -735,6 +816,7 @@ extending outward from the snapped edge.
|
|||
- AllDesktops: A button that, by default, toggles omnipresence of a
|
||||
window.
|
||||
- Close: A button that, by default, closses a window.
|
||||
- Border: The window's border including Top...BRCorner below.
|
||||
- Top: The top edge of the window's border.
|
||||
- Bottom: The bottom edge of the window's border.
|
||||
- Left: The left edge of the window's border.
|
||||
|
|
|
|||
|
|
@ -303,32 +303,79 @@ all are supported.
|
|||
Text color of on-screen-display. Inherits
|
||||
*window.active.label.text.color* if not set.
|
||||
|
||||
*osd.window-switcher.width*
|
||||
Width of window switcher in pixels. Default is 600.
|
||||
Width can also be percent of the width of the monitor.
|
||||
% is mandatory as last character in this case, max 100%
|
||||
*osd.window-switcher.style-classic*
|
||||
Theme for window switcher when using <windowSwitcher style="classic" />.
|
||||
See below for details.
|
||||
|
||||
*osd.window-switcher.padding*
|
||||
*osd.window-switcher.style-classic.width*
|
||||
Width of window switcher in pixels. Width can also be a percentage of the
|
||||
monitor width by adding '%' as suffix (e.g. 70%). Default is 600.
|
||||
|
||||
*osd.window-switcher.style-classic.padding*
|
||||
Padding of window switcher in pixels. This is the space between the
|
||||
window-switcher border and its items. Default is 4.
|
||||
|
||||
*osd.window-switcher.item.padding.x*
|
||||
*osd.window-switcher.style-classic.item.padding.x*
|
||||
Horizontal padding of window switcher entries in pixels.
|
||||
Default is 10.
|
||||
|
||||
*osd.window-switcher.item.padding.y*
|
||||
*osd.window-switcher.style-classic.item.padding.y*
|
||||
Vertical padding of window switcher entries in pixels.
|
||||
Default is 1.
|
||||
|
||||
*osd.window-switcher.item.active.border.width*
|
||||
*osd.window-switcher.style-classic.item.active.border.width*
|
||||
Border width of the selection box in the window switcher in pixels.
|
||||
Default is 2.
|
||||
|
||||
*osd.window-switcher.item.icon.size*
|
||||
*osd.window-switcher.style-classic.item.active.border.color*
|
||||
Border color around the selected window switcher item.
|
||||
Default is *osd.label.text.color* with 50% opacity.
|
||||
|
||||
*osd.window-switcher.style-classic.item.active.bg.color*
|
||||
Background color of the selected window switcher item.
|
||||
Default is *osd.label.text.color* with 15% opacity.
|
||||
|
||||
*osd.window-switcher.style-classic.item.icon.size*
|
||||
Size of the icon in window switcher, in pixels.
|
||||
If not set, the font size derived from <theme><font place="OnScreenDisplay">
|
||||
is used.
|
||||
|
||||
*osd.window-switcher.style-thumbnail*
|
||||
Theme for window switcher when using <windowSwitcher style="thumbnail" />.
|
||||
See below for details.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.width.max*
|
||||
Maximum width of window switcher in pixels. Width can also be a percentage of
|
||||
the monitor width by adding '%' as suffix (e.g. 70%). Default is 80%.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.padding*
|
||||
Padding of window switcher in pixels. This is the space between the
|
||||
window-switcher border and its items. Default is 4.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.item.width*
|
||||
Width of window switcher items in pixels. Default is 300.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.item.height*
|
||||
Height of window switcher items in pixels. Default is 250.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.item.padding*
|
||||
Padding of window switcher items in pixels. This is the space between the
|
||||
border around selected items and window thumbnail. Default is 2.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.item.active.border.width*
|
||||
Border width of selected window switcher items in pixels. Default is 2.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.item.active.border.color*
|
||||
Color of border around selected window switcher items.
|
||||
Default is *osd.label.text.color* with 50% opacity.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.item.active.bg.color*
|
||||
Color of selected window switcher items.
|
||||
Default is *osd.label.text.color* with 15% opacity.
|
||||
|
||||
*osd.window-switcher.style-thumbnail.item.icon.size*
|
||||
Size of window icons in window switcher items in pixels. Default is 60.
|
||||
|
||||
*osd.window-switcher.preview.border.width*
|
||||
Border width of the outlines shown as the preview of the window selected
|
||||
by window switcher. Inherits *osd.border.width* if not set.
|
||||
|
|
|
|||
|
|
@ -134,8 +134,7 @@ example: *LABWC_DEBUG_FOO=1 labwc*.
|
|||
Increase logging of paths for config files (for example rc.xml,
|
||||
autostart, environment and menu.xml) as well as titlebar buttons.
|
||||
|
||||
*LABWC_DEBUG_CONFIG_NODENAMES*++
|
||||
*LABWC_DEBUG_MENU_NODENAMES*
|
||||
*LABWC_DEBUG_CONFIG_NODENAMES*
|
||||
Enable logging of all nodenames (for example *policy.placement: Cascade*
|
||||
for *<placement><policy>Cascade</policy></placement>*) for config and
|
||||
menu files respectively.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<openbox_menu>
|
||||
<!-- Note: for localization support of menu items "client-menu" has to be removed here -->
|
||||
<menu id="client-menu">
|
||||
|
|
@ -25,18 +23,7 @@
|
|||
Any menu with the id "workspaces" will be hidden
|
||||
if there is only a single workspace available.
|
||||
-->
|
||||
<menu id="workspaces" label="Workspace">
|
||||
<item label="Move Left">
|
||||
<action name="SendToDesktop" to="left" />
|
||||
</item>
|
||||
<item label="Move Right">
|
||||
<action name="SendToDesktop" to="right" />
|
||||
</item>
|
||||
<separator />
|
||||
<item label="Always on Visible Workspace">
|
||||
<action name="ToggleOmnipresent" />
|
||||
</item>
|
||||
</menu>
|
||||
<menu id="client-send-to-menu"/>
|
||||
<!--
|
||||
openbox default workspace selector
|
||||
to use replace above workspace menu with the example below
|
||||
|
|
@ -65,6 +52,17 @@
|
|||
<item label="Exit">
|
||||
<action name="Exit" />
|
||||
</item>
|
||||
<!--
|
||||
# A prompt can be used as follows:
|
||||
<item label="Exit">
|
||||
<action name="If">
|
||||
<prompt message="Do you really want to exit the compositor?"/>
|
||||
<then>
|
||||
<action name="Exit"/>
|
||||
</then>
|
||||
</action>
|
||||
</item>
|
||||
-->
|
||||
</menu>
|
||||
|
||||
<menu id="some-custom-menu">
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
scdoc = find_program('scdoc', required: get_option('man-pages'))
|
||||
|
||||
if scdoc.found()
|
||||
sections = [
|
||||
'.1',
|
||||
'-actions.5',
|
||||
'-config.5',
|
||||
'-menu.5',
|
||||
'-theme.5',
|
||||
manpages = [
|
||||
'labwc.1',
|
||||
'labwc-actions.5',
|
||||
'labwc-config.5',
|
||||
'labwc-menu.5',
|
||||
'labwc-theme.5',
|
||||
'labnag.1',
|
||||
]
|
||||
foreach s : sections
|
||||
markdown = 'labwc' + s + '.scd'
|
||||
manpage = 'labwc' + s
|
||||
foreach manpage : manpages
|
||||
markdown = manpage + '.scd'
|
||||
custom_target(
|
||||
manpage,
|
||||
input: markdown,
|
||||
|
|
@ -19,7 +19,7 @@ if scdoc.found()
|
|||
feed: true,
|
||||
capture: true,
|
||||
install: true,
|
||||
install_dir: join_paths(get_option('mandir'), 'man' + s.split('.')[-1])
|
||||
install_dir: join_paths(get_option('mandir'), 'man' + manpage.split('.')[-1])
|
||||
)
|
||||
endforeach
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<!--
|
||||
This is a very simple config file with many options missing. For a complete
|
||||
set of options with comments, see docs/rc.xml.all
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<!--
|
||||
This file contains all supported config elements & attributes with
|
||||
default values.
|
||||
|
||||
Values for [yes|no] can be replaced by [true|false], [on|off] or [1|0].
|
||||
-->
|
||||
|
||||
<labwc_config>
|
||||
|
|
@ -16,6 +16,10 @@
|
|||
<reuseOutputMode>no</reuseOutputMode>
|
||||
<xwaylandPersistence>no</xwaylandPersistence>
|
||||
<primarySelection>yes</primarySelection>
|
||||
<!--
|
||||
# See labwc-config(5) for details
|
||||
<promptCommand></promptCommand>
|
||||
-->
|
||||
</core>
|
||||
|
||||
<placement>
|
||||
|
|
@ -38,6 +42,7 @@
|
|||
</titlebar>
|
||||
<cornerRadius>8</cornerRadius>
|
||||
<keepBorder>yes</keepBorder>
|
||||
<maximizedDecoration>titlebar</maximizedDecoration>
|
||||
<dropShadows>no</dropShadows>
|
||||
<dropShadowsOnTiled>no</dropShadowsOnTiled>
|
||||
<font place="ActiveWindow">
|
||||
|
|
@ -72,7 +77,8 @@
|
|||
</font>
|
||||
</theme>
|
||||
|
||||
<windowSwitcher show="yes" preview="yes" outlines="yes" allWorkspaces="no">
|
||||
<windowSwitcher show="yes" style="classic" preview="yes"
|
||||
outlines="yes" allWorkspaces="no" unshade="yes">
|
||||
<fields>
|
||||
<field content="icon" width="5%" />
|
||||
<field content="desktop_entry_name" width="30%" />
|
||||
|
|
@ -155,6 +161,7 @@
|
|||
<snapping>
|
||||
<!-- Set range to 0 to disable window snapping completely -->
|
||||
<range>10</range>
|
||||
<cornerRange>50</cornerRange>
|
||||
<overlay enabled="yes">
|
||||
<delay inner="500" outer="500" />
|
||||
</overlay>
|
||||
|
|
@ -267,16 +274,16 @@
|
|||
<action name="ToggleMaximize" />
|
||||
</keybind>
|
||||
<keybind key="W-Left">
|
||||
<action name="SnapToEdge" direction="left" />
|
||||
<action name="SnapToEdge" direction="left" combine="yes" />
|
||||
</keybind>
|
||||
<keybind key="W-Right">
|
||||
<action name="SnapToEdge" direction="right" />
|
||||
<action name="SnapToEdge" direction="right" combine="yes" />
|
||||
</keybind>
|
||||
<keybind key="W-Up">
|
||||
<action name="SnapToEdge" direction="up" />
|
||||
<action name="SnapToEdge" direction="up" combine="yes" />
|
||||
</keybind>
|
||||
<keybind key="W-Down">
|
||||
<action name="SnapToEdge" direction="down" />
|
||||
<action name="SnapToEdge" direction="down" combine="yes" />
|
||||
</keybind>
|
||||
<keybind key="A-Space">
|
||||
<action name="ShowMenu" menu="client-menu" atCursor="no" />
|
||||
|
|
@ -371,42 +378,11 @@
|
|||
</mousebind>
|
||||
</context>
|
||||
|
||||
<context name="Top">
|
||||
<mousebind button="Left" action="Drag">
|
||||
<action name="Resize" />
|
||||
<context name="Border">
|
||||
<mousebind button="Left" action="Press">
|
||||
<action name="Focus" />
|
||||
<action name="Raise" />
|
||||
</mousebind>
|
||||
</context>
|
||||
<context name="Left">
|
||||
<mousebind button="Left" action="Drag">
|
||||
<action name="Resize" />
|
||||
</mousebind>
|
||||
</context>
|
||||
<context name="Right">
|
||||
<mousebind button="Left" action="Drag">
|
||||
<action name="Resize" />
|
||||
</mousebind>
|
||||
</context>
|
||||
<context name="Bottom">
|
||||
<mousebind button="Left" action="Drag">
|
||||
<action name="Resize" />
|
||||
</mousebind>
|
||||
</context>
|
||||
<context name="TRCorner">
|
||||
<mousebind button="Left" action="Drag">
|
||||
<action name="Resize" />
|
||||
</mousebind>
|
||||
</context>
|
||||
<context name="BRCorner">
|
||||
<mousebind button="Left" action="Drag">
|
||||
<action name="Resize" />
|
||||
</mousebind>
|
||||
</context>
|
||||
<context name="TLCorner">
|
||||
<mousebind button="Left" action="Drag">
|
||||
<action name="Resize" />
|
||||
</mousebind>
|
||||
</context>
|
||||
<context name="BLCorner">
|
||||
<mousebind button="Left" action="Drag">
|
||||
<action name="Resize" />
|
||||
</mousebind>
|
||||
|
|
@ -608,7 +584,13 @@
|
|||
- sendEventsMode [yes|no|disabledOnExternalMouse]
|
||||
- calibrationMatrix [six float values split by space]
|
||||
- scrollFactor [float]
|
||||
|
||||
The following <libinput>...</libinput> block may not be complete for
|
||||
your requirements. Default values are device specific. Only set an option
|
||||
if you require to override the default. Valid values must be inserted.
|
||||
|
||||
-->
|
||||
|
||||
<libinput>
|
||||
<device category="default">
|
||||
<naturalScroll></naturalScroll>
|
||||
|
|
|
|||
25
docs/themerc
25
docs/themerc
|
|
@ -91,14 +91,27 @@ osd.label.text.color: #000000
|
|||
|
||||
# width can be set as percent (of screen width)
|
||||
# example 50% or 75% instead of 600, max 100%
|
||||
osd.window-switcher.width: 600
|
||||
osd.window-switcher.style-classic.width: 600
|
||||
|
||||
osd.window-switcher.padding: 4
|
||||
osd.window-switcher.item.padding.x: 10
|
||||
osd.window-switcher.item.padding.y: 1
|
||||
osd.window-switcher.item.active.border.width: 2
|
||||
osd.window-switcher.style-classic.padding: 4
|
||||
osd.window-switcher.style-classic.item.padding.x: 10
|
||||
osd.window-switcher.style-classic.item.padding.y: 1
|
||||
osd.window-switcher.style-classic.item.active.border.width: 2
|
||||
osd.window-switcher.style-classic.item.active.border.color: #706f6d
|
||||
osd.window-switcher.style-classic.item.active.bg.color: #bfbcba
|
||||
# The icon size the same as the font size by default
|
||||
# osd.window-switcher.item.icon.size: 50
|
||||
# osd.window-switcher.style-classic.item.icon.size: 50
|
||||
|
||||
osd.window-switcher.style-thumbnail.width.max: 80%
|
||||
osd.window-switcher.style-thumbnail.padding: 4
|
||||
osd.window-switcher.style-thumbnail.item.width: 300
|
||||
osd.window-switcher.style-thumbnail.item.height: 250
|
||||
osd.window-switcher.style-thumbnail.item.padding: 10
|
||||
osd.window-switcher.style-thumbnail.item.active.border.width: 2
|
||||
osd.window-switcher.style-thumbnail.item.active.border.color: #706f6d
|
||||
osd.window-switcher.style-thumbnail.item.active.bg.color: #bfbcba
|
||||
osd.window-switcher.style-thumbnail.item.icon.size: 60
|
||||
|
||||
osd.window-switcher.preview.border.width: 1
|
||||
osd.window-switcher.preview.border.color: #dddda6,#000000,#dddda6
|
||||
|
||||
|
|
|
|||
9
include/action-prompt-codes.h
Normal file
9
include/action-prompt-codes.h
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_ACTION_PROMPT_CODES_H
|
||||
#define LABWC_ACTION_PROMPT_CODES_H
|
||||
|
||||
#define LAB_EXIT_FAILURE 255
|
||||
#define LAB_EXIT_CANCELLED 254
|
||||
#define LAB_EXIT_SUCCESS 0
|
||||
|
||||
#endif /* LABWC_ACTION_PROMPT_CODES_H */
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
#define LABWC_ACTION_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <sys/types.h>
|
||||
#include <wayland-util.h>
|
||||
|
||||
struct view;
|
||||
|
|
@ -22,6 +23,8 @@ struct action {
|
|||
|
||||
struct action *action_create(const char *action_name);
|
||||
|
||||
const char *action_get_str(struct action *action, const char *key,
|
||||
const char *default_value);
|
||||
bool action_is_valid(struct action *action);
|
||||
bool action_is_show_menu(struct action *action);
|
||||
|
||||
|
|
@ -47,6 +50,9 @@ bool actions_contain_toggle_keybinds(struct wl_list *action_list);
|
|||
void actions_run(struct view *activator, struct server *server,
|
||||
struct wl_list *actions, struct cursor_context *ctx);
|
||||
|
||||
void action_prompts_destroy(void);
|
||||
bool action_check_prompt_result(pid_t pid, int exit_code);
|
||||
|
||||
void action_free(struct action *action);
|
||||
void action_list_free(struct wl_list *action_list);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_ARRAY_H
|
||||
#define LABWC_ARRAY_H
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <wayland-server-core.h>
|
||||
#include "common/mem.h"
|
||||
|
||||
/*
|
||||
* Wayland's wl_array API is a bit sparse consisting only of
|
||||
|
|
@ -66,10 +66,7 @@ wl_array_len(struct wl_array *array)
|
|||
#define array_add(_arr, _val) do { \
|
||||
__typeof__(_val) *_entry = wl_array_add( \
|
||||
(_arr), sizeof(__typeof__(_val))); \
|
||||
if (!_entry) { \
|
||||
perror("Failed to allocate memory"); \
|
||||
exit(EXIT_FAILURE); \
|
||||
} \
|
||||
die_if_null(_entry); \
|
||||
*_entry = (_val); \
|
||||
} while (0)
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ void box_union(struct wlr_box *box_dest, struct wlr_box *box_a,
|
|||
* The returned x & y coordinates are the centered content position
|
||||
* relative to the top-left corner of the bounding box.
|
||||
*/
|
||||
struct wlr_box box_fit_within(int width, int height, struct wlr_box *bounding_box);
|
||||
struct wlr_box box_fit_within(int width, int height, struct wlr_box *bound);
|
||||
|
||||
struct wlr_fbox box_to_fbox(struct wlr_box *box);
|
||||
|
||||
|
|
|
|||
|
|
@ -50,6 +50,17 @@ void buf_expand_shell_variables(struct buf *s);
|
|||
*/
|
||||
void buf_add_fmt(struct buf *s, const char *fmt, ...);
|
||||
|
||||
/**
|
||||
* buf_add_hex_color - add rgb color as hex string to C string buffer
|
||||
* @s: buffer
|
||||
* @color: rgb color to be added
|
||||
*
|
||||
* For example:
|
||||
* - With the input 'red' (defined as red[4] = { 1.0f, 0.0f, 0.0f, 1.0f}) the
|
||||
* string "#ff0000ff" will be written to the buffer.
|
||||
*/
|
||||
void buf_add_hex_color(struct buf *s, float color[4]);
|
||||
|
||||
/**
|
||||
* buf_add - add data to C string buffer
|
||||
* @s: buffer
|
||||
|
|
@ -60,9 +71,9 @@ void buf_add(struct buf *s, const char *data);
|
|||
/**
|
||||
* buf_add_char - add single char to C string buffer
|
||||
* @s: buffer
|
||||
* @data: char to be added
|
||||
* @ch: char to be added
|
||||
*/
|
||||
void buf_add_char(struct buf *s, char data);
|
||||
void buf_add_char(struct buf *s, char ch);
|
||||
|
||||
/**
|
||||
* buf_clear - clear the buffer, internal allocations are preserved
|
||||
|
|
@ -98,4 +109,11 @@ void buf_reset(struct buf *s);
|
|||
*/
|
||||
void buf_move(struct buf *dst, struct buf *src);
|
||||
|
||||
/**
|
||||
* buf_from_file - read file into memory buffer
|
||||
* @filename: file to read
|
||||
* Free returned buffer with buf_reset().
|
||||
*/
|
||||
struct buf buf_from_file(const char *filename);
|
||||
|
||||
#endif /* LABWC_BUF_H */
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_DIRECTION_H
|
||||
#define LABWC_DIRECTION_H
|
||||
|
||||
#include "view.h"
|
||||
|
||||
enum wlr_direction direction_from_view_edge(enum view_edge edge);
|
||||
enum wlr_direction direction_get_opposite(enum wlr_direction direction);
|
||||
|
||||
#endif /* LABWC_DIRECTION_H */
|
||||
81
include/common/edge.h
Normal file
81
include/common/edge.h
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_EDGE_H
|
||||
#define LABWC_EDGE_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
/**
|
||||
* Unified/overloaded enum representing edges, corners, and directions.
|
||||
* Used in many different contexts (moving, resizing, tiling) and with
|
||||
* somewhat different semantics depending on context.
|
||||
*
|
||||
* Examples:
|
||||
* - LAB_EDGE_TOP can also mean "up" or "north".
|
||||
* - LAB_EDGES_TOP_LEFT can mean "top left corner" or "northwest".
|
||||
*
|
||||
* The enum is designed to be used as a bitset, and combinations of
|
||||
* edges typically mean what you'd expect from the context. For example,
|
||||
* LAB_EDGES_TOP_LEFT is used when resizing a view from its top-left
|
||||
* corner, or when tiling a view in the top-left corner of an output.
|
||||
*
|
||||
* All 16 possible combinations of TOP/BOTTOM/LEFT/RIGHT are listed for
|
||||
* completeness. Not all combinations make sense in all contexts.
|
||||
*
|
||||
* LAB_EDGE_NONE is sometimes used to mean "invalid".
|
||||
*
|
||||
* LAB_EDGE_ANY means "any edge or combination of edges (except NONE)"
|
||||
* and is distinct from LAB_EDGE_ALL (which means all 4 edges).
|
||||
*
|
||||
* LAB_EDGE_TOP/BOTTOM/LEFT/RIGHT match the corresponding values of
|
||||
* enum wlr_edges and enum wlr_direction, so that conversion between
|
||||
* enums can be done with a simple cast.
|
||||
*/
|
||||
enum lab_edge {
|
||||
LAB_EDGE_NONE = 0,
|
||||
|
||||
LAB_EDGE_TOP = (1 << 0), /* or UP */
|
||||
LAB_EDGE_BOTTOM = (1 << 1), /* or DOWN */
|
||||
LAB_EDGE_LEFT = (1 << 2),
|
||||
LAB_EDGE_RIGHT = (1 << 3),
|
||||
LAB_EDGE_CENTER = (1 << 4), /* for window tiling */
|
||||
LAB_EDGE_ANY = (1 << 5), /* for window rules */
|
||||
|
||||
/* corners or ordinal directions (NW/NE/SW/SE) */
|
||||
LAB_EDGES_TOP_LEFT = (LAB_EDGE_TOP | LAB_EDGE_LEFT),
|
||||
LAB_EDGES_TOP_RIGHT = (LAB_EDGE_TOP | LAB_EDGE_RIGHT),
|
||||
LAB_EDGES_BOTTOM_LEFT = (LAB_EDGE_BOTTOM | LAB_EDGE_LEFT),
|
||||
LAB_EDGES_BOTTOM_RIGHT = (LAB_EDGE_BOTTOM | LAB_EDGE_RIGHT),
|
||||
|
||||
/* opposite edges */
|
||||
LAB_EDGES_TOP_BOTTOM = (LAB_EDGE_TOP | LAB_EDGE_BOTTOM),
|
||||
LAB_EDGES_LEFT_RIGHT = (LAB_EDGE_LEFT | LAB_EDGE_RIGHT),
|
||||
|
||||
/* all 4 edges */
|
||||
LAB_EDGES_ALL = (LAB_EDGE_TOP | LAB_EDGE_BOTTOM |
|
||||
LAB_EDGE_LEFT | LAB_EDGE_RIGHT),
|
||||
|
||||
/* 3-edge combinations (for completeness) */
|
||||
LAB_EDGES_EXCEPT_TOP = (LAB_EDGES_ALL ^ LAB_EDGE_TOP),
|
||||
LAB_EDGES_EXCEPT_BOTTOM = (LAB_EDGES_ALL ^ LAB_EDGE_BOTTOM),
|
||||
LAB_EDGES_EXCEPT_LEFT = (LAB_EDGES_ALL ^ LAB_EDGE_LEFT),
|
||||
LAB_EDGES_EXCEPT_RIGHT = (LAB_EDGES_ALL ^ LAB_EDGE_RIGHT),
|
||||
};
|
||||
|
||||
enum lab_edge lab_edge_parse(const char *direction, bool tiled, bool any);
|
||||
|
||||
/**
|
||||
* Returns true if edge is TOP, BOTTOM, LEFT, or RIGHT
|
||||
* (i.e. one of the four cardinal directions N/S/W/E)
|
||||
*/
|
||||
bool lab_edge_is_cardinal(enum lab_edge edge);
|
||||
|
||||
/**
|
||||
* lab_edge_invert() - select the opposite of a provided edge
|
||||
*
|
||||
* Returns LAB_EDGE_NONE for edges other than TOP/BOTTOM/LEFT/RIGHT.
|
||||
*
|
||||
* @edge: edge to be inverted
|
||||
*/
|
||||
enum lab_edge lab_edge_invert(enum lab_edge edge);
|
||||
|
||||
#endif /* LABWC_EDGE_H */
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Read file into memory
|
||||
*
|
||||
* Copyright Johan Malm 2020
|
||||
*/
|
||||
|
||||
#ifndef LABWC_GRAB_FILE_H
|
||||
#define LABWC_GRAB_FILE_H
|
||||
|
||||
#include "common/buf.h"
|
||||
|
||||
/**
|
||||
* grab_file - read file into memory buffer
|
||||
* @filename: file to read
|
||||
* Free returned buffer with buf_reset().
|
||||
*/
|
||||
struct buf grab_file(const char *filename);
|
||||
|
||||
#endif /* LABWC_GRAB_FILE_H */
|
||||
|
|
@ -2,6 +2,8 @@
|
|||
#ifndef LABWC_GRAPHIC_HELPERS_H
|
||||
#define LABWC_GRAPHIC_HELPERS_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <cairo.h>
|
||||
|
||||
struct wlr_fbox;
|
||||
|
|
|
|||
|
|
@ -4,6 +4,12 @@
|
|||
|
||||
#include <stdlib.h>
|
||||
|
||||
/*
|
||||
* If ptr is NULL, prints an error (based on errno) and exits.
|
||||
* Suitable for checking the return value of malloc() etc.
|
||||
*/
|
||||
void die_if_null(void *ptr);
|
||||
|
||||
/*
|
||||
* As defined in busybox, weston, etc.
|
||||
* Allocates zero-filled memory; calls exit() on error.
|
||||
|
|
|
|||
75
include/common/node-type.h
Normal file
75
include/common/node-type.h
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_NODE_TYPE_H
|
||||
#define LABWC_NODE_TYPE_H
|
||||
|
||||
#include "common/edge.h"
|
||||
|
||||
/*
|
||||
* In labwc, "node type" indicates the role of a wlr_scene_node in the
|
||||
* overall desktop. It also maps more-or-less to the openbox concept of
|
||||
* "context" (as used when defining mouse bindings).
|
||||
*
|
||||
* Some types (BUTTON, BORDER, etc.) refer to groups or categories of
|
||||
* other node types rather than individual nodes. These categories are
|
||||
* defined as ranges (e.g. BUTTON means anything from BUTTON_FIRST to
|
||||
* BUTTON_LAST), therefore order is significant.
|
||||
*
|
||||
* Be sure to keep node_type_contains() in sync with any changes!
|
||||
*/
|
||||
enum lab_node_type {
|
||||
LAB_NODE_NONE = 0,
|
||||
|
||||
LAB_NODE_BUTTON_CLOSE = 1,
|
||||
LAB_NODE_BUTTON_MAXIMIZE,
|
||||
LAB_NODE_BUTTON_ICONIFY,
|
||||
LAB_NODE_BUTTON_WINDOW_ICON,
|
||||
LAB_NODE_BUTTON_WINDOW_MENU,
|
||||
LAB_NODE_BUTTON_SHADE,
|
||||
LAB_NODE_BUTTON_OMNIPRESENT,
|
||||
LAB_NODE_BUTTON_FIRST = LAB_NODE_BUTTON_CLOSE,
|
||||
LAB_NODE_BUTTON_LAST = LAB_NODE_BUTTON_OMNIPRESENT,
|
||||
LAB_NODE_BUTTON,
|
||||
|
||||
LAB_NODE_TITLEBAR,
|
||||
LAB_NODE_TITLE,
|
||||
|
||||
LAB_NODE_CORNER_TOP_LEFT,
|
||||
LAB_NODE_CORNER_TOP_RIGHT,
|
||||
LAB_NODE_CORNER_BOTTOM_RIGHT,
|
||||
LAB_NODE_CORNER_BOTTOM_LEFT,
|
||||
LAB_NODE_BORDER_TOP,
|
||||
LAB_NODE_BORDER_RIGHT,
|
||||
LAB_NODE_BORDER_BOTTOM,
|
||||
LAB_NODE_BORDER_LEFT,
|
||||
LAB_NODE_BORDER,
|
||||
|
||||
LAB_NODE_CLIENT,
|
||||
LAB_NODE_FRAME,
|
||||
LAB_NODE_ROOT,
|
||||
LAB_NODE_MENUITEM,
|
||||
LAB_NODE_OSD,
|
||||
LAB_NODE_LAYER_SURFACE,
|
||||
LAB_NODE_UNMANAGED,
|
||||
LAB_NODE_ALL,
|
||||
|
||||
/* translated to LAB_NODE_CLIENT by get_cursor_context() */
|
||||
LAB_NODE_VIEW,
|
||||
LAB_NODE_XDG_POPUP,
|
||||
LAB_NODE_LAYER_POPUP,
|
||||
LAB_NODE_SESSION_LOCK_SURFACE,
|
||||
LAB_NODE_IME_POPUP,
|
||||
|
||||
/*
|
||||
* translated to LAB_CORNER_* or LAB_BORDER* by
|
||||
* ssd_get_resizing_type()
|
||||
*/
|
||||
LAB_NODE_SSD_ROOT,
|
||||
};
|
||||
|
||||
enum lab_node_type node_type_parse(const char *context);
|
||||
|
||||
bool node_type_contains(enum lab_node_type whole, enum lab_node_type part);
|
||||
|
||||
enum lab_edge node_type_to_edges(enum lab_node_type type);
|
||||
|
||||
#endif /* LABWC_NODE_TYPE_H */
|
||||
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/tree.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/**
|
||||
* nodename - give xml node an ascii name
|
||||
|
|
|
|||
|
|
@ -1,17 +1,18 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_PARSE_BOOL_H
|
||||
#define LABWC_PARSE_BOOL_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "common/three-state.h"
|
||||
#include "config/types.h"
|
||||
|
||||
/**
|
||||
* parse_three_state() - Parse boolean value of string as a three-state enum.
|
||||
* parse_tristate() - Parse boolean value of string as a three-state enum.
|
||||
* @string: String to interpret. This check is case-insensitive.
|
||||
*
|
||||
* Return: LAB_STATE_DISABLED for false; LAB_STATE_ENABLED for true;
|
||||
* LAB_STATE_UNSPECIFIED for non-boolean
|
||||
*/
|
||||
enum three_state parse_three_state(const char *str);
|
||||
enum lab_tristate parse_tristate(const char *str);
|
||||
|
||||
/**
|
||||
* parse_bool() - Parse boolean value of string.
|
||||
|
|
|
|||
|
|
@ -20,6 +20,6 @@ struct wlr_scene_node *lab_wlr_scene_get_prev_node(struct wlr_scene_node *node);
|
|||
|
||||
/* A variant of wlr_scene_output_commit() that respects wlr_output->pending */
|
||||
bool lab_wlr_scene_output_commit(struct wlr_scene_output *scene_output,
|
||||
struct wlr_output_state *output_state);
|
||||
struct wlr_output_state *state);
|
||||
|
||||
#endif /* LABWC_SCENE_HELPERS_H */
|
||||
|
|
|
|||
|
|
@ -10,13 +10,10 @@
|
|||
bool string_null_or_empty(const char *s);
|
||||
|
||||
/**
|
||||
* trim_last_field() - Trim last field of string splitting on provided delim
|
||||
* @buf: string to trim
|
||||
* @delim: delimitator
|
||||
*
|
||||
* Example: With delim='_' and buf="foo_bar_baz" the return value is "foo_bar"
|
||||
* str_space_only - Check if the string only contains white-space characters
|
||||
* @s: string to check
|
||||
*/
|
||||
void trim_last_field(char *buf, char delim);
|
||||
bool str_space_only(const char *s);
|
||||
|
||||
/**
|
||||
* string_strip - strip white space left and right
|
||||
|
|
@ -59,8 +56,7 @@ char *strdup_printf(const char *fmt, ...);
|
|||
* The separator is arbitrary. When the separator is NULL, a single space will
|
||||
* be used.
|
||||
*/
|
||||
char *str_join(const char *const parts[],
|
||||
const char *restrict fmt, const char *restrict sep);
|
||||
char *str_join(const char *const parts[], const char *fmt, const char *sep);
|
||||
|
||||
/**
|
||||
* str_endswith - indicate whether a string ends with a given suffix
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_SURFACE_HELPERS_H
|
||||
#define LABWC_SURFACE_HELPERS_H
|
||||
|
||||
struct wlr_surface;
|
||||
struct wlr_layer_surface_v1;
|
||||
|
||||
/**
|
||||
* subsurface_parent_layer() - Get wlr_layer_surface from layer-subsurface
|
||||
* @wlr_surface: The wlr_surface of the wlr_subsurface for which to get the
|
||||
* layer-surface.
|
||||
*/
|
||||
struct wlr_layer_surface_v1 *subsurface_parent_layer(
|
||||
struct wlr_surface *wlr_surface);
|
||||
|
||||
#endif /* LABWC_SURFACE_HELPERS_H */
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_THREE_STATE_H
|
||||
#define LABWC_THREE_STATE_H
|
||||
|
||||
enum three_state {
|
||||
LAB_STATE_UNSPECIFIED = 0,
|
||||
LAB_STATE_ENABLED,
|
||||
LAB_STATE_DISABLED
|
||||
};
|
||||
|
||||
#endif /* LABWC_THREE_STATE_H */
|
||||
66
include/common/xml.h
Normal file
66
include/common/xml.h
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_XML_H
|
||||
#define LABWC_XML_H
|
||||
|
||||
#include <libxml/tree.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
/*
|
||||
* Converts dotted attributes into nested nodes.
|
||||
* For example, the following node:
|
||||
*
|
||||
* <keybind name.action="ShowMenu" menu.action="root-menu"
|
||||
* x.position.action="1" y.position.action="2" />
|
||||
*
|
||||
* is converted to:
|
||||
*
|
||||
* <keybind>
|
||||
* <action>
|
||||
* <name>ShowMenu</name>
|
||||
* <menu>root-menu</menu>
|
||||
* <position>
|
||||
* <x>1</x>
|
||||
* <y>2</y>
|
||||
* </position>
|
||||
* </action>
|
||||
* </keybind>
|
||||
*/
|
||||
void lab_xml_expand_dotted_attributes(xmlNode *parent);
|
||||
|
||||
/* Returns true if the node only contains a string or is empty */
|
||||
bool lab_xml_node_is_leaf(xmlNode *node);
|
||||
|
||||
bool lab_xml_get_string(xmlNode *node, const char *key, char *s, size_t len);
|
||||
bool lab_xml_get_int(xmlNode *node, const char *key, int *i);
|
||||
bool lab_xml_get_bool(xmlNode *node, const char *key, bool *b);
|
||||
|
||||
/* also skips other unusual nodes like comments */
|
||||
static inline xmlNode *
|
||||
lab_xml_skip_text(xmlNode *child)
|
||||
{
|
||||
while (child && child->type != XML_ELEMENT_NODE) {
|
||||
child = child->next;
|
||||
}
|
||||
return child;
|
||||
}
|
||||
|
||||
static inline void
|
||||
lab_xml_get_key_and_content(xmlNode *node, char **name, char **content)
|
||||
{
|
||||
if (node) {
|
||||
*name = (char *)node->name;
|
||||
*content = (char *)xmlNodeGetContent(node);
|
||||
}
|
||||
}
|
||||
|
||||
#define LAB_XML_FOR_EACH(parent, child, key, content) \
|
||||
for ((child) = lab_xml_skip_text((parent)->children), \
|
||||
lab_xml_get_key_and_content((child), &(key), &(content)); \
|
||||
\
|
||||
(child); \
|
||||
\
|
||||
xmlFree((xmlChar *)(content)), \
|
||||
(child) = lab_xml_skip_text((child)->next), \
|
||||
lab_xml_get_key_and_content((child), &(key), &(content)))
|
||||
|
||||
#endif /* LABWC_XML_H */
|
||||
|
|
@ -35,6 +35,10 @@ static struct key_combos {
|
|||
.name = "direction",
|
||||
.value = "left",
|
||||
},
|
||||
.attributes[1] = {
|
||||
.name = "combine",
|
||||
.value = "yes",
|
||||
},
|
||||
}, {
|
||||
.binding = "W-Right",
|
||||
.action = "SnapToEdge",
|
||||
|
|
@ -42,6 +46,10 @@ static struct key_combos {
|
|||
.name = "direction",
|
||||
.value = "right",
|
||||
},
|
||||
.attributes[1] = {
|
||||
.name = "combine",
|
||||
.value = "yes",
|
||||
},
|
||||
}, {
|
||||
.binding = "W-Up",
|
||||
.action = "SnapToEdge",
|
||||
|
|
@ -49,6 +57,10 @@ static struct key_combos {
|
|||
.name = "direction",
|
||||
.value = "up",
|
||||
},
|
||||
.attributes[1] = {
|
||||
.name = "combine",
|
||||
.value = "yes",
|
||||
},
|
||||
}, {
|
||||
.binding = "W-Down",
|
||||
.action = "SnapToEdge",
|
||||
|
|
@ -56,6 +68,10 @@ static struct key_combos {
|
|||
.name = "direction",
|
||||
.value = "down",
|
||||
},
|
||||
.attributes[1] = {
|
||||
.name = "combine",
|
||||
.value = "yes",
|
||||
},
|
||||
}, {
|
||||
.binding = "A-Space",
|
||||
.action = "ShowMenu",
|
||||
|
|
@ -143,42 +159,17 @@ static struct mouse_combos {
|
|||
const char *name, *value;
|
||||
} attributes[2];
|
||||
} mouse_combos[] = { {
|
||||
.context = "Left",
|
||||
.context = "Border",
|
||||
.button = "Left",
|
||||
.event = "Drag",
|
||||
.action = "Resize",
|
||||
.event = "Press",
|
||||
.action = "Focus",
|
||||
}, {
|
||||
.context = "Top",
|
||||
.context = "Border",
|
||||
.button = "Left",
|
||||
.event = "Drag",
|
||||
.action = "Resize",
|
||||
.event = "Press",
|
||||
.action = "Raise",
|
||||
}, {
|
||||
.context = "Bottom",
|
||||
.button = "Left",
|
||||
.event = "Drag",
|
||||
.action = "Resize",
|
||||
}, {
|
||||
.context = "Right",
|
||||
.button = "Left",
|
||||
.event = "Drag",
|
||||
.action = "Resize",
|
||||
}, {
|
||||
.context = "TLCorner",
|
||||
.button = "Left",
|
||||
.event = "Drag",
|
||||
.action = "Resize",
|
||||
}, {
|
||||
.context = "TRCorner",
|
||||
.button = "Left",
|
||||
.event = "Drag",
|
||||
.action = "Resize",
|
||||
}, {
|
||||
.context = "BRCorner",
|
||||
.button = "Left",
|
||||
.event = "Drag",
|
||||
.action = "Resize",
|
||||
}, {
|
||||
.context = "BLCorner",
|
||||
.context = "Border",
|
||||
.button = "Left",
|
||||
.event = "Drag",
|
||||
.action = "Resize",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
#ifndef LABWC_KEYBIND_H
|
||||
#define LABWC_KEYBIND_H
|
||||
|
||||
#include <wlr/types/wlr_keyboard.h>
|
||||
#include <stdbool.h>
|
||||
#include <wayland-util.h>
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
|
||||
#define MAX_KEYSYMS 32
|
||||
|
|
@ -41,5 +42,8 @@ uint32_t parse_modifier(const char *symname);
|
|||
|
||||
bool keybind_the_same(struct keybind *a, struct keybind *b);
|
||||
|
||||
bool keybind_contains_keycode(struct keybind *keybind, xkb_keycode_t keycode);
|
||||
bool keybind_contains_keysym(struct keybind *keybind, xkb_keysym_t keysym);
|
||||
|
||||
void keybind_update_keycodes(struct server *server);
|
||||
#endif /* LABWC_KEYBIND_H */
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ struct libinput_category {
|
|||
};
|
||||
|
||||
enum lab_libinput_device_type get_device_type(const char *s);
|
||||
const char *libinput_device_type_name(enum lab_libinput_device_type type);
|
||||
struct libinput_category *libinput_category_create(void);
|
||||
struct libinput_category *libinput_category_get_default(void);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@
|
|||
#ifndef LABWC_MOUSEBIND_H
|
||||
#define LABWC_MOUSEBIND_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <wayland-util.h>
|
||||
#include "ssd.h"
|
||||
#include "config/keybind.h"
|
||||
#include "common/node-type.h"
|
||||
|
||||
enum mouse_event {
|
||||
MOUSE_ACTION_NONE = 0,
|
||||
|
|
@ -25,7 +25,7 @@ enum direction {
|
|||
};
|
||||
|
||||
struct mousebind {
|
||||
enum ssd_part_type context;
|
||||
enum lab_node_type context;
|
||||
|
||||
/* ex: BTN_LEFT, BTN_RIGHT from linux/input_event_codes.h */
|
||||
uint32_t button;
|
||||
|
|
|
|||
|
|
@ -3,28 +3,19 @@
|
|||
#define LABWC_RCXML_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <wayland-server-core.h>
|
||||
#include <wlr/util/box.h>
|
||||
#include <libxml/tree.h>
|
||||
|
||||
#include "common/border.h"
|
||||
#include "common/buf.h"
|
||||
#include "common/font.h"
|
||||
#include "common/three-state.h"
|
||||
#include "config/touch.h"
|
||||
#include "config/tablet.h"
|
||||
#include "config/tablet-tool.h"
|
||||
#include "config/libinput.h"
|
||||
#include "resize-indicator.h"
|
||||
#include "ssd.h"
|
||||
#include "theme.h"
|
||||
#include "common/node-type.h"
|
||||
#include "config/types.h"
|
||||
|
||||
enum view_placement_policy {
|
||||
LAB_PLACE_INVALID = 0,
|
||||
LAB_PLACE_CENTER,
|
||||
LAB_PLACE_CURSOR,
|
||||
LAB_PLACE_AUTOMATIC,
|
||||
LAB_PLACE_CASCADE,
|
||||
};
|
||||
#define BUTTON_MAP_MAX 16
|
||||
|
||||
/* max of one button of each type (no repeats) */
|
||||
#define TITLE_BUTTONS_MAX ((LAB_NODE_BUTTON_LAST + 1) - LAB_NODE_BUTTON_FIRST)
|
||||
|
||||
enum adaptive_sync_mode {
|
||||
LAB_ADAPTIVE_SYNC_DISABLED,
|
||||
|
|
@ -32,6 +23,12 @@ enum adaptive_sync_mode {
|
|||
LAB_ADAPTIVE_SYNC_FULLSCREEN,
|
||||
};
|
||||
|
||||
enum resize_indicator_mode {
|
||||
LAB_RESIZE_INDICATOR_NEVER = 0,
|
||||
LAB_RESIZE_INDICATOR_ALWAYS,
|
||||
LAB_RESIZE_INDICATOR_NON_PIXEL
|
||||
};
|
||||
|
||||
enum tearing_mode {
|
||||
LAB_TEARING_DISABLED = 0,
|
||||
LAB_TEARING_ENABLED,
|
||||
|
|
@ -47,9 +44,11 @@ enum tiling_events_mode {
|
|||
(LAB_TILING_EVENTS_REGION | LAB_TILING_EVENTS_EDGE),
|
||||
};
|
||||
|
||||
struct title_button {
|
||||
enum ssd_part_type type;
|
||||
struct wl_list link;
|
||||
struct buf;
|
||||
|
||||
struct button_map_entry {
|
||||
uint32_t from;
|
||||
uint32_t to;
|
||||
};
|
||||
|
||||
struct usable_area_override {
|
||||
|
|
@ -66,14 +65,18 @@ struct rcxml {
|
|||
|
||||
/* core */
|
||||
bool xdg_shell_server_side_deco;
|
||||
bool hide_maximized_window_titlebar;
|
||||
int gap;
|
||||
enum adaptive_sync_mode adaptive_sync;
|
||||
enum tearing_mode allow_tearing;
|
||||
bool auto_enable_outputs;
|
||||
bool reuse_output_mode;
|
||||
enum view_placement_policy placement_policy;
|
||||
bool xwayland_persistence;
|
||||
bool primary_selection;
|
||||
char *prompt_command;
|
||||
|
||||
/* placement */
|
||||
enum lab_placement_policy placement_policy;
|
||||
int placement_cascade_offset_x;
|
||||
int placement_cascade_offset_y;
|
||||
|
||||
|
|
@ -86,8 +89,12 @@ struct rcxml {
|
|||
char *theme_name;
|
||||
char *icon_theme_name;
|
||||
char *fallback_app_icon_name;
|
||||
struct wl_list title_buttons_left;
|
||||
struct wl_list title_buttons_right;
|
||||
|
||||
enum lab_node_type title_buttons_left[TITLE_BUTTONS_MAX];
|
||||
int nr_title_buttons_left;
|
||||
enum lab_node_type title_buttons_right[TITLE_BUTTONS_MAX];
|
||||
int nr_title_buttons_right;
|
||||
|
||||
int corner_radius;
|
||||
bool show_title;
|
||||
bool title_layout_loaded;
|
||||
|
|
@ -109,7 +116,7 @@ struct rcxml {
|
|||
/* keyboard */
|
||||
int repeat_rate;
|
||||
int repeat_delay;
|
||||
enum three_state kb_numlock_enable;
|
||||
enum lab_tristate kb_numlock_enable;
|
||||
bool kb_layout_per_window;
|
||||
struct wl_list keybinds; /* struct keybind.link */
|
||||
|
||||
|
|
@ -125,12 +132,12 @@ struct rcxml {
|
|||
bool force_mouse_emulation;
|
||||
char *output_name;
|
||||
struct wlr_fbox box;
|
||||
enum rotation rotation;
|
||||
enum lab_rotation rotation;
|
||||
uint16_t button_map_count;
|
||||
struct button_map_entry button_map[BUTTON_MAP_MAX];
|
||||
} tablet;
|
||||
struct tablet_tool_config {
|
||||
enum motion motion;
|
||||
enum lab_motion motion;
|
||||
double relative_motion_sensitivity;
|
||||
} tablet_tool;
|
||||
|
||||
|
|
@ -145,6 +152,7 @@ struct rcxml {
|
|||
|
||||
/* window snapping */
|
||||
int snap_edge_range;
|
||||
int snap_edge_corner_range;
|
||||
bool snap_overlay_enabled;
|
||||
int snap_overlay_delay_inner;
|
||||
int snap_overlay_delay_outer;
|
||||
|
|
@ -171,8 +179,10 @@ struct rcxml {
|
|||
bool show;
|
||||
bool preview;
|
||||
bool outlines;
|
||||
uint32_t criteria;
|
||||
bool unshade;
|
||||
enum lab_view_criteria criteria;
|
||||
struct wl_list fields; /* struct window_switcher_field.link */
|
||||
enum window_switcher_style style;
|
||||
} window_switcher;
|
||||
|
||||
struct wl_list window_rules; /* struct window_rule.link */
|
||||
|
|
@ -191,8 +201,13 @@ struct rcxml {
|
|||
|
||||
extern struct rcxml rc;
|
||||
|
||||
void rcxml_parse_xml(struct buf *b);
|
||||
void rcxml_read(const char *filename);
|
||||
void rcxml_finish(void);
|
||||
|
||||
/*
|
||||
* Parse the child <action> nodes and append them to the list.
|
||||
* FIXME: move this function to somewhere else.
|
||||
*/
|
||||
void append_parsed_actions(xmlNode *node, struct wl_list *list);
|
||||
|
||||
#endif /* LABWC_RCXML_H */
|
||||
|
|
|
|||
|
|
@ -2,13 +2,8 @@
|
|||
#ifndef LABWC_TABLET_TOOL_CONFIG_H
|
||||
#define LABWC_TABLET_TOOL_CONFIG_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "config/types.h"
|
||||
|
||||
enum motion {
|
||||
LAB_TABLET_MOTION_ABSOLUTE = 0,
|
||||
LAB_TABLET_MOTION_RELATIVE,
|
||||
};
|
||||
|
||||
enum motion tablet_parse_motion(const char *name);
|
||||
enum lab_motion tablet_parse_motion(const char *name);
|
||||
|
||||
#endif /* LABWC_TABLET_TOOL_CONFIG_H */
|
||||
|
|
|
|||
|
|
@ -3,22 +3,10 @@
|
|||
#define LABWC_TABLET_CONFIG_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
enum rotation {
|
||||
LAB_ROTATE_NONE = 0,
|
||||
LAB_ROTATE_90,
|
||||
LAB_ROTATE_180,
|
||||
LAB_ROTATE_270,
|
||||
};
|
||||
|
||||
#define BUTTON_MAP_MAX 16
|
||||
struct button_map_entry {
|
||||
uint32_t from;
|
||||
uint32_t to;
|
||||
};
|
||||
#include "config/types.h"
|
||||
|
||||
double tablet_get_dbl_if_positive(const char *content, const char *name);
|
||||
enum rotation tablet_parse_rotation(int value);
|
||||
enum lab_rotation tablet_parse_rotation(int value);
|
||||
uint32_t tablet_button_from_str(const char *button);
|
||||
void tablet_button_mapping_add(uint32_t from, uint32_t to);
|
||||
void tablet_load_default_button_mappings(void);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#ifndef LABWC_TOUCH_CONFIG_H
|
||||
#define LABWC_TOUCH_CONFIG_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <wayland-util.h>
|
||||
|
||||
struct touch_config_entry {
|
||||
|
|
|
|||
115
include/config/types.h
Normal file
115
include/config/types.h
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_CONFIG_TYPES_H
|
||||
#define LABWC_CONFIG_TYPES_H
|
||||
|
||||
/*
|
||||
* Shared (basic) types related to user configuration.
|
||||
*
|
||||
* Please try to keep dependencies on other headers minimal,
|
||||
* since config/types.h gets included in many source files.
|
||||
*
|
||||
* For the full config struct, see config/rcxml.h.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Indicates whether tablet tool motion events should be reported using
|
||||
* absolute or relative coordinates
|
||||
*/
|
||||
enum lab_motion {
|
||||
LAB_MOTION_ABSOLUTE = 0,
|
||||
LAB_MOTION_RELATIVE,
|
||||
};
|
||||
|
||||
enum lab_placement_policy {
|
||||
LAB_PLACE_INVALID = 0,
|
||||
LAB_PLACE_CENTER,
|
||||
LAB_PLACE_CURSOR,
|
||||
LAB_PLACE_AUTOMATIC,
|
||||
LAB_PLACE_CASCADE,
|
||||
};
|
||||
|
||||
enum lab_rotation {
|
||||
LAB_ROTATE_NONE = 0,
|
||||
LAB_ROTATE_90,
|
||||
LAB_ROTATE_180,
|
||||
LAB_ROTATE_270,
|
||||
};
|
||||
|
||||
enum lab_ssd_mode {
|
||||
LAB_SSD_MODE_NONE = 0,
|
||||
LAB_SSD_MODE_BORDER,
|
||||
LAB_SSD_MODE_FULL,
|
||||
LAB_SSD_MODE_INVALID,
|
||||
};
|
||||
|
||||
enum lab_tristate {
|
||||
LAB_STATE_UNSPECIFIED = 0,
|
||||
LAB_STATE_ENABLED,
|
||||
LAB_STATE_DISABLED
|
||||
};
|
||||
|
||||
/*
|
||||
* This enum type is a set of bit flags where each set bit makes the
|
||||
* criteria more restrictive. For example:
|
||||
*
|
||||
* (LAB_VIEW_CRITERIA_FULLSCREEN | LAB_VIEW_CRITERIA_CURRENT_WORKSPACE)
|
||||
* matches only fullscreen views on the current workspace, while
|
||||
*
|
||||
* (LAB_VIEW_CRITERIA_ALWAYS_ON_TOP | LAB_VIEW_CRITERIA_NO_ALWAYS_ON_TOP)
|
||||
* would be contradictory and match nothing at all.
|
||||
*/
|
||||
enum lab_view_criteria {
|
||||
/* No filter -> all focusable views */
|
||||
LAB_VIEW_CRITERIA_NONE = 0,
|
||||
|
||||
/*
|
||||
* Includes always-on-top views, e.g.
|
||||
* what is visible on the current workspace
|
||||
*/
|
||||
LAB_VIEW_CRITERIA_CURRENT_WORKSPACE = 1 << 0,
|
||||
|
||||
/* Positive criteria */
|
||||
LAB_VIEW_CRITERIA_FULLSCREEN = 1 << 1,
|
||||
LAB_VIEW_CRITERIA_ALWAYS_ON_TOP = 1 << 2,
|
||||
LAB_VIEW_CRITERIA_ROOT_TOPLEVEL = 1 << 3,
|
||||
|
||||
/* Negative criteria */
|
||||
LAB_VIEW_CRITERIA_NO_ALWAYS_ON_TOP = 1 << 6,
|
||||
LAB_VIEW_CRITERIA_NO_SKIP_WINDOW_SWITCHER = 1 << 7,
|
||||
LAB_VIEW_CRITERIA_NO_OMNIPRESENT = 1 << 8,
|
||||
};
|
||||
|
||||
/*
|
||||
* Window types are based on the NET_WM constants from X11. See:
|
||||
* https://specifications.freedesktop.org/wm-spec/1.4/ar01s05.html#id-1.6.7
|
||||
*
|
||||
* The enum constants are intended to match wlr_xwayland_net_wm_window_type.
|
||||
* Redefining the same constants here may seem redundant, but is necessary
|
||||
* to make them available even in builds with xwayland support disabled.
|
||||
*/
|
||||
enum lab_window_type {
|
||||
LAB_WINDOW_TYPE_INVALID = -1,
|
||||
LAB_WINDOW_TYPE_DESKTOP = 0,
|
||||
LAB_WINDOW_TYPE_DOCK,
|
||||
LAB_WINDOW_TYPE_TOOLBAR,
|
||||
LAB_WINDOW_TYPE_MENU,
|
||||
LAB_WINDOW_TYPE_UTILITY,
|
||||
LAB_WINDOW_TYPE_SPLASH,
|
||||
LAB_WINDOW_TYPE_DIALOG,
|
||||
LAB_WINDOW_TYPE_DROPDOWN_MENU,
|
||||
LAB_WINDOW_TYPE_POPUP_MENU,
|
||||
LAB_WINDOW_TYPE_TOOLTIP,
|
||||
LAB_WINDOW_TYPE_NOTIFICATION,
|
||||
LAB_WINDOW_TYPE_COMBO,
|
||||
LAB_WINDOW_TYPE_DND,
|
||||
LAB_WINDOW_TYPE_NORMAL,
|
||||
|
||||
LAB_WINDOW_TYPE_LEN
|
||||
};
|
||||
|
||||
enum window_switcher_style {
|
||||
WINDOW_SWITCHER_CLASSIC,
|
||||
WINDOW_SWITCHER_THUMBNAIL,
|
||||
};
|
||||
|
||||
#endif /* LABWC_CONFIG_TYPES_H */
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "common/edge.h"
|
||||
#include "common/macros.h"
|
||||
|
||||
struct border;
|
||||
|
|
@ -101,9 +101,6 @@ typedef void (*edge_validator_t)(int *best, struct edge current,
|
|||
|
||||
void edges_initialize(struct border *edges);
|
||||
|
||||
void edges_adjust_geom(struct view *view, struct border edges,
|
||||
uint32_t resize_edges, struct wlr_box *geom);
|
||||
|
||||
void edges_find_neighbors(struct border *nearest_edges, struct view *view,
|
||||
struct wlr_box origin, struct wlr_box target,
|
||||
struct output *output, edge_validator_t validator, bool ignore_hidden);
|
||||
|
|
@ -116,9 +113,10 @@ void edges_adjust_move_coords(struct view *view, struct border edges,
|
|||
int *x, int *y, bool use_pending);
|
||||
|
||||
void edges_adjust_resize_geom(struct view *view, struct border edges,
|
||||
uint32_t resize_edges, struct wlr_box *geom, bool use_pending);
|
||||
enum lab_edge resize_edges, struct wlr_box *geom, bool use_pending);
|
||||
|
||||
bool edges_traverse_edge(struct edge current, struct edge target, struct edge edge);
|
||||
|
||||
void edges_calculate_visibility(struct server *server, struct view *ignored_view);
|
||||
|
||||
#endif /* LABWC_EDGES_H */
|
||||
|
|
|
|||
|
|
@ -1,83 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_FOREIGN_TOPLEVEL_INTERNAL_H
|
||||
#define LABWC_FOREIGN_TOPLEVEL_INTERNAL_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <wayland-server-core.h>
|
||||
#include "foreign-toplevel.h"
|
||||
|
||||
struct foreign_toplevel {
|
||||
struct view *view;
|
||||
|
||||
/* *-toplevel implementations */
|
||||
struct wlr_foreign_toplevel {
|
||||
struct wlr_foreign_toplevel_handle_v1 *handle;
|
||||
|
||||
/* Client side events */
|
||||
struct {
|
||||
struct wl_listener request_maximize;
|
||||
struct wl_listener request_minimize;
|
||||
struct wl_listener request_fullscreen;
|
||||
struct wl_listener request_activate;
|
||||
struct wl_listener request_close;
|
||||
struct wl_listener handle_destroy;
|
||||
} on;
|
||||
|
||||
/* Compositor side state updates */
|
||||
struct {
|
||||
struct wl_listener new_app_id;
|
||||
struct wl_listener new_title;
|
||||
struct wl_listener new_outputs;
|
||||
struct wl_listener maximized;
|
||||
struct wl_listener minimized;
|
||||
struct wl_listener fullscreened;
|
||||
struct wl_listener activated;
|
||||
} on_view;
|
||||
|
||||
/* Internal signals */
|
||||
struct {
|
||||
struct wl_listener toplevel_parent;
|
||||
struct wl_listener toplevel_destroy;
|
||||
} on_foreign_toplevel;
|
||||
|
||||
} wlr_toplevel;
|
||||
|
||||
struct ext_foreign_toplevel {
|
||||
struct wlr_ext_foreign_toplevel_handle_v1 *handle;
|
||||
|
||||
/* Client side events */
|
||||
struct {
|
||||
struct wl_listener handle_destroy;
|
||||
} on;
|
||||
|
||||
/* Compositor side state updates */
|
||||
struct {
|
||||
struct wl_listener new_app_id;
|
||||
struct wl_listener new_title;
|
||||
} on_view;
|
||||
|
||||
/* Internal signals */
|
||||
struct {
|
||||
struct wl_listener toplevel_destroy;
|
||||
} on_foreign_toplevel;
|
||||
|
||||
} ext_toplevel;
|
||||
|
||||
/* TODO: add struct xdg_x11_mapped_toplevel at some point */
|
||||
|
||||
struct {
|
||||
struct wl_signal toplevel_parent; /* struct view *parent */
|
||||
struct wl_signal toplevel_destroy;
|
||||
} events;
|
||||
};
|
||||
|
||||
void ext_foreign_toplevel_init(struct foreign_toplevel *toplevel);
|
||||
void wlr_foreign_toplevel_init(struct foreign_toplevel *toplevel);
|
||||
|
||||
void foreign_request_minimize(struct foreign_toplevel *toplevel, bool minimized);
|
||||
void foreign_request_maximize(struct foreign_toplevel *toplevel, enum view_axis axis);
|
||||
void foreign_request_fullscreen(struct foreign_toplevel *toplevel, bool fullscreen);
|
||||
void foreign_request_activate(struct foreign_toplevel *toplevel);
|
||||
void foreign_request_close(struct foreign_toplevel *toplevel);
|
||||
|
||||
#endif /* LABWC_FOREIGN_TOPLEVEL_INTERNAL_H */
|
||||
27
include/foreign-toplevel/ext-foreign.h
Normal file
27
include/foreign-toplevel/ext-foreign.h
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_EXT_FOREIGN_TOPLEVEL_H
|
||||
#define LABWC_EXT_FOREIGN_TOPLEVEL_H
|
||||
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
struct ext_foreign_toplevel {
|
||||
struct view *view;
|
||||
struct wlr_ext_foreign_toplevel_handle_v1 *handle;
|
||||
|
||||
/* Client side events */
|
||||
struct {
|
||||
struct wl_listener handle_destroy;
|
||||
} on;
|
||||
|
||||
/* Compositor side state updates */
|
||||
struct {
|
||||
struct wl_listener new_app_id;
|
||||
struct wl_listener new_title;
|
||||
} on_view;
|
||||
};
|
||||
|
||||
void ext_foreign_toplevel_init(struct ext_foreign_toplevel *ext_toplevel,
|
||||
struct view *view);
|
||||
void ext_foreign_toplevel_finish(struct ext_foreign_toplevel *ext_toplevel);
|
||||
|
||||
#endif /* LABWC_EXT_FOREIGN_TOPLEVEL_H */
|
||||
39
include/foreign-toplevel/wlr-foreign.h
Normal file
39
include/foreign-toplevel/wlr-foreign.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_WLR_FOREIGN_TOPLEVEL_H
|
||||
#define LABWC_WLR_FOREIGN_TOPLEVEL_H
|
||||
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
struct wlr_foreign_toplevel {
|
||||
struct view *view;
|
||||
struct wlr_foreign_toplevel_handle_v1 *handle;
|
||||
|
||||
/* Client side events */
|
||||
struct {
|
||||
struct wl_listener request_maximize;
|
||||
struct wl_listener request_minimize;
|
||||
struct wl_listener request_fullscreen;
|
||||
struct wl_listener request_activate;
|
||||
struct wl_listener request_close;
|
||||
struct wl_listener handle_destroy;
|
||||
} on;
|
||||
|
||||
/* Compositor side state updates */
|
||||
struct {
|
||||
struct wl_listener new_app_id;
|
||||
struct wl_listener new_title;
|
||||
struct wl_listener new_outputs;
|
||||
struct wl_listener maximized;
|
||||
struct wl_listener minimized;
|
||||
struct wl_listener fullscreened;
|
||||
struct wl_listener activated;
|
||||
} on_view;
|
||||
};
|
||||
|
||||
void wlr_foreign_toplevel_init(struct wlr_foreign_toplevel *wlr_toplevel,
|
||||
struct view *view);
|
||||
void wlr_foreign_toplevel_set_parent(struct wlr_foreign_toplevel *wlr_toplevel,
|
||||
struct wlr_foreign_toplevel *parent);
|
||||
void wlr_foreign_toplevel_finish(struct wlr_foreign_toplevel *wlr_toplevel);
|
||||
|
||||
#endif /* LABWC_WLR_FOREIGN_TOPLEVEL_H */
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
struct wl_display;
|
||||
struct wlr_seat;
|
||||
|
||||
void idle_manager_create(struct wl_display *display, struct wlr_seat *wlr_seat);
|
||||
void idle_manager_create(struct wl_display *display);
|
||||
void idle_manager_notify_activity(struct wlr_seat *seat);
|
||||
|
||||
#endif /* LABWC_IDLE_H */
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
#include <cairo.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <wayland-util.h>
|
||||
|
||||
enum lab_img_type {
|
||||
|
|
|
|||
|
|
@ -2,16 +2,17 @@
|
|||
#ifndef LABWC_CURSOR_H
|
||||
#define LABWC_CURSOR_H
|
||||
|
||||
#include <wlr/types/wlr_cursor.h>
|
||||
#include <wlr/util/edges.h>
|
||||
#include "ssd.h"
|
||||
#include <wayland-server-protocol.h>
|
||||
#include "common/edge.h"
|
||||
#include "common/node-type.h"
|
||||
|
||||
struct view;
|
||||
struct seat;
|
||||
struct server;
|
||||
struct wlr_input_device;
|
||||
struct wlr_cursor;
|
||||
struct wlr_surface;
|
||||
struct wlr_scene_node;
|
||||
enum wl_pointer_button_state;
|
||||
|
||||
/* Cursors used internally by labwc */
|
||||
enum lab_cursors {
|
||||
|
|
@ -33,35 +34,25 @@ struct cursor_context {
|
|||
struct view *view;
|
||||
struct wlr_scene_node *node;
|
||||
struct wlr_surface *surface;
|
||||
enum ssd_part_type type;
|
||||
enum lab_node_type type;
|
||||
double sx, sy;
|
||||
};
|
||||
|
||||
/**
|
||||
* get_cursor_context - find view and scene_node at cursor
|
||||
* get_cursor_context - find view, surface and scene_node at cursor
|
||||
*
|
||||
* Behavior if node points to a surface:
|
||||
* - If surface is a layer-surface, type will be
|
||||
* set to LAB_SSD_LAYER_SURFACE and view will be NULL.
|
||||
* If the cursor is on a client-drawn surface:
|
||||
* - ctx.{surface,node} points to the surface, which may be a subsurface.
|
||||
* - ctx.view is set if the node is associated to a xdg/x11 window.
|
||||
* - ctx.type is LAYER_SURFACE or UNMANAGED if the node is a layer-shell
|
||||
* surface or an X11 unmanaged surface. Otherwise, CLIENT is set.
|
||||
*
|
||||
* - If surface is a 'lost' unmanaged xsurface (one
|
||||
* with a never-mapped parent view), type will
|
||||
* be set to LAB_SSD_UNMANAGED and view will be NULL.
|
||||
*
|
||||
* 'Lost' unmanaged xsurfaces are usually caused by
|
||||
* X11 applications opening popups without setting
|
||||
* the main window as parent. Example: VLC submenus.
|
||||
*
|
||||
* - Any other surface will cause type to be set to
|
||||
* LAB_SSD_CLIENT and return the attached view.
|
||||
*
|
||||
* Behavior if node points to internal elements:
|
||||
* - type will be set to the appropriate enum value
|
||||
* and view will be NULL if the node is not part of the SSD.
|
||||
*
|
||||
* If no node is found for the given layout coordinates,
|
||||
* type will be set to LAB_SSD_ROOT and view will be NULL.
|
||||
* If the cursor is on a server-side component (SSD part and menu item):
|
||||
* - ctx.node points to the root node of that component
|
||||
* - ctx.view is set if the component is a SSD part
|
||||
* - ctx.type specifies the component (e.g. MENU_ITEM, BORDER_TOP, BUTTON_ICONIFY)
|
||||
*
|
||||
* If no node is found at cursor, ctx.type is set to ROOT.
|
||||
*/
|
||||
struct cursor_context get_cursor_context(struct server *server);
|
||||
|
||||
|
|
@ -85,20 +76,19 @@ void cursor_set_visible(struct seat *seat, bool visible);
|
|||
* This is mostly important when either resizing a window using a
|
||||
* keyboard modifier or when using the Resize action from a keybind.
|
||||
*/
|
||||
uint32_t cursor_get_resize_edges(struct wlr_cursor *cursor,
|
||||
enum lab_edge cursor_get_resize_edges(struct wlr_cursor *cursor,
|
||||
struct cursor_context *ctx);
|
||||
|
||||
/**
|
||||
* cursor_get_from_edge - translate wlroots edge enum to lab_cursor enum
|
||||
* @resize_edges - WLR_EDGE_ combination like WLR_EDGE_TOP | WLR_EDGE_RIGHT
|
||||
* cursor_get_from_edge - translate lab_edge enum to lab_cursor enum
|
||||
* @resize_edges - edge(s) being resized
|
||||
*
|
||||
* Returns LAB_CURSOR_DEFAULT on WLR_EDGE_NONE
|
||||
* Returns the appropriate lab_cursors enum if @resize_edges
|
||||
* is one of the 4 corners or one of the 4 edges.
|
||||
*
|
||||
* Asserts on invalid edge combinations like WLR_EDGE_LEFT | WLR_EDGE_RIGHT
|
||||
* Returns LAB_CURSOR_DEFAULT on any other value.
|
||||
*/
|
||||
enum lab_cursors cursor_get_from_edge(uint32_t resize_edges);
|
||||
enum lab_cursors cursor_get_from_edge(enum lab_edge resize_edges);
|
||||
|
||||
/**
|
||||
* cursor_update_focus - update cursor focus, may update the cursor icon
|
||||
|
|
|
|||
|
|
@ -3,11 +3,10 @@
|
|||
#ifndef LABWC_IME_H
|
||||
#define LABWC_IME_H
|
||||
|
||||
#include <wlr/types/wlr_text_input_v3.h>
|
||||
#include <wlr/types/wlr_input_method_v2.h>
|
||||
#include "labwc.h"
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
struct keyboard;
|
||||
struct wlr_keyboard_key_event;
|
||||
|
||||
/*
|
||||
* The relay structure manages the relationship between text-inputs and
|
||||
|
|
|
|||
|
|
@ -2,7 +2,16 @@
|
|||
#ifndef LABWC_INPUT_H
|
||||
#define LABWC_INPUT_H
|
||||
|
||||
struct seat;
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
struct input {
|
||||
struct wlr_input_device *wlr_input_device;
|
||||
struct seat *seat;
|
||||
/* Set for pointer/touch devices */
|
||||
double scroll_factor;
|
||||
struct wl_listener destroy;
|
||||
struct wl_list link; /* seat.inputs */
|
||||
};
|
||||
|
||||
void input_handlers_init(struct seat *seat);
|
||||
void input_handlers_finish(struct seat *seat);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,5 @@ void key_state_store_pressed_key_as_bound(uint32_t keycode);
|
|||
bool key_state_corresponding_press_event_was_bound(uint32_t keycode);
|
||||
void key_state_bound_key_remove(uint32_t keycode);
|
||||
int key_state_nr_bound_keys(void);
|
||||
int key_state_nr_pressed_keys(void);
|
||||
|
||||
#endif /* LABWC_KEY_STATE_H */
|
||||
|
|
|
|||
|
|
@ -4,10 +4,25 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#include "input/input.h"
|
||||
|
||||
struct seat;
|
||||
struct keyboard;
|
||||
struct wlr_keyboard;
|
||||
/*
|
||||
* Virtual keyboards should not belong to seat->keyboard_group. As a result we
|
||||
* need to be able to ascertain which wlr_keyboard key/modifier events come from
|
||||
* and we achieve that by using `struct keyboard` which inherits `struct input`
|
||||
* and adds keyboard specific listeners and a wlr_keyboard pointer.
|
||||
*/
|
||||
struct keyboard {
|
||||
struct input base;
|
||||
struct wlr_keyboard *wlr_keyboard;
|
||||
bool is_virtual;
|
||||
struct wl_listener modifiers;
|
||||
struct wl_listener key;
|
||||
/* key repeat for compositor keybinds */
|
||||
uint32_t keybind_repeat_keycode;
|
||||
int32_t keybind_repeat_rate;
|
||||
struct wl_event_source *keybind_repeat;
|
||||
};
|
||||
|
||||
void keyboard_reset_current_keybind(void);
|
||||
void keyboard_configure(struct seat *seat, struct wlr_keyboard *kb,
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
#define LABWC_TABLET_PAD_H
|
||||
|
||||
#include <wayland-server-core.h>
|
||||
#include <wlr/types/wlr_tablet_v2.h>
|
||||
|
||||
struct seat;
|
||||
struct wlr_device;
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
#define LABWC_TABLET_H
|
||||
|
||||
#include <wayland-server-core.h>
|
||||
#include <wlr/types/wlr_tablet_v2.h>
|
||||
#include "config/types.h"
|
||||
|
||||
struct seat;
|
||||
struct wlr_device;
|
||||
|
|
@ -20,7 +20,7 @@ struct drawing_tablet_tool {
|
|||
*/
|
||||
bool force_mouse_emulation;
|
||||
|
||||
enum motion motion_mode;
|
||||
enum lab_motion motion_mode;
|
||||
double x, y, dx, dy;
|
||||
double distance;
|
||||
double pressure;
|
||||
|
|
|
|||
194
include/labwc.h
194
include/labwc.h
|
|
@ -2,64 +2,17 @@
|
|||
#ifndef LABWC_H
|
||||
#define LABWC_H
|
||||
#include "config.h"
|
||||
#include <getopt.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <wayland-server-core.h>
|
||||
#include <wlr/backend.h>
|
||||
#include <wlr/render/allocator.h>
|
||||
#include <wlr/render/wlr_renderer.h>
|
||||
#include <wlr/types/wlr_compositor.h>
|
||||
#include <wlr/types/wlr_buffer.h>
|
||||
#include <wlr/types/wlr_cursor.h>
|
||||
#include <wlr/types/wlr_data_device.h>
|
||||
#include <wlr/types/wlr_gamma_control_v1.h>
|
||||
#include <wlr/types/wlr_input_device.h>
|
||||
#include <wlr/types/wlr_keyboard.h>
|
||||
#include <wlr/types/wlr_keyboard_group.h>
|
||||
#include <wlr/types/wlr_layer_shell_v1.h>
|
||||
#include <wlr/types/wlr_output.h>
|
||||
#include <wlr/types/wlr_output_management_v1.h>
|
||||
#include <wlr/types/wlr_output_power_management_v1.h>
|
||||
#include <wlr/types/wlr_output_layout.h>
|
||||
#include <wlr/types/wlr_scene.h>
|
||||
#include <wlr/types/wlr_relative_pointer_v1.h>
|
||||
#include <wlr/types/wlr_pointer.h>
|
||||
#include <wlr/types/wlr_pointer_constraints_v1.h>
|
||||
#include <wlr/types/wlr_seat.h>
|
||||
#include <wlr/types/wlr_subcompositor.h>
|
||||
#include <wlr/types/wlr_xcursor_manager.h>
|
||||
#include <wlr/types/wlr_xdg_activation_v1.h>
|
||||
#include <wlr/types/wlr_xdg_shell.h>
|
||||
#include <wlr/types/wlr_drm_lease_v1.h>
|
||||
#include <wlr/types/wlr_virtual_pointer_v1.h>
|
||||
#include <wlr/types/wlr_virtual_keyboard_v1.h>
|
||||
#include <wlr/types/wlr_tearing_control_v1.h>
|
||||
#include <wlr/types/wlr_text_input_v3.h>
|
||||
#include <wlr/types/wlr_input_method_v2.h>
|
||||
#include <wlr/types/wlr_tablet_v2.h>
|
||||
#include <wlr/util/box.h>
|
||||
#include <wlr/util/log.h>
|
||||
#include "common/set.h"
|
||||
#include "config/keybind.h"
|
||||
#include "config/rcxml.h"
|
||||
#include "input/cursor.h"
|
||||
#include "overlay.h"
|
||||
#include "regions.h"
|
||||
#include "session-lock.h"
|
||||
#if HAVE_NLS
|
||||
#include <libintl.h>
|
||||
#include <locale.h>
|
||||
#define _ gettext
|
||||
#else
|
||||
#define _(s) (s)
|
||||
#endif
|
||||
|
||||
#define XCURSOR_DEFAULT "left_ptr"
|
||||
#define XCURSOR_SIZE 24
|
||||
|
||||
struct wlr_xdg_popup;
|
||||
|
||||
enum input_mode {
|
||||
LAB_INPUT_STATE_PASSTHROUGH = 0,
|
||||
LAB_INPUT_STATE_MOVE,
|
||||
|
|
@ -68,33 +21,6 @@ enum input_mode {
|
|||
LAB_INPUT_STATE_WINDOW_SWITCHER,
|
||||
};
|
||||
|
||||
struct input {
|
||||
struct wlr_input_device *wlr_input_device;
|
||||
struct seat *seat;
|
||||
/* Set for pointer/touch devices */
|
||||
double scroll_factor;
|
||||
struct wl_listener destroy;
|
||||
struct wl_list link; /* seat.inputs */
|
||||
};
|
||||
|
||||
/*
|
||||
* Virtual keyboards should not belong to seat->keyboard_group. As a result we
|
||||
* need to be able to ascertain which wlr_keyboard key/modifier events come from
|
||||
* and we achieve that by using `struct keyboard` which inherits `struct input`
|
||||
* and adds keyboard specific listeners and a wlr_keyboard pointer.
|
||||
*/
|
||||
struct keyboard {
|
||||
struct input base;
|
||||
struct wlr_keyboard *wlr_keyboard;
|
||||
bool is_virtual;
|
||||
struct wl_listener modifiers;
|
||||
struct wl_listener key;
|
||||
/* key repeat for compositor keybinds */
|
||||
uint32_t keybind_repeat_keycode;
|
||||
int32_t keybind_repeat_rate;
|
||||
struct wl_event_source *keybind_repeat;
|
||||
};
|
||||
|
||||
struct seat {
|
||||
struct wlr_seat *seat;
|
||||
struct server *server;
|
||||
|
|
@ -111,9 +37,10 @@ struct seat {
|
|||
bool cursor_visible;
|
||||
struct wlr_cursor *cursor;
|
||||
struct wlr_xcursor_manager *xcursor_manager;
|
||||
struct {
|
||||
double x, y;
|
||||
} smooth_scroll_offset;
|
||||
struct accumulated_scroll {
|
||||
double delta;
|
||||
double delta_discrete;
|
||||
} accumulated_scrolls[2]; /* indexed by wl_pointer_axis */
|
||||
bool cursor_scroll_wheel_emulation;
|
||||
|
||||
/*
|
||||
|
|
@ -128,9 +55,6 @@ struct seat {
|
|||
|
||||
struct wlr_pointer_constraint_v1 *current_constraint;
|
||||
|
||||
/* In support for ToggleKeybinds */
|
||||
uint32_t nr_inhibited_keybind_views;
|
||||
|
||||
/* Used to hide the workspace OSD after switching workspaces */
|
||||
struct wl_event_source *workspace_osd_timer;
|
||||
bool workspace_osd_shown_by_modifier;
|
||||
|
|
@ -218,21 +142,12 @@ struct seat {
|
|||
struct wl_listener pressed_surface_destroy;
|
||||
|
||||
struct wlr_virtual_pointer_manager_v1 *virtual_pointer;
|
||||
struct wl_listener virtual_pointer_new;
|
||||
struct wl_listener new_virtual_pointer;
|
||||
|
||||
struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard;
|
||||
struct wl_listener new_virtual_keyboard;
|
||||
};
|
||||
|
||||
struct lab_data_buffer;
|
||||
struct workspace;
|
||||
|
||||
enum lab_cycle_dir {
|
||||
LAB_CYCLE_DIR_NONE,
|
||||
LAB_CYCLE_DIR_FORWARD,
|
||||
LAB_CYCLE_DIR_BACKWARD,
|
||||
};
|
||||
|
||||
struct server {
|
||||
struct wl_display *wl_display;
|
||||
struct wl_event_loop *wl_event_loop; /* Can be used for timer events */
|
||||
|
|
@ -288,7 +203,7 @@ struct server {
|
|||
double grab_x, grab_y;
|
||||
/* View geometry when interactive move/resize is requested */
|
||||
struct wlr_box grab_box;
|
||||
uint32_t resize_edges;
|
||||
enum lab_edge resize_edges;
|
||||
|
||||
/*
|
||||
* 'active_view' is generally the view with keyboard-focus, updated with
|
||||
|
|
@ -304,7 +219,7 @@ struct server {
|
|||
*/
|
||||
struct view *active_view;
|
||||
|
||||
struct ssd_hover_state *ssd_hover_state;
|
||||
struct ssd_button *hovered_button;
|
||||
|
||||
/* Tree for all non-layer xdg/xwayland-shell surfaces */
|
||||
struct wlr_scene_tree *view_tree;
|
||||
|
|
@ -388,6 +303,7 @@ struct server {
|
|||
/* Set when in cycle (alt-tab) mode */
|
||||
struct osd_state {
|
||||
struct view *cycle_view;
|
||||
bool preview_was_shaded;
|
||||
bool preview_was_enabled;
|
||||
struct wlr_scene_node *preview_node;
|
||||
struct wlr_scene_tree *preview_parent;
|
||||
|
|
@ -405,45 +321,6 @@ struct server {
|
|||
pid_t primary_client_pid;
|
||||
};
|
||||
|
||||
#define LAB_NR_LAYERS (4)
|
||||
|
||||
struct output {
|
||||
struct wl_list link; /* server.outputs */
|
||||
struct server *server;
|
||||
struct wlr_output *wlr_output;
|
||||
struct wlr_output_state pending;
|
||||
struct wlr_scene_output *scene_output;
|
||||
struct wlr_scene_tree *layer_tree[LAB_NR_LAYERS];
|
||||
struct wlr_scene_tree *layer_popup_tree;
|
||||
struct wlr_scene_tree *osd_tree;
|
||||
struct wlr_scene_tree *session_lock_tree;
|
||||
struct wlr_scene_buffer *workspace_osd;
|
||||
|
||||
struct osd_scene {
|
||||
struct wl_array items; /* struct osd_scene_item */
|
||||
struct wlr_scene_tree *tree;
|
||||
} osd_scene;
|
||||
|
||||
/* In output-relative scene coordinates */
|
||||
struct wlr_box usable_area;
|
||||
|
||||
struct wl_list regions; /* struct region.link */
|
||||
|
||||
struct wl_listener destroy;
|
||||
struct wl_listener frame;
|
||||
struct wl_listener request_state;
|
||||
|
||||
bool gamma_lut_changed;
|
||||
};
|
||||
|
||||
#undef LAB_NR_LAYERS
|
||||
|
||||
struct constraint {
|
||||
struct seat *seat;
|
||||
struct wlr_pointer_constraint_v1 *constraint;
|
||||
struct wl_listener destroy;
|
||||
};
|
||||
|
||||
void xdg_popup_create(struct view *view, struct wlr_xdg_popup *wlr_popup);
|
||||
void xdg_shell_init(struct server *server);
|
||||
void xdg_shell_finish(struct server *server);
|
||||
|
|
@ -483,7 +360,6 @@ void desktop_focus_view_or_surface(struct seat *seat, struct view *view,
|
|||
|
||||
void desktop_arrange_all_views(struct server *server);
|
||||
void desktop_focus_output(struct output *output);
|
||||
struct view *desktop_topmost_focusable_view(struct server *server);
|
||||
|
||||
/**
|
||||
* Toggles the (output local) visibility of the layershell top layer
|
||||
|
|
@ -544,50 +420,20 @@ void seat_focus_override_end(struct seat *seat);
|
|||
*/
|
||||
void interactive_anchor_to_cursor(struct server *server, struct wlr_box *geo);
|
||||
|
||||
void interactive_begin(struct view *view, enum input_mode mode, uint32_t edges);
|
||||
void interactive_begin(struct view *view, enum input_mode mode,
|
||||
enum lab_edge edges);
|
||||
void interactive_finish(struct view *view);
|
||||
void interactive_cancel(struct view *view);
|
||||
/* Possibly returns VIEW_EDGE_CENTER if <topMaximize> is yes */
|
||||
enum view_edge edge_from_cursor(struct seat *seat, struct output **dest_output);
|
||||
|
||||
void output_init(struct server *server);
|
||||
void output_finish(struct server *server);
|
||||
void output_manager_init(struct server *server);
|
||||
struct output *output_from_wlr_output(struct server *server,
|
||||
struct wlr_output *wlr_output);
|
||||
struct output *output_from_name(struct server *server, const char *name);
|
||||
struct output *output_nearest_to(struct server *server, int lx, int ly);
|
||||
struct output *output_nearest_to_cursor(struct server *server);
|
||||
|
||||
/**
|
||||
* output_get_adjacent() - get next output, in a given direction,
|
||||
* from a given output
|
||||
*
|
||||
* @output: reference output
|
||||
* @edge: direction in which to look for the nearest output
|
||||
* @wrap: if true, wrap around at layout edge
|
||||
*
|
||||
* Note: if output is NULL, the output nearest the cursor will be used as the
|
||||
* reference instead.
|
||||
* Returns the edge to snap a window to.
|
||||
* For example, if the output-relative cursor position (x,y) fulfills
|
||||
* x <= (<snapping><cornerRange>) and y <= (<snapping><range>),
|
||||
* then edge1=LAB_EDGE_TOP and edge2=LAB_EDGE_LEFT.
|
||||
* The value of (edge1|edge2) can be passed to view_snap_to_edge().
|
||||
*/
|
||||
struct output *output_get_adjacent(struct output *output,
|
||||
enum view_edge edge, bool wrap);
|
||||
|
||||
bool output_is_usable(struct output *output);
|
||||
void output_update_usable_area(struct output *output);
|
||||
void output_update_all_usable_areas(struct server *server, bool layout_changed);
|
||||
bool output_get_tearing_allowance(struct output *output);
|
||||
struct wlr_box output_usable_area_in_layout_coords(struct output *output);
|
||||
void handle_output_power_manager_set_mode(struct wl_listener *listener,
|
||||
void *data);
|
||||
void output_enable_adaptive_sync(struct output *output, bool enabled);
|
||||
|
||||
/**
|
||||
* output_max_scale() - get maximum scale factor of all usable outputs.
|
||||
* Used when loading/rendering resources (e.g. icons) that may be
|
||||
* displayed on any output.
|
||||
*/
|
||||
float output_max_scale(struct server *server);
|
||||
bool edge_from_cursor(struct seat *seat, struct output **dest_output,
|
||||
enum lab_edge *edge1, enum lab_edge *edge2);
|
||||
|
||||
void handle_tearing_new_object(struct wl_listener *listener, void *data);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_LAYERS_H
|
||||
#define LABWC_LAYERS_H
|
||||
#include <wayland-server.h>
|
||||
#include <wlr/types/wlr_layer_shell_v1.h>
|
||||
|
||||
#include <wayland-server-core.h>
|
||||
#include <wlr/util/box.h>
|
||||
|
||||
struct server;
|
||||
struct output;
|
||||
|
|
|
|||
|
|
@ -100,18 +100,6 @@ void menu_open_root(struct menu *menu, int x, int y);
|
|||
*/
|
||||
void menu_process_cursor_motion(struct wlr_scene_node *node);
|
||||
|
||||
/**
|
||||
* menu_call_actions - call actions associated with a menu node
|
||||
*
|
||||
* If menuitem connected to @node does not just open a submenu:
|
||||
* - associated actions will be called
|
||||
* - server->menu_current will be closed
|
||||
* - server->menu_current will be set to NULL
|
||||
*
|
||||
* Returns true if actions have actually been executed
|
||||
*/
|
||||
bool menu_call_actions(struct wlr_scene_node *node);
|
||||
|
||||
/**
|
||||
* menu_close_root- close root menu
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1,31 +1,15 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_NODE_DESCRIPTOR_H
|
||||
#define LABWC_NODE_DESCRIPTOR_H
|
||||
#include <wlr/types/wlr_scene.h>
|
||||
|
||||
struct view;
|
||||
struct lab_layer_surface;
|
||||
struct lab_layer_popup;
|
||||
struct menuitem;
|
||||
struct ssd_button;
|
||||
struct scaled_scene_buffer;
|
||||
#include <wayland-server-core.h>
|
||||
#include "common/node-type.h"
|
||||
|
||||
enum node_descriptor_type {
|
||||
LAB_NODE_DESC_NODE = 0,
|
||||
LAB_NODE_DESC_VIEW,
|
||||
LAB_NODE_DESC_XDG_POPUP,
|
||||
LAB_NODE_DESC_LAYER_SURFACE,
|
||||
LAB_NODE_DESC_LAYER_POPUP,
|
||||
LAB_NODE_DESC_SESSION_LOCK_SURFACE,
|
||||
LAB_NODE_DESC_IME_POPUP,
|
||||
LAB_NODE_DESC_MENUITEM,
|
||||
LAB_NODE_DESC_TREE,
|
||||
LAB_NODE_DESC_SCALED_SCENE_BUFFER,
|
||||
LAB_NODE_DESC_SSD_BUTTON,
|
||||
};
|
||||
struct wlr_scene_node;
|
||||
|
||||
struct node_descriptor {
|
||||
enum node_descriptor_type type;
|
||||
enum lab_node_type type;
|
||||
struct view *view;
|
||||
void *data;
|
||||
struct wl_listener destroy;
|
||||
};
|
||||
|
|
@ -38,16 +22,15 @@ struct node_descriptor {
|
|||
*
|
||||
* @scene_node: wlr_scene_node to attached node_descriptor to
|
||||
* @type: node descriptor type
|
||||
* @view: associated view
|
||||
* @data: struct to point to as follows:
|
||||
* - LAB_NODE_DESC_VIEW struct view
|
||||
* - LAB_NODE_DESC_XDG_POPUP struct view
|
||||
* - LAB_NODE_DESC_LAYER_SURFACE struct lab_layer_surface
|
||||
* - LAB_NODE_DESC_LAYER_POPUP struct lab_layer_popup
|
||||
* - LAB_NODE_DESC_MENUITEM struct menuitem
|
||||
* - LAB_NODE_DESC_SSD_BUTTON struct ssd_button
|
||||
* - LAB_NODE_LAYER_SURFACE struct lab_layer_surface
|
||||
* - LAB_NODE_LAYER_POPUP struct lab_layer_popup
|
||||
* - LAB_NODE_MENUITEM struct menuitem
|
||||
* - LAB_NODE_BUTTON_* struct ssd_button
|
||||
*/
|
||||
void node_descriptor_create(struct wlr_scene_node *scene_node,
|
||||
enum node_descriptor_type type, void *data);
|
||||
enum lab_node_type type, struct view *view, void *data);
|
||||
|
||||
/**
|
||||
* node_view_from_node - return view struct from node
|
||||
|
|
@ -62,13 +45,6 @@ struct view *node_view_from_node(struct wlr_scene_node *wlr_scene_node);
|
|||
struct lab_layer_surface *node_layer_surface_from_node(
|
||||
struct wlr_scene_node *wlr_scene_node);
|
||||
|
||||
/**
|
||||
* node_layer_popup_from_node - return lab_layer_popup struct from node
|
||||
* @wlr_scene_node: wlr_scene_node from which to return data
|
||||
*/
|
||||
struct lab_layer_popup *node_layer_popup_from_node(
|
||||
struct wlr_scene_node *wlr_scene_node);
|
||||
|
||||
/**
|
||||
* node_menuitem_from_node - return menuitem struct from node
|
||||
* @wlr_scene_node: wlr_scene_node from which to return data
|
||||
|
|
@ -77,17 +53,10 @@ struct menuitem *node_menuitem_from_node(
|
|||
struct wlr_scene_node *wlr_scene_node);
|
||||
|
||||
/**
|
||||
* node_ssd_button_from_node - return ssd_button struct from node
|
||||
* node_try_ssd_button_from_node - return ssd_button or NULL from node
|
||||
* @wlr_scene_node: wlr_scene_node from which to return data
|
||||
*/
|
||||
struct ssd_button *node_ssd_button_from_node(
|
||||
struct wlr_scene_node *wlr_scene_node);
|
||||
|
||||
/**
|
||||
* node_scaled_scene_buffer_from_node - return scaled_scene_buffer from node
|
||||
* @wlr_scene_node: wlr_scene_node from which to return data
|
||||
*/
|
||||
struct scaled_scene_buffer *node_scaled_scene_buffer_from_node(
|
||||
struct ssd_button *node_try_ssd_button_from_node(
|
||||
struct wlr_scene_node *wlr_scene_node);
|
||||
|
||||
#endif /* LABWC_NODE_DESCRIPTOR_H */
|
||||
|
|
|
|||
|
|
@ -5,6 +5,14 @@
|
|||
#include <stdbool.h>
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
struct output;
|
||||
|
||||
enum lab_cycle_dir {
|
||||
LAB_CYCLE_DIR_NONE,
|
||||
LAB_CYCLE_DIR_FORWARD,
|
||||
LAB_CYCLE_DIR_BACKWARD,
|
||||
};
|
||||
|
||||
/* TODO: add field with keyboard layout? */
|
||||
enum window_switcher_field_content {
|
||||
LAB_FIELD_NONE = 0,
|
||||
|
|
@ -37,7 +45,6 @@ struct window_switcher_field {
|
|||
struct buf;
|
||||
struct view;
|
||||
struct server;
|
||||
enum lab_cycle_dir;
|
||||
|
||||
/* Begin window switcher */
|
||||
void osd_begin(struct server *server, enum lab_cycle_dir direction);
|
||||
|
|
@ -56,10 +63,26 @@ void osd_field_get_content(struct window_switcher_field *field,
|
|||
struct buf *buf, struct view *view);
|
||||
|
||||
/* Used by rcxml.c when parsing the config */
|
||||
struct window_switcher_field *osd_field_create(void);
|
||||
void osd_field_arg_from_xml_node(struct window_switcher_field *field,
|
||||
const char *nodename, const char *content);
|
||||
bool osd_field_is_valid(struct window_switcher_field *field);
|
||||
void osd_field_free(struct window_switcher_field *field);
|
||||
|
||||
/* Internal API */
|
||||
struct osd_impl {
|
||||
/*
|
||||
* Create a scene-tree of OSD for an output.
|
||||
* This sets output->osd_scene.{items,tree}.
|
||||
*/
|
||||
void (*create)(struct output *output, struct wl_array *views);
|
||||
/*
|
||||
* Update output->osd_scene.tree to highlight
|
||||
* server->osd_state.cycle_view.
|
||||
*/
|
||||
void (*update)(struct output *output);
|
||||
};
|
||||
|
||||
extern struct osd_impl osd_classic_impl;
|
||||
extern struct osd_impl osd_thumbnail_impl;
|
||||
|
||||
#endif // LABWC_OSD_H
|
||||
|
|
|
|||
72
include/output.h
Normal file
72
include/output.h
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_OUTPUT_H
|
||||
#define LABWC_OUTPUT_H
|
||||
|
||||
#include <wlr/types/wlr_output.h>
|
||||
#include "common/edge.h"
|
||||
|
||||
#define LAB_NR_LAYERS (4)
|
||||
|
||||
struct output {
|
||||
struct wl_list link; /* server.outputs */
|
||||
struct server *server;
|
||||
struct wlr_output *wlr_output;
|
||||
struct wlr_output_state pending;
|
||||
struct wlr_scene_output *scene_output;
|
||||
struct wlr_scene_tree *layer_tree[LAB_NR_LAYERS];
|
||||
struct wlr_scene_tree *layer_popup_tree;
|
||||
struct wlr_scene_tree *osd_tree;
|
||||
struct wlr_scene_tree *session_lock_tree;
|
||||
struct wlr_scene_buffer *workspace_osd;
|
||||
|
||||
struct osd_scene {
|
||||
struct wl_array items; /* struct osd_scene_item */
|
||||
struct wlr_scene_tree *tree;
|
||||
} osd_scene;
|
||||
|
||||
/* In output-relative scene coordinates */
|
||||
struct wlr_box usable_area;
|
||||
|
||||
struct wl_list regions; /* struct region.link */
|
||||
|
||||
struct wl_listener destroy;
|
||||
struct wl_listener frame;
|
||||
struct wl_listener request_state;
|
||||
|
||||
bool gamma_lut_changed;
|
||||
};
|
||||
|
||||
#undef LAB_NR_LAYERS
|
||||
|
||||
void output_init(struct server *server);
|
||||
void output_finish(struct server *server);
|
||||
struct output *output_from_wlr_output(struct server *server,
|
||||
struct wlr_output *wlr_output);
|
||||
struct output *output_from_name(struct server *server, const char *name);
|
||||
struct output *output_nearest_to(struct server *server, int lx, int ly);
|
||||
struct output *output_nearest_to_cursor(struct server *server);
|
||||
|
||||
/**
|
||||
* output_get_adjacent() - get next output, in a given direction,
|
||||
* from a given output
|
||||
*
|
||||
* @output: reference output
|
||||
* @edge: direction in which to look for the nearest output
|
||||
* @wrap: if true, wrap around at layout edge
|
||||
*
|
||||
* Note: if output is NULL, the output nearest the cursor will be used as the
|
||||
* reference instead.
|
||||
*/
|
||||
struct output *output_get_adjacent(struct output *output,
|
||||
enum lab_edge edge, bool wrap);
|
||||
|
||||
bool output_is_usable(struct output *output);
|
||||
void output_update_usable_area(struct output *output);
|
||||
void output_update_all_usable_areas(struct server *server, bool layout_changed);
|
||||
bool output_get_tearing_allowance(struct output *output);
|
||||
struct wlr_box output_usable_area_in_layout_coords(struct output *output);
|
||||
void handle_output_power_manager_set_mode(struct wl_listener *listener,
|
||||
void *data);
|
||||
void output_enable_adaptive_sync(struct output *output, bool enabled);
|
||||
|
||||
#endif // LABWC_OUTPUT_H
|
||||
|
|
@ -2,24 +2,12 @@
|
|||
#ifndef LABWC_OVERLAY_H
|
||||
#define LABWC_OVERLAY_H
|
||||
|
||||
#include <wlr/util/box.h>
|
||||
#include "common/graphic-helpers.h"
|
||||
#include "regions.h"
|
||||
#include "view.h"
|
||||
#include "common/edge.h"
|
||||
|
||||
/* TODO: replace this with single lab_scene_rect */
|
||||
struct overlay_rect {
|
||||
struct wlr_scene_tree *tree;
|
||||
|
||||
bool bg_enabled;
|
||||
struct wlr_scene_rect *bg_rect;
|
||||
|
||||
bool border_enabled;
|
||||
struct lab_scene_rect *border_rect;
|
||||
};
|
||||
struct seat;
|
||||
|
||||
struct overlay {
|
||||
struct overlay_rect region_rect, edge_rect;
|
||||
struct lab_scene_rect *rect;
|
||||
|
||||
/* Represents currently shown or delayed overlay */
|
||||
struct {
|
||||
|
|
@ -27,7 +15,7 @@ struct overlay {
|
|||
struct region *region;
|
||||
|
||||
/* Snap-to-edge overlay */
|
||||
enum view_edge edge;
|
||||
enum lab_edge edge;
|
||||
struct output *output;
|
||||
} active;
|
||||
|
||||
|
|
@ -35,15 +23,13 @@ struct overlay {
|
|||
struct wl_event_source *timer;
|
||||
};
|
||||
|
||||
void overlay_reconfigure(struct seat *seat);
|
||||
|
||||
/* Calls overlay_hide() internally if there's no overlay to show */
|
||||
/*
|
||||
* Shows or updates an overlay when the grabbed window can be snapped to
|
||||
* a region or an output edge. Calls overlay_finish() otherwise.
|
||||
*/
|
||||
void overlay_update(struct seat *seat);
|
||||
|
||||
/* This function must be called when server->grabbed_view is destroyed */
|
||||
void overlay_hide(struct seat *seat);
|
||||
|
||||
/* This function is called to clean up the timer on exit */
|
||||
/* Destroys the overlay if it exists */
|
||||
void overlay_finish(struct seat *seat);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
#include <wlr/util/box.h>
|
||||
#include "view.h"
|
||||
|
||||
struct view;
|
||||
|
||||
bool placement_find_best(struct view *view, struct wlr_box *geometry);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_RESISTANCE_H
|
||||
#define LABWC_RESISTANCE_H
|
||||
#include "labwc.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <wlr/util/box.h>
|
||||
|
||||
struct view;
|
||||
|
||||
/**
|
||||
* resistance_unsnap_apply() - Apply resistance when dragging a
|
||||
|
|
|
|||
|
|
@ -5,12 +5,6 @@
|
|||
struct server;
|
||||
struct view;
|
||||
|
||||
enum resize_indicator_mode {
|
||||
LAB_RESIZE_INDICATOR_NEVER = 0,
|
||||
LAB_RESIZE_INDICATOR_ALWAYS,
|
||||
LAB_RESIZE_INDICATOR_NON_PIXEL
|
||||
};
|
||||
|
||||
void resize_indicator_reconfigure(struct server *server);
|
||||
void resize_indicator_show(struct view *view);
|
||||
void resize_indicator_update(struct view *view);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_SCALED_SCENE_BUFFER_H
|
||||
#define LABWC_SCALED_SCENE_BUFFER_H
|
||||
#ifndef LABWC_SCALED_BUFFER_H
|
||||
#define LABWC_SCALED_BUFFER_H
|
||||
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
|
|
@ -9,20 +9,20 @@
|
|||
struct wlr_buffer;
|
||||
struct wlr_scene_tree;
|
||||
struct lab_data_buffer;
|
||||
struct scaled_scene_buffer;
|
||||
struct scaled_buffer;
|
||||
|
||||
struct scaled_scene_buffer_impl {
|
||||
struct scaled_buffer_impl {
|
||||
/* Return a new buffer optimized for the new scale */
|
||||
struct lab_data_buffer *(*create_buffer)
|
||||
(struct scaled_scene_buffer *scaled_buffer, double scale);
|
||||
(struct scaled_buffer *scaled_buffer, double scale);
|
||||
/* Might be NULL or used for cleaning up */
|
||||
void (*destroy)(struct scaled_scene_buffer *scaled_buffer);
|
||||
void (*destroy)(struct scaled_buffer *scaled_buffer);
|
||||
/* Returns true if the two buffers are visually the same */
|
||||
bool (*equal)(struct scaled_scene_buffer *scaled_buffer_a,
|
||||
struct scaled_scene_buffer *scaled_buffer_b);
|
||||
bool (*equal)(struct scaled_buffer *scaled_buffer_a,
|
||||
struct scaled_buffer *scaled_buffer_b);
|
||||
};
|
||||
|
||||
struct scaled_scene_buffer {
|
||||
struct scaled_buffer {
|
||||
struct wlr_scene_buffer *scene_buffer;
|
||||
int width; /* unscaled, read only */
|
||||
int height; /* unscaled, read only */
|
||||
|
|
@ -35,7 +35,7 @@ struct scaled_scene_buffer {
|
|||
struct wl_list cache; /* struct scaled_buffer_cache_entry.link */
|
||||
struct wl_listener destroy;
|
||||
struct wl_listener outputs_update;
|
||||
const struct scaled_scene_buffer_impl *impl;
|
||||
const struct scaled_buffer_impl *impl;
|
||||
struct wl_list link; /* all_scaled_buffers */
|
||||
};
|
||||
|
||||
|
|
@ -78,22 +78,22 @@ struct scaled_scene_buffer {
|
|||
* to handle the majority of use cases where a view is moved between no more
|
||||
* than two different scales.
|
||||
*
|
||||
* scaled_scene_buffer will clean up automatically once the internal
|
||||
* scaled_buffer will clean up automatically once the internal
|
||||
* wlr_scene_buffer is being destroyed. If implementation->destroy is set
|
||||
* it will also get called so a consumer of this API may clean up its own
|
||||
* allocations.
|
||||
*
|
||||
* Besides caching buffers for each scale per scaled_scene_buffer, we also
|
||||
* store all the scaled_scene_buffers from all the implementers in a list
|
||||
* Besides caching buffers for each scale per scaled_buffer, we also
|
||||
* store all the scaled_buffers from all the implementers in a list
|
||||
* in order to reuse backing buffers for visually duplicated
|
||||
* scaled_scene_buffers found via impl->equal().
|
||||
* scaled_buffers found via impl->equal().
|
||||
*
|
||||
* All requested lab_data_buffers via impl->create_buffer() will be locked
|
||||
* during the lifetime of the buffer in the internal cache and unlocked
|
||||
* when being evacuated from the cache (due to LAB_SCALED_BUFFER_MAX_CACHE
|
||||
* or the internal wlr_scene_buffer being destroyed).
|
||||
*
|
||||
* If drop_buffer was set during creation of the scaled_scene_buffer, the
|
||||
* If drop_buffer was set during creation of the scaled_buffer, the
|
||||
* backing wlr_buffer behind a lab_data_buffer will also get dropped
|
||||
* (via wlr_buffer_drop). If there are no more locks (consumers) of the
|
||||
* respective buffer this will then cause the lab_data_buffer to be free'd.
|
||||
|
|
@ -103,21 +103,21 @@ struct scaled_scene_buffer {
|
|||
* destroyed until the buffer is evacuated from the internal cache and thus
|
||||
* unlocked.
|
||||
*
|
||||
* This allows using scaled_scene_buffer for an autoscaling font_buffer
|
||||
* This allows using scaled_buffer for an autoscaling font_buffer
|
||||
* (which gets free'd automatically) and also for theme components like
|
||||
* rounded corner images or button icons whose buffers only exist once but
|
||||
* are references by multiple windows with their own scaled_scene_buffers.
|
||||
* are references by multiple windows with their own scaled_buffers.
|
||||
*
|
||||
* The rough idea is: use drop_buffer = true for one-shot buffers and false
|
||||
* for buffers that should outlive the scaled_scene_buffer instance itself.
|
||||
* for buffers that should outlive the scaled_buffer instance itself.
|
||||
*/
|
||||
struct scaled_scene_buffer *scaled_scene_buffer_create(
|
||||
struct scaled_buffer *scaled_buffer_create(
|
||||
struct wlr_scene_tree *parent,
|
||||
const struct scaled_scene_buffer_impl *implementation,
|
||||
const struct scaled_buffer_impl *implementation,
|
||||
bool drop_buffer);
|
||||
|
||||
/**
|
||||
* scaled_scene_buffer_request_update - mark the buffer that needs to be
|
||||
* scaled_buffer_request_update - mark the buffer that needs to be
|
||||
* updated
|
||||
* @width: the width of the buffer to be rendered, in scene coordinates
|
||||
* @height: the height of the buffer to be rendered, in scene coordinates
|
||||
|
|
@ -125,22 +125,22 @@ struct scaled_scene_buffer *scaled_scene_buffer_create(
|
|||
* This function should be called when the states bound to the buffer are
|
||||
* updated and ready for rendering.
|
||||
*/
|
||||
void scaled_scene_buffer_request_update(struct scaled_scene_buffer *self,
|
||||
void scaled_buffer_request_update(struct scaled_buffer *self,
|
||||
int width, int height);
|
||||
|
||||
/**
|
||||
* scaled_scene_buffer_invalidate_sharing - clear the list of entire cached
|
||||
* scaled_scene_buffers used to share visually dupliated buffers. This should
|
||||
* scaled_buffer_invalidate_sharing - clear the list of entire cached
|
||||
* scaled_buffers used to share visually dupliated buffers. This should
|
||||
* be called on Reconfigure to force updates of newly created
|
||||
* scaled_scene_buffers rather than reusing ones created before Reconfigure.
|
||||
* scaled_buffers rather than reusing ones created before Reconfigure.
|
||||
*/
|
||||
void scaled_scene_buffer_invalidate_sharing(void);
|
||||
void scaled_buffer_invalidate_sharing(void);
|
||||
|
||||
/* Private */
|
||||
struct scaled_scene_buffer_cache_entry {
|
||||
struct wl_list link; /* struct scaled_scene_buffer.cache */
|
||||
struct scaled_buffer_cache_entry {
|
||||
struct wl_list link; /* struct scaled_buffer.cache */
|
||||
struct wlr_buffer *buffer;
|
||||
double scale;
|
||||
};
|
||||
|
||||
#endif /* LABWC_SCALED_SCENE_BUFFER_H */
|
||||
#endif /* LABWC_SCALED_BUFFER_H */
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
struct wlr_scene_tree;
|
||||
struct wlr_scene_buffer;
|
||||
struct scaled_scene_buffer;
|
||||
struct scaled_buffer;
|
||||
|
||||
struct scaled_font_buffer {
|
||||
struct wlr_scene_buffer *scene_buffer;
|
||||
|
|
@ -19,7 +19,7 @@ struct scaled_font_buffer {
|
|||
float color[4];
|
||||
float bg_color[4];
|
||||
struct font font;
|
||||
struct scaled_scene_buffer *scaled_buffer;
|
||||
struct scaled_buffer *scaled_buffer;
|
||||
|
||||
/*
|
||||
* The following fields are used only for the titlebar, where
|
||||
|
|
@ -34,7 +34,7 @@ struct scaled_font_buffer {
|
|||
|
||||
/**
|
||||
* Create an auto scaling font buffer, providing a wlr_scene_buffer node for
|
||||
* display. It gets destroyed automatically when the backing scaled_scene_buffer
|
||||
* display. It gets destroyed automatically when the backing scaled_buffer
|
||||
* is being destroyed which in turn happens automatically when the backing
|
||||
* wlr_scene_buffer (or one of its parents) is being destroyed.
|
||||
*
|
||||
|
|
@ -73,12 +73,4 @@ void scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text
|
|||
int max_width, struct font *font, const float *color,
|
||||
const float *bg_color);
|
||||
|
||||
/**
|
||||
* Update the max width of an existing auto scaling font buffer
|
||||
* and force a new render.
|
||||
*
|
||||
* No steps are taken to detect if its actually required to render a new buffer.
|
||||
*/
|
||||
void scaled_font_buffer_set_max_width(struct scaled_font_buffer *self, int max_width);
|
||||
|
||||
#endif /* LABWC_SCALED_FONT_BUFFER_H */
|
||||
|
|
@ -10,7 +10,7 @@ struct wlr_scene_node;
|
|||
struct wlr_scene_buffer;
|
||||
|
||||
struct scaled_icon_buffer {
|
||||
struct scaled_scene_buffer *scaled_buffer;
|
||||
struct scaled_buffer *scaled_buffer;
|
||||
struct wlr_scene_buffer *scene_buffer;
|
||||
struct server *server;
|
||||
/* for window icon */
|
||||
|
|
@ -34,7 +34,7 @@ struct scaled_icon_buffer {
|
|||
|
||||
/*
|
||||
* Create an auto scaling icon buffer, providing a wlr_scene_buffer node for
|
||||
* display. It gets destroyed automatically when the backing scaled_scene_buffer
|
||||
* display. It gets destroyed automatically when the backing scaled_buffer
|
||||
* is being destroyed which in turn happens automatically when the backing
|
||||
* wlr_scene_buffer (or one of its parents) is being destroyed.
|
||||
*/
|
||||
|
|
@ -48,7 +48,4 @@ void scaled_icon_buffer_set_view(struct scaled_icon_buffer *self,
|
|||
void scaled_icon_buffer_set_icon_name(struct scaled_icon_buffer *self,
|
||||
const char *icon_name);
|
||||
|
||||
/* Obtain scaled_icon_buffer from wlr_scene_node */
|
||||
struct scaled_icon_buffer *scaled_icon_buffer_from_node(struct wlr_scene_node *node);
|
||||
|
||||
#endif /* LABWC_SCALED_ICON_BUFFER_H */
|
||||
|
|
@ -2,15 +2,13 @@
|
|||
#ifndef LABWC_SCALED_IMG_BUFFER_H
|
||||
#define LABWC_SCALED_IMG_BUFFER_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
struct wlr_scene_tree;
|
||||
struct wlr_scene_node;
|
||||
struct wlr_scene_buffer;
|
||||
struct lab_img;
|
||||
|
||||
struct scaled_img_buffer {
|
||||
struct scaled_scene_buffer *scaled_buffer;
|
||||
struct scaled_buffer *scaled_buffer;
|
||||
struct wlr_scene_buffer *scene_buffer;
|
||||
struct lab_img *img;
|
||||
int width;
|
||||
|
|
@ -56,7 +54,7 @@ struct scaled_img_buffer {
|
|||
|
||||
/*
|
||||
* Create an auto scaling image buffer, providing a wlr_scene_buffer node for
|
||||
* display. It gets destroyed automatically when the backing scaled_scene_buffer
|
||||
* display. It gets destroyed automatically when the backing scaled_buffer
|
||||
* is being destroyed which in turn happens automatically when the backing
|
||||
* wlr_scene_buffer (or one of its parents) is being destroyed.
|
||||
*
|
||||
|
|
@ -66,7 +64,4 @@ struct scaled_img_buffer {
|
|||
struct scaled_img_buffer *scaled_img_buffer_create(struct wlr_scene_tree *parent,
|
||||
struct lab_img *img, int width, int height);
|
||||
|
||||
/* Obtain scaled_img_buffer from wlr_scene_node */
|
||||
struct scaled_img_buffer *scaled_img_buffer_from_node(struct wlr_scene_node *node);
|
||||
|
||||
#endif /* LABWC_SCALED_IMG_BUFFER_H */
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
#ifndef LABWC_SESSION_LOCK_H
|
||||
#define LABWC_SESSION_LOCK_H
|
||||
|
||||
#include <wlr/types/wlr_session_lock_v1.h>
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
struct output;
|
||||
struct server;
|
||||
|
|
|
|||
|
|
@ -2,21 +2,19 @@
|
|||
#ifndef LABWC_SNAP_CONSTRAINTS_H
|
||||
#define LABWC_SNAP_CONSTRAINTS_H
|
||||
|
||||
#include <wlr/util/edges.h>
|
||||
|
||||
#include "common/border.h"
|
||||
#include "view.h"
|
||||
#include "common/edge.h"
|
||||
|
||||
struct view;
|
||||
struct wlr_box;
|
||||
|
||||
void snap_constraints_set(struct view *view,
|
||||
enum wlr_edges direction, struct wlr_box geom);
|
||||
void snap_constraints_set(struct view *view, enum lab_edge direction,
|
||||
struct wlr_box geom);
|
||||
|
||||
void snap_constraints_invalidate(struct view *view);
|
||||
|
||||
void snap_constraints_update(struct view *view);
|
||||
|
||||
struct wlr_box snap_constraints_effective(struct view *view,
|
||||
enum wlr_edges direction, bool use_pending);
|
||||
enum lab_edge direction, bool use_pending);
|
||||
|
||||
#endif /* LABWC_SNAP_CONSTRAINTS_H */
|
||||
|
|
|
|||
|
|
@ -2,19 +2,19 @@
|
|||
#ifndef LABWC_SNAP_H
|
||||
#define LABWC_SNAP_H
|
||||
|
||||
#include "common/border.h"
|
||||
#include "view.h"
|
||||
#include "common/edge.h"
|
||||
|
||||
struct view;
|
||||
struct wlr_box;
|
||||
|
||||
void snap_move_to_edge(struct view *view,
|
||||
enum view_edge direction, bool snap_to_windows, int *dx, int *dy);
|
||||
enum lab_edge direction, bool snap_to_windows, int *dx, int *dy);
|
||||
|
||||
void snap_grow_to_next_edge(struct view *view,
|
||||
enum view_edge direction, struct wlr_box *geo);
|
||||
enum lab_edge direction, struct wlr_box *geo);
|
||||
|
||||
void snap_shrink_to_next_edge(struct view *view,
|
||||
enum view_edge direction, struct wlr_box *geo);
|
||||
enum lab_edge direction, struct wlr_box *geo);
|
||||
|
||||
void snap_invalidate_edge_cache(struct view *view);
|
||||
void snap_update_cache_geometry(struct view *view);
|
||||
|
|
|
|||
|
|
@ -3,51 +3,54 @@
|
|||
#define LABWC_SSD_INTERNAL_H
|
||||
|
||||
#include <wlr/util/box.h>
|
||||
#include "common/macros.h"
|
||||
#include "ssd.h"
|
||||
#include "common/border.h"
|
||||
#include "theme.h"
|
||||
#include "view.h"
|
||||
|
||||
#define FOR_EACH(tmp, ...) \
|
||||
{ \
|
||||
__typeof__(tmp) _x[] = { __VA_ARGS__, NULL }; \
|
||||
size_t _i = 0; \
|
||||
for ((tmp) = _x[_i]; _i < ARRAY_SIZE(_x) - 1; (tmp) = _x[++_i])
|
||||
|
||||
#define FOR_EACH_END }
|
||||
|
||||
struct ssd_button {
|
||||
struct view *view;
|
||||
enum ssd_part_type type;
|
||||
/*
|
||||
* Bitmap of lab_button_state that represents a combination of
|
||||
* hover/toggled/rounded states.
|
||||
*/
|
||||
uint8_t state_set;
|
||||
/*
|
||||
* Image buffers for each combination of hover/toggled/rounded states.
|
||||
* img_buffers[state_set] is displayed. Some of these can be NULL
|
||||
* (e.g. img_buffers[LAB_BS_ROUNDED] is set only for corner buttons).
|
||||
*
|
||||
* When "type" is LAB_SSD_BUTTON_WINDOW_ICON, these are all NULL and
|
||||
* window_icon is used instead.
|
||||
*/
|
||||
struct scaled_img_buffer *img_buffers[LAB_BS_ALL + 1];
|
||||
|
||||
struct scaled_icon_buffer *window_icon;
|
||||
|
||||
struct wl_listener destroy;
|
||||
};
|
||||
|
||||
struct ssd_sub_tree {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct wl_list parts; /* ssd_part.link */
|
||||
};
|
||||
|
||||
struct ssd_state_title_width {
|
||||
int width;
|
||||
bool truncated;
|
||||
};
|
||||
|
||||
/*
|
||||
* The scene-graph of SSD looks like below. The parentheses indicate the
|
||||
* type of each node (enum lab_node_type, stored in the node_descriptor
|
||||
* attached to the wlr_scene_node).
|
||||
*
|
||||
* ssd->tree (LAB_NODE_SSD_ROOT)
|
||||
* +--titlebar (LAB_NODE_TITLEBAR)
|
||||
* | +--inactive
|
||||
* | | +--background bar
|
||||
* | | +--left corner
|
||||
* | | +--right corner
|
||||
* | | +--title (LAB_NODE_TITLE)
|
||||
* | | +--iconify button (LAB_NODE_BUTTON_ICONIFY)
|
||||
* | | | +--normal close icon image
|
||||
* | | | +--hovered close icon image
|
||||
* | | | +--...
|
||||
* | | +--window icon (LAB_NODE_BUTTON_WINDOW_ICON)
|
||||
* | | | +--window icon image
|
||||
* | | +--...
|
||||
* | +--active
|
||||
* | +--...
|
||||
* +--border
|
||||
* | +--inactive
|
||||
* | | +--top
|
||||
* | | +--...
|
||||
* | +--active
|
||||
* | +--top
|
||||
* | +--...
|
||||
* +--shadow
|
||||
* | +--inactive
|
||||
* | | +--top
|
||||
* | | +--...
|
||||
* | +--active
|
||||
* | +--top
|
||||
* | +--...
|
||||
* +--extents
|
||||
* +--top
|
||||
* +--...
|
||||
*/
|
||||
struct ssd {
|
||||
struct view *view;
|
||||
struct wlr_scene_tree *tree;
|
||||
|
|
@ -80,33 +83,48 @@ struct ssd {
|
|||
struct wlr_box geometry;
|
||||
struct ssd_state_title {
|
||||
char *text;
|
||||
struct ssd_state_title_width active;
|
||||
struct ssd_state_title_width inactive;
|
||||
/* indexed by enum ssd_active_state */
|
||||
struct ssd_state_title_width dstates[2];
|
||||
} title;
|
||||
} state;
|
||||
|
||||
/* An invisible area around the view which allows resizing */
|
||||
struct ssd_sub_tree extents;
|
||||
struct ssd_extents_scene {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct wlr_scene_rect *top, *bottom, *left, *right;
|
||||
} extents;
|
||||
|
||||
/* The top of the view, containing buttons, title, .. */
|
||||
struct {
|
||||
struct ssd_titlebar_scene {
|
||||
int height;
|
||||
struct wlr_scene_tree *tree;
|
||||
struct ssd_sub_tree active;
|
||||
struct ssd_sub_tree inactive;
|
||||
struct ssd_titlebar_subtree {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct wlr_scene_buffer *corner_left;
|
||||
struct wlr_scene_buffer *corner_right;
|
||||
struct wlr_scene_buffer *bar;
|
||||
struct scaled_font_buffer *title;
|
||||
struct wl_list buttons_left; /* ssd_button.link */
|
||||
struct wl_list buttons_right; /* ssd_button.link */
|
||||
} subtrees[2]; /* indexed by enum ssd_active_state */
|
||||
} titlebar;
|
||||
|
||||
/* Borders allow resizing as well */
|
||||
struct {
|
||||
struct ssd_border_scene {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct ssd_sub_tree active;
|
||||
struct ssd_sub_tree inactive;
|
||||
struct ssd_border_subtree {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct wlr_scene_rect *top, *bottom, *left, *right;
|
||||
} subtrees[2]; /* indexed by enum ssd_active_state */
|
||||
} border;
|
||||
|
||||
struct {
|
||||
struct ssd_shadow_scene {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct ssd_sub_tree active;
|
||||
struct ssd_sub_tree inactive;
|
||||
struct ssd_shadow_subtree {
|
||||
struct wlr_scene_tree *tree;
|
||||
struct wlr_scene_buffer *top, *bottom, *left, *right,
|
||||
*top_left, *top_right, *bottom_left, *bottom_right;
|
||||
} subtrees[2]; /* indexed by enum ssd_active_state */
|
||||
} shadow;
|
||||
|
||||
/*
|
||||
|
|
@ -117,47 +135,39 @@ struct ssd {
|
|||
struct border margin;
|
||||
};
|
||||
|
||||
struct ssd_part {
|
||||
enum ssd_part_type type;
|
||||
|
||||
/* Buffer pointer. May be NULL */
|
||||
struct scaled_font_buffer *buffer;
|
||||
|
||||
/* This part represented in scene graph */
|
||||
struct ssd_button {
|
||||
struct wlr_scene_node *node;
|
||||
enum lab_node_type type;
|
||||
|
||||
struct wl_list link;
|
||||
};
|
||||
/*
|
||||
* Bitmap of lab_button_state that represents a combination of
|
||||
* hover/toggled/rounded states.
|
||||
*/
|
||||
uint8_t state_set;
|
||||
/*
|
||||
* Image buffers for each combination of hover/toggled/rounded states.
|
||||
* img_buffers[state_set] is displayed. Some of these can be NULL
|
||||
* (e.g. img_buffers[LAB_BS_ROUNDED] is set only for corner buttons).
|
||||
*
|
||||
* When the button type is LAB_NODE_BUTTON_WINDOW_ICON,
|
||||
* these are all NULL and window_icon is used instead.
|
||||
*/
|
||||
struct scaled_img_buffer *img_buffers[LAB_BS_ALL + 1];
|
||||
|
||||
struct ssd_hover_state {
|
||||
struct view *view;
|
||||
struct ssd_button *button;
|
||||
struct scaled_icon_buffer *window_icon;
|
||||
|
||||
struct wl_list link; /* ssd_titlebar_subtree.buttons_{left,right} */
|
||||
};
|
||||
|
||||
struct wlr_buffer;
|
||||
struct wlr_scene_tree;
|
||||
|
||||
/* SSD internal helpers to create various SSD elements */
|
||||
/* TODO: Replace some common args with a struct */
|
||||
struct ssd_part *add_scene_part(
|
||||
struct wl_list *part_list, enum ssd_part_type type);
|
||||
struct ssd_part *add_scene_rect(
|
||||
struct wl_list *list, enum ssd_part_type type,
|
||||
struct wlr_scene_tree *parent, int width, int height, int x, int y,
|
||||
float color[4]);
|
||||
struct ssd_part *add_scene_buffer(
|
||||
struct wl_list *list, enum ssd_part_type type,
|
||||
struct wlr_scene_tree *parent, struct wlr_buffer *buffer, int x, int y);
|
||||
struct ssd_part *add_scene_button(struct wl_list *part_list,
|
||||
enum ssd_part_type type, struct wlr_scene_tree *parent,
|
||||
struct lab_img *buffers[LAB_BS_ALL + 1], int x, int y,
|
||||
struct ssd_button *attach_ssd_button(struct wl_list *button_parts,
|
||||
enum lab_node_type type, struct wlr_scene_tree *parent,
|
||||
struct lab_img *imgs[LAB_BS_ALL + 1], int x, int y,
|
||||
struct view *view);
|
||||
|
||||
/* SSD internal helpers */
|
||||
struct ssd_part *ssd_get_part(
|
||||
struct wl_list *part_list, enum ssd_part_type type);
|
||||
void ssd_destroy_parts(struct wl_list *list);
|
||||
|
||||
/* SSD internal */
|
||||
void ssd_titlebar_create(struct ssd *ssd);
|
||||
void ssd_titlebar_update(struct ssd *ssd);
|
||||
|
|
|
|||
|
|
@ -2,8 +2,15 @@
|
|||
#ifndef LABWC_SSD_H
|
||||
#define LABWC_SSD_H
|
||||
|
||||
#include <wayland-server-core.h>
|
||||
#include "common/border.h"
|
||||
#include "common/node-type.h"
|
||||
#include "config/types.h"
|
||||
|
||||
enum ssd_active_state {
|
||||
SSD_INACTIVE = 0,
|
||||
SSD_ACTIVE = 1,
|
||||
};
|
||||
|
||||
#define FOR_EACH_ACTIVE_STATE(active) for (active = SSD_INACTIVE; active <= SSD_ACTIVE; active++)
|
||||
|
||||
struct wlr_cursor;
|
||||
|
||||
|
|
@ -14,64 +21,10 @@ struct wlr_cursor;
|
|||
*/
|
||||
#define SSD_SHADOW_INSET 0.3
|
||||
|
||||
/*
|
||||
* Sequence these according to the order they should be processed for
|
||||
* press and hover events. Bear in mind that some of their respective
|
||||
* interactive areas overlap, so for example buttons need to come before title.
|
||||
*/
|
||||
enum ssd_part_type {
|
||||
LAB_SSD_NONE = 0,
|
||||
|
||||
LAB_SSD_BUTTON_CLOSE = 1,
|
||||
LAB_SSD_BUTTON_MAXIMIZE,
|
||||
LAB_SSD_BUTTON_ICONIFY,
|
||||
LAB_SSD_BUTTON_WINDOW_ICON,
|
||||
LAB_SSD_BUTTON_WINDOW_MENU,
|
||||
LAB_SSD_BUTTON_SHADE,
|
||||
LAB_SSD_BUTTON_OMNIPRESENT,
|
||||
/* only for internal use */
|
||||
LAB_SSD_BUTTON_FIRST = LAB_SSD_BUTTON_CLOSE,
|
||||
LAB_SSD_BUTTON_LAST = LAB_SSD_BUTTON_OMNIPRESENT,
|
||||
LAB_SSD_BUTTON,
|
||||
|
||||
LAB_SSD_PART_TITLEBAR,
|
||||
LAB_SSD_PART_TITLEBAR_CORNER_RIGHT,
|
||||
LAB_SSD_PART_TITLEBAR_CORNER_LEFT,
|
||||
LAB_SSD_PART_TITLE,
|
||||
|
||||
/* shared by shadows, borders and extents */
|
||||
LAB_SSD_PART_CORNER_TOP_LEFT,
|
||||
LAB_SSD_PART_CORNER_TOP_RIGHT,
|
||||
LAB_SSD_PART_CORNER_BOTTOM_RIGHT,
|
||||
LAB_SSD_PART_CORNER_BOTTOM_LEFT,
|
||||
LAB_SSD_PART_TOP,
|
||||
LAB_SSD_PART_RIGHT,
|
||||
LAB_SSD_PART_BOTTOM,
|
||||
LAB_SSD_PART_LEFT,
|
||||
|
||||
LAB_SSD_CLIENT,
|
||||
LAB_SSD_FRAME,
|
||||
LAB_SSD_ROOT,
|
||||
LAB_SSD_MENU,
|
||||
LAB_SSD_OSD,
|
||||
LAB_SSD_LAYER_SURFACE,
|
||||
LAB_SSD_LAYER_SUBSURFACE,
|
||||
LAB_SSD_UNMANAGED,
|
||||
LAB_SSD_ALL,
|
||||
LAB_SSD_END_MARKER
|
||||
};
|
||||
|
||||
enum ssd_mode {
|
||||
LAB_SSD_MODE_INVALID,
|
||||
LAB_SSD_MODE_NONE,
|
||||
LAB_SSD_MODE_BORDER,
|
||||
LAB_SSD_MODE_FULL,
|
||||
};
|
||||
|
||||
/* Forward declare arguments */
|
||||
struct server;
|
||||
struct ssd;
|
||||
struct ssd_button;
|
||||
struct ssd_hover_state;
|
||||
struct view;
|
||||
struct wlr_scene;
|
||||
struct wlr_scene_node;
|
||||
|
|
@ -98,19 +51,20 @@ void ssd_set_titlebar(struct ssd *ssd, bool enabled);
|
|||
void ssd_enable_keybind_inhibit_indicator(struct ssd *ssd, bool enable);
|
||||
void ssd_enable_shade(struct ssd *ssd, bool enable);
|
||||
|
||||
struct ssd_hover_state *ssd_hover_state_new(void);
|
||||
void ssd_update_button_hover(struct wlr_scene_node *node,
|
||||
struct ssd_hover_state *hover_state);
|
||||
void ssd_update_hovered_button(struct server *server,
|
||||
struct wlr_scene_node *node);
|
||||
|
||||
enum ssd_part_type ssd_button_get_type(const struct ssd_button *button);
|
||||
struct view *ssd_button_get_view(const struct ssd_button *button);
|
||||
void ssd_button_free(struct ssd_button *button);
|
||||
|
||||
/* Public SSD helpers */
|
||||
enum ssd_part_type ssd_get_part_type(const struct ssd *ssd,
|
||||
struct wlr_scene_node *node, struct wlr_cursor *cursor);
|
||||
uint32_t ssd_resize_edges(enum ssd_part_type type);
|
||||
bool ssd_part_contains(enum ssd_part_type whole, enum ssd_part_type candidate);
|
||||
enum ssd_mode ssd_mode_parse(const char *mode);
|
||||
|
||||
/*
|
||||
* Returns a part type that represents a mouse context like "Top", "Left" and
|
||||
* "TRCorner" when the cursor is on the window border or resizing handle.
|
||||
*/
|
||||
enum lab_node_type ssd_get_resizing_type(const struct ssd *ssd,
|
||||
struct wlr_cursor *cursor);
|
||||
enum lab_ssd_mode ssd_mode_parse(const char *mode);
|
||||
|
||||
/* TODO: clean up / update */
|
||||
struct border ssd_thickness(struct view *view);
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@
|
|||
#define LABWC_THEME_H
|
||||
|
||||
#include <cairo.h>
|
||||
#include <wlr/render/wlr_renderer.h>
|
||||
#include "ssd.h"
|
||||
#include <stdbool.h>
|
||||
#include "common/node-type.h"
|
||||
|
||||
struct lab_img;
|
||||
|
||||
|
|
@ -41,11 +41,11 @@ struct theme_snapping_overlay {
|
|||
enum lab_button_state {
|
||||
LAB_BS_DEFAULT = 0,
|
||||
|
||||
LAB_BS_HOVERD = 1 << 0,
|
||||
LAB_BS_HOVERED = 1 << 0,
|
||||
LAB_BS_TOGGLED = 1 << 1,
|
||||
LAB_BS_ROUNDED = 1 << 2,
|
||||
|
||||
LAB_BS_ALL = LAB_BS_HOVERD | LAB_BS_TOGGLED | LAB_BS_ROUNDED,
|
||||
LAB_BS_ALL = LAB_BS_HOVERED | LAB_BS_TOGGLED | LAB_BS_ROUNDED,
|
||||
};
|
||||
|
||||
struct theme_background {
|
||||
|
|
@ -83,14 +83,14 @@ struct theme {
|
|||
|
||||
/*
|
||||
* Themes/textures for each active/inactive window. Indexed by
|
||||
* THEME_INACTIVE and THEME_ACTIVE.
|
||||
* ssd_active_state.
|
||||
*/
|
||||
struct {
|
||||
/* title background pattern (solid or gradient) */
|
||||
struct theme_background title_bg;
|
||||
|
||||
/* TODO: add toggled/hover/pressed/disabled colors for buttons */
|
||||
float button_colors[LAB_SSD_BUTTON_LAST + 1][4];
|
||||
float button_colors[LAB_NODE_BUTTON_LAST + 1][4];
|
||||
|
||||
float border_color[4];
|
||||
float toggled_keybinds_color[4];
|
||||
|
|
@ -104,12 +104,12 @@ struct theme {
|
|||
* The texture of a window buttons for each hover/toggled/rounded
|
||||
* state. This can be accessed like:
|
||||
*
|
||||
* buttons[LAB_SSD_BUTTON_ICONIFY][LAB_BS_HOVERD | LAB_BS_TOGGLED]
|
||||
* buttons[LAB_NODE_BUTTON_ICONIFY][LAB_BS_HOVERED | LAB_BS_TOGGLED]
|
||||
*
|
||||
* Elements in buttons[0] are all NULL since LAB_SSD_BUTTON_FIRST is 1.
|
||||
* Elements in buttons[0] are all NULL since LAB_NODE_BUTTON_FIRST is 1.
|
||||
*/
|
||||
struct lab_img *button_imgs
|
||||
[LAB_SSD_BUTTON_LAST + 1][LAB_BS_ALL + 1];
|
||||
[LAB_NODE_BUTTON_LAST + 1][LAB_BS_ALL + 1];
|
||||
|
||||
/*
|
||||
* The titlebar background is specified as a cairo_pattern
|
||||
|
|
@ -164,13 +164,39 @@ struct theme {
|
|||
float osd_border_color[4];
|
||||
float osd_label_text_color[4];
|
||||
|
||||
int osd_window_switcher_width;
|
||||
int osd_window_switcher_padding;
|
||||
int osd_window_switcher_item_padding_x;
|
||||
int osd_window_switcher_item_padding_y;
|
||||
int osd_window_switcher_item_active_border_width;
|
||||
int osd_window_switcher_item_icon_size;
|
||||
bool osd_window_switcher_width_is_percent;
|
||||
struct window_switcher_classic_theme {
|
||||
int width;
|
||||
int padding;
|
||||
int item_padding_x;
|
||||
int item_padding_y;
|
||||
int item_active_border_width;
|
||||
float item_active_border_color[4];
|
||||
float item_active_bg_color[4];
|
||||
int item_icon_size;
|
||||
bool width_is_percent;
|
||||
|
||||
/*
|
||||
* Not set in rc.xml/themerc, but derived from the tallest
|
||||
* titlebar object plus 2 * window_titlebar_padding_height
|
||||
*/
|
||||
int item_height;
|
||||
} osd_window_switcher_classic;
|
||||
|
||||
struct window_switcher_thumbnail_theme {
|
||||
int max_width;
|
||||
int padding;
|
||||
int item_width;
|
||||
int item_height;
|
||||
int item_padding;
|
||||
int item_active_border_width;
|
||||
float item_active_border_color[4];
|
||||
float item_active_bg_color[4];
|
||||
int item_icon_size;
|
||||
bool max_width_is_percent;
|
||||
|
||||
int title_height;
|
||||
} osd_window_switcher_thumbnail;
|
||||
|
||||
int osd_window_switcher_preview_border_width;
|
||||
float osd_window_switcher_preview_border_color[3][4];
|
||||
|
||||
|
|
@ -181,20 +207,11 @@ struct theme {
|
|||
struct theme_snapping_overlay
|
||||
snapping_overlay_region, snapping_overlay_edge;
|
||||
|
||||
/*
|
||||
* Not set in rc.xml/themerc, but derived from the tallest titlebar
|
||||
* object plus 2 * window_titlebar_padding_height
|
||||
*/
|
||||
int osd_window_switcher_item_height;
|
||||
|
||||
/* magnifier */
|
||||
float mag_border_color[4];
|
||||
int mag_border_width;
|
||||
};
|
||||
|
||||
#define THEME_INACTIVE 0
|
||||
#define THEME_ACTIVE 1
|
||||
|
||||
struct server;
|
||||
|
||||
/**
|
||||
|
|
|
|||
14
include/translate.h
Normal file
14
include/translate.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef LABWC_TRANSLATE_H
|
||||
#define LABWC_TRANSLATE_H
|
||||
#include "config.h"
|
||||
|
||||
#if HAVE_NLS
|
||||
#include <libintl.h>
|
||||
#include <locale.h>
|
||||
#define _ gettext
|
||||
#else
|
||||
#define _(s) (s)
|
||||
#endif
|
||||
|
||||
#endif /* LABWC_TRANSLATE_H */
|
||||
154
include/view.h
154
include/view.h
|
|
@ -2,16 +2,20 @@
|
|||
#ifndef LABWC_VIEW_H
|
||||
#define LABWC_VIEW_H
|
||||
|
||||
#include "config/rcxml.h"
|
||||
#include "config.h"
|
||||
#include "ssd.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <wayland-util.h>
|
||||
#include <wlr/util/box.h>
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
#include "common/three-state.h"
|
||||
#include "common/edge.h"
|
||||
#include "config.h"
|
||||
#include "config/types.h"
|
||||
|
||||
/*
|
||||
* Default minimal window size. Clients can explicitly set smaller values via
|
||||
* e.g. xdg_toplevel::set_min_size.
|
||||
*/
|
||||
#define LAB_MIN_VIEW_WIDTH 100
|
||||
#define LAB_MIN_VIEW_HEIGHT 60
|
||||
|
||||
/*
|
||||
|
|
@ -28,7 +32,6 @@
|
|||
* In labwc, a view is a container for surfaces which can be moved around by
|
||||
* the user. In practice this means XDG toplevel and XWayland windows.
|
||||
*/
|
||||
|
||||
enum view_type {
|
||||
LAB_XDG_SHELL_VIEW,
|
||||
#if HAVE_XWAYLAND
|
||||
|
|
@ -59,16 +62,6 @@ enum view_axis {
|
|||
VIEW_AXIS_INVALID = (1 << 2),
|
||||
};
|
||||
|
||||
enum view_edge {
|
||||
VIEW_EDGE_INVALID = 0,
|
||||
|
||||
VIEW_EDGE_LEFT,
|
||||
VIEW_EDGE_RIGHT,
|
||||
VIEW_EDGE_UP,
|
||||
VIEW_EDGE_DOWN,
|
||||
VIEW_EDGE_CENTER,
|
||||
};
|
||||
|
||||
enum view_wants_focus {
|
||||
/* View does not want focus */
|
||||
VIEW_WANTS_FOCUS_NEVER = 0,
|
||||
|
|
@ -89,33 +82,6 @@ enum view_wants_focus {
|
|||
VIEW_WANTS_FOCUS_UNLIKELY,
|
||||
};
|
||||
|
||||
/*
|
||||
* Window types are based on the NET_WM constants from X11. See:
|
||||
* https://specifications.freedesktop.org/wm-spec/1.4/ar01s05.html#id-1.6.7
|
||||
*
|
||||
* The enum constants are intended to match wlr_xwayland_net_wm_window_type.
|
||||
* Redefining the same constants here may seem redundant, but is necessary
|
||||
* to make them available even in builds with xwayland support disabled.
|
||||
*/
|
||||
enum window_type {
|
||||
NET_WM_WINDOW_TYPE_DESKTOP = 0,
|
||||
NET_WM_WINDOW_TYPE_DOCK,
|
||||
NET_WM_WINDOW_TYPE_TOOLBAR,
|
||||
NET_WM_WINDOW_TYPE_MENU,
|
||||
NET_WM_WINDOW_TYPE_UTILITY,
|
||||
NET_WM_WINDOW_TYPE_SPLASH,
|
||||
NET_WM_WINDOW_TYPE_DIALOG,
|
||||
NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
|
||||
NET_WM_WINDOW_TYPE_POPUP_MENU,
|
||||
NET_WM_WINDOW_TYPE_TOOLTIP,
|
||||
NET_WM_WINDOW_TYPE_NOTIFICATION,
|
||||
NET_WM_WINDOW_TYPE_COMBO,
|
||||
NET_WM_WINDOW_TYPE_DND,
|
||||
NET_WM_WINDOW_TYPE_NORMAL,
|
||||
|
||||
WINDOW_TYPE_LEN
|
||||
};
|
||||
|
||||
struct view;
|
||||
struct wlr_surface;
|
||||
struct foreign_toplevel;
|
||||
|
|
@ -140,7 +106,6 @@ struct view_size_hints {
|
|||
struct view_impl {
|
||||
void (*configure)(struct view *view, struct wlr_box geo);
|
||||
void (*close)(struct view *view);
|
||||
const char *(*get_string_prop)(struct view *view, const char *prop);
|
||||
void (*map)(struct view *view);
|
||||
void (*set_activated)(struct view *view, bool activated);
|
||||
void (*set_fullscreen)(struct view *view, bool fullscreen);
|
||||
|
|
@ -165,7 +130,7 @@ struct view_impl {
|
|||
bool (*has_strut_partial)(struct view *self);
|
||||
/* returns true if view declared itself a window type */
|
||||
bool (*contains_window_type)(struct view *view,
|
||||
enum window_type window_type);
|
||||
enum lab_window_type window_type);
|
||||
/* returns the client pid that this view belongs to */
|
||||
pid_t (*get_pid)(struct view *view);
|
||||
};
|
||||
|
|
@ -207,21 +172,24 @@ struct view {
|
|||
struct wlr_scene_tree *scene_tree;
|
||||
struct wlr_scene_tree *content_tree;
|
||||
|
||||
/* These are never NULL and an empty string is set instead. */
|
||||
char *title;
|
||||
char *app_id; /* WM_CLASS for xwayland windows */
|
||||
|
||||
bool mapped;
|
||||
bool been_mapped;
|
||||
bool ssd_enabled;
|
||||
bool ssd_titlebar_hidden;
|
||||
enum lab_ssd_mode ssd_mode;
|
||||
enum ssd_preference ssd_preference;
|
||||
bool shaded;
|
||||
bool minimized;
|
||||
enum view_axis maximized;
|
||||
bool fullscreen;
|
||||
bool tearing_hint;
|
||||
enum three_state force_tearing;
|
||||
enum lab_tristate force_tearing;
|
||||
bool visible_on_all_workspaces;
|
||||
enum view_edge tiled;
|
||||
uint32_t edges_visible; /* enum wlr_edges bitset */
|
||||
bool inhibits_keybinds;
|
||||
enum lab_edge tiled;
|
||||
enum lab_edge edges_visible;
|
||||
bool inhibits_keybinds; /* also inhibits mousebinds */
|
||||
xkb_layout_index_t keyboard_layout;
|
||||
|
||||
/* Pointer to an output owned struct region, may be NULL */
|
||||
|
|
@ -314,18 +282,18 @@ struct view_query {
|
|||
struct wl_list link;
|
||||
char *identifier;
|
||||
char *title;
|
||||
int window_type;
|
||||
enum lab_window_type window_type;
|
||||
char *sandbox_engine;
|
||||
char *sandbox_app_id;
|
||||
enum three_state shaded;
|
||||
enum lab_tristate shaded;
|
||||
enum view_axis maximized;
|
||||
enum three_state iconified;
|
||||
enum three_state focused;
|
||||
enum three_state omnipresent;
|
||||
enum view_edge tiled;
|
||||
enum lab_tristate iconified;
|
||||
enum lab_tristate focused;
|
||||
enum lab_tristate omnipresent;
|
||||
enum lab_edge tiled;
|
||||
char *tiled_region;
|
||||
char *desktop;
|
||||
enum ssd_mode decoration;
|
||||
enum lab_ssd_mode decoration;
|
||||
char *monitor;
|
||||
};
|
||||
|
||||
|
|
@ -339,28 +307,6 @@ struct xdg_toplevel_view {
|
|||
struct wl_listener new_popup;
|
||||
};
|
||||
|
||||
/* All criteria is applied in AND logic */
|
||||
enum lab_view_criteria {
|
||||
/* No filter -> all focusable views */
|
||||
LAB_VIEW_CRITERIA_NONE = 0,
|
||||
|
||||
/*
|
||||
* Includes always-on-top views, e.g.
|
||||
* what is visible on the current workspace
|
||||
*/
|
||||
LAB_VIEW_CRITERIA_CURRENT_WORKSPACE = 1 << 0,
|
||||
|
||||
/* Positive criteria */
|
||||
LAB_VIEW_CRITERIA_FULLSCREEN = 1 << 1,
|
||||
LAB_VIEW_CRITERIA_ALWAYS_ON_TOP = 1 << 2,
|
||||
LAB_VIEW_CRITERIA_ROOT_TOPLEVEL = 1 << 3,
|
||||
|
||||
/* Negative criteria */
|
||||
LAB_VIEW_CRITERIA_NO_ALWAYS_ON_TOP = 1 << 6,
|
||||
LAB_VIEW_CRITERIA_NO_SKIP_WINDOW_SWITCHER = 1 << 7,
|
||||
LAB_VIEW_CRITERIA_NO_OMNIPRESENT = 1 << 8,
|
||||
};
|
||||
|
||||
/**
|
||||
* view_from_wlr_surface() - returns the view associated with a
|
||||
* wlr_surface, or NULL if the surface has no associated view.
|
||||
|
|
@ -482,16 +428,11 @@ void view_array_append(struct server *server, struct wl_array *views,
|
|||
enum lab_view_criteria criteria);
|
||||
|
||||
enum view_wants_focus view_wants_focus(struct view *view);
|
||||
bool view_contains_window_type(struct view *view, enum window_type window_type);
|
||||
|
||||
/**
|
||||
* view_edge_invert() - select the opposite of a provided edge
|
||||
*
|
||||
* VIEW_EDGE_CENTER and VIEW_EDGE_INVALID both map to VIEW_EDGE_INVALID.
|
||||
*
|
||||
* @edge: edge to be inverted
|
||||
*/
|
||||
enum view_edge view_edge_invert(enum view_edge edge);
|
||||
/* If view is NULL, the size of SSD is not considered */
|
||||
struct wlr_box view_get_edge_snap_box(struct view *view, struct output *output,
|
||||
enum lab_edge edge);
|
||||
struct wlr_box view_get_region_snap_box(struct view *view, struct region *region);
|
||||
|
||||
/**
|
||||
* view_is_focusable() - Check whether or not a view can be focused
|
||||
|
|
@ -513,11 +454,15 @@ bool view_is_focusable(struct view *view);
|
|||
*/
|
||||
void view_offer_focus(struct view *view);
|
||||
|
||||
struct wlr_box view_get_edge_snap_box(struct view *view, struct output *output,
|
||||
enum lab_edge edge);
|
||||
|
||||
void mappable_connect(struct mappable *mappable, struct wlr_surface *surface,
|
||||
wl_notify_func_t notify_map, wl_notify_func_t notify_unmap);
|
||||
void mappable_disconnect(struct mappable *mappable);
|
||||
|
||||
void view_toggle_keybinds(struct view *view);
|
||||
bool view_inhibits_actions(struct view *view, struct wl_list *actions);
|
||||
|
||||
void view_set_activated(struct view *view, bool activated);
|
||||
void view_set_output(struct view *view, struct output *output);
|
||||
|
|
@ -541,7 +486,7 @@ void view_moved(struct view *view);
|
|||
void view_minimize(struct view *view, bool minimized);
|
||||
bool view_compute_centered_position(struct view *view,
|
||||
const struct wlr_box *ref, int w, int h, int *x, int *y);
|
||||
void view_set_fallback_natural_geometry(struct view *view);
|
||||
struct wlr_box view_get_fallback_natural_geometry(struct view *view);
|
||||
void view_store_natural_geometry(struct view *view);
|
||||
|
||||
/**
|
||||
|
|
@ -572,10 +517,10 @@ void view_center(struct view *view, const struct wlr_box *ref);
|
|||
* @policy: placement policy to apply
|
||||
*/
|
||||
void view_place_by_policy(struct view *view, bool allow_cursor,
|
||||
enum view_placement_policy policy);
|
||||
enum lab_placement_policy policy);
|
||||
void view_constrain_size_to_that_of_usable_area(struct view *view);
|
||||
|
||||
void view_restore_to(struct view *view, struct wlr_box geometry);
|
||||
void view_set_maximized(struct view *view, enum view_axis maximized);
|
||||
void view_set_untiled(struct view *view);
|
||||
void view_maximize(struct view *view, enum view_axis axis,
|
||||
bool store_natural_geometry);
|
||||
|
|
@ -595,24 +540,22 @@ bool view_is_tiled(struct view *view);
|
|||
bool view_is_tiled_and_notify_tiled(struct view *view);
|
||||
bool view_is_floating(struct view *view);
|
||||
void view_move_to_workspace(struct view *view, struct workspace *workspace);
|
||||
enum ssd_mode view_get_ssd_mode(struct view *view);
|
||||
void view_set_ssd_mode(struct view *view, enum ssd_mode mode);
|
||||
void view_set_decorations(struct view *view, enum ssd_mode mode, bool force_ssd);
|
||||
bool view_titlebar_visible(struct view *view);
|
||||
void view_set_ssd_mode(struct view *view, enum lab_ssd_mode mode);
|
||||
void view_set_decorations(struct view *view, enum lab_ssd_mode mode, bool force_ssd);
|
||||
void view_toggle_fullscreen(struct view *view);
|
||||
void view_invalidate_last_layout_geometry(struct view *view);
|
||||
void view_adjust_for_layout_change(struct view *view);
|
||||
void view_move_to_edge(struct view *view, enum view_edge direction, bool snap_to_windows);
|
||||
void view_grow_to_edge(struct view *view, enum view_edge direction);
|
||||
void view_shrink_to_edge(struct view *view, enum view_edge direction);
|
||||
void view_snap_to_edge(struct view *view, enum view_edge direction,
|
||||
bool across_outputs, bool store_natural_geometry);
|
||||
void view_move_to_edge(struct view *view, enum lab_edge direction, bool snap_to_windows);
|
||||
void view_grow_to_edge(struct view *view, enum lab_edge direction);
|
||||
void view_shrink_to_edge(struct view *view, enum lab_edge direction);
|
||||
void view_snap_to_edge(struct view *view, enum lab_edge direction,
|
||||
bool across_outputs, bool combine, bool store_natural_geometry);
|
||||
void view_snap_to_region(struct view *view, struct region *region, bool store_natural_geometry);
|
||||
void view_move_to_output(struct view *view, struct output *output);
|
||||
|
||||
void view_move_to_front(struct view *view);
|
||||
void view_move_to_back(struct view *view);
|
||||
struct view *view_get_root(struct view *view);
|
||||
void view_append_children(struct view *view, struct wl_array *children);
|
||||
|
||||
/**
|
||||
* view_get_modal_dialog() - returns any modal dialog found among this
|
||||
|
|
@ -631,11 +574,9 @@ bool view_on_output(struct view *view, struct output *output);
|
|||
*/
|
||||
bool view_has_strut_partial(struct view *view);
|
||||
|
||||
const char *view_get_string_prop(struct view *view, const char *prop);
|
||||
void view_update_title(struct view *view);
|
||||
void view_update_app_id(struct view *view);
|
||||
void view_set_title(struct view *view, const char *title);
|
||||
void view_set_app_id(struct view *view, const char *app_id);
|
||||
void view_reload_ssd(struct view *view);
|
||||
int view_get_min_width(void);
|
||||
|
||||
void view_set_shade(struct view *view, bool shaded);
|
||||
|
||||
|
|
@ -654,8 +595,7 @@ void view_init(struct view *view);
|
|||
void view_destroy(struct view *view);
|
||||
|
||||
enum view_axis view_axis_parse(const char *direction);
|
||||
enum view_edge view_edge_parse(const char *direction);
|
||||
enum view_placement_policy view_placement_parse(const char *policy);
|
||||
enum lab_placement_policy view_placement_parse(const char *policy);
|
||||
|
||||
/* xdg.c */
|
||||
struct wlr_xdg_surface *xdg_surface_from_view(struct view *view);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
#include <wayland-util.h>
|
||||
#include "config/types.h"
|
||||
|
||||
enum window_rule_event {
|
||||
LAB_WINDOW_RULE_EVENT_ON_FIRST_MAP = 0,
|
||||
|
|
@ -24,7 +25,7 @@ enum property {
|
|||
struct window_rule {
|
||||
char *identifier;
|
||||
char *title;
|
||||
int window_type;
|
||||
enum lab_window_type window_type;
|
||||
char *sandbox_engine;
|
||||
char *sandbox_app_id;
|
||||
bool match_once;
|
||||
|
|
|
|||
|
|
@ -65,8 +65,6 @@ void xwayland_unmanaged_create(struct server *server,
|
|||
void xwayland_view_create(struct server *server,
|
||||
struct wlr_xwayland_surface *xsurface, bool mapped);
|
||||
|
||||
struct wlr_xwayland_surface *xwayland_surface_from_view(struct view *view);
|
||||
|
||||
void xwayland_server_init(struct server *server,
|
||||
struct wlr_compositor *compositor);
|
||||
void xwayland_server_finish(struct server *server);
|
||||
|
|
|
|||
21
meson.build
21
meson.build
|
|
@ -1,7 +1,7 @@
|
|||
project(
|
||||
'labwc',
|
||||
'c',
|
||||
version: '0.9.0',
|
||||
version: '0.9.2',
|
||||
license: 'GPL-2.0-only',
|
||||
meson_version: '>=0.59.0',
|
||||
default_options: [
|
||||
|
|
@ -127,13 +127,24 @@ conf_data.set10('HAVE_RSVG', have_rsvg)
|
|||
conf_data.set10('HAVE_LIBSFDO', have_libsfdo)
|
||||
|
||||
foreach sym : ['LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY', 'LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG']
|
||||
conf_data.set10('HAVE_' + sym, cc.has_header_symbol('libinput.h', sym, dependencies: input))
|
||||
has_sym = input.type_name() != 'internal' \
|
||||
and cc.has_header_symbol('libinput.h', sym, dependencies: input)
|
||||
conf_data.set10('HAVE_' + sym, has_sym)
|
||||
endforeach
|
||||
|
||||
if get_option('static_analyzer').enabled()
|
||||
add_project_arguments(['-fanalyzer'], language: 'c')
|
||||
endif
|
||||
|
||||
link_args = []
|
||||
if get_option('sections').enabled()
|
||||
add_project_arguments(['-ffunction-sections'], language: 'c')
|
||||
link_args += [
|
||||
'-Wl,--gc-sections',
|
||||
'-Wl,--print-gc-sections',
|
||||
]
|
||||
endif
|
||||
|
||||
msgfmt = find_program('msgfmt', required: get_option('nls'))
|
||||
if msgfmt.found()
|
||||
source_root = meson.current_source_dir()
|
||||
|
|
@ -180,6 +191,7 @@ endif
|
|||
subdir('include')
|
||||
subdir('src')
|
||||
subdir('docs')
|
||||
subdir('clients')
|
||||
|
||||
dep_cmocka = dependency('cmocka', required: get_option('test'))
|
||||
if dep_cmocka.found()
|
||||
|
|
@ -192,16 +204,13 @@ executable(
|
|||
include_directories: [labwc_inc],
|
||||
dependencies: labwc_deps,
|
||||
install: true,
|
||||
link_args: link_args,
|
||||
)
|
||||
|
||||
install_data('data/labwc.desktop', install_dir: get_option('datadir') / 'wayland-sessions')
|
||||
|
||||
install_data('data/labwc-portals.conf', install_dir: get_option('datadir') / 'xdg-desktop-portal')
|
||||
|
||||
# TODO: move this to clients/meson.build after the labnag PR
|
||||
clients = files('clients/lab-sensible-terminal')
|
||||
install_data(clients, install_dir: get_option('bindir'))
|
||||
|
||||
icons = ['labwc-symbolic.svg', 'labwc.svg']
|
||||
foreach icon : icons
|
||||
icon_path = join_paths('data', icon)
|
||||
|
|
|
|||
|
|
@ -5,3 +5,4 @@ option('icon', type: 'feature', value: 'enabled', description: 'Enable window ic
|
|||
option('nls', type: 'feature', value: 'auto', description: 'Enable native language support')
|
||||
option('static_analyzer', type: 'feature', value: 'disabled', description: 'Run gcc static analyzer')
|
||||
option('test', type: 'feature', value: 'disabled', description: 'Run tests')
|
||||
option('sections', type: 'feature', value: 'disabled', description: 'Show unused functions')
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
ar ca cs da de el es et eu fa fi fr gl hu id it ja ka ko lt ms nl pa pl pt pt_BR ru sk sv tr uk zh_CN
|
||||
ar ca cs da de el es et eu fa fi fr gl hu id it ja ka ko lt ms nl pa pl pt pt_BR ru sk sv tr uk zh_CN zh_TW
|
||||
|
|
|
|||
10
po/ar.po
10
po/ar.po
|
|
@ -8,14 +8,16 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-09-23 20:01+0000\n"
|
||||
"PO-Revision-Date: 2025-07-17 07:22+0000\n"
|
||||
"Last-Translator: Abdullah Albaroty <albaroty@gmail.com>\n"
|
||||
"Language-Team: Arabic <https://translate.lxqt-project.org/projects/labwc/labwc/ar/>\n"
|
||||
"Language-Team: Arabic <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/ar/>\n"
|
||||
"Language: ar\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"X-Generator: Weblate 4.2.1\n"
|
||||
|
||||
#: src/menu/menu.c:1016
|
||||
|
|
@ -24,7 +26,7 @@ msgstr "اذهب هناك..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "الطرفية"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
9
po/ca.po
9
po/ca.po
|
|
@ -8,9 +8,10 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2025-03-29 11:25+0000\n"
|
||||
"Last-Translator: Davidmp <opensusecatala@gmail.com>\n"
|
||||
"Language-Team: Catalan <https://translate.lxqt-project.org/projects/labwc/labwc/ca/>\n"
|
||||
"PO-Revision-Date: 2025-10-11 20:01+0000\n"
|
||||
"Last-Translator: alvaroelpob <alvaropobladoresteban9@gmail.com>\n"
|
||||
"Language-Team: Catalan <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/ca/>\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
|
@ -24,7 +25,7 @@ msgstr "Ves-hi..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Terminal"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
23
po/cs.po
23
po/cs.po
|
|
@ -8,29 +8,32 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-03-02 02:00+0100\n"
|
||||
"Last-Translator: zenobit <zenobit@disroot.org>\n"
|
||||
"Language-Team: Czech <zenobit@disroot.org>\n"
|
||||
"PO-Revision-Date: 2025-10-11 20:01+0000\n"
|
||||
"Last-Translator: p-bo <pavel.borecki@gmail.com>\n"
|
||||
"Language-Team: Czech <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/cs/>\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.2.1\n"
|
||||
|
||||
#: src/menu/menu.c:1016
|
||||
msgid "Go there..."
|
||||
msgstr ""
|
||||
msgstr "Přejít tam..."
|
||||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Terminál"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
msgstr "Překonfigurovat"
|
||||
msgstr "Přenastavit"
|
||||
|
||||
#: src/menu/menu.c:1042
|
||||
msgid "Exit"
|
||||
msgstr "Odejít"
|
||||
msgstr "Ukončit"
|
||||
|
||||
#: src/menu/menu.c:1056
|
||||
msgid "Minimize"
|
||||
|
|
@ -46,7 +49,7 @@ msgstr "Na celou obrazovku"
|
|||
|
||||
#: src/menu/menu.c:1062
|
||||
msgid "Roll Up/Down"
|
||||
msgstr "Rolovat nahoru/dolů"
|
||||
msgstr "Posouvat nahoru/dolů"
|
||||
|
||||
#: src/menu/menu.c:1064
|
||||
msgid "Decorations"
|
||||
|
|
@ -66,11 +69,11 @@ msgstr "Posunout doprava"
|
|||
|
||||
#: src/menu/menu.c:1083
|
||||
msgid "Always on Visible Workspace"
|
||||
msgstr "Vždy na viditelné Pracovní Ploše"
|
||||
msgstr "Vždy na viditelné Pracovní ploše"
|
||||
|
||||
#: src/menu/menu.c:1086
|
||||
msgid "Workspace"
|
||||
msgstr "Pracovní Plocha"
|
||||
msgstr "Pracovní plocha"
|
||||
|
||||
#: src/menu/menu.c:1089
|
||||
msgid "Close"
|
||||
|
|
|
|||
7
po/de.po
7
po/de.po
|
|
@ -8,9 +8,10 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-11-05 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-08-15 20:01+0000\n"
|
||||
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
|
||||
"Language-Team: German <https://translate.lxqt-project.org/projects/labwc/labwc/de/>\n"
|
||||
"Language-Team: German <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/de/>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
|
@ -24,7 +25,7 @@ msgstr "Dorthin gehen..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Terminal"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
9
po/el.po
9
po/el.po
|
|
@ -8,9 +8,10 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-09-25 20:01+0000\n"
|
||||
"Last-Translator: Giannis Antypas <gianni.antypas@gmail.com>\n"
|
||||
"Language-Team: Greek <https://translate.lxqt-project.org/projects/labwc/labwc/el/>\n"
|
||||
"PO-Revision-Date: 2025-08-02 08:01+0000\n"
|
||||
"Last-Translator: Dimitrios Glentadakis <dglent@free.fr>\n"
|
||||
"Language-Team: Greek <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/el/>\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
|
@ -24,7 +25,7 @@ msgstr "Πήγαινε εκεί..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Τερματικό"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
9
po/fr.po
9
po/fr.po
|
|
@ -8,9 +8,10 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-12-15 01:13+0000\n"
|
||||
"Last-Translator: vTT <vttfreebsd@gmail.com>\n"
|
||||
"Language-Team: French <https://translate.lxqt-project.org/projects/labwc/labwc/fr/>\n"
|
||||
"PO-Revision-Date: 2025-08-11 00:27+0000\n"
|
||||
"Last-Translator: Oliver Chiasson <olivierchiasson@hotmail.fr>\n"
|
||||
"Language-Team: French <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/fr/>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
|
@ -24,7 +25,7 @@ msgstr "Y aller…"
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Terminal"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
7
po/ko.po
7
po/ko.po
|
|
@ -8,9 +8,10 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-12-10 02:04+0000\n"
|
||||
"PO-Revision-Date: 2025-08-02 03:27+0000\n"
|
||||
"Last-Translator: 이정희 <daemul72@gmail.com>\n"
|
||||
"Language-Team: Korean <https://translate.lxqt-project.org/projects/labwc/labwc/ko/>\n"
|
||||
"Language-Team: Korean <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/ko/>\n"
|
||||
"Language: ko\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
|
@ -24,7 +25,7 @@ msgstr "빨리 가기..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "터미널"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
11
po/lt.po
11
po/lt.po
|
|
@ -8,14 +8,17 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-11-13 21:01+0000\n"
|
||||
"PO-Revision-Date: 2025-07-19 18:47+0000\n"
|
||||
"Last-Translator: Moo <hazap@hotmail.com>\n"
|
||||
"Language-Team: Lithuanian <https://translate.lxqt-project.org/projects/labwc/labwc/lt/>\n"
|
||||
"Language-Team: Lithuanian <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/lt/>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 1 : 2);\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > "
|
||||
"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? "
|
||||
"1 : 2);\n"
|
||||
"X-Generator: Weblate 4.2.1\n"
|
||||
|
||||
#: src/menu/menu.c:1016
|
||||
|
|
@ -24,7 +27,7 @@ msgstr "Eiti ten..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Terminalas"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
7
po/ms.po
7
po/ms.po
|
|
@ -8,9 +8,10 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2025-04-08 05:25+0000\n"
|
||||
"PO-Revision-Date: 2025-08-18 20:01+0000\n"
|
||||
"Last-Translator: Qayyum Yazid <purrnama@proton.me>\n"
|
||||
"Language-Team: Malay <https://translate.lxqt-project.org/projects/labwc/labwc/ms/>\n"
|
||||
"Language-Team: Malay <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/ms/>\n"
|
||||
"Language: ms\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
|
@ -24,7 +25,7 @@ msgstr "Pergi sana..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Terminal"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
7
po/pt.po
7
po/pt.po
|
|
@ -8,9 +8,10 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-09-21 20:01+0000\n"
|
||||
"PO-Revision-Date: 2025-07-13 08:01+0000\n"
|
||||
"Last-Translator: Hugo Carvalho <hugokarvalho@hotmail.com>\n"
|
||||
"Language-Team: Portuguese <https://translate.lxqt-project.org/projects/labwc/labwc/pt/>\n"
|
||||
"Language-Team: Portuguese <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/pt/>\n"
|
||||
"Language: pt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
|
@ -24,7 +25,7 @@ msgstr "Ir lá..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Terminal"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
|
|
@ -8,9 +8,10 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2025-02-04 21:01+0000\n"
|
||||
"Last-Translator: EggSupernova <leomelo34@protonmail.com>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translate.lxqt-project.org/projects/labwc/labwc/pt_BR/>\n"
|
||||
"PO-Revision-Date: 2025-09-06 04:27+0000\n"
|
||||
"Last-Translator: virtual-hand <handvirtual@tutamail.com>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translate.lxqt-project.org/"
|
||||
"projects/labwc/labwc/pt_BR/>\n"
|
||||
"Language: pt_BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
|
@ -24,7 +25,7 @@ msgstr "Vá para..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Terminal"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
12
po/ru.po
12
po/ru.po
|
|
@ -8,14 +8,16 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-12-08 21:01+0000\n"
|
||||
"Last-Translator: unabomberlive <7alinchik@mail.ru>\n"
|
||||
"Language-Team: Russian <https://translate.lxqt-project.org/projects/labwc/labwc/ru/>\n"
|
||||
"PO-Revision-Date: 2025-07-30 08:01+0000\n"
|
||||
"Last-Translator: Valera <ValeraDX@yandex.ru>\n"
|
||||
"Language-Team: Russian <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/ru/>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.2.1\n"
|
||||
|
||||
#: src/menu/menu.c:1016
|
||||
|
|
@ -24,7 +26,7 @@ msgstr "Перейти..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Терминал"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
10
po/uk.po
10
po/uk.po
|
|
@ -8,14 +8,16 @@ msgstr ""
|
|||
"Project-Id-Version: labwc\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
|
||||
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
|
||||
"PO-Revision-Date: 2024-09-24 08:01+0000\n"
|
||||
"PO-Revision-Date: 2025-08-16 20:01+0000\n"
|
||||
"Last-Translator: Ihor Hordiichuk <igor_ck@outlook.com>\n"
|
||||
"Language-Team: Ukrainian <https://translate.lxqt-project.org/projects/labwc/labwc/uk/>\n"
|
||||
"Language-Team: Ukrainian <https://translate.lxqt-project.org/projects/labwc/"
|
||||
"labwc/uk/>\n"
|
||||
"Language: uk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.2.1\n"
|
||||
|
||||
#: src/menu/menu.c:1016
|
||||
|
|
@ -24,7 +26,7 @@ msgstr "Перейти до..."
|
|||
|
||||
#: src/menu/menu.c:1034
|
||||
msgid "Terminal"
|
||||
msgstr ""
|
||||
msgstr "Термінал"
|
||||
|
||||
#: src/menu/menu.c:1040
|
||||
msgid "Reconfigure"
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue