Compare commits

...

753 Commits
v0.2.2 ... main

Author SHA1 Message Date
a65384b2a1 Added key_cmd for Super_L+p.
This replicates what the 'display' key is mapped on Lenovo laptop
2025-01-03 21:25:26 -08:00
b751362b16 Updates to button actions 2024-12-15 12:33:51 -08:00
ea953a7269 Fixed syntax error after wlroots 19 2024-12-15 08:14:50 -08:00
c400f16ee0 Merge branch 'main' of https://codeberg.org/dwl/dwl 2024-12-14 08:20:22 -08:00
Leonardo Hernández Hernández
30f5063474
manually call updatemons in powermgrsetmode()
Fixes: https://codeberg.org/dwl/dwl/issues/713
2024-12-10 22:49:09 -06:00
Leonardo Hernández Hernández
1d08ade132
remove binary before copying to destination
Since Linux 6.11 is possible overwrite a running executable, possibly making it
crash.

Thanks to: movq42rax
Fixes: https://codeberg.org/dwl/dwl/issues/709
References: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2a010c412853
References: https://lore.kernel.org/stable/CACKH++YAtEMYu2nTLUyfmxZoGO37fqogKMDkBpddmNaz5HE6ng@mail.gmail.com/T/#u
2024-11-15 00:26:51 -06:00
Leonardo Hernández Hernández
84245764e2
specify version for presentation-time (wlroots!4858)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4858
2024-10-27 20:37:15 -06:00
Leonardo Hernández Hernández
6ca87210d4
check if the backend supports explicit sync before creating the object (wlroots!4848)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4848
2024-10-27 20:37:15 -06:00
3ea25b64d6 Action buttons with SHIFT/CTRL modifiers 2024-09-29 13:25:40 -07:00
Leonardo Hernández Hernández
002c7d2204
tell xwayland clients they're maximized
like we do to xdg clients when tiled state is not supported.
2024-09-21 21:00:47 -06:00
Guido Cella
8206cc8889 fix a use after free
This line makes dwl crash after closing mpv with the switchtotag patch.
2024-09-12 04:33:19 +00:00
Guido Cella
54f207839f reorder config.mk variables
By placing the default WLR_INCS and WLR_LIBS before the ones for an
alternative wlroots, they don't need to be commented to enable the
alternative ones.
2024-09-08 20:51:41 +02:00
Leonardo Hernández Hernández
9c05b9622c
fix style for client_set_scale() 2024-08-30 22:29:08 -06:00
2860b6f48b Put toggle touch behind ifdef 2024-08-30 17:14:46 -07:00
choc
d34be5d545
remove unused link member from KeyboardGroup
unnecessary since grouping Keyboard wl_list to use wlr_keyboard_group in 023efce

ΔSLOC: -1
2024-08-27 23:12:00 -06:00
Leonardo Hernández Hernández
c49312f084
disable scene node unless it is unmanaged 2024-08-27 23:09:46 -06:00
Leonardo Hernández Hernández
f899060965
send a configure to unmanaged clients when mapping 2024-08-27 23:09:46 -06:00
Leonardo Hernández Hernández
cc72df11d6
configure xdg_toplevels after configuring it's decoration 2024-08-27 23:09:46 -06:00
Leonardo Hernández Hernández
0312720ae8
remove a space before parenthesis in function calls 2024-08-27 23:09:46 -06:00
Leonardo Hernández Hernández
6de87121e2
destroy popups when we can't get it's parent or they don't have monitor 2024-08-27 23:09:46 -06:00
Leonardo Hernández Hernández
bbc00d88a4
remove a redundant check
resize() now does the same check
2024-08-27 23:09:46 -06:00
Leonardo Hernández Hernández
54b546121b
avoid using a else block 2024-08-27 23:09:46 -06:00
Leonardo Hernández Hernández
43016bdad8
introduce client_set_scale() 2024-08-27 23:09:41 -06:00
Leonardo Hernández Hernández
b616476c85
remove unnecessary LayerShell.geom
We only used geom.x and geom.y. We can access those variables directly from the
scene node.
2024-08-27 23:09:08 -06:00
Leonardo Hernández Hernández
d4ad37354e
update comment about first fields of Client and LayerSurface order 2024-08-27 23:09:08 -06:00
Leonardo Hernández Hernández
5db05e82bd
fix style in configurex11() 2024-08-27 23:09:08 -06:00
Leonardo Hernández Hernández
8ec5e52e06
fix crash when a client is created while all outputs are disabled 2024-08-26 21:56:10 -06:00
Leonardo Hernández Hernández
c5275ca571
state that the Discord server is community-maintained
Previously I regularly checked the server but it has been quite a long time
since I was able to do it.
2024-08-18 19:24:04 -06:00
A Frederick Christensen
2c0b889f86
Update CHANGELOG.md 2024-08-18 19:23:56 -06:00
Leonardo Hernández Hernández
554754c9a2
chase xdg_surface geometry changes (wlroots!4788)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4788
2024-08-14 13:37:14 -06:00
Leonardo Hernández Hernández
0caa658276
use wlr_scene_set_gamma_control_manager_v1() (wlroots!4192)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4192
2024-08-14 12:21:27 -06:00
Leonardo Hernández Hernández
07aeef1f7e
guarantee client_get_{title,appid} never return NULL
ΔSLOC: -6
2024-08-14 12:19:37 -06:00
Leonardo Hernández Hernández
e454f7ae81
allow the use of non-system wlroots library
References: https://codeberg.org/dwl/dwl/issues/646#issuecomment-2032644
2024-08-14 12:00:52 -06:00
Leonardo Hernández Hernández
334bbe6f0f
fix potential crash in configurex11()
We can't call resize() on unmanaged clients because they don't have borders and
resize() requires them.

Fixes: 94f4ead7dad89433e6087dc19950738c64bbed05
2024-08-10 10:47:48 -06:00
Leonardo Hernández Hernández
1b805ddd38
account border width in configurex11()
Fixes: 13925eb1da8af2c1d23ee9d01efd03c3626081b2
2024-08-08 14:46:25 -06:00
Leonardo Hernández Hernández
94f4ead7da
actually move unmanaged clients in configurex11()
only calling wlr_xwayland_surface_configure() may be not enough because we also
need to move the scene node in order to make effective the configure
2024-08-08 14:46:08 -06:00
Leonardo Hernández Hernández
bb21ecda30
improve checking in configurex11()
this avoids a client resizing itself when the user is interactively resizing
the client
2024-08-08 14:33:03 -06:00
Leonardo Hernández Hernández
b25717c939
drop a useless check in configurex11() 2024-08-08 14:19:39 -06:00
Leonardo Hernández Hernández
a4fa954616
do not restack xwayland surfaces (wlroots!4756)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4756
2024-08-07 16:58:16 -06:00
Leonardo Hernández Hernández
35951a8d7e
add support for linux-drm-syncobj-v1 (wlroots!4715)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4262
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4715
2024-08-06 12:20:25 -06:00
Leonardo Hernández Hernández
a634e3f527
fix crash when a virtual pointer is destroyed
Fixes: https://codeberg.org/dwl/dwl/issues/680
2024-08-06 12:01:22 -06:00
Leonardo Hernández Hernández
d136dadf45
-pedantic -> -Wpedantic
Bug: https://codeberg.org/dwl/dwl/issues/584
2024-08-01 22:41:00 -06:00
Sivecano
672b4c405d
fix maximize callback not getting deregisterd 2024-07-27 22:05:53 -06:00
Leonardo Hernández Hernández
b5abbc37d8
fix crash when re-mapping a client
Fixes: ab5c554d096ebca8446b7b1354c49be014b8b747
2024-07-27 21:59:27 -06:00
Leonardo Hernández Hernández
986beef5be
replace spaces with tabs
Fixes: 71f11e6cf63289d51f152469a0da81a85fe2608c
2024-07-27 00:41:39 -06:00
f9aafbd339 Merge branch 'main' of https://codeberg.org/dwl/dwl 2024-07-25 18:50:20 -07:00
Leonardo Hernández Hernández
487abc28ba
add myself to .mailmap 2024-07-24 15:51:49 -06:00
Leonardo Hernández Hernández
cd216908a7
send scale on initial commit to layer surfaces
Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me>
2024-07-24 06:25:54 -05:00
e2177689c2 Merge branch 'main' of https://codeberg.org/dwl/dwl 2024-07-23 19:45:55 -07:00
Lennart Jablonka
f2c5023a3a dwl(1): use correct special characters for - and '
The hyphen-minus <-> and apostrophe-quote <'> are interpreted by troff
as hyphen and right single quotation mark.  See groff_char(7).

Fixes: 0db6f3c5b5f9 ("add dwl(1)")
2024-07-23 23:32:15 +00:00
Lennart Jablonka
4bbbb4907e add myself to .mailmap 2024-07-23 23:32:15 +00:00
A Frederick Christensen
ea6a450121
README.md Fix links formatting issue after re-flow text to 80 columns 2024-07-21 14:34:45 -05:00
A Frederick Christensen
ad30ca910b
Documentation restructuring
Modified documentation to make clear the change in development (main) branch versus releases.
2024-07-21 14:21:43 -05:00
Leonardo Hernández Hernández
452a314faa
update README.md to mention the main branch now requires wlroots-git
Closes: https://codeberg.org/dwl/dwl/issues/646
2024-07-14 21:55:58 -06:00
Leonardo Hernández Hernández
da6de7c4d7
update wlr_xwayland_surface names (wlroots!2434)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/2434
2024-07-14 21:37:03 -06:00
Leonardo Hernández Hernández
2553111aa3
bump wlroots version 2024-07-14 21:34:44 -06:00
Leonardo Hernández Hernández
51881da27b
bump version to 0.8-dev 2024-07-14 21:34:28 -06:00
Leonardo Hernández Hernández
7328e5691c
changelog: add new 'unreleased' section 2024-07-14 21:33:37 -06:00
Leonardo Hernández Hernández
bd59573f07
bump version to 0.7-rc1 2024-07-14 21:25:37 -06:00
Leonardo Hernández Hernández
0060e1922d
prepare CHANGELOG.md for 0.7 2024-07-14 21:25:37 -06:00
Leonardo Hernández Hernández
c709b09e10
changelog: add new 'unreleased' section 2024-07-14 21:13:20 -06:00
Guido Cella
efe10ea655
use the parent scene node to determine if move clients out of LyrFloat
[sevz: commit message is mine]
2024-07-14 21:10:44 -06:00
Leonardo Hernández Hernández
9a962ce136
Reapply "place child clients above fullscreen clients"
This reverts commit 043ab3ac1335d7a1cd84fe0f9cea8056977211a4.
2024-07-14 21:10:44 -06:00
Leonardo Hernández Hernández
0761fd0691
Merge branch 'wlroots-next' 2024-07-14 21:10:44 -06:00
Leonardo Hernández Hernández
12b44421c8
bump to linux-dmabuf version 5 2024-07-13 20:23:04 -06:00
Leonardo Hernández Hernández
5a4839b1c8
bump version to 0.6 2024-07-13 16:34:01 -06:00
Leonardo Hernández Hernández
bd5001b780
prepare CHANGELOG.md for 0.6 2024-07-13 16:30:51 -06:00
Leonardo Hernández Hernández
043ab3ac13
Revert "place child clients above fullscreen clients"
This does not work as intended. Lets revert it temporarily and add it back
after the release.

This reverts commit 298949bbc4eae8cedb9cdd11cfc9ebd139ac5d5f.
2024-07-12 21:08:48 -06:00
Rutherther
aede3b294b
Fix applybounds
Applybounds doesn't move client when it overlays
only with border with monitor to the right.

Apparently, c->geom.width already includes the border
as well.
2024-07-03 13:39:32 -06:00
Rutherther
7d8c3ea369
feat: focus empty monitor when clicked 2024-07-03 13:35:29 -06:00
Leonardo Hernández Hernández
2db0a2e8ef
use round(3) and ceilf(3) from the math library
ΔSLOC: -1
2024-07-03 13:27:52 -06:00
Leonardo Hernández Hernández
ab5c554d09
set preferred scale after the first commit (XDGshell) 2024-07-03 13:27:51 -06:00
Leonardo Hernández Hernández
b4638fef29
drop useless maplayersurfacenotify() 2024-07-03 13:27:51 -06:00
Leonardo Hernández Hernández
71f11e6cf6
set O_NONBLOCK flag to stdout 2024-07-01 20:40:54 -06:00
Leonardo Hernández Hernández
2b4893a0ad
add a note about having at least a dummy rule for rules[]
Closes: https://codeberg.org/dwl/dwl/issues/656
2024-06-29 20:41:54 -06:00
Leonardo Hernández Hernández
1002ea04fa
add bugref about why we call updatemons in outputmgrapplyortest 2024-06-25 22:24:38 -06:00
Leonardo Hernández Hernández
5d73134e33
Merge remote-tracking branch 'upstream/main' into wlroots-next 2024-06-25 11:50:42 -06:00
Leonardo Hernández Hernández
46ae075430
set preferred scale on creation (LayerShell) 2024-06-25 11:33:49 -06:00
Leonardo Hernández Hernández
13925eb1da
correctly report position to xwayland clients
Previously we didn't take into account their borders requiring us to add
`borderpx` to override_redirect clients.

Fixes: https://codeberg.org/dwl/dwl/issues/651
2024-06-24 13:32:03 -06:00
Leonardo Hernández Hernández
4a7d1bebf5
add bugref for negative x,y monitor position and xwayland 2024-06-22 00:21:17 -06:00
Leonardo Hernández Hernández
baedf7f791
Merge remote-tracking branch 'upstream/main' into wlroots-next 2024-06-20 23:32:44 -06:00
Leonardo Hernández Hernández
845d3c47bd
Reapply gamma LUT when re-enabling an output using wlr-output-power-management 2024-06-20 23:30:46 -06:00
Leonardo Hernández Hernández
9cdce1b8ff
try to limit (79 characters) the line lenght in the Makefile 2024-06-20 23:29:26 -06:00
Leonardo Hernández Hernández
4cf1d604b8
Merge remote-tracking branch 'upstream/main' into wlroots-next 2024-06-20 22:44:50 -06:00
thanatos
650a918010
Updated power management handling to address issues raised in the PR 2024-06-20 19:11:53 -06:00
David Donahue
2902df94d6
Prevent updatemons() from removing monitors that have been put to sleep from the layout 2024-06-20 19:11:53 -06:00
Emil Miler
9b1f35e42b
Implement support for output power management
This patch is based on the original stale patch by Guido Cella @guidocella.
It has been modified to apply cleanly to the latest v5.0 tag. Since the SLOC
limit is now lifted, this core feature should be merged into dwl upstream.

Thanks to Dima Krasner @dimkr for the cherry-pick.

Closes: #559, #525
2024-06-20 19:11:52 -06:00
Leonardo Hernández Hernández
92d1c286b8
default CC to gcc
posix c99 does not accept `-pedantic`

Fixes: https://codeberg.org/dwl/dwl/issues/584
2024-06-20 18:42:00 -06:00
Rutherther
784b047b38
Check for null monitor in resize function 2024-06-20 17:49:29 -06:00
Rutherther
11baacbec0
Add output to layout after enabled state is committed 2024-06-20 17:49:29 -06:00
Rutherther
16076ec5a4
fix: make sure selmon doesn't get set to disabled mon 2024-06-20 17:49:25 -06:00
Leonardo Hernández Hernández
a8403d7b4d
handle gpu resets
Fixes: https://codeberg.org/dwl/dwl/issues/601
2024-06-20 16:58:31 -06:00
Peter Hofmann
7a46fccdba
Run startup_cmd in new session and kill the entire group
When a user's startup_cmd is a little more complex, e.g. a shell script,
and forks off several processes, then killing only the main child pid
might leave unwanted processes behind on exit. Not all children will
notice when their parent or the compositor has quit.

To fix this, put startup_cmd into its own session and process group, and
kill the entire group on exit.
2024-06-20 16:36:08 -06:00
630efefd3a Merge branch 'main' of /home/mahesh/git/furnish/dwl_20240217 2024-06-15 10:37:43 -07:00
8c9a29b87e Merge branch 'main' of https://codeberg.org/dwl/dwl 2024-06-15 10:36:39 -07:00
Forrest Bushstone
c2e7350f2e
Make sure toplevel_from_wlr_surface is called with a valid surface pointer 2024-06-14 01:43:32 -06:00
Leonardo Hernández Hernández
7570dc0a41
minor adjustments in Makefile 2024-06-13 14:46:09 -06:00
Guido Cella
e5a57fb155
use tabs in client.h
Fixes 298949bbc4eae8cedb9cdd11cfc9ebd139ac5d5f.
2024-06-12 14:25:58 -06:00
613ee6a3a6 Merge branch 'main' of /home/mahesh/git/furnish/dwl_20240217 2024-06-09 16:25:31 -07:00
9512cb560e Merge branch 'main' of https://codeberg.org/dwl/dwl 2024-06-09 16:24:39 -07:00
Leonardo Hernández Hernández
57b5e41063
use enum headers when possible 2024-06-08 20:16:16 -06:00
Leonardo Hernández Hernández
f4b6b429ec
Merge remote-tracking branch 'upstream/main' into wlroots-next 2024-06-04 14:03:37 -06:00
Leonardo Hernández Hernández
21205f2f40
make sure clients share the same layer on floating layout 2024-06-04 13:58:16 -06:00
Leonardo Hernández Hernández
8f6fca35d0
create a keyboard group for each virtual keyboard 2024-06-02 23:33:57 -06:00
A Frederick Christensen
bca077b927
Allow negative coordinates in MonitorRules
Monitor/output position (-1, -1) remains as a single indicator value for autoconfigure layout.
Additionally, one minor comment typo is corrected.
2024-06-02 18:54:11 -05:00
Forrest Bushstone
0047ff740a
Replicate dwm behavior for sloppyfocus 2024-05-30 16:24:42 -06:00
Leonardo Hernández Hernández
bf81a128ec
wlroots now allows parallel installs 2024-05-27 23:10:40 -06:00
854ab23102 Merge branch 'main' of /home/mahesh/git/furnish/dwl_20240217 2024-05-12 14:13:44 -07:00
6fa809d2f1 Merge branch 'main' of https://codeberg.org/dwl/dwl 2024-05-12 14:12:40 -07:00
fauxmight
9825c26cdd dwl-patches overhaul - doc changes 2024-05-10 05:08:54 +00:00
A Frederick Christensen
34b7a57211
Update wmenu-run name 2024-05-05 13:52:25 -05:00
sewn
5c19e23146 switch to wmenu
bemenu is very bloated, turning itself into a library, which makes it
7489 SLOC.

wmenu on the other hand, looks suckless by default, and is only 2000
SLOC, which i also find alot nicer to use, since bemenu does nothing
to replicate the original dmenu feel.
2024-05-05 18:40:23 +00:00
Leonardo Hernández Hernández
3b1f0a8a88
add support for alpha-modifier-v1 (wlroots!4616)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4616
2024-04-30 12:36:10 -06:00
Leonardo Hernández Hernández
bb73481662
use wlr_renderer_get_texture_formats (wlroots!4644)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4644
2024-04-21 15:53:59 -06:00
cc8f7fb99c Using device name instead of ID for touchpad
* UDEV registers touch pad (e.g., Synaptic) with different IDs on
  reboots. Instead of hard-coding product/device IDs in config.h,
  use a string that appears in device name to identify it
2024-04-14 11:39:45 -07:00
51b2f68ba5 Information on using touch device id 2024-04-14 11:00:26 -07:00
460a6b8905 Merge branch 'main' of /home/mahesh/git/furnish/dwl_20240217 2024-04-13 11:33:13 -07:00
3db4baf24c Merge branch 'main' of https://codeberg.org/dwl/dwl 2024-04-13 11:30:06 -07:00
cb828032c7 Touch input device control
* Added function toggle_touch_input_device to toggle enaled state of
  touch device.
* This function is called in key bindings.
* Touch device is identified by vendor/device id provided in config.h
2024-04-06 16:11:05 -07:00
choc
577d8da6d1
put wlr_layer_shell top layer below fullscreen
fixes wlr_layer_shell top clients showing over fullscreen clients
2024-04-04 11:09:05 -06:00
Leonardo Hernández Hernández
72e2ce8b00
Merge remote-tracking branch 'upstream/main' into wlroots-next 2024-04-04 10:50:21 -06:00
Leonardo Hernández Hernández
dd00d994ce
do not set withdrawn state for xwayland clients
Closes: https://codeberg.org/dwl/dwl/issues/573
2024-03-31 21:41:12 -06:00
korei999
f7154d539d
properly resize on configurex11 2024-03-31 21:39:21 -06:00
937623515a XKB option to disable CAPS lock 2024-03-31 11:45:14 -07:00
A Frederick Christensen
3a95d4ed03
Fix rule examples; minimize newbie surprises
Make example rules be actual EXAMPLES.
Now newcomers should not have to ask, "When I start firefox, nothing
happens. What is going on?"

Also clarified a minor typo and a consistency in spacing.
2024-03-26 20:00:46 -05:00
2923b2be91 Merge branch 'main' of /home/mahesh/git/furnish/dwl_20240217 2024-03-23 18:49:20 -07:00
992411fa75 Merge branch 'main' of https://codeberg.org/dwl/dwl 2024-03-23 18:48:22 -07:00
Guido Cella
2b171fd501 fix virtual pointers
When motionabsolute() is called from warpd, event->time_msec is 0, so
motionnotify() doesn't call wlr_cursor_move(). Fix this by explicitly
warping the cursor in this case, like it was done before implementing
pointer constraints.

I don't know if this is a bug in warpd or time_msec is always 0 with
virtual pointers, since the only other software that uses the virtual
pointer protocol I know of is wl-kbptr, and I can't get that to work
with dwl at all.
2024-03-11 19:01:13 +01:00
Forrest Bushstone
ea33ce9ae6
Support pointer constraints and relative pointer protocols
Fixes: https://codeberg.org/dwl/dwl/issues/489
FIxes: https://codeberg.org/dwl/dwl/issues/317
2024-03-11 11:34:26 -06:00
Leonardo Hernández Hernández
a0117eea76
use enums from the wayland protocol (wlroots!4575)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4575
2024-02-29 14:05:09 -06:00
9bae793c9f Customized default config 2024-02-18 10:54:46 -08:00
6da4a0db72 Merge branch 'main' of /home/mahesh/git/furnish/dwl_20240217 2024-02-17 18:53:45 -08:00
82ff3cb6e6 Added IPC v2 patch 2024-02-17 18:47:07 -08:00
Leonardo Hernández Hernández
7b3eb70501
misc fixes to xdg-toplevel-decoration 2024-02-06 20:37:36 -06:00
Leonardo Hernández Hernández
c215e8a3e1
send initial configure to xdg-toplevels (wlroots!4396)
We still need to fix xdg-popups

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4396
2024-02-06 20:30:40 -06:00
Leonardo Hernández Hernández
8e0b5baf8e
Merge remote-tracking branch 'upstream/main' into wlroots-next 2024-02-07 02:27:07 +00:00
Guido Cella
8006e79200
allow toggling the layout before selecting a different one 2024-02-07 02:23:33 +00:00
Leonardo Hernández Hernández
5ae245beed
fix minimum size
continuation of 4043fc3093a73174cb63653ba9e742b4738f2ee5
2024-02-07 02:21:26 +00:00
A Frederick Christensen
089480e0b6
Update and correct patches/patches-wiki links
Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me>
2024-02-06 19:53:13 -06:00
Benjamin Chausse
3c98c4c24d Fix link to patches website
Signed-off-by: Benjamin Chausse <benjamin@chausse.xyz>
2024-02-06 00:39:01 +00:00
Guido Cella
298949bbc4
place child clients above fullscreen clients
When a child window of a fullscreen client is mapped, the fullscreen is
disabled, and if the previously fullscreen client is floating the child
window is rendered below it and cannot be seen, causing confusion,
though it is still focused and interactable.

Fix this by putting children of fullscreen clients in LyrFS instead of
LyrFloat, and by returning before the unset_fullscreen code is called
when they are mapped.

focusstack() now lets you switch focus from a fullscreen client to its
child windows, otherwise if you switch focus from the child window to
the fullscreen client you could not focus the child window again and the
fullscreen client would stay unresponsive.

Child clients are not reparented to LyrFloat after leaving fullscreen,
so you could spawn a child window, focus back the fullscreen client,
unfullscreen it, and the child window would still be drawn above other
floating clients. Avoid dealing with this edge case to keep the line
count low.

These cases can be tested by pressing Ctrl+o in applications with an
open file dialog.
2024-02-05 16:00:28 -06:00
Guido Cella
17c5cbbf7b
make XWayland clients inherit tags and monitors
Revert 3213088 because the linked bug can no longer be reproduced with
wlroots 0.17, and update client_get_parent() so it doesn't segfault with
XWayland surfaces. This also allows reusing the p variable in the next
commit.
2024-02-05 15:59:46 -06:00
Guido Cella
45e3694fc8
remove useless wlr_scene_node_reparent() calls
These don't do anything because wlr_scene_node_reparent() is immediately
called again by setfloating() through setmon(). They are also a source
of confusion because if you change the wlr_scene_node_reparent() call in
applyrules() it takes a while to understand why it doesn't work.
2024-02-05 15:59:46 -06:00
Leonardo Hernández Hernández
5c936efc42
Revert "No need to call updatemons ourselves"
Fixes: https://codeberg.org/dwl/dwl/issues/577

