mirror of
https://codeberg.org/dwl/dwl.git
synced 2025-11-02 09:01:42 -05:00
Compare commits
No commits in common. "main" and "v0.4" have entirely different histories.
17 changed files with 1007 additions and 2085 deletions
|
|
@ -1,62 +0,0 @@
|
||||||
name: Bug Report
|
|
||||||
about: Something in dwl isn't working correctly
|
|
||||||
title:
|
|
||||||
labels:
|
|
||||||
- 'Kind/Bug'
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
- Only report bugs that can be reproduced on the main (or wlroots-next) branch without patches.
|
|
||||||
- Proprietary graphics drivers, including nvidia, are not supported. Please use the open source equivalents, such as nouveau, if you would like to use dwl.
|
|
||||||
- Report patch issues to their respective authors.
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
id: dwl_version
|
|
||||||
attributes:
|
|
||||||
label: 'dwl version:'
|
|
||||||
placeholder: '`dwl -v`'
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
id: wlroots_version
|
|
||||||
attributes:
|
|
||||||
label: 'wlroots version:'
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
id: distro
|
|
||||||
attributes:
|
|
||||||
label: What distro (and version) are you using?
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Description
|
|
||||||
value: |
|
|
||||||
The steps you took to reproduce the problem.
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: debug_log
|
|
||||||
attributes:
|
|
||||||
label: Debug Log
|
|
||||||
value: |
|
|
||||||
Run `dwl -d 2> ~/dwl.log` from a TTY and attach the **full** (do not truncate it) file here, or upload it to a pastebin.
|
|
||||||
Please try to keep the reproduction as brief as possible and exit dwl.
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: backtrace
|
|
||||||
attributes:
|
|
||||||
label: Stack Trace
|
|
||||||
value: |
|
|
||||||
- Only required if dwl crashes.
|
|
||||||
- If the lines mentioning dwl or wlroots have `??`. Please compile both dwl and wlroots from source (enabling debug symbols) and try to reproduce.
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
name: Enhancement idea
|
|
||||||
about: Suggest a feature or improvement
|
|
||||||
title:
|
|
||||||
labels:
|
|
||||||
- 'Kind/Feature'
|
|
||||||
body:
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Description
|
|
||||||
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Something in dwl isn't working correctly
|
||||||
|
title: ''
|
||||||
|
labels: 'A: bug'
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Info
|
||||||
|
dwl version:
|
||||||
|
wlroots version:
|
||||||
|
## Description
|
||||||
|
<!--
|
||||||
|
Only report bugs that can be reproduced on the main line
|
||||||
|
Report patch issues to their respective authors
|
||||||
|
If the patch author doesn't respond within a reasonable time, email me:
|
||||||
|
|
||||||
|
Leonardo Hernández Hernández <leohdz172@protonmail.com>
|
||||||
|
|
||||||
|
but note that I'm NOT making any promises
|
||||||
|
-->
|
||||||
10
.github/ISSUE_TEMPLATE/enhancement-idea.md
vendored
Normal file
10
.github/ISSUE_TEMPLATE/enhancement-idea.md
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
name: Enhancement idea
|
||||||
|
about: Suggest a feature or improvement
|
||||||
|
title: ''
|
||||||
|
labels: 'A: enhancement'
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
3
.mailmap
3
.mailmap
|
|
@ -1,3 +0,0 @@
|
||||||
Lennart Jablonka <humm@ljabl.com> <hummsmith42@gmail.com>
|
|
||||||
Leonardo Hernández Hernández <leohdz172@proton.me> <leohdz172@outlook.com>
|
|
||||||
Leonardo Hernández Hernández <leohdz172@proton.me> <leohdz172@protonmail.com>
|
|
||||||
217
CHANGELOG.md
217
CHANGELOG.md
|
|
@ -1,217 +0,0 @@
|
||||||
# Changelog
|
|
||||||
|
|
||||||
* [Unreleased](#unreleased)
|
|
||||||
* [0.7](#0.7)
|
|
||||||
* [0.6](#0.6)
|
|
||||||
* [0.5](#0.5)
|
|
||||||
|
|
||||||
|
|
||||||
## Unreleased
|
|
||||||
### Added
|
|
||||||
|
|
||||||
* Support for the linux-drm-syncobj-v1 protocol ([wlroots!4715][wlroots!4715], [#685][685])
|
|
||||||
* Allow the use of non-system wlroots library ([#646][646])
|
|
||||||
|
|
||||||
[wlroots!4715]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4715
|
|
||||||
[685]: https://codeberg.org/dwl/dwl/pulls/685
|
|
||||||
[646]: https://codeberg.org/dwl/dwl/pulls/646
|
|
||||||
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
### Deprecated
|
|
||||||
### Removed
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
* Crash when a client is created while all outputs are disabled.
|
|
||||||
|
|
||||||
### Security
|
|
||||||
### Contributors
|
|
||||||
|
|
||||||
|
|
||||||
## 0.7
|
|
||||||
|
|
||||||
This version is just 0.6 with wlroots 0.18 compatibility.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
* Add support for the alpha-modifier-v1 protocol ([wlroots!4616][wlroots!4616]).
|
|
||||||
* dwl now will survive GPU resets ([#601][601]).
|
|
||||||
|
|
||||||
[wlroots!4616]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4616
|
|
||||||
[601]: https://codeberg.org/dwl/dwl/issues/601
|
|
||||||
|
|
||||||
|
|
||||||
### Contributors
|
|
||||||
|
|
||||||
Guido Cella
|
|
||||||
|
|
||||||
|
|
||||||
## 0.6
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
* Add `rootcolor` to change the default background color ([#544][544]).
|
|
||||||
* Implement the wlr-virtual-pointer-unstable-v1 protocol ([#574][574]).
|
|
||||||
* Implement the pointer-constraints and relative-pointer protocols ([#317][317])
|
|
||||||
* Implement the wlr-output-power-management protocol ([#599][599])
|
|
||||||
|
|
||||||
[544]: https://codeberg.org/dwl/dwl/pulls/544
|
|
||||||
[574]: https://codeberg.org/dwl/dwl/pulls/574
|
|
||||||
[317]: https://codeberg.org/dwl/dwl/issues/317
|
|
||||||
[599]: https://codeberg.org/dwl/dwl/issues/559
|
|
||||||
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
* Keyboards are now managed through keyboard groups ([#549][549]).
|
|
||||||
* Only the first matched keybinding is executed.
|
|
||||||
* Allow toggling the layout before selecting a different one ([#570][570]).
|
|
||||||
* Fullscreen clients are now rendered above wlr_layer_surfaces in the top layer
|
|
||||||
([#609][609]).
|
|
||||||
* The default menu was changed from `bemenu-run` to `wmenu-run` ([#553][553]).
|
|
||||||
* The option `sloppyfocus` now replicates the dwm behavior ([#599][599]).
|
|
||||||
* Allow configure position of monitors with negative values. (-1, -1) is
|
|
||||||
used to auto-configure them ([#635][635]).
|
|
||||||
* dwl now kills the entire process group of `startup_cmd`
|
|
||||||
* The O_NONBLOCK flag is set for stdout.
|
|
||||||
|
|
||||||
[549]: https://codeberg.org/dwl/dwl/pulls/549
|
|
||||||
[570]: https://codeberg.org/dwl/dwl/pulls/570
|
|
||||||
[609]: https://codeberg.org/dwl/dwl/pulls/609
|
|
||||||
[553]: https://codeberg.org/dwl/dwl/issues/553
|
|
||||||
[599]: https://codeberg.org/dwl/dwl/pulls/599
|
|
||||||
[635]: https://codeberg.org/dwl/dwl/pulls/635
|
|
||||||
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
* The SLOC limit is now removed ([#497][497]).
|
|
||||||
|
|
||||||
[497]: https://codeberg.org/dwl/dwl/pulls/497
|
|
||||||
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
* Clients not having the correct border color when mapping.
|
|
||||||
* Compliance with the xdg-decoration-unstable-v1 ([#546][546]).
|
|
||||||
* dwl no longer sends negative values in xdg_toplevel.configure events.
|
|
||||||
* Crashes with disabled monitors ([#472][472]).
|
|
||||||
|
|
||||||
[546]: https://codeberg.org/dwl/dwl/pulls/546
|
|
||||||
[472]: https://codeberg.org/dwl/dwl/issues/472
|
|
||||||
|
|
||||||
|
|
||||||
### Contributors
|
|
||||||
|
|
||||||
Ben Jargowsky
|
|
||||||
Benjamin Chausse
|
|
||||||
David Donahue
|
|
||||||
Devin J. Pohly
|
|
||||||
Dima Krasner
|
|
||||||
Emil Miler
|
|
||||||
Forrest Bushstone
|
|
||||||
Guido Cella
|
|
||||||
Peter Hofmann
|
|
||||||
Rutherther
|
|
||||||
Squibid
|
|
||||||
choc
|
|
||||||
fictitiousexistence
|
|
||||||
korei999
|
|
||||||
sewn
|
|
||||||
thanatos
|
|
||||||
|
|
||||||
|
|
||||||
## 0.5
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
* Allow configure x and y position of outputs ([#301][301])
|
|
||||||
* Implement repeatable keybindings ([#368][368])
|
|
||||||
* Print app id in printstatus() output ([#381][381])
|
|
||||||
* Display client count in monocle symbol ([#387][387])
|
|
||||||
* Export XCURSOR_SIZE to fix apps using an older version of Qt ([#425][425])
|
|
||||||
* Support for wp-fractional-scale-v1 (through wlr_scene: [wlroots!3511][wlroots!3511])
|
|
||||||
* dwl now sends `wl_surface.preferred_buffer_scale` (through wlr_scene: [wlroots!4269][wlroots!4269])
|
|
||||||
* Add support for xdg-shell v6 ([#465][465])
|
|
||||||
* Add support for wp-cursor-shape-v1 ([#444][444])
|
|
||||||
* Add desktop file ([#484][484])
|
|
||||||
* Add macro to easily configure colors ([#466][466])
|
|
||||||
* Color of urgent clients are now red ([#494][494])
|
|
||||||
* New flag `-d` and option `log_level` to change the wlroots debug level
|
|
||||||
* Add CHANGELOG.md ([#501][501])
|
|
||||||
|
|
||||||
[301]: https://github.com/djpohly/dwl/pull/301
|
|
||||||
[368]: https://github.com/djpohly/dwl/pull/368
|
|
||||||
[381]: https://github.com/djpohly/dwl/pull/381
|
|
||||||
[387]: https://github.com/djpohly/dwl/issues/387
|
|
||||||
[425]: https://github.com/djpohly/dwl/pull/425
|
|
||||||
[wlroots!4269]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4269
|
|
||||||
[wlroots!3511]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3511
|
|
||||||
[465]: https://github.com/djpohly/dwl/pull/465
|
|
||||||
[444]: https://github.com/djpohly/dwl/pull/444
|
|
||||||
[484]: https://github.com/djpohly/dwl/pull/484
|
|
||||||
[466]: https://github.com/djpohly/dwl/issues/466
|
|
||||||
[494]: https://github.com/djpohly/dwl/pull/494
|
|
||||||
[501]: https://github.com/djpohly/dwl/pull/501
|
|
||||||
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
* Replace `tags` with `TAGCOUNT` in config.def.h ([#403][403])
|
|
||||||
* Pop ups are now destroyed when focusing another client ([#408][408])
|
|
||||||
* dwl does not longer respect size hints, instead clip windows if they are
|
|
||||||
larger than they should be ([#455][455])
|
|
||||||
* The version of wlr-layer-shell-unstable-v1 was lowered to 3 (from 4)
|
|
||||||
* Use the same border color as dwm ([#494][494])
|
|
||||||
|
|
||||||
[403]: https://github.com/djpohly/dwl/pull/403
|
|
||||||
[408]: https://github.com/djpohly/dwl/pull/409
|
|
||||||
[455]: https://github.com/djpohly/dwl/pull/455
|
|
||||||
[494]: https://github.com/djpohly/dwl/pull/494
|
|
||||||
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
* Remove unused `rootcolor` option ([#401][401])
|
|
||||||
* Remove support for wlr-input-inhibitor-unstable-v1 ([#430][430])
|
|
||||||
* Remove support for KDE idle protocol ([#431][431])
|
|
||||||
|
|
||||||
[401]: https://github.com/djpohly/dwl/pull/401
|
|
||||||
[430]: https://github.com/djpohly/dwl/pull/430
|
|
||||||
[431]: https://github.com/djpohly/dwl/pull/431
|
|
||||||
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
* Fix crash when creating a layer surface with all outputs disabled
|
|
||||||
([#421][421])
|
|
||||||
* Fix other clients being shown as focused if the focused client have pop ups
|
|
||||||
open ([#408][408])
|
|
||||||
* Resize fullscreen clients when updating monitor mode
|
|
||||||
* dwl no longer crash at exit like sometimes did
|
|
||||||
* Fullscreen background appearing above clients ([#487][487])
|
|
||||||
* Fix a segfault when user provides invalid xkb_rules ([#518][518])
|
|
||||||
|
|
||||||
[421]: https://github.com/djpohly/dwl/pull/421
|
|
||||||
[408]: https://github.com/djpohly/dwl/issues/408
|
|
||||||
[487]: https://github.com/djpohly/dwl/issues/487
|
|
||||||
[518]: https://github.com/djpohly/dwl/pull/518
|
|
||||||
|
|
||||||
|
|
||||||
### Contributors
|
|
||||||
|
|
||||||
* A Frederick Christensen
|
|
||||||
* Angelo Antony
|
|
||||||
* Ben Collerson
|
|
||||||
* Devin J. Pohly
|
|
||||||
* Forrest Bushstone
|
|
||||||
* gan-of-culture
|
|
||||||
* godalming123
|
|
||||||
* Job79
|
|
||||||
* link2xt
|
|
||||||
* Micah Gorrell
|
|
||||||
* Nikita Ivanov
|
|
||||||
* Palanix
|
|
||||||
* pino-desktop
|
|
||||||
* Weiseguy
|
|
||||||
* Yves Zoundi
|
|
||||||
49
Makefile
49
Makefile
|
|
@ -4,24 +4,19 @@
|
||||||
include config.mk
|
include config.mk
|
||||||
|
|
||||||
# flags for compiling
|
# flags for compiling
|
||||||
DWLCPPFLAGS = -I. -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L \
|
DWLCPPFLAGS = -I. -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XWAYLAND)
|
||||||
-DVERSION=\"$(VERSION)\" $(XWAYLAND)
|
DWLDEVCFLAGS = -pedantic -Wall -Wextra -Wdeclaration-after-statement -Wno-unused-parameter -Wno-sign-compare -Wshadow -Wunused-macros\
|
||||||
DWLDEVCFLAGS = -g -Wpedantic -Wall -Wextra -Wdeclaration-after-statement \
|
-Werror=strict-prototypes -Werror=implicit -Werror=return-type -Werror=incompatible-pointer-types
|
||||||
-Wno-unused-parameter -Wshadow -Wunused-macros -Werror=strict-prototypes \
|
|
||||||
-Werror=implicit -Werror=return-type -Werror=incompatible-pointer-types \
|
|
||||||
-Wfloat-conversion
|
|
||||||
|
|
||||||
# CFLAGS / LDFLAGS
|
# CFLAGS / LDFLAGS
|
||||||
PKGS = wayland-server xkbcommon libinput $(XLIBS)
|
PKGS = wlroots wayland-server xkbcommon libinput $(XLIBS)
|
||||||
DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(WLR_INCS) $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS)
|
DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS)
|
||||||
LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(WLR_LIBS) -lm $(LIBS)
|
LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(LIBS)
|
||||||
|
|
||||||
all: dwl
|
all: dwl
|
||||||
dwl: dwl.o util.o
|
dwl: dwl.o util.o
|
||||||
$(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@
|
$(CC) dwl.o util.o $(LDLIBS) $(LDFLAGS) $(DWLCFLAGS) -o $@
|
||||||
dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \
|
dwl.o: dwl.c config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h
|
||||||
pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \
|
|
||||||
wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h
|
|
||||||
util.o: util.c util.h
|
util.o: util.c util.h
|
||||||
|
|
||||||
# wayland-scanner is a tool which generates C headers and rigging for Wayland
|
# wayland-scanner is a tool which generates C headers and rigging for Wayland
|
||||||
|
|
@ -30,21 +25,12 @@ util.o: util.c util.h
|
||||||
WAYLAND_SCANNER = `$(PKG_CONFIG) --variable=wayland_scanner wayland-scanner`
|
WAYLAND_SCANNER = `$(PKG_CONFIG) --variable=wayland_scanner wayland-scanner`
|
||||||
WAYLAND_PROTOCOLS = `$(PKG_CONFIG) --variable=pkgdatadir wayland-protocols`
|
WAYLAND_PROTOCOLS = `$(PKG_CONFIG) --variable=pkgdatadir wayland-protocols`
|
||||||
|
|
||||||
cursor-shape-v1-protocol.h:
|
|
||||||
$(WAYLAND_SCANNER) enum-header \
|
|
||||||
$(WAYLAND_PROTOCOLS)/staging/cursor-shape/cursor-shape-v1.xml $@
|
|
||||||
pointer-constraints-unstable-v1-protocol.h:
|
|
||||||
$(WAYLAND_SCANNER) enum-header \
|
|
||||||
$(WAYLAND_PROTOCOLS)/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml $@
|
|
||||||
wlr-layer-shell-unstable-v1-protocol.h:
|
|
||||||
$(WAYLAND_SCANNER) enum-header \
|
|
||||||
protocols/wlr-layer-shell-unstable-v1.xml $@
|
|
||||||
wlr-output-power-management-unstable-v1-protocol.h:
|
|
||||||
$(WAYLAND_SCANNER) server-header \
|
|
||||||
protocols/wlr-output-power-management-unstable-v1.xml $@
|
|
||||||
xdg-shell-protocol.h:
|
xdg-shell-protocol.h:
|
||||||
$(WAYLAND_SCANNER) server-header \
|
$(WAYLAND_SCANNER) server-header \
|
||||||
$(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@
|
$(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@
|
||||||
|
wlr-layer-shell-unstable-v1-protocol.h:
|
||||||
|
$(WAYLAND_SCANNER) server-header \
|
||||||
|
protocols/wlr-layer-shell-unstable-v1.xml $@
|
||||||
|
|
||||||
config.h:
|
config.h:
|
||||||
cp config.def.h $@
|
cp config.def.h $@
|
||||||
|
|
@ -53,27 +39,22 @@ clean:
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
mkdir -p dwl-$(VERSION)
|
mkdir -p dwl-$(VERSION)
|
||||||
cp -R LICENSE* Makefile CHANGELOG.md README.md client.h config.def.h \
|
cp -R LICENSE* Makefile README.md client.h config.def.h\
|
||||||
config.mk protocols dwl.1 dwl.c util.c util.h dwl.desktop \
|
config.mk protocols dwl.1 dwl.c util.c util.h\
|
||||||
dwl-$(VERSION)
|
dwl-$(VERSION)
|
||||||
tar -caf dwl-$(VERSION).tar.gz dwl-$(VERSION)
|
tar -caf dwl-$(VERSION).tar.gz dwl-$(VERSION)
|
||||||
rm -rf dwl-$(VERSION)
|
rm -rf dwl-$(VERSION)
|
||||||
|
|
||||||
install: dwl
|
install: dwl
|
||||||
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
||||||
rm -f $(DESTDIR)$(PREFIX)/bin/dwl
|
|
||||||
cp -f dwl $(DESTDIR)$(PREFIX)/bin
|
cp -f dwl $(DESTDIR)$(PREFIX)/bin
|
||||||
chmod 755 $(DESTDIR)$(PREFIX)/bin/dwl
|
chmod 755 $(DESTDIR)$(PREFIX)/bin/dwl
|
||||||
mkdir -p $(DESTDIR)$(MANDIR)/man1
|
mkdir -p $(DESTDIR)$(MANDIR)/man1
|
||||||
cp -f dwl.1 $(DESTDIR)$(MANDIR)/man1
|
cp -f dwl.1 $(DESTDIR)$(MANDIR)/man1
|
||||||
chmod 644 $(DESTDIR)$(MANDIR)/man1/dwl.1
|
chmod 644 $(DESTDIR)$(MANDIR)/man1/dwl.1
|
||||||
mkdir -p $(DESTDIR)$(DATADIR)/wayland-sessions
|
|
||||||
cp -f dwl.desktop $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop
|
|
||||||
chmod 644 $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop
|
|
||||||
uninstall:
|
uninstall:
|
||||||
rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1 \
|
rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1
|
||||||
$(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop
|
|
||||||
|
|
||||||
.SUFFIXES: .c .o
|
.SUFFIXES: .c .o
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) $(CPPFLAGS) $(DWLCFLAGS) -o $@ -c $<
|
$(CC) $(CPPFLAGS) $(DWLCFLAGS) -c $<
|
||||||
|
|
|
||||||
204
README.md
204
README.md
|
|
@ -1,82 +1,87 @@
|
||||||
# dwl - dwm for Wayland
|
# dwl - dwm for Wayland
|
||||||
|
|
||||||
Join us on our IRC channel: [#dwl on Libera Chat]
|
Join us on our [Discord server] or at [#dwl] on irc.libera.chat.
|
||||||
Or on the community-maintained [Discord server].
|
|
||||||
|
|
||||||
dwl is a compact, hackable compositor for [Wayland] based on [wlroots]. It is
|
dwl is a compact, hackable compositor for [Wayland] based on [wlroots]. It is
|
||||||
intended to fill the same space in the Wayland world that [dwm] does in X11,
|
intended to fill the same space in the Wayland world that dwm does in X11,
|
||||||
primarily in terms of functionality, and secondarily in terms of
|
primarily in terms of philosophy, and secondarily in terms of functionality.
|
||||||
philosophy. Like [dwm], dwl is:
|
Like dwm, dwl is:
|
||||||
|
|
||||||
- Easy to understand, hack on, and extend with patches
|
- Easy to understand, hack on, and extend with patches
|
||||||
- One C source file (or a very small number) configurable via `config.h`
|
- One C source file (or a very small number) configurable via `config.h`
|
||||||
|
- Limited to 2200 SLOC to promote hackability
|
||||||
- Tied to as few external dependencies as possible
|
- Tied to as few external dependencies as possible
|
||||||
|
|
||||||
## Getting Started:
|
dwl is not meant to provide every feature under the sun. Instead, like dwm, it
|
||||||
|
sticks to features which are necessary, simple, and straightforward to implement
|
||||||
|
given the base on which it is built. Implemented default features are:
|
||||||
|
|
||||||
### Latest semi-stable [release]
|
- Any features provided by dwm/Xlib: simple window borders, tags, keybindings,
|
||||||
This is probably where you want to start. This builds against the [wlroots]
|
client rules, mouse move/resize. Providing a built-in status bar is an
|
||||||
versions currently shipping in major distributions. If your
|
exception to this goal, to avoid dependencies on font rendering and/or
|
||||||
distribution's `wlroots` version is older, use an earlier dwl [release].
|
drawing libraries when an external bar could work well.
|
||||||
The `wlroots` version against which a given `dwl` release builds is specified
|
- Configurable multi-monitor layout support, including position and rotation
|
||||||
with each release on the [release] page
|
- Configurable HiDPI/multi-DPI support
|
||||||
|
- Idle-inhibit protocol which lets applications such as mpv disable idle
|
||||||
|
monitoring
|
||||||
|
- Provide information to external status bars via stdout/stdin
|
||||||
|
- Urgency hints via xdg-activate protocol
|
||||||
|
- Support screen lockers via input-inhibitor protocol
|
||||||
|
- Various Wayland protocols
|
||||||
|
- XWayland support as provided by wlroots (can be enabled in `config.mk`)
|
||||||
|
- Zero flickering - Wayland users naturally expect that "every frame is perfect"
|
||||||
|
- Layer shell popups (used by Waybar)
|
||||||
|
- Damage tracking provided by scenegraph API
|
||||||
|
|
||||||
### Development branch [main]
|
Features under consideration (possibly as patches) are:
|
||||||
Active development progresses on the `main` branch. The `main` branch is built
|
|
||||||
against a late (and often changing) git commit of wlroots. While the adventurous
|
|
||||||
are welcome to use `main`, it is a rocky road. Using `main` requires that the
|
|
||||||
user be willing to chase git commits of wlroots. Testing development pull
|
|
||||||
requests may involve merging unmerged pull requests in [wlroots]' git repository
|
|
||||||
and/or git commits of wayland.
|
|
||||||
|
|
||||||
### Building dwl
|
|
||||||
dwl has the following dependencies:
|
|
||||||
- libinput
|
|
||||||
- wayland
|
|
||||||
- wlroots (compiled with the libinput backend)
|
|
||||||
- xkbcommon
|
|
||||||
- wayland-protocols (compile-time only)
|
|
||||||
- pkg-config (compile-time only)
|
|
||||||
|
|
||||||
dwl has the following additional dependencies if XWayland support is enabled:
|
- Protocols made trivial by wlroots
|
||||||
- libxcb
|
- Implement the text-input and input-method protocols to support IME once ibus
|
||||||
- libxcb-wm
|
implements input-method v2 (see https://github.com/ibus/ibus/pull/2256 and
|
||||||
- wlroots (compiled with X11 support)
|
https://github.com/djpohly/dwl/pull/235)
|
||||||
- Xwayland (runtime only)
|
|
||||||
|
|
||||||
Install these (and their `-devel` versions if your distro has separate
|
Feature *non-goals* for the main codebase include:
|
||||||
development packages) and run `make`. If you wish to build against a released
|
|
||||||
version of wlroots (*you probably do*), use a [release] or a [0.x branch]. If
|
|
||||||
you want to use the unstable development `main` branch, you need to use the git
|
|
||||||
version of [wlroots].
|
|
||||||
|
|
||||||
To enable XWayland, you should uncomment its flags in `config.mk`.
|
- Client-side decoration (any more than is necessary to tell the clients not to)
|
||||||
|
- Client-initiated window management, such as move, resize, and close, which can
|
||||||
|
be done through the compositor
|
||||||
|
- Animations and visual effects
|
||||||
|
|
||||||
|
## Building dwl
|
||||||
|
|
||||||
|
dwl has only two dependencies: `wlroots` and `wayland-protocols`.
|
||||||
|
|
||||||
|
Simply install these (and their `-devel` versions if your distro has separate
|
||||||
|
development packages) and run `make`. If you wish to build against a Git
|
||||||
|
version of wlroots, check out the [wlroots-next branch].
|
||||||
|
|
||||||
|
To enable XWayland, you should also install xorg-xwayland and uncomment its flag
|
||||||
|
in `config.mk`.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
All configuration is done by editing `config.h` and recompiling, in the same
|
All configuration is done by editing `config.h` and recompiling, in the same
|
||||||
manner as [dwm]. There is no way to separately restart the window manager in
|
manner as dwm. There is no way to separately restart the window manager in
|
||||||
Wayland without restarting the entire display server, so any changes will take
|
Wayland without restarting the entire display server, so any changes will take
|
||||||
effect the next time dwl is executed.
|
effect the next time dwl is executed.
|
||||||
|
|
||||||
As in the [dwm] community, we encourage users to share patches they have
|
As in the dwm community, we encourage users to share patches they have created.
|
||||||
created. Check out the [dwl-patches] repository!
|
Check out the [patches page on our wiki]!
|
||||||
|
|
||||||
## Running dwl
|
## Running dwl
|
||||||
|
|
||||||
dwl can be run on any of the backends supported by wlroots. This means you can
|
dwl can be run on any of the backends supported by wlroots. This means you can
|
||||||
run it as a separate window inside either an X11 or Wayland session, as well as
|
run it as a separate window inside either an X11 or Wayland session, as well
|
||||||
directly from a VT console. Depending on your distro's setup, you may need to
|
as directly from a VT console. Depending on your distro's setup, you may need
|
||||||
add your user to the `video` and `input` groups before you can run dwl on a
|
to add your user to the `video` and `input` groups before you can run dwl on
|
||||||
VT. If you are using `elogind` or `systemd-logind` you need to install polkit;
|
a VT. If you are using `elogind` or `systemd-logind` you need to install
|
||||||
otherwise you need to add yourself in the `seat` group and enable/start the
|
polkit; otherwise you need to add yourself in the `seat` group and
|
||||||
seatd daemon.
|
enable/start the seatd daemon.
|
||||||
|
|
||||||
When dwl is run with no arguments, it will launch the server and begin handling
|
When dwl is run with no arguments, it will launch the server and begin handling
|
||||||
any shortcuts configured in `config.h`. There is no status bar or other
|
any shortcuts configured in `config.h`. There is no status bar or other
|
||||||
decoration initially; these are instead clients that can be run within the
|
decoration initially; these are instead clients that can be run within
|
||||||
Wayland session. Do note that the default background color is grey. This can be
|
the Wayland session.
|
||||||
modified in `config.h`.
|
|
||||||
|
|
||||||
If you would like to run a script or command automatically at startup, you can
|
If you would like to run a script or command automatically at startup, you can
|
||||||
specify the command using the `-s` option. This command will be executed as a
|
specify the command using the `-s` option. This command will be executed as a
|
||||||
|
|
@ -84,8 +89,7 @@ shell command using `/bin/sh -c`. It serves a similar function to `.xinitrc`,
|
||||||
but differs in that the display server will not shut down when this process
|
but differs in that the display server will not shut down when this process
|
||||||
terminates. Instead, dwl will send this process a SIGTERM at shutdown and wait
|
terminates. Instead, dwl will send this process a SIGTERM at shutdown and wait
|
||||||
for it to terminate (if it hasn't already). This makes it ideal for execing into
|
for it to terminate (if it hasn't already). This makes it ideal for execing into
|
||||||
a user service manager like [s6], [anopa], [runit], [dinit], or [`systemd
|
a user service manager like [s6], [anopa], [runit], or [`systemd --user`].
|
||||||
--user`].
|
|
||||||
|
|
||||||
Note: The `-s` command is run as a *child process* of dwl, which means that it
|
Note: The `-s` command is run as a *child process* of dwl, which means that it
|
||||||
does not have the ability to affect the environment of dwl or of any processes
|
does not have the ability to affect the environment of dwl or of any processes
|
||||||
|
|
@ -101,13 +105,13 @@ automatically, you will need to configure it prior to launching `dwl`, e.g.:
|
||||||
|
|
||||||
### Status information
|
### Status information
|
||||||
|
|
||||||
Information about selected layouts, current window title, app-id, and
|
Information about selected layouts, current window title, and
|
||||||
selected/occupied/urgent tags is written to the stdin of the `-s` command (see
|
selected/occupied/urgent tags is written to the stdin of the `-s` command (see
|
||||||
the `STATUS INFORMATION` section in `_dwl_(1)`). This information can be used to
|
the `printstatus()` function for details). This information can be used to
|
||||||
populate an external status bar with a script that parses the
|
populate an external status bar with a script that parses the information.
|
||||||
information. Failing to read this information will cause dwl to block, so if you
|
Failing to read this information will cause dwl to block, so if you do want to
|
||||||
do want to run a startup command that does not consume the status information,
|
run a startup command that does not consume the status information, you can
|
||||||
you can close standard input with the `<&-` shell redirection, for example:
|
close standard input with the `<&-` shell redirection, for example:
|
||||||
|
|
||||||
dwl -s 'foot --server <&-'
|
dwl -s 'foot --server <&-'
|
||||||
|
|
||||||
|
|
@ -118,62 +122,10 @@ script with the line
|
||||||
|
|
||||||
To get a list of status bars that work with dwl consult our [wiki].
|
To get a list of status bars that work with dwl consult our [wiki].
|
||||||
|
|
||||||
### (Known) Java nonreparenting WM issue
|
|
||||||
Certain IDEs don't display correctly unless an environmental variable for Java AWT
|
|
||||||
indicates that the WM is nonreparenting.
|
|
||||||
|
|
||||||
For some Java AWT-based IDEs, such as Xilinx Vivado and Microchip MPLAB X, the
|
|
||||||
following environment variable needs to be set before running the IDE or dwl:
|
|
||||||
|
|
||||||
export _JAVA_AWT_WM_NONREPARENTING=1
|
|
||||||
|
|
||||||
## Replacements for X applications
|
## Replacements for X applications
|
||||||
|
|
||||||
You can find a [list of useful resources on our wiki].
|
You can find a [list of useful resources on our wiki].
|
||||||
|
|
||||||
## Background
|
|
||||||
|
|
||||||
dwl is not meant to provide every feature under the sun. Instead, like [dwm], it
|
|
||||||
sticks to features which are necessary, simple, and straightforward to implement
|
|
||||||
given the base on which it is built. Implemented default features are:
|
|
||||||
|
|
||||||
- Any features provided by [dwm]/Xlib: simple window borders, tags, keybindings,
|
|
||||||
client rules, mouse move/resize. Providing a built-in status bar is an
|
|
||||||
exception to this goal, to avoid dependencies on font rendering and/or drawing
|
|
||||||
libraries when an external bar could work well.
|
|
||||||
- Configurable multi-monitor layout support, including position and rotation
|
|
||||||
- Configurable HiDPI/multi-DPI support
|
|
||||||
- Idle-inhibit protocol which lets applications such as mpv disable idle
|
|
||||||
monitoring
|
|
||||||
- Provide information to external status bars via stdout/stdin
|
|
||||||
- Urgency hints via xdg-activate protocol
|
|
||||||
- Support screen lockers via ext-session-lock-v1 protocol
|
|
||||||
- Various Wayland protocols
|
|
||||||
- XWayland support as provided by wlroots (can be enabled in `config.mk`)
|
|
||||||
- Zero flickering - Wayland users naturally expect that "every frame is perfect"
|
|
||||||
- Layer shell popups (used by Waybar)
|
|
||||||
- Damage tracking provided by scenegraph API
|
|
||||||
|
|
||||||
Given the Wayland architecture, dwl has to implement features from [dwm] **and**
|
|
||||||
the xorg-server. Because of this, it is impossible to maintain the original
|
|
||||||
project goal of 2000 SLOC and have a reasonably complete compositor with
|
|
||||||
features comparable to [dwm]. However, this does not mean that the code will grow
|
|
||||||
indiscriminately. We will try to keep the code as small as possible.
|
|
||||||
|
|
||||||
Features under consideration (possibly as patches) are:
|
|
||||||
|
|
||||||
- Protocols made trivial by wlroots
|
|
||||||
- Implement the text-input and input-method protocols to support IME once ibus
|
|
||||||
implements input-method v2 (see https://github.com/ibus/ibus/pull/2256 and
|
|
||||||
https://codeberg.org/dwl/dwl/pulls/235)
|
|
||||||
|
|
||||||
Feature *non-goals* for the main codebase include:
|
|
||||||
|
|
||||||
- Client-side decoration (any more than is necessary to tell the clients not to)
|
|
||||||
- Client-initiated window management, such as move, resize, and close, which can
|
|
||||||
be done through the compositor
|
|
||||||
- Animations and visual effects
|
|
||||||
|
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
|
|
||||||
dwl began by extending the TinyWL example provided (CC0) by the sway/wlroots
|
dwl began by extending the TinyWL example provided (CC0) by the sway/wlroots
|
||||||
|
|
@ -181,31 +133,25 @@ developers. This was made possible in many cases by looking at how sway
|
||||||
accomplished something, then trying to do the same in as suckless a way as
|
accomplished something, then trying to do the same in as suckless a way as
|
||||||
possible.
|
possible.
|
||||||
|
|
||||||
Many thanks to suckless.org and the [dwm] developers and community for the
|
Many thanks to suckless.org and the dwm developers and community for the
|
||||||
inspiration, and to the various contributors to the project, including:
|
inspiration, and to the various contributors to the project, including:
|
||||||
|
|
||||||
- **Devin J. Pohly for creating and nurturing the fledgling project**
|
|
||||||
- Alexander Courtis for the XWayland implementation
|
- Alexander Courtis for the XWayland implementation
|
||||||
- Guido Cella for the layer-shell protocol implementation, patch maintenance,
|
- Guido Cella for the layer-shell protocol implementation, patch maintenance,
|
||||||
and for helping to keep the project running
|
and for helping to keep the project running
|
||||||
- Stivvo for output management and fullscreen support, and patch maintenance
|
- Stivvo for output management and fullscreen support, and patch maintenance
|
||||||
|
|
||||||
|
|
||||||
[wlroots]: https://gitlab.freedesktop.org/wlroots
|
|
||||||
[dwm]: https://dwm.suckless.org/
|
|
||||||
[`systemd --user`]: https://wiki.archlinux.org/title/Systemd/User
|
|
||||||
[#dwl on Libera Chat]: https://web.libera.chat/?channels=#dwl
|
|
||||||
[0.7-rc1]: https://codeberg.org/dwl/dwl/releases/tag/v0.7-rc1
|
|
||||||
[0.x branch]: https://codeberg.org/dwl/dwl/branches
|
|
||||||
[anopa]: https://jjacky.com/anopa/
|
|
||||||
[dinit]: https://davmac.org/projects/dinit/
|
|
||||||
[dwl-patches]: https://codeberg.org/dwl/dwl-patches
|
|
||||||
[list of useful resources on our wiki]: https://codeberg.org/dwl/dwl/wiki/Home#migrating-from-x
|
|
||||||
[main]: https://codeberg.org/dwl/dwl/src/branch/main
|
|
||||||
[release]: https://codeberg.org/dwl/dwl/releases
|
|
||||||
[runit]: http://smarden.org/runit/faq.html#userservices
|
|
||||||
[s6]: https://skarnet.org/software/s6/
|
|
||||||
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots/
|
|
||||||
[wiki]: https://codeberg.org/dwl/dwl/wiki/Home#compatible-status-bars
|
|
||||||
[Discord server]: https://discord.gg/jJxZnrGPWN
|
[Discord server]: https://discord.gg/jJxZnrGPWN
|
||||||
|
[#dwl]: https://web.libera.chat/?channels=#dwl
|
||||||
[Wayland]: https://wayland.freedesktop.org/
|
[Wayland]: https://wayland.freedesktop.org/
|
||||||
|
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots/
|
||||||
|
[wlroots-next branch]: https://github.com/djpohly/dwl/tree/wlroots-next
|
||||||
|
[patches page on our wiki]: https://github.com/djpohly/dwl/wiki/Patches
|
||||||
|
[s6]: https://skarnet.org/software/s6/
|
||||||
|
[anopa]: https://jjacky.com/anopa/
|
||||||
|
[runit]: http://smarden.org/runit/faq.html#userservices
|
||||||
|
[`systemd --user`]: https://wiki.archlinux.org/title/Systemd/User
|
||||||
|
[wiki]: https://github.com/djpohly/dwl/wiki#compatible-status-bars
|
||||||
|
[list of useful resources on our wiki]:
|
||||||
|
https://github.com/djpohly/dwl/wiki#migrating-from-x
|
||||||
|
|
|
||||||
272
client.h
272
client.h
|
|
@ -10,9 +10,35 @@ static inline int
|
||||||
client_is_x11(Client *c)
|
client_is_x11(Client *c)
|
||||||
{
|
{
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
return c->type == X11;
|
return c->type == X11Managed || c->type == X11Unmanaged;
|
||||||
#endif
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
|
||||||
|
{
|
||||||
|
struct wlr_xdg_toplevel *toplevel;
|
||||||
|
struct wlr_xdg_toplevel_state *state;
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
if (client_is_x11(c)) {
|
||||||
|
xcb_size_hints_t *size_hints = c->surface.xwayland->size_hints;
|
||||||
|
if (size_hints) {
|
||||||
|
max->width = size_hints->max_width;
|
||||||
|
max->height = size_hints->max_height;
|
||||||
|
min->width = size_hints->min_width;
|
||||||
|
min->height = size_hints->min_height;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
toplevel = c->surface.xdg->toplevel;
|
||||||
|
state = &toplevel->current;
|
||||||
|
max->width = state->max_width;
|
||||||
|
max->height = state->max_height;
|
||||||
|
min->width = state->min_width;
|
||||||
|
min->height = state->min_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct wlr_surface *
|
static inline struct wlr_surface *
|
||||||
|
|
@ -28,7 +54,7 @@ client_surface(Client *c)
|
||||||
static inline int
|
static inline int
|
||||||
toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl)
|
toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl)
|
||||||
{
|
{
|
||||||
struct wlr_xdg_surface *xdg_surface, *tmp_xdg_surface;
|
struct wlr_xdg_surface *xdg_surface;
|
||||||
struct wlr_surface *root_surface;
|
struct wlr_surface *root_surface;
|
||||||
struct wlr_layer_surface_v1 *layer_surface;
|
struct wlr_layer_surface_v1 *layer_surface;
|
||||||
Client *c = NULL;
|
Client *c = NULL;
|
||||||
|
|
@ -39,44 +65,44 @@ toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!s)
|
if (!s)
|
||||||
return -1;
|
return type;
|
||||||
root_surface = wlr_surface_get_root_surface(s);
|
root_surface = wlr_surface_get_root_surface(s);
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(root_surface))) {
|
if (wlr_surface_is_xwayland_surface(root_surface)
|
||||||
|
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(root_surface))) {
|
||||||
c = xsurface->data;
|
c = xsurface->data;
|
||||||
type = c->type;
|
type = c->type;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((layer_surface = wlr_layer_surface_v1_try_from_wlr_surface(root_surface))) {
|
if (wlr_surface_is_layer_surface(root_surface)
|
||||||
|
&& (layer_surface = wlr_layer_surface_v1_from_wlr_surface(root_surface))) {
|
||||||
l = layer_surface->data;
|
l = layer_surface->data;
|
||||||
type = LayerShell;
|
type = LayerShell;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
xdg_surface = wlr_xdg_surface_try_from_wlr_surface(root_surface);
|
if (wlr_surface_is_xdg_surface(root_surface)
|
||||||
while (xdg_surface) {
|
&& (xdg_surface = wlr_xdg_surface_from_wlr_surface(root_surface))) {
|
||||||
tmp_xdg_surface = NULL;
|
while (1) {
|
||||||
switch (xdg_surface->role) {
|
switch (xdg_surface->role) {
|
||||||
case WLR_XDG_SURFACE_ROLE_POPUP:
|
case WLR_XDG_SURFACE_ROLE_POPUP:
|
||||||
if (!xdg_surface->popup || !xdg_surface->popup->parent)
|
if (!xdg_surface->popup->parent)
|
||||||
|
return -1;
|
||||||
|
else if (!wlr_surface_is_xdg_surface(xdg_surface->popup->parent))
|
||||||
|
return toplevel_from_wlr_surface(xdg_surface->popup->parent, pc, pl);
|
||||||
|
|
||||||
|
xdg_surface = wlr_xdg_surface_from_wlr_surface(xdg_surface->popup->parent);
|
||||||
|
break;
|
||||||
|
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
|
||||||
|
c = xdg_surface->data;
|
||||||
|
type = c->type;
|
||||||
|
goto end;
|
||||||
|
case WLR_XDG_SURFACE_ROLE_NONE:
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
tmp_xdg_surface = wlr_xdg_surface_try_from_wlr_surface(xdg_surface->popup->parent);
|
|
||||||
|
|
||||||
if (!tmp_xdg_surface)
|
|
||||||
return toplevel_from_wlr_surface(xdg_surface->popup->parent, pc, pl);
|
|
||||||
|
|
||||||
xdg_surface = tmp_xdg_surface;
|
|
||||||
break;
|
|
||||||
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
|
|
||||||
c = xdg_surface->data;
|
|
||||||
type = c->type;
|
|
||||||
goto end;
|
|
||||||
case WLR_XDG_SURFACE_ROLE_NONE:
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -92,16 +118,19 @@ end:
|
||||||
static inline void
|
static inline void
|
||||||
client_activate_surface(struct wlr_surface *s, int activated)
|
client_activate_surface(struct wlr_surface *s, int activated)
|
||||||
{
|
{
|
||||||
struct wlr_xdg_toplevel *toplevel;
|
struct wlr_xdg_surface *surface;
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
struct wlr_xwayland_surface *xsurface;
|
struct wlr_xwayland_surface *xsurface;
|
||||||
if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(s))) {
|
if (wlr_surface_is_xwayland_surface(s)
|
||||||
|
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(s))) {
|
||||||
wlr_xwayland_surface_activate(xsurface, activated);
|
wlr_xwayland_surface_activate(xsurface, activated);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if ((toplevel = wlr_xdg_toplevel_try_from_wlr_surface(s)))
|
if (wlr_surface_is_xdg_surface(s)
|
||||||
wlr_xdg_toplevel_set_activated(toplevel, activated);
|
&& (surface = wlr_xdg_surface_from_wlr_surface(s))
|
||||||
|
&& surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL)
|
||||||
|
wlr_xdg_toplevel_set_activated(surface->toplevel, activated);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
|
|
@ -111,43 +140,31 @@ client_set_bounds(Client *c, int32_t width, int32_t height)
|
||||||
if (client_is_x11(c))
|
if (client_is_x11(c))
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
if (wl_resource_get_version(c->surface.xdg->toplevel->resource) >=
|
if (c->surface.xdg->client->shell->version >=
|
||||||
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION && width >= 0 && height >= 0
|
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION && width >= 0 && height >= 0)
|
||||||
&& (c->bounds.width != width || c->bounds.height != height)) {
|
|
||||||
c->bounds.width = width;
|
|
||||||
c->bounds.height = height;
|
|
||||||
return wlr_xdg_toplevel_set_bounds(c->surface.xdg->toplevel, width, height);
|
return wlr_xdg_toplevel_set_bounds(c->surface.xdg->toplevel, width, height);
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
client_for_each_surface(Client *c, wlr_surface_iterator_func_t fn, void *data)
|
||||||
|
{
|
||||||
|
wlr_surface_for_each_surface(client_surface(c), fn, data);
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
if (client_is_x11(c))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
wlr_xdg_surface_for_each_popup_surface(c->surface.xdg, fn, data);
|
||||||
|
}
|
||||||
|
|
||||||
static inline const char *
|
static inline const char *
|
||||||
client_get_appid(Client *c)
|
client_get_appid(Client *c)
|
||||||
{
|
{
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c))
|
if (client_is_x11(c))
|
||||||
return c->surface.xwayland->class ? c->surface.xwayland->class : "broken";
|
return c->surface.xwayland->class;
|
||||||
#endif
|
#endif
|
||||||
return c->surface.xdg->toplevel->app_id ? c->surface.xdg->toplevel->app_id : "broken";
|
return c->surface.xdg->toplevel->app_id;
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
client_get_clip(Client *c, struct wlr_box *clip)
|
|
||||||
{
|
|
||||||
*clip = (struct wlr_box){
|
|
||||||
.x = 0,
|
|
||||||
.y = 0,
|
|
||||||
.width = c->geom.width - c->bw,
|
|
||||||
.height = c->geom.height - c->bw,
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
|
||||||
if (client_is_x11(c))
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
clip->x = c->surface.xdg->geometry.x;
|
|
||||||
clip->y = c->surface.xdg->geometry.y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|
@ -162,7 +179,7 @@ client_get_geometry(Client *c, struct wlr_box *geom)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
*geom = c->surface.xdg->geometry;
|
wlr_xdg_surface_get_geometry(c->surface.xdg, geom);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Client *
|
static inline Client *
|
||||||
|
|
@ -170,27 +187,13 @@ client_get_parent(Client *c)
|
||||||
{
|
{
|
||||||
Client *p = NULL;
|
Client *p = NULL;
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c)) {
|
if (client_is_x11(c) && c->surface.xwayland->parent)
|
||||||
if (c->surface.xwayland->parent)
|
toplevel_from_wlr_surface(c->surface.xwayland->parent->surface, &p, NULL);
|
||||||
toplevel_from_wlr_surface(c->surface.xwayland->parent->surface, &p, NULL);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
if (c->surface.xdg->toplevel->parent)
|
if (c->surface.xdg->toplevel->parent)
|
||||||
toplevel_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface, &p, NULL);
|
toplevel_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface, &p, NULL);
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
return p;
|
||||||
client_has_children(Client *c)
|
|
||||||
{
|
|
||||||
#ifdef XWAYLAND
|
|
||||||
if (client_is_x11(c))
|
|
||||||
return !wl_list_empty(&c->surface.xwayland->children);
|
|
||||||
#endif
|
|
||||||
/* surface.xdg->link is never empty because it always contains at least the
|
|
||||||
* surface itself. */
|
|
||||||
return wl_list_length(&c->surface.xdg->link) > 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const char *
|
static inline const char *
|
||||||
|
|
@ -198,42 +201,43 @@ client_get_title(Client *c)
|
||||||
{
|
{
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c))
|
if (client_is_x11(c))
|
||||||
return c->surface.xwayland->title ? c->surface.xwayland->title : "broken";
|
return c->surface.xwayland->title;
|
||||||
#endif
|
#endif
|
||||||
return c->surface.xdg->toplevel->title ? c->surface.xdg->toplevel->title : "broken";
|
return c->surface.xdg->toplevel->title;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
client_is_float_type(Client *c)
|
client_is_float_type(Client *c)
|
||||||
{
|
{
|
||||||
struct wlr_xdg_toplevel *toplevel;
|
struct wlr_box min = {0}, max = {0};
|
||||||
struct wlr_xdg_toplevel_state state;
|
client_get_size_hints(c, &max, &min);
|
||||||
|
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c)) {
|
if (client_is_x11(c)) {
|
||||||
struct wlr_xwayland_surface *surface = c->surface.xwayland;
|
struct wlr_xwayland_surface *surface = c->surface.xwayland;
|
||||||
xcb_size_hints_t *size_hints = surface->size_hints;
|
|
||||||
if (surface->modal)
|
if (surface->modal)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (wlr_xwayland_surface_has_window_type(surface, WLR_XWAYLAND_NET_WM_WINDOW_TYPE_DIALOG)
|
for (size_t i = 0; i < surface->window_type_len; i++)
|
||||||
|| wlr_xwayland_surface_has_window_type(surface, WLR_XWAYLAND_NET_WM_WINDOW_TYPE_SPLASH)
|
if (surface->window_type[i] == netatom[NetWMWindowTypeDialog]
|
||||||
|| wlr_xwayland_surface_has_window_type(surface, WLR_XWAYLAND_NET_WM_WINDOW_TYPE_TOOLBAR)
|
|| surface->window_type[i] == netatom[NetWMWindowTypeSplash]
|
||||||
|| wlr_xwayland_surface_has_window_type(surface, WLR_XWAYLAND_NET_WM_WINDOW_TYPE_UTILITY)) {
|
|| surface->window_type[i] == netatom[NetWMWindowTypeToolbar]
|
||||||
return 1;
|
|| surface->window_type[i] == netatom[NetWMWindowTypeUtility])
|
||||||
}
|
return 1;
|
||||||
|
|
||||||
return size_hints && size_hints->min_width > 0 && size_hints->min_height > 0
|
|
||||||
&& (size_hints->max_width == size_hints->min_width
|
|
||||||
|| size_hints->max_height == size_hints->min_height);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return ((min.width > 0 || min.height > 0 || max.width > 0 || max.height > 0)
|
||||||
|
&& (min.width == max.width || min.height == max.height));
|
||||||
|
}
|
||||||
|
|
||||||
toplevel = c->surface.xdg->toplevel;
|
static inline int
|
||||||
state = toplevel->current;
|
client_is_mapped(Client *c)
|
||||||
return toplevel->parent || (state.min_width != 0 && state.min_height != 0
|
{
|
||||||
&& (state.min_width == state.max_width
|
#ifdef XWAYLAND
|
||||||
|| state.min_height == state.max_height));
|
if (client_is_x11(c))
|
||||||
|
return c->surface.xwayland->mapped;
|
||||||
|
#endif
|
||||||
|
return c->surface.xdg->mapped;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
|
@ -243,8 +247,7 @@ client_is_rendered_on_mon(Client *c, Monitor *m)
|
||||||
* but rather actual displaying of the pixels.
|
* but rather actual displaying of the pixels.
|
||||||
* Usually VISIBLEON suffices and is also faster. */
|
* Usually VISIBLEON suffices and is also faster. */
|
||||||
struct wlr_surface_output *s;
|
struct wlr_surface_output *s;
|
||||||
int unused_lx, unused_ly;
|
if (!c->scene->node.enabled)
|
||||||
if (!wlr_scene_node_coords(&c->scene->node, &unused_lx, &unused_ly))
|
|
||||||
return 0;
|
return 0;
|
||||||
wl_list_for_each(s, &client_surface(c)->current_outputs, link)
|
wl_list_for_each(s, &client_surface(c)->current_outputs, link)
|
||||||
if (s->output == m->wlr_output)
|
if (s->output == m->wlr_output)
|
||||||
|
|
@ -264,8 +267,8 @@ client_is_stopped(Client *c)
|
||||||
|
|
||||||
wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL);
|
wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL);
|
||||||
if (waitid(P_PID, pid, &in, WNOHANG|WCONTINUED|WSTOPPED|WNOWAIT) < 0) {
|
if (waitid(P_PID, pid, &in, WNOHANG|WCONTINUED|WSTOPPED|WNOWAIT) < 0) {
|
||||||
/* This process is not our child process, while is very unlikely that
|
/* This process is not our child process, while is very unluckely that
|
||||||
* it is stopped, in order to do not skip frames, assume that it is. */
|
* it is stopped, in order to do not skip frames assume that it is. */
|
||||||
if (errno == ECHILD)
|
if (errno == ECHILD)
|
||||||
return 1;
|
return 1;
|
||||||
} else if (in.si_pid) {
|
} else if (in.si_pid) {
|
||||||
|
|
@ -282,8 +285,7 @@ static inline int
|
||||||
client_is_unmanaged(Client *c)
|
client_is_unmanaged(Client *c)
|
||||||
{
|
{
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c))
|
return c->type == X11Unmanaged;
|
||||||
return c->surface.xwayland->override_redirect;
|
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -298,6 +300,17 @@ client_notify_enter(struct wlr_surface *s, struct wlr_keyboard *kb)
|
||||||
wlr_seat_keyboard_notify_enter(seat, s, NULL, 0, NULL);
|
wlr_seat_keyboard_notify_enter(seat, s, NULL, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
client_restack_surface(Client *c)
|
||||||
|
{
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
if (client_is_x11(c))
|
||||||
|
wlr_xwayland_surface_restack(c->surface.xwayland, NULL,
|
||||||
|
XCB_STACK_MODE_ABOVE);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
client_send_close(Client *c)
|
client_send_close(Client *c)
|
||||||
{
|
{
|
||||||
|
|
@ -310,14 +323,6 @@ client_send_close(Client *c)
|
||||||
wlr_xdg_toplevel_send_close(c->surface.xdg->toplevel);
|
wlr_xdg_toplevel_send_close(c->surface.xdg->toplevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
client_set_border_color(Client *c, const float color[static 4])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
wlr_scene_rect_set_color(c->border[i], color);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
client_set_fullscreen(Client *c, int fullscreen)
|
client_set_fullscreen(Client *c, int fullscreen)
|
||||||
{
|
{
|
||||||
|
|
@ -330,56 +335,41 @@ client_set_fullscreen(Client *c, int fullscreen)
|
||||||
wlr_xdg_toplevel_set_fullscreen(c->surface.xdg->toplevel, fullscreen);
|
wlr_xdg_toplevel_set_fullscreen(c->surface.xdg->toplevel, fullscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
client_set_scale(struct wlr_surface *s, float scale)
|
|
||||||
{
|
|
||||||
wlr_fractional_scale_v1_notify_scale(s, scale);
|
|
||||||
wlr_surface_set_preferred_buffer_scale(s, (int32_t)ceilf(scale));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
client_set_size(Client *c, uint32_t width, uint32_t height)
|
client_set_size(Client *c, uint32_t width, uint32_t height)
|
||||||
{
|
{
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c)) {
|
if (client_is_x11(c)) {
|
||||||
wlr_xwayland_surface_configure(c->surface.xwayland,
|
wlr_xwayland_surface_configure(c->surface.xwayland,
|
||||||
c->geom.x + c->bw, c->geom.y + c->bw, width, height);
|
c->geom.x, c->geom.y, width, height);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if ((int32_t)width == c->surface.xdg->toplevel->current.width
|
if (width == c->surface.xdg->toplevel->current.width
|
||||||
&& (int32_t)height == c->surface.xdg->toplevel->current.height)
|
&& height ==c->surface.xdg->toplevel->current.height)
|
||||||
return 0;
|
return 0;
|
||||||
return wlr_xdg_toplevel_set_size(c->surface.xdg->toplevel, (int32_t)width, (int32_t)height);
|
return wlr_xdg_toplevel_set_size(c->surface.xdg->toplevel, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
client_set_tiled(Client *c, uint32_t edges)
|
client_set_tiled(Client *c, uint32_t edges)
|
||||||
{
|
{
|
||||||
#ifdef XWAYLAND
|
|
||||||
if (client_is_x11(c)) {
|
|
||||||
wlr_xwayland_surface_set_maximized(c->surface.xwayland,
|
|
||||||
edges != WLR_EDGE_NONE, edges != WLR_EDGE_NONE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (wl_resource_get_version(c->surface.xdg->toplevel->resource)
|
|
||||||
>= XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) {
|
|
||||||
wlr_xdg_toplevel_set_tiled(c->surface.xdg->toplevel, edges);
|
|
||||||
} else {
|
|
||||||
wlr_xdg_toplevel_set_maximized(c->surface.xdg->toplevel, edges != WLR_EDGE_NONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
client_set_suspended(Client *c, int suspended)
|
|
||||||
{
|
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (client_is_x11(c))
|
if (client_is_x11(c))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
wlr_xdg_toplevel_set_tiled(c->surface.xdg->toplevel, edges);
|
||||||
|
}
|
||||||
|
|
||||||
wlr_xdg_toplevel_set_suspended(c->surface.xdg->toplevel, suspended);
|
static inline struct wlr_surface *
|
||||||
|
client_surface_at(Client *c, double cx, double cy, double *sx, double *sy)
|
||||||
|
{
|
||||||
|
#ifdef XWAYLAND
|
||||||
|
if (client_is_x11(c))
|
||||||
|
return wlr_surface_surface_at(c->surface.xwayland->surface,
|
||||||
|
cx, cy, sx, sy);
|
||||||
|
#endif
|
||||||
|
return wlr_xdg_surface_surface_at(c->surface.xdg, cx, cy, sx, sy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
|
@ -387,8 +377,8 @@ client_wants_focus(Client *c)
|
||||||
{
|
{
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
return client_is_unmanaged(c)
|
return client_is_unmanaged(c)
|
||||||
&& wlr_xwayland_surface_override_redirect_wants_focus(c->surface.xwayland)
|
&& wlr_xwayland_or_surface_wants_focus(c->surface.xwayland)
|
||||||
&& wlr_xwayland_surface_icccm_input_model(c->surface.xwayland) != WLR_ICCCM_INPUT_MODEL_NONE;
|
&& wlr_xwayland_icccm_input_model(c->surface.xwayland) != WLR_ICCCM_INPUT_MODEL_NONE;
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
60
config.def.h
60
config.def.h
|
|
@ -1,31 +1,22 @@
|
||||||
/* Taken from https://github.com/djpohly/dwl/issues/466 */
|
|
||||||
#define COLOR(hex) { ((hex >> 24) & 0xFF) / 255.0f, \
|
|
||||||
((hex >> 16) & 0xFF) / 255.0f, \
|
|
||||||
((hex >> 8) & 0xFF) / 255.0f, \
|
|
||||||
(hex & 0xFF) / 255.0f }
|
|
||||||
/* appearance */
|
/* appearance */
|
||||||
static const int sloppyfocus = 1; /* focus follows mouse */
|
static const int sloppyfocus = 1; /* focus follows mouse */
|
||||||
static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
|
static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
|
||||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||||
static const float rootcolor[] = COLOR(0x222222ff);
|
static const float rootcolor[] = {0.3, 0.3, 0.3, 1.0};
|
||||||
static const float bordercolor[] = COLOR(0x444444ff);
|
static const float bordercolor[] = {0.5, 0.5, 0.5, 1.0};
|
||||||
static const float focuscolor[] = COLOR(0x005577ff);
|
static const float focuscolor[] = {1.0, 0.0, 0.0, 1.0};
|
||||||
static const float urgentcolor[] = COLOR(0xff0000ff);
|
/* To conform the xdg-protocol, set the alpha to zero to restore the old behavior */
|
||||||
/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */
|
static const float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0};
|
||||||
static const float fullscreen_bg[] = {0.0f, 0.0f, 0.0f, 1.0f}; /* You can also use glsl colors */
|
|
||||||
|
|
||||||
/* tagging - TAGCOUNT must be no greater than 31 */
|
/* tagging */
|
||||||
#define TAGCOUNT (9)
|
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||||
|
|
||||||
/* logging */
|
|
||||||
static int log_level = WLR_ERROR;
|
|
||||||
|
|
||||||
/* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */
|
|
||||||
static const Rule rules[] = {
|
static const Rule rules[] = {
|
||||||
/* app_id title tags mask isfloating monitor */
|
/* app_id title tags mask isfloating monitor */
|
||||||
/* examples: */
|
/* examples:
|
||||||
{ "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */
|
{ "Gimp", NULL, 0, 1, -1 },
|
||||||
{ "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */
|
*/
|
||||||
|
{ "firefox", NULL, 1 << 8, 0, -1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* layout(s) */
|
/* layout(s) */
|
||||||
|
|
@ -37,18 +28,13 @@ static const Layout layouts[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* monitors */
|
/* monitors */
|
||||||
/* (x=-1, y=-1) is reserved as an "autoconfigure" monitor position indicator
|
|
||||||
* WARNING: negative values other than (-1, -1) cause problems with Xwayland clients
|
|
||||||
* https://gitlab.freedesktop.org/xorg/xserver/-/issues/899
|
|
||||||
*/
|
|
||||||
/* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */
|
|
||||||
static const MonitorRule monrules[] = {
|
static const MonitorRule monrules[] = {
|
||||||
/* name mfact nmaster scale layout rotate/reflect x y */
|
/* name mfact nmaster scale layout rotate/reflect */
|
||||||
/* example of a HiDPI laptop monitor:
|
/* example of a HiDPI laptop monitor:
|
||||||
{ "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
|
{ "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL },
|
||||||
*/
|
*/
|
||||||
/* defaults */
|
/* defaults */
|
||||||
{ NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
|
{ NULL, 0.55, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* keyboard */
|
/* keyboard */
|
||||||
|
|
@ -80,9 +66,9 @@ LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN
|
||||||
static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
||||||
|
|
||||||
/* You can choose between:
|
/* You can choose between:
|
||||||
LIBINPUT_CONFIG_CLICK_METHOD_NONE
|
LIBINPUT_CONFIG_CLICK_METHOD_NONE
|
||||||
LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS
|
LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS
|
||||||
LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
|
LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
|
||||||
*/
|
*/
|
||||||
static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
|
static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
|
||||||
|
|
||||||
|
|
@ -99,7 +85,6 @@ LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE
|
||||||
*/
|
*/
|
||||||
static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE;
|
static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE;
|
||||||
static const double accel_speed = 0.0;
|
static const double accel_speed = 0.0;
|
||||||
|
|
||||||
/* You can choose between:
|
/* You can choose between:
|
||||||
LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle
|
LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle
|
||||||
LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right
|
LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right
|
||||||
|
|
@ -120,7 +105,7 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA
|
||||||
|
|
||||||
/* commands */
|
/* commands */
|
||||||
static const char *termcmd[] = { "foot", NULL };
|
static const char *termcmd[] = { "foot", NULL };
|
||||||
static const char *menucmd[] = { "wmenu-run", NULL };
|
static const char *menucmd[] = { "bemenu-run", NULL };
|
||||||
|
|
||||||
static const Key keys[] = {
|
static const Key keys[] = {
|
||||||
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
|
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
|
||||||
|
|
@ -131,8 +116,8 @@ static const Key keys[] = {
|
||||||
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
|
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
|
||||||
{ MODKEY, XKB_KEY_i, incnmaster, {.i = +1} },
|
{ MODKEY, XKB_KEY_i, incnmaster, {.i = +1} },
|
||||||
{ MODKEY, XKB_KEY_d, incnmaster, {.i = -1} },
|
{ MODKEY, XKB_KEY_d, incnmaster, {.i = -1} },
|
||||||
{ MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} },
|
{ MODKEY, XKB_KEY_h, setmfact, {.f = -0.05} },
|
||||||
{ MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} },
|
{ MODKEY, XKB_KEY_l, setmfact, {.f = +0.05} },
|
||||||
{ MODKEY, XKB_KEY_Return, zoom, {0} },
|
{ MODKEY, XKB_KEY_Return, zoom, {0} },
|
||||||
{ MODKEY, XKB_KEY_Tab, view, {0} },
|
{ MODKEY, XKB_KEY_Tab, view, {0} },
|
||||||
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} },
|
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} },
|
||||||
|
|
@ -161,9 +146,6 @@ static const Key keys[] = {
|
||||||
|
|
||||||
/* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */
|
/* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */
|
||||||
{ WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} },
|
{ WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} },
|
||||||
/* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is
|
|
||||||
* do not remove them.
|
|
||||||
*/
|
|
||||||
#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} }
|
#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} }
|
||||||
CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6),
|
CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6),
|
||||||
CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),
|
CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),
|
||||||
|
|
|
||||||
24
config.mk
24
config.mk
|
|
@ -1,4 +1,4 @@
|
||||||
_VERSION = 0.8-dev
|
_VERSION = 0.4
|
||||||
VERSION = `git describe --tags --dirty 2>/dev/null || echo $(_VERSION)`
|
VERSION = `git describe --tags --dirty 2>/dev/null || echo $(_VERSION)`
|
||||||
|
|
||||||
PKG_CONFIG = pkg-config
|
PKG_CONFIG = pkg-config
|
||||||
|
|
@ -6,31 +6,9 @@ PKG_CONFIG = pkg-config
|
||||||
# paths
|
# paths
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
MANDIR = $(PREFIX)/share/man
|
MANDIR = $(PREFIX)/share/man
|
||||||
DATADIR = $(PREFIX)/share
|
|
||||||
|
|
||||||
WLR_INCS = `$(PKG_CONFIG) --cflags wlroots-0.19`
|
|
||||||
WLR_LIBS = `$(PKG_CONFIG) --libs wlroots-0.19`
|
|
||||||
|
|
||||||
# Allow using an alternative wlroots installation
|
|
||||||
# This has to have all the includes required by wlroots, e.g:
|
|
||||||
# Assuming wlroots git repo is "${PWD}/wlroots" and you only ran "meson setup build && ninja -C build"
|
|
||||||
#WLR_INCS = -I/usr/include/pixman-1 -I/usr/include/elogind -I/usr/include/libdrm \
|
|
||||||
# -I$(PWD)/wlroots/include
|
|
||||||
# Set -rpath to avoid using the wrong library.
|
|
||||||
#WLR_LIBS = -Wl,-rpath,$(PWD)/wlroots/build -L$(PWD)/wlroots/build -lwlroots-0.19
|
|
||||||
|
|
||||||
# Assuming you ran "meson setup --prefix ${PWD}/0.19 build && ninja -C build install"
|
|
||||||
#WLR_INCS = -I/usr/include/pixman-1 -I/usr/include/elogind -I/usr/include/libdrm \
|
|
||||||
# -I$(PWD)/wlroots/0.19/include/wlroots-0.19
|
|
||||||
#WLR_LIBS = -Wl,-rpath,$(PWD)/wlroots/0.19/lib64 -L$(PWD)/wlroots/0.19/lib64 -lwlroots-0.19
|
|
||||||
|
|
||||||
XWAYLAND =
|
XWAYLAND =
|
||||||
XLIBS =
|
XLIBS =
|
||||||
# Uncomment to build XWayland support
|
# Uncomment to build XWayland support
|
||||||
#XWAYLAND = -DXWAYLAND
|
#XWAYLAND = -DXWAYLAND
|
||||||
#XLIBS = xcb xcb-icccm
|
#XLIBS = xcb xcb-icccm
|
||||||
|
|
||||||
# dwl itself only uses C99 features, but wlroots' headers use anonymous unions (C11).
|
|
||||||
# To avoid warnings about them, we do not use -std=c99 and instead of using the
|
|
||||||
# gmake default 'CC=c99', we use cc.
|
|
||||||
CC = cc
|
|
||||||
|
|
|
||||||
137
dwl.1
137
dwl.1
|
|
@ -7,7 +7,6 @@
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl v
|
.Op Fl v
|
||||||
.Op Fl d
|
|
||||||
.Op Fl s Ar startup command
|
.Op Fl s Ar startup command
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
.Nm
|
.Nm
|
||||||
|
|
@ -23,12 +22,6 @@ option,
|
||||||
writes its name and version to standard error and exits unsuccessfully.
|
writes its name and version to standard error and exits unsuccessfully.
|
||||||
.Pp
|
.Pp
|
||||||
When given the
|
When given the
|
||||||
.Fl d
|
|
||||||
option,
|
|
||||||
.Nm
|
|
||||||
enables full wlroots logging, including debug information.
|
|
||||||
.Pp
|
|
||||||
When given the
|
|
||||||
.Fl s
|
.Fl s
|
||||||
option,
|
option,
|
||||||
.Nm
|
.Nm
|
||||||
|
|
@ -37,7 +30,7 @@ starts a shell process running
|
||||||
when starting.
|
when starting.
|
||||||
When stopping, it sends
|
When stopping, it sends
|
||||||
.Dv SIGTERM
|
.Dv SIGTERM
|
||||||
to the child process group and waits for it to exit.
|
to the child process and waits for it to exit.
|
||||||
.Pp
|
.Pp
|
||||||
Users are encouraged to customize
|
Users are encouraged to customize
|
||||||
.Nm
|
.Nm
|
||||||
|
|
@ -55,10 +48,10 @@ Move window to a single tag.
|
||||||
Toggle tag for window.
|
Toggle tag for window.
|
||||||
.It Mod-p
|
.It Mod-p
|
||||||
Spawn
|
Spawn
|
||||||
.Xr wmenu-run 1 .
|
.Nm bemenu-run .
|
||||||
.It Mod-Shift-Return
|
.It Mod-Shift-Return
|
||||||
Spawn
|
Spawn
|
||||||
.Xr foot 1 .
|
.Nm foot .
|
||||||
.It Mod-[jk]
|
.It Mod-[jk]
|
||||||
Move focus down/up the stack.
|
Move focus down/up the stack.
|
||||||
.It Mod-[id]
|
.It Mod-[id]
|
||||||
|
|
@ -100,114 +93,6 @@ Quit
|
||||||
.Nm .
|
.Nm .
|
||||||
.El
|
.El
|
||||||
These might differ depending on your keyboard layout.
|
These might differ depending on your keyboard layout.
|
||||||
.Ss Mouse commands
|
|
||||||
.Bl -tag -width 20n -offset indent -compact
|
|
||||||
.It Mod-Button1
|
|
||||||
Move focused window while dragging.
|
|
||||||
Tiled windows will be toggled to the floating state.
|
|
||||||
.It Mod-Button2
|
|
||||||
Toggle focused window between floating and tiled state.
|
|
||||||
.It Mod-Button3
|
|
||||||
Resize focused window while dragging.
|
|
||||||
Tiled windows will be toggled to the floating state.
|
|
||||||
.El
|
|
||||||
.Sh STATUS INFORMATION
|
|
||||||
.Nm
|
|
||||||
writes its status information to standard output.
|
|
||||||
If the
|
|
||||||
.Fl s
|
|
||||||
option is given, the status information is written to the standard input of the
|
|
||||||
child process instead.
|
|
||||||
.Pp
|
|
||||||
Said information has the following format:
|
|
||||||
.Bd -ragged -offset indent
|
|
||||||
.Ar <monitor>
|
|
||||||
.Ar <component>
|
|
||||||
.Ar <data>
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
.Bl -tag -width 11n -offset 0 -compact
|
|
||||||
.It Ar <monitor>
|
|
||||||
is the name given to the output.
|
|
||||||
.It Ar <component>
|
|
||||||
is one of (in order)
|
|
||||||
.Em title ,
|
|
||||||
.Em appid ,
|
|
||||||
.Em fullscreen ,
|
|
||||||
.Em floating ,
|
|
||||||
.Em selmon ,
|
|
||||||
.Em tags ,
|
|
||||||
.Em layout .
|
|
||||||
.It Ar <data>
|
|
||||||
changes depending on
|
|
||||||
.Ar <component> .
|
|
||||||
.Bl -tag -width 10n -compact
|
|
||||||
.It Em title
|
|
||||||
The title of the focused window on
|
|
||||||
.Ar <monitor>
|
|
||||||
or nothing if there is no focused window.
|
|
||||||
.It Em appid
|
|
||||||
The app_id of the focused window on
|
|
||||||
.Ar <monitor>
|
|
||||||
or nothing if there is no focused window.
|
|
||||||
.It Em fullscreen
|
|
||||||
Prints 1 if the focused window on
|
|
||||||
.Ar <monitor>
|
|
||||||
is in fullscreen state, otherwise prints 0. If there is no focused
|
|
||||||
window it prints nothing.
|
|
||||||
.It Em floating
|
|
||||||
Prints 1 if the focused window on
|
|
||||||
.Ar <monitor>
|
|
||||||
is in floating state, otherwise prints 0. If there is no focused
|
|
||||||
window it prints nothing.
|
|
||||||
.It Em selmon
|
|
||||||
Prints 1 if
|
|
||||||
.Ar <monitor>
|
|
||||||
is the selected monitor, otherwise prints 0.
|
|
||||||
.It Em tags
|
|
||||||
Prints four bitmasks in the following order:
|
|
||||||
.Bl -bullet -width 2n -compact
|
|
||||||
.It
|
|
||||||
Occupied tags of
|
|
||||||
.Ar <monitor> .
|
|
||||||
.It
|
|
||||||
Selected tags of
|
|
||||||
.Ar <monitor> .
|
|
||||||
.It
|
|
||||||
Tags of the focused window on
|
|
||||||
.Ar <monitor> .
|
|
||||||
.It
|
|
||||||
Tags where a window on
|
|
||||||
.Ar <monitor>
|
|
||||||
requested activation or has urgency hints.
|
|
||||||
.El
|
|
||||||
The bitmasks are 32-bit unsigned decimal integers.
|
|
||||||
.It Em layout
|
|
||||||
Prints the symbol of the current layout.
|
|
||||||
.El
|
|
||||||
.El
|
|
||||||
.Ss Examples
|
|
||||||
When there is a selected window:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
HDMI\-A\-1 title \(ti/source/repos/dwl > man \-l dwl.1
|
|
||||||
HDMI\-A\-1 appid footclient
|
|
||||||
HDMI\-A\-1 fullscreen 0
|
|
||||||
HDMI\-A\-1 floating 0
|
|
||||||
HDMI\-A\-1 selmon 1
|
|
||||||
HDMI\-A\-1 tags 271 4 4 0
|
|
||||||
HDMI\-A\-1 layout [T]
|
|
||||||
.Ed
|
|
||||||
.Pp
|
|
||||||
When there is no selected window:
|
|
||||||
.Bd -literal -offset indent
|
|
||||||
HDMI\-A\-1 title
|
|
||||||
HDMI\-A\-1 appid
|
|
||||||
HDMI\-A\-1 fullscreen
|
|
||||||
HDMI\-A\-1 floating
|
|
||||||
HDMI\-A\-1 selmon 1
|
|
||||||
HDMI\-A\-1 tags 271 512 0 0
|
|
||||||
HDMI\-A\-1 layout [T]
|
|
||||||
.Ed
|
|
||||||
.Sh ENVIRONMENT
|
.Sh ENVIRONMENT
|
||||||
These environment variables are used by
|
These environment variables are used by
|
||||||
.Nm :
|
.Nm :
|
||||||
|
|
@ -216,7 +101,7 @@ These environment variables are used by
|
||||||
A directory where temporary user files, such as the Wayland socket,
|
A directory where temporary user files, such as the Wayland socket,
|
||||||
are stored.
|
are stored.
|
||||||
.It Ev XDG_CONFIG_DIR
|
.It Ev XDG_CONFIG_DIR
|
||||||
A directory containing configuration of various programs and
|
A directory containung configuration of various programs and
|
||||||
libraries, including libxkbcommon.
|
libraries, including libxkbcommon.
|
||||||
.It Ev DISPLAY , WAYLAND_DISPLAY , WAYLAND_SOCKET
|
.It Ev DISPLAY , WAYLAND_DISPLAY , WAYLAND_SOCKET
|
||||||
Tell how to connect to an underlying X11 or Wayland server.
|
Tell how to connect to an underlying X11 or Wayland server.
|
||||||
|
|
@ -248,11 +133,19 @@ server.
|
||||||
Start
|
Start
|
||||||
.Nm
|
.Nm
|
||||||
with s6 in the background:
|
with s6 in the background:
|
||||||
.Dl dwl \-s \(aqs6\-svscan <&\-\(aq
|
.Dl dwl -s 's6-svscan <&-'
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr dwm 1 ,
|
|
||||||
.Xr foot 1 ,
|
.Xr foot 1 ,
|
||||||
.Xr wmenu 1 ,
|
.Xr bemenu 1 ,
|
||||||
|
.Xr dwm 1 ,
|
||||||
.Xr xkeyboard-config 7
|
.Xr xkeyboard-config 7
|
||||||
|
.Sh CAVEATS
|
||||||
|
The child process's standard input is connected with a pipe to
|
||||||
|
.Nm .
|
||||||
|
If the child process neither reads from the pipe nor closes its
|
||||||
|
standard input,
|
||||||
|
.Nm
|
||||||
|
will freeze after a while due to it blocking when writing to the full
|
||||||
|
pipe buffer.
|
||||||
.Sh BUGS
|
.Sh BUGS
|
||||||
All of them.
|
All of them.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
[Desktop Entry]
|
|
||||||
Name=dwl
|
|
||||||
Comment=dwm for Wayland
|
|
||||||
Exec=dwl
|
|
||||||
Type=Application
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<protocol name="wlr_output_power_management_unstable_v1">
|
|
||||||
<copyright>
|
|
||||||
Copyright © 2019 Purism SPC
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
copy of this software and associated documentation files (the "Software"),
|
|
||||||
to deal in the Software without restriction, including without limitation
|
|
||||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice (including the next
|
|
||||||
paragraph) shall be included in all copies or substantial portions of the
|
|
||||||
Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
DEALINGS IN THE SOFTWARE.
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
<description summary="Control power management modes of outputs">
|
|
||||||
This protocol allows clients to control power management modes
|
|
||||||
of outputs that are currently part of the compositor space. The
|
|
||||||
intent is to allow special clients like desktop shells to power
|
|
||||||
down outputs when the system is idle.
|
|
||||||
|
|
||||||
To modify outputs not currently part of the compositor space see
|
|
||||||
wlr-output-management.
|
|
||||||
|
|
||||||
Warning! The protocol described in this file is experimental and
|
|
||||||
backward incompatible changes may be made. Backward compatible changes
|
|
||||||
may be added together with the corresponding interface version bump.
|
|
||||||
Backward incompatible changes are done by bumping the version number in
|
|
||||||
the protocol and interface names and resetting the interface version.
|
|
||||||
Once the protocol is to be declared stable, the 'z' prefix and the
|
|
||||||
version number in the protocol and interface names are removed and the
|
|
||||||
interface version number is reset.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<interface name="zwlr_output_power_manager_v1" version="1">
|
|
||||||
<description summary="manager to create per-output power management">
|
|
||||||
This interface is a manager that allows creating per-output power
|
|
||||||
management mode controls.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<request name="get_output_power">
|
|
||||||
<description summary="get a power management for an output">
|
|
||||||
Create a output power management mode control that can be used to
|
|
||||||
adjust the power management mode for a given output.
|
|
||||||
</description>
|
|
||||||
<arg name="id" type="new_id" interface="zwlr_output_power_v1"/>
|
|
||||||
<arg name="output" type="object" interface="wl_output"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
|
||||||
<description summary="destroy the manager">
|
|
||||||
All objects created by the manager will still remain valid, until their
|
|
||||||
appropriate destroy request has been called.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
</interface>
|
|
||||||
|
|
||||||
<interface name="zwlr_output_power_v1" version="1">
|
|
||||||
<description summary="adjust power management mode for an output">
|
|
||||||
This object offers requests to set the power management mode of
|
|
||||||
an output.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<enum name="mode">
|
|
||||||
<entry name="off" value="0"
|
|
||||||
summary="Output is turned off."/>
|
|
||||||
<entry name="on" value="1"
|
|
||||||
summary="Output is turned on, no power saving"/>
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
<enum name="error">
|
|
||||||
<entry name="invalid_mode" value="1" summary="inexistent power save mode"/>
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
<request name="set_mode">
|
|
||||||
<description summary="Set an outputs power save mode">
|
|
||||||
Set an output's power save mode to the given mode. The mode change
|
|
||||||
is effective immediately. If the output does not support the given
|
|
||||||
mode a failed event is sent.
|
|
||||||
</description>
|
|
||||||
<arg name="mode" type="uint" enum="mode" summary="the power save mode to set"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="mode">
|
|
||||||
<description summary="Report a power management mode change">
|
|
||||||
Report the power management mode change of an output.
|
|
||||||
|
|
||||||
The mode event is sent after an output changed its power
|
|
||||||
management mode. The reason can be a client using set_mode or the
|
|
||||||
compositor deciding to change an output's mode.
|
|
||||||
This event is also sent immediately when the object is created
|
|
||||||
so the client is informed about the current power management mode.
|
|
||||||
</description>
|
|
||||||
<arg name="mode" type="uint" enum="mode"
|
|
||||||
summary="the output's new power management mode"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<event name="failed">
|
|
||||||
<description summary="object no longer valid">
|
|
||||||
This event indicates that the output power management mode control
|
|
||||||
is no longer valid. This can happen for a number of reasons,
|
|
||||||
including:
|
|
||||||
- The output doesn't support power management
|
|
||||||
- Another client already has exclusive power management mode control
|
|
||||||
for this output
|
|
||||||
- The output disappeared
|
|
||||||
|
|
||||||
Upon receiving this event, the client should destroy this object.
|
|
||||||
</description>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
|
||||||
<description summary="destroy this power management">
|
|
||||||
Destroys the output power management mode control object.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
</interface>
|
|
||||||
</protocol>
|
|
||||||
16
util.c
16
util.c
|
|
@ -3,7 +3,6 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
@ -34,18 +33,3 @@ ecalloc(size_t nmemb, size_t size)
|
||||||
die("calloc:");
|
die("calloc:");
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
fd_set_nonblock(int fd) {
|
|
||||||
int flags = fcntl(fd, F_GETFL);
|
|
||||||
if (flags < 0) {
|
|
||||||
perror("fcntl(F_GETFL):");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0) {
|
|
||||||
perror("fcntl(F_SETFL):");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
1
util.h
1
util.h
|
|
@ -2,4 +2,3 @@
|
||||||
|
|
||||||
void die(const char *fmt, ...);
|
void die(const char *fmt, ...);
|
||||||
void *ecalloc(size_t nmemb, size_t size);
|
void *ecalloc(size_t nmemb, size_t size);
|
||||||
int fd_set_nonblock(int fd);
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue