Merge branch 'mouseemu' of github.com:raspberrypi-ui/labwc into mouseemu

This commit is contained in:
Simon Long 2024-10-20 11:59:51 +01:00
commit 74281d5bbd
178 changed files with 10958 additions and 2691 deletions

View file

@ -29,7 +29,7 @@ jobs:
matrix:
name: [
Arch,
Debian,
# Debian,
FreeBSD,
Void-musl
]
@ -40,11 +40,11 @@ jobs:
env:
TARGET: 'sh -xe'
- name: Debian
os: ubuntu-latest
container: debian:testing
env:
TARGET: 'sh -xe'
# - name: Debian
# os: ubuntu-latest
# container: debian:testing
# env:
# TARGET: 'sh -xe'
- name: FreeBSD
os: ubuntu-latest
@ -81,6 +81,7 @@ jobs:
apt-get upgrade -y
apt-get install -y git gcc clang gdb xwayland
apt-get build-dep -y labwc
apt-get install libwlroots-0.18-dev
- name: Install FreeBSD dependencies
if: matrix.name == 'FreeBSD'
@ -105,8 +106,8 @@ jobs:
xbps-install -Syu
xbps-install -y git meson gcc clang pkg-config scdoc \
cairo-devel glib-devel libpng-devel librsvg-devel libxml2-devel \
pango-devel wlroots0.17-devel gdb bash xorg-server-xwayland \
dejavu-fonts-ttf
pango-devel wlroots0.18-devel gdb bash xorg-server-xwayland \
dejavu-fonts-ttf libsfdo-devel
# These build are executed on all runners
- 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.4 Naming Conventions](#naming-conventions)
- [5. Commit Messages](#commit-messages)
- [6. Submitting Patches](#submitting-patches)
- [7. Native Language Support](#native-language-support)
- [8. Upversion](#upversion)
- [6. Unit Tests](#unit-tests)
- [7. Submitting Patches](#submitting-patches)
- [8. Native Language Support](#native-language-support)
- [9. Upversion](#upversion)
# 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 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
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 |
|------------|---------------|-----------------|---------------|
| 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-03-01 | [0.7.1] | 0.17.1 | 18624 |
| 2023-12-22 | [0.7.0] | 0.17.1 | 16576 |
@ -31,13 +33,254 @@ The format is based on [Keep a Changelog]
## [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
- 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
menu. Written-by: @spl237 PR #1888
- Add initial support for `security-context-v1` (user configurable blocklists
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
- Support multiple IME popups. PR #1823
- 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
- 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
- Fix IME popups issues (flicker when popup surface is initially mapped
and incorrectly showing multiple popups). PR #1872
@ -74,15 +344,15 @@ The format is based on [Keep a Changelog]
### Changed
- Remove subprojects/seatd.wrap as no longer needed
- Action `MoveToCursor` is deprecated in favour of:
`<action name="AutoPlace" policy="cursor"/>`.
## [0.7.2]
This release is shaping up to be the second in a row that is larger than
usual in terms of both fixes and new features. Significant additions
include input-methods, pipemenus, snap-to-edge overlays and optionally
drop-shadows.
This release shaped up to be the second in a row that is larger than usual in
terms of both fixes and new features. Significant additions include
input-methods, pipemenus, snap-to-edge overlays and optionally drop-shadows.
As usual, most of the commits are by the core devs: @ahesford, @Consolatis,
@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
[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.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

View file

@ -182,7 +182,7 @@ prevent installing the wlroots headers:
## 3. Configuration
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].
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
Icon=labwc
Type=Application
DesktopNames=wlroots
DesktopNames=labwc;wlroots

View file

@ -5,6 +5,7 @@ Config layout for ~/.config/labwc/
- rc.xml
- shutdown
- themerc-override
- xinitrc
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).
## 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
## already set environment variable, so if you need it set to something else,
## then uncomment and adjust.
##
# XDG_CURRENT_DESKTOP=wlroots
# XDG_CURRENT_DESKTOP=labwc:wlroots
##
## 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
it right, negative left. Positive value of y moves it down, negative up.
*<action name="ToggleSnapToEdge" direction="value" />*++
*<action name="SnapToEdge" direction="value" />*
Resize window to fill half the output in the given direction. Supports
directions "left", "up", "right", "down" and "center".
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" />*
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.
*<action name="NextWindow" />*
Cycle focus to next window.
*<action name="UnSnap" />*
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" />*
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" />*
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" />*
Show a menu.
*menu* The name of the menu to show. The menus "root-menu" and
"client-menu" are guaranteed to exist, but others may be defined
explicitly. See labwc-menu(5) for more information.
*menu* The name of the menu to show. The menus "root-menu",
"client-menu", "client-send-to-menu" and "client-list-combined-menu"
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
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
yes.
upper-left corner of the window associated with the action or underneath
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" />*
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.
*<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" />*
Give focus to topmost window on given output and warp the cursor
to the center of the window. If the given output does not contain
any windows, the cursor is centered on the given output.
Requires the config option 'allowTearing'. When 'allowTearing' is set
to 'fullscreen' or 'fullscreenForced', tearing will still only be
enabled if the active window is in fullscreen mode.
*<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" />*
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"/>*
Reposition the window according to the desired placement policy.
*policy* [automatic|cursor|center] Use the specified policy, which has
the same meaning as the corresponding value for *<placement><policy>*.
Default is automatic.
*policy* [automatic|cursor|center|cascade] Use the specified policy,
which has the same meaning as the corresponding value for
*<placement><policy>*. Default is automatic.
*<action name="Shade" />*++
*<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
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">*
Toggle the screen magnifier on or off at the last magnification level
used.

View file

@ -8,7 +8,7 @@ labwc - configuration files
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
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.
@ -78,6 +78,10 @@ in labwc-theme(5).
*rc.xml* is the main configuration file and all its options are described in
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
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
mode.
*<core><allowTearing>* [yes|no]
*<core><allowTearing>* [yes|no|fullscreen|fullscreenForced]
Allow tearing to reduce input lag. Default is no.
This option requires setting the environment variable
WLR_DRM_NO_ATOMIC=1.
*yes* allow tearing if requested by the active window.
*yes* allows 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]
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.
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><policy>* [center|automatic|cursor]
*<placement><policy>* [center|automatic|cursor|cascade]
Specify a placement policy for new windows. The "center" policy will
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
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
@ -293,6 +326,15 @@ this is for compatibility with Openbox.
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><followMouse>* [yes|no]
@ -395,6 +437,29 @@ extending outward from the snapped edge.
*<theme><name>*
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>*
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
- InactiveWindow - titlebar of all windows that aren't focused by the
cursor
- MenuHeader - menu title
- MenuItem - menu item (currently only root menu)
- OnScreenDisplay - items in the on screen display
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.
*<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>*
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
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
modifiers are:
- 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.
Default is no.
*<keyboard><keybind key="" onRelease="yes|no">*
*onRelease*, when yes, fires the keybind action when the key or key
*allowWhenLocked* [yes|no]
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
bind actions to only modifier keys, where the action should fire when
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
combinations that include the super key:
```
<keybind key="Super_L" onRelease="yes">
<action name="Execute" command="rofi -show drun"/>
@ -551,9 +619,6 @@ extending outward from the snapped edge.
*<mouse><doubleClickTime>*
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>*
Multiple *<mousebind>* can exist within one *<context>*; and multiple
*<action>* can exist within one *<mousebind>*.
@ -563,10 +628,13 @@ extending outward from the snapped edge.
buttons and the window title are shown.
- Title: The area of the titlebar (including blank space) between
the window buttons, where the window title is displayed.
- WindowMenu: The button on the left.
- Iconify: The button that looks like an underline.
- Maximize: The button that looks like a box.
- Close: The button that looks like an X.
- Icon: A window icon that, by default, displays a window menu.
- WindowMenu: A button that, by default, displays a window menu.
- Iconify: A button that, by default, iconifies a window.
- 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.
- Bottom: The bottom 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
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]
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.
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
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="" />*
Pen and pad buttons behave like regular mouse buttons.With mouse
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.
## 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
```
@ -742,6 +834,7 @@ extending outward from the snapped edge.
<clickMethod></clickMethod>
<sendEventsMode></sendEventsMode>
<calibrationMatrix></calibrationMatrix>
<scrollFactor>1.0</scrollFactor>
</device>
</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
for more information.
*<libinput><scrollFactor>*
Set scroll factor. Default is 1.0.
## WINDOW RULES
Two types of window rules are supported, actions and properties. They are
@ -960,7 +1056,7 @@ situation.
*<menu><ignoreButtonReleasePeriod>*
How long (in milliseconds) the initial button release event is ignored
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
item. This behaviour only affects the first button-release. It is not
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 -->
<menu id="" />
<!-- Horizontal line >
<!-- Horizontal line -->
<separator />
<!-- An inline submenu -->
@ -33,6 +33,9 @@ The menu file must be entirely enclosed within <openbox_menu> and
...some content...
</menu>
<!-- Title -->
<separator label=""/>
<!-- Pipemenu -->
<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
- "root-menu" for the root window 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)
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*
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*
Command to execute for pipe menu. See details below.

View file

@ -47,17 +47,17 @@ labwc-config(5).
# THEME ELEMENTS
*border.width*
Line width (integer) of border border drawn around window frames.
Line width (integer) of border drawn around window frames.
Default is 1.
*padding.height*
Vertical padding size, used for spacing out elements in the window
decorations. Default is 3.
*window.titlebar.padding.width*
Horizontal titlebar padding size, in pixels, between border and first
button on the left/right.
Default is 0.
*titlebar.height*
Window title bar height.
Default equals the vertical font extents of the title plus 2x
padding.height.
*window.titlebar.padding.height*
Vertical titlebar padding size, in pixels.
Default is 0.
*menu.items.padding.x*
Horizontal padding of menu text entries in pixels.
@ -67,6 +67,10 @@ labwc-config(5).
Vertical padding of menu text entries in pixels.
Default is 4.
*menu.title.text.justify*
Specifies how menu titles are aligned in the titlebar.
Type justification. Default Center.
*menu.overlap.x*
Horizontal overlap in pixels between submenus and their parents. 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
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*
Color of the images in titlebar buttons in their default, unpressed,
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,
state. This element is for non-focused windows.
Note: The button elements (i.e. window.[in]active.button.\*) support defining
different types of buttons individually by inserting the type ("menu",
"iconify", "max" and "close") 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
openbox and is used by many popular themes. For the sake of brevity, these
elements are not listed here, but are supported.
Note: Button elements (i.e. window.[in]active.button.\*) may be defined uniquely
for each type of button ("menu", "iconify", "max", "shade", "desk" or "close")
by appending the type after the "button" node. For example:
- window.active.button.iconify.unpressed.image.color indicates the color of the
iconify button for active windows; while
- 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*
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. 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*
Background color of on-screen-display. Inherits
*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
- menu.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
over the button in question:
@ -312,6 +349,10 @@ over the button in question:
- close_hover.xbm
- menu_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
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-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

View file

@ -37,12 +37,24 @@
<action name="ToggleOmnipresent" />
</item>
</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">
<action name="Close" />
</item>
</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">
<action name="Execute" command="firefox" />
</item>
@ -61,6 +73,12 @@
</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">
<action name="Reconfigure" />
</item>

View file

@ -13,15 +13,26 @@
<adaptiveSync>no</adaptiveSync>
<allowTearing>no</allowTearing>
<reuseOutputMode>no</reuseOutputMode>
<xwaylandPersistence>no</xwaylandPersistence>
</core>
<placement>
<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>
<!-- <font><theme> can be defined without an attribute to set all places -->
<theme>
<name></name>
<icon></icon>
<titlebar>
<layout>icon:iconify,max,close</layout>
<showTitle>yes</showTitle>
</titlebar>
<cornerRadius>8</cornerRadius>
<keepBorder>yes</keepBorder>
<dropShadows>no</dropShadows>
@ -37,6 +48,12 @@
<slant>normal</slant>
<weight>normal</weight>
</font>
<font place="MenuHeader">
<name>sans</name>
<size>10</size>
<slant>normal</slant>
<weight>normal</weight>
</font>
<font place="MenuItem">
<name>sans</name>
<size>10</size>
@ -101,6 +118,10 @@
<resistance>
<screenEdgeStrength>20</screenEdgeStrength>
<windowEdgeStrength>20</windowEdgeStrength>
<!-- resistance for maximized/tiled windows -->
<unSnapThreshold>20</unSnapThreshold>
<!-- resistance for vertically/horizontally maximized windows -->
<unMaximizeThreshold>150</unMaximizeThreshold>
</resistance>
<resize>
@ -252,7 +273,7 @@
<action name="SnapToEdge" direction="down" />
</keybind>
<keybind key="A-Space">
<action name="ShowMenu" menu="client-menu" />
<action name="ShowMenu" menu="client-menu" atCursor="no" />
</keybind>
<keybind key="XF86_AudioLowerVolume">
<action name="Execute" command="amixer sset Master 5%-" />
@ -299,6 +320,16 @@
<action name="SnapToRegion" region="bottom-right" />
</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>
<!--
@ -316,7 +347,6 @@
<!-- time is in ms -->
<doubleClickTime>500</doubleClickTime>
<scrollFactor>1.0</scrollFactor>
<context name="Frame">
<mousebind button="A-Left" action="Press">
@ -421,10 +451,31 @@
<context name="WindowMenu">
<mousebind button="Left" action="Click">
<action name="ShowMenu" menu="client-menu" />
<action name="ShowMenu" menu="client-menu" atCursor="no" />
</mousebind>
<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>
</context>
@ -464,6 +515,8 @@
</mousebind>
<mousebind button="Middle" action="Press">
<action name="ShowMenu" menu="root-menu" />
<!-- openbox default, swap with above line to activate -->
<!-- <action name="ShowMenu" menu="client-list-combined-menu" /> -->
</mousebind>
<mousebind direction="Up" action="Scroll">
<action name="GoToDesktop" to="left" wrap="yes" />
@ -523,6 +576,16 @@
<map button="Stylus2" to="Middle" />
</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,
non-touch, default or the name of a device. You can obtain device names by
@ -538,6 +601,7 @@
- clickMethod [none|buttonAreas|clickfinger]
- sendEventsMode [yes|no|disabledOnExternalMouse]
- calibrationMatrix [six float values split by space]
- scrollFactor [float]
-->
<libinput>
<device category="default">
@ -554,6 +618,7 @@
<clickMethod></clickMethod>
<sendEventsMode></sendEventsMode>
<calibrationMatrix></calibrationMatrix>
<scrollFactor>1.0</scrollFactor>
</device>
</libinput>

View file

@ -7,11 +7,13 @@
# general
border.width: 1
padding.height: 3
# The following options has no default, but fallbacks back to
# font-height + 2x padding.height if not set.
# titlebar.height:
#
# We do not support the global padding.{width,height} of openbox because
# the default labwc button geometry has deviates from that of openbox
#
window.titlebar.padding.width: 0
window.titlebar.padding.height: 0
# window border
window.active.border.color: #e1dedb
@ -29,6 +31,14 @@ window.active.label.text.color: #000000
window.inactive.label.text.color: #000000
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.active.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.height: 3
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)
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 server;
struct cursor_context;
struct action {
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);
/**
* 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,
struct wl_list *actions, uint32_t resize_edges);
struct wl_list *actions, struct cursor_context *ctx);
void action_free(struct action *action);
void action_list_free(struct wl_list *action_list);

View file

@ -32,21 +32,55 @@
struct lab_data_buffer {
struct wlr_buffer base;
cairo_t *cairo;
void *data;
cairo_surface_t *surface; /* optional */
cairo_t *cairo; /* optional */
void *data; /* owned by surface if surface != NULL */
uint32_t format;
size_t stride;
bool free_on_destroy;
uint32_t unscaled_width;
uint32_t unscaled_height;
/*
* The logical size of the surface in layout pixels.
* 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,
float scale, bool free_on_destroy);
/*
* Create a buffer which holds (and takes ownership of) an existing
* 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,
uint32_t height, uint32_t stride, bool free_on_destroy);
/*
* Create a buffer which holds a new CAIRO_FORMAT_ARGB32 image surface.
* 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 */

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 */
#ifndef LABWC_ARRAY_H
#define LABWC_ARRAY_H
#include <stdio.h>
#include <stdlib.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)--)
/**
* 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 */

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);
/**
* 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
* @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 {
FONT_SLANT_NORMAL = 0,
FONT_SLANT_ITALIC
FONT_SLANT_ITALIC,
FONT_SLANT_OBLIQUE
};
enum font_weight {

View file

@ -7,6 +7,7 @@
struct wlr_scene_node;
struct wlr_surface;
struct wlr_scene_output;
struct wlr_output_state;
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);
/* 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 */

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",
.event = "Click",
.action = "ToggleMaximize",
}, {
.context = "Shade",
.button = "Left",
.event = "Click",
.action = "ToggleShade",
}, {
.context = "AllDesktops",
.button = "Left",
.event = "Click",
.action = "ToggleOmnipresent",
}, {
.context = "Maximize",
.button = "Right",
@ -366,6 +376,32 @@ static struct mouse_combos {
.name = "atCursor",
.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",
.button = "Left",

View file

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

View file

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

View file

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

View file

@ -4,6 +4,12 @@
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>
* 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 wlr_surface;
struct wlr_scene_node;
enum wlr_button_state;
enum wl_pointer_button_state;
/* Cursors used internally by labwc */
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
* 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_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,
struct wlr_input_device *device,
double x, double y, uint32_t time_msec);
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);
#endif /* LABWC_CURSOR_H */

View file

@ -36,7 +36,7 @@ struct drawing_tablet_pad {
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_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 */
};
void tablet_tool_init(struct seat *seat,
void tablet_tool_create(struct seat *seat,
struct wlr_tablet_tool *wlr_tablet_tool);
bool tablet_tool_has_focused_surface(struct seat *seat);

View file

@ -14,7 +14,8 @@ struct drawing_tablet {
struct seat *seat;
struct wlr_tablet *tablet;
struct wlr_tablet_v2_tablet *tablet_v2;
double x, y;
enum motion motion_mode;
double x, y, dx, dy;
double distance;
double pressure;
double tilt_x, tilt_y;
@ -22,15 +23,13 @@ struct drawing_tablet {
double slider;
double wheel_delta;
struct {
struct wl_listener proximity;
struct wl_listener axis;
struct wl_listener tip;
struct wl_listener button;
struct wl_listener destroy;
} handlers;
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 */

View file

@ -44,6 +44,7 @@
#include <wlr/types/wlr_input_method_v2.h>
#include <wlr/types/wlr_tablet_v2.h>
#include <wlr/util/log.h>
#include "common/set.h"
#include "config/keybind.h"
#include "config/rcxml.h"
#include "input/cursor.h"
@ -71,6 +72,8 @@ enum input_mode {
struct input {
struct wlr_input_device *wlr_input_device;
struct seat *seat;
/* Set for pointer/touch devices */
double scroll_factor;
struct wl_listener destroy;
struct wl_list link; /* seat.inputs */
};
@ -127,9 +130,8 @@ struct seat {
struct input_method_relay *input_method_relay;
/**
* pressed view/surface/node will usually be NULL and is only set on
* button press while the mouse is over a view or surface, and reset
* to NULL on button release.
* This is usually zeroed and is only set on button press while the
* mouse is over a view or surface, and zeroed on button release.
* It is used to send cursor motion events to a surface even though
* the cursor has left the surface in the meantime.
*
@ -142,13 +144,9 @@ struct seat {
*
* Both (view && !surface) and (surface && !view) are possible.
*/
struct {
struct view *view;
struct wlr_scene_node *node;
struct wlr_surface *surface;
struct wlr_surface *toplevel;
uint32_t resize_edges;
} pressed;
struct cursor_context pressed;
struct lab_set bound_buttons;
struct {
bool active;
@ -164,7 +162,6 @@ struct seat {
/* Used to prevent region snapping when starting a move with A-Left */
bool region_prevent_snap;
struct wl_client *active_client_while_inhibited;
struct wl_list inputs;
struct wl_listener new_input;
struct wl_listener focus_change;
@ -193,6 +190,11 @@ struct seat {
struct wl_listener touch_motion;
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 tablet_tools;
struct wl_list tablet_pads;
@ -210,6 +212,12 @@ struct seat {
struct lab_data_buffer;
struct workspace;
enum lab_cycle_dir {
LAB_CYCLE_DIR_NONE,
LAB_CYCLE_DIR_FORWARD,
LAB_CYCLE_DIR_BACKWARD,
};
struct server {
struct wl_display *wl_display;
struct wl_event_loop *wl_event_loop; /* Can be used for timer events */
@ -220,11 +228,12 @@ struct server {
struct wlr_backend *backend;
} headless;
struct wlr_session *session;
struct wlr_linux_dmabuf_v1 *linux_dmabuf;
struct wlr_xdg_shell *xdg_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 kde_server_decoration;
@ -236,12 +245,9 @@ struct server {
struct wl_listener xwayland_new_surface;
#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 wl_listener xdg_activation_request;
struct wl_listener xdg_activation_new_token;
struct wl_list views;
struct wl_list unmanaged_surfaces;
@ -249,11 +255,14 @@ struct server {
struct seat seat;
struct wlr_scene *scene;
struct wlr_scene_output_layout *scene_layout;
bool direct_scanout_enabled;
/* cursor interactive */
enum input_mode input_mode;
struct view *grabbed_view;
/* Cursor position when interactive move/resize is requested */
double grab_x, grab_y;
/* View geometry when interactive move/resize is requested */
struct wlr_box grab_box;
uint32_t resize_edges;
@ -294,9 +303,16 @@ struct server {
struct wlr_scene_tree *menu_tree;
/* Workspaces */
struct wl_list workspaces; /* struct workspace.link */
struct workspace *workspace_current;
struct workspace *workspace_last;
struct {
struct wl_list all; /* struct workspace.link */
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_listener new_output;
@ -315,6 +331,8 @@ struct server {
*/
int pending_output_layout_change;
struct wl_listener renderer_lost;
struct wlr_gamma_control_manager_v1 *gamma_control_manager_v1;
struct wl_listener gamma_control_set_gamma;
@ -349,6 +367,8 @@ struct server {
struct wlr_scene_tree *preview_parent;
struct wlr_scene_node *preview_anchor;
struct multi_rect *preview_outline;
enum lab_cycle_dir initial_direction;
bool initial_keybind_contained_shift;
} osd_state;
struct theme *theme;
@ -356,6 +376,8 @@ struct server {
struct menu *menu_current;
struct wl_list menus;
struct icon_loader *icon_loader;
pid_t primary_client_pid;
};
@ -365,6 +387,7 @@ struct output {
struct wl_list link; /* server.outputs */
struct server *server;
struct wlr_output *wlr_output;
struct wlr_output_state pending;
struct wlr_scene_output *scene_output;
struct wlr_scene_tree *layer_tree[LAB_NR_LAYERS];
struct wlr_scene_tree *layer_popup_tree;
@ -383,6 +406,8 @@ struct output {
bool leased;
bool gamma_lut_changed;
uint32_t nr_tearing_failures;
};
#undef LAB_NR_LAYERS
@ -421,7 +446,7 @@ void foreign_toplevel_update_outputs(struct view *view);
* - optionally raise above other views
*
* 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);
@ -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_focus_output(struct output *output);
void warp_cursor(struct view *view);
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);
enum lab_cycle_dir {
LAB_CYCLE_DIR_NONE,
LAB_CYCLE_DIR_FORWARD,
LAB_CYCLE_DIR_BACKWARD,
};
/**
* desktop_cycle_view - return 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_set_focus_layer(struct seat *seat, struct wlr_layer_surface_v1 *layer);
void seat_set_pressed(struct seat *seat, struct view *view,
struct wlr_scene_node *node, struct wlr_surface *surface,
struct wlr_surface *toplevel, uint32_t resize_edges);
void seat_set_pressed(struct seat *seat, struct cursor_context *ctx);
void seat_reset_pressed(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_finish(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_nearest_to(struct server *server, int lx, int ly);
struct output *output_nearest_to_cursor(struct server *server);
/**
* output_get_adjacent() - get next output, in a given direction,
* from a given output
*
* @output: reference output
* @edge: direction in which to look for the nearest output
* @wrap: if true, wrap around at layout edge
*
* Note: if output is NULL, the output nearest the cursor will be used as the
* reference instead.
*/
struct output *output_get_adjacent(struct output *output,
enum view_edge edge, bool wrap);
bool output_is_usable(struct output *output);
void output_update_usable_area(struct output *output);
void output_update_all_usable_areas(struct server *server, bool layout_changed);
bool output_get_tearing_allowance(struct output *output);
struct wlr_box output_usable_area_in_layout_coords(struct output *output);
struct wlr_box output_usable_area_scaled(struct output *output);
void handle_output_power_manager_set_mode(struct wl_listener *listener,
void *data);
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 server_init(struct server *server);
void server_start(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 constrain_cursor(struct server *server, struct wlr_pointer_constraint_v1
*constraint);

View file

@ -32,6 +32,7 @@ struct lab_layer_popup {
struct wl_listener commit;
struct wl_listener destroy;
struct wl_listener new_popup;
struct wl_listener reposition;
};
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,
struct wlr_box *damage);
bool is_magnify_on(void);
void magnify_reset(void);
#endif /* LABWC_MAGNIFIER_H */

View file

@ -27,6 +27,12 @@ struct menu_scene {
struct scaled_font_buffer *buffer;
};
enum menuitem_type {
LAB_MENU_ITEM = 0,
LAB_MENU_SEPARATOR_LINE,
LAB_MENU_TITLE,
};
struct menuitem {
struct wl_list actions;
char *execute;
@ -34,11 +40,14 @@ struct menuitem {
struct menu *parent;
struct menu *submenu;
bool selectable;
enum menuitem_type type;
int height;
int native_width;
struct wlr_scene_tree *tree;
struct menu_scene normal;
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 */
};
@ -46,7 +55,6 @@ struct menuitem {
struct menu {
char *id;
char *label;
int item_height;
struct menu *parent;
struct {
@ -128,4 +136,7 @@ void menu_close_root(struct server *server);
/* menu_reconfigure - reload theme and content */
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 */

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
#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);
#endif /* LABWC_RESISTANCE_H */

View file

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

View file

@ -18,13 +18,16 @@
struct ssd_button {
struct view *view;
enum ssd_part_type type;
struct wlr_scene_node *normal;
struct wlr_scene_node *hover;
struct wlr_scene_node *toggled;
struct wlr_scene_node *toggled_hover;
struct wlr_scene_node *background;
struct wlr_scene_tree *icon_tree;
struct wlr_scene_tree *hover_tree;
/*
* Bitmap of lab_button_state that represents a combination of
* hover/toggled/rounded states.
*/
uint8_t state_set;
/*
* 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;
};
@ -49,13 +52,33 @@ struct ssd {
* don't update things we don't have to.
*/
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 ssd_state_title {
char *text;
struct ssd_state_title_width active;
struct ssd_state_title_width inactive;
} title;
char *app_id;
} state;
/* An invisible area around the view which allows resizing */
@ -99,9 +122,6 @@ struct ssd_part {
/* This part represented in scene graph */
struct wlr_scene_node *node;
/* Targeted geometry. May be NULL */
struct wlr_box *geometry;
struct wl_list link;
};
@ -124,19 +144,12 @@ struct ssd_part *add_scene_rect(
struct ssd_part *add_scene_buffer(
struct wl_list *list, enum ssd_part_type type,
struct wlr_scene_tree *parent, struct wlr_buffer *buffer, int x, int y);
struct ssd_part *add_scene_button(
struct wl_list *part_list, enum ssd_part_type type,
struct wlr_scene_tree *parent, float *bg_color,
struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer,
int x, struct view *view);
void add_toggled_icon(struct ssd_button *button, struct wl_list *part_list,
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);
struct ssd_part *add_scene_button(struct wl_list *part_list,
enum ssd_part_type type, struct wlr_scene_tree *parent,
struct lab_data_buffer *buffers[LAB_BS_ALL + 1], int x, int y,
struct view *view);
void update_window_icon_buffer(struct wlr_scene_node *button_node,
struct lab_data_buffer *buffer);
/* SSD internal helpers */
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_update(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_update(struct ssd *ssd);

View file

@ -5,8 +5,6 @@
#include <wayland-server-core.h>
#include "common/border.h"
#define SSD_BUTTON_COUNT 4
#define SSD_BUTTON_WIDTH 26
#define SSD_EXTENDED_AREA 8
/*
@ -23,12 +21,25 @@
*/
enum ssd_part_type {
LAB_SSD_NONE = 0,
LAB_SSD_BUTTON_CLOSE,
LAB_SSD_BUTTON_CLOSE = 1,
LAB_SSD_BUTTON_MAXIMIZE,
LAB_SSD_BUTTON_ICONIFY,
LAB_SSD_BUTTON_WINDOW_ICON,
LAB_SSD_BUTTON_WINDOW_MENU,
LAB_SSD_BUTTON_SHADE,
LAB_SSD_BUTTON_OMNIPRESENT,
/* only for internal use */
LAB_SSD_BUTTON_FIRST = LAB_SSD_BUTTON_CLOSE,
LAB_SSD_BUTTON_LAST = LAB_SSD_BUTTON_OMNIPRESENT,
LAB_SSD_BUTTON,
LAB_SSD_PART_TITLEBAR,
LAB_SSD_PART_TITLEBAR_CORNER_RIGHT,
LAB_SSD_PART_TITLEBAR_CORNER_LEFT,
LAB_SSD_PART_TITLE,
/* shared by shadows, borders and extents */
LAB_SSD_PART_CORNER_TOP_LEFT,
LAB_SSD_PART_CORNER_TOP_RIGHT,
LAB_SSD_PART_CORNER_BOTTOM_RIGHT,
@ -37,6 +48,7 @@ enum ssd_part_type {
LAB_SSD_PART_RIGHT,
LAB_SSD_PART_BOTTOM,
LAB_SSD_PART_LEFT,
LAB_SSD_CLIENT,
LAB_SSD_FRAME,
LAB_SSD_ROOT,
@ -74,12 +86,14 @@ struct wlr_scene_node;
*/
struct ssd *ssd_create(struct view *view, bool active);
struct border ssd_get_margin(const struct ssd *ssd);
int ssd_get_corner_width(void);
void ssd_update_margin(struct ssd *ssd);
void ssd_set_active(struct ssd *ssd, bool active);
void ssd_update_title(struct ssd *ssd);
void ssd_update_geometry(struct ssd *ssd);
void ssd_destroy(struct ssd *ssd);
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_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,
struct wlr_scene_node *node);
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);
enum ssd_mode ssd_mode_parse(const char *mode);

View file

@ -10,6 +10,7 @@
#include <stdio.h>
#include <wlr/render/wlr_renderer.h>
#include "ssd.h"
enum lab_justification {
LAB_JUSTIFY_LEFT,
@ -25,9 +26,24 @@ struct theme_snapping_overlay {
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 {
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 menu_overlap_x;
int menu_overlap_y;
@ -44,20 +60,19 @@ struct theme {
float window_active_label_text_color[4];
float window_inactive_label_text_color[4];
enum lab_justification window_label_text_justify;
enum lab_justification menu_title_text_justify;
/* button colors */
float window_active_button_menu_unpressed_image_color[4];
float window_active_button_iconify_unpressed_image_color[4];
float window_active_button_max_unpressed_image_color[4];
float window_active_button_close_unpressed_image_color[4];
float window_inactive_button_menu_unpressed_image_color[4];
float window_inactive_button_iconify_unpressed_image_color[4];
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 */
/* buttons */
int window_button_width;
int window_button_height;
int window_button_spacing;
/* the corner radius of the hover effect */
int window_button_hover_bg_corner_radius;
int menu_item_padding_x;
int menu_item_padding_y;
int menu_item_height;
float menu_items_bg_color[4];
float menu_items_text_color[4];
@ -72,6 +87,10 @@ struct theme {
int menu_separator_padding_height;
float menu_separator_color[4];
float menu_title_bg_color[4];
float menu_title_text_color[4];
int osd_border_width;
float osd_bg_color[4];
@ -99,31 +118,26 @@ struct theme {
float window_active_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 */
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_right_active_normal;
@ -137,7 +151,10 @@ struct theme {
struct lab_data_buffer *shadow_corner_bottom_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;
/* magnifier */
@ -145,6 +162,9 @@ struct theme {
int mag_border_width;
};
#define THEME_INACTIVE 0
#define THEME_ACTIVE 1
struct server;
/**

View file

@ -2,6 +2,7 @@
#ifndef LABWC_VIEW_H
#define LABWC_VIEW_H
#include "config/rcxml.h"
#include "config.h"
#include "ssd.h"
#include <stdbool.h>
@ -10,9 +11,18 @@
#include <wlr/util/box.h>
#include <xkbcommon/xkbcommon.h>
#define LAB_MIN_VIEW_WIDTH (SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT)
#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
* the user. In practice this means XDG toplevel and XWayland windows.
@ -31,6 +41,12 @@ enum ssd_preference {
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
* internally to mean "not maximized" but is not valid in rc.xml.
@ -188,6 +204,7 @@ struct view {
enum view_axis maximized;
bool fullscreen;
bool tearing_hint;
enum three_state force_tearing;
bool visible_on_all_workspaces;
enum view_edge tiled;
uint32_t edges_visible; /* enum wlr_edges bitset */
@ -281,6 +298,7 @@ struct xdg_toplevel_view {
/* Events unique to xdg-toplevel views */
struct wl_listener set_app_id;
struct wl_listener request_show_window_menu;
struct wl_listener new_popup;
};
@ -451,8 +469,15 @@ void view_moved(struct view *view);
void view_minimize(struct view *view, bool minimized);
bool view_compute_centered_position(struct view *view,
const struct wlr_box *ref, int w, int h, int *x, int *y);
void view_set_fallback_natural_geometry(struct view *view);
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: 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
*/
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_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);
bool view_is_tiled(struct view *view);
bool view_is_tiled_and_notify_tiled(struct view *view);
bool view_is_floating(struct view *view);
void view_move_to_workspace(struct view *view, struct workspace *workspace);
enum ssd_mode view_get_ssd_mode(struct view *view);
@ -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_app_id(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);
@ -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_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_edge view_edge_parse(const char *direction);
enum view_placement_policy view_placement_parse(const char *policy);

View file

@ -4,6 +4,7 @@
#include <stdbool.h>
#include <wayland-util.h>
#include <wayland-server-core.h>
struct seat;
struct server;
@ -19,6 +20,13 @@ struct workspace {
char *name;
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);

View file

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

View file

@ -1,7 +1,7 @@
project(
'labwc',
'c',
version: '0.7.2',
version: '0.8.0',
license: 'GPL-2.0-only',
meson_version: '>=0.59.0',
default_options: [
@ -36,6 +36,7 @@ add_project_arguments(cc.get_supported_arguments([
'-Wunused-macros',
'-Wno-unused-parameter',
'-Wno-expansion-to-defined',
]), language: 'c')
version='"@0@"'.format(meson.project_version())
@ -49,15 +50,16 @@ endif
add_project_arguments('-DLABWC_VERSION=@0@'.format(version), language: 'c')
wlroots = dependency(
'wlroots',
'wlroots-0.18',
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'
have_libsfdo = not get_option('icon').disabled()
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')
xcb = dependency('xcb', 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')
png = dependency('libpng')
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
error('no wlroots Xwayland support')
@ -87,6 +107,8 @@ else
endif
conf_data.set10('HAVE_RSVG', have_rsvg)
conf_data.set10('HAVE_LIBSFDO', have_libsfdo)
if get_option('static_analyzer').enabled()
add_project_arguments(['-fanalyzer'], language: 'c')
endif
@ -125,11 +147,23 @@ if have_rsvg
svg,
]
endif
if have_libsfdo
labwc_deps += [
sfdo_basedir,
sfdo_desktop,
sfdo_icon,
]
endif
subdir('include')
subdir('src')
subdir('docs')
dep_cmocka = dependency('cmocka', required: get_option('test'))
if dep_cmocka.found()
subdir('t')
endif
executable(
meson.project_name(),
labwc_sources,
@ -140,6 +174,8 @@ executable(
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']
foreach icon : icons
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('xwayland', type: 'feature', value: 'auto', description: 'Enable support for X11 applications')
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('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 ""
"Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n"
"PO-Revision-Date: 2024-03-11 10:23+0000\n"
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-09-23 20:01+0000\n"
"Last-Translator: Abdullah Albaroty <albaroty@gmail.com>\n"
"Language-Team: Arabic <https://translate.lxqt-project.org/projects/labwc/labwc/ar/>\n"
"Language-Team: Arabic <https://translate.lxqt-project.org/projects/labwc/"
"labwc/ar/>\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 4.2.1\n"
#: src/menu/menu.c:704
#: src/menu/menu.c:1017
msgid "Go there..."
msgstr "اذهب هناك..."
#: src/menu/menu.c:1037
msgid "Reconfigure"
msgstr "إعادة تهيئة"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "أخرج"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "صغّر"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "كبّر"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "ملء الشاشة"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "طي/إلغاء طي"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "إخف الإطار"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "دائمًا في القمة"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "أنقل يسارا"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "أنقل يمينا"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr "أظهر في مساحات العمل دائما"
#: src/menu/menu.c:752 src/config/rcxml.c:1384
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr "مساحة عمل"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "غلق"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: zenobit <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-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"
msgstr "Překonfigurovat"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Odejít"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimalizovat"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximalizovat"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Na celou obrazovku"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Rolovat nahoru/dolů"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Dekorace"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Vždy nahoře"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Posunout doleva"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Posunout doprava"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Pracovní Plocha"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
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 ""
"Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n"
"PO-Revision-Date: 2024-03-04 07:14+0000\n"
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-06-23 13:42+0000\n"
"Last-Translator: Standreas <standreas@riseup.net>\n"
"Language-Team: German <https://translate.lxqt-project.org/projects/labwc/labwc/de/>\n"
"Language: de\n"
@ -18,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 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"
msgstr "Rekonfigurieren"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Beenden"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimieren"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximieren"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Vollbild"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Hoch/Runterrollen"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Dekorationen"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Immer im Vordergrund"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "nach links"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "nach rechts"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Arbeitsfläche"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Schließen"

View file

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

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: Roberalz <lumintnian@outlook.com>\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"
"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"
msgstr "Reconfigurar"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Salir"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimizar"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximizar"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Pantalla completa"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Enrollar hacia arriba/abajo"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Decoraciones"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Siempre encima"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Mover a la izquierda"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Mover a la derecha"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Espacio de trabajo"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Cerrar"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n"
"PO-Revision-Date: 2024-01-23 09:23+0000\n"
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-09-23 20:01+0000\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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 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"
msgstr "Seadista uuesti"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Välju"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Vähenda"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Suurenda"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Täisekraanivaade"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Keri üles/alla"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Akende välimus"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Alati kõige peal"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Tõsta vasakule"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Tõsta paremale"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Töölaud"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Sulge"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: Roberalz <lumintnian@outlook.com>\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"
"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"
msgstr "Berriz konfiguratu"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Irten"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimizatu"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximizatu"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Pantaila osoa"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Ibili gora/behera"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Apaingarriak"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Beti gainean"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Mugitu ezkerrera"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Mugitu eskuinera"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Langunea"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Itxi"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@ -16,54 +16,58 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\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"
msgstr ""
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr ""
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr ""
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr ""
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr ""
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr ""
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr ""
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr ""
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr ""
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr ""
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr ""
#: src/menu/menu.c:752 src/config/rcxml.c:1384
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr ""
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr ""

View file

@ -7,11 +7,10 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: Jouni Järvinen <jounijarvis@gmail.com>\n"
"Language-Team: Finnish <https://translate.lxqt-project.org/projects/labwc/"
"labwc/fi/>\n"
"Language-Team: Finnish <https://translate.lxqt-project.org/projects/labwc/labwc/fi/>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -19,54 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 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"
msgstr "Uudelleenmääritä"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Poistu"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Pienennä"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Suurenna"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Koko näyttö"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Rullaa ylös/alas"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Kehykset"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Aina ylimpänä"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Siirrä vasemmalle"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Siirrä oikealle"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Työtila"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Sulje"

View file

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

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: Roberalz <lumintnian@outlook.com>\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"
"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"
msgstr "Reconfigurar"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Saír"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimizar"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximizar"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Pantalla completa"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Rodar cara arriba/abaixo"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Decoracións"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Sempre enriba"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Mover á esquerda"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Mover á dereita"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Espazo de traballo"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Pechar"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: winerysearch <david.fitala@gmail.com>\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"
"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"
msgstr "Rekonfigurál"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Kilépés"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Kis méret"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Teljes méret"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Teljes képernyő"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Felhúz / Legördül"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Dekorációk"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Mindig felül"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Balra dokkol"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Jobbra dokkol"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Munkaasztal"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Bezárás"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: alwanasary <baity.jannati@gmail.com>\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"
"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"
msgstr "Atur Ulang"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Keluar"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Sembunyikan"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Perluas Jendela"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Tampil Menyeluruh"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Gulir atas/bawah"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Dekorasi"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Selalu di Muka"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Geser ke Kiri"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Geser ke Kanan"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Ruang Kerja"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Tutup"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n"
"PO-Revision-Date: 2024-01-23 09:23+0000\n"
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-09-21 20:01+0000\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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 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"
msgstr "Riconfigura"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Esci"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimizza"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Massimizza"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Schermo intero"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Arrotola/srotola"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Decorazioni"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Sempre sopra"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Sposta a sinistra"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Sposta a destra"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Area di lavoro"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Chiudi"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: Hiroaki Yamamoto <hrak1529@gmail.com>\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"
"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"
msgstr "再設定"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "終了"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "最小化"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "最大化"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "フルスクリーン"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "折りたたむ/広げる"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "デコレーション"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "常に最前面に表示"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "左に移動"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "右に移動"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr "現在のワークスペースに常に表示"
#: src/menu/menu.c:752 src/config/rcxml.c:1384
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr "ワークスペース"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "閉じる"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <ka>\n"
@ -18,56 +18,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\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"
msgstr "თავიდან მორგება"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "გასვლა"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "ჩაკეცვა"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "გადიდება"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "მთელ ეკრანზე"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr ""
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "დეკორაციები"
#: src/menu/menu.c:732
#, fuzzy
#| msgid "Always On Top"
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "ყოველთვისყველაზეზემოდან"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "მარცხნივ გაწევა"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "მარჯვნივ გაწევა"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr ""
#: src/menu/menu.c:752 src/config/rcxml.c:1384
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr "სამუშაო ადგილი"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "დახურვა"

View file

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

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,54 +17,58 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\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"
msgstr ""
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr ""
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr ""
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr ""
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr ""
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr ""
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr ""
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr ""
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr ""
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr ""
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr ""
#: src/menu/menu.c:752 src/config/rcxml.c:1384
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr ""
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: Moo <hazap@hotmail.com>\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"
"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"
msgstr "Konfigūruoti iš naujo"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Išeiti"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Suskleisti"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Išskleisti"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Visas ekranas"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Užraityti/atraityti"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Dekoracijos"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Visada viršuje"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Perkelti kairėn"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Perkelti dešinėn"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Darbo sritis"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Užverti"

View file

@ -1,11 +1,18 @@
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') + '"',
language:'c')
i18n.gettext(meson.project_name(),
args: ['--directory=' + source_root,
language:'c',
)
i18n.gettext(
meson.project_name(),
args: [
'--directory=' + source_root,
'--add-comments=TRANSLATORS',
'--keyword=_',
'--msgid-bugs=https://github.com/labwc/labwc/issues'],
preset: 'glib'
'--msgid-bugs=https://github.com/labwc/labwc/issues',
],
preset: 'glib',
)

View file

@ -7,10 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n"
"PO-Revision-Date: 2024-01-23 09:23+0000\n"
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-09-21 20:01+0000\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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 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"
msgstr "Opnieuw instellen"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Afsluiten"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimaliseren"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximaliseren"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Schermvullende weergave"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Op-/Afrollen"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Decoraties"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Altijd bovenaan"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Naar links verplaatsen"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Naar rechts verplaatsen"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Werkblad"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Sluiten"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: A S Alam <amanpreet.alam@gmail.com>\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"
"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"
msgstr "ਮੁੜ-ਸੰਰਚਨਾ ਕਰੋ"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "ਬਾਹਰ"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "ਘੱਟੋ-ਘੱਟ"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "ਵੱਧ ਤੋਂ ਵੱਧ"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "ਪੂਰੀ ਸਕਰੀਨ"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "ਉੱਤੇ/ਹੇਠਾਂ ਸਕਰਾਓ"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "ਸਜਾਵਟ"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "ਹਮੇਸ਼ਾਂ ਉੱਤੇ ਰੱਖੋ"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "ਖੱਬੇ ਭੇਜੋ"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "ਸੱਜੇ ਭੇਜੋ"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr "ਹਮੇਸ਼ਾਂ ਦਿੱਖ ਵਰਕਸਪੇਸ ਉੱਤੇ"
#: src/menu/menu.c:752 src/config/rcxml.c:1384
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr "ਵਰਕਸਪੇਸ"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "ਬੰਦ ਕਰੋ"

View file

@ -7,65 +7,71 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n"
"PO-Revision-Date: 2024-01-23 09:23+0000\n"
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-09-21 20:01+0000\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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%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"
#: src/menu/menu.c:704
#: src/menu/menu.c:1017
msgid "Go there..."
msgstr "Przejdź tam..."
#: src/menu/menu.c:1037
msgid "Reconfigure"
msgstr "Rekonfiguruj"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Wyjdź"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimalizuj"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maksymalizuj"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Pełny ekran"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Zwiń w górę/w dół"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Dekoracje"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Zawsze na wierzchu"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Przenieś w lewo"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Przenieś w prawo"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Przestrzeń robocza"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Zamknij"

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n"
"PO-Revision-Date: 2024-03-27 22:23+0000\n"
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-09-21 20:01+0000\n"
"Last-Translator: Hugo Carvalho <hugokarvalho@hotmail.com>\n"
"Language-Team: Portuguese <https://translate.lxqt-project.org/projects/labwc/"
"labwc/pt/>\n"
@ -19,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 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"
msgstr "Reconfigurar"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Sair"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimizar"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximizar"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Ecrã inteiro"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Rolar para cima/baixo"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Decorações"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Sempre no topo"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Mover para a esquerda"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Mover para a direita"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Área de trabalho"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
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 ""
"Project-Id-Version: labwc\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"
"Last-Translator: Alice Ventus <zolkin.ag@phystech.edu>\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"
"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"
msgstr "Перенастроить"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Выход"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Свернуть"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Развернуть"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "На весь экран"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Свернуть/развернуть в заголовок"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Декорации"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Всегда на переднем плане"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Переместить влево"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Переместить вправо"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr "На всех рабочих пространствах"
#: src/menu/menu.c:752 src/config/rcxml.c:1384
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr "Рабочее пространство"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Закрыть"

View file

@ -7,10 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\n"
"Report-Msgid-Bugs-To: https://github.com/labwc/labwc/issues\n"
"POT-Creation-Date: 2024-03-17 11:06+1000\n"
"PO-Revision-Date: 2024-01-24 11:23+0000\n"
"POT-Creation-Date: 2024-09-19 21:09+1000\n"
"PO-Revision-Date: 2024-10-12 07:24+0000\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"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -18,54 +19,58 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 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"
msgstr "Konfigurera om"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "Avsluta"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "Minimera"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "Maximera"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "Fullskärm"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "Rulla upp/ned"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "Dekorationer"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "Alltid överst"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "Flytta till vänster"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "Flytta till höger"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
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"
msgstr "Arbetsyta"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
msgstr "Stäng"

View file

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

View file

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

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: labwc\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"
"Last-Translator: kmephistoh <kanhaosmile@gmail.com>\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"
"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"
msgstr "配置重载"
#: src/menu/menu.c:706
#: src/menu/menu.c:1039
msgid "Exit"
msgstr "退出"
#: src/menu/menu.c:722
#: src/menu/menu.c:1055
msgid "Minimize"
msgstr "最小化"
#: src/menu/menu.c:724
#: src/menu/menu.c:1057
msgid "Maximize"
msgstr "最大化"
#: src/menu/menu.c:726
#: src/menu/menu.c:1059
msgid "Fullscreen"
msgstr "全屏"
#: src/menu/menu.c:728
msgid "Roll up/down"
#: src/menu/menu.c:1061
msgid "Roll Up/Down"
msgstr "滚动 上/下"
#: src/menu/menu.c:730
#: src/menu/menu.c:1063
msgid "Decorations"
msgstr "装饰"
#: src/menu/menu.c:732
#: src/menu/menu.c:1065
msgid "Always on Top"
msgstr "最上层显示"
#: src/menu/menu.c:737
msgid "Move left"
#: src/menu/menu.c:1070
msgid "Move Left"
msgstr "左移"
#: src/menu/menu.c:744
msgid "Move right"
#: src/menu/menu.c:1077
msgid "Move Right"
msgstr "右移"
#: src/menu/menu.c:749
#: src/menu/menu.c:1082
msgid "Always on Visible Workspace"
msgstr "始终在可见工作区"
#: src/menu/menu.c:752 src/config/rcxml.c:1384
#: src/menu/menu.c:1085 src/config/rcxml.c:1629
msgid "Workspace"
msgstr "工作区"
#: src/menu/menu.c:755
#: src/menu/menu.c:1088
msgid "Close"
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 = [
wl_protocol_dir / 'stable/xdg-shell/xdg-shell.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/drm-lease/drm-lease-v1.xml',
wl_protocol_dir / 'staging/xwayland-shell/xwayland-shell-v1.xml',
wl_protocol_dir / 'staging/tearing-control/tearing-control-v1.xml',
'cosmic-workspace-unstable-v1.xml',
'wlr-layer-shell-unstable-v1.xml',
'wlr-input-inhibitor-unstable-v1.xml',
'wlr-output-power-management-unstable-v1.xml',

View file

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

View file

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

View file

@ -19,7 +19,6 @@
#include "menu/menu.h"
#include "osd.h"
#include "output-virtual.h"
#include "placement.h"
#include "regions.h"
#include "ssd.h"
#include "view.h"
@ -70,6 +69,7 @@ enum action_type {
ACTION_TYPE_EXECUTE,
ACTION_TYPE_EXIT,
ACTION_TYPE_MOVE_TO_EDGE,
ACTION_TYPE_TOGGLE_SNAP_TO_EDGE,
ACTION_TYPE_SNAP_TO_EDGE,
ACTION_TYPE_GROW_TO_EDGE,
ACTION_TYPE_SHRINK_TO_EDGE,
@ -100,7 +100,9 @@ enum action_type {
ACTION_TYPE_MOVE_RELATIVE,
ACTION_TYPE_SEND_TO_DESKTOP,
ACTION_TYPE_GO_TO_DESKTOP,
ACTION_TYPE_TOGGLE_SNAP_TO_REGION,
ACTION_TYPE_SNAP_TO_REGION,
ACTION_TYPE_UNSNAP,
ACTION_TYPE_TOGGLE_KEYBINDS,
ACTION_TYPE_FOCUS_OUTPUT,
ACTION_TYPE_MOVE_TO_OUTPUT,
@ -114,6 +116,9 @@ enum action_type {
ACTION_TYPE_SHADE,
ACTION_TYPE_UNSHADE,
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_ZOOM_IN,
ACTION_TYPE_ZOOM_OUT
@ -128,6 +133,7 @@ const char *action_names[] = {
"Execute",
"Exit",
"MoveToEdge",
"ToggleSnapToEdge",
"SnapToEdge",
"GrowToEdge",
"ShrinkToEdge",
@ -158,7 +164,9 @@ const char *action_names[] = {
"MoveRelative",
"SendToDesktop",
"GoToDesktop",
"ToggleSnapToRegion",
"SnapToRegion",
"UnSnap",
"ToggleKeybinds",
"FocusOutput",
"MoveToOutput",
@ -172,6 +180,9 @@ const char *action_names[] = {
"Shade",
"Unshade",
"ToggleShade",
"EnableTabletMouseEmulation",
"DisableTabletMouseEmulation",
"ToggleTabletMouseEmulation",
"ToggleMagnify",
"ZoomIn",
"ZoomOut",
@ -314,12 +325,15 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
goto cleanup;
}
/* Falls through */
case ACTION_TYPE_TOGGLE_SNAP_TO_EDGE:
case ACTION_TYPE_SNAP_TO_EDGE:
case ACTION_TYPE_GROW_TO_EDGE:
case ACTION_TYPE_SHRINK_TO_EDGE:
if (!strcmp(argument, "direction")) {
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) {
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
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));
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;
case ACTION_TYPE_TOGGLE_MAXIMIZE:
case ACTION_TYPE_MAXIMIZE:
@ -400,6 +422,7 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
goto cleanup;
}
break;
case ACTION_TYPE_TOGGLE_SNAP_TO_REGION:
case ACTION_TYPE_SNAP_TO_REGION:
if (!strcmp(argument, "region")) {
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;
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:
if (!strcmp(argument, "output")) {
action_arg_add_str(action, argument, content);
@ -530,6 +548,7 @@ action_is_valid(struct action *action)
arg_name = "command";
break;
case ACTION_TYPE_MOVE_TO_EDGE:
case ACTION_TYPE_TOGGLE_SNAP_TO_EDGE:
case ACTION_TYPE_SNAP_TO_EDGE:
case ACTION_TYPE_GROW_TO_EDGE:
case ACTION_TYPE_SHRINK_TO_EDGE:
@ -543,12 +562,10 @@ action_is_valid(struct action *action)
case ACTION_TYPE_SEND_TO_DESKTOP:
arg_name = "to";
break;
case ACTION_TYPE_TOGGLE_SNAP_TO_REGION:
case ACTION_TYPE_SNAP_TO_REGION:
arg_name = "region";
break;
case ACTION_TYPE_FOCUS_OUTPUT:
arg_name = "output";
break;
case ACTION_TYPE_IF:
case ACTION_TYPE_FOR_EACH:
; /* 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
show_menu(struct server *server, struct view *view,
const char *menu_name, bool at_cursor)
show_menu(struct server *server, struct view *view, struct cursor_context *ctx,
const char *menu_name, bool at_cursor,
const char *pos_x, const char *pos_y)
{
if (server->input_mode != LAB_INPUT_STATE_PASSTHROUGH
&& server->input_mode != LAB_INPUT_STATE_MENU) {
@ -627,18 +645,88 @@ show_menu(struct server *server, struct view *view,
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 y = server->seat.cursor->y;
/* 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;
}
/* Place menu in the view corner if desired (and menu is not root-menu) */
if (!at_cursor && view) {
x = view->current.x;
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() */
@ -648,7 +736,7 @@ show_menu(struct server *server, struct view *view,
static struct view *
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 */
if (activator) {
@ -660,13 +748,8 @@ view_for_action(struct view *activator, struct server *server,
case ACTION_TYPE_FOCUS:
case ACTION_TYPE_MOVE:
case ACTION_TYPE_RESIZE: {
struct cursor_context ctx = get_cursor_context(server);
if (action->type == ACTION_TYPE_RESIZE) {
/* Select resize edges for the keybind case */
*resize_edges = cursor_get_resize_edges(
server->seat.cursor, &ctx);
}
return ctx.view;
*ctx = get_cursor_context(server);
return ctx->view;
}
default:
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);
if (actions) {
actions_run(view, server, actions, 0);
actions_run(view, server, actions, NULL);
}
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
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) {
wlr_log(WLR_ERROR, "empty actions");
@ -713,6 +839,13 @@ actions_run(struct view *activator, struct server *server,
struct view *view;
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) {
wlr_log(WLR_DEBUG, "Handling action %u: %s", 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
* previous action
*/
view = view_for_action(activator, server, action,
&resize_edges);
view = view_for_action(activator, server, action, &ctx);
switch (action->type) {
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);
}
break;
case ACTION_TYPE_TOGGLE_SNAP_TO_EDGE:
case ACTION_TYPE_SNAP_TO_EDGE:
if (view) {
/* Config parsing makes sure that direction is a valid direction */
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,
/*across_outputs*/ true,
/*store_natural_geometry*/ true);
@ -789,22 +931,20 @@ actions_run(struct view *activator, struct server *server,
}
break;
case ACTION_TYPE_NEXT_WINDOW:
server->osd_state.cycle_view = desktop_cycle_view(server,
server->osd_state.cycle_view, LAB_CYCLE_DIR_FORWARD);
osd_update(server);
start_window_cycling(server, LAB_CYCLE_DIR_FORWARD);
break;
case ACTION_TYPE_PREVIOUS_WINDOW:
server->osd_state.cycle_view = desktop_cycle_view(server,
server->osd_state.cycle_view, LAB_CYCLE_DIR_BACKWARD);
osd_update(server);
start_window_cycling(server, LAB_CYCLE_DIR_BACKWARD);
break;
case ACTION_TYPE_RECONFIGURE:
kill(getpid(), SIGHUP);
break;
case ACTION_TYPE_SHOW_MENU:
show_menu(server, view,
show_menu(server, view, &ctx,
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;
case ACTION_TYPE_TOGGLE_MAXIMIZE:
if (view) {
@ -893,6 +1033,8 @@ actions_run(struct view *activator, struct server *server,
break;
case ACTION_TYPE_RESIZE:
if (view) {
uint32_t resize_edges = cursor_get_resize_edges(
server->seat.cursor, &ctx);
interactive_begin(view, LAB_INPUT_STATE_RESIZE,
resize_edges);
}
@ -964,7 +1106,7 @@ actions_run(struct view *activator, struct server *server,
* a required argument for both SendToDesktop and GoToDesktop.
*/
struct workspace *target = workspaces_find(
server->workspace_current, to, wrap);
server->workspaces.current, to, wrap);
if (!target) {
break;
}
@ -987,25 +1129,10 @@ actions_run(struct view *activator, struct server *server,
if (!view) {
break;
}
const char *output_name = action_get_str(action, "output", NULL);
struct output *target = NULL;
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);
target = get_target_output(view->output, server, action);
if (target) {
view_move_to_output(view, target);
}
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);
break;
case ACTION_TYPE_FIT_TO_OUTPUT:
if (!view) {
@ -1013,32 +1140,51 @@ actions_run(struct view *activator, struct server *server,
}
view_constrain_size_to_that_of_usable_area(view);
break;
case ACTION_TYPE_TOGGLE_SNAP_TO_REGION:
case ACTION_TYPE_SNAP_TO_REGION:
if (!view) {
break;
}
struct output *output = view->output;
output = view->output;
if (!output) {
break;
}
const char *region_name = action_get_str(action, "region", NULL);
struct region *region = regions_from_name(region_name, output);
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,
/*store_natural_geometry*/ true);
} else {
wlr_log(WLR_ERROR, "Invalid SnapToRegion id: '%s'", region_name);
}
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:
if (view) {
view_toggle_keybinds(view);
}
break;
case ACTION_TYPE_FOCUS_OUTPUT:
{
const char *output_name = action_get_str(action, "output", NULL);
desktop_focus_output(output_from_name(server, output_name));
output = output_nearest_to_cursor(server);
target = get_target_output(output, server, action);
if (target) {
desktop_focus_output(target);
}
break;
case ACTION_TYPE_IF:
@ -1061,7 +1207,7 @@ actions_run(struct view *activator, struct server *server,
struct wl_list *actions;
actions = action_get_actionlist(action, "none");
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;
case ACTION_TYPE_TOGGLE_TEARING:
if (view) {
view->tearing_hint = !view->tearing_hint;
wlr_log(WLR_DEBUG, "tearing %sabled",
view->tearing_hint ? "en" : "dis");
switch (view->force_tearing) {
case LAB_STATE_UNSPECIFIED:
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;
case ACTION_TYPE_TOGGLE_SHADE:
@ -1111,6 +1270,15 @@ actions_run(struct view *activator, struct server *server,
view_set_shade(view, false);
}
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:
magnify_toggle(server);
break;

View file

@ -29,6 +29,7 @@
#include <drm_fourcc.h>
#include <wlr/interfaces/wlr_buffer.h>
#include "buffer.h"
#include "common/box.h"
#include "common/mem.h"
static const struct wlr_buffer_impl data_buffer_impl;
@ -44,14 +45,12 @@ static void
data_buffer_destroy(struct wlr_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) {
cairo_surface_t *surf = cairo_get_target(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) {
free(buffer->data);
buffer->data = NULL;
@ -85,19 +84,35 @@ static const struct wlr_buffer_impl data_buffer_impl = {
};
struct lab_data_buffer *
buffer_create_cairo(uint32_t width, uint32_t height, float scale,
bool free_on_destroy)
buffer_adopt_cairo_surface(cairo_surface_t *surface)
{
struct lab_data_buffer *buffer = znew(*buffer);
buffer->unscaled_width = width;
buffer->unscaled_height = height;
width *= scale;
height *= scale;
assert(cairo_surface_get_type(surface) == CAIRO_SURFACE_TYPE_IMAGE);
assert(cairo_image_surface_get_format(surface) == CAIRO_FORMAT_ARGB32);
/* 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);
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
@ -106,34 +121,82 @@ buffer_create_cairo(uint32_t width, uint32_t height, float scale,
*
* 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);
buffer->format = DRM_FORMAT_ARGB8888;
buffer->stride = cairo_image_surface_get_stride(surf);
buffer->free_on_destroy = free_on_destroy;
/*
* Adopt the image surface into a buffer, set the correct
* logical size, and create a cairo context for drawing
*/
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;
}
struct lab_data_buffer *
buffer_create_wrap(void *pixel_data, uint32_t width, uint32_t height,
uint32_t stride, bool free_on_destroy)
buffer_convert_cairo_surface_for_icon(cairo_surface_t *surface,
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);
wlr_buffer_init(&buffer->base, &data_buffer_impl, width, height);
buffer->unscaled_width = width;
buffer->unscaled_height = height;
buffer->logical_width = width;
buffer->logical_height = height;
buffer->data = pixel_data;
buffer->format = DRM_FORMAT_ARGB8888;
buffer->stride = stride;
buffer->free_on_destroy = free_on_destroy;
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