This reverts commit 26d7c9689f6e7eb699f2a63c2093c2a27e411ea3.
2024-01-30 22:54:54 -06:00
A Frederick Christensen
9830a991ff
Correct specifier-data_type mismatches 2024-01-26 23:12:35 -06:00
Guido Cella
863634a61c
configure xwayland surfaces without monitors
For wine clients often configurex11() is called before mapnotify() and
therefore c->mon is NULL. configurex11 just returns early in that case,
letting these clients stay in the wrong size. For example only the top
left part of winecfg and wine uninstaller is drawn, or confirmation
dialogs like when closing wine notepad are too big. Fix this by
configuring their surfaces like before 88d386b.
2024-01-25 19:47:34 -06:00
Leonardo Hernández Hernández
5fec98b17a
pass wl_event_loop to wlr_backend_autocreate (wlroots!4443)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4443
2024-01-25 12:12:22 -06:00
Guido Cella
ac6074f4fd
implement the virtual pointer protocol
This is used by programs like warpd.
2024-01-25 17:13:01 +00:00
Leonardo Hernández Hernández
433385f7f1
do not arrange monitor if it's disabled (wlroots!4520)
This causes us to send negative values to xdg-configures (e.g a bug in our end)

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4520
(cherry picked from commit 4043fc3093a73174cb63653ba9e742b4738f2ee5)
2024-01-24 13:36:46 -06:00
Leonardo Hernández Hernández
4043fc3093
do not arrange monitor if it's disabled (wlroots!4520)
This causes us to send negative values to xdg-configures (e.g a bug in our end)

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4520
2024-01-24 12:12:09 -06:00
Leonardo Hernández Hernández
b3f33e9147
add support for axis_relative_direction event (wlroots!4003)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4003
2024-01-24 12:10:54 -06:00
Leonardo Hernández Hernández
f136aa088a
Revert "drop wl_drm (wlroots!4397)"
There still a lot software that uses this protocol

This reverts commit facbe57fcbe74d27809eefdfe6aaac5150fbb954.
2024-01-24 12:09:55 -06:00
Leonardo Hernández Hernández
1c3aaa70ba
Merge remote-tracking branch 'upstream/main' into wlroots-next 2024-01-24 12:09:42 -06:00
Devin J. Pohly
26d7c9689f
No need to call updatemons ourselves
The output manager in wlroots emits an output_layout.change event when
anything changes, so updatemons will be called anyway.

ΔSLOC: -1
2024-01-20 21:51:20 -06:00
Leonardo Hernández Hernández
6c8be38ec4
drop unused variable 2024-01-15 02:19:02 +00:00
Leonardo Hernández Hernández
417e37f988
request description before logs 2024-01-15 02:15:54 +00:00
Leonardo Hernández Hernández
a1f3e25c35
turn on -Wfloat-conversion 2024-01-15 02:09:18 +00:00
Leonardo Hernández Hernández
0151bd48dd
turn on -Wsign-compare 2024-01-15 02:09:18 +00:00
A Frederick Christensen
337d6ba3fb
acknowledgements refactoring 2024-01-14 09:01:49 -06:00
Leonardo Hernández Hernández
ec557f253b
clarify the code will be kept as small as possible 2024-01-12 22:34:09 -06:00
choc
fd263041a0 check if monitor is null before setting gamma
fixes segfault on monitor disconnect when using wlsunset
2024-01-11 17:17:57 +08:00
Leonardo Hernández Hernández
a73afc66ab
drop SLOC limit 2024-01-10 20:50:34 -06:00
Leonardo Hernández Hernández
facbe57fcb
drop wl_drm (wlroots!4397)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4397
2024-01-10 18:13:31 -06:00
Leonardo Hernández Hernández
f5b046ce9e
prefer functionality over philosophy 2024-01-10 00:20:11 -06:00
Leonardo Hernández Hernández
6340989c8e
add acknowledgment to djpohly 2024-01-10 00:17:06 -06:00
Ben Jargowsky
25e34e4d0c Destroy fullscreen node after moving clients off mon 2024-01-06 17:34:08 -08:00
Leonardo Hernández Hernández
668022bc90
don't send configure events to uninitialized xdg-toplevels 2024-01-05 11:12:34 -06:00
Leonardo Hernández Hernández
c222468887
don't send configure events to uninitialized xdg-popups 2024-01-05 11:08:50 -06:00
Leonardo Hernández Hernández
f3c4f72314
fix posible NULL-dereference in wl_surface.commit handler 2024-01-01 00:51:01 -06:00
Leonardo Hernández Hernández
05c263de45
only create wlr_presentation (wlroots!4482)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4482
2023-12-27 11:45:36 -06:00
Leonardo Hernández Hernández
bf35e77811
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-12-27 11:22:11 -06:00
Leonardo Hernández Hernández
6cbf8e9b80
unset DISPLAY before setting up xwayland 2023-12-27 11:19:03 -06:00
Leonardo Hernández Hernández
d13015381b
only execute the first keybinding 2023-12-27 11:18:24 -06:00
Leonardo Hernández Hernández
e277d84c51
more style fixes
missed from the previous iteration
2023-12-27 11:17:52 -06:00
Leonardo Hernández Hernández
bf5a6be73c
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-12-26 16:21:28 -06:00
Leonardo Hernández Hernández
1f0afcfc28
create a wlr_keyboard_group for virtual keyboards
Fixes: https://codeberg.org/dwl/dwl/issues/554
2023-12-25 21:19:59 -06:00
Leonardo Hernández Hernández
23fd312409
fix typo
Fixes: 7afdc191fe4e9b3d16604b7f0c96f9741247e2d2
Thanks to: David Donahue <david.donahue2996@gmail.com>
2023-12-18 14:08:09 -06:00
Leonardo Hernández Hernández
e39d931430
tie xdg_toplevel_decorations to Client
a xdg_toplevel can only have one xdg_toplevel_decoration so there is no need to
have a new struct for decorations
2023-12-18 12:59:47 -06:00
Leonardo Hernández Hernández
396840cdf2
Revert "nuke CSDs, hopefully for good!"
The compositor must respond to the client requesting a change to the decoration
mode, it does not matter if the compositor chooses a different mode.

This reverts commit 9071ce6c848ce214939fb84f85ae77de86de88d7.
2023-12-18 12:56:20 -06:00
Leonardo Hernández Hernández
a71b368483
Revert "remove typedef Decoration"
This reverts commit d1ff1e6f75d9c53c953957b5c0a64e0bcb40008b.
2023-12-18 12:56:19 -06:00
Leonardo Hernández Hernández
7afdc191fe
style fixes 2023-12-17 21:42:50 +00:00
David Donahue
023efce6eb
use wlr_keyboard_group to manage all keyboards 2023-12-17 21:41:39 +00:00
Leonardo Hernández Hernández
fa660fb61e
check toplevel resources
it's just a aesthetic change
2023-12-12 22:21:32 -06:00
Leonardo Hernández Hernández
126a333354
Merge remote-tracking branch 'upstream/main' into wlroots-next
Fixes: https://codeberg.org/dwl/dwl/issues/432
Fixes: https://codeberg.org/dwl/dwl/issues/547
2023-12-11 00:31:17 -06:00
Dima Krasner
9a84789ff1
restore and respect rootcolor 2023-12-11 00:30:17 -06:00
Leonardo Hernández Hernández
49bfe92703
merge X11Managed and X11Unmanaged into X11
now that client_is_unmanaged() checks the wlr struct we don't need to keep
track of it ourselves
2023-12-10 23:46:49 -06:00
Leonardo Hernández Hernández
c88960751d
check if a client is unmanaged checking the o-r flag
it may change at any moment and I don't really want to add a listener for it
2023-12-10 23:46:40 -06:00
Leonardo Hernández Hernández
9c5bdcfbe8
do not blindly try to send motion events when pointer button is pressed
we don't have to do this if the surface is the same
2023-12-10 23:27:59 -06:00
Leonardo Hernández Hernández
0de7d1aa71
Merge branch 'main' into wlroots-next 2023-12-07 22:43:13 -06:00
Leonardo Hernández Hernández
1884a07646
sort LISTEN calls in createnotify{,x11} 2023-12-07 22:40:59 -06:00
Leonardo Hernández Hernández
79c51a4584
use the same style for urgent() and sethints() 2023-12-07 22:37:35 -06:00
Leonardo Hernández Hernández
f5d839844d
remove an unneeded cast in createpointer() 2023-12-07 22:37:00 -06:00
Leonardo Hernández Hernández
e03896b4d6
avoid duplication of lines
the output state is copied when creating a output configuration head
2023-12-07 22:18:49 -06:00
Leonardo Hernández Hernández
e7e84b1083
add explanation about why we try to re-apply the gamma LUT on output changes 2023-12-07 22:17:48 -06:00
Leonardo Hernández Hernández
9694477b2f
relax a bit the line length limit 2023-12-07 22:16:13 -06:00
Leonardo Hernández Hernández
6a15167754
add a blank line to improve readability 2023-12-07 22:15:42 -06:00
Leonardo Hernández Hernández
e5e2d1c28f
use (struct wlr_box){0} to empty the Monitor areas 2023-12-07 22:04:24 -06:00
Leonardo Hernández Hernández
bdbfb45d66
copy layout symbol when matching a MonitorRule 2023-12-07 21:51:24 -06:00
Leonardo Hernández Hernández
50ea84c5f6
remove extra blank line 2023-12-07 21:49:26 -06:00
Leonardo Hernández Hernández
472a31b5a4
LayerSurface::link -> LayerSurface.link 2023-12-07 21:48:56 -06:00
Leonardo Hernández Hernández
a760757b82
set the correct border color when mapping a client 2023-12-07 21:44:53 -06:00
Leonardo Hernández Hernández
80c9ad12ba
reduce calls to client_get_geometry 2023-12-07 21:43:48 -06:00
Leonardo Hernández Hernández
7341d047da
add a note about not removing the default rule
Closes: https://codeberg.org/dwl/dwl/issues/527
2023-12-07 14:20:49 -06:00
fictitiousexistence
be2a1dea26
Update README.md 2023-12-07 14:19:42 -06:00
Leonardo Hernández Hernández
393078d80c
store the layersurface pointer in l->popups->node.data as well 2023-12-07 14:19:09 -06:00
Leonardo Hernández Hernández
28ec843aee
make sure popups of a layer surface are in the correct layer
previously it worked because we checked in every commit the layer
in a353eee2cac0378a4201e408a3417aa107a7f647 and
b100b446b8c82bc2dcdbb40856ab87ed4a4ad594
we changed the way it's handled and now if the layer surface does not change
the layer we don't it either. meaning that if it was created in the bottom
layer and did not change the layer the popups would show behind xdg clients
2023-12-07 14:19:02 -06:00
Leonardo Hernández Hernández
2b3504e439
sort #includes 2023-12-01 21:35:50 -06:00
Leonardo Hernández Hernández
bab5c0185a
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-11-30 22:44:52 -06:00
Leonardo Hernández Hernández
5f7d396996
don't return early if the first output commit fails 2023-11-30 22:39:03 -06:00
Leonardo Hernández Hernández
901d2e2d9d
check failure of wlr_output_init_render 2023-11-30 22:38:52 -06:00
Leonardo Hernández Hernández
00e867d536
use detached output state in createmon()
see previous commit for motivation
2023-11-30 22:38:39 -06:00
Leonardo Hernández Hernández
2e29189b92
use a detached output state in outputmgrapplyortest()
wlr_output.pending might be removed in wlroots 0.18
2023-11-30 22:38:11 -06:00
Leonardo Hernández Hernández
43f31b8f1b
improve the bug report template
Fixes: https://codeberg.org/dwl/dwl/issues/498
2023-11-28 23:03:35 -06:00
Leonardo Hernández Hernández
ff39cac355
convert issue templates to yaml
also move the templates to .gitea to reflect the migration to Codeberg
2023-11-28 21:28:51 -06:00
Leonardo Hernández Hernández
70c5fcc23d
chase xdg-shell events update (wlroots!4345)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4345
2023-11-27 00:06:03 -06:00
Leonardo Hernández Hernández
3fe3581a59
chase wlr_layer_shell_v1.new_surface changes (wlroots!4265)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4265
2023-11-27 00:06:03 -06:00
Leonardo Hernández Hernández
057d50af8c
pass wl_display to wlr_output_layout_create (wlroots!4310)
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4310
2023-11-27 00:06:03 -06:00
Leonardo Hernández Hernández
2e4fdc1664
use l instead of layersurface
`layer_surface` instead of `wlr_layer_surface`
and `scene_layer` whenever a wlr_scene_tree is related to layer surfaces
2023-11-25 19:18:19 -06:00
Leonardo Hernández Hernández
b100b446b8
return early if a layersurface didn't commit something 2023-11-25 19:17:32 -06:00
Leonardo Hernández Hernández
9cb1ece6cc
do not check if a layer surface has monitor on commit
We do not allow creating them w/o monitor and they are destroyed when
destroying their monitor
2023-11-25 19:17:32 -06:00
Leonardo Hernández Hernández
01a237bd5c
send wl_surface.enter before initial commit
It's not necessary but it'll help clients to render a perfect first frame
2023-11-25 19:17:32 -06:00
Leonardo Hernández Hernández
a5e068b20a
destroy the layer-suface's scene tree for popups 2023-11-25 19:16:33 -06:00
Leonardo Hernández Hernández
39f4ee564b
use wlr_box_equal() instead of memcmp 2023-11-25 19:08:56 -06:00
Leonardo Hernández Hernández
a353eee2ca
simplify settings popups scene tree parent 2023-11-25 19:06:17 -06:00
Leonardo Hernández Hernández
66ec028b00
simplify check for wlr_layer_surface.output 2023-11-25 19:05:27 -06:00
Leonardo Hernández Hernández
1f10e69b4c
use sizeof(*pointer) instead of sizeof(struct) 2023-11-25 19:04:57 -06:00
Leonardo Hernández Hernández
922e117fc5
add new 'unreleased' section 2023-11-25 19:04:08 -06:00
Leonardo Hernández Hernández
2783e82bf8
make sure to unlink Monitor.request_state listener 2023-11-25 18:53:18 -06:00
Squibid
66ef4ecfec
Change github links to codeberg links in README.md 2023-11-25 10:54:56 -06:00
Leonardo Hernández Hernández
d08e6a3a7e
include CHANGELOG.md in the tarball
Fixes: 24576f1fdf56bc8879203bb2d7e7cd116d4bba42
2023-11-25 01:22:48 -06:00
Leonardo Hernández Hernández
f579dd8668
bump version to 0.5 2023-11-25 00:28:11 -06:00
Leonardo Hernández Hernández
24576f1fdf
add CHANGELOG.md 2023-11-25 00:21:53 -06:00
Leonardo Hernández Hernández
7ac76219df
Merge branch 'wlroots-next' 2023-11-25 00:04:19 -06:00
Leonardo Hernández Hernández
6838f909bd
try to apply gamma LUT in updatemons
this in the case the output was re-enabled
2023-11-21 20:41:36 -06:00
Leonardo Hernández Hernández
d2dd2f4986
ignore wl_surface.commit for xwayland clients
This is no longer needed
2023-11-21 20:16:26 -06:00
Leonardo Hernández Hernández
a0e79d8145
Do not send repeated xdg_toplevel.configure_bounds
Fixes: 32e66f45827cc8016ca2cef65ba61840f43fcc85
2023-11-21 20:15:46 -06:00
Leonardo Hernández Hernández
32e66f4582
resize clients on commit
Fixes: https://github.com/djpohly/dwl/issues/515
This reverts commit 4567979b16b0509bb80b6102ecb9b601b3cf6fa1.
2023-11-21 20:15:00 -06:00
link2xt
b4da97446a createkeyboard: do not segfault if xkb_keymap_new_from_names returns NULL
Passing NULL to wlr_keyboard_set_keymap results in a segfault.
Example:

  Thread 1 "dwl" received signal SIGSEGV, Segmentation fault.
  0x00007ffff7e49b64 in xkb_keymap_ref () from /usr/lib/libxkbcommon.so.0
  (gdb) bt
  #0  0x00007ffff7e49b64 in xkb_keymap_ref () at /usr/lib/libxkbcommon.so.0
  #1  0x00007ffff7f06389 in wlr_keyboard_set_keymap () at /usr/lib/libwlroots.so.11
  #2  0x000055555555bc54 in createkeyboard ()
  #3  0x000055555555c283 in inputdevice ()
  #4  0x00007ffff7e8101e in wl_signal_emit_mutable () at /usr/lib/libwayland-server.so.0
  #5  0x00007ffff7e8101e in wl_signal_emit_mutable () at /usr/lib/libwayland-server.so.0
  #6  0x00007ffff7edb52c in  () at /usr/lib/libwlroots.so.11
  #7  0x00007ffff7ee44b6 in  () at /usr/lib/libwlroots.so.11
  #8  0x000055555555fe66 in main ()
2023-11-19 01:14:35 -06:00
Leonardo Hernández Hernández
2751a6195d
do not try to enable adaptive sync 2023-11-18 11:20:56 -06:00
Leonardo Hernández Hernández
fcf324be6c
fix the position of the cursor image after turning all the monitors on 2023-11-17 19:03:23 -06:00
Leonardo Hernández Hernández
b8e933b9a9
remove unused #include 2023-11-17 11:03:33 -06:00
Leonardo Hernández Hernández
1044a21555
do not check if session is non-NULL
wlr_session_change_vt() is a no-op if session == NULL
2023-11-17 11:03:33 -06:00
Leonardo Hernández Hernández
6bcd5d8d87
do not explicitly destroy some wlroots interfaces
they are destroyed when the wayland display is destroyed
2023-11-17 11:03:32 -06:00
Leonardo Hernández Hernández
7611dc91d7
enable debug symbols by default
they does not affect performance and the size's increase is negligible
2023-11-17 11:03:32 -06:00
Leonardo Hernández Hernández
e95f14541a
fix docs
copied from tinywl
2023-11-17 11:03:32 -06:00
Leonardo Hernández Hernández
bca1b779aa
fix destroynotify() docs
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4421
2023-11-17 11:03:32 -06:00
Leonardo Hernández Hernández
7bdbab0400
check toplevel resource instead of client's xdg_shell to set bounds 2023-11-17 11:03:32 -06:00
Leonardo Hernández Hernández
dd25cdb56e
use the new wlroots function to get a toplevel from a wlr_surface
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4419
2023-11-17 11:03:32 -06:00
Leonardo Hernández Hernández
caac2d664d
explicitly return -1 in the first check in toplevel_from_wlr_surface 2023-11-17 11:03:31 -06:00
Leonardo Hernández Hernández
b1740056d5
do not use #ifdef -> #else -> #endif in client_is_x11
all other funcions use #ifdef -> #endif
2023-11-17 11:03:31 -06:00
Leonardo Hernández Hernández
0067c76cab
delete unused functions 2023-11-17 11:03:31 -06:00
Leonardo Hernández Hernández
22d21676b0
style fixes in client_is_float_type 2023-11-17 11:03:31 -06:00
Leonardo Hernández Hernández
d6c102d9db
correctly check if the scene node is enabled in client_is_rendered_on_mon 2023-11-17 11:03:31 -06:00
Leonardo Hernández Hernández
0e897608a1
do not use magical numbers to check edges
the interface is declared stable, which means we could just use 0 anyway
2023-11-17 11:03:31 -06:00
Leonardo Hernández Hernández
6d0ec595d3
simplify client_get_clip
the clips for xwayland and xdg clients are pretty similar, after all we only
need to adjust x and y for xdg clients
2023-11-17 11:03:31 -06:00
Leonardo Hernández Hernández
4f4c540bb9
prevent a use-after-free at exit 2023-11-17 11:03:30 -06:00
Leonardo Hernández Hernández
8e3f5364d3
do not compute layout box twice 2023-11-17 11:03:30 -06:00
Leonardo Hernández Hernández
2212363225
make sure fullscreen clients have the right size 2023-11-17 11:03:30 -06:00
Leonardo Hernández Hernández
6f8a3f9374
fix screen artifacts when setting gamma
the artifacts were caused because we tried to set the gamma right after
receiving the event, this resulted in two pending page-flips, which
not always play well together.

This also seems to fix a screen freeze when turning on a monitor that has
gamma.

Additionally the current method won't work once [0] is merged

[0]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4423
2023-11-17 11:01:30 -06:00
Leonardo Hernández Hernández
e1f3983bf8
use wlr_scene_subsurface_tree_set_clip
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4131
Closes: https://github.com/djpohly/dwl/issues/411
2023-11-14 19:44:43 -06:00
Leonardo Hernández Hernández
31bf1cbaf6
Revert "respect size hints"
This reverts commit 72e0a560d9836c5e8658003f548203bcd722e565.
2023-11-14 19:44:28 -06:00
Leonardo Hernández Hernández
d6fabe3a15
add a comment about chvt keybindings
Closes: https://github.com/djpohly/dwl/issues/427
2023-11-01 12:44:16 -06:00
Leonardo Hernández Hernández
a4a83e95e6
use newer cursor naming spec
References: https://www.freedesktop.org/wiki/Specifications/cursor-spec/
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4416
2023-11-01 12:28:19 -06:00
Leonardo Hernández Hernández
e45ded7eea
ignore maximize events for clients using xdg-shell v5 and newer 2023-11-01 12:16:02 -06:00
Leonardo Hernández Hernández
e5e74acfce
send maximized if tiled isn't supported (XDG shell)
wlroots doesn't do it automatically anymore

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4409
2023-11-01 12:04:59 -06:00
Leonardo Hernández Hernández
892a4d3ec7
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-10-13 17:10:25 -06:00
Leonardo Hernández Hernández
ab87410023
clarify the dependencies needed by dwl
Note that previous df131cdb78c6e3e79c3fafa522f0e4f6b43d2ab4 libX11 headers
were also required for building (but not for runtime)

Also, I want to apologize to the packagers for do not list *all* the required
dependencies before.
2023-10-11 20:08:44 -06:00
Leonardo Hernández Hernández
7085057f6d
update README.md
these things were changed in the code but not in the readme
2023-10-11 19:59:58 -06:00
Ben Collerson
8c79f8dc15
check client is mapped before setting border color
For some reason brave configured for as a wayland client triggers this code on startup and segfaults.

Checking if the client is mapped fixes this, like with the previous fix for urgent border colour.

References: 887fde65a3010905aa10f373cfcfe540cfc1781e
Fixes: 72a7d78a1a7926a207539eb50f44b2e1eb089d49
2023-10-10 10:16:11 -06:00
Leonardo Hernández Hernández
8781f4dbf5
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-10-09 22:37:36 -06:00
Leonardo Hernández Hernández
df131cdb78
use <xcb/xcb.h> instead of <X11/Xlib.h> 2023-10-09 22:33:37 -06:00
Leonardo Hernández Hernández
887fde65a3
only set border color for urgent *and* mapped X11 clients
this fixes a segfault when the client emits .set_hints but it's not mapped

Fixes: 72a7d78a1a7926a207539eb50f44b2e1eb089d49
2023-10-09 22:32:15 -06:00
Leonardo Hernández Hernández
b299e01e44
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-10-09 11:45:51 -06:00
Leonardo Hernández Hernández
6d9a915fb6
Revert "just add define"
I'm going to make some changes in the config file anyway

This reverts commit e5367753bb90add013ee5d170a110064298ac2c4.
2023-10-09 11:12:24 -06:00
Leonardo Hernández Hernández
935b852dc5
add [-d] flag to enable debug logging 2023-10-09 11:11:33 -06:00
Leonardo Hernández Hernández
a18c528300
simplify setting the border color of clients 2023-10-09 11:05:41 -06:00
Leonardo Hernández Hernández
72a7d78a1a
make the borders red borders for urgent clients
iirc this is the same behavior of dwm
2023-10-09 11:04:03 -06:00
Leonardo Hernández Hernández
d63f4078c5
use the same border colors as dwm 2023-10-09 11:03:06 -06:00
Leonardo Hernández Hernández
f4031590cd
add missing url about the COLOR macro 2023-10-05 22:06:30 -06:00
Leonardo Hernández Hernández
0ab1ed6530
add macro to configure colors
Closes: https://github.com/djpohly/dwl/issues/466
2023-10-05 22:03:59 -06:00
Forrest Bushstone
f695674361
Check if c is fullscreen before reparenting it to LyrFloating
Closes: https://github.com/djpohly/dwl/issues/487
2023-09-29 18:01:31 -06:00
Forrest Bushstone
aec21eca1f
make sure that fullscreen clients are on the correct screen when isfloating is true
Bug: https://github.com/djpohly/dwl/issues/487
2023-09-29 18:00:32 -06:00
Leonardo Hernández Hernández
342850487a
include dwl.desktop in the tarbal 2023-09-24 14:43:30 -06:00
Leonardo Hernández Hernández
1333f8cc6e
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-09-24 11:44:29 -06:00
Leonardo Hernández Hernández
5baf195523
allow specify DATADIR (to install desktop file) 2023-09-24 11:24:39 -06:00
Weiseguy
773bd04764 Add desktop entry file 2023-09-22 19:49:18 -06:00
Angelo Antony
755fcae2af fix typo 2023-09-10 10:42:33 -06:00
Leonardo Hernández Hernández
960c32a7d8
call setfloating in setmon
since in the previous commit we may not applying floating in clients
this is to make sure we do
2023-09-06 22:23:37 -06:00
Leonardo Hernández Hernández
aea8dd6ae1
return early if the client doesn't have monitor in setfloating
there is still a bug, but for now this prevents a segfault

