Merge branch 'master' into mouseemu

This commit is contained in:
Simon Long 2024-10-20 11:56:14 +01:00 committed by GitHub
commit 06129fe1ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
178 changed files with 10958 additions and 2691 deletions

View file

@ -29,7 +29,7 @@ jobs:
matrix: matrix:
name: [ name: [
Arch, Arch,
Debian, # Debian,
FreeBSD, FreeBSD,
Void-musl Void-musl
] ]
@ -40,11 +40,11 @@ jobs:
env: env:
TARGET: 'sh -xe' TARGET: 'sh -xe'
- name: Debian # - name: Debian
os: ubuntu-latest # os: ubuntu-latest
container: debian:testing # container: debian:testing
env: # env:
TARGET: 'sh -xe' # TARGET: 'sh -xe'
- name: FreeBSD - name: FreeBSD
os: ubuntu-latest os: ubuntu-latest
@ -81,6 +81,7 @@ jobs:
apt-get upgrade -y apt-get upgrade -y
apt-get install -y git gcc clang gdb xwayland apt-get install -y git gcc clang gdb xwayland
apt-get build-dep -y labwc apt-get build-dep -y labwc
apt-get install libwlroots-0.18-dev
- name: Install FreeBSD dependencies - name: Install FreeBSD dependencies
if: matrix.name == 'FreeBSD' if: matrix.name == 'FreeBSD'
@ -105,8 +106,8 @@ jobs:
xbps-install -Syu xbps-install -Syu
xbps-install -y git meson gcc clang pkg-config scdoc \ xbps-install -y git meson gcc clang pkg-config scdoc \
cairo-devel glib-devel libpng-devel librsvg-devel libxml2-devel \ cairo-devel glib-devel libpng-devel librsvg-devel libxml2-devel \
pango-devel wlroots0.17-devel gdb bash xorg-server-xwayland \ pango-devel wlroots0.18-devel gdb bash xorg-server-xwayland \
dejavu-fonts-ttf dejavu-fonts-ttf libsfdo-devel
# These build are executed on all runners # These build are executed on all runners
- name: Build with gcc - name: Build with gcc

View file