Bug: https://github.com/djpohly/dwl/issues/472
2023-09-06 22:22:21 -06:00
Leonardo Hernández Hernández
c1d8b77f7f
prefer IRC over Discord
I regularly check the discord server, but it is much more likely that I will be
online on IRC, and djpohly does not seem to be active on either.
2023-08-23 00:32:15 -06:00
Ben Collerson
e5367753bb just add define 2023-08-22 22:20:39 -06:00
Ben Collerson
9be85c1117 tagcount should have been a #define 2023-08-22 22:20:39 -06:00
Leonardo Hernández Hernández
4b8c1bf31e
return nothing in xytonode()
we do not use the node
2023-08-22 14:48:29 -06:00
Devin J. Pohly
d7569870b6
Style: use early-return to clarify code
Use an early return to avoid indenting the main logic instead of
wrapping the tail of a function in an if statement.

No functional change, except for a handful of places where printstatus()
was being called spuriously (tag, toggletag, toggleview).

ΔSLOC: 0
2023-08-22 01:44:31 -06:00
Devin J. Pohly
4eb54b55f3
No need to send surface.leave/enter events
The scene graph implementation sends these for us, and it does so more
accurately than our overly-simplified approach.  Layer shell surfaces
don't appear to receive these events at all, according to my
WAYLAND_DEBUG experiments with bemenu and dtao.

ΔSLOC: -4
2023-08-22 01:44:31 -06:00
Leonardo Hernández Hernández
d4f2c6bfd6
chase wlroots!4288
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4288
2023-08-21 17:53:24 -06:00
Leonardo Hernández Hernández
4567979b16
don't resize clients on commit
It creates an infinite commit-resize loop when scale != 1
2023-08-18 21:37:22 -06:00
Leonardo Hernández Hernández
25db045392 set withdrawn state for xwayland invisible clients 2023-07-31 18:19:41 -06:00
Leonardo Hernández Hernández
78cf88670f add support for xdg-shell v6 2023-07-31 18:19:41 -06:00
Leonardo Hernández Hernández
ce997c4a21
update to xdg-shell v5 2023-07-23 21:15:06 -06:00
Leonardo Hernández Hernández
0e5405610e
add support for cursor-shape-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4106
2023-07-23 19:56:55 -06:00
Leonardo Hernández Hernández
0bb1a1cc5c
increase wl_compositor version
Now scene will handle sending the preferred buffer scale

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4269
2023-07-15 10:11:47 -06:00
Leonardo Hernández Hernández
aecff8cb26
Merge branch 'main' into wlroots-next 2023-07-13 22:36:48 -06:00
Leonardo Hernández Hernández
ca4a97b933 do not use wl_event_loop for signal handling
ΔSLOC: -4

Fixes: https://github.com/djpohly/dwl/issues/456
Fixes: https://github.com/djpohly/dwl/issues/459
2023-07-13 22:32:48 -06:00
Devin J. Pohly
76ba2cdab0 Remove now-unneeded call to motionnotify
This appears to have been here for the side effect of updating the drag
icon's position.
2023-07-13 22:17:03 -06:00
Devin J. Pohly
4b15bbeb33 Remove unused icon variable 2023-07-13 22:17:03 -06:00
Devin J. Pohly
831fc36bc9 Make drag_icon a persistent scene node
If there is no current drag icon, this node will be empty, but we now
have `drag_icon != NULL` as an invariant.  This allows us to eliminate a
conditional, since there's no harm in moving an empty node's coordinates
around with the pointer.

ΔSLOC: -1
2023-07-13 22:17:03 -06:00
Devin J. Pohly
1841527871 properly destroy scene
ΔSLOC: +1
2023-07-13 17:44:21 -06:00
Leonardo Hernández Hernández
ff7c0e9508
chase wlroots!4220
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4220
2023-07-10 11:23:19 -06:00
Devin J. Pohly
33bcd2e4ca Line saver: LISTEN_STATIC macro
This parallels the LISTEN macro for statically allocated listeners, and
it allows us to remove almost all of the global wl_listener
declarations.

This also fixes a bug with the axisnotify listener, which was declared
with a compound literal.  At block scope, these have automatic storage
duration [1], so the listener was no longer valid after setup()
returned.  (The option to declare it static explicitly was standardized
in C23, if that ever gains suckless traction.)

ΔSLOC: -27

[1]: https://en.cppreference.com/w/c/language/compound_literal#Explanation
2023-07-08 16:56:09 -06:00
Devin J. Pohly
fbd84aca4a Unify signal handling under wl_event_loop
Merge our signal handlers into a single function and let Wayland deal
with all the struct sigaction stuff.

ΔSLOC: -3
2023-07-03 22:28:27 -06:00
Devin J. Pohly
a01e402c5d Line saver: follow "local = wlr->data = obj" pattern
There were still a couple of places where we could use this handy
multiple assignment to save a line.

ΔSLOC = -3
2023-07-03 21:21:43 -06:00
Leonardo Hernández Hernández
9dd3f230c0
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-06-29 13:11:55 -06:00
Devin J. Pohly
eda0613cc4 Separate drag icon from layers array and Lyr enum
If we treat the drag icon as distinct from other layers (it doesn't have
contents that are interactive, focusable, etc.), then we can iterate
over layers meaningfully with a simple for loop.

ΔSLOC: -8
2023-06-25 17:44:00 -05:00
Leonardo Hernández Hernández
733114f0ca
schedule a frame after commmiting gamma
not doing it, may freeze the output or do not actually change the gamma until
creating a client
2023-06-24 10:09:49 -06:00
Leonardo Hernández Hernández
fdb66ccfa3
use detached output states to set gamma 2023-06-23 13:42:44 -06:00
Leonardo Hernández Hernández
6095ff84d2
Revert "use wlr_scene_output_build_state() to set gamma"
This reverts commit 65f68e76437275a0c1c25279af646f726e213b6d.
2023-06-23 13:30:43 -06:00
Devin J. Pohly
68a17f962e Don't bother with ignoring SIGCHLD
It added complexity, especially with the differences in behavior between
handled and ignored signals across an exec().
2023-06-16 00:24:17 -06:00
Devin J. Pohly
9c592da01f Reset ignored signal handler in spawn() as well 2023-06-16 00:24:17 -06:00
Devin J. Pohly
df11b7a786 fix startup_cmd SIGCHLD handler
Ignored handlers are not reset by exec() calls
2023-06-16 00:24:17 -06:00
Leonardo Hernández Hernández
1e1811f953
drop KDE idle support
use ext-idle-notify-v1 instead
2023-06-15 12:32:31 -06:00
Leonardo Hernández Hernández
dfb6b97159
drop support for wlr-input-inhibitor-unstable-v1
deprecated in favor of ext-session-lock-v1

References: 4aa366e3dd
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3848
2023-06-15 12:27:34 -06:00
Leonardo Hernández Hernández
65f68e7643
use wlr_scene_output_build_state() to set gamma 2023-06-15 12:22:43 -06:00
Leonardo Hernández Hernández
96ab92cdb1
use wlr_cursor_set_xcursor()
This avoids re-upload the cursor image in each motion event

Managing the scale is done by the function itself

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4170
2023-06-15 12:12:22 -06:00
Leonardo Hernández Hernández
1eb8a82ac4
Revert "avoid setting duplicate cursor image"
This reverts commit b5776e5180010ead5232efb36b2490f4fc9e1366.

See next commit for details
2023-06-15 12:02:30 -06:00
Leonardo Hernández Hernández
24a337e6ec
handle gamma-control-v1 set_gamma event
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4046
2023-06-08 23:35:46 -06:00
A Frederick Christensen
5215712cab Stray whitespace fixes 2023-06-07 17:47:36 -06:00
Leonardo Hernández Hernández
f3d017077a
use the new {a,di}ssociate events to handle xwayland commit listener 2023-06-02 22:08:17 -06:00
Leonardo Hernández Hernández
06bc65549f
chase wlroots map logic unification
Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me>
2023-06-02 22:03:41 -06:00
Leonardo Hernández Hernández
a8ccbe63f3
Merge branch 'main' into wlroots-next 2023-06-02 22:01:39 -06:00
Leonardo Hernández Hernández
9b9b79b35e
activate lock surface in updatemons
Fixes an issue when swaylock does not receive input after turn off and then
turn on the outputs
2023-06-02 21:56:09 -06:00
Leonardo Hernández Hernández
3d98907b98
send frame done even if output commit fails
Bug: https://github.com/djpohly/dwl/issues/420
Fixes: https://github.com/djpohly/dwl/issues/353
2023-06-02 21:51:47 -06:00
Nikita Ivanov
f8884ffc2b Set XCURSOR_SIZE 2023-06-01 19:11:33 -06:00
Leonardo Hernández Hernández
a5e45924ed
remove note about contact me for patch issues
I am no longer able to spend much time developing dwl let alone maintaining
other's patches :)
2023-05-28 00:20:20 -06:00
Leonardo Hernández Hernández
72adab621f destroy old client popups when focusing another client
Closes: https://github.com/djpohly/dwl/issues/408
2023-05-27 23:29:05 -06:00
Micah Gorrell
0729f18dce Prevent using a wlr_layer_surface after destroying it, due to no available outputs 2023-05-25 21:21:56 -06:00
Leonardo Hernández Hernández
2d1a40caf2
pass version to wlr_compositor_create()
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3696
Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me>
2023-04-14 12:25:05 -06:00
Leonardo Hernández Hernández
733754bb06
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-04-14 12:24:19 -06:00
Leonardo Hernández Hernández
797e0c74b2
correctly check if a scene node is enabled
checking only wlr_scene_node.enabled may result in a false positive because it
does not consider if its ancestors are enabled as well.
2023-04-13 13:12:27 -06:00
Leonardo Hernández Hernández
3c760bcd4a
remove unneeded check of m in arrange()
arrange must never be called with a NULL argument
2023-04-13 13:12:27 -06:00
Ben Collerson
da77e34ee5 Use uint32_t for ui Arg 2023-04-09 17:09:35 -06:00
Leonardo Hernández Hernández
20f61a59af
use fixed-size type for client tags
while the size of `int` in most compilers is 32-bits, the size of int and all
other integer types are implementation defined, so make sure we can use up to
32-bits
2023-04-08 11:29:18 -06:00
Ben Collerson
9d68554c59
remove tag labels from dwl
Tag labels are not used in dwl. Only the number of tags is important.
Tag labels should be defined for each tag in whatever status bar is
used.
2023-04-08 11:27:49 -06:00
Yves Zoundi
bbdf2a913b
display clients count in monocle symbol
- Replicate missing functionality from dwl to display the client count in monocle mode
  - Add ltsymbol field to Monitor struct
  - Display client count in monocle mode when greater than zero
- Tested with somebar and dwlb
2023-03-16 00:02:14 -06:00
Palanix
21930621ee Remove rootcolor 2023-03-13 09:40:40 -06:00
A Frederick Christensen
6722a89532 Missing apostrophe 2023-03-07 22:17:05 -06:00
Leonardo Hernández Hernández
eaf6dd2cd2
do not call dmabuf_create twice
it is called automatically by `wlr_renderer_init_wl_display()` but since we
need a pointer to wlr_linux_dmabuf_v1 to integrate it with scene API we need
to recreate that function.

Bug: https://github.com/emersion/xdg-desktop-portal-wlr/issues/216
Fixes: https://github.com/djpohly/dwl/issues/398
2023-03-07 22:04:32 -06:00
gan-of-culture
e4921fad28
add missing comma in "MonitorRule"
add a missing comma for the example
2023-02-25 15:59:23 -06:00
Leonardo Hernández Hernández
d1b36925c9
add support for linux-dmabuf-unstable-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3726
References: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml
2023-02-20 21:24:18 -06:00
godalming123
c69a2bec3f Fix spacing and replace it with tabs 2023-02-18 18:47:44 -06:00
godalming123
737688a6b1 fix spelling 2023-02-18 18:47:44 -06:00
Leonardo Hernández Hernández
fefcdbed4a
Merge remote-tracking branch 'upstream/main' into wlroots-next 2023-02-13 13:46:41 -06:00
pino-desktop
f8373ccf25
Fixed 'unused variable' compiler warning. 2023-02-13 13:43:28 -06:00
Ben Collerson
7f9a212476
Add appid field to printstatus() output
Adds an appid field to printstatus which can be used to monitor the
currently active application.
2023-02-13 13:30:27 -06:00
Leonardo Hernández Hernández
ab8334bd8a
implement repeatable keybindings 2023-02-13 13:18:43 -06:00
Leonardo Hernández Hernández
23ede80f74
allow configure x and y of outputs 2023-02-13 13:14:29 -06:00
Leonardo Hernández Hernández
04fdf1a295
add support for wp-fractional-scale-v1
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3511
2023-02-08 22:25:41 -06:00
Leonardo Hernández Hernández
fbe89a929f
chase wlroots!4000
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4000
2023-02-05 10:03:09 -06:00
Leonardo Hernández Hernández
e7f736ccc9
chase wlroots!3391
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3991
2023-02-02 10:30:24 -06:00
Job79
7ae5039b4f follow upstream xwayland_surface changes
wlroots removed the `wlr_surface_is_xwayland_surface` function, and renamed `wlr_xwayland_surface_from_wlr_surface` to `wlr_xwayland_surface_try_from_wlr_surface`.

related commit: fbf5982e38
2023-02-01 14:16:54 -06:00
Leonardo Hernández Hernández
f7d6a34cd9
use sigaction(2) for signal handling
References: http://git.suckless.org/dwm/commit/712d6639ff8e863560328131bbb92b248dc9cde7.html
2023-01-30 23:26:32 -06:00
Leonardo Hernández Hernández
cf9c5745e5
Merge remote-tracking branch 'upstream/main' into wlroots-next 2022-12-30 15:29:12 -06:00
Leonardo Hernández Hernández
8653b27692
bump version to 0.4 2022-12-30 14:46:52 -06:00
Leonardo Hernández Hernández
932c1d45f2
remove --long from git-describe command 2022-12-30 14:46:34 -06:00
Leonardo Hernández Hernández
dbe44e48c8
return early if selmon is not part of the output layout in dirtomon()
instead of checking twice
2022-12-30 14:31:56 -06:00
Leonardo Hernández Hernández
0b2c33248c
simplify check in urgent()
we only care if it returned a client or not
2022-12-30 14:29:19 -06:00
Leonardo Hernández Hernández
56114f700f
arrange monitor after updating fullscreen background and lock surfaces 2022-12-30 14:26:53 -06:00
Leonardo Hernández Hernández
71c7e4e1e5
also update locked_bg node position in updatemons() 2022-12-30 14:25:19 -06:00
Leonardo Hernández Hernández
72d29f1654
add blank lines to make updatemons() more readable 2022-12-30 14:21:46 -06:00
Leonardo Hernández Hernández
e523c2b82b
update comment about client_set_size() as no-op 2022-12-30 14:19:47 -06:00
Leonardo Hernández Hernández
6d0e3a5198
check if a client is resizing before checking if it's visible
It's not like it's noticeable, but theoretically this is faster
2022-12-30 14:15:21 -06:00
Leonardo Hernández Hernández
5347ed663d
only mark pending resizes as completed checking the configure serial 2022-12-30 14:14:06 -06:00
Leonardo Hernández Hernández
b39d270b9f
Merge branch 'main' into wlroots-next 2022-12-24 18:04:41 -06:00
Leonardo Hernández Hernández
05f4e23c43
bump version to 0.4-rc3 2022-12-24 17:54:19 -06:00
Leonardo Hernández Hernández
be854cab35
do not try to resize if size wouldn't change 2022-12-24 16:44:09 -06:00
Leonardo Hernández Hernández
6ca011430a
do not skip frames if a client is stopped and have a pending resize 2022-12-24 16:44:09 -06:00
Leonardo Hernández Hernández
7eaa01ac1f
Revert "Revert "fix flickering when resizing/spawning windows""
This reverts commit 4a32293548667e68cd9a103e22368b8db1754deb.
2022-12-24 16:44:09 -06:00
Leonardo Hernández Hernández
92e7752203
disable client's scene node after create it (only XDGShell)
will be enabled when setting up its monitor and arrange it

Bug: https://github.com/djpohly/dwl/issues/306
2022-12-24 16:44:09 -06:00
Leonardo Hernández Hernández
6682878009
call arrange() or resize() depending on c->isfloating in commitnotify 2022-12-24 16:43:31 -06:00
Leonardo Hernández Hernández
afacc9b0b5
force SSD when creating an xdg_toplevel_decoration object
Closes: https://github.com/djpohly/dwl/issues/366
Not sure why GLFW apps do not get mapped when we do not tell them the
decoration method
2022-12-20 21:53:45 -06:00
Leonardo Hernández Hernández
dd9d8d543c
remove selclient()
selclient() does not work well when dealing newly mapped
clients (specifically those mapped on invisible tags).

This fixes various bugs related to things not working because selclient() would
return NULL.

References: 94c8bd604870365bc201524b63158623e6f32a8f
2022-12-20 21:27:14 -06:00
Leonardo Hernández Hernández
686958a4cc
fix unset fullscreen for all visible clients when mapping a new one
this also changes our policy about when we unset fullscreen:

dwl will unset fullscreen for clients who share tags (and monitor) with a newly
mapped client, it does not matter if the clients are visible or not
2022-12-20 21:21:40 -06:00
Leonardo Hernández Hernández
1a3d89e5b2
call checkidleinhibitor() in arrange() and not in focusclient() 2022-12-16 18:54:33 -06:00
Leonardo Hernández Hernández
7b1fe7e5f2
fix checking idle inhibit state
checking `bypass_surface_visibility` first, could cause that even if the idle
inhibitor is being destroyed it will disable idle tracking

and if we couldn't get its scene tree, then assume that the surface is visible
2022-12-16 17:37:18 -06:00
Leonardo Hernández Hernández
803a9ba98d
Revert "Revert "Check that inhibitor scene tree is not null""
This reverts commit 035bb99d67b59a84cfc2e911d222fb597591a8be.

Not checking `tree != NULL` result in a segfault if the surface doesn't have a
role (for example because it is a newly created surface)

Closes: https://github.com/djpohly/dwl/issues/359
2022-12-16 17:20:59 -06:00
Ben Jargowsky
a39a46c908 Check width and height are not negative in client_set_bounds() 2022-12-15 23:42:53 -06:00
Leonardo Hernández Hernández
94c8bd6048
get sel from focustop() in focusstack()
Fixes: https://github.com/djpohly/dwl/issues/354
2022-12-09 20:55:58 -06:00
Leonardo Hernández Hernández
c60f651951
Revert "force line-buffered stdout if stdout is not a tty"
This reverts commit deb48ff48b186ff77a7e9d3b3ab724ff4c3c340f.

Fixes: https://github.com/djpohly/dwl/issues/253
2022-12-09 08:46:22 -06:00
Leonardo Hernández Hernández
98c7adfb3d
Merge remote-tracking branch 'upstream/main' into wlroots-next 2022-12-06 14:21:44 -06:00
Leonardo Hernández Hernández
79b051f242
implement ext-session-lock-v1 2022-12-06 14:11:41 -06:00
Leonardo Hernández Hernández
d42a977b5b
Revert "remove unneeded changes in commitnotify()"
This reverts commit 30c24a53ad2aaa842bc3b028ba0b98e3362dad7c.

Bug: https://github.com/djpohly/dwl/issues/349
2022-12-06 13:59:14 -06:00
Leonardo Hernández Hernández
4a32293548
Revert "fix flickering when resizing/spawning windows"
This reverts commit 017bb7d7521f68d37bfe656c10f45edbcc92dd61.

Bug: https://github.com/djpohly/dwl/issues/349
2022-12-06 13:58:56 -06:00
Leonardo Hernández Hernández
9136b6247d
return early if couldn't find the popup's parent 2022-12-06 13:34:35 -06:00
Leonardo Hernández Hernández
19b5d47a9e
fix popups appearing outside the monitor
and a potentially crash
2022-12-06 13:31:48 -06:00
Leonardo Hernández Hernández
b5229636a3
Merge remote-tracking branch 'upstream/main' into wlroots-next 2022-12-05 23:43:47 -06:00
Leonardo Hernández Hernández
c9a0a8bf6d
bump version to 0.4-rc2 2022-12-05 23:21:21 -06:00
Leonardo Hernández Hernández
22336612ae
improve type safety of toplevel_from_wlr_surface() 2022-12-05 23:18:02 -06:00
Leonardo Hernández Hernández
38bd00351a
merge toplevel_from_{wlr_layer_surface,popup} into client_from_wlr_surface
now it is a big function called toplevel_from_wlr_surface
2022-12-05 23:18:01 -06:00
Leonardo Hernández Hernández
c56bc42eb5
sort client_get_parent() 2022-12-05 23:18:01 -06:00
Leonardo Hernández Hernández
13b929d7d7
remove unneeded call to wlr_scene_rect_set_color()
wlr_scene_rect_create() requires a color as parameter
2022-12-05 23:06:53 -06:00
Leonardo Hernández Hernández
b6d6127733
add option for set button map 2022-12-05 22:22:49 -06:00
Leonardo Hernández Hernández
02c257e0b1
update for wlroots!3627
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3627
2022-12-05 20:21:38 -06:00
Dima Krasner
16a49e9955 fix null deref in sigchld() if Xwayland is disabled 2022-12-03 13:30:30 -06:00
Palanix
30c24a53ad
remove unneeded changes in commitnotify() 2022-12-03 13:14:10 -06:00
Palanix
017bb7d752
fix flickering when resizing/spawning windows
Fixes: https://github.com/djpohly/dwl/issues/306
2022-12-03 13:14:10 -06:00
Leonardo Hernández Hernández
fac3b6f2cf
use root surfaces to check idle inhibitors
References: https://github.com/djpohly/dwl/pull/343
2022-12-02 23:25:46 -06:00
Leonardo Hernández Hernández
035bb99d67
Revert "Check that inhibitor scene tree is not null"
This reverts commit 9c155eefdc018f878ea6950e6bd383b985401339.

This commit was applied just a workaround, the proper fix is the next commit
2022-12-02 23:25:04 -06:00
Leonardo Hernández Hernández
27ab9cf1b1
call updatemons() in requestmonstate()
This way we make sure that the Monitor's boxes are updated correctly
2022-12-02 23:17:05 -06:00
Ben Jargowsky
9c155eefdc Check that inhibitor scene tree is not null 2022-12-02 15:10:25 -06:00
Jan Beich
df34fdd483 chase default terminal in manpage after 7710cf050d1a 2022-12-02 10:52:34 -06:00
Leonardo Hernández Hernández
1b39bbf316
Merge remote-tracking branch 'upstream/main' into wlroots-next 2022-12-02 10:39:06 -06:00
Leonardo Hernández Hernández
4c6050331e
bump version to 0.4-rc1 2022-12-02 10:12:16 -06:00
Leonardo Hernández Hernández
eaf8a21603
unset fullscreen when mapping a client in the same monitor
Fixes: https://github.com/djpohly/dwl/issues/327
2022-12-02 10:09:50 -06:00
Leonardo Hernández Hernández
f929eaef1e
ask for version instead of commit in bug reports 2022-12-02 10:08:18 -06:00
Leonardo Hernández Hernández
ce1d040586
Merge branch 'main' of github.com:djpohly/dwl 2022-12-02 10:06:40 -06:00
Leonardo Hernández Hernández
b4fb1f77c7
fix xwayland clients being floating by default
Fix 3213088aa23e1f6cad1a5ba506dfb7318e1011c9
References: https://github.com/djpohly/dwl/pull/334#issuecomment-1333147730
2022-12-01 20:51:00 -06:00
Leonardo Hernández Hernández
6df6781b43
simplify check for surface's node state
all `struct wlr_surface` should have a `wlr_scene_tree *` as data
2022-11-30 18:54:54 -06:00
Leonardo Hernández Hernández
10c56d6348
add option to allow invisible surfaces to disable idle tracking 2022-11-30 18:51:35 -06:00
Leonardo Hernández Hernández
c91d21b68f
do not move/resize if grabbed client is fullscreen 2022-11-30 17:54:47 -06:00
Leonardo Hernández Hernández
3213088aa2
do not try to set the parent's same tags and monitor for xwayland clients
References: https://github.com/djpohly/dwl/pull/334#issuecomment-1330166324
2022-11-30 17:42:58 -06:00
8966342529 Merge remote-tracking branch 'origin/main' 2022-11-25 17:46:39 -08:00
krypek
87d87cc404 Fix comparison between signed and unsigned int
When c->bw is 0, the right side of the MAX functions gets turned into an unsigned integer and that results in -1 being the outcome.
This causes big issues in xwayland clients.
2022-11-25 12:09:35 -06:00
Leonardo Hernández Hernández
ea1b2dda63
Merge branch 'main' into wlroots-next 2022-11-21 20:51:30 -06:00
Leonardo Hernández Hernández
087373698a
Revert "Add a configuration option for fullscreen locking"
now all fullcreen clients are rendered above tiled and floating clients

This partially reverts commit 326eee14445f8a2c08e80c30778445630c75d3bb.
2022-11-21 20:50:39 -06:00
Leonardo Hernández Hernández
caec566286
create a dedicated layer for fullscreen clients
Bug: https://github.com/djpohly/dwl/issues/327
2022-11-21 20:50:26 -06:00
Leonardo Hernández Hernández
05eca0e2d9
rename xwayland_surface to xsurface
this save us 2 lines
2022-11-21 14:28:05 -06:00
Leonardo Hernández Hernández
7eebe67787
set x and y of the layersurface's geometry box 2022-11-21 14:28:05 -06:00
Leonardo Hernández Hernández
63d6de5866
fix set of layersurface->popups and surface->data 2022-11-21 14:28:04 -06:00
Leonardo Hernández Hernández
60a98b87f3
inhibit idle if surface's node is enabled 2022-11-21 14:28:04 -06:00
Leonardo Hernández Hernández
93a911d6e9
simplify if expression in checkidleinhibitor() 2022-11-21 14:28:04 -06:00
Leonardo Hernández Hernández
88d386bfdc
configurex11: resize floating clients and arrange tiled clients' monitor 2022-11-21 14:27:57 -06:00
Leonardo Hernández Hernández
972e3f3050
Merge branch 'wlroots-next' into main 2022-11-21 14:16:55 -06:00
548fac74e1 IPC patch applied
Along with customizations
2022-11-19 14:33:00 -08:00
Leonardo Hernández Hernández
569f554016
don't unfocus focused client when starting a drag
this fix chromium keyboard focus loss after a drag
Fix: 3cc22de712415342e4865eef099fcfde49bcf734
2022-11-19 01:34:15 -06:00
Leonardo Hernández Hernández
21ef004886
listen to the output request_state event;
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/2693
2022-11-15 23:52:21 -06:00
Leonardo Hernández Hernández
dae00caadd
update for wlroots!3861
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3861
2022-11-15 23:07:45 -06:00
Leonardo Hernández Hernández
5eb3529275
use the new scene helper for drag icons 2022-11-15 23:07:21 -06:00
Leonardo Hernández Hernández
359e7edc52
update for wlroots!3814
References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3814
2022-11-15 23:04:39 -06:00
Leonardo Hernández Hernández
25dfdcc433
specify layer shell version 2022-11-15 23:04:02 -06:00
Leonardo Hernández Hernández
fcb3fa4e90
Merge remote-tracking branch 'upstream/main' into wlroots-next 2022-11-10 23:25:48 -06:00
Leonardo Hernández Hernández
b59c7f6a2e
config.def.h: fix comment
Fixes: https://github.com/djpohly/dwl/issues/333
2022-11-10 23:14:03 -06:00
shua
f1639ba9d5
check null in toplevel_from_popup
managed to SEGFAULT the server by trying to create a popup
without setting a parent first.

Not sure if this is dwl or wlroots issue, so also opened a ticket upstream: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3811
2022-11-09 00:01:50 -06:00
Leonardo Hernández Hernández
8bd3442575
layersurface: create a dedicated scene tree for popups
this tree should be always above the top layer

Fixes: https://github.com/djpohly/dwl/issues/328
2022-11-01 12:52:25 -06:00
Leonardo Hernández Hernández
3cc22de712
client: don't change border color during drags
Fixes: https://github.com/djpohly/dwl/issues/318
2022-10-31 23:46:02 -06:00
Leonardo Hernández Hernández
448a96de13
remove now unneeded workaround in outputmgrapplyortest() 2022-10-30 01:03:44 -05:00
Leonardo Hernández Hernández
99f062273e
only destroy monitor's layer surfaces at destroy 2022-10-29 19:02:44 -05:00
Leonardo Hernández Hernández
8298f20a71
allow change adaptive sync in outputmgrapplyortest() 2022-10-29 18:30:09 -05:00
Leonardo Hernández Hernández
6a0ec2a8c3
Merge remote-tracking branch 'upstream/main' into wlroots-next 2022-10-29 18:11:28 -05:00
Leonardo Hernández Hernández
846ce52b92 fix crash in dirtomon() when selmon is disabled 2022-10-29 16:48:50 -05:00
Leonardo Hernández Hernández
a9e2ebaf41 closemon() now updates selmon if needed 2022-10-29 16:48:50 -05:00
Leonardo Hernández Hernández
9b5f0f0fc5 use just one loop in outputmgrapplyortest()
we do the magic in updatemons()
2022-10-29 16:48:50 -05:00
Leonardo Hernández Hernández
cb01ce9bcf move focus and clients off disabled monitors 2022-10-29 16:48:50 -05:00
Leonardo Hernández Hernández
9588b46b5c
only raise the client's node in monocle()
Fixes: https://github.com/djpohly/dwl/issues/326
2022-10-29 16:47:17 -05:00
Leonardo Hernández Hernández
2f7834b130
sort util.c functions 2022-10-29 14:57:22 -05:00
Leonardo Hernández Hernández
f494891a9a
limit the line length to 79 in the readme 2022-10-29 14:47:24 -05:00
Leonardo Hernández Hernández
fd2c47cb70
mention the polkit dependency when using elogind or systemd-logind
Bug: https://github.com/djpohly/dwl/issues/138
2022-10-29 14:09:38 -05:00
Leonardo Hernández Hernández
1eeb3689d3
add support for the ext-idle-notify-v1 protocol
for now we use macros to support both KDE idle and ext-idle, wlroots will
likely drop support for KDE idle in 0.17
2022-10-23 14:41:28 -05:00
Leonardo Hernández Hernández
e9826de295
Revert "stop trying resize clients during commitnotify()"
This reverts commit 2d9d758c8dec083178ff78b154da784b97260bd1.

wasn't meant to be pushed to main
2022-10-15 18:25:58 -05:00
Leonardo Hernández Hernández
110cde8f67
update comment about exclusive focus in focusclient() 2022-10-15 18:09:42 -05:00
Leonardo Hernández Hernández
2d9d758c8d
stop trying resize clients during commitnotify()
instead resize them in configurex11()
2022-10-15 18:00:55 -05:00
Leonardo Hernández Hernández
332ceb7136 allow unmanaged clients (like dzen or dmenu) to have keyboard focus 2022-10-15 18:00:24 -05:00
Leonardo Hernández Hernández
9e912cf790
delete the idle protocol xml file 2022-10-13 22:05:09 -05:00
Leonardo Hernández Hernández
4eabf6f7eb
disable and destroy monitor's layer surfaces when it's being destroyed
Fixes: https://github.com/djpohly/dwl/issues/314
2022-10-11 13:11:14 -05:00
Leonardo Hernández Hernández
765656902f
use /* */ for comments in applybounds() 2022-10-08 20:51:40 -05:00
Leonardo Hernández Hernández
1438dfc150
fix bad indentation in createpointer() 2022-10-08 20:51:05 -05:00
Leonardo Hernández Hernández
3902fba769
rename dragicondestroy() -> destroydragicon()
to match the rest of the code
2022-10-08 20:50:17 -05:00
Leonardo Hernández Hernández
7f3c9fa0ae
rename LyrNoFocus -> LyrDragIcon 2022-10-08 20:48:48 -05:00
Leonardo Hernández Hernández
952fde68a3
correctly handle cursor motion when button is held (for layer surfaces) 2022-10-08 13:02:43 -05:00
Dima Krasner
0d1ca4663c
allow moveresize() while the left mouse button is pressed
Fixes: https://github.com/djpohly/dwl/issues/319
2022-10-08 12:31:29 -05:00
Leonardo Hernández Hernández
f6820a6c29
fix drag and drop not working
this fixes another issue where the cursor doesn't change when selecting text
but there is still an issue about not changing border color of clients during
dnd operations

Bug: https://github.com/djpohly/dwl/issues/318
2022-10-07 10:45:45 -05:00
Leonardo Hernández Hernández
87c4c1f629
convert some warnings to errors 2022-10-05 21:28:14 -05:00
Leonardo Hernández Hernández
8559141b30
avoid usage of goto
Based on this suggestion: bc72af6e24 (commitcomment-85592855)
2022-10-03 23:28:58 -05:00
Leonardo Hernández Hernández
434ed119f3
wlroots check map state of layersurfaces this for us 2022-10-01 23:33:17 -05:00
Leonardo Hernández Hernández
ae3d435717
Merge remote-tracking branch 'djpohly/main' into wlroots-next 2022-10-01 23:30:47 -05:00
Leonardo Hernández Hernández
b8bc54b65d properly handle cursor motion when button is held
Based on: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3653
2022-10-01 23:10:54 -05:00
Leonardo Hernández Hernández
b5776e5180
avoid setting duplicate cursor image
Reference: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3436
Based on: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3595
2022-09-28 17:11:04 -05:00
Leonardo Hernández Hernández
c13d948ea9
destroy renderer and allocator in cleanup() 2022-09-28 14:15:25 -05:00
Leonardo Hernández Hernández
fc8b2a8335
fix bad condition 2022-09-26 20:31:36 -05:00
Leonardo Hernández Hernández
c00faae263
fix various segfaults when selmon is NULL 2022-09-26 19:07:45 -05:00
Leonardo Hernández Hernández
e46238b95e
change cursor surface in internal calls of motionnotify()
and call motionnotify() after unmapping a client
and when focusing a client

Fixes: https://github.com/djpohly/dwl/issues/308
2022-09-26 13:17:07 -05:00
Leonardo Hernández Hernández
2385d82612
remove unused variables 2022-09-20 23:40:35 -05:00
Leonardo Hernández Hernández
31106eff64
rework Makefile
- allow user to use a different pkg-config binary
- restore almost all (and add other ones) warning flags (-Werror is not set)
- $(XWAYLAND) is added to our CPPFLAGS
- remove useless comments
- don't generate idle-protocol.h (not used)
2022-09-20 23:34:48 -05:00
Leonardo Hernández Hernández
1fdc65ff93
make more permissive exclusive focus
now you can call focusstack() while a layer surface is focused and when it gets
unmapped the newly focused clients will be actually focused
2022-09-18 17:25:12 -05:00
Leonardo Hernández Hernández
fbaeb85363
now really fix clients not being focused after unmapping a layer surface 2022-09-18 17:23:07 -05:00
Leonardo Hernández Hernández
570e6e2c27
fix clients not being focused after destroy a layer surface 2022-09-18 16:52:54 -05:00
Leonardo Hernández Hernández
a1b33826cf
Revert "remove useless check of m in arrangelayers()"
This partially reverts commit d14ee99661e420c8e3d8fcc6791429a0e08bd915.

Checking if the output is enabled is necessary to avoid a segfault later
2022-09-18 16:36:38 -05:00
Leonardo Hernández Hernández
d11358762d
add missing library (xcb-icccm)
this library is also used by wlroots, so nothing new
2022-09-18 15:49:30 -05:00
Leonardo Hernández Hernández
7710cf050d
change the default term to foot
it is closer to the suckless philosophy (foot implements things that the suckless
guys would say that should be done by tmux or something else, but I have no
desire to create a new terminal emulator, and the best fit is foot)

also alacritty uses +100Mb of memory, more that dwl itself (~90Mb)
and foot only ~20Mb
2022-09-18 15:37:16 -05:00
Leonardo Hernández Hernández
d14ee99661
remove useless check of m in arrangelayers()
it is supossed to avoid a crash when we pass m=NULL as argument
however it would crash anyway and also because we should not pass m=NULL
2022-09-18 15:35:54 -05:00
Leonardo Hernández Hernández
cd96f889b8
fix use of loop initial declaration
forbidden by the suckless style
2022-09-18 15:35:54 -05:00
Leonardo Hernández Hernández
bc72af6e24
fix unmanaged clients not being unlinked from the commit listener 2022-09-18 15:35:54 -05:00
Leonardo Hernández Hernández
bcc8ce7a40
fix segfault when unlocking swaylock on two monitor setup
wlr_*_surface_from_wlr_surface() can return NULL if the surface
is being destroyed

Fixes: https://github.com/djpohly/dwl/issues/305
2022-09-18 15:35:54 -05:00
Leonardo Hernández Hernández
ba7dcb2dea
don't try to move outputs when its x,y hasn't change
when using wlr_output_layout_move() wlroots internally
change the state of the output to manually configured and
when updating the layout these outputs aren't ignored by
wlroots, leaving us at our own
2022-09-10 23:54:57 -05:00
Leonardo Hernández Hernández
c8a9f63451
prior run the startup command start the backend
this allow use clients like wlr-randr in the startup command
2022-09-10 23:54:56 -05:00
Leonardo Hernández Hernández
fd67087a82
make sure the parent is mapped prior set monitor and tags 2022-09-10 23:45:14 -05:00
Leonardo Hernández Hernández
77ba8e5127
use wl_container_of() instead of data in some functions 2022-09-10 23:44:19 -05:00
Leonardo Hernández Hernández
c509046663
add some comments 2022-09-10 23:42:58 -05:00
Leonardo Hernández Hernández
93de6e82a2
inline input_device in virtualkeyboard() 2022-09-10 22:25:46 -05:00
Leonardo Hernández Hernández
f8f94c97f5
fix idle inhibitor check
previously we tried to get a client from the surface and then compare it with
the excluded surface, if we cannot get a client from the surface (e.g: a layer
surface) it just ignored all the next idle inhibitors no matter what

What I have should done is just checking if the excluded surface is equal to
the current idle inhibitor's surface and continue in case it is.
2022-09-10 22:11:06 -05:00
Leonardo Hernández Hernández
1bb9c4583a
fix exclusive zone of unmapped layer surfaces
Fixes: https://github.com/djpohly/dwl/issues/302
2022-09-10 18:54:35 -05:00
Leonardo Hernández Hernández
9bcef3d040
resize the fullscreen background when resize the client 2022-09-08 16:35:55 -05:00
Leonardo Hernández Hernández
ae42e4390b
update link to input-protocols 2022-09-08 00:25:26 -05:00
Leonardo Hernández Hernández
303fc72b12
append -dev to $(_VERSION) (should have added it a long time ago) 2022-09-08 00:13:03 -05:00
Leonardo Hernández Hernández
871463c327
define _POSIX_C_SOURCE through CPPFLAGS
like dwm
2022-09-08 00:10:53 -05:00
Leonardo Hernández Hernández
d1496a2a9b
fix condition that always evaluate to false in commitlayersurfacenotify() 2022-09-07 23:54:57 -05:00
Leonardo Hernández Hernández
80084839a9
remove obsolete check of c->mon in fullscreennotify()
since 19a8a095ebe782065903b9a03670560371302206 it's checked in setfullscreen()
2022-09-07 23:24:50 -05:00
Leonardo Hernández Hernández
1aacfada29
set c->prev in setmon() and not in mapnotify() 2022-09-06 13:23:19 -05:00
Leonardo Hernández Hernández
dc59f7733d
enable adaptive sync if supported
but don't cause monitors to be ignored if it fails
2022-09-06 00:35:20 -05:00
Leonardo Hernández Hernández
14c010a0d6
only enable/disable clients from the specified monitor in arrange()
also fix a crash when m is null, this can only happen when selmon is NULL
2022-09-06 00:10:00 -05:00
Leonardo Hernández Hernández
14a1e3e2a2
set c->prev in mapnotify()
Closes: #300
2022-09-05 16:35:51 -05:00
Dmitry Zakharchenko
a94d089c40 Minor changes to README 2022-09-05 16:15:54 -05:00
Dmitry Zakharchenko
e91f71e8d6 Add direct irc link
Also, move IRC section to the top so that it's more accessible.
2022-09-02 20:14:18 -05:00
Leonardo Hernández Hernández
68576799b9
don't arrange layers on disabled monitors 2022-09-02 18:49:20 -05:00
Leonardo Hernández Hernández
19a8a095eb
call setfullscreen() in setmon()
this will help when sending to another monitor a fullscreen client
and also will prevent a crash when a client request fullscreen when it has no monitor
2022-09-02 18:22:15 -05:00
Leonardo Hernández Hernández
1f59b76d77
prevent segfault when destroying monitors
also don't count unmapped surfaces for exclusive zone
and exclusive_focus is now of type `void *`
2022-09-02 18:17:53 -05:00
Leonardo Hernández Hernández
40b1c0b849
Revert "Revert "various improvements to layer surface""
This reverts commit c017916d35795cf85e5181907f5e97a1d702612a.
2022-09-02 16:54:53 -05:00
Leonardo Hernández Hernández
c017916d35
Revert "various improvements to layer surface"
see https://github.com/djpohly/dwl/issues/289#issuecomment-1231287114

This reverts commit 226051974060746d02d787ac1ef70b6267ee51b4.
2022-08-31 16:05:19 -05:00
Leonardo Hernández Hernández
2260519740 various improvements to layer surface
- remove various useless assignments of layersurface->mon
- styles changes
- do not set wlr_layer_surface->output to NULL at destroy
2022-08-29 21:32:59 -05:00
Leonardo Hernández Hernández
0e993b5fb1
conform the idle inhibitor protocol
previously we disable idle tracking simply due to the fact that it exist
2022-08-28 22:40:11 -05:00
Leonardo Hernández Hernández
83e37820d7
add support for the single pixel buffer protocol 2022-08-28 22:15:57 -05:00
Leonardo Hernández Hernández
d738573e22
new function to notify keyboard enter 2022-08-27 16:34:29 -05:00
Leonardo Hernández Hernández
b9295e8cee
sort client.h functions 2022-08-27 16:33:46 -05:00
Leonardo Hernández Hernández
e0cc5b046c
Merge remote-tracking branch 'djpohly/main' into wlroots-next 2022-08-26 18:26:36 -05:00
Leonardo Hernández Hernández
406aebcbd2
prevent an infinite loop if try to use focusmon() with all monitors disabled 2022-08-25 00:20:21 -05:00
Leonardo Hernández Hernández
dfcd142ce4
don't try to set monitor for clients in createmon()
this is done in updatemons()
2022-08-23 13:29:12 -05:00
Leonardo Hernández Hernández
07bf1832bf
set monitor for clients that don't have one in updatemons()
only if selmon is enabled and the clients are mapped
2022-08-23 13:28:01 -05:00
Leonardo Hernández Hernández
174919ec53
set monitor for clients that don't have one on monitor creation 2022-08-18 16:55:13 -05:00
Leonardo Hernández Hernández
a7f77160d1
don't respect size hints for fullscreen clients
Fixes: #292
2022-08-16 21:39:42 -05:00
Leonardo Hernández Hernández
7a343b98cf
change type of c->bw: int -> unsigned int 2022-08-13 00:41:08 -05:00
Leonardo Hernández Hernández
8d2516e83c
reorder isfullscreen in Client definition 2022-08-13 00:38:08 -05:00
Leonardo Hernández Hernández
f173c56c32
initialize to zero the box used in commitnotify() 2022-08-13 00:12:46 -05:00
Leonardo Hernández Hernández
28af37cd1f
handle client_from_wlr_surface() receiving a subsurface 2022-08-12 23:58:11 -05:00
Leonardo Hernández Hernández
48396a1bf8 fix crash when setting a custom mode 2022-08-12 23:21:25 -05:00
Leonardo Hernández Hernández
b6e3fc1645 rework outputmgrapplyortest()
first disable requested monitors, then enable and/or change mode, x and y, etc.
This is mostly what sway does
2022-08-12 23:21:25 -05:00
Devin J. Pohly
3431ac165d 2200: let's use this wisely
Looks like [suckless-dev] was right about one thing.
2022-08-12 23:21:00 -05:00
Leonardo Hernández Hernández
6ce035303e
fix dist target 2022-08-08 21:30:37 -05:00
Leonardo Hernández Hernández
620fd9dc56
use git describe to generate version 2022-08-08 21:19:16 -05:00
Leonardo Hernández Hernández
662e06e68e
check client_from_wlr_surface() returning NULL in urgent()
fix #281
2022-07-30 14:44:17 -05:00
Dima Krasner
9d2eb8483b fix segfault if parent->mon is unset 2022-07-25 01:19:36 -05:00
Leonardo Hernández Hernández
7eee0a8229
use the layer surface to create popups 2022-07-24 16:43:13 -05:00
Leonardo Hernández Hernández
b04c73be3d
make sure we do not create a double fullscreen_bg
and also make sure we do not destroy it if it does not exist
Fixes: #274
2022-07-23 13:28:15 -05:00
Leonardo Hernández Hernández
8cdb997126
conform the xdg-protocol with fullscreen translucent clients
see `setfullscreen()` for more info
2022-07-23 02:17:00 -05:00
Leonardo Hernández Hernández
90a12c90a0
always set the same monitor and tags for child clients of a client
fixes #272
2022-07-19 20:13:56 -05:00
Leonardo Hernández Hernández
e082292606
do not focus clients if a layer surface is focused 2022-07-19 12:24:24 -05:00
Dima Krasner
deb48ff48b force line-buffered stdout if stdout is not a tty 2022-07-19 12:18:16 -05:00
Leonardo Hernández Hernández
c70db2d06a
Revert "only call wlr_seat_keyboard_notify_enter() if a keyboard is found"
This reverts commit 8e03bce6217117f0687cd727ae2c47bdd3c0fe5a.
fixes #270
2022-07-19 11:52:42 -05:00
Leonardo Hernández Hernández
e98719f552
remove a useless check
if `s->role_data == NULL`, wlr_*_surface_from_wlr_surface() will return NULL
and we are checking it
2022-07-15 00:48:28 -05:00
Leonardo Hernández Hernández
058c699ac2
only set bounds for clients that support it 2022-07-15 00:27:31 -05:00
David-Valters
af12e777f2 Update README.md 2022-07-13 20:19:43 -05:00
Leonardo Hernández Hernández
8e03bce621
only call wlr_seat_keyboard_notify_enter() if a keyboard is found 2022-07-07 00:21:51 -05:00
Leonardo Hernández Hernández
87fc3a58ab
check pointer focus in arrange() 2022-07-06 23:48:53 -05:00
Leonardo Hernández Hernández
0eff78d6c2
include DWLCFLAGS into linking step 2022-07-06 23:41:42 -05:00
Leonardo Hernández Hernández
c6d97f1db7
arrange client's monitor if size has change since last commit 2022-07-06 22:20:21 -05:00
Leonardo Hernández Hernández
829dec6598
resize now takes struct wlr_box as parameter 2022-07-06 22:18:46 -05:00
Leonardo Hernández Hernández
ff70337c16
check current and pending geometry to set c->resize to zero
Fixes #260
2022-07-06 22:16:00 -05:00
Ben Jargowsky
7cc6c640e2 Checks for overflows for client max width and height 2022-06-29 00:35:06 +02:00
Leonardo Hernández Hernández
72e0a560d9
respect size hints 2022-06-24 19:19:20 -05:00
Leonardo Hernández Hernández
2aa391361c
inline unmaplayersurface() into unmaplayersurfacenotify()
unmap signal is guaranted to be emitted before destroy signal
so is useless checking if it is mapped at destroy
2022-06-24 15:36:13 -05:00
Leonardo Hernández Hernández
549335ae54
avoid layer surface popups appearing below x{dg,wayland} clients 2022-06-24 14:46:08 -05:00
Leonardo Hernández Hernández
097b4a30f5
unconstrain layer shell popups from monitor size
unconstrain other popups from monitor usable area
2022-06-24 14:30:52 -05:00
Leonardo Hernández Hernández
461d02d3e0
chase wlroots input_device changes 2022-06-21 16:25:18 -05:00
Leonardo Hernández Hernández
c1578bc14d
use LayerSurface.mon when possible 2022-06-21 16:03:20 -05:00
Leonardo Hernández Hernández
9b84940e37
unconstrain layer shell popups
also unconstrain popups from monitor's usable area
2022-06-21 00:23:21 -05:00
Leonardo Hernández Hernández
79ad72413d
don't set c->isfullscreen to zero
calloc initializes all fields to zero
2022-06-20 18:05:16 -05:00
Sevz
74fce9d918
Merge pull request #257 from fauxmight/bar_options
Add known dwl status bar options to README
2022-06-18 13:00:08 -05:00
A Frederick Christensen
553ba5b7c8 Add known dwl tag status bar options to README.md 2022-06-18 03:04:00 -05:00
Leonardo Hernández Hernández
4ae6d0f387
move ugglyness to client.h 2022-06-16 15:54:13 -05:00
Leonardo Hernández Hernández
2ef5abfb72
remove unneeded check in focusclient() 2022-06-16 15:36:27 -05:00
Sevz
8076b47cc6
Merge pull request #251 from gwnichol/fixinstall
Fix make install while files are in use
2022-06-14 15:43:09 -05:00
Sevz
3a77f02919
Merge pull request #247 from Humm42/xkboptions
initialize xkb_rules.options to a null pointer
2022-06-14 15:42:47 -05:00
Leonardo Hernández Hernández
d26ddfc7fd
kill child process in cleanup() 2022-06-14 15:31:39 -05:00
Grant Nichol
671a9b450b
Fix make install while files are in use
When the dwl executable is in use, cp fails without the -f flag.

POSIX defines this flag with:
> If a file descriptor for a destination file cannot be obtained,
> as described in step 3.a.ii., attempt to unlink the destination
> file and proceed.
2022-06-12 15:58:38 -05:00
Leonardo Hernández Hernández
583f471cfe
add some blank lines 2022-06-10 12:32:22 -05:00
Marco Siedentopf
8bce3b1583
add click method configuration option
Add the libinput configuration option to choose between Software Button Areas and Clickfinger
2022-06-10 12:27:40 -05:00
Leonardo Hernández Hernández
c008bf2a7d
add $(LIBS) to $(LDLIBS) 2022-06-10 12:21:23 -05:00
Dima Krasner
c990dbd441 fix link failure with --as-needed 2022-06-10 19:26:45 +03:00
Leonardo Hernández Hernández
a32db11f16
set client bounds at resize 2022-06-09 12:45:42 -05:00
Leonardo Hernández Hernández
948fdcf709
use xdg-shell v4 2022-06-09 12:45:02 -05:00
Leonardo Hernández Hernández
4b890336e2
use xdg-shell v3 2022-06-07 00:55:41 -05:00
Leonardo Hernández Hernández
c7007b4811
chase wlroots scene-tree changes 2022-06-07 00:31:58 -05:00
Leonardo Hernández Hernández
d969289baf
use LDFLAGS to build dwl target 2022-06-06 23:36:45 -05:00
Leonardo Hernández Hernández
50b6630f3d
do not generate *-protocol.{c,o}
according with
62fbf3f4ba
they are unused and wlroots-based compositors don't need to do this
2022-06-06 22:54:40 -05:00
Leonardo Hernández Hernández
14641560b0
include xcb only when building with xwayland support 2022-06-06 22:53:36 -05:00
KawaiiAmber
7b42232ad1
convert makefile to be more portable 2022-06-06 22:53:36 -05:00
Leonardo Hernández Hernández
a5a0674f6a
improve client_from_wlr_surface() 2022-06-06 22:51:58 -05:00
Leonardo Hernández Hernández
4dfa45659a
fix compiler error with gcc complaining about parentheses
dwl.c: In function ‘unmaplayersurface’:
dwl.c:2253:9: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
 2253 |         layersurface->layer_surface->mapped = layersurface->mapped = 0;
      |         ^~~~~~~~~~~~