@ -14,9 +14,10 @@
- [4.3.3 The use of GNU extensions](#the-use-of-gnu-extensions) - [4.3.3 The use of GNU extensions](#the-use-of-gnu-extensions)
- [4.3.4 Naming Conventions](#naming-conventions) - [4.3.4 Naming Conventions](#naming-conventions)
- [5. Commit Messages](#commit-messages) - [5. Commit Messages](#commit-messages)
- [6. Submitting Patches](#submitting-patches) - [6. Unit Tests](#unit-tests)
- [7. Native Language Support](#native-language-support) - [7. Submitting Patches](#submitting-patches)
- [8. Upversion](#upversion) - [8. Native Language Support](#native-language-support)
- [9. Upversion](#upversion)
# How to Contribute # How to Contribute
@ -345,6 +346,29 @@ This first line should:
And please wrap the commit message at max 74 characters, otherwise `git log` 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 so weird. URLs and other references are exempt.
# Unit Tests
## Introduction
The tests live in the `t/` directory.
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
coverage. The inclusion of the t/ directory does not signifiy a move towards
test-driven development. We intend to use unit tests sparingly and only when
devs find them useful.
## Usage
From repo top level directory:
meson setup -Dtest=enabled build
meson compile -C build/
meson test --verbose -C build/
# Submitting patches # Submitting patches
Base both bugfixes and new features on `master`. Base both bugfixes and new features on `master`.

287
NEWS.md
View file

@ -9,7 +9,9 @@ The format is based on [Keep a Changelog]
| Date | All Changes | wlroots version | lines-of-code | | Date | All Changes | wlroots version | lines-of-code |
|------------|---------------|-----------------|---------------| |------------|---------------|-----------------|---------------|
| 2024-06-09 | [unreleased] | 0.17.3 | | | 2024-08-16 | [0.8.0] | 0.18.0 | 23320 |
| 2024-06-19 | [0.7.4] | 0.17.4 | 22746 |
| 2024-06-12 | [0.7.3] | 0.17.4 | 22731 |
| 2024-05-10 | [0.7.2] | 0.17.3 | 21368 | | 2024-05-10 | [0.7.2] | 0.17.3 | 21368 |
| 2024-03-01 | [0.7.1] | 0.17.1 | 18624 | | 2024-03-01 | [0.7.1] | 0.17.1 | 18624 |
| 2023-12-22 | [0.7.0] | 0.17.1 | 16576 | | 2023-12-22 | [0.7.0] | 0.17.1 | 16576 |
@ -31,13 +33,254 @@ The format is based on [Keep a Changelog]
## [unreleased] ## [unreleased]
The most noteworthy additions in this release are:
1. Titlebar window icons and layout configuration
2. Support for the cosmic-workspace protocol and the openbox inspired
client-list-combined-menu for a better user experience with workspaces.
Notes to package maintainers:
- The SSD titlebar window icon support requires libsfdo to be added as a
dependency or statically linked. If this is not wanted, add -Dicon=disabled to
the `meson setup` command in the build script for the next release.
- PRs #1716 and #2205 add labwc xdg-portal configuration, modify `labwc.desktop`
and amend `XDG_CURRENT_DESKTOP` which should enable better out-of-the-box
support for xdg-desktop-portal, but if you already ship a custom setup for
this you or have different requirements, please review this change.
### Added ### Added
- Support dmabuf feedback (#2234, #1278)
- Add initial implementation of cosmic-workspace-unstable-v1 (#2030)
- Optionally support SSD titlebar window icons. When an icon file is not found
or could not be loaded, the window menu icon is shown as before. The icon
theme can be selected with `<theme><icon>` (#2128)
- Add actions `ToggleSnapToEdge` and `ToggleSnapToRegion`. These behave like
`SnapToEdge` and `SnapToRegion`, except that they untile the window when
already being tiled to the given region or direction.
Written-by: @jp7677 and @tokyo4j (#2154)
- Add action `UnSnap`. This behaves like `ToggleSnapToEdge/Region` but
unconditionally. Written-by: @jp7677 and @tokyo4j (#2154)
- Handle xdg-shell `show_window_menu` requests (#2167)
- Support the openbox style menus listed below. Written-by: @droc12345
1. `client-list-combined-menu` shows windows across all workspaces. This can
be used with a mouse/key bind using:
`<action name="ShowMenu" menu="client-list-combined-menu"/>` (#2101)
2. `client-send-to` shows all workspaces that the current window can be sent
to. This can additional be used within a client menu using:
`<menu id="client-send-to-menu" label="Send to Workspace..." />` (#2152)
- Add theme option for titlebar padding and button spacing (#2189)
```
window.button.height: 26
window.titlebar.padding.width: 0
window.titlebar.padding.height: 0
window.button.spacing: 0
```
- Set titlebar height based on the maximum height of any of the objects within
it, rather than just taking the font height into account (#2152)
- Add theme option for setting button hover effect corner radius (#2127, #2231)
```
window.button.hover.bg.corner-radius: 0
```
- Add position arguments for menus. Written-by: @droc12345 (#2102)
```
<action name="ShowMenu">
<menu>root-menu</menu>
<position>
<x>0</x>
<y>0</y>
</position>
</action>
```
- Allow interactive window movement when horizontally or vertically maximized
and add associated config option `<resistance><unMaximizeThreshold>` (#2052)
- Add optional Shade (shade.xbm) and AllDesktops (desk.xbm) buttons and theme
options:
```
window.active.button.desk.unpressed.image.color
window.inactive.button.desk.unpressed.image.color
window.active.button.shade.unpressed.image.color
window.inactive.button.shade.unpressed.image.color
```
- Make action `FocusOutput` behave like `MoveToOutput` by adding direction and
wrap arguments. Written-by: @orfeasxyz (#2100)
- Add config option for titlebar layout. Written-by: @xi (#2088, #2150)
```
<titlebar>
<layout>icon:iconify,max,close</layout>
<showTitle>yes|no</showTitle>
</titlebar>
```
- Add `Oblique` option to `<theme><font><style>`. Written-by: @droc12345 (#2097)
- Support menu titles defined by `<separator label="">`.
- Add the theme option `menu.title.bg.color: #589bda`
- Add theme options `menu.title.text.color` and `menu.title.text.justify`.
Written-by: @droc12345 (#2097)
- Add font place MenuHeader: `<font place="MenuHeader">`.
Written-by: @droc12345 (#2097)
- Add actions `EnableTabletMouseEmulation` and `DisableTabletMouseEmulation`.
Written-by: @jp7677 (#2091)
- Set 'labwc' as `app_id` and `title` for nested outputs (#2055)
### Fixed
- Fix button release events sometimes not being sent (#2226)
- Fix xdg-shell popups appearing on wrong output with some Qt themes. (#2224)
- Take into account xdg-shell minimum window size for resizing. This is
relevant when using `<resize drawContents="no">` (#2221)
- Fix button scaling issues (#2207, #2225)
- Add portals.conf file, amend `labwc.desktop` and modify `XDG_CURRENT_DESKTOP`
for better out-of-the-box xdg-desktop-portal support. This helps with for
example screensharing. Written-by: @rcalixte @jp7677 (#1503, #1716)
- Disable the Inhibit D-BUS interface in xdg-portals configuration to fix an
issue with some clients (like Firefox) ignoring the idle-inhibit protocol.
Written-by: @jp7677 (#2205)
- Prevent `Drag` mousebinds from running without button press (#2196)
- Handle slow un-maximize with empty natural geometry better (#2191)
- Fix de-synced SSD when shrinking Thunderbird xdg-shell window (#2190)
- Fix xdg-shell out-of-sync configure state when clients time out
Written-by: @cillian64 (#2174)
- Fix small flicker when client initially submits a window size smaller than the
minimum value (#2166)
- Allow server-side decoration to be smaller than minimal size by hiding
buttons (#2116)
- Fix incorrect cursor shape on titlebar corner without buttons (#2105)
- Fix delayed pipe menu response on item destroy (#2094)
- Destroy xdg-shell foreign toplevel handle on unmap (#2075)
- Sync XWayland foreign-toplevel and associated outputs on re-map (#2075)
### Changed
- Theme options `padding.height` and `titlebar.height` have been removed to
minimize breaking changes with the visual appearance of the titlebar when
using openbox themes. As a result, and depending on your configuration,
the titlebar height may change by a small number of pixels (#2189)
- Move input config `<scrollFactor>` to `<libinput>` section to allow
per-device configuration of scroll factor (e.g. setting different scroll
factors for mice and touchpads). (#2057)
## [0.8.0]
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
additions and fixes as described below.
There are a couple of regression warnings when using wlroots 0.18:
1. There appears to be an issue with increased commit failures, particularly
with intel drivers. If this turns out to be an issue for anyone please try
running with `WLR_DRM_NO_ATOMIC=1` or run the labwc v0.7 branch or its latest
release until this is resolved.
2. Fullscreen VRR is broken but should be fixed once wlroots 0.18.1 is released.
Again, if that is a problem we advise to stay with the v0.7 branch in the
short term until fixed. PR #2079
A v0.7 branch has been created for bug fixes beyond `0.7.3` (built with wlroots
`0.17`).
A big thank you goes to @Consolatis for carefully crafting the commits to port
across to wlroots 0.18.0. Many thanks also to the other core devs @ahesford,
@jlindgren90, @johanmalm and @tokyo4j for reviewing, merging as well as
contributing many patches with fixes and new features. And in this release we
have some great contributions from @jp7677, @kode54, @xi and @heroin-moose which
have been attributed with a 'Written-by' against each relevant log entry.
### Added
- Add options `fullscreen` and `fullscreenForced` for `<core><allowTearing>`
Written-by: @jp7677 & @Consolatis PR #1941
- Optionally allow keybindings when session is locked, which for example can be
useful for volume settings. Written-by: @xi PR #2041
```xml
<keyboard><keybind key="" allowWhenLocked="">
```
- Add resistance when dragging tiled/maximized windows with config option
`<resistance><unSnapThreshold>`. PR #2009 #2056
- Implement support for renderer loss recovery. Written-by: @kode54 PR #1997
- Support xinitrc scripts to configure XWayland server on launch. PR #1963
- Add theme option `window.button.width` to set window button size.
Written-by: @heroin-moose PR #1965
- Add `cascade` placement policy. PR #1890
```xml
<placement>
<policy>cascade</policy>
<cascadeOffset x="40" y="30"/>
</placement>
```
- Support relative tablet motion. Written-by: @jp7677 PR #1962
```xml
<tabletTool motion="absolute|relative" relativeMotionSensitivity="1.0"/>
```
### Fixed
- Make tablet rotation follow output rotation. Written-by: @jp7677. PR #2060
- Fix error when launching windowed Chromium. PR #2069
- Fix empty `XKB_DEFAULT_LAYOUT` bug. PR #2061
- Take into account CSD borders when unconstraining XDG popups. PR #2016
- Choose xdg-popup output depending on xdg-positioner PR #2016
- Fix wlroots-0.18 regression causing flicker with some layer-shell clients like
fuzzel on launch. PR #2021
- Fix incorrect condition in server-side-deco logic PR #2020
- Fix flicker of snapped windows in nested session. PR #2010
- Fix tearing with atomic mode setting. Written-by: @kode54 PR #1996
- Handle initially maximized and fullscreen xdg-shell windows better.
PRs #1956 and #2007
- Set initial geometry of maximized and fullscreen XWayland windows in the
`map_request` handler to avoid visual glitches with some apps. PR #1529
- Disable pango glyph position rounding to avoid text geometry jump around when
changing scale.
### Changed
- Make windows stay fullscreen when associated output is disconnected. PR #2040
## [0.7.4]
### Fixed
- Make SSD borders respect snapped state on Reconfigure. PR #2003
- Fix magnifier by disabling direct scanout when active. PR #1989
- Fix crash triggered by pipemenu without parent `<menu>` element. PR #1988
## [0.7.3]
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
ones include improved tablet support (by @jp7677), `Super_L` on-release keybinds
(by @spl237 from the Raspberry Pi teams) and the screen magnifier which was a
joint effort by @spl237 and @Consolatis.
### Added
- Add config option `<core><xwaylandPersistence>` to support keeping XWayland
alive even when no clients are connected. PR #1961
- Support xdg-shell protocol v3 with popup repositioning. #1950
Also see https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3514
which adds support on the wlroots side.
- Add action `ToggleTabletMouseEmulation`. Written-by: jp7677 PR #1915
- Implement `<resize><drawContents>`. With thanks to @tokyo4j PR #1863
- Add `onRelease` option to `<keybind>` in support of binding `Super_L` to a - Add `onRelease` option to `<keybind>` in support of binding `Super_L` to a
menu. Written-by: @spl237 PR #1888 menu. Written-by: @spl237 PR #1888
- Add initial support for `security-context-v1` (user configurable blocklists - Add initial support for `security-context-v1` (user configurable blocklists
are still missing). Written-by: @nesteroff PR #1817 are still missing). Written-by: @nesteroff PR #1817
- Add partial support for `tablet-v2-manager`. Written-by: @jp7677 PR #1678 - Add support for `tablet-v2-manager`. Written-by: @jp7677 PR #1678 #1882
- Add action `UnMaximize`. PR #1831 - Add action `UnMaximize`. PR #1831
- Support multiple IME popups. PR #1823 - Support multiple IME popups. PR #1823
- Add `All` context for mouse bindings which need to be handled irrespective of - Add `All` context for mouse bindings which need to be handled irrespective of
@ -51,6 +294,33 @@ The format is based on [Keep a Changelog]
### Fixed ### Fixed
- When looking for menu.xml, go through all paths rather than just giving up
if not found in the first path searched. This makes it consistent with how
other config/theme files are handled. PR #1971
- Fix memory leaks in theme.c and menu.c. PR #1971
- Fix session-lock bugs related to keyboard focus. PR #1952
- Clear focused surface on lock
- Restore focused view on unlock
- Fix memory leak in ssd/ssd-shadow.c PR #1954
- Respect `menu.overlap.x` when using pipemenus. PR #1940
- Do not try to restore windows to very small width/height on unmaximize.
This fixes a bug with Thonny (Python IDE made with Tk). PR #1938
- Conditially set squared server-side decoration (SSD) corners when a view is
tiled. Written-by: @jp7677 PR #1926
- Remember initial direction when starting window-cycling with `PreviousView`.
Also make the toggling of direction when shift is pressed relative to the
initial direction. For example if W-j is bound to PreviousWindow, subsequent
key presses will continue to cycle backwards unless shift is also pressed.
Written-by: @droc12345 PR #1919
- Show dnd icon above layer-shell surfaces. PR #1936
- Initialize locale after reading environment files so that client-menu items
and workspace names follow the env var `LANG` should that be set in
`~/.config/labwc/environment` (which is not recommended, but we prefer to
handle it properly if it is). PR #1927
- Fix crash on `menu.xml` containing `<item>` without a parent `<menu>`.
PR #1907
- Reset XWayland cursor image on cursor theme reload to avoid trying to read
destroyed pixel data. PR #1895
- Prevent child views from opening outside of usable area. PR #1878 - Prevent child views from opening outside of usable area. PR #1878
- Fix IME popups issues (flicker when popup surface is initially mapped - Fix IME popups issues (flicker when popup surface is initially mapped
and incorrectly showing multiple popups). PR #1872 and incorrectly showing multiple popups). PR #1872
@ -74,15 +344,15 @@ The format is based on [Keep a Changelog]
### Changed ### Changed
- Remove subprojects/seatd.wrap as no longer needed
- Action `MoveToCursor` is deprecated in favour of: - Action `MoveToCursor` is deprecated in favour of:
`<action name="AutoPlace" policy="cursor"/>`. `<action name="AutoPlace" policy="cursor"/>`.
## [0.7.2] ## [0.7.2]
This release is shaping up to be the second in a row that is larger than This release shaped up to be the second in a row that is larger than usual in
usual in terms of both fixes and new features. Significant additions terms of both fixes and new features. Significant additions include
include input-methods, pipemenus, snap-to-edge overlays and optionally input-methods, pipemenus, snap-to-edge overlays and optionally drop-shadows.
drop-shadows.
As usual, most of the commits are by the core devs: @ahesford, @Consolatis, As usual, most of the commits are by the core devs: @ahesford, @Consolatis,
@jlindgren90, @johanmalm and @tokyo4j, but we also have many great @jlindgren90, @johanmalm and @tokyo4j, but we also have many great
@ -1394,7 +1664,10 @@ Compile with wlroots 0.12.0 and wayland-server >=1.16
ShowMenu ShowMenu
[Keep a Changelog]: https://keepachangelog.com/en/1.0.0/ [Keep a Changelog]: https://keepachangelog.com/en/1.0.0/
[unreleased]: https://github.com/labwc/labwc/compare/0.7.2...HEAD [unreleased]: https://github.com/labwc/labwc/compare/0.8.0...HEAD
[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.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.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.7.0]: https://github.com/labwc/labwc/compare/0.6.6...0.7.0

View file

@ -182,7 +182,7 @@ prevent installing the wlroots headers:
## 3. Configuration ## 3. Configuration
User config files are located at `${XDG_CONFIG_HOME:-$HOME/.config/labwc/}` User config files are located at `${XDG_CONFIG_HOME:-$HOME/.config/labwc/}`
with the following five files being used: [rc.xml], [menu.xml], [autostart], [shutdown], with the following six files being used: [rc.xml], [menu.xml], [autostart], [shutdown],
[environment] and [themerc-override]. [environment] and [themerc-override].
Run `labwc --reconfigure` to reload configuration and theme. Run `labwc --reconfigure` to reload configuration and theme.

3
data/labwc-portals.conf Normal file
View file

@ -0,0 +1,3 @@
[preferred]
default=wlr;*
org.freedesktop.impl.portal.Inhibit=none

View file

@ -4,4 +4,4 @@ Comment=A wayland stacking compositor
Exec=labwc Exec=labwc
Icon=labwc Icon=labwc
Type=Application Type=Application
DesktopNames=wlroots DesktopNames=labwc;wlroots

View file

@ -5,6 +5,7 @@ Config layout for ~/.config/labwc/
- rc.xml - rc.xml
- shutdown - shutdown
- themerc-override - themerc-override
- xinitrc
See `man labwc-config and `man labwc-theme` for further details. See `man labwc-config and `man labwc-theme` for further details.

View file

@ -60,13 +60,13 @@
## ##
## This allows xdg-desktop-portal-wlr to function (e.g. for screen-recording). ## This allows xdg-desktop-portal-wlr to function (e.g. for screen-recording).
## It is automatically set to "wlroots" by labwc though, so it is only ## It is automatically set to "labwc:wlroots" by labwc though, so it is only
## included here for completeness. Again, labwc will not over-write an ## included here for completeness. Again, labwc will not over-write an
## already set environment variable, so if you need it set to something else, ## already set environment variable, so if you need it set to something else,
## then uncomment and adjust. ## then uncomment and adjust.
## ##
# XDG_CURRENT_DESKTOP=wlroots # XDG_CURRENT_DESKTOP=labwc:wlroots
## ##
## This causes a virtual output to be created automatically whenever there ## This causes a virtual output to be created automatically whenever there

View file

@ -91,19 +91,35 @@ Actions are used in menus and keyboard/mouse bindings.
Move window relative to its current position. Positive value of x moves 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. it right, negative left. Positive value of y moves it down, negative up.
*<action name="ToggleSnapToEdge" direction="value" />*++
*<action name="SnapToEdge" direction="value" />* *<action name="SnapToEdge" direction="value" />*
Resize window to fill half the output in the given direction. Supports Resize window to fill half the output in the given direction. Supports
directions "left", "up", "right", "down" and "center". directions "left", "up", "right", "down" and "center".
ToggleSnapToEdge additionally toggles the active window between
tiled to the given direction and its untiled position.
*<action name="ToggleSnapToRegion" region="value" />*++
*<action name="SnapToRegion" region="value" />* *<action name="SnapToRegion" region="value" />*
Resize and move active window according to the given region. Resize and move active window according to the given region.
ToggleSnapToRegion additionally toggles the active window between
tiled to the given region and its untiled position.
See labwc-config(5) for further information on how to define regions. See labwc-config(5) for further information on how to define regions.
*<action name="NextWindow" />* *<action name="UnSnap" />*
Cycle focus to next window. Resize and move the active window back to its untiled or unmaximized
position if it had been maximized or tiled to a direction or region.
*<action name="NextWindow" />*++
*<action name="PreviousWindow" />* *<action name="PreviousWindow" />*
Cycle focus to previous window. Cycle focus to next/previous window respectively.++
Default keybind for NextWindow is Alt-Tab.
The shift key is used to reverse direction while cycling.
The arrow keys are used to move forwards/backwards while cycling.
*<action name="Reconfigure" />* *<action name="Reconfigure" />*
Re-load configuration and theme files. Re-load configuration and theme files.
@ -111,14 +127,26 @@ Actions are used in menus and keyboard/mouse bindings.
*<action name="ShowMenu" menu="value" atCursor="yes" />* *<action name="ShowMenu" menu="value" atCursor="yes" />*
Show a menu. Show a menu.
*menu* The name of the menu to show. The menus "root-menu" and *menu* The name of the menu to show. The menus "root-menu",
"client-menu" are guaranteed to exist, but others may be defined "client-menu", "client-send-to-menu" and "client-list-combined-menu"
explicitly. See labwc-menu(5) for more information. are guaranteed to exist, but others may be defined explicitly.
See labwc-menu(5) for more information.
*atCursor* [yes|no] When opening a menu, open the menu at the location *atCursor* [yes|no] When opening a menu, open the menu at the location
of the mouse cursor. When set to no, the menu will appear at the of the mouse cursor. When set to no, the menu will appear at the
upper-left corner of the window associated with the action. Default is upper-left corner of the window associated with the action or underneath
yes. the window button that opened the menu. Default is yes.
*position* Show the menu in the specified position on the monitor
that has cursor focus, see below.
The position tag has two sub-tags. <x> and <y> specify a position and
take either a pixel value, the string "center" which will center the
menu in that dimension, or a relative value specified as a percentage
A relative value is interpreted in terms of the monitor the menu will
be shown on, and will be relative to the left/top edge of the menu
window and monitor for positive values, and to the right/bottom edge
for negative values.
*<action name="SetDecorations" decorations="value" forceSSD="no" />* *<action name="SetDecorations" decorations="value" forceSSD="no" />*
Set decorations of focused window. Set decorations of focused window.
@ -184,12 +212,27 @@ Actions are used in menus and keyboard/mouse bindings.
original window. There can be multiple windows with this mode set. original window. There can be multiple windows with this mode set.
*<action name="ToggleTearing" />* *<action name="ToggleTearing" />*
Toggles tearing for the focused window. Toggles tearing for the focused window between enabled and disabled.
This overrides the preference (tearing hint) from the focused window.
*<action name="FocusOutput" output="HDMI-A-1" />* Requires the config option 'allowTearing'. When 'allowTearing' is set
Give focus to topmost window on given output and warp the cursor to 'fullscreen' or 'fullscreenForced', tearing will still only be
to the center of the window. If the given output does not contain enabled if the active window is in fullscreen mode.
any windows, the cursor is centered on the given output.
*<action name="FocusOutput" output="HDMI-A-1" direction="value" wrap="no" />*
Give focus to topmost window on other output and warp the cursor
to the center of the window.
If *output* is specified, the focus is given to the specified output and
*direction* is ignored. If *output* is omitted, *direction* may be one
of "left", "right", "up" or "down" to indicate that the focus should be
given to the next output in that direction (if one exists).
*wrap* [yes|no] When using the direction attribute, wrap around
from right-to-left or top-to-bottom, and vice versa. Default is no.
If the target output does not contain any windows, the cursor will
be centered on the output.
*<action name="MoveToOutput" output="HDMI-A-1" direction="value" wrap="no" />* *<action name="MoveToOutput" output="HDMI-A-1" direction="value" wrap="no" />*
Moves active window to other output, unless the window state is Moves active window to other output, unless the window state is
@ -273,9 +316,9 @@ Actions are used in menus and keyboard/mouse bindings.
*<action name="AutoPlace" policy="value"/>* *<action name="AutoPlace" policy="value"/>*
Reposition the window according to the desired placement policy. Reposition the window according to the desired placement policy.
*policy* [automatic|cursor|center] Use the specified policy, which has *policy* [automatic|cursor|center|cascade] Use the specified policy,
the same meaning as the corresponding value for *<placement><policy>*. which has the same meaning as the corresponding value for
Default is automatic. *<placement><policy>*. Default is automatic.
*<action name="Shade" />*++ *<action name="Shade" />*++
*<action name="Unshade" />*++ *<action name="Unshade" />*++
@ -286,6 +329,11 @@ Actions are used in menus and keyboard/mouse bindings.
decorations (including those for which the server-side titlebar has been decorations (including those for which the server-side titlebar has been
hidden) are not eligible for shading. hidden) are not eligible for shading.
*<action name="EnableTabletMouseEmulation" />*++
*<action name="DisableTabletMouseEmulation" />*++
*<action name="ToggleTabletMouseEmulation">*
Enable, disable or toggle mouse emulation for drawing tablets respectively.
*<action name="ToggleMagnify">* *<action name="ToggleMagnify">*
Toggle the screen magnifier on or off at the last magnification level Toggle the screen magnifier on or off at the last magnification level
used. used.

View file

@ -8,7 +8,7 @@ labwc - configuration files
Labwc uses openbox-3.6 specification for configuration and theming, but does not Labwc uses openbox-3.6 specification for configuration and theming, but does not
support all options. The following files form the basis of the labwc support all options. The following files form the basis of the labwc
configuration: rc.xml, menu.xml, autostart, shutdown and environment. configuration: rc.xml, menu.xml, autostart, shutdown, environment and xinitrc.
No configuration files are needed to start and run labwc. No configuration files are needed to start and run labwc.
@ -78,6 +78,10 @@ in labwc-theme(5).
*rc.xml* is the main configuration file and all its options are described in *rc.xml* is the main configuration file and all its options are described in
detail below. detail below.
The *xinitrc* file is executed as a shell script whenever labwc launches the
Xwayland X11 server. This may happen multiple times throughout the session if
Xwayland is not configured to persist when no X11 clients are connected.
# CONFIGURATION # CONFIGURATION
This section describes *rc.xml* configuration options. This section describes *rc.xml* configuration options.
@ -181,11 +185,23 @@ this is for compatibility with Openbox.
*fullscreen* enables adaptive sync whenever a window is in fullscreen *fullscreen* enables adaptive sync whenever a window is in fullscreen
mode. mode.
*<core><allowTearing>* [yes|no] *<core><allowTearing>* [yes|no|fullscreen|fullscreenForced]
Allow tearing to reduce input lag. Default is no. Allow tearing to reduce input lag. Default is no.
This option requires setting the environment variable
WLR_DRM_NO_ATOMIC=1. *yes* allows tearing if requested by the active window.
*yes* allow tearing if requested by the active window.
*fullscreen* allows tearing if requested by the active window, but
only when the window is in fullscreen mode.
*fullscreenForced* enables tearing whenever the active window is in
fullscreen mode, whether or not the application has requested tearing.
Use the *ToggleTearing* action for forcefully enable tearing.
Note: Enabling this option with atomic mode setting is experimental. If
you experience undesirable side effects when tearing is allowed,
consider setting the environment variable WLR_DRM_NO_ATOMIC=1 when
launching labwc.
*<core><reuseOutputMode>* [yes|no] *<core><reuseOutputMode>* [yes|no]
Try to re-use the existing output mode (resolution / refresh rate). Try to re-use the existing output mode (resolution / refresh rate).
@ -194,14 +210,31 @@ this is for compatibility with Openbox.
be used with labwc the preferred mode of the monitor is used instead. be used with labwc the preferred mode of the monitor is used instead.
Default is no. Default is no.
*<core><xwaylandPersistence>* [yes|no]
Keep XWayland alive even when no clients are connected, rather than
using a "lazy" policy that allows the server to launch on demand and die
when it is no longer needed. Default is no.
Note: changing this setting requires a restart of labwc.
## PLACEMENT ## PLACEMENT
*<placement><policy>* [center|automatic|cursor] *<placement><policy>* [center|automatic|cursor|cascade]
Specify a placement policy for new windows. The "center" policy will Specify a placement policy for new windows. The "center" policy will
always place windows at the center of the active output. The "automatic" always place windows at the center of the active output. The "automatic"
policy will try to place new windows in such a way that they will policy will try to place new windows in such a way that they will
have minimal overlap with existing windows. The "cursor" policy will have minimal overlap with existing windows. The "cursor" policy will
center new windows under the cursor. Default is "center". center new windows under the cursor. The "cascade" policy will try to
place new windows at the center of the active output, but possibly
shifts its position to bottom-right not to cover existing windows.
Default is "center".
*<placement><cascadeOffset><x>*++
*<placement><cascadeOffset><y>*
Specify the offset by which a new window can be shifted from an existing
window when <placement><policy> is "cascade". These values must be positive.
Default is the height of titlebar (the sum of *titlebar.height* and
*border.width* from theme) plus 5 for both *x* and *y*.
## WINDOW SWITCHER ## WINDOW SWITCHER
@ -293,6 +326,15 @@ this is for compatibility with Openbox.
The default value for both parameters is 20 pixels. The default value for both parameters is 20 pixels.
*<resistance><unSnapThreshold>*
Sets the movement of cursor in pixel required for a tiled or maximized
window to be moved with an interactive move. Default is 20.
*<resistance><unMaximizeThreshold>*
Sets the one-dimentional movement of cursor in pixel required for a
*vertically or horizontally* maximized window to be moved with an
interactive move. Default is 150.
## FOCUS ## FOCUS
*<focus><followMouse>* [yes|no] *<focus><followMouse>* [yes|no]
@ -395,6 +437,29 @@ extending outward from the snapped edge.
*<theme><name>* *<theme><name>*
The name of the Openbox theme to use. It is not set by default. The name of the Openbox theme to use. It is not set by default.
*<theme><icon>*
The name of the icon theme to use. It is not set by default.
*<theme><titlebar><layout>*
Selection and order of buttons in a window's titlebar.
The following identifiers can be used, each only once:
- 'icon': window icon
- 'menu': window menu
- 'iconify': iconify
- 'max': maximize toggle
- 'close': close
- 'shade': shade toggle
- 'desk': all-desktops toggle
A colon deliminator is used to separate buttons on the left and right,
whereas commas are used to separate items within a section. It is
mandatory to use one colon.
Default: icon:iconify,max,close
*<theme><titlebar><showTitle>* [yes|no]
Show the window title in the titlebar. Default is yes.
*<theme><cornerRadius>* *<theme><cornerRadius>*
The radius of server side decoration top corners. Default is 8. The radius of server side decoration top corners. Default is 8.
@ -411,6 +476,7 @@ extending outward from the snapped edge.
- ActiveWindow - titlebar of active window - ActiveWindow - titlebar of active window
- InactiveWindow - titlebar of all windows that aren't focused by the - InactiveWindow - titlebar of all windows that aren't focused by the
cursor cursor
- MenuHeader - menu title
- MenuItem - menu item (currently only root menu) - MenuItem - menu item (currently only root menu)
- OnScreenDisplay - items in the on screen display - OnScreenDisplay - items in the on screen display
If no place attribute is provided, the setting will be applied to all If no place attribute is provided, the setting will be applied to all
@ -423,7 +489,7 @@ extending outward from the snapped edge.
Font size in pixels. Default is 10. Font size in pixels. Default is 10.
*<theme><font place=""><slant>* *<theme><font place=""><slant>*
Font slant (normal or italic). Default is normal. Font slant (normal, oblique or italic). Default is normal.
*<theme><font place=""><weight>* *<theme><font place=""><weight>*
Font weight (normal or bold). Default is normal. Font weight (normal or bold). Default is normal.
@ -471,7 +537,7 @@ extending outward from the snapped edge.
Stores the keyboard layout either globally or per window and restores Stores the keyboard layout either globally or per window and restores
it when switching back to the window. Default is global. it when switching back to the window. Default is global.
*<keyboard><keybind key="" layoutDependent="">* *<keyboard><keybind key="" layoutDependent="" onRelease="" allowWhenLocked="">*
Define a *key* binding in the format *modifier-key*, where supported Define a *key* binding in the format *modifier-key*, where supported
modifiers are: modifiers are:
- S (shift) - S (shift)
@ -497,8 +563,11 @@ extending outward from the snapped edge.
If set to "no" (or is absent) the keybind will be layout agnostic. If set to "no" (or is absent) the keybind will be layout agnostic.
Default is no. Default is no.
*<keyboard><keybind key="" onRelease="yes|no">* *allowWhenLocked* [yes|no]
*onRelease*, when yes, fires the keybind action when the key or key Make this keybind work even if the screen is locked. Default is no.
*onRelease* [yes|no]
When yes, fires the keybind action when the key or key
combination is released, rather than first pressed. This is useful to combination is released, rather than first pressed. This is useful to
bind actions to only modifier keys, where the action should fire when bind actions to only modifier keys, where the action should fire when
the modifier is used without another key. Default is no. the modifier is used without another key. Default is no.
@ -507,7 +576,6 @@ extending outward from the snapped edge.
pressed & released, without interference from other multi-key pressed & released, without interference from other multi-key
combinations that include the super key: combinations that include the super key:
``` ```
<keybind key="Super_L" onRelease="yes"> <keybind key="Super_L" onRelease="yes">
<action name="Execute" command="rofi -show drun"/> <action name="Execute" command="rofi -show drun"/>
@ -551,9 +619,6 @@ extending outward from the snapped edge.
*<mouse><doubleClickTime>* *<mouse><doubleClickTime>*
Set double click time in milliseconds. Default is 500. Set double click time in milliseconds. Default is 500.
*<mouse><scrollFactor>*
Set scroll factor. Default is 1.0.
*<mouse><context name=""><mousebind button="" direction="" action=""><action>* *<mouse><context name=""><mousebind button="" direction="" action=""><action>*
Multiple *<mousebind>* can exist within one *<context>*; and multiple Multiple *<mousebind>* can exist within one *<context>*; and multiple
*<action>* can exist within one *<mousebind>*. *<action>* can exist within one *<mousebind>*.
@ -563,10 +628,13 @@ extending outward from the snapped edge.
buttons and the window title are shown. buttons and the window title are shown.
- Title: The area of the titlebar (including blank space) between - Title: The area of the titlebar (including blank space) between
the window buttons, where the window title is displayed. the window buttons, where the window title is displayed.
- WindowMenu: The button on the left. - Icon: A window icon that, by default, displays a window menu.
- Iconify: The button that looks like an underline. - WindowMenu: A button that, by default, displays a window menu.
- Maximize: The button that looks like a box. - Iconify: A button that, by default, iconifies a window.
- Close: The button that looks like an X. - Maximize: A button that, by default, toggles maximization of a window.
- Shade: A button that, by default, toggles window shading.
- AllDesktops: A button that, by default, toggles omnipresence of a window.
- Close: A button that, by default, closses a window.
- Top: The top edge of the window's border. - Top: The top edge of the window's border.
- Bottom: The bottom edge of the window's border. - Bottom: The bottom edge of the window's border.
- Left: The left edge of the window's border. - Left: The left edge of the window's border.
@ -656,9 +724,12 @@ extending outward from the snapped edge.
If the output name is left empty or the output does not exists, the If the output name is left empty or the output does not exists, the
tablet will span all outputs. tablet will span all outputs.
The tablet cursor automatically applies the orientation/rotation of
a mapped output for absolute motion.
*<tablet rotate="" />* [0|90|180|270] *<tablet rotate="" />* [0|90|180|270]
The tablet orientation can be changed in 90 degree steps. Default is The tablet orientation can be changed in 90 degree steps. Default is
no rotation (0). Rotation will be applied after applying tablet area no rotation (0). Rotation will be applied before applying tablet area
transformation. transformation.
See also *calibrationMatrix* in libinput section below for advanced See also *calibrationMatrix* in libinput section below for advanced
@ -688,6 +759,9 @@ extending outward from the snapped edge.
tablet specific restrictions, e.g. no support for drag-and-drop, but tablet specific restrictions, e.g. no support for drag-and-drop, but
also omits tablet specific features like reporting pen pressure. also omits tablet specific features like reporting pen pressure.
Use the *ToggleTabletMouseEmulation* action for toggling between
mouse emulation on and off.
*<tablet><map button="" to="" />* *<tablet><map button="" to="" />*
Pen and pad buttons behave like regular mouse buttons.With mouse Pen and pad buttons behave like regular mouse buttons.With mouse
emulation set to "no", which is the default, and if not specified emulation set to "no", which is the default, and if not specified
@ -724,6 +798,24 @@ extending outward from the snapped edge.
See mouse section above for all supported mouse buttons. See mouse section above for all supported mouse buttons.
## TABLET TOOL
```
<tabletTool motion="absolute" relativeMotionSensitivity="1" />
```
*<tabletTool motion="">* [absolute|relative]
All tablet tools, except of type mouse and lens, use "absolute"
positioning by default. The *motion* attribute allows to set tools
to relative motion instead. Positioning for a tablet mouse or
tablet lens cannot be changed, those tools always use relative mode.
*<tabletTool relativeMotionSensitivity="">*
When using relative motion, *relativeMotionSensitivity* controls
the speed of the cursor. Using a value lower than 1.0 decreases the
speed, using a value greater than 1.0 increases the speed of the
cursor. The default is "1.0".
## LIBINPUT ## LIBINPUT
``` ```
@ -742,6 +834,7 @@ extending outward from the snapped edge.
<clickMethod></clickMethod> <clickMethod></clickMethod>
<sendEventsMode></sendEventsMode> <sendEventsMode></sendEventsMode>
<calibrationMatrix></calibrationMatrix> <calibrationMatrix></calibrationMatrix>
<scrollFactor>1.0</scrollFactor>
</device> </device>
</libinput> </libinput>
``` ```
@ -867,6 +960,9 @@ The most common matrices are:
visit https://wayland.freedesktop.org/libinput/doc/latest/absolute-axes.html#calibration-of-absolute-devices visit https://wayland.freedesktop.org/libinput/doc/latest/absolute-axes.html#calibration-of-absolute-devices
for more information. for more information.
*<libinput><scrollFactor>*
Set scroll factor. Default is 1.0.
## WINDOW RULES ## WINDOW RULES
Two types of window rules are supported, actions and properties. They are Two types of window rules are supported, actions and properties. They are
@ -960,7 +1056,7 @@ situation.
*<menu><ignoreButtonReleasePeriod>* *<menu><ignoreButtonReleasePeriod>*
How long (in milliseconds) the initial button release event is ignored How long (in milliseconds) the initial button release event is ignored
for. The reason for this logic and behaviour is to avoid a fast for. The reason for this logic and behaviour is to avoid a fast
press-move-release sequence indended to just open the menu resulting in press-move-release sequence intended to just open the menu resulting in
the closure of the menu or the selection of (typically the first) menu the closure of the menu or the selection of (typically the first) menu
item. This behaviour only affects the first button-release. It is not item. This behaviour only affects the first button-release. It is not
anticipated that most users will want to change this, but the config anticipated that most users will want to change this, but the config

View file

@ -25,7 +25,7 @@ The menu file must be entirely enclosed within <openbox_menu> and
<!-- A submenu defined elsewhere --> <!-- A submenu defined elsewhere -->
<menu id="" /> <menu id="" />
<!-- Horizontal line > <!-- Horizontal line -->
<separator /> <separator />
<!-- An inline submenu --> <!-- An inline submenu -->
@ -33,6 +33,9 @@ The menu file must be entirely enclosed within <openbox_menu> and
...some content... ...some content...
</menu> </menu>
<!-- Title -->
<separator label=""/>
<!-- Pipemenu --> <!-- Pipemenu -->
<menu id="" label="" execute="COMMAND"/> <menu id="" label="" execute="COMMAND"/>
@ -45,6 +48,12 @@ The menu file must be entirely enclosed within <openbox_menu> and
ShowMenu action. Default identifiers are ShowMenu action. Default identifiers are
- "root-menu" for the root window context menu - "root-menu" for the root window context menu
- "client-menu" for a window's titlebar context menu - "client-menu" for a window's titlebar context menu
- "client-list-combined-menu" for a list of all windows across
all workspaces. Will change focus to the app that gets
selected or go to workspace without activating any app if
"Go there" is selected.
- "client-send-to-menu" shows all workspaces and sends current
view to that workspace when selected.
*menu.id* (when nested under other *<menu>* element) *menu.id* (when nested under other *<menu>* element)
Link to a submenu defined elsewhere (by a *<menu id="">* at toplevel) Link to a submenu defined elsewhere (by a *<menu id="">* at toplevel)
@ -63,6 +72,11 @@ The menu file must be entirely enclosed within <openbox_menu> and
*menu.separator* *menu.separator*
Horizontal line. Horizontal line.
*menu.separator.label*
In a "separator" element, the label attribute transforms the separator
from a horizontal line to a menu title (heading) with the text specified
by label in it.
*menu.execute* *menu.execute*
Command to execute for pipe menu. See details below. Command to execute for pipe menu. See details below.

View file

@ -47,17 +47,17 @@ labwc-config(5).
# THEME ELEMENTS # THEME ELEMENTS
*border.width* *border.width*
Line width (integer) of border border drawn around window frames. Line width (integer) of border drawn around window frames.
Default is 1. Default is 1.
*padding.height* *window.titlebar.padding.width*
Vertical padding size, used for spacing out elements in the window Horizontal titlebar padding size, in pixels, between border and first
decorations. Default is 3. button on the left/right.
Default is 0.
*titlebar.height* *window.titlebar.padding.height*
Window title bar height. Vertical titlebar padding size, in pixels.
Default equals the vertical font extents of the title plus 2x Default is 0.
padding.height.
*menu.items.padding.x* *menu.items.padding.x*
Horizontal padding of menu text entries in pixels. Horizontal padding of menu text entries in pixels.
@ -67,6 +67,10 @@ labwc-config(5).
Vertical padding of menu text entries in pixels. Vertical padding of menu text entries in pixels.
Default is 4. Default is 4.
*menu.title.text.justify*
Specifies how menu titles are aligned in the titlebar.
Type justification. Default Center.
*menu.overlap.x* *menu.overlap.x*
Horizontal overlap in pixels between submenus and their parents. A Horizontal overlap in pixels between submenus and their parents. A
positive value move submenus over the top of their parents, whereas a positive value move submenus over the top of their parents, whereas a
@ -114,6 +118,22 @@ labwc-config(5).
Specifies how window titles are aligned in the titlebar for both Specifies how window titles are aligned in the titlebar for both
focused and unfocused windows. Type justification. Default Left. focused and unfocused windows. Type justification. Default Left.
*window.button.width*
Width of a titlebar button, in pixels.
Default is 26.
*window.button.spacing*
Space between titlebar buttons, in pixels.
Default is 0.
*window.button.hover.bg.corner-radius*
Radius of the hover effect of a titlebar button, in pixels.
Default is 0.
Note: for a circular hover effect, set *window.button.width* and
*window.button.height* equal and *window.button.hover.bg.corner-radius* half
of them.
*window.active.button.unpressed.image.color* *window.active.button.unpressed.image.color*
Color of the images in titlebar buttons in their default, unpressed, Color of the images in titlebar buttons in their default, unpressed,
state. This element is for the focused window. state. This element is for the focused window.
@ -122,13 +142,19 @@ labwc-config(5).
Color of the images in titlebar buttons in their default, unpressed, Color of the images in titlebar buttons in their default, unpressed,
state. This element is for non-focused windows. state. This element is for non-focused windows.
Note: The button elements (i.e. window.[in]active.button.\*) support defining Note: Button elements (i.e. window.[in]active.button.\*) may be defined uniquely
different types of buttons individually by inserting the type ("menu", for each type of button ("menu", "iconify", "max", "shade", "desk" or "close")
"iconify", "max" and "close") after the button node. For example: by appending the type after the "button" node. For example:
window.active.button.iconify.unpressed.image.color
This syntax is not documented on the openbox.org wiki, but is supported by - window.active.button.iconify.unpressed.image.color indicates the color of the
openbox and is used by many popular themes. For the sake of brevity, these iconify button for active windows; while
elements are not listed here, but are supported.
- window.inactive.button.close.unpressed.image.color indicates the color of the
close button for inactive windows.
This syntax is not documented by Openbox, but is supported and is used by many
popular themes. For the sake of brevity, these elements are not listed here, but
all are supported.
*window.active.shadow.size* *window.active.shadow.size*
Size of the drop-shadow for the focused window, in pixels. Size of the drop-shadow for the focused window, in pixels.
@ -170,6 +196,13 @@ elements are not listed here, but are supported.
*menu.separator.color* *menu.separator.color*
Menu separator color. Default #888888. Menu separator color. Default #888888.
*menu.title.bg.color*
Menu title color. Default #589bda.
Note: A menu title is a separator with a label.
*menu.title.text.color*
Text color of separator label. Default #ffffff.
*osd.bg.color* *osd.bg.color*
Background color of on-screen-display. Inherits Background color of on-screen-display. Inherits
*window.active.title.bg.color* if not set. *window.active.title.bg.color* if not set.
@ -303,6 +336,10 @@ file within a particular theme. The following xbm buttons are supported:
- close.xbm - close.xbm
- menu.xbm - menu.xbm
- max_toggled.xbm - max_toggled.xbm
- desk.xbm
- desk_toggled.xbm
- shade.xbm
- shade_toggled.xbm
Additional icons can be defined to be shown when the mouse pointer is hovering Additional icons can be defined to be shown when the mouse pointer is hovering
over the button in question: over the button in question:
@ -312,6 +349,10 @@ over the button in question:
- close_hover.xbm - close_hover.xbm
- menu_hover.xbm - menu_hover.xbm
- max_toggled_hover.xbm - max_toggled_hover.xbm
- desk_hover.xbm
- desk_toggle_hover.xbm
- shade_hover.xbm
- shade_toggle_hover.xbm
One advantage of xbm buttons over other formats is that they change color based One advantage of xbm buttons over other formats is that they change color based
on the theme. Other formats use the suffices "-active" and "-inactive" to align on the theme. Other formats use the suffices "-active" and "-inactive" to align
@ -345,6 +386,22 @@ following icons should be added:
- menu_hover-active.[png|svg] - menu_hover-active.[png|svg]
- menu_hover-inactive.[png|svg] - menu_hover-inactive.[png|svg]
- menu-inactive.[png|svg] - menu-inactive.[png|svg]
- shade-active.[png|svg]
- shade_hover-active.[png|svg]
- shade_hover-inactive.[png|svg]
- shade-inactive.[png|svg]
- shade_toggled-active.[png|svg]
- shade_toggled-inactive.[png|svg]
- shade_toggled_hover-active.[png|svg]
- shade_toggled_hover-inactive.[png|svg]
- desk-active.[png|svg]
- desk_hover-active.[png|svg]
- desk_hover-inactive.[png|svg]
- desk-inactive.[png|svg]
- desk_toggled-active.[png|svg]
- desk_toggled-inactive.[png|svg]
- desk_toggled_hover-active.[png|svg]
- desk_toggled_hover-inactive.[png|svg]
# DEFINITIONS # DEFINITIONS

View file

@ -37,12 +37,24 @@
<action name="ToggleOmnipresent" /> <action name="ToggleOmnipresent" />
</item> </item>
</menu> </menu>
<!--
openbox default workspace selector
to use replace above workspace menu with the example below
the label is required, but you can change the text.
<menu id="client-send-to-menu" label="Send to..." />
-->
<item label="Close"> <item label="Close">
<action name="Close" /> <action name="Close" />
</item> </item>
</menu> </menu>
<menu id="root-menu"> <menu id="root-menu">
<!-- Make client-list-combined-menu a submenu of root-menu
You must supply a label or it will not appear in root-menu -->
<!--
<menu id="client-list-combined-menu" label="Running..." />
-->
<item label="Web browser"> <item label="Web browser">
<action name="Execute" command="firefox" /> <action name="Execute" command="firefox" />
</item> </item>
@ -61,6 +73,12 @@
</menu> </menu>
<menu id="some-custom-menu"> <menu id="some-custom-menu">
<!--
Creates menu title.
To create an empty header with no text,
set label=" ", not label=""
-->
<separator label="custom menu" />
<item label="Reconfigure"> <item label="Reconfigure">
<action name="Reconfigure" /> <action name="Reconfigure" />
</item> </item>

View file

@ -13,15 +13,26 @@
<adaptiveSync>no</adaptiveSync> <adaptiveSync>no</adaptiveSync>
<allowTearing>no</allowTearing> <allowTearing>no</allowTearing>
<reuseOutputMode>no</reuseOutputMode> <reuseOutputMode>no</reuseOutputMode>
<xwaylandPersistence>no</xwaylandPersistence>
</core> </core>
<placement> <placement>
<policy>center</policy> <policy>center</policy>
<!--
When <placement><policy> is "cascade", the offset for cascading new
windows can be overwritten like this:
<cascadeOffset x="40" y="30" />
-->
</placement> </placement>
<!-- <font><theme> can be defined without an attribute to set all places --> <!-- <font><theme> can be defined without an attribute to set all places -->
<theme> <theme>
<name></name> <name></name>
<icon></icon>
<titlebar>
<layout>icon:iconify,max,close</layout>
<showTitle>yes</showTitle>
</titlebar>
<cornerRadius>8</cornerRadius> <cornerRadius>8</cornerRadius>
<keepBorder>yes</keepBorder> <keepBorder>yes</keepBorder>
<dropShadows>no</dropShadows> <dropShadows>no</dropShadows>
@ -37,6 +48,12 @@
<slant>normal</slant> <slant>normal</slant>
<weight>normal</weight> <weight>normal</weight>
</font> </font>
<font place="MenuHeader">
<name>sans</name>
<size>10</size>
<slant>normal</slant>
<weight>normal</weight>
</font>
<font place="MenuItem"> <font place="MenuItem">
<name>sans</name> <name>sans</name>
<size>10</size> <size>10</size>
@ -101,6 +118,10 @@
<resistance> <resistance>
<screenEdgeStrength>20</screenEdgeStrength> <screenEdgeStrength>20</screenEdgeStrength>
<windowEdgeStrength>20</windowEdgeStrength> <windowEdgeStrength>20</windowEdgeStrength>
<!-- resistance for maximized/tiled windows -->
<unSnapThreshold>20</unSnapThreshold>
<!-- resistance for vertically/horizontally maximized windows -->
<unMaximizeThreshold>150</unMaximizeThreshold>
</resistance> </resistance>
<resize> <resize>
@ -252,7 +273,7 @@
<action name="SnapToEdge" direction="down" /> <action name="SnapToEdge" direction="down" />
</keybind> </keybind>
<keybind key="A-Space"> <keybind key="A-Space">
<action name="ShowMenu" menu="client-menu" /> <action name="ShowMenu" menu="client-menu" atCursor="no" />
</keybind> </keybind>
<keybind key="XF86_AudioLowerVolume"> <keybind key="XF86_AudioLowerVolume">
<action name="Execute" command="amixer sset Master 5%-" /> <action name="Execute" command="amixer sset Master 5%-" />
@ -299,6 +320,16 @@
<action name="SnapToRegion" region="bottom-right" /> <action name="SnapToRegion" region="bottom-right" />
</keybind> </keybind>
--> -->
<!-- keybind for client-list-combined-menu - will center in middle of screen -->
<!--
<keybind key="W-Space">
<action name="ShowMenu" menu="client-list-combined-menu" />
<position>
<x>center</x>
<y>center</y>
</position>
</keybind>
-->
</keyboard> </keyboard>
<!-- <!--
@ -316,7 +347,6 @@
<!-- time is in ms --> <!-- time is in ms -->
<doubleClickTime>500</doubleClickTime> <doubleClickTime>500</doubleClickTime>
<scrollFactor>1.0</scrollFactor>
<context name="Frame"> <context name="Frame">
<mousebind button="A-Left" action="Press"> <mousebind button="A-Left" action="Press">
@ -421,10 +451,31 @@
<context name="WindowMenu"> <context name="WindowMenu">
<mousebind button="Left" action="Click"> <mousebind button="Left" action="Click">
<action name="ShowMenu" menu="client-menu" /> <action name="ShowMenu" menu="client-menu" atCursor="no" />
</mousebind> </mousebind>
<mousebind button="Right" action="Click"> <mousebind button="Right" action="Click">
<action name="ShowMenu" menu="client-menu" /> <action name="ShowMenu" menu="client-menu" atCursor="no" />
</mousebind>
</context>
<context name="Icon">
<mousebind button="Left" action="Click">
<action name="ShowMenu" menu="client-menu" atCursor="no" />
</mousebind>
<mousebind button="Right" action="Click">
<action name="ShowMenu" menu="client-menu" atCursor="no" />
</mousebind>
</context>
<context name="Shade">
<mousebind button="Left" action="Click">
<action name="ToggleShade" />
</mousebind>
</context>
<context name="AllDesktops">
<mousebind button="Left" action="Click">
<action name="ToggleOmnipresent" />
</mousebind> </mousebind>
</context> </context>
@ -464,6 +515,8 @@
</mousebind> </mousebind>
<mousebind button="Middle" action="Press"> <mousebind button="Middle" action="Press">
<action name="ShowMenu" menu="root-menu" /> <action name="ShowMenu" menu="root-menu" />
<!-- openbox default, swap with above line to activate -->
<!-- <action name="ShowMenu" menu="client-list-combined-menu" /> -->
</mousebind> </mousebind>
<mousebind direction="Up" action="Scroll"> <mousebind direction="Up" action="Scroll">
<action name="GoToDesktop" to="left" wrap="yes" /> <action name="GoToDesktop" to="left" wrap="yes" />
@ -523,6 +576,16 @@
<map button="Stylus2" to="Middle" /> <map button="Stylus2" to="Middle" />
</tablet> </tablet>
<!--
All tablet tools, except of type mouse and lens, use absolute
positioning by default. The *motion* attribute allows to set tools
to relative motion instead. When using relative motion,
*relativeMotionSensitivity* controls the speed of the cursor. Using
a value lower than 1.0 decreases the speed, using a value greater than
1.0 increases the speed of the cursor.
-->
<tabletTool motion="absolute" relativeMotionSensitivity="1.0" />
<!-- <!--
The *category* attribute is optional and can be set to touch, touchpad, The *category* attribute is optional and can be set to touch, touchpad,
non-touch, default or the name of a device. You can obtain device names by non-touch, default or the name of a device. You can obtain device names by
@ -538,6 +601,7 @@
- clickMethod [none|buttonAreas|clickfinger] - clickMethod [none|buttonAreas|clickfinger]
- sendEventsMode [yes|no|disabledOnExternalMouse] - sendEventsMode [yes|no|disabledOnExternalMouse]
- calibrationMatrix [six float values split by space] - calibrationMatrix [six float values split by space]
- scrollFactor [float]
--> -->
<libinput> <libinput>
<device category="default"> <device category="default">
@ -554,6 +618,7 @@
<clickMethod></clickMethod> <clickMethod></clickMethod>
<sendEventsMode></sendEventsMode> <sendEventsMode></sendEventsMode>
<calibrationMatrix></calibrationMatrix> <calibrationMatrix></calibrationMatrix>
<scrollFactor>1.0</scrollFactor>
</device> </device>
</libinput> </libinput>

View file

@ -7,11 +7,13 @@
# general # general
border.width: 1 border.width: 1
padding.height: 3
# The following options has no default, but fallbacks back to #
# font-height + 2x padding.height if not set. # We do not support the global padding.{width,height} of openbox because
# titlebar.height: # the default labwc button geometry has deviates from that of openbox
#
window.titlebar.padding.width: 0
window.titlebar.padding.height: 0
# window border # window border
window.active.border.color: #e1dedb window.active.border.color: #e1dedb
@ -29,6 +31,14 @@ window.active.label.text.color: #000000
window.inactive.label.text.color: #000000 window.inactive.label.text.color: #000000
window.label.text.justify: center window.label.text.justify: center
# window button width and spacing
window.button.width: 26
window.button.height: 26
window.button.spacing: 0
# window button hover effect
window.button.hover.bg.corner-radius: 0
# window buttons # window buttons
window.active.button.unpressed.image.color: #000000 window.active.button.unpressed.image.color: #000000
window.inactive.button.unpressed.image.color: #000000 window.inactive.button.unpressed.image.color: #000000
@ -59,6 +69,9 @@ menu.separator.width: 1
menu.separator.padding.width: 6 menu.separator.padding.width: 6
menu.separator.padding.height: 3 menu.separator.padding.height: 3
menu.separator.color: #888888 menu.separator.color: #888888
menu.title.bg.color: #589bda
menu.title.text.color: #ffffff
menu.title.text.justify: Center
# on screen display (window-cycle dialog) # on screen display (window-cycle dialog)
osd.bg.color: #e1dedb osd.bg.color: #e1dedb

28
docs/xinitrc Normal file
View file

@ -0,0 +1,28 @@
#!/bin/sh
## This file is run every time labwc launches Xwayland.
##
## In the default configuration, Xwayland will be launched lazily, and will
## terminate after several seconds when no X11 clients are connected. Thus,
## this script may run repeatedly throughout a single labwc session.
# Configure the X resource database if a file is provided
#
# NOTE: when Xwayland is launched lazily, an X11 client that triggers its
# launch may attempt to read the resource database before this command can be
# run. In that case, it is recommended to make a symlink to .Xdefaults:
#
# ln -s .Xresources "${HOME}/.Xdefaults"
#
# With this link in place, X11 applications will fall back to reading
# the .Xdefaults file directly when no resource database can be read from the
# server's root window properties.
#
# Invoking xrdb is still useful to pre-load the resource database for
# subsequent clients, because any additional clients launched while the X
# server remains alive will be able to query the database without resorting to
# filesystem access.
if [ -r "${HOME}/.Xresources" ] && command -v xrdb >/dev/null 2>&1; then
xrdb -merge "${HOME}/.Xresources"
fi

View file

@ -7,6 +7,7 @@
struct view; struct view;
struct server; struct server;
struct cursor_context;
struct action { struct action {
struct wl_list link; /* struct wl_list link; /*
@ -34,8 +35,16 @@ void action_arg_from_xml_node(struct action *action, const char *nodename, const
bool actions_contain_toggle_keybinds(struct wl_list *action_list); bool actions_contain_toggle_keybinds(struct wl_list *action_list);
/**
* actions_run() - Run actions.
* @activator: Target view to apply actions (e.g. Maximize, Focus etc.).
* NULL is allowed, in which case the focused/hovered view is used.
* @ctx: Set for action invocations via mousebindings. Used to get the
* direction of resize or the position of the window menu button for ShowMenu
* action.
*/
void actions_run(struct view *activator, struct server *server, void actions_run(struct view *activator, struct server *server,
struct wl_list *actions, uint32_t resize_edges); struct wl_list *actions, struct cursor_context *ctx);
void action_free(struct action *action); void action_free(struct action *action);
void action_list_free(struct wl_list *action_list); void action_list_free(struct wl_list *action_list);

View file

@ -32,21 +32,55 @@
struct lab_data_buffer { struct lab_data_buffer {
struct wlr_buffer base; struct wlr_buffer base;
cairo_t *cairo; cairo_surface_t *surface; /* optional */
void *data; cairo_t *cairo; /* optional */
void *data; /* owned by surface if surface != NULL */
uint32_t format; uint32_t format;
size_t stride; size_t stride;
bool free_on_destroy; /*
uint32_t unscaled_width; * The logical size of the surface in layout pixels.
uint32_t unscaled_height; * The raw pixel data may be larger or smaller.
*/
uint32_t logical_width;
uint32_t logical_height;
}; };
/* Create a buffer which creates a new cairo CAIRO_FORMAT_ARGB32 surface */ /*
struct lab_data_buffer *buffer_create_cairo(uint32_t width, uint32_t height, * Create a buffer which holds (and takes ownership of) an existing
float scale, bool free_on_destroy); * CAIRO_FORMAT_ARGB32 image surface.
*
* The logical size is set to the surface size in pixels, ignoring
* device scale. No cairo context is created.
*/
struct lab_data_buffer *buffer_adopt_cairo_surface(cairo_surface_t *surface);
/* Create a buffer which wraps a given DRM_FORMAT_ARGB8888 pointer */ /*
struct lab_data_buffer *buffer_create_wrap(void *pixel_data, uint32_t width, * Create a buffer which holds a new CAIRO_FORMAT_ARGB32 image surface.
uint32_t height, uint32_t stride, bool free_on_destroy); * Additionally create a cairo context for drawing to the surface.
*/
struct lab_data_buffer *buffer_create_cairo(uint32_t logical_width,
uint32_t logical_height, float scale);
/*
* Create a buffer from an image surface, for display as an icon.
*
* The surface is either adopted by the buffer (which takes ownership),
* or copied and then destroyed.
*
* This function allows non-ARGB32 source images and converts to
* CAIRO_FORMAT_ARGB32 if needed.
*/
struct lab_data_buffer *buffer_convert_cairo_surface_for_icon(
cairo_surface_t *surface, uint32_t icon_size, float scale);
/*
* Create a buffer which holds (and takes ownership of) raw pixel data
* in pre-multiplied ARGB32 format.
*
* The logical size is set to the width and height of the pixel data.
* No cairo surface or context is created.
*/
struct lab_data_buffer *buffer_create_from_data(void *pixel_data, uint32_t width,
uint32_t height, uint32_t stride);
#endif /* LABWC_BUFFER_H */ #endif /* LABWC_BUFFER_H */

View file

@ -1,9 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_BUTTON_PNG_H
#define LABWC_BUTTON_PNG_H
struct lab_data_buffer;
void button_png_load(const char *button_name, struct lab_data_buffer **buffer);
#endif /* LABWC_BUTTON_PNG_H */

View file

@ -1,10 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_BUTTON_SVG_H
#define LABWC_BUTTON_SVG_H
struct lab_data_buffer;
void button_svg_load(const char *button_name, struct lab_data_buffer **buffer,
int size);
#endif /* LABWC_BUTTON_SVG_H */

View file

@ -1,22 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_BUTTON_XBM_H
#define LABWC_BUTTON_XBM_H
struct lab_data_buffer;
/**
* button_xbm_from_bitmap() - create button from monochrome bitmap
* @bitmap: bitmap data array in hexadecimal xbm format
* @buffer: cairo-surface-buffer to create
* @rgba: color
*
* Example bitmap: char button[6] = { 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f };
*/
void button_xbm_from_bitmap(const char *bitmap, struct lab_data_buffer **buffer,
float *rgba);
/* button_xbm_load - Convert xbm file to buffer with cairo surface */
void button_xbm_load(const char *button_name, struct lab_data_buffer **buffer,
float *rgba);
#endif /* LABWC_BUTTON_XBM_H */

View file

@ -1,17 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_BUTTON_COMMON_H
#define LABWC_BUTTON_COMMON_H
#include <stddef.h>
/**
* button_filename() - Get full filename for button.
* @name: The name of the button (for example 'iconify.xbm').
* @buf: Buffer to fill with the full filename
* @len: Length of buffer
*
* Example return value: /usr/share/themes/Numix/openbox-3/iconify.xbm
*/
void button_filename(const char *name, char *buf, size_t len);
#endif /* LABWC_BUTTON_COMMON_H */

View file

@ -1,6 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_ARRAY_H #ifndef LABWC_ARRAY_H
#define LABWC_ARRAY_H #define LABWC_ARRAY_H
#include <stdio.h>
#include <stdlib.h>
#include <wayland-server-core.h> #include <wayland-server-core.h>
/* /*
@ -41,4 +43,34 @@ wl_array_len(struct wl_array *array)
pos && (const char *)pos >= (const char *)(array)->data; \ pos && (const char *)pos >= (const char *)(array)->data; \
(pos)--) (pos)--)
/**
* array_add() - add item to wl_array and exit on allocation error
* @_arr: wl_array to add the item to
* @_val: the item to add to the array
*
* Let us illustrate the function of this macro by an example:
*
* uint32_t value = 5;
* array_add(array, value);
*
* ...is the equivalent of the code below which is how you would
* otherwise use the wl_array API:
*
* uint32_t *elm = wl_array_add(array, sizeof(uint32_t));
* if (!elm) {
* perror("failed to allocate memory");
* exit(EXIT_FAILURE);
* }
* *elm = value;
*/
#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); \
} \
*_entry = (_val); \
} while (0)
#endif /* LABWC_ARRAY_H */ #endif /* LABWC_ARRAY_H */

26
include/common/box.h Normal file
View file

@ -0,0 +1,26 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_BOX_H
#define LABWC_BOX_H
#include <wlr/util/box.h>
bool box_contains(struct wlr_box *box_super, struct wlr_box *box_sub);
bool box_intersects(struct wlr_box *box_a, struct wlr_box *box_b);
/* Returns the bounding box of 2 boxes */
void box_union(struct wlr_box *box_dest, struct wlr_box *box_a,
struct wlr_box *box_b);
/*
* Fits and centers a content box (width & height) within a bounding box
* (max_width & max_height). The content box is downscaled if necessary
* (preserving aspect ratio) but not upscaled.
*
* 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, int max_width,
int max_height);
#endif /* LABWC_BOX_H */

View file

@ -43,6 +43,13 @@ void buf_expand_tilde(struct buf *s);
*/ */
void buf_expand_shell_variables(struct buf *s); void buf_expand_shell_variables(struct buf *s);
/**
* buf_add_fmt - add format string to C string buffer
* @s: buffer
* @fmt: format string to be added
*/
void buf_add_fmt(struct buf *s, const char *fmt, ...);
/** /**
* buf_add - add data to C string buffer * buf_add - add data to C string buffer
* @s: buffer * @s: buffer

View file

@ -0,0 +1,10 @@
/* 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 */

View file

@ -6,7 +6,8 @@ struct lab_data_buffer;
enum font_slant { enum font_slant {
FONT_SLANT_NORMAL = 0, FONT_SLANT_NORMAL = 0,
FONT_SLANT_ITALIC FONT_SLANT_ITALIC,
FONT_SLANT_OBLIQUE
}; };
enum font_weight { enum font_weight {

View file

@ -7,6 +7,7 @@
struct wlr_scene_node; struct wlr_scene_node;
struct wlr_surface; struct wlr_surface;
struct wlr_scene_output; struct wlr_scene_output;
struct wlr_output_state;
struct wlr_surface *lab_wlr_surface_from_node(struct wlr_scene_node *node); struct wlr_surface *lab_wlr_surface_from_node(struct wlr_scene_node *node);
@ -18,6 +19,7 @@ struct wlr_surface *lab_wlr_surface_from_node(struct wlr_scene_node *node);
struct wlr_scene_node *lab_wlr_scene_get_prev_node(struct wlr_scene_node *node); 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 */ /* A variant of wlr_scene_output_commit() that respects wlr_output->pending */
bool lab_wlr_scene_output_commit(struct wlr_scene_output *scene_output); bool lab_wlr_scene_output_commit(struct wlr_scene_output *scene_output,
struct wlr_output_state *output_state);
#endif /* LABWC_SCENE_HELPERS_H */ #endif /* LABWC_SCENE_HELPERS_H */

19
include/common/set.h Normal file
View file

@ -0,0 +1,19 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_SET_H
#define LABWC_SET_H
#include <stdbool.h>
#include <stdint.h>
#define LAB_SET_MAX_SIZE 16
struct lab_set {
uint32_t values[LAB_SET_MAX_SIZE];
int size;
};
bool lab_set_contains(struct lab_set *set, uint32_t value);
void lab_set_add(struct lab_set *set, uint32_t value);
void lab_set_remove(struct lab_set *set, uint32_t value);
#endif /* LABWC_SET_H */

View file

@ -322,6 +322,16 @@ static struct mouse_combos {
.button = "Left", .button = "Left",
.event = "Click", .event = "Click",
.action = "ToggleMaximize", .action = "ToggleMaximize",
}, {
.context = "Shade",
.button = "Left",
.event = "Click",
.action = "ToggleShade",
}, {
.context = "AllDesktops",
.button = "Left",
.event = "Click",
.action = "ToggleOmnipresent",
}, { }, {
.context = "Maximize", .context = "Maximize",
.button = "Right", .button = "Right",
@ -366,6 +376,32 @@ static struct mouse_combos {
.name = "atCursor", .name = "atCursor",
.value = "no", .value = "no",
}, },
}, {
.context = "Icon",
.button = "Left",
.event = "Click",
.action = "ShowMenu",
.attributes[0] = {
.name = "menu",
.value = "client-menu",
},
.attributes[1] = {
.name = "atCursor",
.value = "no",
},
}, {
.context = "Icon",
.button = "Right",
.event = "Click",
.action = "ShowMenu",
.attributes[0] = {
.name = "menu",
.value = "client-menu",
},
.attributes[1] = {
.name = "atCursor",
.value = "no",
},
}, { }, {
.context = "Root", .context = "Root",
.button = "Left", .button = "Left",

View file

@ -18,6 +18,7 @@ struct keybind {
xkb_keycode_t keycodes[MAX_KEYCODES]; xkb_keycode_t keycodes[MAX_KEYCODES];
size_t keycodes_len; size_t keycodes_len;
int keycodes_layout; int keycodes_layout;
bool allow_when_locked;
struct wl_list actions; /* struct action.link */ struct wl_list actions; /* struct action.link */
struct wl_list link; /* struct rcxml.keybinds */ struct wl_list link; /* struct rcxml.keybinds */
bool on_release; bool on_release;

View file

@ -31,6 +31,7 @@ struct libinput_category {
int click_method; /* -1 or libinput_config_click_method */ int click_method; /* -1 or libinput_config_click_method */
int send_events_mode; /* -1 or libinput_config_send_events_mode */ int send_events_mode; /* -1 or libinput_config_send_events_mode */
bool have_calibration_matrix; bool have_calibration_matrix;
double scroll_factor;
float calibration_matrix[6]; float calibration_matrix[6];
}; };

View file

@ -11,15 +11,18 @@
#include "common/font.h" #include "common/font.h"
#include "config/touch.h" #include "config/touch.h"
#include "config/tablet.h" #include "config/tablet.h"
#include "config/tablet-tool.h"
#include "config/libinput.h" #include "config/libinput.h"
#include "resize-indicator.h" #include "resize-indicator.h"
#include "ssd.h"
#include "theme.h" #include "theme.h"
enum view_placement_policy { enum view_placement_policy {
LAB_PLACE_INVALID = 0, LAB_PLACE_INVALID = 0,
LAB_PLACE_CENTER, LAB_PLACE_CENTER,
LAB_PLACE_CURSOR, LAB_PLACE_CURSOR,
LAB_PLACE_AUTOMATIC LAB_PLACE_AUTOMATIC,
LAB_PLACE_CASCADE,
}; };
enum adaptive_sync_mode { enum adaptive_sync_mode {
@ -28,6 +31,13 @@ enum adaptive_sync_mode {
LAB_ADAPTIVE_SYNC_FULLSCREEN, LAB_ADAPTIVE_SYNC_FULLSCREEN,
}; };
enum tearing_mode {
LAB_TEARING_DISABLED = 0,
LAB_TEARING_ENABLED,
LAB_TEARING_FULLSCREEN,
LAB_TEARING_FULLSCREEN_FORCED,
};
enum tiling_events_mode { enum tiling_events_mode {
LAB_TILING_EVENTS_NEVER = 0, LAB_TILING_EVENTS_NEVER = 0,
LAB_TILING_EVENTS_REGION = 1 << 0, LAB_TILING_EVENTS_REGION = 1 << 0,
@ -36,6 +46,11 @@ enum tiling_events_mode {
(LAB_TILING_EVENTS_REGION | LAB_TILING_EVENTS_EDGE), (LAB_TILING_EVENTS_REGION | LAB_TILING_EVENTS_EDGE),
}; };
struct title_button {
enum ssd_part_type type;
struct wl_list link;
};
struct usable_area_override { struct usable_area_override {
struct border margin; struct border margin;
char *output; char *output;
@ -52,9 +67,12 @@ struct rcxml {
bool xdg_shell_server_side_deco; bool xdg_shell_server_side_deco;
int gap; int gap;
enum adaptive_sync_mode adaptive_sync; enum adaptive_sync_mode adaptive_sync;
bool allow_tearing; enum tearing_mode allow_tearing;
bool reuse_output_mode; bool reuse_output_mode;
enum view_placement_policy placement_policy; enum view_placement_policy placement_policy;
bool xwayland_persistence;
int placement_cascade_offset_x;
int placement_cascade_offset_y;
/* focus */ /* focus */
bool focus_follow_mouse; bool focus_follow_mouse;
@ -63,11 +81,17 @@ struct rcxml {
/* theme */ /* theme */
char *theme_name; char *theme_name;
char *icon_theme_name;
struct wl_list title_buttons_left;
struct wl_list title_buttons_right;
int corner_radius; int corner_radius;
bool show_title;
bool title_layout_loaded;
bool ssd_keep_border; bool ssd_keep_border;
bool shadows_enabled; bool shadows_enabled;
struct font font_activewindow; struct font font_activewindow;
struct font font_inactivewindow; struct font font_inactivewindow;
struct font font_menuheader;
struct font font_menuitem; struct font font_menuitem;
struct font font_osd; struct font font_osd;
@ -87,7 +111,6 @@ struct rcxml {
/* mouse */ /* mouse */
long doubleclick_time; /* in ms */ long doubleclick_time; /* in ms */
struct wl_list mousebinds; /* struct mousebind.link */ struct wl_list mousebinds; /* struct mousebind.link */
double scroll_factor;
/* touch tablet */ /* touch tablet */
struct wl_list touch_configs; struct wl_list touch_configs;
@ -101,6 +124,10 @@ struct rcxml {
uint16_t button_map_count; uint16_t button_map_count;
struct button_map_entry button_map[BUTTON_MAP_MAX]; struct button_map_entry button_map[BUTTON_MAP_MAX];
} tablet; } tablet;
struct tablet_tool_config {
enum motion motion;
double relative_motion_sensitivity;
} tablet_tool;
/* libinput */ /* libinput */
struct wl_list libinput_categories; struct wl_list libinput_categories;
@ -108,6 +135,8 @@ struct rcxml {
/* resistance */ /* resistance */
int screen_edge_strength; int screen_edge_strength;
int window_edge_strength; int window_edge_strength;
int unsnap_threshold;
int unmaximize_threshold;
/* window snapping */ /* window snapping */
int snap_edge_range; int snap_edge_range;

View file

@ -4,6 +4,12 @@
struct server; struct server;
/**
* session_run_script - run a named session script (or, in merge-config mode,
* all named session scripts) from the XDG path.
*/
void session_run_script(const char *script);
/** /**
* session_environment_init - set environment variables based on <key>=<value> * session_environment_init - set environment variables based on <key>=<value>
* pairs in `${XDG_CONFIG_DIRS:-/etc/xdg}/labwc/environment` with user override * pairs in `${XDG_CONFIG_DIRS:-/etc/xdg}/labwc/environment` with user override

View file

@ -0,0 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_TABLET_TOOL_CONFIG_H
#define LABWC_TABLET_TOOL_CONFIG_H
#include <stdint.h>
enum motion {
LAB_TABLET_MOTION_ABSOLUTE = 0,
LAB_TABLET_MOTION_RELATIVE,
};
enum motion tablet_parse_motion(const char *name);
#endif /* LABWC_TABLET_TOOL_CONFIG_H */

12
include/icon-loader.h Normal file
View file

@ -0,0 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_ICON_LOADER_H
#define LABWC_ICON_LOADER_H
struct server;
void icon_loader_init(struct server *server);
void icon_loader_finish(struct server *server);
struct lab_data_buffer *icon_loader_lookup(struct server *server,
const char *app_id, int size, float scale);
#endif /* LABWC_ICON_LOADER_H */

10
include/img/img-png.h Normal file
View file

@ -0,0 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_IMG_PNG_H
#define LABWC_IMG_PNG_H
struct lab_data_buffer;
void img_png_load(const char *filename, struct lab_data_buffer **buffer,
int size, float scale);
#endif /* LABWC_IMG_PNG_H */

10
include/img/img-svg.h Normal file
View file

@ -0,0 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_IMG_SVG_H
#define LABWC_IMG_SVG_H
struct lab_data_buffer;
void img_svg_load(const char *filename, struct lab_data_buffer **buffer,
int size, float scale);
#endif /* LABWC_IMG_SVG_H */

22
include/img/img-xbm.h Normal file
View file

@ -0,0 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_IMG_XBM_H
#define LABWC_IMG_XBM_H
struct lab_data_buffer;
/**
* img_xbm_from_bitmap() - create button from monochrome bitmap
* @bitmap: bitmap data array in hexadecimal xbm format
* @buffer: cairo-surface-buffer to create
* @rgba: color
*
* Example bitmap: char button[6] = { 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f };
*/
void img_xbm_from_bitmap(const char *bitmap, struct lab_data_buffer **buffer,
float *rgba);
/* img_xbm_load - Convert xbm file to buffer with cairo surface */
void img_xbm_load(const char *filename, struct lab_data_buffer **buffer,
float *rgba);
#endif /* LABWC_IMG_XBM_H */

10
include/img/img-xpm.h Normal file
View file

@ -0,0 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_IMG_XPM_H
#define LABWC_IMG_XPM_H
struct lab_data_buffer;
void img_xpm_load(const char *filename, struct lab_data_buffer **buffer,
int size, float scale);
#endif /* LABWC_IMG_XPM_H */

View file

@ -11,7 +11,7 @@ struct seat;
struct server; struct server;
struct wlr_surface; struct wlr_surface;
struct wlr_scene_node; struct wlr_scene_node;
enum wlr_button_state; enum wl_pointer_button_state;
/* Cursors used internally by labwc */ /* Cursors used internally by labwc */
enum lab_cursors { enum lab_cursors {
@ -142,15 +142,18 @@ bool cursor_process_button_release(struct seat *seat, uint32_t button, uint32_t
* Finishes cursor button release. The return value indicates if an interactive * Finishes cursor button release. The return value indicates if an interactive
* move/resize had been finished. Should be called after notifying a client. * move/resize had been finished. Should be called after notifying a client.
*/ */
bool cursor_finish_button_release(struct seat *seat); bool cursor_finish_button_release(struct seat *seat, uint32_t button);
void cursor_init(struct seat *seat); void cursor_init(struct seat *seat);
void cursor_reload(struct seat *seat); void cursor_reload(struct seat *seat);
void cursor_emulate_move(struct seat *seat,
struct wlr_input_device *device,
double dx, double dy, uint32_t time_msec);
void cursor_emulate_move_absolute(struct seat *seat, void cursor_emulate_move_absolute(struct seat *seat,
struct wlr_input_device *device, struct wlr_input_device *device,
double x, double y, uint32_t time_msec); double x, double y, uint32_t time_msec);
void cursor_emulate_button(struct seat *seat, void cursor_emulate_button(struct seat *seat,
uint32_t button, enum wlr_button_state state, uint32_t time_msec); uint32_t button, enum wl_pointer_button_state state, uint32_t time_msec);
void cursor_finish(struct seat *seat); void cursor_finish(struct seat *seat);
#endif /* LABWC_CURSOR_H */ #endif /* LABWC_CURSOR_H */

View file

@ -36,7 +36,7 @@ struct drawing_tablet_pad {
struct wl_list link; /* seat.tablet_pads */ struct wl_list link; /* seat.tablet_pads */
}; };
void tablet_pad_init(struct seat *seat, struct wlr_input_device *wlr_input_device); void tablet_pad_create(struct seat *seat, struct wlr_input_device *wlr_input_device);
void tablet_pad_attach_tablet(struct seat *seat); void tablet_pad_attach_tablet(struct seat *seat);
void tablet_pad_enter_surface(struct seat *seat, struct wlr_surface *wlr_surface); void tablet_pad_enter_surface(struct seat *seat, struct wlr_surface *wlr_surface);

View file

@ -17,7 +17,7 @@ struct drawing_tablet_tool {
struct wl_list link; /* seat.tablet_tools */ struct wl_list link; /* seat.tablet_tools */
}; };
void tablet_tool_init(struct seat *seat, void tablet_tool_create(struct seat *seat,
struct wlr_tablet_tool *wlr_tablet_tool); struct wlr_tablet_tool *wlr_tablet_tool);
bool tablet_tool_has_focused_surface(struct seat *seat); bool tablet_tool_has_focused_surface(struct seat *seat);

View file

@ -14,7 +14,8 @@ struct drawing_tablet {
struct seat *seat; struct seat *seat;
struct wlr_tablet *tablet; struct wlr_tablet *tablet;
struct wlr_tablet_v2_tablet *tablet_v2; struct wlr_tablet_v2_tablet *tablet_v2;
double x, y; enum motion motion_mode;
double x, y, dx, dy;
double distance; double distance;
double pressure; double pressure;
double tilt_x, tilt_y; double tilt_x, tilt_y;
@ -22,15 +23,13 @@ struct drawing_tablet {
double slider; double slider;
double wheel_delta; double wheel_delta;
struct { struct {
struct wl_listener proximity;
struct wl_listener axis;
struct wl_listener tip;
struct wl_listener button;
struct wl_listener destroy; struct wl_listener destroy;
} handlers; } handlers;
struct wl_list link; /* seat.tablets */ struct wl_list link; /* seat.tablets */
}; };
void tablet_init(struct seat *seat, struct wlr_input_device *wlr_input_device); void tablet_init(struct seat *seat);
void tablet_finish(struct seat *seat);
void tablet_create(struct seat *seat, struct wlr_input_device *wlr_input_device);
#endif /* LABWC_TABLET_H */ #endif /* LABWC_TABLET_H */

View file

@ -44,6 +44,7 @@
#include <wlr/types/wlr_input_method_v2.h> #include <wlr/types/wlr_input_method_v2.h>
#include <wlr/types/wlr_tablet_v2.h> #include <wlr/types/wlr_tablet_v2.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include "common/set.h"
#include "config/keybind.h" #include "config/keybind.h"
#include "config/rcxml.h" #include "config/rcxml.h"
#include "input/cursor.h" #include "input/cursor.h"
@ -71,6 +72,8 @@ enum input_mode {
struct input { struct input {
struct wlr_input_device *wlr_input_device; struct wlr_input_device *wlr_input_device;
struct seat *seat; struct seat *seat;
/* Set for pointer/touch devices */
double scroll_factor;
struct wl_listener destroy; struct wl_listener destroy;
struct wl_list link; /* seat.inputs */ struct wl_list link; /* seat.inputs */
}; };
@ -127,9 +130,8 @@ struct seat {
struct input_method_relay *input_method_relay; struct input_method_relay *input_method_relay;
/** /**
* pressed view/surface/node will usually be NULL and is only set on * This is usually zeroed and is only set on button press while the
* button press while the mouse is over a view or surface, and reset * mouse is over a view or surface, and zeroed on button release.
* to NULL on button release.
* It is used to send cursor motion events to a surface even though * It is used to send cursor motion events to a surface even though
* the cursor has left the surface in the meantime. * the cursor has left the surface in the meantime.
* *
@ -142,13 +144,9 @@ struct seat {
* *
* Both (view && !surface) and (surface && !view) are possible. * Both (view && !surface) and (surface && !view) are possible.
*/ */
struct { struct cursor_context pressed;
struct view *view;
struct wlr_scene_node *node; struct lab_set bound_buttons;
struct wlr_surface *surface;
struct wlr_surface *toplevel;
uint32_t resize_edges;
} pressed;
struct { struct {
bool active; bool active;
@ -164,7 +162,6 @@ struct seat {
/* Used to prevent region snapping when starting a move with A-Left */ /* Used to prevent region snapping when starting a move with A-Left */
bool region_prevent_snap; bool region_prevent_snap;
struct wl_client *active_client_while_inhibited;
struct wl_list inputs; struct wl_list inputs;
struct wl_listener new_input; struct wl_listener new_input;
struct wl_listener focus_change; struct wl_listener focus_change;
@ -193,6 +190,11 @@ struct seat {
struct wl_listener touch_motion; struct wl_listener touch_motion;
struct wl_listener touch_frame; struct wl_listener touch_frame;
struct wl_listener tablet_tool_proximity;
struct wl_listener tablet_tool_axis;
struct wl_listener tablet_tool_tip;
struct wl_listener tablet_tool_button;
struct wl_list tablets; struct wl_list tablets;
struct wl_list tablet_tools; struct wl_list tablet_tools;
struct wl_list tablet_pads; struct wl_list tablet_pads;
@ -210,6 +212,12 @@ struct seat {
struct lab_data_buffer; struct lab_data_buffer;
struct workspace; struct workspace;
enum lab_cycle_dir {
LAB_CYCLE_DIR_NONE,
LAB_CYCLE_DIR_FORWARD,
LAB_CYCLE_DIR_BACKWARD,
};
struct server { struct server {
struct wl_display *wl_display; struct wl_display *wl_display;
struct wl_event_loop *wl_event_loop; /* Can be used for timer events */ struct wl_event_loop *wl_event_loop; /* Can be used for timer events */
@ -220,11 +228,12 @@ struct server {
struct wlr_backend *backend; struct wlr_backend *backend;
} headless; } headless;
struct wlr_session *session; struct wlr_session *session;
struct wlr_linux_dmabuf_v1 *linux_dmabuf;
struct wlr_xdg_shell *xdg_shell; struct wlr_xdg_shell *xdg_shell;
struct wlr_layer_shell_v1 *layer_shell; struct wlr_layer_shell_v1 *layer_shell;
struct wl_listener new_xdg_surface; struct wl_listener new_xdg_toplevel;
struct wl_listener new_layer_surface; struct wl_listener new_layer_surface;
struct wl_listener kde_server_decoration; struct wl_listener kde_server_decoration;
@ -236,12 +245,9 @@ struct server {
struct wl_listener xwayland_new_surface; struct wl_listener xwayland_new_surface;
#endif #endif
struct wlr_input_inhibit_manager *input_inhibit;
struct wl_listener input_inhibit_activate;
struct wl_listener input_inhibit_deactivate;
struct wlr_xdg_activation_v1 *xdg_activation; struct wlr_xdg_activation_v1 *xdg_activation;
struct wl_listener xdg_activation_request; struct wl_listener xdg_activation_request;
struct wl_listener xdg_activation_new_token;
struct wl_list views; struct wl_list views;
struct wl_list unmanaged_surfaces; struct wl_list unmanaged_surfaces;
@ -249,11 +255,14 @@ struct server {
struct seat seat; struct seat seat;
struct wlr_scene *scene; struct wlr_scene *scene;
struct wlr_scene_output_layout *scene_layout; struct wlr_scene_output_layout *scene_layout;
bool direct_scanout_enabled;
/* cursor interactive */ /* cursor interactive */
enum input_mode input_mode; enum input_mode input_mode;
struct view *grabbed_view; struct view *grabbed_view;
/* Cursor position when interactive move/resize is requested */
double grab_x, grab_y; double grab_x, grab_y;
/* View geometry when interactive move/resize is requested */
struct wlr_box grab_box; struct wlr_box grab_box;
uint32_t resize_edges; uint32_t resize_edges;
@ -294,9 +303,16 @@ struct server {
struct wlr_scene_tree *menu_tree; struct wlr_scene_tree *menu_tree;
/* Workspaces */ /* Workspaces */
struct wl_list workspaces; /* struct workspace.link */ struct {
struct workspace *workspace_current; struct wl_list all; /* struct workspace.link */
struct workspace *workspace_last; struct workspace *current;
struct workspace *last;
struct lab_cosmic_workspace_manager *cosmic_manager;
struct lab_cosmic_workspace_group *cosmic_group;
struct {
struct wl_listener layout_output_added;
} on;
} workspaces;
struct wl_list outputs; struct wl_list outputs;
struct wl_listener new_output; struct wl_listener new_output;
@ -315,6 +331,8 @@ struct server {
*/ */
int pending_output_layout_change; int pending_output_layout_change;
struct wl_listener renderer_lost;
struct wlr_gamma_control_manager_v1 *gamma_control_manager_v1; struct wlr_gamma_control_manager_v1 *gamma_control_manager_v1;
struct wl_listener gamma_control_set_gamma; struct wl_listener gamma_control_set_gamma;
@ -349,6 +367,8 @@ struct server {
struct wlr_scene_tree *preview_parent; struct wlr_scene_tree *preview_parent;
struct wlr_scene_node *preview_anchor; struct wlr_scene_node *preview_anchor;
struct multi_rect *preview_outline; struct multi_rect *preview_outline;
enum lab_cycle_dir initial_direction;
bool initial_keybind_contained_shift;
} osd_state; } osd_state;
struct theme *theme; struct theme *theme;
@ -356,6 +376,8 @@ struct server {
struct menu *menu_current; struct menu *menu_current;
struct wl_list menus; struct wl_list menus;
struct icon_loader *icon_loader;
pid_t primary_client_pid; pid_t primary_client_pid;
}; };
@ -365,6 +387,7 @@ struct output {
struct wl_list link; /* server.outputs */ struct wl_list link; /* server.outputs */
struct server *server; struct server *server;
struct wlr_output *wlr_output; struct wlr_output *wlr_output;
struct wlr_output_state pending;
struct wlr_scene_output *scene_output; struct wlr_scene_output *scene_output;
struct wlr_scene_tree *layer_tree[LAB_NR_LAYERS]; struct wlr_scene_tree *layer_tree[LAB_NR_LAYERS];
struct wlr_scene_tree *layer_popup_tree; struct wlr_scene_tree *layer_popup_tree;
@ -383,6 +406,8 @@ struct output {
bool leased; bool leased;
bool gamma_lut_changed; bool gamma_lut_changed;
uint32_t nr_tearing_failures;
}; };
#undef LAB_NR_LAYERS #undef LAB_NR_LAYERS
@ -421,7 +446,7 @@ void foreign_toplevel_update_outputs(struct view *view);
* - optionally raise above other views * - optionally raise above other views
* *
* It's okay to call this function even if the view isn't mapped or the * It's okay to call this function even if the view isn't mapped or the
* session is locked/input is inhibited; it will simply do nothing. * session is locked; it will simply do nothing.
*/ */
void desktop_focus_view(struct view *view, bool raise); void desktop_focus_view(struct view *view, bool raise);
@ -434,6 +459,7 @@ void desktop_focus_view_or_surface(struct seat *seat, struct view *view,
void desktop_arrange_all_views(struct server *server); void desktop_arrange_all_views(struct server *server);
void desktop_focus_output(struct output *output); void desktop_focus_output(struct output *output);
void warp_cursor(struct view *view);
struct view *desktop_topmost_focusable_view(struct server *server); struct view *desktop_topmost_focusable_view(struct server *server);
/** /**
@ -442,12 +468,6 @@ struct view *desktop_topmost_focusable_view(struct server *server);
*/ */
void desktop_update_top_layer_visiblity(struct server *server); void desktop_update_top_layer_visiblity(struct server *server);
enum lab_cycle_dir {
LAB_CYCLE_DIR_NONE,
LAB_CYCLE_DIR_FORWARD,
LAB_CYCLE_DIR_BACKWARD,
};
/** /**
* desktop_cycle_view - return view to 'cycle' to * desktop_cycle_view - return view to 'cycle' to
* @start_view: reference point for finding next view to cycle to * @start_view: reference point for finding next view to cycle to
@ -478,12 +498,21 @@ void seat_focus_surface(struct seat *seat, struct wlr_surface *surface);
void seat_focus_lock_surface(struct seat *seat, struct wlr_surface *surface); void seat_focus_lock_surface(struct seat *seat, struct wlr_surface *surface);
void seat_set_focus_layer(struct seat *seat, struct wlr_layer_surface_v1 *layer); void seat_set_focus_layer(struct seat *seat, struct wlr_layer_surface_v1 *layer);
void seat_set_pressed(struct seat *seat, struct view *view, void seat_set_pressed(struct seat *seat, struct cursor_context *ctx);
struct wlr_scene_node *node, struct wlr_surface *surface,
struct wlr_surface *toplevel, uint32_t resize_edges);
void seat_reset_pressed(struct seat *seat); void seat_reset_pressed(struct seat *seat);
void seat_output_layout_changed(struct seat *seat); void seat_output_layout_changed(struct seat *seat);
/**
* interactive_anchor_to_cursor() - repositions the geometry to remain
* underneath the cursor when its size changes during interactive move.
* This function also resizes server->grab_box and repositions it to remain
* underneath server->grab_{x,y}.
*
* geo->{width,height} are provided by the caller.
* geo->{x,y} are computed by this function.
*/
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, uint32_t edges);
void interactive_finish(struct view *view); void interactive_finish(struct view *view);
void interactive_cancel(struct view *view); void interactive_cancel(struct view *view);
@ -497,27 +526,44 @@ struct output *output_from_wlr_output(struct server *server,
struct output *output_from_name(struct server *server, const char *name); 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(struct server *server, int lx, int ly);
struct output *output_nearest_to_cursor(struct server *server); 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 view_edge edge, bool wrap);
bool output_is_usable(struct output *output); bool output_is_usable(struct output *output);
void output_update_usable_area(struct output *output); void output_update_usable_area(struct output *output);
void output_update_all_usable_areas(struct server *server, bool layout_changed); 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); struct wlr_box output_usable_area_in_layout_coords(struct output *output);
struct wlr_box output_usable_area_scaled(struct output *output); struct wlr_box output_usable_area_scaled(struct output *output);
void handle_output_power_manager_set_mode(struct wl_listener *listener, void handle_output_power_manager_set_mode(struct wl_listener *listener,
void *data); void *data);
void output_enable_adaptive_sync(struct wlr_output *output, bool enabled); void output_enable_adaptive_sync(struct wlr_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);
void new_tearing_hint(struct wl_listener *listener, void *data); void new_tearing_hint(struct wl_listener *listener, void *data);
void server_init(struct server *server); void server_init(struct server *server);
void server_start(struct server *server); void server_start(struct server *server);
void server_finish(struct server *server); void server_finish(struct server *server);
/*
* wlroots "input inhibitor" extension (required for swaylock) blocks
* any client other than the requesting client from receiving events
*/
bool input_inhibit_blocks_surface(struct seat *seat,
struct wl_resource *resource);
void create_constraint(struct wl_listener *listener, void *data); void create_constraint(struct wl_listener *listener, void *data);
void constrain_cursor(struct server *server, struct wlr_pointer_constraint_v1 void constrain_cursor(struct server *server, struct wlr_pointer_constraint_v1
*constraint); *constraint);

View file

@ -32,6 +32,7 @@ struct lab_layer_popup {
struct wl_listener commit; struct wl_listener commit;
struct wl_listener destroy; struct wl_listener destroy;
struct wl_listener new_popup; struct wl_listener new_popup;
struct wl_listener reposition;
}; };
void layers_init(struct server *server); void layers_init(struct server *server);

View file

@ -20,5 +20,6 @@ bool output_wants_magnification(struct output *output);
void magnify(struct output *output, struct wlr_buffer *output_buffer, void magnify(struct output *output, struct wlr_buffer *output_buffer,
struct wlr_box *damage); struct wlr_box *damage);
bool is_magnify_on(void); bool is_magnify_on(void);
void magnify_reset(void);
#endif /* LABWC_MAGNIFIER_H */ #endif /* LABWC_MAGNIFIER_H */

View file

@ -27,6 +27,12 @@ struct menu_scene {
struct scaled_font_buffer *buffer; struct scaled_font_buffer *buffer;
}; };
enum menuitem_type {
LAB_MENU_ITEM = 0,
LAB_MENU_SEPARATOR_LINE,
LAB_MENU_TITLE,
};
struct menuitem { struct menuitem {
struct wl_list actions; struct wl_list actions;
char *execute; char *execute;
@ -34,11 +40,14 @@ struct menuitem {
struct menu *parent; struct menu *parent;
struct menu *submenu; struct menu *submenu;
bool selectable; bool selectable;
enum menuitem_type type;
int height; int height;
int native_width; int native_width;
struct wlr_scene_tree *tree; struct wlr_scene_tree *tree;
struct menu_scene normal; struct menu_scene normal;
struct menu_scene selected; struct menu_scene selected;
struct menu_pipe_context *pipe_ctx;
struct view *client_list_view; /* used by internal client-list */
struct wl_list link; /* menu.menuitems */ struct wl_list link; /* menu.menuitems */
}; };
@ -46,7 +55,6 @@ struct menuitem {
struct menu { struct menu {
char *id; char *id;
char *label; char *label;
int item_height;
struct menu *parent; struct menu *parent;
struct { struct {
@ -128,4 +136,7 @@ void menu_close_root(struct server *server);
/* menu_reconfigure - reload theme and content */ /* menu_reconfigure - reload theme and content */
void menu_reconfigure(struct server *server); void menu_reconfigure(struct server *server);
void update_client_list_combined_menu(struct server *server);
void update_client_send_to_menu(struct server *server);
#endif /* LABWC_MENU_H */ #endif /* LABWC_MENU_H */

34
include/output-state.h Normal file
View file

@ -0,0 +1,34 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_OUTPUT_STATE_H
#define LABWC_OUTPUT_STATE_H
#include <stdbool.h>
struct output;
struct wlr_output;
void output_state_init(struct output *output);
/* Forward port of removed functions */
bool wlr_output_test(struct wlr_output *wlr_output);
bool wlr_output_commit(struct wlr_output *wlr_output);
void wlr_output_enable(struct wlr_output *wlr_output, bool enabled);
void wlr_output_set_mode(struct wlr_output *wlr_output,
struct wlr_output_mode *mode);
void wlr_output_set_custom_mode(struct wlr_output *wlr_output,
int32_t width, int32_t height, int32_t refresh);
void wlr_output_set_scale(struct wlr_output *wlr_output, float scale);
void wlr_output_set_transform(struct wlr_output *wlr_output,
enum wl_output_transform transform);
void wlr_output_enable_adaptive_sync(struct wlr_output *wlr_output,
bool enabled);
#endif // LABWC_OUTPUT_STATE_H

View file

@ -0,0 +1,61 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_PROTOCOLS_COSMIC_WORKSPACES_INTERNAL_H
#define LABWC_PROTOCOLS_COSMIC_WORKSPACES_INTERNAL_H
struct lab_cosmic_workspace;
struct lab_cosmic_workspace_group;
struct lab_cosmic_workspace_manager;
enum pending_change {
/* group events */
CW_PENDING_WS_CREATE = 1 << 0,
/* ws events*/
CW_PENDING_WS_ACTIVATE = 1 << 1,
CW_PENDING_WS_DEACTIVATE = 1 << 2,
CW_PENDING_WS_REMOVE = 1 << 3,
};
struct transaction {
uint32_t change;
struct wl_list link;
};
struct transaction_workspace {
struct transaction base;
struct lab_cosmic_workspace *workspace;
};
struct transaction_group {
struct transaction base;
struct lab_cosmic_workspace_group *group;
char *new_workspace_name;
};
struct session_context {
int ref_count;
struct wl_list transactions;
};
struct wl_resource_addon {
struct session_context *ctx;
void *data;
};
struct wl_resource_addon *resource_addon_create(struct session_context *ctx);
void transaction_add_workspace_ev(struct lab_cosmic_workspace *ws,
struct wl_resource *resource, enum pending_change change);
void transaction_add_workspace_group_ev(struct lab_cosmic_workspace_group *group,
struct wl_resource *resource, enum pending_change change,
const char *new_workspace_name);
void resource_addon_destroy(struct wl_resource_addon *addon);
void group_output_send_initial_state(struct lab_cosmic_workspace_group *group,
struct wl_resource *group_resource);
void manager_schedule_done_event(struct lab_cosmic_workspace_manager *manager);
#endif /* LABWC_PROTOCOLS_COSMIC_WORKSPACES_INTERNAL_H */

View file

@ -0,0 +1,94 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_PROTOCOLS_COSMIC_WORKSPACES_H
#define LABWC_PROTOCOLS_COSMIC_WORKSPACES_H
#include <stdbool.h>
#include <wayland-server-core.h>
struct wlr_output;
struct lab_cosmic_workspace_manager {
struct wl_global *global;
struct wl_list groups;
uint32_t caps;
struct wl_event_source *idle_source;
struct wl_event_loop *event_loop;
struct {
struct wl_listener display_destroy;
} on;
struct wl_list resources;
};
struct lab_cosmic_workspace_group {
struct lab_cosmic_workspace_manager *manager;
struct wl_list workspaces;
struct wl_array capabilities;
struct {
struct wl_signal create_workspace;
struct wl_signal destroy;
} events;
struct wl_list link;
struct wl_list outputs;
struct wl_list resources;
};
struct lab_cosmic_workspace {
struct lab_cosmic_workspace_group *group;
char *name;
struct wl_array coordinates;
struct wl_array capabilities;
uint32_t state; /* enum lab_cosmic_workspace_state */
uint32_t state_pending; /* enum lab_cosmic_workspace_state */
struct {
struct wl_signal activate;
struct wl_signal deactivate;
struct wl_signal remove;
struct wl_signal destroy;
} events;
struct wl_list link;
struct wl_list resources;
};
enum lab_cosmic_workspace_caps {
CW_CAP_NONE = 0,
CW_CAP_GRP_ALL = 0x000000ff,
CW_CAP_WS_ALL = 0x0000ff00,
/* group caps */
CW_CAP_GRP_WS_CREATE = 1 << 0,
/* workspace caps */
CW_CAP_WS_ACTIVATE = 1 << 8,
CW_CAP_WS_DEACTIVATE = 1 << 9,
CW_CAP_WS_REMOVE = 1 << 10,
};
struct lab_cosmic_workspace_manager *lab_cosmic_workspace_manager_create(
struct wl_display *display, uint32_t caps, uint32_t version);
struct lab_cosmic_workspace_group *lab_cosmic_workspace_group_create(
struct lab_cosmic_workspace_manager *manager);
void lab_cosmic_workspace_group_output_enter(
struct lab_cosmic_workspace_group *group, struct wlr_output *output);
void lab_cosmic_workspace_group_output_leave(
struct lab_cosmic_workspace_group *group, struct wlr_output *output);
void lab_cosmic_workspace_group_destroy(struct lab_cosmic_workspace_group *group);
struct lab_cosmic_workspace *lab_cosmic_workspace_create(struct lab_cosmic_workspace_group *group);
void lab_cosmic_workspace_set_name(struct lab_cosmic_workspace *workspace, const char *name);
void lab_cosmic_workspace_set_active(struct lab_cosmic_workspace *workspace, bool enabled);
void lab_cosmic_workspace_set_urgent(struct lab_cosmic_workspace *workspace, bool enabled);
void lab_cosmic_workspace_set_hidden(struct lab_cosmic_workspace *workspace, bool enabled);
void lab_cosmic_workspace_set_coordinates(struct lab_cosmic_workspace *workspace,
struct wl_array *coordinates);
void lab_cosmic_workspace_destroy(struct lab_cosmic_workspace *workspace);
#endif /* LABWC_PROTOCOLS_COSMIC_WORKSPACES_H */

View file

@ -3,7 +3,12 @@
#define LABWC_RESISTANCE_H #define LABWC_RESISTANCE_H
#include "labwc.h" #include "labwc.h"
void resistance_move_apply(struct view *view, double *x, double *y); /**
* resistance_unsnap_apply() - Apply resistance when dragging a
* maximized/tiled window. Returns true when the view needs to be un-tiled.
*/
bool resistance_unsnap_apply(struct view *view, int *x, int *y);
void resistance_move_apply(struct view *view, int *x, int *y);
void resistance_resize_apply(struct view *view, struct wlr_box *new_view_geo); void resistance_resize_apply(struct view *view, struct wlr_box *new_view_geo);
#endif /* LABWC_RESISTANCE_H */ #endif /* LABWC_RESISTANCE_H */

View file

@ -10,6 +10,8 @@ struct server;
struct session_lock_manager { struct session_lock_manager {
struct server *server; struct server *server;
struct wlr_session_lock_manager_v1 *wlr_manager; struct wlr_session_lock_manager_v1 *wlr_manager;
/* View re-focused on unlock */
struct view *last_active_view;
struct wlr_surface *focused; struct wlr_surface *focused;
/* /*
* When not locked: lock=NULL, locked=false * When not locked: lock=NULL, locked=false
@ -19,7 +21,7 @@ struct session_lock_manager {
struct wlr_session_lock_v1 *lock; struct wlr_session_lock_v1 *lock;
bool locked; bool locked;
struct wl_list session_lock_outputs; struct wl_list lock_outputs;
struct wl_listener new_lock; struct wl_listener new_lock;
struct wl_listener destroy; struct wl_listener destroy;

View file

@ -18,13 +18,16 @@
struct ssd_button { struct ssd_button {
struct view *view; struct view *view;
enum ssd_part_type type; enum ssd_part_type type;
struct wlr_scene_node *normal; /*
struct wlr_scene_node *hover; * Bitmap of lab_button_state that represents a combination of
struct wlr_scene_node *toggled; * hover/toggled/rounded states.
struct wlr_scene_node *toggled_hover; */
struct wlr_scene_node *background; uint8_t state_set;
struct wlr_scene_tree *icon_tree; /*
struct wlr_scene_tree *hover_tree; * Button nodes for each combination of hover/toggled/rounded states.
* nodes[state_set] should be displayed.
*/
struct wlr_scene_node *nodes[LAB_BS_ALL + 1];
struct wl_listener destroy; struct wl_listener destroy;
}; };
@ -49,13 +52,33 @@ struct ssd {
* don't update things we don't have to. * don't update things we don't have to.
*/ */
struct { struct {
bool was_maximized; /* To un-round corner buttons and toggle icon on maximize */ /* Button icons need to be swapped on shade or omnipresent toggles */
bool was_shaded;
bool was_omnipresent;
/*
* Corners need to be (un)rounded and borders need be shown/hidden
* when toggling maximization, and the button needs to be swapped on
* maximization toggles.
*/
bool was_maximized;
/*
* Corners need to be (un)rounded but borders should be kept shown when
* the window is (un)tiled and notified about it or when the window may
* become so small that only a squared scene-rect can be used to render
* such a small titlebar.
*/
bool was_squared;
struct wlr_box geometry; struct wlr_box geometry;
struct ssd_state_title { struct ssd_state_title {
char *text; char *text;
struct ssd_state_title_width active; struct ssd_state_title_width active;
struct ssd_state_title_width inactive; struct ssd_state_title_width inactive;
} title; } title;
char *app_id;
} state; } state;
/* An invisible area around the view which allows resizing */ /* An invisible area around the view which allows resizing */
@ -99,9 +122,6 @@ struct ssd_part {
/* This part represented in scene graph */ /* This part represented in scene graph */
struct wlr_scene_node *node; struct wlr_scene_node *node;
/* Targeted geometry. May be NULL */
struct wlr_box *geometry;
struct wl_list link; struct wl_list link;
}; };
@ -124,19 +144,12 @@ struct ssd_part *add_scene_rect(
struct ssd_part *add_scene_buffer( struct ssd_part *add_scene_buffer(
struct wl_list *list, enum ssd_part_type type, struct wl_list *list, enum ssd_part_type type,
struct wlr_scene_tree *parent, struct wlr_buffer *buffer, int x, int y); struct wlr_scene_tree *parent, struct wlr_buffer *buffer, int x, int y);
struct ssd_part *add_scene_button( struct ssd_part *add_scene_button(struct wl_list *part_list,
struct wl_list *part_list, enum ssd_part_type type, enum ssd_part_type type, struct wlr_scene_tree *parent,
struct wlr_scene_tree *parent, float *bg_color, struct lab_data_buffer *buffers[LAB_BS_ALL + 1], int x, int y,
struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer, struct view *view);
int x, struct view *view); void update_window_icon_buffer(struct wlr_scene_node *button_node,
void add_toggled_icon(struct ssd_button *button, struct wl_list *part_list, struct lab_data_buffer *buffer);
enum ssd_part_type type, struct wlr_buffer *icon_buffer,
struct wlr_buffer *hover_buffer);
struct ssd_part *add_scene_button_corner(
struct wl_list *part_list, enum ssd_part_type type,
enum ssd_part_type corner_type, struct wlr_scene_tree *parent,
struct wlr_buffer *corner_buffer, struct wlr_buffer *icon_buffer,
struct wlr_buffer *hover_buffer, int x, struct view *view);
/* SSD internal helpers */ /* SSD internal helpers */
struct ssd_part *ssd_get_part( struct ssd_part *ssd_get_part(
@ -147,6 +160,7 @@ void ssd_destroy_parts(struct wl_list *list);
void ssd_titlebar_create(struct ssd *ssd); void ssd_titlebar_create(struct ssd *ssd);
void ssd_titlebar_update(struct ssd *ssd); void ssd_titlebar_update(struct ssd *ssd);
void ssd_titlebar_destroy(struct ssd *ssd); void ssd_titlebar_destroy(struct ssd *ssd);
bool ssd_should_be_squared(struct ssd *ssd);
void ssd_border_create(struct ssd *ssd); void ssd_border_create(struct ssd *ssd);
void ssd_border_update(struct ssd *ssd); void ssd_border_update(struct ssd *ssd);

View file

@ -5,8 +5,6 @@
#include <wayland-server-core.h> #include <wayland-server-core.h>
#include "common/border.h" #include "common/border.h"
#define SSD_BUTTON_COUNT 4
#define SSD_BUTTON_WIDTH 26
#define SSD_EXTENDED_AREA 8 #define SSD_EXTENDED_AREA 8
/* /*
@ -23,12 +21,25 @@
*/ */
enum ssd_part_type { enum ssd_part_type {
LAB_SSD_NONE = 0, LAB_SSD_NONE = 0,
LAB_SSD_BUTTON_CLOSE,
LAB_SSD_BUTTON_CLOSE = 1,
LAB_SSD_BUTTON_MAXIMIZE, LAB_SSD_BUTTON_MAXIMIZE,
LAB_SSD_BUTTON_ICONIFY, LAB_SSD_BUTTON_ICONIFY,
LAB_SSD_BUTTON_WINDOW_ICON,
LAB_SSD_BUTTON_WINDOW_MENU, 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,
LAB_SSD_PART_TITLEBAR_CORNER_RIGHT,
LAB_SSD_PART_TITLEBAR_CORNER_LEFT,
LAB_SSD_PART_TITLE, LAB_SSD_PART_TITLE,
/* shared by shadows, borders and extents */
LAB_SSD_PART_CORNER_TOP_LEFT, LAB_SSD_PART_CORNER_TOP_LEFT,
LAB_SSD_PART_CORNER_TOP_RIGHT, LAB_SSD_PART_CORNER_TOP_RIGHT,
LAB_SSD_PART_CORNER_BOTTOM_RIGHT, LAB_SSD_PART_CORNER_BOTTOM_RIGHT,
@ -37,6 +48,7 @@ enum ssd_part_type {
LAB_SSD_PART_RIGHT, LAB_SSD_PART_RIGHT,
LAB_SSD_PART_BOTTOM, LAB_SSD_PART_BOTTOM,
LAB_SSD_PART_LEFT, LAB_SSD_PART_LEFT,
LAB_SSD_CLIENT, LAB_SSD_CLIENT,
LAB_SSD_FRAME, LAB_SSD_FRAME,
LAB_SSD_ROOT, LAB_SSD_ROOT,
@ -74,12 +86,14 @@ struct wlr_scene_node;
*/ */
struct ssd *ssd_create(struct view *view, bool active); struct ssd *ssd_create(struct view *view, bool active);
struct border ssd_get_margin(const struct ssd *ssd); struct border ssd_get_margin(const struct ssd *ssd);
int ssd_get_corner_width(void);
void ssd_update_margin(struct ssd *ssd); void ssd_update_margin(struct ssd *ssd);
void ssd_set_active(struct ssd *ssd, bool active); void ssd_set_active(struct ssd *ssd, bool active);
void ssd_update_title(struct ssd *ssd); void ssd_update_title(struct ssd *ssd);
void ssd_update_geometry(struct ssd *ssd); void ssd_update_geometry(struct ssd *ssd);
void ssd_destroy(struct ssd *ssd); void ssd_destroy(struct ssd *ssd);
void ssd_set_titlebar(struct ssd *ssd, bool enabled); void ssd_set_titlebar(struct ssd *ssd, bool enabled);
void ssd_update_window_icon(struct ssd *ssd);
void ssd_enable_keybind_inhibit_indicator(struct ssd *ssd, bool enable); void ssd_enable_keybind_inhibit_indicator(struct ssd *ssd, bool enable);
void ssd_enable_shade(struct ssd *ssd, bool enable); void ssd_enable_shade(struct ssd *ssd, bool enable);
@ -97,7 +111,6 @@ enum ssd_part_type ssd_at(const struct ssd *ssd,
enum ssd_part_type ssd_get_part_type(const struct ssd *ssd, enum ssd_part_type ssd_get_part_type(const struct ssd *ssd,
struct wlr_scene_node *node); struct wlr_scene_node *node);
uint32_t ssd_resize_edges(enum ssd_part_type type); uint32_t ssd_resize_edges(enum ssd_part_type type);
bool ssd_is_button(enum ssd_part_type type);
bool ssd_part_contains(enum ssd_part_type whole, enum ssd_part_type candidate); bool ssd_part_contains(enum ssd_part_type whole, enum ssd_part_type candidate);
enum ssd_mode ssd_mode_parse(const char *mode); enum ssd_mode ssd_mode_parse(const char *mode);

View file

@ -10,6 +10,7 @@
#include <stdio.h> #include <stdio.h>
#include <wlr/render/wlr_renderer.h> #include <wlr/render/wlr_renderer.h>
#include "ssd.h"
enum lab_justification { enum lab_justification {
LAB_JUSTIFY_LEFT, LAB_JUSTIFY_LEFT,
@ -25,9 +26,24 @@ struct theme_snapping_overlay {
float border_color[3][4]; float border_color[3][4];
}; };
enum lab_button_state {
LAB_BS_HOVERD = 1 << 0,
LAB_BS_TOGGLED = 1 << 1,
LAB_BS_ROUNDED = 1 << 2,
LAB_BS_ALL = LAB_BS_HOVERD | LAB_BS_TOGGLED | LAB_BS_ROUNDED,
};
struct theme { struct theme {
int border_width; int border_width;
int padding_height;
/*
* the space between title bar border and
* buttons on the left/right/top
*/
int window_titlebar_padding_width;
int window_titlebar_padding_height;
int title_height; int title_height;
int menu_overlap_x; int menu_overlap_x;
int menu_overlap_y; int menu_overlap_y;
@ -44,20 +60,19 @@ struct theme {
float window_active_label_text_color[4]; float window_active_label_text_color[4];
float window_inactive_label_text_color[4]; float window_inactive_label_text_color[4];
enum lab_justification window_label_text_justify; enum lab_justification window_label_text_justify;
enum lab_justification menu_title_text_justify;
/* button colors */ /* buttons */
float window_active_button_menu_unpressed_image_color[4]; int window_button_width;
float window_active_button_iconify_unpressed_image_color[4]; int window_button_height;
float window_active_button_max_unpressed_image_color[4]; int window_button_spacing;
float window_active_button_close_unpressed_image_color[4];
float window_inactive_button_menu_unpressed_image_color[4]; /* the corner radius of the hover effect */
float window_inactive_button_iconify_unpressed_image_color[4]; int window_button_hover_bg_corner_radius;
float window_inactive_button_max_unpressed_image_color[4];
float window_inactive_button_close_unpressed_image_color[4];
/* TODO: add pressed and hover colors for buttons */
int menu_item_padding_x; int menu_item_padding_x;
int menu_item_padding_y; int menu_item_padding_y;
int menu_item_height;
float menu_items_bg_color[4]; float menu_items_bg_color[4];
float menu_items_text_color[4]; float menu_items_text_color[4];
@ -72,6 +87,10 @@ struct theme {
int menu_separator_padding_height; int menu_separator_padding_height;
float menu_separator_color[4]; float menu_separator_color[4];
float menu_title_bg_color[4];
float menu_title_text_color[4];
int osd_border_width; int osd_border_width;
float osd_bg_color[4]; float osd_bg_color[4];
@ -99,31 +118,26 @@ struct theme {
float window_active_shadow_color[4]; float window_active_shadow_color[4];
float window_inactive_shadow_color[4]; float window_inactive_shadow_color[4];
struct {
/*
* 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]
*
* Elements in buttons[0] are all NULL since LAB_SSD_BUTTON_FIRST is 1.
*/
struct lab_data_buffer *buttons
[LAB_SSD_BUTTON_LAST + 1][LAB_BS_ALL + 1];
/* TODO: add toggled/hover/pressed/disabled colors for buttons */
float button_colors[LAB_SSD_BUTTON_LAST + 1][4];
/* TODO: move other window.(in)active.* entries to here */
} window[2]; /* indexed by THEME_INACTIVE and THEME_ACTIVE */
/* textures */ /* textures */
struct lab_data_buffer *button_close_active_unpressed;
struct lab_data_buffer *button_maximize_active_unpressed;
struct lab_data_buffer *button_restore_active_unpressed;
struct lab_data_buffer *button_iconify_active_unpressed;
struct lab_data_buffer *button_menu_active_unpressed;
struct lab_data_buffer *button_close_inactive_unpressed;
struct lab_data_buffer *button_maximize_inactive_unpressed;
struct lab_data_buffer *button_restore_inactive_unpressed;
struct lab_data_buffer *button_iconify_inactive_unpressed;
struct lab_data_buffer *button_menu_inactive_unpressed;
/* hover variants are optional and may be NULL */
struct lab_data_buffer *button_close_active_hover;
struct lab_data_buffer *button_maximize_active_hover;
struct lab_data_buffer *button_restore_active_hover;
struct lab_data_buffer *button_iconify_active_hover;
struct lab_data_buffer *button_menu_active_hover;
struct lab_data_buffer *button_close_inactive_hover;
struct lab_data_buffer *button_maximize_inactive_hover;
struct lab_data_buffer *button_restore_inactive_hover;
struct lab_data_buffer *button_iconify_inactive_hover;
struct lab_data_buffer *button_menu_inactive_hover;
struct lab_data_buffer *corner_top_left_active_normal; struct lab_data_buffer *corner_top_left_active_normal;
struct lab_data_buffer *corner_top_right_active_normal; struct lab_data_buffer *corner_top_right_active_normal;
@ -137,7 +151,10 @@ struct theme {
struct lab_data_buffer *shadow_corner_bottom_inactive; struct lab_data_buffer *shadow_corner_bottom_inactive;
struct lab_data_buffer *shadow_edge_inactive; struct lab_data_buffer *shadow_edge_inactive;
/* not set in rc.xml/themerc, but derived from font & padding_height */ /*
* 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; int osd_window_switcher_item_height;
/* magnifier */ /* magnifier */
@ -145,6 +162,9 @@ struct theme {
int mag_border_width; int mag_border_width;
}; };
#define THEME_INACTIVE 0
#define THEME_ACTIVE 1
struct server; struct server;
/** /**

View file

@ -2,6 +2,7 @@
#ifndef LABWC_VIEW_H #ifndef LABWC_VIEW_H
#define LABWC_VIEW_H #define LABWC_VIEW_H
#include "config/rcxml.h"
#include "config.h" #include "config.h"
#include "ssd.h" #include "ssd.h"
#include <stdbool.h> #include <stdbool.h>
@ -10,9 +11,18 @@
#include <wlr/util/box.h> #include <wlr/util/box.h>
#include <xkbcommon/xkbcommon.h> #include <xkbcommon/xkbcommon.h>
#define LAB_MIN_VIEW_WIDTH (SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT)
#define LAB_MIN_VIEW_HEIGHT 60 #define LAB_MIN_VIEW_HEIGHT 60
/*
* Fallback view geometry used in some cases where a better position
* and/or size can't be determined. Try to avoid using these except as
* a last resort.
*/
#define VIEW_FALLBACK_X 100
#define VIEW_FALLBACK_Y 100
#define VIEW_FALLBACK_WIDTH 640
#define VIEW_FALLBACK_HEIGHT 480
/* /*
* In labwc, a view is a container for surfaces which can be moved around by * 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. * the user. In practice this means XDG toplevel and XWayland windows.
@ -31,6 +41,12 @@ enum ssd_preference {
LAB_SSD_PREF_SERVER, LAB_SSD_PREF_SERVER,
}; };
enum three_state {
LAB_STATE_UNSPECIFIED = 0,
LAB_STATE_ENABLED,
LAB_STATE_DISABLED
};
/** /**
* Directions in which a view can be maximized. "None" is used * Directions in which a view can be maximized. "None" is used
* internally to mean "not maximized" but is not valid in rc.xml. * internally to mean "not maximized" but is not valid in rc.xml.
@ -188,6 +204,7 @@ struct view {
enum view_axis maximized; enum view_axis maximized;
bool fullscreen; bool fullscreen;
bool tearing_hint; bool tearing_hint;
enum three_state force_tearing;
bool visible_on_all_workspaces; bool visible_on_all_workspaces;
enum view_edge tiled; enum view_edge tiled;
uint32_t edges_visible; /* enum wlr_edges bitset */ uint32_t edges_visible; /* enum wlr_edges bitset */
@ -281,6 +298,7 @@ struct xdg_toplevel_view {
/* Events unique to xdg-toplevel views */ /* Events unique to xdg-toplevel views */
struct wl_listener set_app_id; struct wl_listener set_app_id;
struct wl_listener request_show_window_menu;
struct wl_listener new_popup; struct wl_listener new_popup;
}; };
@ -451,8 +469,15 @@ void view_moved(struct view *view);
void view_minimize(struct view *view, bool minimized); void view_minimize(struct view *view, bool minimized);
bool view_compute_centered_position(struct view *view, bool view_compute_centered_position(struct view *view,
const struct wlr_box *ref, int w, int h, int *x, int *y); const struct wlr_box *ref, int w, int h, int *x, int *y);
void view_set_fallback_natural_geometry(struct view *view);
void view_store_natural_geometry(struct view *view); void view_store_natural_geometry(struct view *view);
/**
* view_apply_natural_geometry - adjust view->natural_geometry if it doesn't
* intersect with view->output and then apply it
*/
void view_apply_natural_geometry(struct view *view);
/** /**
* view_effective_height - effective height of view, with respect to shaded state * view_effective_height - effective height of view, with respect to shaded state
* @view: view for which effective height is desired * @view: view for which effective height is desired
@ -475,7 +500,7 @@ void view_center(struct view *view, const struct wlr_box *ref);
* @policy: placement policy to apply * @policy: placement policy to apply
*/ */
void view_place_by_policy(struct view *view, bool allow_cursor, void view_place_by_policy(struct view *view, bool allow_cursor,
enum view_placement_policy); enum view_placement_policy policy);
void view_constrain_size_to_that_of_usable_area(struct view *view); 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_restore_to(struct view *view, struct wlr_box geometry);
@ -495,6 +520,7 @@ void view_toggle_always_on_bottom(struct view *view);
void view_toggle_visible_on_all_workspaces(struct view *view); void view_toggle_visible_on_all_workspaces(struct view *view);
bool view_is_tiled(struct view *view); bool view_is_tiled(struct view *view);
bool view_is_tiled_and_notify_tiled(struct view *view);
bool view_is_floating(struct view *view); bool view_is_floating(struct view *view);
void view_move_to_workspace(struct view *view, struct workspace *workspace); void view_move_to_workspace(struct view *view, struct workspace *workspace);
enum ssd_mode view_get_ssd_mode(struct view *view); enum ssd_mode view_get_ssd_mode(struct view *view);
@ -529,6 +555,7 @@ const char *view_get_string_prop(struct view *view, const char *prop);
void view_update_title(struct view *view); void view_update_title(struct view *view);
void view_update_app_id(struct view *view); void view_update_app_id(struct view *view);
void view_reload_ssd(struct view *view); void view_reload_ssd(struct view *view);
int view_get_min_width(void);
void view_set_shade(struct view *view, bool shaded); void view_set_shade(struct view *view, bool shaded);
@ -540,8 +567,6 @@ void view_on_output_destroy(struct view *view);
void view_connect_map(struct view *view, struct wlr_surface *surface); void view_connect_map(struct view *view, struct wlr_surface *surface);
void view_destroy(struct view *view); void view_destroy(struct view *view);
struct output *view_get_adjacent_output(struct view *view, enum view_edge edge,
bool wrap);
enum view_axis view_axis_parse(const char *direction); enum view_axis view_axis_parse(const char *direction);
enum view_edge view_edge_parse(const char *direction); enum view_edge view_edge_parse(const char *direction);
enum view_placement_policy view_placement_parse(const char *policy); enum view_placement_policy view_placement_parse(const char *policy);

View file

@ -4,6 +4,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <wayland-util.h> #include <wayland-util.h>
#include <wayland-server-core.h>
struct seat; struct seat;
struct server; struct server;
@ -19,6 +20,13 @@ struct workspace {
char *name; char *name;
struct wlr_scene_tree *tree; struct wlr_scene_tree *tree;
struct lab_cosmic_workspace *cosmic_workspace;
struct {
struct wl_listener activate;
struct wl_listener deactivate;
struct wl_listener remove;
} on;
}; };
void workspaces_init(struct server *server); void workspaces_init(struct server *server);

View file

@ -69,6 +69,7 @@ struct xwayland_view {
struct wl_listener set_override_redirect; struct wl_listener set_override_redirect;
struct wl_listener set_strut_partial; struct wl_listener set_strut_partial;
struct wl_listener set_window_type; struct wl_listener set_window_type;
struct wl_listener map_request;
/* Not (yet) implemented */ /* Not (yet) implemented */
/* struct wl_listener set_role; */ /* struct wl_listener set_role; */

View file

@ -1,7 +1,7 @@
project( project(
'labwc', 'labwc',
'c', 'c',
version: '0.7.2', version: '0.8.0',
license: 'GPL-2.0-only', license: 'GPL-2.0-only',
meson_version: '>=0.59.0', meson_version: '>=0.59.0',
default_options: [ default_options: [
@ -36,6 +36,7 @@ add_project_arguments(cc.get_supported_arguments([
'-Wunused-macros', '-Wunused-macros',
'-Wno-unused-parameter', '-Wno-unused-parameter',
'-Wno-expansion-to-defined',
]), language: 'c') ]), language: 'c')
version='"@0@"'.format(meson.project_version()) version='"@0@"'.format(meson.project_version())
@ -49,15 +50,16 @@ endif
add_project_arguments('-DLABWC_VERSION=@0@'.format(version), language: 'c') add_project_arguments('-DLABWC_VERSION=@0@'.format(version), language: 'c')
wlroots = dependency( wlroots = dependency(
'wlroots', 'wlroots-0.18',
default_options: ['default_library=static', 'examples=false'], default_options: ['default_library=static', 'examples=false'],
version: ['>=0.17.0', '<0.18.0'], version: ['>=0.18.0', '<0.19.0'],
) )
wlroots_has_xwayland = wlroots.get_variable('have_xwayland') == 'true' wlroots_has_xwayland = wlroots.get_variable('have_xwayland') == 'true'
have_libsfdo = not get_option('icon').disabled()
wayland_server = dependency('wayland-server', version: '>=1.19.0') wayland_server = dependency('wayland-server', version: '>=1.19.0')
wayland_protos = dependency('wayland-protocols') wayland_protos = dependency('wayland-protocols', version: '>=1.35')
xkbcommon = dependency('xkbcommon') xkbcommon = dependency('xkbcommon')
xcb = dependency('xcb', required: get_option('xwayland')) xcb = dependency('xcb', required: get_option('xwayland'))
xcb_icccm = dependency('xcb-icccm', required: get_option('xwayland')) xcb_icccm = dependency('xcb-icccm', required: get_option('xwayland'))
@ -72,6 +74,24 @@ pixman = dependency('pixman-1')
math = cc.find_library('m') math = cc.find_library('m')
png = dependency('libpng') png = dependency('libpng')
svg = dependency('librsvg-2.0', version: '>=2.46', required: false) svg = dependency('librsvg-2.0', version: '>=2.46', required: false)
sfdo_basedir = dependency(
'libsfdo-basedir',
default_options: ['default_library=static', 'examples=false', 'tests=false'],
version: '>=0.1.0',
required: have_libsfdo,
)
sfdo_desktop = dependency(
'libsfdo-desktop',
default_options: ['default_library=static', 'examples=false', 'tests=false'],
version: '>=0.1.0',
required: have_libsfdo,
)
sfdo_icon = dependency(
'libsfdo-icon',
default_options: ['default_library=static', 'examples=false', 'tests=false'],
version: '>=0.1.0',
required: have_libsfdo,
)
if get_option('xwayland').enabled() and not wlroots_has_xwayland if get_option('xwayland').enabled() and not wlroots_has_xwayland
error('no wlroots Xwayland support') error('no wlroots Xwayland support')
@ -87,6 +107,8 @@ else
endif endif
conf_data.set10('HAVE_RSVG', have_rsvg) conf_data.set10('HAVE_RSVG', have_rsvg)
conf_data.set10('HAVE_LIBSFDO', have_libsfdo)
if get_option('static_analyzer').enabled() if get_option('static_analyzer').enabled()
add_project_arguments(['-fanalyzer'], language: 'c') add_project_arguments(['-fanalyzer'], language: 'c')
endif endif
@ -125,11 +147,23 @@ if have_rsvg
svg, svg,
] ]
endif endif
if have_libsfdo
labwc_deps += [
sfdo_basedir,
sfdo_desktop,
sfdo_icon,
]
endif
subdir('include') subdir('include')
subdir('src') subdir('src')
subdir('docs') subdir('docs')
dep_cmocka = dependency('cmocka', required: get_option('test'))
if dep_cmocka.found()
subdir('t')
endif
executable( executable(
meson.project_name(), meson.project_name(),
labwc_sources, labwc_sources,
@ -140,6 +174,8 @@ executable(
install_data('data/labwc.desktop', install_dir: get_option('datadir') / 'wayland-sessions') 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')
icons = ['labwc-symbolic.svg', 'labwc.svg'] icons = ['labwc-symbolic.svg', 'labwc.svg']
foreach icon : icons foreach icon : icons
icon_path = join_paths('data', icon) icon_path = join_paths('data', icon)

View file

@ -1,5 +1,7 @@
option('man-pages', type: 'feature', value: 'auto', description: 'Generate and install man pages') option('man-pages', type: 'feature', value: 'auto', description: 'Generate and install man pages')
option('xwayland', type: 'feature', value: 'auto', description: 'Enable support for X11 applications') option('xwayland', type: 'feature', value: 'auto', description: 'Enable support for X11 applications')
option('svg', type: 'feature', value: 'enabled', description: 'Enable svg window buttons') option('svg', type: 'feature', value: 'enabled', description: 'Enable svg window buttons')
option('icon', type: 'feature', value: 'enabled', description: 'Enable window icons')
option('nls', type: 'feature', value: 'auto', description: 'Enable native language support') option('nls', type: 'feature', value: 'auto', description: 'Enable native language support')
option('static_analyzer', type: 'feature', value: 'disabled', description: 'Run gcc static analyzer') option('static_analyzer', type: 'feature', value: 'disabled', description: 'Run gcc static analyzer')
option('test', type: 'feature', value: 'disabled', description: 'Run tests')

View file

@ -1 +1 @@
ar cs de el es et eu fa fi fr gl hu id it ja ka ko lt nl pa pl pt ru sv tr uk zh_CN ar cs da de el es et eu fa fi fr gl hu id it ja ka ko lt nl pa pl pt pt_BR ru sv tr uk zh_CN

View file

@ -7,65 +7,71 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-11 10:23+0000\n" "PO-Revision-Date: 2024-09-23 20:01+0000\n"
"Last-Translator: Abdullah Albaroty <albaroty@gmail.com>\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" "Language: ar\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "اذهب هناك..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "إعادة تهيئة" msgstr "إعادة تهيئة"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "أخرج" msgstr "أخرج"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "صغّر" msgstr "صغّر"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "كبّر" msgstr "كبّر"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "ملء الشاشة" msgstr "ملء الشاشة"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "طي/إلغاء طي" msgstr "طي/إلغاء طي"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "إخف الإطار" msgstr "إخف الإطار"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "دائمًا في القمة" msgstr "دائمًا في القمة"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "أنقل يسارا" msgstr "أنقل يسارا"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "أنقل يمينا" msgstr "أنقل يمينا"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "أظهر في مساحات العمل دائما" msgstr "أظهر في مساحات العمل دائما"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "مساحة عمل" msgstr "مساحة عمل"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "غلق" msgstr "غلق"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-02 02:00+0100\n" "PO-Revision-Date: 2024-03-02 02:00+0100\n"
"Last-Translator: zenobit <zenobit@disroot.org>\n" "Last-Translator: zenobit <zenobit@disroot.org>\n"
"Language-Team: Czech <zenobit@disroot.org>\n" "Language-Team: Czech <zenobit@disroot.org>\n"
@ -16,54 +16,58 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Překonfigurovat" msgstr "Překonfigurovat"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Odejít" msgstr "Odejít"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimalizovat" msgstr "Minimalizovat"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximalizovat" msgstr "Maximalizovat"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Na celou obrazovku" msgstr "Na celou obrazovku"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Rolovat nahoru/dolů" msgstr "Rolovat nahoru/dolů"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Dekorace" msgstr "Dekorace"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Vždy nahoře" msgstr "Vždy nahoře"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Posunout doleva" msgstr "Posunout doleva"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Posunout doprava" msgstr "Posunout doprava"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" 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:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Pracovní Plocha" msgstr "Pracovní Plocha"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Zavřít" msgstr "Zavřít"

75
po/da.po Normal file
View file

@ -0,0 +1,75 @@
# Labwc pot file
# Copyright (C) 2024
# This file is distributed under the same license as the labwc package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
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-08-18 20:01+0000\n"
"Last-Translator: Peter Jespersen <flywheel@illogical.dk>\n"
"Language-Team: Danish <https://translate.lxqt-project.org/projects/labwc/labwc/da/>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure"
msgstr "Genindstil"
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Afslut"
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimer"
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maksimer"
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Fuldskærm"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Rul Op/Ned"
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Dekorationer"
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Altid øverst"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Flyt til venstre"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Flyt til højre"
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr "Altid på synlig arbejdsplads"
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr "Arbejdsplads"
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Luk"

View file

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-04 07:14+0000\n" "PO-Revision-Date: 2024-06-23 13:42+0000\n"
"Last-Translator: Standreas <standreas@riseup.net>\n" "Last-Translator: Standreas <standreas@riseup.net>\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" "Language: de\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Rekonfigurieren" msgstr "Rekonfigurieren"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Beenden" msgstr "Beenden"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimieren" msgstr "Minimieren"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximieren" msgstr "Maximieren"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Vollbild" msgstr "Vollbild"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Hoch/Runterrollen" msgstr "Hoch/Runterrollen"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Dekorationen" msgstr "Dekorationen"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Immer im Vordergrund" msgstr "Immer im Vordergrund"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "nach links" msgstr "nach links"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "nach rechts" msgstr "nach rechts"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Immer auf aktiver Arbeitsfläche" msgstr "Immer auf aktiver Arbeitsfläche"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Arbeitsfläche" msgstr "Arbeitsfläche"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Schließen" msgstr "Schließen"

View file

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-04-20 15:23+0000\n" "PO-Revision-Date: 2024-09-25 20:01+0000\n"
"Last-Translator: Yannis Drougas <drougas@gmail.com>\n" "Last-Translator: Giannis Antypas <gianni.antypas@gmail.com>\n"
"Language-Team: Greek <https://translate.lxqt-project.org/projects/labwc/" "Language-Team: Greek <https://translate.lxqt-project.org/projects/labwc/"
"labwc/el/>\n" "labwc/el/>\n"
"Language: el\n" "Language: el\n"
@ -19,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Πήγαινε εκεί..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Επαναρύθμιση" msgstr "Επαναρύθμιση"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Έξοδος" msgstr "Έξοδος"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Ελαχιστοποίηση" msgstr "Ελαχιστοποίηση"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Μεγιστοποίηση" msgstr "Μεγιστοποίηση"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Πλήρης οθόνη" msgstr "Πλήρης οθόνη"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Τύλιγμα/Ξετύλιγμα" msgstr "Τύλιγμα/Ξετύλιγμα"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Διακόσμηση" msgstr "Διακόσμηση"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Πάντα στο προσκήνιο" msgstr "Πάντα στο προσκήνιο"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Στα αριστερά" msgstr "Στα αριστερά"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Στα δεξιά" msgstr "Στα δεξιά"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Πάντα στην ενεργή επιφάνεια εργασίας" msgstr "Πάντα στην ενεργή επιφάνεια εργασίας"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Επιφάνεια εργασίας" msgstr "Επιφάνεια εργασίας"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Κλείσιμο" msgstr "Κλείσιμο"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-19 11:08+0000\n" "PO-Revision-Date: 2024-03-19 11:08+0000\n"
"Last-Translator: Roberalz <lumintnian@outlook.com>\n" "Last-Translator: Roberalz <lumintnian@outlook.com>\n"
"Language-Team: Spanish <https://translate.lxqt-project.org/projects/labwc/labwc/es/>\n" "Language-Team: Spanish <https://translate.lxqt-project.org/projects/labwc/labwc/es/>\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Reconfigurar" msgstr "Reconfigurar"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Salir" msgstr "Salir"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimizar" msgstr "Minimizar"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximizar" msgstr "Maximizar"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Pantalla completa" msgstr "Pantalla completa"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Enrollar hacia arriba/abajo" msgstr "Enrollar hacia arriba/abajo"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Decoraciones" msgstr "Decoraciones"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Siempre encima" msgstr "Siempre encima"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Mover a la izquierda" msgstr "Mover a la izquierda"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Mover a la derecha" msgstr "Mover a la derecha"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Siempre en un espacio de trabajo visible" msgstr "Siempre en un espacio de trabajo visible"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Espacio de trabajo" msgstr "Espacio de trabajo"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Cerrar" msgstr "Cerrar"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-01-23 09:23+0000\n" "PO-Revision-Date: 2024-09-23 20:01+0000\n"
"Last-Translator: Priit Jõerüüt <lxqtwlate@joeruut.com>\n" "Last-Translator: Priit Jõerüüt <lxqtwlate@joeruut.com>\n"
"Language-Team: Estonian <https://translate.lxqt-project.org/projects/labwc/labwc/et/>\n" "Language-Team: Estonian <https://translate.lxqt-project.org/projects/labwc/"
"labwc/et/>\n"
"Language: et\n" "Language: et\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Suundu..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Seadista uuesti" msgstr "Seadista uuesti"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Välju" msgstr "Välju"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Vähenda" msgstr "Vähenda"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Suurenda" msgstr "Suurenda"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Täisekraanivaade" msgstr "Täisekraanivaade"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Keri üles/alla" msgstr "Keri üles/alla"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Akende välimus" msgstr "Akende välimus"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Alati kõige peal" msgstr "Alati kõige peal"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Tõsta vasakule" msgstr "Tõsta vasakule"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Tõsta paremale" msgstr "Tõsta paremale"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Alati nähtav töölaual" msgstr "Alati nähtav töölaual"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Töölaud" msgstr "Töölaud"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Sulge" msgstr "Sulge"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-19 11:08+0000\n" "PO-Revision-Date: 2024-03-19 11:08+0000\n"
"Last-Translator: Roberalz <lumintnian@outlook.com>\n" "Last-Translator: Roberalz <lumintnian@outlook.com>\n"
"Language-Team: Basque <https://translate.lxqt-project.org/projects/labwc/labwc/eu/>\n" "Language-Team: Basque <https://translate.lxqt-project.org/projects/labwc/labwc/eu/>\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Berriz konfiguratu" msgstr "Berriz konfiguratu"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Irten" msgstr "Irten"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimizatu" msgstr "Minimizatu"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximizatu" msgstr "Maximizatu"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Pantaila osoa" msgstr "Pantaila osoa"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Ibili gora/behera" msgstr "Ibili gora/behera"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Apaingarriak" msgstr "Apaingarriak"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Beti gainean" msgstr "Beti gainean"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Mugitu ezkerrera" msgstr "Mugitu ezkerrera"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Mugitu eskuinera" msgstr "Mugitu eskuinera"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Beti ikusgai dagoen lan-eremuan" msgstr "Beti ikusgai dagoen lan-eremuan"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Langunea" msgstr "Langunea"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Itxi" msgstr "Itxi"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@ -16,54 +16,58 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "" msgstr ""
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "" msgstr ""
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "" msgstr ""
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "" msgstr ""
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "" msgstr ""
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "" msgstr ""
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "" msgstr ""
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "" msgstr ""
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "" msgstr ""
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "" msgstr ""
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "" msgstr ""
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "" msgstr ""
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "" msgstr ""

View file

@ -7,11 +7,10 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-04-20 15:23+0000\n" "PO-Revision-Date: 2024-04-20 15:23+0000\n"
"Last-Translator: Jouni Järvinen <jounijarvis@gmail.com>\n" "Last-Translator: Jouni Järvinen <jounijarvis@gmail.com>\n"
"Language-Team: Finnish <https://translate.lxqt-project.org/projects/labwc/" "Language-Team: Finnish <https://translate.lxqt-project.org/projects/labwc/labwc/fi/>\n"
"labwc/fi/>\n"
"Language: fi\n" "Language: fi\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -19,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Uudelleenmääritä" msgstr "Uudelleenmääritä"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Poistu" msgstr "Poistu"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Pienennä" msgstr "Pienennä"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Suurenna" msgstr "Suurenna"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Koko näyttö" msgstr "Koko näyttö"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Rullaa ylös/alas" msgstr "Rullaa ylös/alas"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Kehykset" msgstr "Kehykset"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Aina ylimpänä" msgstr "Aina ylimpänä"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Siirrä vasemmalle" msgstr "Siirrä vasemmalle"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Siirrä oikealle" msgstr "Siirrä oikealle"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Aina näkyvässä työtilassa" msgstr "Aina näkyvässä työtilassa"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Työtila" msgstr "Työtila"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Sulje" msgstr "Sulje"

View file

@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-20 18:15+0000\n" "PO-Revision-Date: 2024-09-30 20:01+0000\n"
"Last-Translator: rico542 <rico@alwaysdata.net>\n" "Last-Translator: Eric Migeon <weblate.tilux@spamgourmet.com>\n"
"Language-Team: French <https://translate.lxqt-project.org/projects/labwc/" "Language-Team: French <https://translate.lxqt-project.org/projects/labwc/"
"labwc/fr/>\n" "labwc/fr/>\n"
"Language: fr\n" "Language: fr\n"
@ -19,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Reconfigurer" msgstr "Reconfigurer"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Quitter" msgstr "Quitter"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimiser" msgstr "Minimiser"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximiser" msgstr "Maximiser"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Plein écran" msgstr "Plein écran"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Enrouler/Dérouler" msgstr "Enrouler/Dérouler"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Décorations" msgstr "Décorations"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Toujours au dessus" msgstr "Toujours au dessus"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Bouger à gauche" msgstr "Déplacer à gauche"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Bouger à droite" msgstr "Déplacer à droite"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Toujours sur le bureau visible" msgstr "Toujours sur le bureau visible"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Bureau" msgstr "Bureau"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Fermer" msgstr "Fermer"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-19 11:08+0000\n" "PO-Revision-Date: 2024-03-19 11:08+0000\n"
"Last-Translator: Roberalz <lumintnian@outlook.com>\n" "Last-Translator: Roberalz <lumintnian@outlook.com>\n"
"Language-Team: Galician <https://translate.lxqt-project.org/projects/labwc/labwc/gl/>\n" "Language-Team: Galician <https://translate.lxqt-project.org/projects/labwc/labwc/gl/>\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Reconfigurar" msgstr "Reconfigurar"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Saír" msgstr "Saír"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimizar" msgstr "Minimizar"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximizar" msgstr "Maximizar"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Pantalla completa" msgstr "Pantalla completa"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Rodar cara arriba/abaixo" msgstr "Rodar cara arriba/abaixo"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Decoracións" msgstr "Decoracións"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Sempre enriba" msgstr "Sempre enriba"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Mover á esquerda" msgstr "Mover á esquerda"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Mover á dereita" msgstr "Mover á dereita"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Sempre no espazo de traballo visible" msgstr "Sempre no espazo de traballo visible"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Espazo de traballo" msgstr "Espazo de traballo"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Pechar" msgstr "Pechar"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-02-19 21:23+0000\n" "PO-Revision-Date: 2024-02-19 21:23+0000\n"
"Last-Translator: winerysearch <david.fitala@gmail.com>\n" "Last-Translator: winerysearch <david.fitala@gmail.com>\n"
"Language-Team: Hungarian <https://translate.lxqt-project.org/projects/labwc/labwc/hu/>\n" "Language-Team: Hungarian <https://translate.lxqt-project.org/projects/labwc/labwc/hu/>\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Rekonfigurál" msgstr "Rekonfigurál"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Kilépés" msgstr "Kilépés"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Kis méret" msgstr "Kis méret"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Teljes méret" msgstr "Teljes méret"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Teljes képernyő" msgstr "Teljes képernyő"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Felhúz / Legördül" msgstr "Felhúz / Legördül"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Dekorációk" msgstr "Dekorációk"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Mindig felül" msgstr "Mindig felül"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Balra dokkol" msgstr "Balra dokkol"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Jobbra dokkol" msgstr "Jobbra dokkol"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Kitűz" msgstr "Kitűz"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Munkaasztal" msgstr "Munkaasztal"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Bezárás" msgstr "Bezárás"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-12 21:48+0000\n" "PO-Revision-Date: 2024-03-12 21:48+0000\n"
"Last-Translator: alwanasary <baity.jannati@gmail.com>\n" "Last-Translator: alwanasary <baity.jannati@gmail.com>\n"
"Language-Team: Indonesian <https://translate.lxqt-project.org/projects/labwc/labwc/id/>\n" "Language-Team: Indonesian <https://translate.lxqt-project.org/projects/labwc/labwc/id/>\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Atur Ulang" msgstr "Atur Ulang"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Keluar" msgstr "Keluar"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Sembunyikan" msgstr "Sembunyikan"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Perluas Jendela" msgstr "Perluas Jendela"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Tampil Menyeluruh" msgstr "Tampil Menyeluruh"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Gulir atas/bawah" msgstr "Gulir atas/bawah"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Dekorasi" msgstr "Dekorasi"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Selalu di Muka" msgstr "Selalu di Muka"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Geser ke Kiri" msgstr "Geser ke Kiri"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Geser ke Kanan" msgstr "Geser ke Kanan"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Selalu pada Ruang Kerja yang Terlihat" msgstr "Selalu pada Ruang Kerja yang Terlihat"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Ruang Kerja" msgstr "Ruang Kerja"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Tutup" msgstr "Tutup"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-01-23 09:23+0000\n" "PO-Revision-Date: 2024-09-21 20:01+0000\n"
"Last-Translator: Standreas <standreas@riseup.net>\n" "Last-Translator: Standreas <standreas@riseup.net>\n"
"Language-Team: Italian <https://translate.lxqt-project.org/projects/labwc/labwc/it/>\n" "Language-Team: Italian <https://translate.lxqt-project.org/projects/labwc/"
"labwc/it/>\n"
"Language: it\n" "Language: it\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Vai lì..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Riconfigura" msgstr "Riconfigura"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Esci" msgstr "Esci"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimizza" msgstr "Minimizza"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Massimizza" msgstr "Massimizza"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Schermo intero" msgstr "Schermo intero"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Arrotola/srotola" msgstr "Arrotola/srotola"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Decorazioni" msgstr "Decorazioni"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Sempre sopra" msgstr "Sempre sopra"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Sposta a sinistra" msgstr "Sposta a sinistra"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Sposta a destra" msgstr "Sposta a destra"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Sempre sull'area di lavoro visibile" msgstr "Sempre sull'area di lavoro visibile"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Area di lavoro" msgstr "Area di lavoro"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Chiudi" msgstr "Chiudi"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-15 16:23+0000\n" "PO-Revision-Date: 2024-03-15 16:23+0000\n"
"Last-Translator: Hiroaki Yamamoto <hrak1529@gmail.com>\n" "Last-Translator: Hiroaki Yamamoto <hrak1529@gmail.com>\n"
"Language-Team: Japanese <https://translate.lxqt-project.org/projects/labwc/labwc/ja/>\n" "Language-Team: Japanese <https://translate.lxqt-project.org/projects/labwc/labwc/ja/>\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "再設定" msgstr "再設定"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "終了" msgstr "終了"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "最小化" msgstr "最小化"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "最大化" msgstr "最大化"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "フルスクリーン" msgstr "フルスクリーン"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "折りたたむ/広げる" msgstr "折りたたむ/広げる"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "デコレーション" msgstr "デコレーション"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "常に最前面に表示" msgstr "常に最前面に表示"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "左に移動" msgstr "左に移動"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "右に移動" msgstr "右に移動"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "現在のワークスペースに常に表示" msgstr "現在のワークスペースに常に表示"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "ワークスペース" msgstr "ワークスペース"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "閉じる" msgstr "閉じる"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2023-02-22 09:43+0100\n" "PO-Revision-Date: 2023-02-22 09:43+0100\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n" "Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <ka>\n" "Language-Team: Georgian <ka>\n"
@ -18,56 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.2.2\n" "X-Generator: Poedit 3.2.2\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "თავიდან მორგება" msgstr "თავიდან მორგება"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "გასვლა" msgstr "გასვლა"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "ჩაკეცვა" msgstr "ჩაკეცვა"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "გადიდება" msgstr "გადიდება"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "მთელ ეკრანზე" msgstr "მთელ ეკრანზე"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "" msgstr ""
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "დეკორაციები" msgstr "დეკორაციები"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
#, fuzzy
#| msgid "Always On Top"
msgid "Always on Top" msgid "Always on Top"
msgstr "ყოველთვისყველაზეზემოდან" msgstr "ყოველთვისყველაზეზემოდან"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "მარცხნივ გაწევა" msgstr "მარცხნივ გაწევა"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "მარჯვნივ გაწევა" msgstr "მარჯვნივ გაწევა"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "" msgstr ""
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "სამუშაო ადგილი" msgstr "სამუშაო ადგილი"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "დახურვა" msgstr "დახურვა"

View file

@ -7,63 +7,69 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: 2024-07-03 08:01+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: tark1998 <tark1998@gmail.com>\n"
"Language-Team: none\n" "Language-Team: Korean <https://translate.lxqt-project.org/projects/labwc/labwc/ko/>\n"
"Language: ko\n" "Language: ko\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "" msgstr "재설정"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "" msgstr "종료"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "" msgstr "최소화"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "" msgstr "최대화"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "" msgstr "전체화면"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "" msgstr "접기/펼치기"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "" msgstr "창 장식"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "" msgstr "항상 최상단에 표시"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "" msgstr "좌로 이동"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "" msgstr "우로 이동"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "" msgstr "현재 작업공간에 항상 표시"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "" msgstr "작업공간"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "" msgstr "닫기"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,54 +17,58 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "" msgstr ""
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "" msgstr ""
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "" msgstr ""
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "" msgstr ""
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "" msgstr ""
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "" msgstr ""
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "" msgstr ""
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "" msgstr ""
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "" msgstr ""
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "" msgstr ""
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "" msgstr ""
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "" msgstr ""
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "" msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-02-29 14:23+0000\n" "PO-Revision-Date: 2024-02-29 14:23+0000\n"
"Last-Translator: Moo <hazap@hotmail.com>\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"
@ -18,54 +18,58 @@ msgstr ""
"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" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Konfigūruoti iš naujo" msgstr "Konfigūruoti iš naujo"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Išeiti" msgstr "Išeiti"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Suskleisti" msgstr "Suskleisti"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Išskleisti" msgstr "Išskleisti"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Visas ekranas" msgstr "Visas ekranas"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Užraityti/atraityti" msgstr "Užraityti/atraityti"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Dekoracijos" msgstr "Dekoracijos"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Visada viršuje" msgstr "Visada viršuje"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Perkelti kairėn" msgstr "Perkelti kairėn"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Perkelti dešinėn" msgstr "Perkelti dešinėn"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Visada matomoje darbo srityje" msgstr "Visada matomoje darbo srityje"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Darbo sritis" msgstr "Darbo sritis"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Užverti" msgstr "Užverti"

View file

@ -1,11 +1,18 @@
i18n = import('i18n') i18n = import('i18n')
add_project_arguments('-DGETTEXT_PACKAGE="' + meson.project_name() + '"',
add_project_arguments(
'-DGETTEXT_PACKAGE="' + meson.project_name() + '"',
'-DLOCALEDIR="' + get_option('prefix') / get_option('localedir') + '"', '-DLOCALEDIR="' + get_option('prefix') / get_option('localedir') + '"',
language:'c') language:'c',
i18n.gettext(meson.project_name(), )
args: ['--directory=' + source_root,
i18n.gettext(
meson.project_name(),
args: [
'--directory=' + source_root,
'--add-comments=TRANSLATORS', '--add-comments=TRANSLATORS',
'--keyword=_', '--keyword=_',
'--msgid-bugs=https://github.com/labwc/labwc/issues'], '--msgid-bugs=https://github.com/labwc/labwc/issues',
preset: 'glib' ],
preset: 'glib',
) )

View file

@ -7,10 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-01-23 09:23+0000\n" "PO-Revision-Date: 2024-09-21 20:01+0000\n"
"Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n" "Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n"
"Language-Team: Dutch <https://translate.lxqt-project.org/projects/labwc/labwc/nl/>\n" "Language-Team: Dutch <https://translate.lxqt-project.org/projects/labwc/"
"labwc/nl/>\n"
"Language: nl\n" "Language: nl\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Openen…"
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Opnieuw instellen" msgstr "Opnieuw instellen"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Afsluiten" msgstr "Afsluiten"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimaliseren" msgstr "Minimaliseren"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximaliseren" msgstr "Maximaliseren"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Schermvullende weergave" msgstr "Schermvullende weergave"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Op-/Afrollen" msgstr "Op-/Afrollen"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Decoraties" msgstr "Decoraties"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Altijd bovenaan" msgstr "Altijd bovenaan"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Naar links verplaatsen" msgstr "Naar links verplaatsen"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Naar rechts verplaatsen" msgstr "Naar rechts verplaatsen"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Altijd op zichtbaar werkblad" msgstr "Altijd op zichtbaar werkblad"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Werkblad" msgstr "Werkblad"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Sluiten" msgstr "Sluiten"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-02-21 14:23+0000\n" "PO-Revision-Date: 2024-02-21 14:23+0000\n"
"Last-Translator: A S Alam <amanpreet.alam@gmail.com>\n" "Last-Translator: A S Alam <amanpreet.alam@gmail.com>\n"
"Language-Team: Punjabi <https://translate.lxqt-project.org/projects/labwc/labwc/pa/>\n" "Language-Team: Punjabi <https://translate.lxqt-project.org/projects/labwc/labwc/pa/>\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "ਮੁੜ-ਸੰਰਚਨਾ ਕਰੋ" msgstr "ਮੁੜ-ਸੰਰਚਨਾ ਕਰੋ"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "ਬਾਹਰ" msgstr "ਬਾਹਰ"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "ਘੱਟੋ-ਘੱਟ" msgstr "ਘੱਟੋ-ਘੱਟ"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "ਵੱਧ ਤੋਂ ਵੱਧ" msgstr "ਵੱਧ ਤੋਂ ਵੱਧ"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "ਪੂਰੀ ਸਕਰੀਨ" msgstr "ਪੂਰੀ ਸਕਰੀਨ"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "ਉੱਤੇ/ਹੇਠਾਂ ਸਕਰਾਓ" msgstr "ਉੱਤੇ/ਹੇਠਾਂ ਸਕਰਾਓ"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "ਸਜਾਵਟ" msgstr "ਸਜਾਵਟ"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "ਹਮੇਸ਼ਾਂ ਉੱਤੇ ਰੱਖੋ" msgstr "ਹਮੇਸ਼ਾਂ ਉੱਤੇ ਰੱਖੋ"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "ਖੱਬੇ ਭੇਜੋ" msgstr "ਖੱਬੇ ਭੇਜੋ"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "ਸੱਜੇ ਭੇਜੋ" msgstr "ਸੱਜੇ ਭੇਜੋ"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "ਹਮੇਸ਼ਾਂ ਦਿੱਖ ਵਰਕਸਪੇਸ ਉੱਤੇ" msgstr "ਹਮੇਸ਼ਾਂ ਦਿੱਖ ਵਰਕਸਪੇਸ ਉੱਤੇ"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "ਵਰਕਸਪੇਸ" msgstr "ਵਰਕਸਪੇਸ"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "ਬੰਦ ਕਰੋ" msgstr "ਬੰਦ ਕਰੋ"

View file

@ -7,65 +7,71 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-01-23 09:23+0000\n" "PO-Revision-Date: 2024-09-21 20:01+0000\n"
"Last-Translator: Jan Rolski <wbcwknvstb@proton.me>\n" "Last-Translator: Jan Rolski <wbcwknvstb@proton.me>\n"
"Language-Team: Polish <https://translate.lxqt-project.org/projects/labwc/labwc/pl/>\n" "Language-Team: Polish <https://translate.lxqt-project.org/projects/labwc/"
"labwc/pl/>\n"
"Language: pl\n" "Language: pl\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Przejdź tam..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Rekonfiguruj" msgstr "Rekonfiguruj"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Wyjdź" msgstr "Wyjdź"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimalizuj" msgstr "Minimalizuj"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maksymalizuj" msgstr "Maksymalizuj"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Pełny ekran" msgstr "Pełny ekran"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Zwiń w górę/w dół" msgstr "Zwiń w górę/w dół"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Dekoracje" msgstr "Dekoracje"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Zawsze na wierzchu" msgstr "Zawsze na wierzchu"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Przenieś w lewo" msgstr "Przenieś w lewo"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Przenieś w prawo" msgstr "Przenieś w prawo"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Zawsze na widocznym obszarze roboczym" msgstr "Zawsze na widocznym obszarze roboczym"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Przestrzeń robocza" msgstr "Przestrzeń robocza"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Zamknij" msgstr "Zamknij"

View file

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-03-27 22:23+0000\n" "PO-Revision-Date: 2024-09-21 20:01+0000\n"
"Last-Translator: Hugo Carvalho <hugokarvalho@hotmail.com>\n" "Last-Translator: Hugo Carvalho <hugokarvalho@hotmail.com>\n"
"Language-Team: Portuguese <https://translate.lxqt-project.org/projects/labwc/" "Language-Team: Portuguese <https://translate.lxqt-project.org/projects/labwc/"
"labwc/pt/>\n" "labwc/pt/>\n"
@ -19,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Ir lá..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Reconfigurar" msgstr "Reconfigurar"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Sair" msgstr "Sair"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimizar" msgstr "Minimizar"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximizar" msgstr "Maximizar"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Ecrã inteiro" msgstr "Ecrã inteiro"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Rolar para cima/baixo" msgstr "Rolar para cima/baixo"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Decorações" msgstr "Decorações"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Sempre no topo" msgstr "Sempre no topo"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Mover para a esquerda" msgstr "Mover para a esquerda"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Mover para a direita" msgstr "Mover para a direita"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Sempre visível na área de trabalho" msgstr "Sempre visível na área de trabalho"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Área de trabalho" msgstr "Área de trabalho"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Fechar" msgstr "Fechar"

75
po/pt_BR.po Normal file
View file

@ -0,0 +1,75 @@
# Labwc pot file
# Copyright (C) 2024
# This file is distributed under the same license as the labwc package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
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-08-24 20:01+0000\n"
"Last-Translator: daniel <punished.haddock@proton.me>\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"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure"
msgstr "Reconfigurar"
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Sair"
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimizar"
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximizar"
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Tela Cheia"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Rolar para Cima/Baixo"
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Decorações"
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Sempre no Topo"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Mover à Esquerda"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Mover à Direita"
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr "Sempre Visível na Área de Trabalho"
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr "Área de Trabalho"
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Fechar"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-02-26 12:23+0000\n" "PO-Revision-Date: 2024-02-26 12:23+0000\n"
"Last-Translator: Alice Ventus <zolkin.ag@phystech.edu>\n" "Last-Translator: Alice Ventus <zolkin.ag@phystech.edu>\n"
"Language-Team: Russian <https://translate.lxqt-project.org/projects/labwc/labwc/ru/>\n" "Language-Team: Russian <https://translate.lxqt-project.org/projects/labwc/labwc/ru/>\n"
@ -18,54 +18,58 @@ msgstr ""
"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" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Перенастроить" msgstr "Перенастроить"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Выход" msgstr "Выход"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Свернуть" msgstr "Свернуть"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Развернуть" msgstr "Развернуть"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "На весь экран" msgstr "На весь экран"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Свернуть/развернуть в заголовок" msgstr "Свернуть/развернуть в заголовок"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Декорации" msgstr "Декорации"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Всегда на переднем плане" msgstr "Всегда на переднем плане"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Переместить влево" msgstr "Переместить влево"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Переместить вправо" msgstr "Переместить вправо"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "На всех рабочих пространствах" msgstr "На всех рабочих пространствах"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Рабочее пространство" msgstr "Рабочее пространство"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Закрыть" msgstr "Закрыть"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-01-24 11:23+0000\n" "PO-Revision-Date: 2024-10-12 07:24+0000\n"
"Last-Translator: bittin <bittin@reimu.nl>\n" "Last-Translator: bittin <bittin@reimu.nl>\n"
"Language-Team: Swedish <https://translate.lxqt-project.org/projects/labwc/labwc/sv/>\n" "Language-Team: Swedish <https://translate.lxqt-project.org/projects/labwc/"
"labwc/sv/>\n"
"Language: sv\n" "Language: sv\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Gå dit..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Konfigurera om" msgstr "Konfigurera om"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Avsluta" msgstr "Avsluta"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Minimera" msgstr "Minimera"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Maximera" msgstr "Maximera"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Fullskärm" msgstr "Fullskärm"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Rulla upp/ned" msgstr "Rulla upp/ned"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Dekorationer" msgstr "Dekorationer"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Alltid överst" msgstr "Alltid överst"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Flytta till vänster" msgstr "Flytta till vänster"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Flytta till höger" msgstr "Flytta till höger"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Alltid på aktiv arbetsyta" msgstr "Alltid på aktiv arbetsyta"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Arbetsyta" msgstr "Arbetsyta"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Stäng" msgstr "Stäng"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-02-24 22:23+0000\n" "PO-Revision-Date: 2024-10-03 08:01+0000\n"
"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n" "Last-Translator: Dr. Ayhan YALÇINSOY <ayhanyalcinsoy@pisilinux.org>\n"
"Language-Team: Turkish <https://translate.lxqt-project.org/projects/labwc/labwc/tr/>\n" "Language-Team: Turkish <https://translate.lxqt-project.org/projects/labwc/"
"labwc/tr/>\n"
"Language: tr\n" "Language: tr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Şuraya git..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Yeniden Yapılandır" msgstr "Yeniden Yapılandır"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Çıkış" msgstr "Çıkış"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Küçült" msgstr "Küçült"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Büyüt" msgstr "Büyüt"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "Tam Ekran" msgstr "Tam Ekran"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Yukarı/aşağı katla" msgstr "Yukarı/aşağı katla"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Süslemeler" msgstr "Süslemeler"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Her Zaman Üstte" msgstr "Her Zaman Üstte"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Sola taşı" msgstr "Sola taşı"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Sağa taşı" msgstr "Sağa taşı"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Her Zaman Görünür Çalışma Alanında" msgstr "Her Zaman Görünür Çalışma Alanında"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Çalışma Alanı" msgstr "Çalışma Alanı"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Kapat" msgstr "Kapat"

View file

@ -7,65 +7,71 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-01-28 20:10+0000\n" "PO-Revision-Date: 2024-09-24 08:01+0000\n"
"Last-Translator: Ihor Hordiichuk <igor_ck@outlook.com>\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" "Language: uk\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\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" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Перейти до..."
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "Переналаштувати" msgstr "Переналаштувати"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "Вихід" msgstr "Вихід"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "Згорнути" msgstr "Згорнути"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "Розгорнути" msgstr "Розгорнути"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "На весь екран" msgstr "На весь екран"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "Згорнути/розгорнути" msgstr "Згорнути/розгорнути"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "Декорації" msgstr "Декорації"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "Завжди зверху" msgstr "Завжди зверху"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "Перемістити ліворуч" msgstr "Перемістити ліворуч"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "Перемістити праворуч" msgstr "Перемістити праворуч"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "Завжди на видимому робочому просторі" msgstr "Завжди на видимому робочому просторі"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "Робочий простір" msgstr "Робочий простір"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "Закрити" msgstr "Закрити"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: labwc\n" "Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n" "Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n" "POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-01-30 08:23+0000\n" "PO-Revision-Date: 2024-01-30 08:23+0000\n"
"Last-Translator: kmephistoh <kanhaosmile@gmail.com>\n" "Last-Translator: kmephistoh <kanhaosmile@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://translate.lxqt-project.org/projects/labwc/labwc/zh_CN/>\n" "Language-Team: Chinese (Simplified) <https://translate.lxqt-project.org/projects/labwc/labwc/zh_CN/>\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.2.1\n" "X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704 #: src/menu/menu.c:1017
msgid "Go there..."
msgstr ""
#: src/menu/menu.c:1037
msgid "Reconfigure" msgid "Reconfigure"
msgstr "配置重载" msgstr "配置重载"
#: src/menu/menu.c:706 #: src/menu/menu.c:1039
msgid "Exit" msgid "Exit"
msgstr "退出" msgstr "退出"
#: src/menu/menu.c:722 #: src/menu/menu.c:1055
msgid "Minimize" msgid "Minimize"
msgstr "最小化" msgstr "最小化"
#: src/menu/menu.c:724 #: src/menu/menu.c:1057
msgid "Maximize" msgid "Maximize"
msgstr "最大化" msgstr "最大化"
#: src/menu/menu.c:726 #: src/menu/menu.c:1059
msgid "Fullscreen" msgid "Fullscreen"
msgstr "全屏" msgstr "全屏"
#: src/menu/menu.c:728 #: src/menu/menu.c:1061
msgid "Roll up/down" msgid "Roll Up/Down"
msgstr "滚动 上/下" msgstr "滚动 上/下"
#: src/menu/menu.c:730 #: src/menu/menu.c:1063
msgid "Decorations" msgid "Decorations"
msgstr "装饰" msgstr "装饰"
#: src/menu/menu.c:732 #: src/menu/menu.c:1065
msgid "Always on Top" msgid "Always on Top"
msgstr "最上层显示" msgstr "最上层显示"
#: src/menu/menu.c:737 #: src/menu/menu.c:1070
msgid "Move left" msgid "Move Left"
msgstr "左移" msgstr "左移"
#: src/menu/menu.c:744 #: src/menu/menu.c:1077
msgid "Move right" msgid "Move Right"
msgstr "右移" msgstr "右移"
#: src/menu/menu.c:749 #: src/menu/menu.c:1082
msgid "Always on Visible Workspace" msgid "Always on Visible Workspace"
msgstr "始终在可见工作区" msgstr "始终在可见工作区"
#: src/menu/menu.c:752 src/config/rcxml.c:1384 #: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace" msgid "Workspace"
msgstr "工作区" msgstr "工作区"
#: src/menu/menu.c:755 #: src/menu/menu.c:1088
msgid "Close" msgid "Close"
msgstr "关闭" msgstr "关闭"

View file

@ -0,0 +1,364 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="cosmic_workspace_unstable_v1">
<copyright>
Copyright © 2019 Christopher Billington
Copyright © 2020 Ilia Bozhinov
Copyright © 2022 Victoria Brekenfeld
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of
the copyright holders not be used in advertising or publicity
pertaining to distribution of the software without specific,
written prior permission. The copyright holders make no
representations about the suitability of this software for any
purpose. It is provided "as is" without express or implied
warranty.
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
</copyright>
<interface name="zcosmic_workspace_manager_v1" version="1">
<description summary="list and control workspaces">
Workspaces, also called virtual desktops, are groups of surfaces. A
compositor with a concept of workspaces may only show some such groups of
surfaces (those of 'active' workspaces) at a time. 'Activating' a
workspace is a request for the compositor to display that workspace's
surfaces as normal, whereas the compositor may hide or otherwise
de-emphasise surfaces that are associated only with 'inactive' workspaces.
Workspaces are grouped by which sets of outputs they correspond to, and
may contain surfaces only from those outputs. In this way, it is possible
for each output to have its own set of workspaces, or for all outputs (or
any other arbitrary grouping) to share workspaces. Compositors may
optionally conceptually arrange each group of workspaces in an
N-dimensional grid.
The purpose of this protocol is to enable the creation of taskbars and
docks by providing them with a list of workspaces and their properties,
and allowing them to activate and deactivate workspaces.
After a client binds the zcosmic_workspace_manager_v1, each workspace will be
sent via the workspace event.
</description>
<event name="workspace_group">
<description summary="a workspace group has been created">
This event is emitted whenever a new workspace group has been created.
All initial details of the workspace group (workspaces, outputs) will be
sent immediately after this event via the corresponding events in
zcosmic_workspace_group_handle_v1.
</description>
<arg name="workspace_group" type="new_id" interface="zcosmic_workspace_group_handle_v1"/>
</event>
<request name="commit">
<description summary="all requests about the workspaces have been sent">
The client must send this request after it has finished sending other
requests. The compositor must process a series of requests preceding a
commit request atomically.
This allows changes to the workspace properties to be seen as atomic,
even if they happen via multiple events, and even if they involve
multiple zcosmic_workspace_handle_v1 objects, for example, deactivating one
workspace and activating another.
</description>
</request>
<event name="done">
<description summary="all information about the workspace groups has been sent">
This event is sent after all changes in all workspace groups have been
sent.
This allows changes to one or more zcosmic_workspace_group_handle_v1
properties and zcosmic_workspace_handle_v1 properties to be seen as atomic,
even if they happen via multiple events.
In particular, an output moving from one workspace group to
another sends an output_enter event and an output_leave event to the two
zcosmic_workspace_group_handle_v1 objects in question. The compositor sends
the done event only after updating the output information in both
workspace groups.
</description>
</event>
<event name="finished">
<description summary="the compositor has finished with the workspace_manager">
This event indicates that the compositor is done sending events to the
zcosmic_workspace_manager_v1. The server will destroy the object
immediately after sending this request, so it will become invalid and
the client should free any resources associated with it.
</description>
</event>
<request name="stop">
<description summary="stop sending events">
Indicates the client no longer wishes to receive events for new
workspace groups. However the compositor may emit further workspace
events, until the finished event is emitted.
The client must not send any more requests after this one.
</description>
</request>
</interface>
<interface name="zcosmic_workspace_group_handle_v1" version="1">
<description summary="a workspace group assigned to a set of outputs">
A zcosmic_workspace_group_handle_v1 object represents a a workspace group
that is assigned a set of outputs and contains a number of workspaces.
The set of outputs assigned to the workspace group is conveyed to the client via
output_enter and output_leave events, and its workspaces are conveyed with
workspace events.
For example, a compositor which has a set of workspaces for each output may
advertise a workspace group (and its workspaces) per output, whereas a compositor
where a workspace spans all outputs may advertise a single workspace group for all
outputs.
</description>
<enum name="zcosmic_workspace_group_capabilities_v1">
<entry name="create_workspace" value="1" summary="create_workspace request is available"/>
</enum>
<event name="capabilities">
<description summary="compositor capabilities">
This event advertises the capabilities supported by the compositor. If
a capability isn't supported, clients should hide or disable the UI
elements that expose this functionality. For instance, if the
compositor doesn't advertise support for creating workspaces, a button
triggering the create_workspace request should not be displayed.
The compositor will ignore requests it doesn't support. For instance,
a compositor which doesn't advertise support for creating workspaces will ignore
create_workspace requests.
Compositors must send this event once after creation of an
zcosmic_workspace_group_handle_v1 . When the capabilities change, compositors
must send this event again.
The capabilities are sent as an array of 32-bit unsigned integers in
native endianness.
</description>
<arg name="capabilities" type="array" summary="array of 32-bit capabilities"/>
</event>
<event name="output_enter">
<description summary="output assigned to workspace group">
This event is emitted whenever an output is assigned to the workspace
group.
</description>
<arg name="output" type="object" interface="wl_output"/>
</event>
<event name="output_leave">
<description summary="output removed from workspace group">
This event is emitted whenever an output is removed from the workspace
group.
</description>
<arg name="output" type="object" interface="wl_output"/>
</event>
<event name="workspace">
<description summary="workspace added to workspace group">
This event is emitted whenever a new workspace has been created.
A workspace can only be a member of a single workspace group and cannot
be re-assigned.
All initial details of the workspace (name, coordinates, state) will
be sent immediately after this event via the corresponding events in
zcosmic_workspace_handle_v1.
</description>
<arg name="workspace" type="new_id" interface="zcosmic_workspace_handle_v1"/>
</event>
<event name="remove">
<description summary="this workspace group has been destroyed">
This event means the zcosmic_workspace_group_handle_v1 has been destroyed.
It is guaranteed there won't be any more events for this
zcosmic_workspace_group_handle_v1. The zext_workspace_group_handle_v1 becomes
inert so any requests will be ignored except the destroy request.
The compositor must remove all workspaces belonging to a workspace group
before removing the workspace group.
</description>
</event>
<request name="create_workspace">
<description summary="create a new workspace">
Request that the compositor create a new workspace with the given name.
There is no guarantee that the compositor will create a new workspace,
or that the created workspace will have the provided name.
</description>
<arg name="workspace" type="string"/>
</request>
<request name="destroy" type="destructor">
<description summary="destroy the zcosmic_workspace_group_handle_v1 object">
Destroys the zcosmic_workspace_group_handle_v1 object.
This request should be called either when the client does not want to
use the workspace object any more or after the remove event to finalize
the destruction of the object.
</description>
</request>
</interface>
<interface name="zcosmic_workspace_handle_v1" version="1">
<description summary="a workspace handing a group of surfaces">
A zcosmic_workspace_handle_v1 object represents a a workspace that handles a
group of surfaces.
Each workspace has a name, conveyed to the client with the name event; a
list of states, conveyed to the client with the state event; and
optionally a set of coordinates, conveyed to the client with the
coordinates event. The client may request that the compositor activate or
deactivate the workspace.
Each workspace can belong to only a single workspace group.
Depepending on the compositor policy, there might be workspaces with
the same name in different workspace groups, but these workspaces are still
separate (e.g. one of them might be active while the other is not).
</description>
<event name="name">
<description summary="workspace name changed">
This event is emitted immediately after the zcosmic_workspace_handle_v1 is
created and whenever the name of the workspace changes.
</description>
<arg name="name" type="string"/>
</event>
<event name="coordinates">
<description summary="workspace coordinates changed">
This event is used to organize workspaces into an N-dimensional grid
within a workspace group, and if supported, is emitted immediately after
the zcosmic_workspace_handle_v1 is created and whenever the coordinates of
the workspace change. Compositors may not send this event if they do not
conceptually arrange workspaces in this way. If compositors simply
number workspaces, without any geometric interpretation, they may send
1D coordinates, which clients should not interpret as implying any
geometry. Sending an empty array means that the compositor no longer
orders the workspace geometrically.
Coordinates have an arbitrary number of dimensions N with an uint32
position along each dimension. By convention if N > 1, the first
dimension is X, the second Y, the third Z, and so on. The compositor may
chose to utilize these events for a more novel workspace layout
convention, however. No guarantee is made about the grid being filled or
bounded; there may be a workspace at coordinate 1 and another at
coordinate 1000 and none in between. Within a workspace group, however,
workspaces must have unique coordinates of equal dimensionality.
</description>
<arg name="coordinates" type="array"/>
</event>
<event name="state">
<description summary="the state of the workspace changed">
This event is emitted immediately after the zcosmic_workspace_handle_v1 is
created and each time the workspace state changes, either because of a
compositor action or because of a request in this protocol.
</description>
<arg name="state" type="array"/>
</event>
<enum name="state">
<description summary="types of states on the workspace">
The different states that a workspace can have.
</description>
<entry name="active" value="0" summary="the workspace is active"/>
<entry name="urgent" value="1" summary="the workspace requests attention"/>
<entry name="hidden" value="2">
<description summary="the workspace is not visible">
The workspace is not visible in its workspace group, and clients
attempting to visualize the compositor workspace state should not
display such workspaces.
</description>
</entry>
</enum>
<enum name="zcosmic_workspace_capabilities_v1">
<entry name="activate" value="1" summary="activate request is available"/>
<entry name="deactivate" value="2" summary="deactivate request is available"/>
<entry name="remove" value="3" summary="remove request is available"/>
</enum>
<event name="capabilities">
<description summary="compositor capabilities">
This event advertises the capabilities supported by the compositor. If
a capability isn't supported, clients should hide or disable the UI
elements that expose this functionality. For instance, if the
compositor doesn't advertise support for removing workspaces, a button
triggering the remove request should not be displayed.
The compositor will ignore requests it doesn't support. For instance,
a compositor which doesn't advertise support for remove will ignore
remove requests.
Compositors must send this event once after creation of an
zcosmic_workspace_handle_v1 . When the capabilities change, compositors
must send this event again.
The capabilities are sent as an array of 32-bit unsigned integers in
native endianness.
</description>
<arg name="capabilities" type="array" summary="array of 32-bit capabilities"/>
</event>
<event name="remove">
<description summary="this workspace has been destroyed">
This event means the zcosmic_workspace_handle_v1 has been destroyed. It is
guaranteed there won't be any more events for this
zcosmic_workspace_handle_v1. The zext_workspace_handle_v1 becomes inert so
any requests will be ignored except the destroy request.
</description>
</event>
<request name="destroy" type="destructor">
<description summary="destroy the zcosmic_workspace_handle_v1 object">
Destroys the zcosmic_workspace_handle_v1 object.
This request should be called either when the client does not want to
use the workspace object any more or after the remove event to finalize
the destruction of the object.
</description>
</request>
<request name="activate">
<description summary="activate the workspace">
Request that this workspace be activated.
There is no guarantee the workspace will be actually activated, and
behaviour may be compositor-dependent. For example, activating a
workspace may or may not deactivate all other workspaces in the same
group.
</description>
</request>
<request name="deactivate">
<description summary="activate the workspace">
Request that this workspace be deactivated.
There is no guarantee the workspace will be actually deactivated.
</description>
</request>
<request name="remove">
<description summary="remove the workspace">
Request that this workspace be removed.
There is no guarantee the workspace will be actually removed.
</description>
</request>
</interface>
</protocol>

View file

@ -16,11 +16,12 @@ wayland_scanner_server = generator(
server_protocols = [ server_protocols = [
wl_protocol_dir / 'stable/xdg-shell/xdg-shell.xml', wl_protocol_dir / 'stable/xdg-shell/xdg-shell.xml',
wl_protocol_dir / 'unstable/pointer-constraints/pointer-constraints-unstable-v1.xml', wl_protocol_dir / 'unstable/pointer-constraints/pointer-constraints-unstable-v1.xml',
wl_protocol_dir / 'unstable/tablet/tablet-unstable-v2.xml', wl_protocol_dir / 'stable/tablet/tablet-v2.xml',
wl_protocol_dir / 'staging/cursor-shape/cursor-shape-v1.xml', wl_protocol_dir / 'staging/cursor-shape/cursor-shape-v1.xml',
wl_protocol_dir / 'staging/drm-lease/drm-lease-v1.xml', wl_protocol_dir / 'staging/drm-lease/drm-lease-v1.xml',
wl_protocol_dir / 'staging/xwayland-shell/xwayland-shell-v1.xml', wl_protocol_dir / 'staging/xwayland-shell/xwayland-shell-v1.xml',
wl_protocol_dir / 'staging/tearing-control/tearing-control-v1.xml', wl_protocol_dir / 'staging/tearing-control/tearing-control-v1.xml',
'cosmic-workspace-unstable-v1.xml',
'wlr-layer-shell-unstable-v1.xml', 'wlr-layer-shell-unstable-v1.xml',
'wlr-input-inhibitor-unstable-v1.xml', 'wlr-input-inhibitor-unstable-v1.xml',
'wlr-output-power-management-unstable-v1.xml', 'wlr-output-power-management-unstable-v1.xml',

View file

@ -19,14 +19,10 @@ run_checks () {
return $? return $?
fi fi
find src/ include/ \( -name "*.c" -o -name "*.h" \) -type f | find src/ include/ \( -name "*.c" -o -name "*.h" \) -type f -print0 |
{ nice xargs -0 --max-args 1 --max-procs $(nproc) \
errors=0 scripts/checkpatch.pl --terse --no-tree --strict --file
while IFS= read -r file; do return $?
run_checkpatch "$file" || errors=1
done
return ${errors}
}
} }
main () { main () {

View file

@ -5657,7 +5657,7 @@ sub process {
#labwc-custom check to ignore some pango/libxml2/etc CamelCase variants #labwc-custom check to ignore some pango/libxml2/etc CamelCase variants
$var !~ /^(?:_?Pango\w+)/ && $var !~ /^(?:_?Pango\w+)/ &&
$var !~ /^(?:xml\w+)/ && $var !~ /^(?:xml\w+)/ &&
$var !~ /^(?:GString|GError)/ && $var !~ /^(?:GString|GError|GHashTable)/ &&
$var !~ /^(?:RsvgRectangle|RsvgHandle)/ && $var !~ /^(?:RsvgRectangle|RsvgHandle)/ &&
$var !~ /^(?:XKB_KEY_XF86Switch_VT_1)/ && $var !~ /^(?:XKB_KEY_XF86Switch_VT_1)/ &&

View file

@ -19,7 +19,6 @@
#include "menu/menu.h" #include "menu/menu.h"
#include "osd.h" #include "osd.h"
#include "output-virtual.h" #include "output-virtual.h"
#include "placement.h"
#include "regions.h" #include "regions.h"
#include "ssd.h" #include "ssd.h"
#include "view.h" #include "view.h"
@ -70,6 +69,7 @@ enum action_type {
ACTION_TYPE_EXECUTE, ACTION_TYPE_EXECUTE,
ACTION_TYPE_EXIT, ACTION_TYPE_EXIT,
ACTION_TYPE_MOVE_TO_EDGE, ACTION_TYPE_MOVE_TO_EDGE,
ACTION_TYPE_TOGGLE_SNAP_TO_EDGE,
ACTION_TYPE_SNAP_TO_EDGE, ACTION_TYPE_SNAP_TO_EDGE,
ACTION_TYPE_GROW_TO_EDGE, ACTION_TYPE_GROW_TO_EDGE,
ACTION_TYPE_SHRINK_TO_EDGE, ACTION_TYPE_SHRINK_TO_EDGE,
@ -100,7 +100,9 @@ enum action_type {
ACTION_TYPE_MOVE_RELATIVE, ACTION_TYPE_MOVE_RELATIVE,
ACTION_TYPE_SEND_TO_DESKTOP, ACTION_TYPE_SEND_TO_DESKTOP,
ACTION_TYPE_GO_TO_DESKTOP, ACTION_TYPE_GO_TO_DESKTOP,
ACTION_TYPE_TOGGLE_SNAP_TO_REGION,
ACTION_TYPE_SNAP_TO_REGION, ACTION_TYPE_SNAP_TO_REGION,
ACTION_TYPE_UNSNAP,
ACTION_TYPE_TOGGLE_KEYBINDS, ACTION_TYPE_TOGGLE_KEYBINDS,
ACTION_TYPE_FOCUS_OUTPUT, ACTION_TYPE_FOCUS_OUTPUT,
ACTION_TYPE_MOVE_TO_OUTPUT, ACTION_TYPE_MOVE_TO_OUTPUT,
@ -114,6 +116,9 @@ enum action_type {
ACTION_TYPE_SHADE, ACTION_TYPE_SHADE,
ACTION_TYPE_UNSHADE, ACTION_TYPE_UNSHADE,
ACTION_TYPE_TOGGLE_SHADE, ACTION_TYPE_TOGGLE_SHADE,
ACTION_TYPE_ENABLE_TABLET_MOUSE_EMULATION,
ACTION_TYPE_DISABLE_TABLET_MOUSE_EMULATION,
ACTION_TYPE_TOGGLE_TABLET_MOUSE_EMULATION,
ACTION_TYPE_TOGGLE_MAGNIFY, ACTION_TYPE_TOGGLE_MAGNIFY,
ACTION_TYPE_ZOOM_IN, ACTION_TYPE_ZOOM_IN,
ACTION_TYPE_ZOOM_OUT ACTION_TYPE_ZOOM_OUT
@ -128,6 +133,7 @@ const char *action_names[] = {
"Execute", "Execute",
"Exit", "Exit",
"MoveToEdge", "MoveToEdge",
"ToggleSnapToEdge",
"SnapToEdge", "SnapToEdge",
"GrowToEdge", "GrowToEdge",
"ShrinkToEdge", "ShrinkToEdge",
@ -158,7 +164,9 @@ const char *action_names[] = {
"MoveRelative", "MoveRelative",
"SendToDesktop", "SendToDesktop",
"GoToDesktop", "GoToDesktop",
"ToggleSnapToRegion",
"SnapToRegion", "SnapToRegion",
"UnSnap",
"ToggleKeybinds", "ToggleKeybinds",
"FocusOutput", "FocusOutput",
"MoveToOutput", "MoveToOutput",
@ -172,6 +180,9 @@ const char *action_names[] = {
"Shade", "Shade",
"Unshade", "Unshade",
"ToggleShade", "ToggleShade",
"EnableTabletMouseEmulation",
"DisableTabletMouseEmulation",
"ToggleTabletMouseEmulation",
"ToggleMagnify", "ToggleMagnify",
"ZoomIn", "ZoomIn",
"ZoomOut", "ZoomOut",
@ -314,12 +325,15 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
goto cleanup; goto cleanup;
} }
/* Falls through */ /* Falls through */
case ACTION_TYPE_TOGGLE_SNAP_TO_EDGE:
case ACTION_TYPE_SNAP_TO_EDGE: case ACTION_TYPE_SNAP_TO_EDGE:
case ACTION_TYPE_GROW_TO_EDGE: case ACTION_TYPE_GROW_TO_EDGE:
case ACTION_TYPE_SHRINK_TO_EDGE: case ACTION_TYPE_SHRINK_TO_EDGE:
if (!strcmp(argument, "direction")) { if (!strcmp(argument, "direction")) {
enum view_edge edge = view_edge_parse(content); enum view_edge edge = view_edge_parse(content);
if ((edge == VIEW_EDGE_CENTER && action->type != ACTION_TYPE_SNAP_TO_EDGE) bool allow_center = action->type == ACTION_TYPE_TOGGLE_SNAP_TO_EDGE
|| action->type == ACTION_TYPE_SNAP_TO_EDGE;
if ((edge == VIEW_EDGE_CENTER && !allow_center)
|| edge == VIEW_EDGE_INVALID) { || edge == VIEW_EDGE_INVALID) {
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)", wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
action_names[action->type], argument, content); action_names[action->type], argument, content);
@ -338,6 +352,14 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
action_arg_add_bool(action, argument, parse_bool(content, true)); action_arg_add_bool(action, argument, parse_bool(content, true));
goto cleanup; goto cleanup;
} }
if (!strcasecmp(argument, "x.position")) {
action_arg_add_str(action, argument, content);
goto cleanup;
}
if (!strcasecmp(argument, "y.position")) {
action_arg_add_str(action, argument, content);
goto cleanup;
}
break; break;
case ACTION_TYPE_TOGGLE_MAXIMIZE: case ACTION_TYPE_TOGGLE_MAXIMIZE:
case ACTION_TYPE_MAXIMIZE: case ACTION_TYPE_MAXIMIZE:
@ -400,6 +422,7 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
goto cleanup; goto cleanup;
} }
break; break;
case ACTION_TYPE_TOGGLE_SNAP_TO_REGION:
case ACTION_TYPE_SNAP_TO_REGION: case ACTION_TYPE_SNAP_TO_REGION:
if (!strcmp(argument, "region")) { if (!strcmp(argument, "region")) {
action_arg_add_str(action, argument, content); action_arg_add_str(action, argument, content);
@ -407,11 +430,6 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
} }
break; break;
case ACTION_TYPE_FOCUS_OUTPUT: case ACTION_TYPE_FOCUS_OUTPUT:
if (!strcmp(argument, "output")) {
action_arg_add_str(action, argument, content);
goto cleanup;
}
break;
case ACTION_TYPE_MOVE_TO_OUTPUT: case ACTION_TYPE_MOVE_TO_OUTPUT:
if (!strcmp(argument, "output")) { if (!strcmp(argument, "output")) {
action_arg_add_str(action, argument, content); action_arg_add_str(action, argument, content);
@ -530,6 +548,7 @@ action_is_valid(struct action *action)
arg_name = "command"; arg_name = "command";
break; break;
case ACTION_TYPE_MOVE_TO_EDGE: case ACTION_TYPE_MOVE_TO_EDGE:
case ACTION_TYPE_TOGGLE_SNAP_TO_EDGE:
case ACTION_TYPE_SNAP_TO_EDGE: case ACTION_TYPE_SNAP_TO_EDGE:
case ACTION_TYPE_GROW_TO_EDGE: case ACTION_TYPE_GROW_TO_EDGE:
case ACTION_TYPE_SHRINK_TO_EDGE: case ACTION_TYPE_SHRINK_TO_EDGE:
@ -543,12 +562,10 @@ action_is_valid(struct action *action)
case ACTION_TYPE_SEND_TO_DESKTOP: case ACTION_TYPE_SEND_TO_DESKTOP:
arg_name = "to"; arg_name = "to";
break; break;
case ACTION_TYPE_TOGGLE_SNAP_TO_REGION:
case ACTION_TYPE_SNAP_TO_REGION: case ACTION_TYPE_SNAP_TO_REGION:
arg_name = "region"; arg_name = "region";
break; break;
case ACTION_TYPE_FOCUS_OUTPUT:
arg_name = "output";
break;
case ACTION_TYPE_IF: case ACTION_TYPE_IF:
case ACTION_TYPE_FOR_EACH: case ACTION_TYPE_FOR_EACH:
; /* works around "a label can only be part of a statement" */ ; /* works around "a label can only be part of a statement" */
@ -613,8 +630,9 @@ action_list_free(struct wl_list *action_list)
} }
static void static void
show_menu(struct server *server, struct view *view, show_menu(struct server *server, struct view *view, struct cursor_context *ctx,
const char *menu_name, bool at_cursor) const char *menu_name, bool at_cursor,
const char *pos_x, const char *pos_y)
{ {
if (server->input_mode != LAB_INPUT_STATE_PASSTHROUGH if (server->input_mode != LAB_INPUT_STATE_PASSTHROUGH
&& server->input_mode != LAB_INPUT_STATE_MENU) { && server->input_mode != LAB_INPUT_STATE_MENU) {
@ -627,18 +645,88 @@ show_menu(struct server *server, struct view *view,
return; return;
} }
/*
* We always refresh client-list-combined-menu and client-send-to-menu
* so that they are up-to-date whether they are directly opened as a
* top-level menu or opened as a submenu which we don't know at this
* point. It is also needed to calculate the proper width for placement
* as it fluctuates depending on application/workspace titles.
*/
update_client_list_combined_menu(menu->server);
update_client_send_to_menu(menu->server);
int x = server->seat.cursor->x; int x = server->seat.cursor->x;
int y = server->seat.cursor->y; int y = server->seat.cursor->y;
/* The client menu needs an active client */ /* The client menu needs an active client */
if (!view && strcasecmp(menu_name, "client-menu") == 0) { bool is_client_menu = !strcasecmp(menu_name, "client-menu");
if (is_client_menu && !view) {
return; return;
} }
/* Place menu in the view corner if desired (and menu is not root-menu) */ /* Place menu in the view corner if desired (and menu is not root-menu) */
if (!at_cursor && view) { if (!at_cursor && view) {
x = view->current.x; x = view->current.x;
y = view->current.y; y = view->current.y;
/* Push the client menu underneath the button */
if (is_client_menu && ssd_part_contains(
LAB_SSD_BUTTON, ctx->type)) {
assert(ctx->node);
int ly;
wlr_scene_node_coords(ctx->node, &x, &ly);
}
}
/*
* determine placement by looking at x and y
* x/y can be number, "center" or a %percent of screen dimensions
*/
if (pos_x && pos_y) {
struct output *output = output_nearest_to(server,
server->seat.cursor->x, server->seat.cursor->y);
struct menuitem *item;
struct theme *theme = server->theme;
int max_width = theme->menu_min_width;
wl_list_for_each(item, &menu->menuitems, link) {
if (item->native_width > max_width) {
max_width = item->native_width < theme->menu_max_width
? item->native_width : theme->menu_max_width;
}
}
if (!strcasecmp(pos_x, "center")) {
x = (output->usable_area.width / 2) - (max_width / 2);
} else if (strchr(pos_x, '%')) {
x = (output->usable_area.width * atoi(pos_x)) / 100;
} else {
if (pos_x[0] == '-') {
int neg_x = strtol(pos_x, NULL, 10);
x = output->usable_area.width + neg_x;
} else {
x = atoi(pos_x);
}
}
if (!strcasecmp(pos_y, "center")) {
y = (output->usable_area.height / 2) - (menu->size.height / 2);
} else if (strchr(pos_y, '%')) {
y = (output->usable_area.height * atoi(pos_y)) / 100;
} else {
if (pos_y[0] == '-') {
int neg_y = strtol(pos_y, NULL, 10);
y = output->usable_area.height + neg_y;
} else {
y = atoi(pos_y);
}
}
/* keep menu from being off screen */
x = MAX(x, 0);
x = MIN(x, (output->usable_area.width -1));
y = MAX(y, 0);
y = MIN(y, (output->usable_area.height -1));
/* adjust for which monitor to appear on */
x += output->usable_area.x;
y += output->usable_area.y;
} }
/* Replaced by next show_menu() or cleaned on view_destroy() */ /* Replaced by next show_menu() or cleaned on view_destroy() */
@ -648,7 +736,7 @@ show_menu(struct server *server, struct view *view,
static struct view * static struct view *
view_for_action(struct view *activator, struct server *server, view_for_action(struct view *activator, struct server *server,
struct action *action, uint32_t *resize_edges) struct action *action, struct cursor_context *ctx)
{ {
/* View is explicitly specified for mousebinds */ /* View is explicitly specified for mousebinds */
if (activator) { if (activator) {
@ -660,13 +748,8 @@ view_for_action(struct view *activator, struct server *server,
case ACTION_TYPE_FOCUS: case ACTION_TYPE_FOCUS:
case ACTION_TYPE_MOVE: case ACTION_TYPE_MOVE:
case ACTION_TYPE_RESIZE: { case ACTION_TYPE_RESIZE: {
struct cursor_context ctx = get_cursor_context(server); *ctx = get_cursor_context(server);
if (action->type == ACTION_TYPE_RESIZE) { return ctx->view;
/* Select resize edges for the keybind case */
*resize_edges = cursor_get_resize_edges(
server->seat.cursor, &ctx);
}
return ctx.view;
} }
default: default:
return server->active_view; return server->active_view;
@ -694,14 +777,57 @@ run_if_action(struct view *view, struct server *server, struct action *action)
actions = action_get_actionlist(action, branch); actions = action_get_actionlist(action, branch);
if (actions) { if (actions) {
actions_run(view, server, actions, 0); actions_run(view, server, actions, NULL);
} }
return !strcmp(branch, "then"); return !strcmp(branch, "then");
} }
static bool
shift_is_pressed(struct server *server)
{
uint32_t modifiers = wlr_keyboard_get_modifiers(
&server->seat.keyboard_group->keyboard);
return modifiers & WLR_MODIFIER_SHIFT;
}
static void
start_window_cycling(struct server *server, enum lab_cycle_dir direction)
{
/* Remember direction so it can be followed by subsequent key presses */
server->osd_state.initial_direction = direction;
server->osd_state.initial_keybind_contained_shift =
shift_is_pressed(server);
server->osd_state.cycle_view = desktop_cycle_view(server,
server->osd_state.cycle_view, direction);
osd_update(server);
}
static struct output *
get_target_output(struct output *output, struct server *server,
struct action *action)
{
const char *output_name = action_get_str(action, "output", NULL);
struct output *target = NULL;
if (output_name) {
target = output_from_name(server, output_name);
} else {
enum view_edge edge =
action_get_int(action, "direction", VIEW_EDGE_INVALID);
bool wrap = action_get_bool(action, "wrap", false);
target = output_get_adjacent(output, edge, wrap);
}
if (!target) {
wlr_log(WLR_DEBUG, "Invalid output");
}
return target;
}
void void
actions_run(struct view *activator, struct server *server, actions_run(struct view *activator, struct server *server,
struct wl_list *actions, uint32_t resize_edges) struct wl_list *actions, struct cursor_context *cursor_ctx)
{ {
if (!actions) { if (!actions) {
wlr_log(WLR_ERROR, "empty actions"); wlr_log(WLR_ERROR, "empty actions");
@ -713,6 +839,13 @@ actions_run(struct view *activator, struct server *server,
struct view *view; struct view *view;
struct action *action; struct action *action;
struct output *output;
struct output *target;
struct cursor_context ctx = {0};
if (cursor_ctx) {
ctx = *cursor_ctx;
}
wl_list_for_each(action, actions, link) { wl_list_for_each(action, actions, link) {
wlr_log(WLR_DEBUG, "Handling action %u: %s", action->type, wlr_log(WLR_DEBUG, "Handling action %u: %s", action->type,
action_names[action->type]); action_names[action->type]);
@ -721,8 +854,7 @@ actions_run(struct view *activator, struct server *server,
* Refetch view because it may have been changed due to the * Refetch view because it may have been changed due to the
* previous action * previous action
*/ */
view = view_for_action(activator, server, action, view = view_for_action(activator, server, action, &ctx);
&resize_edges);
switch (action->type) { switch (action->type) {
case ACTION_TYPE_CLOSE: case ACTION_TYPE_CLOSE:
@ -765,10 +897,20 @@ actions_run(struct view *activator, struct server *server,
view_move_to_edge(view, edge, snap_to_windows); view_move_to_edge(view, edge, snap_to_windows);
} }
break; break;
case ACTION_TYPE_TOGGLE_SNAP_TO_EDGE:
case ACTION_TYPE_SNAP_TO_EDGE: case ACTION_TYPE_SNAP_TO_EDGE:
if (view) { if (view) {
/* Config parsing makes sure that direction is a valid direction */ /* Config parsing makes sure that direction is a valid direction */
enum view_edge edge = action_get_int(action, "direction", 0); enum view_edge edge = action_get_int(action, "direction", 0);
if (action->type == ACTION_TYPE_TOGGLE_SNAP_TO_EDGE
&& view->maximized == VIEW_AXIS_NONE
&& !view->fullscreen
&& view_is_tiled(view)
&& view->tiled == edge) {
view_set_untiled(view);
view_apply_natural_geometry(view);
break;
}
view_snap_to_edge(view, edge, view_snap_to_edge(view, edge,
/*across_outputs*/ true, /*across_outputs*/ true,
/*store_natural_geometry*/ true); /*store_natural_geometry*/ true);
@ -789,22 +931,20 @@ actions_run(struct view *activator, struct server *server,
} }
break; break;
case ACTION_TYPE_NEXT_WINDOW: case ACTION_TYPE_NEXT_WINDOW:
server->osd_state.cycle_view = desktop_cycle_view(server, start_window_cycling(server, LAB_CYCLE_DIR_FORWARD);
server->osd_state.cycle_view, LAB_CYCLE_DIR_FORWARD);
osd_update(server);
break; break;
case ACTION_TYPE_PREVIOUS_WINDOW: case ACTION_TYPE_PREVIOUS_WINDOW:
server->osd_state.cycle_view = desktop_cycle_view(server, start_window_cycling(server, LAB_CYCLE_DIR_BACKWARD);
server->osd_state.cycle_view, LAB_CYCLE_DIR_BACKWARD);
osd_update(server);
break; break;
case ACTION_TYPE_RECONFIGURE: case ACTION_TYPE_RECONFIGURE:
kill(getpid(), SIGHUP); kill(getpid(), SIGHUP);
break; break;
case ACTION_TYPE_SHOW_MENU: case ACTION_TYPE_SHOW_MENU:
show_menu(server, view, show_menu(server, view, &ctx,
action_get_str(action, "menu", NULL), action_get_str(action, "menu", NULL),
action_get_bool(action, "atCursor", true)); action_get_bool(action, "atCursor", true),
action_get_str(action, "x.position", NULL),
action_get_str(action, "y.position", NULL));
break; break;
case ACTION_TYPE_TOGGLE_MAXIMIZE: case ACTION_TYPE_TOGGLE_MAXIMIZE:
if (view) { if (view) {
@ -893,6 +1033,8 @@ actions_run(struct view *activator, struct server *server,
break; break;
case ACTION_TYPE_RESIZE: case ACTION_TYPE_RESIZE:
if (view) { if (view) {
uint32_t resize_edges = cursor_get_resize_edges(
server->seat.cursor, &ctx);
interactive_begin(view, LAB_INPUT_STATE_RESIZE, interactive_begin(view, LAB_INPUT_STATE_RESIZE,
resize_edges); resize_edges);
} }
@ -964,7 +1106,7 @@ actions_run(struct view *activator, struct server *server,
* a required argument for both SendToDesktop and GoToDesktop. * a required argument for both SendToDesktop and GoToDesktop.
*/ */
struct workspace *target = workspaces_find( struct workspace *target = workspaces_find(
server->workspace_current, to, wrap); server->workspaces.current, to, wrap);
if (!target) { if (!target) {
break; break;
} }
@ -987,25 +1129,10 @@ actions_run(struct view *activator, struct server *server,
if (!view) { if (!view) {
break; break;
} }
const char *output_name = action_get_str(action, "output", NULL); target = get_target_output(view->output, server, action);
struct output *target = NULL; if (target) {
if (output_name) {
target = output_from_name(view->server, output_name);
} else {
enum view_edge edge = action_get_int(action, "direction", 0);
bool wrap = action_get_bool(action, "wrap", false);
target = view_get_adjacent_output(view, edge, wrap);
}
if (!target) {
/*
* Most likely because we're already on the
* output furthest in the requested direction
* or the output or direction was invalid.
*/
wlr_log(WLR_DEBUG, "Invalid output");
break;
}
view_move_to_output(view, target); view_move_to_output(view, target);
}
break; break;
case ACTION_TYPE_FIT_TO_OUTPUT: case ACTION_TYPE_FIT_TO_OUTPUT:
if (!view) { if (!view) {
@ -1013,32 +1140,51 @@ actions_run(struct view *activator, struct server *server,
} }
view_constrain_size_to_that_of_usable_area(view); view_constrain_size_to_that_of_usable_area(view);
break; break;
case ACTION_TYPE_TOGGLE_SNAP_TO_REGION:
case ACTION_TYPE_SNAP_TO_REGION: case ACTION_TYPE_SNAP_TO_REGION:
if (!view) { if (!view) {
break; break;
} }
struct output *output = view->output; output = view->output;
if (!output) { if (!output) {
break; break;
} }
const char *region_name = action_get_str(action, "region", NULL); const char *region_name = action_get_str(action, "region", NULL);
struct region *region = regions_from_name(region_name, output); struct region *region = regions_from_name(region_name, output);
if (region) { if (region) {
if (action->type == ACTION_TYPE_TOGGLE_SNAP_TO_REGION
&& view->maximized == VIEW_AXIS_NONE
&& !view->fullscreen
&& view_is_tiled(view)
&& view->tiled_region == region) {
view_set_untiled(view);
view_apply_natural_geometry(view);
break;
}
view_snap_to_region(view, region, view_snap_to_region(view, region,
/*store_natural_geometry*/ true); /*store_natural_geometry*/ true);
} else { } else {
wlr_log(WLR_ERROR, "Invalid SnapToRegion id: '%s'", region_name); wlr_log(WLR_ERROR, "Invalid SnapToRegion id: '%s'", region_name);
} }
break; break;
case ACTION_TYPE_UNSNAP:
if (view && !view->fullscreen && !view_is_floating(view)) {
view_maximize(view, VIEW_AXIS_NONE,
/* store_natural_geometry */ false);
view_set_untiled(view);
view_apply_natural_geometry(view);
}
break;
case ACTION_TYPE_TOGGLE_KEYBINDS: case ACTION_TYPE_TOGGLE_KEYBINDS:
if (view) { if (view) {
view_toggle_keybinds(view); view_toggle_keybinds(view);
} }
break; break;
case ACTION_TYPE_FOCUS_OUTPUT: case ACTION_TYPE_FOCUS_OUTPUT:
{ output = output_nearest_to_cursor(server);
const char *output_name = action_get_str(action, "output", NULL); target = get_target_output(output, server, action);
desktop_focus_output(output_from_name(server, output_name)); if (target) {
desktop_focus_output(target);
} }
break; break;
case ACTION_TYPE_IF: case ACTION_TYPE_IF:
@ -1061,7 +1207,7 @@ actions_run(struct view *activator, struct server *server,
struct wl_list *actions; struct wl_list *actions;
actions = action_get_actionlist(action, "none"); actions = action_get_actionlist(action, "none");
if (actions) { if (actions) {
actions_run(view, server, actions, 0); actions_run(view, server, actions, NULL);
} }
} }
} }
@ -1091,9 +1237,22 @@ actions_run(struct view *activator, struct server *server,
break; break;
case ACTION_TYPE_TOGGLE_TEARING: case ACTION_TYPE_TOGGLE_TEARING:
if (view) { if (view) {
view->tearing_hint = !view->tearing_hint; switch (view->force_tearing) {
wlr_log(WLR_DEBUG, "tearing %sabled", case LAB_STATE_UNSPECIFIED:
view->tearing_hint ? "en" : "dis"); view->force_tearing =
output_get_tearing_allowance(view->output)
? LAB_STATE_DISABLED : LAB_STATE_ENABLED;
break;
case LAB_STATE_DISABLED:
view->force_tearing = LAB_STATE_ENABLED;
break;
case LAB_STATE_ENABLED:
view->force_tearing = LAB_STATE_DISABLED;
break;
}
wlr_log(WLR_ERROR, "force tearing %sabled",
view->force_tearing == LAB_STATE_ENABLED
? "en" : "dis");
} }
break; break;
case ACTION_TYPE_TOGGLE_SHADE: case ACTION_TYPE_TOGGLE_SHADE:
@ -1111,6 +1270,15 @@ actions_run(struct view *activator, struct server *server,
view_set_shade(view, false); view_set_shade(view, false);
} }
break; break;
case ACTION_TYPE_ENABLE_TABLET_MOUSE_EMULATION:
rc.tablet.force_mouse_emulation = true;
break;
case ACTION_TYPE_DISABLE_TABLET_MOUSE_EMULATION:
rc.tablet.force_mouse_emulation = false;
break;
case ACTION_TYPE_TOGGLE_TABLET_MOUSE_EMULATION:
rc.tablet.force_mouse_emulation = !rc.tablet.force_mouse_emulation;
break;
case ACTION_TYPE_TOGGLE_MAGNIFY: case ACTION_TYPE_TOGGLE_MAGNIFY:
magnify_toggle(server); magnify_toggle(server);
break; break;

View file

@ -29,6 +29,7 @@
#include <drm_fourcc.h> #include <drm_fourcc.h>
#include <wlr/interfaces/wlr_buffer.h> #include <wlr/interfaces/wlr_buffer.h>
#include "buffer.h" #include "buffer.h"
#include "common/box.h"
#include "common/mem.h" #include "common/mem.h"
static const struct wlr_buffer_impl data_buffer_impl; static const struct wlr_buffer_impl data_buffer_impl;
@ -44,14 +45,12 @@ static void
data_buffer_destroy(struct wlr_buffer *wlr_buffer) data_buffer_destroy(struct wlr_buffer *wlr_buffer)
{ {
struct lab_data_buffer *buffer = data_buffer_from_buffer(wlr_buffer); struct lab_data_buffer *buffer = data_buffer_from_buffer(wlr_buffer);
if (!buffer->free_on_destroy) {
free(buffer);
return;
}
if (buffer->cairo) { if (buffer->cairo) {
cairo_surface_t *surf = cairo_get_target(buffer->cairo);
cairo_destroy(buffer->cairo); cairo_destroy(buffer->cairo);
cairo_surface_destroy(surf); }
if (buffer->surface) {
/* this also frees buffer->data */
cairo_surface_destroy(buffer->surface);
} else if (buffer->data) { } else if (buffer->data) {
free(buffer->data); free(buffer->data);
buffer->data = NULL; buffer->data = NULL;
@ -85,19 +84,35 @@ static const struct wlr_buffer_impl data_buffer_impl = {
}; };
struct lab_data_buffer * struct lab_data_buffer *
buffer_create_cairo(uint32_t width, uint32_t height, float scale, buffer_adopt_cairo_surface(cairo_surface_t *surface)
bool free_on_destroy)
{ {
struct lab_data_buffer *buffer = znew(*buffer); assert(cairo_surface_get_type(surface) == CAIRO_SURFACE_TYPE_IMAGE);
buffer->unscaled_width = width; assert(cairo_image_surface_get_format(surface) == CAIRO_FORMAT_ARGB32);
buffer->unscaled_height = height;
width *= scale;
height *= scale;
/* Allocate the buffer with the scaled size */ int width = cairo_image_surface_get_width(surface);
int height = cairo_image_surface_get_height(surface);
struct lab_data_buffer *buffer = znew(*buffer);
wlr_buffer_init(&buffer->base, &data_buffer_impl, width, height); wlr_buffer_init(&buffer->base, &data_buffer_impl, width, height);
cairo_surface_t *surf =
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); buffer->surface = surface;
buffer->data = cairo_image_surface_get_data(buffer->surface);
buffer->format = DRM_FORMAT_ARGB8888;
buffer->stride = cairo_image_surface_get_stride(buffer->surface);
buffer->logical_width = width;
buffer->logical_height = height;
return buffer;
}
struct lab_data_buffer *
buffer_create_cairo(uint32_t logical_width, uint32_t logical_height, float scale)
{
/* Create an image surface with the scaled size */
cairo_surface_t *surface =
cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
lroundf(logical_width * scale),
lroundf(logical_height * scale));
/** /**
* Tell cairo about the device scale so we can keep drawing in unscaled * Tell cairo about the device scale so we can keep drawing in unscaled
@ -106,34 +121,82 @@ buffer_create_cairo(uint32_t width, uint32_t height, float scale,
* *
* For a more complete explanation see PR #389 * For a more complete explanation see PR #389
*/ */
cairo_surface_set_device_scale(surf, scale, scale); cairo_surface_set_device_scale(surface, scale, scale);
buffer->cairo = cairo_create(surf); /*
buffer->data = cairo_image_surface_get_data(surf); * Adopt the image surface into a buffer, set the correct
buffer->format = DRM_FORMAT_ARGB8888; * logical size, and create a cairo context for drawing
buffer->stride = cairo_image_surface_get_stride(surf); */
buffer->free_on_destroy = free_on_destroy; struct lab_data_buffer *buffer = buffer_adopt_cairo_surface(surface);
buffer->logical_width = logical_width;
buffer->logical_height = logical_height;
buffer->cairo = cairo_create(surface);
if (!buffer->data) {
cairo_destroy(buffer->cairo);
cairo_surface_destroy(surf);
free(buffer);
buffer = NULL;
}
return buffer; return buffer;
} }
struct lab_data_buffer * struct lab_data_buffer *
buffer_create_wrap(void *pixel_data, uint32_t width, uint32_t height, buffer_convert_cairo_surface_for_icon(cairo_surface_t *surface,
uint32_t stride, bool free_on_destroy) uint32_t icon_size, float scale)
{
assert(cairo_surface_get_type(surface) == CAIRO_SURFACE_TYPE_IMAGE);
/*
* Compute logical size for display and decide whether we can
* use the image data directly (fast path). Requirements are:
*
* - The pixel format must be ARGB32.
* - The image must not be so large as to need downsampling by
* more than 2x when displayed at the target scale. wlr_scene
* uses linear interpolation without pixel averaging, which
* starts to skip samples if downsampling more than 2x,
* resulting in a grainy look.
*/
int width = cairo_image_surface_get_width(surface);
int height = cairo_image_surface_get_height(surface);
struct wlr_box logical =
box_fit_within(width, height, icon_size, icon_size);
struct lab_data_buffer *buffer;
if (cairo_image_surface_get_format(surface) == CAIRO_FORMAT_ARGB32
&& width <= 2 * logical.width * scale
&& height <= 2 * logical.height * scale) {
buffer = buffer_adopt_cairo_surface(surface);
/* set logical size for display */
buffer->logical_width = logical.width;
buffer->logical_height = logical.height;
} else {
/* convert to ARGB32 and scale for display (slow path) */
buffer = buffer_create_cairo(logical.width,
logical.height, scale);
cairo_t *cairo = buffer->cairo;
cairo_scale(cairo, (double)logical.width / width,
(double)logical.height / height);
cairo_set_source_surface(cairo, surface, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cairo),
CAIRO_FILTER_GOOD);
cairo_paint(cairo);
/* ensure pixel data is updated */
cairo_surface_flush(buffer->surface);
/* destroy original surface */
cairo_surface_destroy(surface);
}
return buffer;
}
struct lab_data_buffer *
buffer_create_from_data(void *pixel_data, uint32_t width, uint32_t height,
uint32_t stride)
{ {
struct lab_data_buffer *buffer = znew(*buffer); struct lab_data_buffer *buffer = znew(*buffer);
wlr_buffer_init(&buffer->base, &data_buffer_impl, width, height); wlr_buffer_init(&buffer->base, &data_buffer_impl, width, height);
buffer->unscaled_width = width; buffer->logical_width = width;
buffer->unscaled_height = height; buffer->logical_height = height;
buffer->data = pixel_data; buffer->data = pixel_data;
buffer->format = DRM_FORMAT_ARGB8888; buffer->format = DRM_FORMAT_ARGB8888;
buffer->stride = stride; buffer->stride = stride;
buffer->free_on_destroy = free_on_destroy;
return buffer; return buffer;
} }

View file

@ -1,27 +0,0 @@
// SPDX-License-Identifier: GPL-2.0-only
#include <stdio.h>
#include <unistd.h>
#include "button/common.h"
#include "common/dir.h"
#include "config/rcxml.h"
#include "labwc.h"
void
button_filename(const char *name, char *buf, size_t len)
{
struct wl_list paths;
paths_theme_create(&paths, rc.theme_name, name);
/*
* You can't really merge buttons, so let's just iterate forwards
* and stop on the first hit
*/
struct path *path;
wl_list_for_each(path, &paths, link) {
if (access(path->string, R_OK) == 0) {
snprintf(buf, len, "%s", path->string);
break;
}
}
paths_destroy(&paths);
}

Some files were not shown because too many files have changed in this diff Show more