cc1: all warnings being treated as errors
make: *** [<builtin>: dwl.o] Error 1

clang not affected
2022-06-05 16:57:20 -05:00
Leonardo Hernández Hernández
b91017e713
disable scene node at unmaplayersurface() 2022-06-05 15:27:40 -05:00
Lennart Jablonka
70da04a714 initialize xkb_rules.options to a null pointer
Initializing it to an empty string had broken configuring xkbcommon
through the environment (XKB_DEFAULT_OPTIONS).

Fixes: ae313911153b ("initialize rules and xkb_rules")
2022-06-03 01:23:35 +02:00
Leonardo Hernández Hernández
2623a96ebf
call client_set-size() if client has a resize 2022-05-27 00:19:17 -05:00
Leonardo Hernández Hernández
52e0d00942
check client_surface() returning NULL
now client_surface()->data is a pointer to the wlr_scene_tree of clients
which allows us to not call wlr_scene_node_lower_to_bottom() for every clients
2022-05-25 17:12:44 -05:00
Leonardo Hernández Hernández
7018b9b65c
correct libinput function name for drag_lock 2022-05-25 15:01:38 -05:00
Leonardo Hernández Hernández
48ec914f43
destroy layersurface's scene node in destroylayersurfacenotify() 2022-05-25 14:49:32 -05:00
Leonardo Hernández Hernández
40449fa64f
add a new function to get a client from a wlr_surface 2022-05-23 10:55:28 -05:00
Ben Jargowsky
ecbc2c61db Add configuration options for touchpads 2022-05-23 00:01:47 +02:00
Leonardo Hernández Hernández
283c043b5c
chase wlroots scene-surface refactor 2022-05-21 20:44:08 -05:00
Leonardo Hernández Hernández
88a8b784d0
Merge remote-tracking branch 'djpohly/main' into wlroots-next
chase wlroots X11 hints update
2022-05-17 15:31:31 -05:00
Leonardo Hernández Hernández
8870ba0bb8
implement urgency hints for xwayland clients 2022-05-17 14:38:18 -05:00
Leonardo Hernández Hernández
5de68ba713
sync manpage and help info
Signed-off-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
2022-05-17 13:26:57 -05:00
Leonardo Hernández Hernández
79a148224f
specify version in wlr_xdg_shell_create() 2022-05-15 17:17:58 -05:00
Ben Jargowsky
2f8736b986 Check if XWayland client size_hints are NULL 2022-05-15 23:09:21 +02:00
Leonardo Hernández Hernández
3c11ad9aa6
fix segfault when dragging chromium tabs 2022-05-14 00:29:35 -05:00
Ben Jargowsky
06d9230a96 Run focusclient when switching to monocle layout 2022-05-13 10:20:28 +02:00
Leonardo Hernández Hernández
dca68f9aa1
Merge remote-tracking branch 'djpohly/main' into wlroots-next 2022-05-10 20:08:41 -05:00
Leonardo Hernández Hernández
22bd75226b
remove trailing whitespaces 2022-05-10 11:42:40 -05:00
Leonardo Hernández Hernández
063736f898
add -v flag to the manpage
Thanks @Humm42
2022-05-10 11:39:33 -05:00
Leonardo Hernández Hernández
d5a741c9b4
add dist target 2022-05-09 16:25:03 -05:00
Leonardo Hernández Hernández
5d8084daa7
add flag to print version and exit 2022-05-09 16:24:36 -05:00
Sevz
07d56c6d7b
Merge pull request #230 from BenJarg/null-wlr_seat_get_keyboard
Handle 'wlr_seat_get_keyboard' possibly returning null.
2022-05-09 13:18:19 -05:00
Ben Jargowsky
e0d310fd84 Handle 'wlr_seat_get_keyboard' possibly returning null. 2022-05-09 14:00:21 +02:00
Leonardo Hernández Hernández
31fa6600a1
replace wlr_xwayland_surface_size_hints with xcb_size_hints_t 2022-05-08 17:51:42 -05:00
Leonardo Hernández Hernández
3a4b7d104f
restack xwayland surface on focusclient() 2022-04-29 17:45:02 -05:00
Ben Jargowsky
d071a899f3 Run printstatus() when a monitor is removed 2022-04-25 13:50:53 -07:00
Leonardo Hernández Hernández
dc7709a00e
schedule a configure on maximize request
see maximizenotify() for more info
2022-04-16 15:51:13 -05:00
Leonardo Hernández Hernández
a48ce99e6a
use pointer math in xytonode() 2022-04-15 17:40:02 -05:00
Leonardo Hernández Hernández
4a2e761914
replace deleted EBARF() with die() 2022-04-12 23:52:05 -05:00
Leonardo Hernández Hernández
b86fcf6504
add missing return in client_is_floating_type()
This causes all Xwayland clients to be treated as floating
2022-04-10 21:38:48 -05:00
Leonardo Hernández Hernández
29a2b647b2
Merge remote-tracking branch 'djpohly/main' into HEAD 2022-04-08 21:12:32 -05:00
Leonardo Hernández Hernández
c00697e643
abc 2022-04-05 23:04:04 -05:00
Leonardo Hernández Hernández
af741e586b
typedefs: abc 2022-04-05 22:15:46 -05:00
Leonardo Hernández Hernández
02ac9378c4
includes: abc 2022-04-05 22:07:59 -05:00
Devin J. Pohly
437aea8662 It's past my bedtime. 2022-04-03 00:14:08 -05:00
Devin J. Pohly
6901743b0c Remove removed fields from struct instances 2022-04-03 00:13:11 -05:00
Devin J. Pohly
720f56161e Remove vestigial monitor configuration info
The x/y fields in monitor rules are unused and were meant to be deleted.
Also removes the outdated comment in config.h.
2022-04-03 00:01:52 -05:00
Leonardo Hernández Hernández
4d3adea683
die on pipe failure 2022-03-31 15:32:30 -06:00
Raphael Robatsch
79b7e755b0
Layer shell: Prevent infinte configure/commit loop
Check the wlr_layer_surface_v1_state.committed bitmask to see if we need
to rearrange. This is also what sway does.

Without this check, every commit request (even if only the attached buffer
changed) will lead to another configure event, which will lead to another
commit, etc.

This loop results in swaybg consuming 100% CPU.

Co-authored-by: Owen Rafferty <owen@owenrafferty.com>
2022-03-31 15:27:13 -06:00
Leonardo Hernández Hernández
b424602ebc
add DESTDIR 2022-03-31 09:43:56 -06:00
Leonardo Hernández Hernández
ae31391115
initialize rules and xkb_rules
to fix compile errors with `-pedantic`
2022-03-31 09:34:22 -06:00
Leonardo Hernández Hernández
2d6f932ecf
don't let -pedantic be overridable by environment 2022-03-31 09:21:27 -06:00
Devin J. Pohly
dd0b8e4c37
Merge pull request #212 from djpohly/xwaitland
make sure to leave XWayland process waitable
2022-03-29 16:22:44 -05:00
Devin J. Pohly
0ddde0c85a move sigchld() into XWayland section 2022-03-29 16:09:29 -05:00
Devin J. Pohly
e08bd12922 make sure to leave XWayland process waitable
On SIGCHLD, check to make sure the terminated process is not the
XWayland process before reaping it, allowing wlroots to waitpid() for it
successfully.

Fixes #177.
2022-03-29 15:55:06 -05:00
Leonardo Hernández Hernández
aab397c30b
new functions ecalloc() and die()
die() replaces EBARF and BARF
and allow us to add `-pedantic` to CFLAGS
2022-03-28 15:02:09 -06:00
Leonardo Hernández Hernández
7018ed9218
createpointer now takes wlr_pointer 2022-03-25 15:27:36 -06:00
Leonardo Hernández Hernández
f75e426222
createkeyboard now takes wlr_keyboard 2022-03-25 15:27:36 -06:00
Leonardo Hernández Hernández
cb4265ac8c
check m in commitlayersurfacenotify() 2022-03-24 14:19:08 -06:00
Leonardo Hernández Hernández
a95338ca43
implement input-inhibitor protocol 2022-03-24 11:41:24 -06:00
Leonardo Hernández Hernández
ae614ee512
implement idle-inhibitor protocol
This allows clients to disable idle monitoring
2022-03-24 11:35:19 -06:00
Leonardo Hernández Hernández
faaee90cbd
destroy scene_output in cleanupmon() 2022-03-23 18:22:41 -06:00
Leonardo Hernández Hernández
3e79a9a5d7
fix drag icon's surface returned by xytonode 2022-03-23 18:22:40 -06:00
Leonardo Hernández Hernández
c2899bc00b
set position of the drag icon in startdrag() 2022-03-23 18:22:40 -06:00
Leonardo Hernández Hernández
f353a0e759
Revert "clients now works as expected in drag motion"
This reverts commit 9aec6049ecbefe3618f34002d2239cc9462c07e9.

this problem is caused because xytonode() returns the surface of the
drag icon
2022-03-23 18:22:40 -06:00
Guido Cella
281c947e5f
inline the presentation variable
This variable can be removed since with scene-graph
wlr_presentation_surface_sampled_on_output no longer needs to be called.
2022-03-23 18:22:40 -06:00
Leonardo Hernández Hernández
855e6c1898
add note about how to change MODKEY for windows key 2022-03-23 18:22:40 -06:00
Palanix
a41d6cb00f
Fix dwl freezing when resizing 2022-03-23 18:22:40 -06:00
Quentin Rameau
b42abeac69
Add a configuration option for fullscreen locking
Some people are annoyed to have this new behaviour forced for some
application which use fake fullscreen.
2022-03-23 18:22:40 -06:00
Leonardo Hernández Hernández
5a1debb5f0
add sway LICENSE file
part of the code in dwl is taken from sway, so credit it.
dwm and sway are both licensed under the MIT license
2022-03-23 18:22:40 -06:00
Guido Cella
1a5b7e068b
update IRC channel 2022-03-23 18:22:40 -06:00
Humm
0db6f3c5b5
add dwl(1)
Documentation is good.  Man pages are documentation.  A program without
a man page is worthless.
2022-03-23 18:22:40 -06:00
Leonardo Hernández Hernández
d8ab893dab
clients now works as expected in drag motion 2022-03-23 18:22:40 -06:00
Guido Cella
f2be10fd43
implement drag and drop
For brevity, only a single drag icon at a time is supported.

Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
2022-03-23 18:22:39 -06:00
Sevz
23af627d80
Update issue templates 2022-03-23 18:22:39 -06:00
Leonardo Hernández Hernández
a7f7777907
only skip frames if there are visible clients that have a resize 2022-03-23 18:22:39 -06:00
Leonardo Hernández Hernández
40db9c88ea
remove a useless resize in mapnotify()
applyrules() calls setmon() which calls resize()
2022-03-23 18:22:39 -06:00
Leonardo Hernández Hernández
4276410a3d
improve floating detection
mostly copied from sway
2022-03-23 18:22:39 -06:00
Leonardo Hernández Hernández
feb972acd0
fix drag icon's surface returned by xytonode 2022-03-23 15:34:17 -06:00
Leonardo Hernández Hernández
bf8cc526de
set position of the drag icon in startdrag() 2022-03-23 15:30:35 -06:00
Leonardo Hernández Hernández
7a2e0eef74
Revert "clients now works as expected in drag motion"
This reverts commit 9aec6049ecbefe3618f34002d2239cc9462c07e9.

this problem is caused because xytonode() returns the surface of the
drag icon
2022-03-23 15:29:32 -06:00
Guido Cella
3bace9ce6b inline the presentation variable
This variable can be removed since with scene-graph
wlr_presentation_surface_sampled_on_output no longer needs to be called.
2022-03-23 22:01:04 +01:00
Leonardo Hernández Hernández
4ef8999624
add note about how to change MODKEY for windows key 2022-03-23 14:03:43 -06:00
Palanix
7d724dc7f3 Fix dwl freezing when resizing 2022-03-23 12:09:24 -06:00
Leonardo Hernández Hernández
0662bc5a69
wlr_seat_set_keyboard() now takes wlr_keyboard as parameter 2022-03-23 09:01:01 -06:00
Quentin Rameau
326eee1444
Add a configuration option for fullscreen locking
Some people are annoyed to have this new behaviour forced for some
application which use fake fullscreen.
2022-03-22 23:51:56 -06:00
Leonardo Hernández Hernández
d8f430accf
add sway LICENSE file
part of the code in dwl is taken from sway, so credit it.
dwm and sway are both licensed under the MIT license
2022-03-22 23:44:53 -06:00
Sevz
6aed9dc1ac
Merge pull request #137 from guidocella/libera
update IRC channel
2022-03-22 17:49:06 -06:00
Sevz
358562e2df
Merge pull request #180 from Humm42/manpage
add dwl(1)
2022-03-22 16:26:38 -06:00
Leonardo Hernández Hernández
9aec6049ec
clients now works as expected in drag motion 2022-03-22 15:02:02 -06:00
Guido Cella
330792b1fc
implement drag and drop
For brevity, only a single drag icon at a time is supported.

Co-authored-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
2022-03-22 01:10:08 -06:00
Sevz
86fe15f76c
Update issue templates 2022-03-21 22:34:30 -06:00
Leonardo Hernández Hernández
ee1a72211d
only skip frames if there are visible clients that have a resize 2022-03-21 21:41:38 -06:00
Leonardo Hernández Hernández
2bc01debdc
remove a useless resize in mapnotify()
applyrules() calls setmon() which calls resize()
2022-03-21 14:21:33 -06:00
Leonardo Hernández Hernández
c50f187c1f
improve floating detection
mostly copied from sway
2022-03-21 14:21:31 -06:00
Leonardo Hernández Hernández
0dea553428
destroy scene_output in cleanupmon() 2022-03-20 19:09:28 -06:00
Leonardo Hernández Hernández
a66210ebbc
Merge branch 'main' into wlroots-next 2022-03-20 16:02:18 -06:00
Sevz
44932053ba
Merge pull request #204 from djpohly/scenegraph3
merge scenegraph3
2022-03-20 12:48:15 -06:00
Leonardo Hernández Hernández
dd463b25c7
remove independents list 2022-03-20 12:32:44 -06:00
Leonardo Hernández Hernández
c8290f8c55
Merge branch 'wlroots-next' into scenegraph-wlroots-next 2022-03-18 17:21:41 -06:00
Leonardo Hernández Hernández
98f33cd01d
follow up wlroots input device events renaming 2022-03-18 17:20:31 -06:00
Leonardo Hernández Hernández
19c14b058c
remove unneeded variables 2022-03-18 11:04:34 -06:00
Leonardo Hernández Hernández
e645ea8301
attach presentation to scene 2022-03-18 10:40:40 -06:00
Leonardo Hernández Hernández
e4bf83e26d
update README.md 2022-03-18 01:43:30 -06:00
Leonardo Hernández Hernández
d50bb97f56
Merge branch 'main' into scenegraph 2022-03-18 01:31:28 -06:00
Leonardo Hernández Hernández
475c134144
do not allow set client size less than its min size 2022-03-18 01:27:33 -06:00
Leonardo Hernández Hernández
467123dc99
make sure to destroy wlr_scene_node of unmanaged clients 2022-03-18 01:03:33 -06:00
Leonardo Hernández Hernández
254f799fde
do not create borders for unmanaged clients 2022-03-18 01:02:50 -06:00
Leonardo Hernández Hernández
0815626d4c
pointerfocus: only use provided surface
if a client is given focus it
2022-03-18 00:59:52 -06:00
Leonardo Hernández Hernández
1b22ef1616
use xdg_shell helper
for xwayland continue using wlr_scene_subsurface_create()
2022-03-18 00:52:21 -06:00
Leonardo Hernández Hernández
f1c92b05fb
get old client by surface's node 2022-03-18 00:49:47 -06:00
Leonardo Hernández Hernández
1dfd867d9c
fix crash of Firefox when opening a popup larger than its size 2022-03-17 21:28:07 -06:00
Leonardo Hernández Hernández
294fb324d8
constraint popups to its parent client
Closes: #146
Closes: #155
2022-03-16 23:08:17 -06:00
Leonardo Hernández Hernández
79f85bde99
Merge branch 'main' into scenegraph 2022-03-16 21:54:16 -06:00
Leonardo Hernández Hernández
2768af5a9b
make sure configure and activate listeners are removed from list 2022-03-16 21:42:45 -06:00
Leonardo Hernandez Hernandez
863eedd05e
set correct position for unmanaged clients
- don't allow to move/resize with them
- don't focus unmanaged clients on buttonpress()
2022-03-16 09:27:09 -06:00
Leonardo Hernandez Hernandez
b92c0ff57f
add support for layer_shell popups 2022-03-16 09:27:09 -06:00
Leonardo Hernandez Hernandez
1087bc5db9
use wlr_scene_xdg_surface_create() for xdg_popups 2022-03-16 08:48:41 -06:00
Leonardo Hernández Hernández
88f241d1cf
Merge branch 'fix-segfault-in-fullscreennotify' 2022-03-13 21:32:55 -06:00
Leonardo Hernández Hernández
43228bd493
don't use fullscreen event in fullscreennotify() 2022-03-13 21:31:57 -06:00
Leonardo Hernández Hernández
ebff6e38a0
always call arrange() on setfullscreen()
also don't count full screen clients on tile()
2022-03-13 17:11:52 -06:00
Leonardo Hernández Hernández
2cd0b3173d
print status about floating and fullscreen 2022-03-13 15:46:32 -06:00
Humm
0c4740b277 add dwl(1)
Documentation is good.  Man pages are documentation.  A program without
a man page is worthless.
2022-03-13 00:46:24 +01:00
Leonardo Hernández Hernández
08020d61b7
more style fixes 2022-03-11 23:02:37 -06:00
Leonardo Hernández Hernández
4d26d30220
suckless style: don't use '//' for comments 2022-03-11 18:52:22 -06:00
Leonardo Hernandez Hernandez
0e5d7124de
use loop to call arrangelayer
zwlr_layer_shell_v1_layer are ordered by bottom-most first so we can
just use a loop from 3 to 0
2022-03-11 18:46:13 -06:00
Sevz
c49a42ee58
Merge pull request #196 from noocsharp/main
die on allocation failure
2022-03-11 18:40:45 -06:00
Leonardo Hernandez Hernandez
a7c4f6100a
use scene layer shell helper 2022-03-11 16:03:58 -06:00
Leonardo Hernández Hernández
3577802541
Merge branch 'wlroots-next' into scenegraph-wlroots-next 2022-03-11 16:02:00 -06:00
Leonardo Hernandez Hernandez
4465dcb6da
fix left border 'y' position
also add comment about border ordering
2022-03-11 15:11:02 -06:00
Leonardo Hernandez Hernandez
b97d9e1ce1
use wlr_scene_node_raise_to_top() 2022-03-11 15:07:57 -06:00
Leonardo Hernandez Hernandez
2b2f72d7c2
use wlr_scene_output_send_frame_done() 2022-03-11 15:05:49 -06:00
Leonardo Hernández Hernández
05a473335e
use wlr_box for previous geom 2022-03-10 14:48:14 -06:00
Leonardo Hernández Hernández
5d9c9a9a68
don't warn about unused result
Closes: #186
2022-03-10 14:34:36 -06:00
Leonardo Hernández Hernández
f673305e86
replace tabs by spaces in alignment 2022-03-10 14:08:57 -06:00
Leonardo Hernandez Hernandez
8cace19218
fix crash when the last monitor is disconnected 2022-03-10 14:08:57 -06:00
Leonardo Hernández Hernández
230d3432e9
wlr_virtual_keyboard_v1 now has its own wlr_keyboard
which has its own wlr_input_device

Signed-off-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
2022-03-10 10:37:18 -06:00
Leonardo Hernández Hernández
432c15fb09
Merge branch 'main' into wlroots-next 2022-03-10 10:34:43 -06:00
Leonardo Hernandez Hernandez
3e6d584de1
update URL to wlroots project (GitHub->GitLab) 2022-03-10 10:23:00 -06:00
Sevz
ebed67596d
Merge pull request #187 from fauxmight/new-clients-printstatus
Newly launched or closed clients ALWAYS generate status update
2022-03-10 10:21:04 -06:00
Sevz
f83f1049db
Merge pull request #149 from xi/fix-grabc-unmap
reset cursor mode when grabc is unmapped
2022-03-10 10:16:49 -06:00
Sevz
2630664fef
Merge pull request #193 from fauxmight/chasing-wlroots
Chasing wlroots
2022-03-10 10:11:17 -06:00
Leonardo Hernandez Hernandez
d1ff1e6f75
remove typedef Decoration 2022-03-08 18:17:21 -06:00
Nihal Jere
b0098d9d09 die on allocation failure 2022-02-22 23:07:49 -06:00
Devin J. Pohly
2d2c21664c
Merge pull request #181 from Armael/fix-client_set_tiled
fix client_set_tiled which is currently ignoring its "edges" argument
2022-02-15 16:20:22 -06:00
Devin J. Pohly
52a33a2f1e Merge branch 'scenegraph3' of github:djpohly/dwl into scenegraph3 2022-02-15 14:16:20 -06:00
Devin J. Pohly
9090106334
Merge pull request #164 from Sevz17/change-border-color
Change border color according to focus state
2022-02-15 14:16:11 -06:00
Devin J. Pohly
a15cb1e20e
Merge pull request #160 from Humm42/closepipes
-s: close unused fds
2022-02-15 14:04:25 -06:00
Devin J. Pohly
b860932cda Merge branch 'scenegraph3' of github:djpohly/dwl into scenegraph3 2022-02-15 14:03:29 -06:00
Devin J. Pohly
22a6f6661a
Merge pull request #151 from Sevz17/scenegraph3
send frame_done also to all layer surfaces
2022-02-15 14:03:04 -06:00
Devin J. Pohly
bda7b31174
Merge pull request #189 from fauxmight/shift-6-is-asciicircum
Shift+6 generates XKB_KEY_asciicircum
2022-02-15 13:57:07 -06:00
A Frederick Christensen
76b3756d11 Merge remote-tracking branch 'origin/wlroots-xdg-shell-refactor' into chasing-wlroots 2022-02-03 23:23:53 -06:00
A Frederick Christensen
97881c88c7 Merge remote-tracking branch 'origin/output-layout-get-box-update' into chasing-wlroots 2022-02-03 23:22:19 -06:00
A Frederick Christensen
b8ce8d0fbb Account for changes expecting wlr_xdg_toplevel rather than wlr_xdg_surface 2022-02-03 21:54:44 -06:00
A Frederick Christensen
ed44bc0c90 update wlr-output-layout-get-box 2022-02-02 23:18:58 -06:00
A Frederick Christensen
ac896a7df4 Shift+6 generates XKB_KEY_asciicircum 2022-02-01 18:58:32 -06:00
A Frederick Christensen
3300f6c911 Upgrade for wlroots surface refactoring
See [1] for details.

[1]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3412
2022-01-18 11:33:56 -06:00
Armaël Guéneau
f587b2fd2c fix client_set_tiled, which was ignoring its "edges" argument 2022-01-08 17:41:45 +01:00
A Frederick Christensen
317175da08 Newly launched or closed clients ALWAYS generate status update
Prior to this change, if a client whose tag(s) are not currently
selected is launched or killed, no update to status was printed and
status bars being fed by printstatus() did not update newly active
or newly inactive (but unselected) tags.
2021-12-31 14:51:50 -06:00
Devin J. Pohly
f4ae4c1a0b Merge branch 'main' into scenegraph3 2021-12-22 12:43:07 -06:00
Devin J. Pohly
27514b9593 Merge branch 'wlroots-next' into scenegraph3 2021-12-16 11:51:15 -06:00
Devin J. Pohly
2315462f96 Merge commit 'refs/pull/162/head' of github:djpohly/dwl into scenegraph3 2021-12-16 10:59:13 -06:00
Devin J. Pohly
c71a3ac594 Merge branch 'wlroots-next' of github:djpohly/dwl into scenegraph3 2021-12-16 10:52:49 -06:00
Raphael Robatsch
03e167dbb7 fullscreennotify: don't crash if called before map
SDL2 calls xdg_toplevel.unset_fullscreen() before the surface is
mapped. This causes a segfault in dwl because setfullscreen() expects
the surface to be mapped already.
Therefore, delay the setfullscreen call until the surface is mapped.
2021-11-13 22:19:55 -06:00
Leonardo Hernandez Hernandez
894f2a3152
change border color according to focus state 2021-10-31 15:32:49 -06:00
Leonardo Hernandez Hernandez
05ac420342
Merge branch 'wlroots-next' into HEAD 2021-10-26 21:24:35 -05:00
Humm
ebfefa84ba -s: close unused fds
dup2 doesn’t close fds, it only duplicates them.  The old ones weren’t
closed, causing problems (like dwl blocking due to the child process
never reading from the reading end, even if stdin has been closed).
2021-10-13 23:11:40 +02:00
Leonardo Hernandez Hernandez
2c9423d1b7
wlr_xdg_surface.configure_serial has been moved into wlr_xdg_surface_state
as seen in swaywm/wlroots@0e34208
2021-10-03 22:08:00 -05:00
Leonardo Hernandez Hernandez
df332de9d2
send frame_done also to all layer surfaces
this fixes an issue when bemenu don't update his surface when typing
2021-10-02 22:24:04 -05:00
Devin J. Pohly
7de6920bd7 send frame_done to all visible surfaces 2021-09-21 14:42:36 -05:00
Devin J. Pohly
c8bf457c0f fixup: follow name change on surface_tree_create 2021-09-21 10:42:43 -05:00
Devin J. Pohly
0146a9954b use scene_output for damage-tracked rendering 2021-09-08 23:24:11 -05:00
Devin J. Pohly
be6f573b4e use scene to keep track of LayerSurfaces' layers 2021-09-08 23:24:11 -05:00
Devin J. Pohly
1b38801eef use scene-graph API for Client/LayerSurface 2021-09-08 23:24:11 -05:00
Devin J. Pohly
929d3d9569 use type enum to distinguish Client from LayerSurface 2021-09-08 23:24:11 -05:00
Tobias Bengfort
79dcc0d327 reset cursor mode when grabc is unmapped 2021-09-04 13:47:49 +02:00
Guido Cella
8aa50dfdf1 update IRC channel 2021-08-03 06:29:26 +02:00
24 changed files with 4498 additions and 1424 deletions

View File

@ -0,0 +1,62 @@
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

View File

@ -0,0 +1,9 @@
name: Enhancement idea
about: Suggest a feature or improvement
title:
labels:
- 'Kind/Feature'
body:
- type: textarea
attributes:
label: Description

View File

@ -1,10 +0,0 @@
---
name: Bug report
about: Something in dwl isn't working correctly
title: ''
labels: 'A: bug'
assignees: ''
---

View File

@ -1,10 +0,0 @@
---
name: Enhancement idea
about: Suggest a feature or improvement
title: ''
labels: 'A: enhancement'
assignees: ''
---

3
.mailmap Normal file
View File

@ -0,0 +1,3 @@
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 Normal file
View File

@ -0,0 +1,217 @@
# 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

View File

@ -2,7 +2,7 @@ dwl - dwm for Wayland
Copyright © 2020 dwl team
See also the files LICENSE.tinywl and LICENSE.dwm.
See also the files LICENSE.tinywl, LICENSE.dwm and LICENSE.sway.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

19
LICENSE.sway Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2016-2017 Drew DeVault
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 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.

117
Makefile
View File

@ -1,63 +1,86 @@
.POSIX:
.SUFFIXES:
include config.mk
CFLAGS += -I. -DWLR_USE_UNSTABLE -std=c99
# flags for compiling
DWLCPPFLAGS = -I. -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L \
-DVERSION=\"$(VERSION)\" $(XWAYLAND)
DWLDEVCFLAGS = -g -Wpedantic -Wall -Wextra -Wdeclaration-after-statement \
-Wno-unused-parameter -Wshadow -Wunused-macros -Werror=strict-prototypes \
-Werror=implicit -Werror=return-type -Werror=incompatible-pointer-types \
-Wfloat-conversion
WAYLAND_PROTOCOLS=$(shell pkg-config --variable=pkgdatadir wayland-protocols)
WAYLAND_SCANNER=$(shell pkg-config --variable=wayland_scanner wayland-scanner)
PKGS = wlroots wayland-server xcb xkbcommon libinput
CFLAGS += $(foreach p,$(PKGS),$(shell pkg-config --cflags $(p)))
LDLIBS += $(foreach p,$(PKGS),$(shell pkg-config --libs $(p)))
# CFLAGS / LDFLAGS
PKGS = wayland-server xkbcommon libinput $(XLIBS)
DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(WLR_INCS) $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS)
LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(WLR_LIBS) -lm $(LIBS)
all: dwl
clean:
rm -f dwl *.o *-protocol.h *-protocol.c
install: dwl
install -D dwl $(PREFIX)/bin/dwl
uninstall:
rm -f $(PREFIX)/bin/dwl
.PHONY: all clean install uninstall
dwl: dwl.o util.o dwl-ipc-unstable-v2-protocol.o
$(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) dwl-ipc-unstable-v2-protocol.o -o $@
dwl.o: dwl.c client.h config.h config.mk cursor-shape-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 dwl-ipc-unstable-v2-protocol.h
util.o: util.c util.h
dwl-ipc-unstable-v2-protocol.o: dwl-ipc-unstable-v2-protocol.h
# wayland-scanner is a tool which generates C headers and rigging for Wayland
# protocols, which are specified in XML. wlroots requires you to rig these up
# to your build system yourself and provide them in the include path.
WAYLAND_SCANNER = `$(PKG_CONFIG) --variable=wayland_scanner wayland-scanner`
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 $@
dwl-ipc-unstable-v2-protocol.h:
$(WAYLAND_SCANNER) server-header \
protocols/dwl-ipc-unstable-v2.xml $@
dwl-ipc-unstable-v2-protocol.c:
$(WAYLAND_SCANNER) private-code \
protocols/dwl-ipc-unstable-v2.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:
$(WAYLAND_SCANNER) server-header \
$(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@
xdg-shell-protocol.c:
$(WAYLAND_SCANNER) private-code \
$(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@
xdg-shell-protocol.o: xdg-shell-protocol.h
wlr-layer-shell-unstable-v1-protocol.h:
$(WAYLAND_SCANNER) server-header \
protocols/wlr-layer-shell-unstable-v1.xml $@
wlr-layer-shell-unstable-v1-protocol.c:
$(WAYLAND_SCANNER) private-code \
protocols/wlr-layer-shell-unstable-v1.xml $@
wlr-layer-shell-unstable-v1-protocol.o: wlr-layer-shell-unstable-v1-protocol.h
idle-protocol.h:
$(WAYLAND_SCANNER) server-header \
protocols/idle.xml $@
idle-protocol.c:
$(WAYLAND_SCANNER) private-code \
protocols/idle.xml $@
idle-protocol.o: idle-protocol.h
config.h: | config.def.h
config.h:
cp config.def.h $@
clean:
rm -f dwl *.o *-protocol.h
dwl.o: config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h idle-protocol.h
dist: clean
mkdir -p dwl-$(VERSION)
cp -R LICENSE* Makefile CHANGELOG.md README.md client.h config.def.h \
config.mk protocols dwl.1 dwl.c util.c util.h dwl.desktop \
dwl-$(VERSION)
tar -caf dwl-$(VERSION).tar.gz dwl-$(VERSION)
rm -rf dwl-$(VERSION)
dwl: xdg-shell-protocol.o wlr-layer-shell-unstable-v1-protocol.o idle-protocol.o
install: dwl
mkdir -p $(DESTDIR)$(PREFIX)/bin
rm -f $(DESTDIR)$(PREFIX)/bin/dwl
cp -f dwl $(DESTDIR)$(PREFIX)/bin
chmod 755 $(DESTDIR)$(PREFIX)/bin/dwl
mkdir -p $(DESTDIR)$(MANDIR)/man1
cp -f dwl.1 $(DESTDIR)$(MANDIR)/man1
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:
rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1 \
$(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop
.SUFFIXES: .c .o
.c.o:
$(CC) $(CPPFLAGS) $(DWLCFLAGS) -o $@ -c $<

196
README.md
View File

@ -1,62 +1,98 @@
# dwl - dwm for Wayland
Join us on our [Discord server](https://discord.gg/jJxZnrGPWN)!
Join us on our IRC channel: [#dwl on Libera Chat]
Or on the community-maintained [Discord server].
dwl is a compact, hackable compositor for Wayland based on [wlroots](https://github.com/swaywm/wlroots). It is intended to fill the same space in the Wayland world that dwm does in X11, primarily in terms of philosophy, and secondarily in terms of functionality. Like dwm, dwl 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,
primarily in terms of functionality, and secondarily in terms of
philosophy. Like dwm, dwl is:
- Easy to understand, hack on, and extend with patches
- One C source file (or a very small number) configurable via `config.h`
- Limited to 2000 SLOC to promote hackability
- Tied to as few external dependencies as possible
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:
## Getting Started:
- 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
- Provide information to external status bars via stdout/stdin
- Urgency hints via xdg-activate 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"
### Latest semi-stable [release]
This is probably where you want to start. This builds against the dependent
packages' versions currently shipping in major distributions. If your
distribution's wlroots version is older, use an earlier dwl [release] or [0.x
branch].
Features under consideration (possibly as patches) are:
### Development branch [main]
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)
- Protocols made trivial by wlroots
- Implement the input-inhibitor protocol to support screen lockers
- Implement the idle-inhibit protocol which lets applications such as mpv disable idle monitoring
- Layer shell popups (used by Waybar)
- Basic yes/no damage tracking to avoid needless redraws
- More in-depth damage region tracking ([which may improve power usage](https://mozillagfx.wordpress.com/2019/10/22/dramatically-reduced-power-usage-in-firefox-70-on-macos-with-core-animation/))
- 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://github.com/djpohly/dwl/pull/12)
dwl has the following additional dependencies if XWayland support is enabled:
- libxcb
- libxcb-wm
- wlroots (compiled with X11 support)
- Xwayland (runtime only)
Feature *non-goals* for the main codebase include:
Install these (and their `-devel` versions if your distro has separate
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].
- 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](https://github.com/djpohly/dwl/tree/wlroots-next).
To enable XWayland, you should also install xorg-xwayland and uncomment its flag in `config.mk`.
To enable XWayland, you should uncomment its flags in `config.mk`.
## Configuration
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 Wayland without restarting the entire display server, so any changes will take effect the next time dwl is executed.
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
Wayland without restarting the entire display server, so any changes will take
effect the next time dwl is executed.
As in the dwm community, we encourage users to share patches they have created. Check out the [patches page on our wiki](https://github.com/djpohly/dwl/wiki/Patches)!
As in the dwm community, we encourage users to share patches they have
created. Check out the [dwl-patches] repository!
## Running dwl
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 directly from a VT console. Depending on your distro's setup, you may need to add your user to the `video` and `input` groups before you can run dwl on a VT.
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
directly from a VT console. Depending on your distro's setup, you may need to
add your user to the `video` and `input` groups before you can run dwl on a
VT. If you are using `elogind` or `systemd-logind` you need to install polkit;
otherwise you need to add yourself in the `seat` group and enable/start the
seatd daemon.
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 decoration initially; these are instead clients that can be run within the Wayland session.
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
decoration initially; these are instead clients that can be run within the
Wayland session. Do note that the default background color is black. This can be
modified in `config.h`.
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 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 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 a user service manager like [s6](https://skarnet.org/software/s6/), [anopa](https://jjacky.com/anopa/), [runit](http://smarden.org/runit/faq.html#userservices), or [`systemd --user`](https://wiki.archlinux.org/title/Systemd/User).
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
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
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
a user service manager like [s6], [anopa], [runit], [dinit], or [`systemd
--user`].
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 that it spawns. If you need to set environment variables that affect the entire dwl session, these must be set prior to running dwl. For example, Wayland requires a valid `XDG_RUNTIME_DIR`, which is usually set up by a session manager such as `elogind` or `systemd-logind`. If your system doesn't do this automatically, you will need to configure it prior to launching `dwl`, e.g.:
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
that it spawns. If you need to set environment variables that affect the entire
dwl session, these must be set prior to running dwl. For example, Wayland
requires a valid `XDG_RUNTIME_DIR`, which is usually set up by a session manager
such as `elogind` or `systemd-logind`. If your system doesn't do this
automatically, you will need to configure it prior to launching `dwl`, e.g.:
export XDG_RUNTIME_DIR=/tmp/xdg-runtime-$(id -u)
mkdir -p $XDG_RUNTIME_DIR
@ -64,28 +100,100 @@ Note: The `-s` command is run as a *child process* of dwl, which means that it d
### Status information
Information about selected layouts, current window title, and selected/occupied/urgent tags is written to the stdin of the `-s` command (see the `printstatus()` function for details). This information can be used to populate an external status bar with a script that parses the information. Failing to read this information will cause dwl to block, so if you do want to run a startup command that does not consume the status information, you can close standard input with the `<&-` shell redirection, for example:
Information about selected layouts, current window title, app-id, and
selected/occupied/urgent tags is written to the stdin of the `-s` command (see
the `printstatus()` function for details). This information can be used to
populate an external status bar with a script that parses the
information. Failing to read this information will cause dwl to block, so if you
do want to run a startup command that does not consume the status information,
you can close standard input with the `<&-` shell redirection, for example:
dwl -s 'foot --server <&-'
If your startup command is a shell script, you can achieve the same inside the script with the line
If your startup command is a shell script, you can achieve the same inside the
script with the line
exec <&-
To get a list of status bars that work with dwl consult our [wiki].
## Replacements for X applications
You can find a [list of Wayland applications on the sway wiki](https://github.com/swaywm/sway/wiki/i3-Migration-Guide).
You can find a [list of useful resources on our wiki].
## IRC channel
## Background
dwl's IRC channel is #dwl on irc.freenode.net.
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
dwl began by extending the TinyWL example provided (CC0) by the sway/wlroots 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 possible.
dwl began by extending the TinyWL example provided (CC0) by the sway/wlroots
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
possible.
Many thanks to suckless.org and the dwm developers and community for the inspiration, and to the various contributors to the project, including:
Many thanks to suckless.org and the dwm developers and community for the
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
- Guido Cella for the layer-shell protocol implementation, patch maintenance, and for helping to keep the project running
- Guido Cella for the layer-shell protocol implementation, patch maintenance,
and for helping to keep the project running
- Stivvo for output management and fullscreen support, and patch maintenance
[`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
[Wayland]: https://wayland.freedesktop.org/

309
client.h
View File

@ -10,10 +10,9 @@ static inline int
client_is_x11(Client *c)
{
#ifdef XWAYLAND
return c->type == X11Managed || c->type == X11Unmanaged;
#else
return 0;
return c->type == X11;
#endif
return 0;
}
static inline struct wlr_surface *
@ -26,31 +25,100 @@ client_surface(Client *c)
return c->surface.xdg->surface;
}
static inline int
toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl)
{
struct wlr_xdg_surface *xdg_surface, *tmp_xdg_surface;
struct wlr_surface *root_surface;
struct wlr_layer_surface_v1 *layer_surface;
Client *c = NULL;
LayerSurface *l = NULL;
int type = -1;
#ifdef XWAYLAND
struct wlr_xwayland_surface *xsurface;
#endif
if (!s)
return -1;
root_surface = wlr_surface_get_root_surface(s);
#ifdef XWAYLAND
if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(root_surface))) {
c = xsurface->data;
type = c->type;
goto end;
}
#endif
if ((layer_surface = wlr_layer_surface_v1_try_from_wlr_surface(root_surface))) {
l = layer_surface->data;
type = LayerShell;
goto end;
}
xdg_surface = wlr_xdg_surface_try_from_wlr_surface(root_surface);
while (xdg_surface) {
tmp_xdg_surface = NULL;
switch (xdg_surface->role) {
case WLR_XDG_SURFACE_ROLE_POPUP:
if (!xdg_surface->popup || !xdg_surface->popup->parent)
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;
}
}
end:
if (pl)
*pl = l;
if (pc)
*pc = c;
return type;
}
/* The others */
static inline void
client_activate_surface(struct wlr_surface *s, int activated)
{
struct wlr_xdg_toplevel *toplevel;
#ifdef XWAYLAND
if (wlr_surface_is_xwayland_surface(s)) {
wlr_xwayland_surface_activate(
wlr_xwayland_surface_from_wlr_surface(s), activated);
struct wlr_xwayland_surface *xsurface;
if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(s))) {
wlr_xwayland_surface_activate(xsurface, activated);
return;
}
#endif
if (wlr_surface_is_xdg_surface(s))
wlr_xdg_toplevel_set_activated(
wlr_xdg_surface_from_wlr_surface(s), activated);
if ((toplevel = wlr_xdg_toplevel_try_from_wlr_surface(s)))
wlr_xdg_toplevel_set_activated(toplevel, activated);
}
static inline void
client_for_each_surface(Client *c, wlr_surface_iterator_func_t fn, void *data)
static inline uint32_t
client_set_bounds(Client *c, int32_t width, int32_t height)
{
wlr_surface_for_each_surface(client_surface(c), fn, data);
#ifdef XWAYLAND
if (client_is_x11(c))
return;
return 0;
#endif
wlr_xdg_surface_for_each_popup_surface(c->surface.xdg, fn, data);
if (wl_resource_get_version(c->surface.xdg->toplevel->resource) >=
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 0;
}
static inline const char *
@ -58,9 +126,28 @@ client_get_appid(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return c->surface.xwayland->class;
return c->surface.xwayland->class ? c->surface.xwayland->class : "broken";
#endif
return c->surface.xdg->toplevel->app_id;
return c->surface.xdg->toplevel->app_id ? c->surface.xdg->toplevel->app_id : "broken";
}
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
@ -75,7 +162,35 @@ client_get_geometry(Client *c, struct wlr_box *geom)
return;
}
#endif
wlr_xdg_surface_get_geometry(c->surface.xdg, geom);
*geom = c->surface.xdg->geometry;
}
static inline Client *
client_get_parent(Client *c)
{
Client *p = NULL;
#ifdef XWAYLAND
if (client_is_x11(c)) {
if (c->surface.xwayland->parent)
toplevel_from_wlr_surface(c->surface.xwayland->parent->surface, &p, NULL);
return p;
}
#endif
if (c->surface.xdg->toplevel->parent)
toplevel_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface, &p, NULL);
return p;
}
static inline int
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 *
@ -83,23 +198,84 @@ client_get_title(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return c->surface.xwayland->title;
return c->surface.xwayland->title ? c->surface.xwayland->title : "broken";
#endif
return c->surface.xdg->toplevel->title;
return c->surface.xdg->toplevel->title ? c->surface.xdg->toplevel->title : "broken";
}
static inline int
client_is_float_type(Client *c)
{
struct wlr_xdg_toplevel *toplevel;
struct wlr_xdg_toplevel_state state;
#ifdef XWAYLAND
if (client_is_x11(c)) {
struct wlr_xwayland_surface *surface = c->surface.xwayland;
xcb_size_hints_t *size_hints = surface->size_hints;
size_t i;
if (surface->modal)
return 1;
for (i = 0; i < surface->window_type_len; i++)
if (surface->window_type[i] == netatom[NetWMWindowTypeDialog]
|| surface->window_type[i] == netatom[NetWMWindowTypeSplash]
|| surface->window_type[i] == netatom[NetWMWindowTypeToolbar]
|| 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
toplevel = c->surface.xdg->toplevel;
state = toplevel->current;
return toplevel->parent || (state.min_width != 0 && state.min_height != 0
&& (state.min_width == state.max_width
|| state.min_height == state.max_height));
}
static inline int
client_is_rendered_on_mon(Client *c, Monitor *m)
{
/* This is needed for when you don't want to check formal assignment,
* but rather actual displaying of the pixels.
* Usually VISIBLEON suffices and is also faster. */
struct wlr_surface_output *s;
int unused_lx, unused_ly;
if (!wlr_scene_node_coords(&c->scene->node, &unused_lx, &unused_ly))
return 0;
wl_list_for_each(s, &client_surface(c)->current_outputs, link)
if (s->output == m->wlr_output)
return 1;
return 0;
}
static inline int
client_is_stopped(Client *c)
{
int pid;
siginfo_t in = {0};
#ifdef XWAYLAND
if (client_is_x11(c))
for (size_t i = 0; i < c->surface.xwayland->window_type_len; i++)
if (c->surface.xwayland->window_type[i] == netatom[NetWMWindowTypeDialog] ||
c->surface.xwayland->window_type[i] == netatom[NetWMWindowTypeSplash] ||
c->surface.xwayland->window_type[i] == netatom[NetWMWindowTypeToolbar] ||
c->surface.xwayland->window_type[i] == netatom[NetWMWindowTypeUtility])
return 1;
return 0;
#endif
wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL);
if (waitid(P_PID, pid, &in, WNOHANG|WCONTINUED|WSTOPPED|WNOWAIT) < 0) {
/* 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. */
if (errno == ECHILD)
return 1;
} else if (in.si_pid) {
if (in.si_code == CLD_STOPPED || in.si_code == CLD_TRAPPED)
return 1;
if (in.si_code == CLD_CONTINUED)
return 0;
}
return 0;
}
@ -107,11 +283,22 @@ static inline int
client_is_unmanaged(Client *c)
{
#ifdef XWAYLAND
return c->type == X11Unmanaged;
if (client_is_x11(c))
return c->surface.xwayland->override_redirect;
#endif
return 0;
}
static inline void
client_notify_enter(struct wlr_surface *s, struct wlr_keyboard *kb)
{
if (kb)
wlr_seat_keyboard_notify_enter(seat, s, kb->keycodes,
kb->num_keycodes, &kb->modifiers);
else
wlr_seat_keyboard_notify_enter(seat, s, NULL, 0, NULL);
}
static inline void
client_send_close(Client *c)
{
@ -121,7 +308,15 @@ client_send_close(Client *c)
return;
}
#endif
wlr_xdg_toplevel_send_close(c->surface.xdg);
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
@ -133,7 +328,14 @@ client_set_fullscreen(Client *c, int fullscreen)
return;
}
#endif
wlr_xdg_toplevel_set_fullscreen(c->surface.xdg, 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
@ -142,31 +344,62 @@ client_set_size(Client *c, uint32_t width, uint32_t height)
#ifdef XWAYLAND
if (client_is_x11(c)) {
wlr_xwayland_surface_configure(c->surface.xwayland,
c->geom.x, c->geom.y, width, height);
c->geom.x + c->bw, c->geom.y + c->bw, width, height);
return 0;
}
#endif
return wlr_xdg_toplevel_set_size(c->surface.xdg, width, height);
if ((int32_t)width == c->surface.xdg->toplevel->current.width
&& (int32_t)height == c->surface.xdg->toplevel->current.height)
return 0;
return wlr_xdg_toplevel_set_size(c->surface.xdg->toplevel, (int32_t)width, (int32_t)height);
}
static inline void
client_set_tiled(Client *c, uint32_t edges)
{
#ifdef XWAYLAND
if (client_is_x11(c))
if (client_is_x11(c)) {
wlr_xwayland_surface_set_maximized(c->surface.xwayland,
edges != WLR_EDGE_NONE, edges != WLR_EDGE_NONE);
return;
}
#endif
wlr_xdg_toplevel_set_tiled(c->surface.xdg, WLR_EDGE_TOP |
WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT);
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 struct wlr_surface *
client_surface_at(Client *c, double cx, double cy, double *sx, double *sy)
static inline void
client_set_suspended(Client *c, int suspended)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return wlr_surface_surface_at(c->surface.xwayland->surface,
cx, cy, sx, sy);
return;
#endif
return wlr_xdg_surface_surface_at(c->surface.xdg, cx, cy, sx, sy);
wlr_xdg_toplevel_set_suspended(c->surface.xdg->toplevel, suspended);
}
static inline int
client_wants_focus(Client *c)
{
#ifdef XWAYLAND
return client_is_unmanaged(c)
&& wlr_xwayland_surface_override_redirect_wants_focus(c->surface.xwayland)
&& wlr_xwayland_surface_icccm_input_model(c->surface.xwayland) != WLR_ICCCM_INPUT_MODEL_NONE;
#endif
return 0;
}
static inline int
client_wants_fullscreen(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return c->surface.xwayland->fullscreen;
#endif
return c->surface.xdg->toplevel->requested.fullscreen;
}

View File

@ -1,19 +1,31 @@
/* 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 */
static const int sloppyfocus = 1; /* focus follows mouse */
static const unsigned int borderpx = 1; /* border pixel of windows */
static const float rootcolor[] = {0.3, 0.3, 0.3, 1.0};
static const float bordercolor[] = {0.5, 0.5, 0.5, 1.0};
static const float focuscolor[] = {1.0, 0.0, 0.0, 1.0};
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 unsigned int borderpx = 1; /* border pixel of windows */
static const float rootcolor[] = COLOR(0x222222ff);
static const float bordercolor[] = COLOR(0x444444ff);
static const float focuscolor[] = COLOR(0x005577ff);
static const float urgentcolor[] = COLOR(0xff0000ff);
/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */
static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */
/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
/* tagging - TAGCOUNT must be no greater than 31 */
#define TAGCOUNT (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[] = {
/* app_id title tags mask isfloating monitor */
/* examples:
{ "Gimp", NULL, 0, 1, -1 },
{ "firefox", NULL, 1 << 8, 0, -1 },
*/
/* app_id title tags mask isfloating monitor */
/* examples: */
{ "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */
{ "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */
};
/* layout(s) */
@ -24,16 +36,19 @@ static const Layout layouts[] = {
{ "[M]", monocle },
};
/* monitors
* The order in which monitors are defined determines their position.
* Non-configured monitors are always added to the left. */
/* 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[] = {
/* name mfact nmaster scale layout rotate/reflect x y */
/* name mfact nmaster scale layout rotate/reflect x y */
/* example of a HiDPI laptop monitor:
{ "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0 },
{ "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
*/
/* defaults */
{ NULL, 0.55, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0 },
{ NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
};
/* keyboard */
@ -42,6 +57,7 @@ static const struct xkb_rule_names xkb_rules = {
/* example:
.options = "ctrl:nocaps",
*/
.options = NULL,
};
static const int repeat_rate = 25;
@ -49,9 +65,50 @@ static const int repeat_delay = 600;
/* Trackpad */
static const int tap_to_click = 1;
static const int tap_and_drag = 1;
static const int drag_lock = 1;
static const int natural_scrolling = 0;
static const int disable_while_typing = 1;
static const int left_handed = 0;
static const int middle_button_emulation = 0;
/* You can choose between:
LIBINPUT_CONFIG_SCROLL_NO_SCROLL
LIBINPUT_CONFIG_SCROLL_2FG
LIBINPUT_CONFIG_SCROLL_EDGE
LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN
*/
static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
/* You can choose between:
LIBINPUT_CONFIG_CLICK_METHOD_NONE
LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS
LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
*/
static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
/* You can choose between:
LIBINPUT_CONFIG_SEND_EVENTS_ENABLED
LIBINPUT_CONFIG_SEND_EVENTS_DISABLED
LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE
*/
static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED;
/* You can choose between:
LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT
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;
/* You can choose between:
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
*/
static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */
#define MODKEY WLR_MODIFIER_ALT
#define TAGKEYS(KEY,SKEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \
@ -62,8 +119,8 @@ static const int natural_scrolling = 0;
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *termcmd[] = { "alacritty", NULL };
static const char *menucmd[] = { "bemenu-run", NULL };
static const char *termcmd[] = { "foot", NULL };
static const char *menucmd[] = { "wmenu-run", NULL };
static const Key keys[] = {
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
@ -74,8 +131,8 @@ static const Key keys[] = {
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
{ MODKEY, XKB_KEY_i, incnmaster, {.i = +1} },
{ MODKEY, XKB_KEY_d, incnmaster, {.i = -1} },
{ MODKEY, XKB_KEY_h, setmfact, {.f = -0.05} },
{ MODKEY, XKB_KEY_l, setmfact, {.f = +0.05} },
{ MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} },
{ MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} },
{ MODKEY, XKB_KEY_Return, zoom, {0} },
{ MODKEY, XKB_KEY_Tab, view, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} },
@ -84,7 +141,7 @@ static const Key keys[] = {
{ MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XKB_KEY_space, setlayout, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} },
{ MODKEY, XKB_KEY_e, togglefullscreen, {0} },
{ MODKEY, XKB_KEY_e, togglefullscreen, {0} },
{ MODKEY, XKB_KEY_0, view, {.ui = ~0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} },
{ MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} },
@ -96,7 +153,7 @@ static const Key keys[] = {
TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2),
TAGKEYS( XKB_KEY_4, XKB_KEY_dollar, 3),
TAGKEYS( XKB_KEY_5, XKB_KEY_percent, 4),
TAGKEYS( XKB_KEY_6, XKB_KEY_caret, 5),
TAGKEYS( XKB_KEY_6, XKB_KEY_asciicircum, 5),
TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6),
TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7),
TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8),
@ -104,6 +161,9 @@ static const Key keys[] = {
/* 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} },
/* 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)} }
CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6),
CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),

View File

@ -1,8 +1,36 @@
_VERSION = 0.8-dev
VERSION = `git describe --tags --dirty 2>/dev/null || echo $(_VERSION)`
PKG_CONFIG = pkg-config
# paths
PREFIX = /usr/local
MANDIR = $(PREFIX)/share/man
DATADIR = $(PREFIX)/share
# Default compile flags (overridable by environment)
CFLAGS ?= -g -Wall -Wextra -Werror -Wno-unused-parameter -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wdeclaration-after-statement
WLR_INCS = `$(PKG_CONFIG) --cflags wlroots-0.19`
WLR_LIBS = `$(PKG_CONFIG) --libs wlroots-0.19`
# Allow using an alternative wlroots installations
# 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 =
XLIBS =
# Uncomment to build XWayland support
#CFLAGS += -DXWAYLAND
#XWAYLAND = -DXWAYLAND
#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

258
config.mma.def.h Normal file
View File

@ -0,0 +1,258 @@
/* 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 */
static const int sloppyfocus = 0; /* 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 unsigned int borderpx = 10; /* border pixel of windows */
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
static const float rootcolor[] = COLOR(0x4d4d4d66);
static const float bordercolor[] = COLOR(0x00000000);
static const float focuscolor[] = COLOR(0x12121212);
static const float urgentcolor[] = COLOR(0xff0000ff);
/* To conform the xdg-protocol, set the alpha to zero to restore the old behavior */
static const float fullscreen_bg[] = COLOR(0x121212ff);
/* tagging - TAGCOUNT must be no greater than 31 */
#define TAGCOUNT (9)
/* control variables */
static int cfg_disable_touchpad = 1;
static const char *cfg_touchpad_device_str = "Synaptic";
/* logging */
static int log_level = WLR_ERROR;
static const Rule rules[] = {
/* app_id title tags mask isfloating monitor */
/* examples:
{ "firefox", NULL, 1 << 8, 0, -1 },
*/
{ "Gimp", NULL, 0, 1, -1 },
};
/* layout(s) */
static const Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile },
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
};
/* monitors */
/* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */
static const MonitorRule monrules[] = {
/* name mfact nmaster scale layout rotate/reflect x y */
/* example of a HiDPI laptop monitor:
{ "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
*/
/* defaults */
{ NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
};
/* keyboard */
static const struct xkb_rule_names xkb_rules = {
/* can specify fields: rules, model, layout, variant, options
* Base rules in /usr/share/X11/xkb/rules/base.lst */
/* example:
.options = "ctrl:nocaps",
*/
.options = "caps:none,compose:rctrl",
};
static const int repeat_rate = 25;
static const int repeat_delay = 600;
/* Trackpad */
static const int tap_to_click = 1;
static const int tap_and_drag = 1;
static const int drag_lock = 1;
static const int natural_scrolling = 1;
static const int disable_while_typing = 1;
static const int left_handed = 0;
static const int middle_button_emulation = 0;
/* You can choose between:
LIBINPUT_CONFIG_SCROLL_NO_SCROLL
LIBINPUT_CONFIG_SCROLL_2FG
LIBINPUT_CONFIG_SCROLL_EDGE
LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN
*/
static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
/* You can choose between:
LIBINPUT_CONFIG_CLICK_METHOD_NONE
LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS
LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
*/
static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
/* You can choose between:
LIBINPUT_CONFIG_SEND_EVENTS_ENABLED
LIBINPUT_CONFIG_SEND_EVENTS_DISABLED
LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE
*/
static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED;
/* You can choose between:
LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT
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;
/* You can choose between:
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
*/
static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */
/* #define MODKEY WLR_MODIFIER_LOGO */
#define MODKEY WLR_MODIFIER_ALT
#define TAGKEYS(KEY,SKEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} }
#define AD_STR(a) #a
#define AD_CONCAT(a, b) AD_STR(a ## b)
#define ACTKEYS_DECL(FUNCP) \
static const char *key_cmd_ ## FUNCP[] = { "dwl_act", #FUNCP, NULL }; \
static const char *key_cmd_S_ ## FUNCP[] = { "dwl_act", AD_CONCAT(S_,FUNCP), NULL }; \
static const char *key_cmd_C_ ## FUNCP[] = { "dwl_act", AD_CONCAT(C_,FUNCP), NULL }; \
static const char *key_cmd_SC_ ## FUNCP[] = { "dwl_act", AD_CONCAT(SC_,FUNCP), NULL }
#define ACTKEYS_MAP(KEY,FUNCP) \
{ 0, KEY, spawn, {.v = key_cmd_ ## FUNCP} }, \
{ WLR_MODIFIER_CTRL, KEY, spawn, {.v = key_cmd_C_ ## FUNCP} }, \
{ WLR_MODIFIER_SHIFT, KEY, spawn, {.v = key_cmd_S_ ## FUNCP} }, \
{ WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT, KEY, spawn, {.v = key_cmd_SC_ ## FUNCP} }
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *webcmd[] = { "dwl_web", NULL };
static const char *mailcmd[] = { "dwl_email", NULL };
static const char *termcmd[] = { "dwl_term", NULL };
static const char *alttermcmd[] = { "dwl_alt_term", NULL };
static const char *launchcmd[] = { "dwl_dmenu", NULL };
static const char *dispcmd[] = { "wdisplays", NULL };
static const char *lockcmd[] = { "swaylock", NULL };
/* Function key commands */
ACTKEYS_DECL(vol_mute);
ACTKEYS_DECL(vol_lower);
ACTKEYS_DECL(vol_raise);
ACTKEYS_DECL(mic_mute);
ACTKEYS_DECL(bright_low);
ACTKEYS_DECL(bright_high);
ACTKEYS_DECL(disp);
ACTKEYS_DECL(wlan);
ACTKEYS_DECL(webcam);
ACTKEYS_DECL(tools);
ACTKEYS_DECL(search);
ACTKEYS_DECL(launch);
ACTKEYS_DECL(explore);
ACTKEYS_DECL(print);
ACTKEYS_DECL(media_toggle);
ACTKEYS_DECL(media_stop);
ACTKEYS_DECL(media_prev);
ACTKEYS_DECL(media_next);
static const Key keys[] = {
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
/* modifier key function argument */
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} },
{ MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,
XKB_KEY_Return, spawn, {.v = alttermcmd} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_P, spawn, {.v = launchcmd} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_N, spawn, {.v = dispcmd} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_W, spawn, {.v = webcmd} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_E, spawn, {.v = mailcmd} },
{ MODKEY, XKB_KEY_b, togglebar, {0}},
{ MODKEY, XKB_KEY_j, focusstack, {.i = +1} },
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
{ MODKEY, XKB_KEY_i, incnmaster, {.i = +1} },
{ MODKEY, XKB_KEY_d, incnmaster, {.i = -1} },
{ MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} },
{ MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} },
{ MODKEY, XKB_KEY_Return, zoom, {0} },
{ MODKEY, XKB_KEY_Tab, view, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} },
{ MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XKB_KEY_space, setlayout, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} },
{ MODKEY, XKB_KEY_e, togglefullscreen,
{0} },
{ MODKEY, XKB_KEY_0, view, {.ui = ~0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} },
{ MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} },
{ MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} },
{ MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} },
{ MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT, XKB_KEY_L, spawn, {.v = lockcmd} },
{ WLR_MODIFIER_LOGO, XKB_KEY_l, spawn, {.v = lockcmd } },
{ WLR_MODIFIER_LOGO, XKB_KEY_p, spawn, {.v = key_cmd_disp } },
/* 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} },
/* Media control keys without device specific action buttons */
{ WLR_MODIFIER_LOGO, XKB_KEY_space, spawn, {.v = key_cmd_media_toggle } },
{ WLR_MODIFIER_LOGO, XKB_KEY_s, spawn, {.v = key_cmd_media_stop } },
{ WLR_MODIFIER_LOGO, XKB_KEY_period, spawn, {.v = key_cmd_media_next } },
{ WLR_MODIFIER_LOGO, XKB_KEY_comma, spawn, {.v = key_cmd_media_prev } },
{ WLR_MODIFIER_LOGO, XKB_KEY_a, spawn, {.v = key_cmd_vol_mute } },
{ WLR_MODIFIER_LOGO, XKB_KEY_z, spawn, {.v = key_cmd_vol_lower } },
{ WLR_MODIFIER_LOGO, XKB_KEY_q, spawn, {.v = key_cmd_vol_raise } },
/* Action buttons */
ACTKEYS_MAP(XKB_KEY_XF86AudioMute, vol_mute),
ACTKEYS_MAP(XKB_KEY_XF86AudioLowerVolume, vol_lower),
ACTKEYS_MAP(XKB_KEY_XF86AudioRaiseVolume, vol_raise),
ACTKEYS_MAP(XKB_KEY_XF86AudioMicMute, mic_mute),
ACTKEYS_MAP(XKB_KEY_XF86MonBrightnessDown, bright_low),
ACTKEYS_MAP(XKB_KEY_XF86MonBrightnessUp, bright_high),
ACTKEYS_MAP(XKB_KEY_XF86Display, disp),
ACTKEYS_MAP(XKB_KEY_XF86WLAN, wlan),
ACTKEYS_MAP(XKB_KEY_XF86WebCam, webcam),
ACTKEYS_MAP(XKB_KEY_XF86Tools, tools),
ACTKEYS_MAP(XKB_KEY_XF86Search, search),
ACTKEYS_MAP(XKB_KEY_XF86LaunchA, launch),
ACTKEYS_MAP(XKB_KEY_XF86Explorer, explore),
ACTKEYS_MAP(XKB_KEY_Print, print),
ACTKEYS_MAP(XKB_KEY_XF86AudioPlay, media_toggle),
ACTKEYS_MAP(XKB_KEY_XF86AudioStop, media_stop),
ACTKEYS_MAP(XKB_KEY_XF86AudioPrev, media_prev),
ACTKEYS_MAP(XKB_KEY_XF86AudioNext, media_next),
/* { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, toggle_touch_input_device,
{0} },*/
TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0),
TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1),
TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2),
TAGKEYS( XKB_KEY_4, XKB_KEY_dollar, 3),
TAGKEYS( XKB_KEY_5, XKB_KEY_percent, 4),
TAGKEYS( XKB_KEY_6, XKB_KEY_asciicircum, 5),
TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6),
TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7),
TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8),
/* 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)} }
CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6),
CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),
};
static const Button buttons[] = {
{ MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} },
{ MODKEY, BTN_MIDDLE, togglefloating, {0} },
{ MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} },
};

158
dwl.1 Normal file
View File

@ -0,0 +1,158 @@
.Dd January 8, 2021
.Dt DWL 1
.Os
.Sh NAME
.Nm dwl
.Nd dwm for Wayland
.Sh SYNOPSIS
.Nm
.Op Fl v
.Op Fl d
.Op Fl s Ar startup command
.Sh DESCRIPTION
.Nm
is a Wayland compositor based on wlroots.
It is intended to fill the same space in the Wayland world that
.Nm dwm
does for X11.
.Pp
When given the
.Fl v
option,
.Nm
writes its name and version to standard error and exits unsuccessfully.
.Pp
When given the
.Fl d
option,
.Nm
enables full wlroots logging, including debug information.
.Pp
When given the
.Fl s
option,
.Nm
starts a shell process running
.Ar command
when starting.
When stopping, it sends
.Dv SIGTERM
to the child process and waits for it to exit.
.Pp
Users are encouraged to customize
.Nm
by editing the sources, in particular
.Pa config.h .
The default key bindings are as follows:
.Bl -tag -width 20n -offset indent -compact
.It Mod-[1-9]
Show only all windows with a tag.
.It Mod-Ctrl-[1-9]
Show all windows with a tag.
.It Mod-Shift-[1-9]
Move window to a single tag.
.It Mod-Ctrl-Shift-[1-9]
Toggle tag for window.
.It Mod-p
Spawn
.Nm wmenu-run .
.It Mod-Shift-Return
Spawn
.Nm foot .
.It Mod-[jk]
Move focus down/up the stack.
.It Mod-[id]
Increase/decrease number of windows in master area.
.It Mod-[hl]
Decrease/increase master area.
.It Mod-Return
Move window on top of stack or switch top of stack with second window.
.It Mod-Tab
Show only all windows with previous tag.
.It Mod-Shift-c
Close window.
.It Mod-t
Switch to tabbed layout.
.It Mod-f
Switch to floating layout.
.It Mod-m
Switch to monocle layout.
.It Mod-Space
Switch to previous layout.
.It Mod-Shift-Space
Toggle floating state of window.
.It Mod-e
Toggle fullscreen state of window.
.It Mod-0
Show all windows.
.It Mod-Shift-0
Set all tags for window.
.It Mod-,
Move focus to previous monitor.
.It Mod-.
Move focus to next monitor.
.It Mod-Shift-,
Move window to previous monitor.
.It Mod-Shift-.
Move window to next monitor.
.It Mod-Shift-q
Quit
.Nm .
.El
These might differ depending on your keyboard layout.
.Sh ENVIRONMENT
These environment variables are used by
.Nm :
.Bl -tag -width XDG_RUNTIME_DIR
.It Ev XDG_RUNTIME_DIR
A directory where temporary user files, such as the Wayland socket,
are stored.
.It Ev XDG_CONFIG_DIR
A directory containing configuration of various programs and
libraries, including libxkbcommon.
.It Ev DISPLAY , WAYLAND_DISPLAY , WAYLAND_SOCKET
Tell how to connect to an underlying X11 or Wayland server.
.It Ev WLR_*
Various variables specific to wlroots.
.It Ev XKB_* , XLOCALEDIR , XCOMPOSEFILE
Various variables specific to libxkbcommon.
.It Ev XCURSOR_PATH
List of directories to search for XCursor themes in.
.It Ev HOME
A directory where there are always dear files there for you.
Waiting for you to clean them up.
.El
.Pp
These are set by
.Nm :
.Bl -tag -width WAYLAND_DISPLAY
.It Ev WAYLAND_DISPLAY
Tell how to connect to
.Nm .
.It Ev DISPLAY
If using
.Nm Xwayland ,
tell how to connect to the
.Nm Xwayland
server.
.El
.Sh EXAMPLES
Start
.Nm
with s6 in the background:
.Dl dwl \-s \(aqs6\-svscan <&\-\(aq
.Sh SEE ALSO
.Xr foot 1 ,
.Xr wmenu 1 ,
.Xr dwm 1 ,
.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
All of them.

3252
dwl.c

File diff suppressed because it is too large Load Diff

5
dwl.desktop Normal file
View File

@ -0,0 +1,5 @@
[Desktop Entry]
Name=dwl
Comment=dwm for Wayland
Exec=dwl
Type=Application

575
ipc-v2-fixed.patch Normal file
View File

@ -0,0 +1,575 @@
diff --git a/Makefile b/Makefile
index 5320e42..c13557c 100644
--- a/Makefile
+++ b/Makefile
@@ -14,10 +14,11 @@ DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CF
LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(LIBS)
all: dwl
-dwl: dwl.o util.o
- $(CC) dwl.o util.o $(LDLIBS) $(LDFLAGS) $(DWLCFLAGS) -o $@
-dwl.o: dwl.c config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h
+dwl: dwl.o util.o dwl-ipc-unstable-v2-protocol.o
+ $(CC) dwl.o util.o dwl-ipc-unstable-v2-protocol.o $(LDLIBS) $(LDFLAGS) $(DWLCFLAGS) -o $@
+dwl.o: dwl.c config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h dwl-ipc-unstable-v2-protocol.h
util.o: util.c util.h
+dwl-ipc-unstable-v2-protocol.o: dwl-ipc-unstable-v2-protocol.h
# wayland-scanner is a tool which generates C headers and rigging for Wayland
# protocols, which are specified in XML. wlroots requires you to rig these up
@@ -31,6 +32,12 @@ xdg-shell-protocol.h:
wlr-layer-shell-unstable-v1-protocol.h:
$(WAYLAND_SCANNER) server-header \
protocols/wlr-layer-shell-unstable-v1.xml $@
+dwl-ipc-unstable-v2-protocol.h:
+ $(WAYLAND_SCANNER) server-header \
+ protocols/dwl-ipc-unstable-v2.xml $@
+dwl-ipc-unstable-v2-protocol.c:
+ $(WAYLAND_SCANNER) private-code \
+ protocols/dwl-ipc-unstable-v2.xml $@
config.h:
cp config.def.h $@
diff --git a/config.def.h b/config.def.h
index 4e30885..f285840 100644
--- a/config.def.h
+++ b/config.def.h
@@ -120,6 +120,7 @@ static const Key keys[] = {
/* modifier key function argument */
{ MODKEY, XKB_KEY_p, spawn, {.v = menucmd} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} },
+ { MODKEY, XKB_KEY_b, togglebar, {0}},
{ MODKEY, XKB_KEY_j, focusstack, {.i = +1} },
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
{ MODKEY, XKB_KEY_i, incnmaster, {.i = +1} },
diff --git a/dwl.c b/dwl.c
index a7d41b0..e507e31 100644
--- a/dwl.c
+++ b/dwl.c
@@ -58,6 +58,7 @@
#include <xcb/xcb_icccm.h>
#endif
+#include "dwl-ipc-unstable-v2-protocol.h"
#include "util.h"
/* macros */
@@ -128,6 +129,12 @@ typedef struct {
uint32_t resize; /* configure serial of a pending resize */
} Client;
+typedef struct {
+ struct wl_list link;
+ struct wl_resource *resource;
+ Monitor *mon;
+} DwlIpcOutput;
+
typedef struct {
uint32_t mod;
xkb_keysym_t keysym;
@@ -174,6 +181,7 @@ typedef struct {
struct Monitor {
struct wl_list link;
+ struct wl_list dwl_ipc_outputs;
struct wlr_output *wlr_output;
struct wlr_scene_output *scene_output;
struct wlr_scene_rect *fullscreen_bg; /* See createmon() for info */
@@ -255,6 +263,17 @@ static void destroynotify(struct wl_listener *listener, void *data);
static void destroysessionlock(struct wl_listener *listener, void *data);
static void destroysessionmgr(struct wl_listener *listener, void *data);
static Monitor *dirtomon(enum wlr_direction dir);
+static void dwl_ipc_manager_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id);
+static void dwl_ipc_manager_destroy(struct wl_resource *resource);
+static void dwl_ipc_manager_get_output(struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *output);
+static void dwl_ipc_manager_release(struct wl_client *client, struct wl_resource *resource);
+static void dwl_ipc_output_destroy(struct wl_resource *resource);
+static void dwl_ipc_output_printstatus(Monitor *monitor);
+static void dwl_ipc_output_printstatus_to(DwlIpcOutput *ipc_output);
+static void dwl_ipc_output_set_client_tags(struct wl_client *client, struct wl_resource *resource, uint32_t and_tags, uint32_t xor_tags);
+static void dwl_ipc_output_set_layout(struct wl_client *client, struct wl_resource *resource, uint32_t index);
+static void dwl_ipc_output_set_tags(struct wl_client *client, struct wl_resource *resource, uint32_t tagmask, uint32_t toggle_tagset);
+static void dwl_ipc_output_release(struct wl_client *client, struct wl_resource *resource);
static void focusclient(Client *c, int lift);
static void focusmon(const Arg *arg);
static void focusstack(const Arg *arg);
@@ -302,6 +321,7 @@ static void startdrag(struct wl_listener *listener, void *data);
static void tag(const Arg *arg);
static void tagmon(const Arg *arg);
static void tile(Monitor *m);
+static void togglebar(const Arg *arg);
static void togglefloating(const Arg *arg);
static void togglefullscreen(const Arg *arg);
static void toggletag(const Arg *arg);
@@ -374,6 +394,8 @@ static struct wl_listener cursor_frame = {.notify = cursorframe};
static struct wl_listener cursor_motion = {.notify = motionrelative};
static struct wl_listener cursor_motion_absolute = {.notify = motionabsolute};
static struct wl_listener drag_icon_destroy = {.notify = destroydragicon};
+static struct zdwl_ipc_manager_v2_interface dwl_manager_implementation = {.release = dwl_ipc_manager_release, .get_output = dwl_ipc_manager_get_output};
+static struct zdwl_ipc_output_v2_interface dwl_output_implementation = {.release = dwl_ipc_output_release, .set_tags = dwl_ipc_output_set_tags, .set_layout = dwl_ipc_output_set_layout, .set_client_tags = dwl_ipc_output_set_client_tags};
static struct wl_listener idle_inhibitor_create = {.notify = createidleinhibitor};
static struct wl_listener idle_inhibitor_destroy = {.notify = destroyidleinhibitor};
static struct wl_listener layout_change = {.notify = updatemons};
@@ -691,6 +713,9 @@ cleanupmon(struct wl_listener *listener, void *data)
LayerSurface *l, *tmp;
int i;
+ DwlIpcOutput *ipc_output, *ipc_output_tmp;
+ wl_list_for_each_safe(ipc_output, ipc_output_tmp, &m->dwl_ipc_outputs, link)
+ wl_resource_destroy(ipc_output->resource);
for (i = 0; i <= ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY; i++)
wl_list_for_each_safe(l, tmp, &m->layers[i], link)
wlr_layer_surface_v1_destroy(l->layer_surface);
@@ -902,6 +927,7 @@ createmon(struct wl_listener *listener, void *data)
Monitor *m = wlr_output->data = ecalloc(1, sizeof(*m));
m->wlr_output = wlr_output;
+ wl_list_init(&m->dwl_ipc_outputs);
wlr_output_init_render(wlr_output, alloc, drw);
/* Initialize monitor state using configured rules */
@@ -1195,6 +1221,190 @@ dirtomon(enum wlr_direction dir)
return selmon;
}
+void
+dwl_ipc_manager_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+ struct wl_resource *manager_resource = wl_resource_create(client, &zdwl_ipc_manager_v2_interface, version, id);
+ if (!manager_resource) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+ wl_resource_set_implementation(manager_resource, &dwl_manager_implementation, NULL, dwl_ipc_manager_destroy);
+
+ zdwl_ipc_manager_v2_send_tags(manager_resource, TAGCOUNT);
+
+ for (int i = 0; i < LENGTH(layouts); i++)
+ zdwl_ipc_manager_v2_send_layout(manager_resource, layouts[i].symbol);
+}
+
+void
+dwl_ipc_manager_destroy(struct wl_resource *resource)
+{
+ /* No state to destroy */
+}
+
+void
+dwl_ipc_manager_get_output(struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *output)
+{
+ DwlIpcOutput *ipc_output;
+ Monitor *monitor = wlr_output_from_resource(output)->data;
+ struct wl_resource *output_resource = wl_resource_create(client, &zdwl_ipc_output_v2_interface, wl_resource_get_version(resource), id);
+ if (!output_resource)
+ return;
+
+ ipc_output = ecalloc(1, sizeof(*ipc_output));
+ ipc_output->resource = output_resource;
+ ipc_output->mon = monitor;
+ wl_resource_set_implementation(output_resource, &dwl_output_implementation, ipc_output, dwl_ipc_output_destroy);
+ wl_list_insert(&monitor->dwl_ipc_outputs, &ipc_output->link);
+ dwl_ipc_output_printstatus_to(ipc_output);
+}
+
+void
+dwl_ipc_manager_release(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+static void
+dwl_ipc_output_destroy(struct wl_resource *resource)
+{
+ DwlIpcOutput *ipc_output = wl_resource_get_user_data(resource);
+ wl_list_remove(&ipc_output->link);
+ free(ipc_output);
+}
+
+void
+dwl_ipc_output_printstatus(Monitor *monitor)
+{
+ DwlIpcOutput *ipc_output;
+ wl_list_for_each(ipc_output, &monitor->dwl_ipc_outputs, link)
+ dwl_ipc_output_printstatus_to(ipc_output);
+}
+
+void
+dwl_ipc_output_printstatus_to(DwlIpcOutput *ipc_output)
+{
+ Monitor *monitor = ipc_output->mon;
+ Client *c, *focused;
+ int tagmask, state, numclients, focused_client, tag;
+ const char *title, *appid;
+ focused = focustop(monitor);
+ zdwl_ipc_output_v2_send_active(ipc_output->resource, monitor == selmon);
+
+ for (tag = 0 ; tag < TAGCOUNT; tag++) {
+ numclients = state = focused_client = 0;
+ tagmask = 1 << tag;
+ if ((tagmask & monitor->tagset[monitor->seltags]) != 0)
+ state |= ZDWL_IPC_OUTPUT_V2_TAG_STATE_ACTIVE;
+
+ wl_list_for_each(c, &clients, link) {
+ if (c->mon != monitor)
+ continue;
+ if (!(c->tags & tagmask))
+ continue;
+ if (c == focused)
+ focused_client = 1;
+ if (c->isurgent)
+ state |= ZDWL_IPC_OUTPUT_V2_TAG_STATE_URGENT;
+
+ numclients++;
+ }
+ zdwl_ipc_output_v2_send_tag(ipc_output->resource, tag, state, numclients, focused_client);
+ }
+ title = focused ? client_get_title(focused) : "";
+ appid = focused ? client_get_appid(focused) : "";
+
+ zdwl_ipc_output_v2_send_layout(ipc_output->resource, monitor->lt[monitor->sellt] - layouts);
+ zdwl_ipc_output_v2_send_title(ipc_output->resource, title ? title : broken);
+ zdwl_ipc_output_v2_send_appid(ipc_output->resource, appid ? appid : broken);
+ zdwl_ipc_output_v2_send_layout_symbol(ipc_output->resource, monitor->ltsymbol);
+ if (wl_resource_get_version(ipc_output->resource) >= ZDWL_IPC_OUTPUT_V2_FULLSCREEN_SINCE_VERSION) {
+ zdwl_ipc_output_v2_send_fullscreen(ipc_output->resource, focused ? focused->isfullscreen : 0);
+ }
+ if (wl_resource_get_version(ipc_output->resource) >= ZDWL_IPC_OUTPUT_V2_FLOATING_SINCE_VERSION) {
+ zdwl_ipc_output_v2_send_floating(ipc_output->resource, focused ? focused->isfloating : 0);
+ }
+ zdwl_ipc_output_v2_send_frame(ipc_output->resource);
+}
+
+void
+dwl_ipc_output_set_client_tags(struct wl_client *client, struct wl_resource *resource, uint32_t and_tags, uint32_t xor_tags)
+{
+ DwlIpcOutput *ipc_output;
+ Monitor *monitor;
+ Client *selected_client;
+ unsigned int newtags = 0;
+
+ ipc_output = wl_resource_get_user_data(resource);
+ if (!ipc_output)
+ return;
+
+ monitor = ipc_output->mon;
+ selected_client = focustop(monitor);
+ if (!selected_client)
+ return;
+
+ newtags = (selected_client->tags & and_tags) ^ xor_tags;
+ if (!newtags)
+ return;
+
+ selected_client->tags = newtags;
+ focusclient(focustop(selmon), 1);
+ arrange(selmon);
+ printstatus();
+}
+
+void
+dwl_ipc_output_set_layout(struct wl_client *client, struct wl_resource *resource, uint32_t index)
+{
+ DwlIpcOutput *ipc_output;
+ Monitor *monitor;
+
+ ipc_output = wl_resource_get_user_data(resource);
+ if (!ipc_output)
+ return;
+
+ monitor = ipc_output->mon;
+ if (index >= LENGTH(layouts))
+ return;
+ if (index != monitor->lt[monitor->sellt] - layouts)
+ monitor->sellt ^= 1;
+
+ monitor->lt[monitor->sellt] = &layouts[index];
+ arrange(monitor);
+ printstatus();
+}
+
+void
+dwl_ipc_output_set_tags(struct wl_client *client, struct wl_resource *resource, uint32_t tagmask, uint32_t toggle_tagset)
+{
+ DwlIpcOutput *ipc_output;
+ Monitor *monitor;
+ unsigned int newtags = tagmask & TAGMASK;
+
+ ipc_output = wl_resource_get_user_data(resource);
+ if (!ipc_output)
+ return;
+ monitor = ipc_output->mon;
+
+ if (!newtags || newtags == monitor->tagset[monitor->seltags])
+ return;
+ if (toggle_tagset)
+ monitor->seltags ^= 1;
+
+ monitor->tagset[monitor->seltags] = newtags;
+ focusclient(focustop(monitor), 1);
+ arrange(monitor);
+ printstatus();
+}
+
+void
+dwl_ipc_output_release(struct wl_client *client, struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
void
focusclient(Client *c, int lift)
{
@@ -1846,41 +2056,9 @@ void
printstatus(void)
{
Monitor *m = NULL;
- Client *c;
- uint32_t occ, urg, sel;
- const char *appid, *title;
- wl_list_for_each(m, &mons, link) {
- occ = urg = 0;
- wl_list_for_each(c, &clients, link) {
- if (c->mon != m)
- continue;
- occ |= c->tags;
- if (c->isurgent)
- urg |= c->tags;
- }
- if ((c = focustop(m))) {
- title = client_get_title(c);
- appid = client_get_appid(c);
- printf("%s title %s\n", m->wlr_output->name, title ? title : broken);
- printf("%s appid %s\n", m->wlr_output->name, appid ? appid : broken);
- printf("%s fullscreen %u\n", m->wlr_output->name, c->isfullscreen);
- printf("%s floating %u\n", m->wlr_output->name, c->isfloating);
- sel = c->tags;
- } else {
- printf("%s title \n", m->wlr_output->name);
- printf("%s appid \n", m->wlr_output->name);
- printf("%s fullscreen \n", m->wlr_output->name);
- printf("%s floating \n", m->wlr_output->name);
- sel = 0;
- }
-
- printf("%s selmon %u\n", m->wlr_output->name, m == selmon);
- printf("%s tags %u %u %u %u\n", m->wlr_output->name, occ, m->tagset[m->seltags],
- sel, urg);
- printf("%s layout %s\n", m->wlr_output->name, m->ltsymbol);
- }
- fflush(stdout);
+ wl_list_for_each(m, &mons, link)
+ dwl_ipc_output_printstatus(m);
}
void
@@ -2295,6 +2473,7 @@ setup(void)
wl_signal_add(&output_mgr->events.test, &output_mgr_test);
wlr_scene_set_presentation(scene, wlr_presentation_create(dpy, backend));
+ wl_global_create(dpy, &zdwl_ipc_manager_v2_interface, 2, NULL, dwl_ipc_manager_bind);
#ifdef XWAYLAND
/*
@@ -2389,6 +2568,13 @@ tile(Monitor *m)
}
}
+void
+togglebar(const Arg *arg) {
+ DwlIpcOutput *ipc_output;
+ wl_list_for_each(ipc_output, &selmon->dwl_ipc_outputs, link)
+ zdwl_ipc_output_v2_send_toggle_visibility(ipc_output->resource);
+}
+
void
togglefloating(const Arg *arg)
{
diff --git a/protocols/dwl-ipc-unstable-v2.xml b/protocols/dwl-ipc-unstable-v2.xml
new file mode 100644
index 0000000..0a6e7e5
--- /dev/null
+++ b/protocols/dwl-ipc-unstable-v2.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This is largely ripped from somebar's ipc patchset; just with some personal modifications.
+I would probably just submit raphi's patchset but I don't think that would be polite.
+-->
+<protocol name="dwl_ipc_unstable_v2">
+ <description summary="inter-proccess-communication about dwl's state">
+ This protocol allows clients to update and get updates from dwl.
+
+ 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="zdwl_ipc_manager_v2" version="2">
+ <description summary="manage dwl state">
+ This interface is exposed as a global in wl_registry.
+
+ Clients can use this interface to get a dwl_ipc_output.
+ After binding the client will recieve the dwl_ipc_manager.tags and dwl_ipc_manager.layout events.
+ The dwl_ipc_manager.tags and dwl_ipc_manager.layout events expose tags and layouts to the client.
+ </description>
+
+ <request name="release" type="destructor">
+ <description summary="release dwl_ipc_manager">
+ Indicates that the client will not the dwl_ipc_manager object anymore.
+ Objects created through this instance are not affected.
+ </description>
+ </request>
+
+ <request name="get_output">
+ <description summary="get a dwl_ipc_outout for a wl_output">
+ Get a dwl_ipc_outout for the specified wl_output.
+ </description>
+ <arg name="id" type="new_id" interface="zdwl_ipc_output_v2"/>
+ <arg name="output" type="object" interface="wl_output"/>
+ </request>
+
+ <event name="tags">
+ <description summary="Announces tag amount">
+ This event is sent after binding.
+ A roundtrip after binding guarantees the client recieved all tags.
+ </description>
+ <arg name="amount" type="uint"/>
+ </event>
+
+ <event name="layout">
+ <description summary="Announces a layout">
+ This event is sent after binding.
+ A roundtrip after binding guarantees the client recieved all layouts.
+ </description>
+ <arg name="name" type="string"/>
+ </event>
+ </interface>
+
+ <interface name="zdwl_ipc_output_v2" version="2">
+ <description summary="control dwl output">
+ Observe and control a dwl output.
+
+ Events are double-buffered:
+ Clients should cache events and redraw when a dwl_ipc_output.frame event is sent.
+
+ Request are not double-buffered:
+ The compositor will update immediately upon request.
+ </description>
+
+ <enum name="tag_state">
+ <entry name="none" value="0" summary="no state"/>
+ <entry name="active" value="1" summary="tag is active"/>
+ <entry name="urgent" value="2" summary="tag has at least one urgent client"/>
+ </enum>
+
+ <request name="release" type="destructor">
+ <description summary="release dwl_ipc_outout">
+ Indicates to that the client no longer needs this dwl_ipc_output.
+ </description>
+ </request>
+
+ <event name="toggle_visibility">
+ <description summary="Toggle client visibilty">
+ Indicates the client should hide or show themselves.
+ If the client is visible then hide, if hidden then show.
+ </description>
+ </event>
+
+ <event name="active">
+ <description summary="Update the selected output.">
+ Indicates if the output is active. Zero is invalid, nonzero is valid.
+ </description>
+ <arg name="active" type="uint"/>
+ </event>
+
+ <event name="tag">
+ <description summary="Update the state of a tag.">
+ Indicates that a tag has been updated.
+ </description>
+ <arg name="tag" type="uint" summary="Index of the tag"/>
+ <arg name="state" type="uint" enum="tag_state" summary="The state of the tag."/>
+ <arg name="clients" type="uint" summary="The number of clients in the tag."/>
+ <arg name="focused" type="uint" summary="If there is a focused client. Nonzero being valid, zero being invalid."/>
+ </event>
+
+ <event name="layout">
+ <description summary="Update the layout.">
+ Indicates a new layout is selected.
+ </description>
+ <arg name="layout" type="uint" summary="Index of the layout."/>
+ </event>
+
+ <event name="title">
+ <description summary="Update the title.">
+ Indicates the title has changed.
+ </description>
+ <arg name="title" type="string" summary="The new title name."/>
+ </event>
+
+ <event name="appid" since="1">
+ <description summary="Update the appid.">
+ Indicates the appid has changed.
+ </description>
+ <arg name="appid" type="string" summary="The new appid."/>
+ </event>
+
+ <event name="layout_symbol" since="1">
+ <description summary="Update the current layout symbol">
+ Indicates the layout has changed. Since layout symbols are dynamic.
+ As opposed to the zdwl_ipc_manager.layout event, this should take precendence when displaying.
+ You can ignore the zdwl_ipc_output.layout event.
+ </description>
+ <arg name="layout" type="string" summary="The new layout"/>
+ </event>
+
+ <event name="frame">
+ <description summary="The update sequence is done.">
+ Indicates that a sequence of status updates have finished and the client should redraw.
+ </description>
+ </event>
+
+ <request name="set_tags">
+ <description summary="Set the active tags of this output"/>
+ <arg name="tagmask" type="uint" summary="bitmask of the tags that should be set."/>
+ <arg name="toggle_tagset" type="uint" summary="toggle the selected tagset, zero for invalid, nonzero for valid."/>
+ </request>
+
+ <request name="set_client_tags">
+ <description summary="Set the tags of the focused client.">
+ The tags are updated as follows:
+ new_tags = (current_tags AND and_tags) XOR xor_tags
+ </description>
+ <arg name="and_tags" type="uint"/>
+ <arg name="xor_tags" type="uint"/>
+ </request>
+
+ <request name="set_layout">
+ <description summary="Set the layout of this output"/>
+ <arg name="index" type="uint" summary="index of a layout recieved by dwl_ipc_manager.layout"/>
+ </request>
+
+ <!-- Version 2 -->
+ <event name="fullscreen" since="2">
+ <description summary="Update fullscreen status">
+ Indicates if the selected client on this output is fullscreen.
+ </description>
+ <arg name="is_fullscreen" type="uint" summary="If the selected client is fullscreen. Nonzero is valid, zero invalid"/>
+ </event>
+
+ <event name="floating" since="2">
+ <description summary="Update the floating status">
+ Indicates if the selected client on this output is floating.
+ </description>
+ <arg name="is_floating" type="uint" summary="If the selected client is floating. Nonzero is valid, zero invalid"/>
+ </event>
+ </interface>
+</protocol>

View File

@ -0,0 +1,181 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This is largely ripped from somebar's ipc patchset; just with some personal modifications.
I would probably just submit raphi's patchset but I don't think that would be polite.
-->
<protocol name="dwl_ipc_unstable_v2">
<description summary="inter-proccess-communication about dwl's state">
This protocol allows clients to update and get updates from dwl.
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="zdwl_ipc_manager_v2" version="2">
<description summary="manage dwl state">
This interface is exposed as a global in wl_registry.
Clients can use this interface to get a dwl_ipc_output.
After binding the client will recieve the dwl_ipc_manager.tags and dwl_ipc_manager.layout events.
The dwl_ipc_manager.tags and dwl_ipc_manager.layout events expose tags and layouts to the client.
</description>
<request name="release" type="destructor">
<description summary="release dwl_ipc_manager">
Indicates that the client will not the dwl_ipc_manager object anymore.
Objects created through this instance are not affected.
</description>
</request>
<request name="get_output">
<description summary="get a dwl_ipc_outout for a wl_output">
Get a dwl_ipc_outout for the specified wl_output.
</description>
<arg name="id" type="new_id" interface="zdwl_ipc_output_v2"/>
<arg name="output" type="object" interface="wl_output"/>
</request>
<event name="tags">
<description summary="Announces tag amount">
This event is sent after binding.
A roundtrip after binding guarantees the client recieved all tags.
</description>
<arg name="amount" type="uint"/>
</event>
<event name="layout">
<description summary="Announces a layout">
This event is sent after binding.
A roundtrip after binding guarantees the client recieved all layouts.
</description>
<arg name="name" type="string"/>
</event>
</interface>
<interface name="zdwl_ipc_output_v2" version="2">
<description summary="control dwl output">
Observe and control a dwl output.
Events are double-buffered:
Clients should cache events and redraw when a dwl_ipc_output.frame event is sent.
Request are not double-buffered:
The compositor will update immediately upon request.
</description>
<enum name="tag_state">
<entry name="none" value="0" summary="no state"/>
<entry name="active" value="1" summary="tag is active"/>
<entry name="urgent" value="2" summary="tag has at least one urgent client"/>
</enum>
<request name="release" type="destructor">
<description summary="release dwl_ipc_outout">
Indicates to that the client no longer needs this dwl_ipc_output.
</description>
</request>
<event name="toggle_visibility">
<description summary="Toggle client visibilty">
Indicates the client should hide or show themselves.
If the client is visible then hide, if hidden then show.
</description>
</event>
<event name="active">
<description summary="Update the selected output.">
Indicates if the output is active. Zero is invalid, nonzero is valid.
</description>
<arg name="active" type="uint"/>
</event>
<event name="tag">
<description summary="Update the state of a tag.">
Indicates that a tag has been updated.
</description>
<arg name="tag" type="uint" summary="Index of the tag"/>
<arg name="state" type="uint" enum="tag_state" summary="The state of the tag."/>
<arg name="clients" type="uint" summary="The number of clients in the tag."/>
<arg name="focused" type="uint" summary="If there is a focused client. Nonzero being valid, zero being invalid."/>
</event>
<event name="layout">
<description summary="Update the layout.">
Indicates a new layout is selected.
</description>
<arg name="layout" type="uint" summary="Index of the layout."/>
</event>
<event name="title">
<description summary="Update the title.">
Indicates the title has changed.
</description>
<arg name="title" type="string" summary="The new title name."/>
</event>
<event name="appid" since="1">
<description summary="Update the appid.">
Indicates the appid has changed.
</description>
<arg name="appid" type="string" summary="The new appid."/>
</event>
<event name="layout_symbol" since="1">
<description summary="Update the current layout symbol">
Indicates the layout has changed. Since layout symbols are dynamic.
As opposed to the zdwl_ipc_manager.layout event, this should take precendence when displaying.
You can ignore the zdwl_ipc_output.layout event.
</description>
<arg name="layout" type="string" summary="The new layout"/>
</event>
<event name="frame">
<description summary="The update sequence is done.">
Indicates that a sequence of status updates have finished and the client should redraw.
</description>
</event>
<request name="set_tags">
<description summary="Set the active tags of this output"/>
<arg name="tagmask" type="uint" summary="bitmask of the tags that should be set."/>
<arg name="toggle_tagset" type="uint" summary="toggle the selected tagset, zero for invalid, nonzero for valid."/>
</request>
<request name="set_client_tags">
<description summary="Set the tags of the focused client.">
The tags are updated as follows:
new_tags = (current_tags AND and_tags) XOR xor_tags
</description>
<arg name="and_tags" type="uint"/>
<arg name="xor_tags" type="uint"/>
</request>
<request name="set_layout">
<description summary="Set the layout of this output"/>
<arg name="index" type="uint" summary="index of a layout recieved by dwl_ipc_manager.layout"/>
</request>
<!-- Version 2 -->
<event name="fullscreen" since="2">
<description summary="Update fullscreen status">
Indicates if the selected client on this output is fullscreen.
</description>
<arg name="is_fullscreen" type="uint" summary="If the selected client is fullscreen. Nonzero is valid, zero invalid"/>
</event>
<event name="floating" since="2">
<description summary="Update the floating status">
Indicates if the selected client on this output is floating.
</description>
<arg name="is_floating" type="uint" summary="If the selected client is floating. Nonzero is valid, zero invalid"/>
</event>
</interface>
</protocol>

View File

@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="idle">
<copyright><![CDATA[
Copyright (C) 2015 Martin Gräßlin
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
]]></copyright>
<interface name="org_kde_kwin_idle" version="1">
<description summary="User idle time manager">
This interface allows to monitor user idle time on a given seat. The interface
allows to register timers which trigger after no user activity was registered
on the seat for a given interval. It notifies when user activity resumes.
This is useful for applications wanting to perform actions when the user is not
interacting with the system, e.g. chat applications setting the user as away, power
management features to dim screen, etc..
</description>
<request name="get_idle_timeout">
<arg name="id" type="new_id" interface="org_kde_kwin_idle_timeout"/>
<arg name="seat" type="object" interface="wl_seat"/>
<arg name="timeout" type="uint" summary="The idle timeout in msec"/>
</request>
</interface>
<interface name="org_kde_kwin_idle_timeout" version="1">
<request name="release" type="destructor">
<description summary="release the timeout object"/>
</request>
<request name="simulate_user_activity">
<description summary="Simulates user activity for this timeout, behaves just like real user activity on the seat"/>
</request>
<event name="idle">
<description summary="Triggered when there has not been any user activity in the requested idle time interval"/>
</event>
<event name="resumed">
<description summary="Triggered on the first user activity after an idle event"/>
</event>
</interface>
</protocol>

View File

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="net_tapesoftware_dwl_wm_unstable_v1">
<copyright>
Copyright (c) 2021 Raphael Robatsch
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice (including the
next paragraph) shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
</copyright>
<interface name="znet_tapesoftware_dwl_wm_v1" version="1">
<description summary="control the dwl state">
This interface is exposed as a global in the wl_registry.
Clients can use this protocol to receive updates of the window manager
state (active tags, active layout, and focused window).
Clients can also control this state.
After binding, the client will receive the available tags and layouts
with the 'tag' and 'layout' events. These can be used in subsequent
dwl_wm_monitor_v1.set_tags/set_layout requests, and to interpret the
dwl_wm_monitor_v1.layout/tag events.
</description>
<request name="release" type="destructor">
<description summary="release dwl_wm">
This request indicates that the client will not use the dwl_wm
object any more. Objects that have been created through this instance
are not affected.
</description>
</request>
<request name="get_monitor">
<description summary="gets a dwl monitor from an output">
Gets a dwl monitor for the specified output. The window manager
state on the output can be controlled using the monitor.
</description>
<arg name="id" type="new_id" interface="znet_tapesoftware_dwl_wm_monitor_v1" />
<arg name="output" type="object" interface="wl_output" />
</request>
<event name="tag">
<description summary="announces the presence of a tag">
This event is sent immediately after binding.
A roundtrip after binding guarantees that the client has received all tags.
</description>
<arg name="name" type="string"/>
</event>
<event name="layout">
<description summary="announces the presence of a layout">
This event is sent immediately after binding.
A roundtrip after binding guarantees that the client has received all layouts.
</description>
<arg name="name" type="string"/>
</event>
</interface>
<interface name="znet_tapesoftware_dwl_wm_monitor_v1" version="1">
<description summary="control one monitor">
Observes and controls one monitor.
Events are double-buffered: Clients should cache all events and only
redraw themselves once the 'frame' event is sent.
Requests are not double-buffered: The compositor will update itself
immediately.
</description>
<enum name="tag_state">
<entry name="none" value="0" summary="no state"/>
<entry name="active" value="1" summary="tag is active"/>
<entry name="urgent" value="2" summary="tag has at least one urgent client"/>
</enum>
<request name="release" type="destructor">
<description summary="release dwl_monitor">
This request indicates that the client is done with this dwl_monitor.
All further requests are ignored.
</description>
</request>
<event name="selected">
<description summary="updates the selected state of the monitor">
If 'selected' is nonzero, this monitor is the currently selected one.
</description>
<arg name="selected" type="uint"/>
</event>
<event name="tag">
<description summary="updates the state of one tag">
Announces the update of a tag. num_clients and focused_client can be
used to draw client indicators.
</description>
<arg name="tag" type="uint" summary="index of a tag received by the dwl_wm_v1.tag event." />
<arg name="state" type="uint" enum="tag_state"/>
<arg name="num_clients" type="uint" summary="number of clients on this tag"/>
<arg name="focused_client" type="int" summary="out of num_clients. -1 if there is no focused client"/>
</event>
<event name="layout">
<description summary="updates the selected layout">
Announces the update of the selected layout.
</description>
<arg name="layout" type="uint" summary="index of a layout received by the dwl_wm_v1.layout event."/>
</event>
<event name="title">
<description summary="updates the focused client">
Announces the update of the selected client.
</description>
<arg name="title" type="string"/>
</event>
<event name="frame">
<description summary="end of status update sequence">
Sent after all other events belonging to the status update has been sent.
Clients should redraw themselves now.
</description>
</event>
<request name="set_tags">
<description summary="sets the active tags on this monitor.">
Changes are applied immediately.
</description>
<arg name="tagmask" type="uint" summary="bitmask of the tags that should be set."/>
<arg name="toggle_tagset" type="uint"/>
</request>
<request name="set_client_tags">
<description summary="updates the tags of the focused client.">
tags are updated as follows:
new_tags = (current_tags AND and_tags) XOR xor_tags
Changes are applied immediately.
</description>
<arg name="and_tags" type="uint"/>
<arg name="xor_tags" type="uint"/>
</request>
<request name="set_layout">
<description summary="sets the active layout on this monitor.">
Changes are applied immediately.
</description>
<arg name="layout" type="uint" summary="index of a layout received by the dwl_wm_v1.layout event."/>
</request>
</interface>
</protocol>

View File

@ -0,0 +1,128 @@
<?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>

51
util.c Normal file
View File

@ -0,0 +1,51 @@
/* See LICENSE.dwm file for copyright and license details. */
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include "util.h"
void
die(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
fputc(' ', stderr);
perror(NULL);
} else {
fputc('\n', stderr);
}
exit(1);
}
void *
ecalloc(size_t nmemb, size_t size)
{
void *p;
if (!(p = calloc(nmemb, size)))
die("calloc:");
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;
}

5
util.h Normal file
View File

@ -0,0 +1,5 @@
/* See LICENSE.dwm file for copyright and license details. */
void die(const char *fmt, ...);
void *ecalloc(size_t nmemb, size_t size);
int fd_set_nonblock(int fd);