409 Commits
v0.1 ... v0.3.1

Author SHA1 Message Date
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
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
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
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
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 9aec6049ec.

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
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
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
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
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 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
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
ac896a7df4 Shift+6 generates XKB_KEY_asciicircum 2022-02-01 18:58:32 -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
f85d8e79d0 Merge branch 'wlroots-next'
wlroots 0.15.0 was released
2021-12-22 12:14:36 -06:00
Devin J. Pohly
09413da6e3 Merge branch 'main' of github:djpohly/dwl 2021-12-22 12:11:29 -06:00
Devin J. Pohly
27514b9593 Merge branch 'wlroots-next' into scenegraph3 2021-12-16 11:51:15 -06:00
Devin J. Pohly
27f66c8715 explicitly create renderer and allocator
autocreate was removed
2021-12-16 11:50:11 -06:00
Leonardo Hernandez Hernandez
52dbc97ed6 wlr_xdg_surface.configure_serial has been moved into wlr_xdg_surface_state
as seen in swaywm/wlroots@0e34208
2021-12-16 11:49:57 -06:00
Devin J. Pohly
852fe819c4 Merge branch 'wlroots-next' of github:djpohly/dwl into wlroots-next 2021-12-16 11:48:43 -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
Devin J. Pohly
2d9740c2fc document status information and <&- in README
As mentioned in #158.
2021-10-06 13:00:54 -05: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
96ce40cfe9 Merge pull request #152 from ARDiDo/no_redundant_xcursor
remove redundancies in xcursors
2021-09-26 23:08:17 -05:00
ARDiDo
99fbebcae3 Remove redundant xcursor manager 2021-09-26 20:19:36 -04:00
Devin J. Pohly
d3efb0b29b Merge pull request #150 from Sevz17/wlroots-next
client_pending has been renamed as pending in wlr_layer_surface_v1
2021-09-24 23:24:41 -05:00
Leonardo Hernandez Hernandez
1e1482adcb client_pending has been renamed as pending in wlr_layer_surface_v1
as seen in swaywm/wlroots@59fa363
2021-09-24 16:12:12 -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
Devin J. Pohly
40e45a336a Merge branch 'main' into wlroots-next 2021-09-08 23:21:51 -05:00
Devin J. Pohly
0c1e621b82 simplify fullscreen expression 2021-09-08 23:21:28 -05:00
Devin J. Pohly
417e958a15 Merge branch 'main' into wlroots-next 2021-09-05 11:45:27 -05:00
Devin J. Pohly
2e9c4d8ea9 simplify client_for_each_surface
All the XDG surface iterator does is iterate the main wlr_surface, then
iterate the popups.  If we inline that function, we can merge part of it
with the X11 case.
2021-09-05 11:41:23 -05:00
Tobias Bengfort
79dcc0d327 reset cursor mode when grabc is unmapped 2021-09-04 13:47:49 +02:00
Devin J. Pohly
55bbbc3dcb Merge branch 'main' into wlroots-next 2021-08-23 21:08:27 -05:00
Devin J. Pohly
d4e08c0762 update deprecated xkb function name 2021-08-23 18:59:31 -05:00
Devin J. Pohly
772c0fe1bd Merge pull request #145 from PalanixYT/wlroots-next
wlr_layer_surface_v1_close has been replaced by wlr_layer_surface_v1_…
2021-08-23 11:58:02 -04:00
Palanix
3273f749ea wlr_layer_surface_v1_close has been replaced by wlr_layer_surface_v1_destroy 2021-08-21 01:53:38 +02:00
Devin J. Pohly
1183a319a0 Merge pull request #136 from guidocella/presentation-time
implement the presentation time protocol
2021-08-14 07:53:26 -04:00
Devin J. Pohly
3f70bbb5c4 Merge pull request #130 from drdonahue/printstatus-fix
Fix excessive printstatus() calls when dmenu is up
2021-08-14 07:50:40 -04:00
Guido Cella
8aa50dfdf1 update IRC channel 2021-08-03 06:29:26 +02:00
Guido Cella
d175a58d73 implement the presentation time protocol
This lets applications, such as mpv with --video-sync=display-resample,
know accurately when frames are displayed and ensure smooth video
playback.
2021-08-02 16:33:38 +02:00
David Donahue
52e6bf4735 Moved printstatus() call in focusclient() to prevent printstatus being called on every frame when things like dmenu are up 2021-07-01 15:20:30 -05:00
Devin J. Pohly
3b05eadeaf update notes about starting dwl
Includes mention of video/input groups
2021-06-30 14:46:20 -05:00
Devin J. Pohly
f9f3f3432b Merge branch 'xdg-activation' into wlroots-next 2021-06-30 14:09:02 -05:00
Devin J. Pohly
d4ce92a7b5 Merge branch 'xdg-activation' into wlroots-next 2021-06-03 01:44:36 -05:00
Devin J. Pohly
34521ea43b Merge branch 'main' into wlroots-next 2021-06-03 01:43:49 -05:00
Devin J. Pohly
c6f96d5391 mention -devel packages
It seems like there are people trying dwl who aren't as familiar with
how their distros do development, so let's give them a pointer in the
right direction.
2021-06-03 01:41:10 -05:00
Devin J. Pohly
bd2f7fbb40 exit cleanly on INT/TERM 2021-05-26 23:30:49 -05:00
Devin J. Pohly
823cefd292 handle ephemeral pageflip failures
If a transient failure occurs in wlr_output_commit, re-render until it
doesn't happen.  This could possibly be removed if we decide to
implement damage tracking in the future.
2021-05-25 02:52:33 -05:00
Devin J. Pohly
60c40c0989 print status on output create
Along with starting the -s command earlier, this will allow the initial
monitor setup to generate printstatus info.
2021-05-24 22:31:36 -05:00
Devin J. Pohly
5dfd7cf180 Merge branch 'main' into wlroots-next 2021-05-24 21:56:05 -05:00
Devin J. Pohly
06ca860092 factor xwayland hackiness out into client.h 2021-05-23 18:28:13 -05:00
Devin J. Pohly
56d93898ea Merge pull request #122 from Sevz17/set-tiled-on-map
before set tiled verify if client is xdg-shell, then set tile
2021-05-23 18:24:24 -05:00
Sevz17
9ab5e01d5b before set tiled verify if client is xdg-shell, then set tile 2021-05-23 11:44:56 -05:00
Devin J. Pohly
ce9f264919 Merge pull request #120 from djpohly/set-tiled-on-map
Wait until map to set window's tiled state
2021-05-23 00:28:49 -05:00
Devin J. Pohly
d8cf65c74f implement urgency hint 2021-05-22 21:21:53 -05:00
Devin J. Pohly
93a58abf29 Wait until map to set window's tiled state
Workaround for a bug in Chromium where it fails to attach a buffer to
the surface.  Fixes #119.
2021-05-22 14:24:18 -05:00
Devin J. Pohly
1b139a860d update README 2021-05-18 11:33:12 -05:00
Devin J. Pohly
41bb7a7679 Merge branch 'pipe-status' 2021-05-10 11:49:16 -05:00
Devin J. Pohly
2f39fb84ac Merge pull request #112 from JaGoLi/main
Add uninstall target in makefile like dwm
2021-04-19 11:12:46 -05:00
Jason Goulet-Lipman
d57db4cac9 added uninstall target 2021-04-19 09:05:35 -04:00
Devin J. Pohly
3f86336bad Merge branch 'main' into pipe-status 2021-04-15 13:06:06 -05:00
Devin J. Pohly
3727f4a7b3 update status info if focused client changes title
Fixes #108.
2021-04-15 13:05:05 -05:00
Devin J. Pohly
4170a90fbc group phony targets together in Makefile 2021-04-15 13:04:31 -05:00
Devin J. Pohly
6a0dec69ec re-compile if config.mk changes 2021-04-15 13:03:21 -05:00
Devin J. Pohly
b372d4b55e pipe status info into -s command
Unlike with X window managers, the display socket in Wayland isn't set
up prior to starting the compositor.  Because of this, you can't pipe
the compositor's output directly into a program which needs access to
$WAYLAND_DISPLAY, which is a typical setup for this purpose.  Existing
scripts have been forced to create a pipe/FIFO or a temporary file as an
intermediary.

Instead, send the status info directly to stdin of the -s command, which
*does* have access to $WAYLAND_DISPLAY.

Fixes #103.
2021-04-14 11:23:23 -05:00
Devin J. Pohly
77e75cf554 Merge branch 'main' into wlroots-next 2021-04-09 12:53:15 -05:00
Devin J. Pohly
9071ce6c84 nuke CSDs, hopefully for good! 2021-04-09 12:37:49 -05:00
Devin J. Pohly
84b26ef1ba Revert "fix README for main branch"
This reverts commit 3a72cd924c.

There is probably an easier way to keep this difference, but hey, this
works for me.
2021-04-08 07:12:50 -05:00
Devin J. Pohly
3a72cd924c fix README for main branch 2021-04-08 07:11:13 -05:00
Devin J. Pohly
2a9404ac2a Merge branch 'main' into wlroots-next 2021-03-30 13:57:34 -05:00
Devin J. Pohly
3c83e0cfb8 don't move/resize if already moving/resizing
Fixes #102.  The "ideal" behavior might be to ignore buttons other than
the one being used for the action, but this is super-simple and still
seems reasonable.
2021-03-30 13:56:04 -05:00
Devin J. Pohly
e73ea679f4 Merge branch 'main' into wlroots-next 2021-03-30 13:48:06 -05:00
Devin J. Pohly
db647f2df6 fix labels on issue templates 2021-03-29 17:04:37 -05:00
Devin J. Pohly
cd3d0a102f Merge branch 'main' into wlroots-next 2021-03-25 10:09:58 -05:00
Stivvo
38ba6d2277 Fullscreen: simplifications and fixes
Merges #69.
2021-03-25 10:05:12 -05:00
Devin J. Pohly
c2b53c2d8d Merge pull request #91 from drdonahue/wip-tag-status-interface
Interface to display tag information on status bar
2021-03-25 09:58:17 -05:00
David Donahue
ecc60878b3 changed fprintf(stdout) instances to printf(), changed function name from statusbar to printstatus 2021-03-13 11:20:33 -06:00
Devin J. Pohly
43b6e804cf Revert "remove sigchld function"
This reverts commit 1fa72b0772.
Fixes #97.
2021-03-13 10:42:42 -06:00
Devin J. Pohly
fba820d5f6 Merge branch 'main' into wlroots-next 2021-03-10 09:53:09 -06:00
Devin J. Pohly
1fa72b0772 remove sigchld function
Explicitly setting the handler for SIGCHLD to SIG_IGN tells the OS to
reap zombie processes automatically, which is what we wanted anyway.
2021-03-10 09:50:09 -06:00
David Donahue
7cee5060bc added redirect from stdout to stderr for spawned processes to prevent conflicts with the statusbar outputs 2021-03-06 12:20:56 -06:00
Devin J. Pohly
2144546192 Merge branch 'main' into wlroots-next 2021-03-03 11:30:39 -06:00
Devin J. Pohly
15f5d31f98 correct key constant name
Fixes #94.
2021-03-03 11:29:53 -06:00
David Donahue
5b51bb82e2 Fixed tab formatting in 6 locations where statusbar() is called 2021-03-01 14:38:00 -06:00
David Donahue
f5e7caac00 Changed output to stdout instead of a file 2021-03-01 13:49:29 -06:00
David Donahue
593b7eec3c updated output format for better expansibility and easier parsing 2021-03-01 13:19:25 -06:00
Devin J. Pohly
b063dd89c3 Merge branch 'main' into wlroots-next 2021-03-01 11:26:16 -06:00
Devin J. Pohly
fd498e1910 clarify a bit about status bars 2021-03-01 11:25:28 -06:00
Devin J. Pohly
02eed717ca add explanatory command about Ctrl-Alt-Bksp/Fx 2021-03-01 11:22:08 -06:00
Devin J. Pohly
2d71c9b9ff Add default menu command
dwm config parity
2021-03-01 11:21:15 -06:00
Devin J. Pohly
87b16e6095 Defaults should match dwm/Xorg default behavior 2021-03-01 11:17:10 -06:00
Devin J. Pohly
9f90011ea2 add note about wlroots-next branch 2021-02-16 13:20:42 -06:00
Devin J. Pohly
c1eb2b49cd Revert "Revert "remove EGL parameter from backend_autocreate""
This reverts commit 8ed88822ca.
2021-02-16 13:13:49 -06:00
Devin J. Pohly
e8192b4fc9 Revert "Revert "fix undeclared WLR_KEY_PRESSED""
This reverts commit a11f2bbc7a.
2021-02-16 13:13:48 -06:00
Devin J. Pohly
4798450944 Revert "Revert "document that we currently follow wlroots-git""
This reverts commit ed8e80d961.
2021-02-16 13:13:47 -06:00
Devin J. Pohly
ed8e80d961 Revert "document that we currently follow wlroots-git"
This reverts commit 9677f99dc3.
2021-02-16 13:11:30 -06:00
Devin J. Pohly
a11f2bbc7a Revert "fix undeclared WLR_KEY_PRESSED"
This reverts commit 67896e9d8b.
2021-02-16 13:09:00 -06:00
Devin J. Pohly
8ed88822ca Revert "remove EGL parameter from backend_autocreate"
This reverts commit 0ff13cf216.
2021-02-16 13:08:58 -06:00
Devin J. Pohly
3e82fad9c4 fix style on space-indented function 2021-02-14 12:43:10 -06:00
David Donahue
a1e24075d8 Removed unused variable from statusbar 2021-02-08 18:12:24 -06:00
David Donahue
27598bd04a added statusbar update when tags are updated 2021-02-07 01:03:04 -06:00
David Donahue
3868217466 Added interface to output information about tags, the currently selected monitor, and the focused client to a file for use by a status bar 2021-02-07 00:31:01 -06:00
Devin J. Pohly
a4c0b914f0 Link patches page in the README 2021-01-19 02:44:00 -06:00
Devin J. Pohly
9c1943ade5 add some explanation of output reconfiguration
Hopefully this will help "future us" understand what's going on.
2021-01-18 15:51:32 -06:00
Devin J. Pohly
a9e1cd4201 remove hacky code from output-management handler
This functionality belongs in updatemons(), where it can hopefully be
written a bit more elegantly.
2021-01-18 15:38:25 -06:00
Devin J. Pohly
ab03282295 commit entire output config, or fail and rollback
The wlr-output-management protocol requires that either all of the
changes from an apply request be applied successfully, in which case a
"succeeded" event is sent, or all of the changes are reverted and a
"failed" event is sent.  As written, this could partially commit
changes, then fail.

Test the changes first (even for an "apply" event), then commit or
rollback as appropriate.
2021-01-18 15:02:15 -06:00
Devin J. Pohly
3747b3162e Merge pull request #71 from djpohly/output-layout
call updatemons at the appropriate times
2021-01-18 14:37:52 -06:00
Devin J. Pohly
5eefb51fea use updatemons as handler for output_layout.change
This should end up firing precisely when we need to adjust our geometry,
rather than us guessing about it based on requests.
2021-01-18 14:34:05 -06:00
Devin J. Pohly
43f1076833 remember to add client.h in Makefile 2021-01-18 14:16:24 -06:00
Devin J. Pohly
c63d4c41ab unify increment style while we're here 2021-01-18 14:14:37 -06:00
Devin J. Pohly
81d35aaccf remove unnecessary variable 2021-01-18 14:12:38 -06:00
Devin J. Pohly
a5210f7d77 cleanup on aisle createmon() 2021-01-18 14:12:00 -06:00
Devin J. Pohly
48ef5e8bd2 Merge pull request #84 from meutraa/gitignore-config-h
Add config.h to .gitignore
2021-01-14 20:49:54 -06:00
Devin J. Pohly
264be4ebba Merge pull request #80 from sam-barr/dwl_upstream
Fix Initialization of NetWM Atoms
2021-01-14 20:29:17 -06:00
Devin J. Pohly
1d7c756107 Merge pull request #77 from djpohly/use-output-direction
Determine monitor order spatially
2021-01-14 20:26:45 -06:00
Devin J. Pohly
7fe7be5fb8 update layer-shell protocol to version 4
Tracking with breaking change from swaywm/wlroots@b7dc4f2.
2021-01-13 12:18:27 -06:00
meutraa
a58adbb7b9 Add config.h to .gitignore 2021-01-13 15:25:24 +00:00
sam-barr
3d696dfb7d Fix Initialization of NetWM Atoms
Additionally, variables xcursor and xcursor_mgr are only used
when xwayland is defined, so I make the variables declaration
contingent on whether xwayland is being used
2021-01-11 07:47:04 -05:00
Devin J. Pohly
6267593cc2 remove now-unneeded monitor position field 2021-01-06 17:23:35 -05:00
Devin J. Pohly
e8ca8a8ac7 use output layout for dirtomon
No need to track our own order; wlroots has a reasonable default for us
already.
2021-01-06 17:19:44 -05:00
Devin J. Pohly
4bf2923f4e Merge pull request #72 from Stivvo/output-compile-set
Define monitor's x,y at compile time
2021-01-06 16:44:31 -05:00
Devin J. Pohly
0ff13cf216 remove EGL parameter from backend_autocreate
Tracking with breaking change in swaywm/wlroots#2593.
2021-01-04 13:55:24 -05:00
Devin J. Pohly
d7601cd48a can run nested in Wayland or X 2021-01-02 20:02:44 -05:00
Devin J. Pohly
1f97655d5b never ever ever tell anyone to sudo make
I am embarrassed to have let this slip through someone's merge.  Anybody
who genuinely needs to `sudo make` will know it; everyone else should
use a proper package manager and build system.
2021-01-02 19:58:46 -05:00
Devin J. Pohly
1ab3dac5cc Merge pull request #74 from djpohly/document-git
document that we currently follow wlroots-git
2021-01-02 19:57:36 -05:00
Devin J. Pohly
9677f99dc3 document that we currently follow wlroots-git
Closes #73.
2021-01-02 19:56:40 -05:00
Stivvo
fa782896f8 Define monitor's x,y at compile time
Replaces the outputOrder patch.

This avoids recalculating positions and allows to arrange monitors in
any order, not just from left to right.

The order in which monitors are defined in config.h still matters but
it's just the order in the list, not the actual position.
2020-12-30 17:07:48 +01:00
Devin J. Pohly
33c36be2fc Revert "Allow toggling the layout before selecting a different one"
This reverts commit 90cc3b1e2c.  Didn't
mean to merge this change.
2020-12-28 15:51:04 -05:00
Devin J. Pohly
313d1f7ecc flesh out cleanup
This is the order of *_destroy calls which resulted in the fewest
errors/leaks detected by Valgrind.  Most of the errors come from the
gbm_allocator code - will have to figure out which destroy call is still
missing.
2020-12-27 20:04:05 -05:00
Devin J. Pohly
a2a20cca42 remove limitation notes (tracked in Issues) 2020-12-27 17:15:34 -05:00
Devin J. Pohly
0090b6bed6 clarify intention of feature suggestions 2020-12-27 17:15:21 -05:00
Devin J. Pohly
7b1b5c75e9 fix segfault in xwayland cursor manager 2020-12-27 14:00:07 -05:00
Devin J. Pohly
7b320a195c macroize event handlers
This was a prime candidate for reducing the verbosity of some of our
code
2020-12-27 13:28:37 -05:00
Devin J. Pohly
7ed4956b23 Revert "remove github directory"
This reverts commit 572ccd92c4.
2020-12-27 12:54:39 -05:00
Devin J. Pohly
167dc03004 credit for patch maintenance as well 2020-12-25 16:04:07 -05:00
Devin J. Pohly
df610157e5 update README based on contributions 2020-12-25 15:51:12 -05:00
Devin J. Pohly
dfc347af2f add Discord link 2020-12-25 12:26:21 -05:00
Devin J. Pohly
2230f92ef0 add "all" target 2020-12-25 12:07:43 -05:00
Devin J. Pohly
e0a48accc5 making this a team 2020-12-25 11:27:17 -05:00
Devin J. Pohly
848d89b7f3 XWayland still buggy, disable by default 2020-12-25 02:10:50 -05:00
Devin J. Pohly
ef76c921ed no need to cast NULL to void * 2020-12-25 01:41:09 -05:00
Devin J. Pohly
388c5580cb consolidate some of the ugliness into a separate file
Similar to Linux kernel approach, encapsulate some of the uglier
conditional compilation into inline functions in header files.

The goal is to make dwl.c more attractive to people who embrace the
suckless philosophy - simple, short, hackable, and easy to understand.
We want dwm users to feel comfortable here, not scare them off.  Plus,
if we do this right, the main dwl.c code should require only minimal
changes once XWayland is no longer a necessary evil.

According to `cloc`, this also brings dwl.c down below 2000 lines of
non-blank, non-comment code.
2020-12-25 01:39:07 -05:00
Devin J. Pohly
bac3221a03 Stivvo deserves a shout-out too! 2020-12-25 00:37:26 -05:00
Devin J. Pohly
efe2a97bcf fix build with -DXWAYLAND 2020-12-24 22:39:45 -05:00
Devin J. Pohly
5ba09b56f3 missed a few of these 2020-12-24 22:36:49 -05:00
Devin J. Pohly
1678b05905 don't call applyexclusive just to return 2020-12-24 22:36:32 -05:00
Devin J. Pohly
57d0760635 let's not alienate the dwm folks
Fix style.
2020-12-24 22:21:00 -05:00
Devin J. Pohly
206427537a Merge updates from guidocella
Thanks so much for helping to keep the project running while life was
crazy!
2020-12-24 21:56:41 -05:00
Devin J. Pohly
cfe7815903 Merge pull request #32 from alex-courtis/24-xwayland-cursor
#24 ensure that xwayland cursor defaults to left_ptr
2020-12-24 21:37:48 -05:00
Devin J. Pohly
7803022d33 simplify ROUND macro 2020-12-24 21:37:21 -05:00
Devin J. Pohly
128c2926e1 Merge pull request #54 from Bonicgamer/swayscalebox
Sway scale_box (rounding)
2020-12-24 21:36:38 -05:00
Devin J. Pohly
c5087d413f Merge pull request #53 from Stivvo/fullscreen
Fullscreen support
2020-12-24 21:35:57 -05:00
Devin J. Pohly
d94266df91 fix crash on non-libinput pointers (e.g. X11 backend) 2020-12-24 21:15:40 -05:00
Devin J. Pohly
5f3a7887f3 Same target as dwm sounds like a good goal 2020-12-24 20:28:08 -05:00
Devin J. Pohly
62529e251d Merge pull request #49 from guidocella/layer-shell
Layer shell
2020-12-24 20:24:14 -05:00
Devin J. Pohly
41d7fdbd60 use the install command to install 2020-12-24 19:07:38 -05:00
Devin J. Pohly
8dd99d2a10 Merge pull request #65 from Keating950/master
Add install target to Makefile
2020-12-24 19:07:08 -05:00
Devin J. Pohly
e0f11abd13 Merge pull request #56 from oyren/readme_log
remove log flags from readme
2020-12-24 18:57:55 -05:00
Devin J. Pohly
b6a3891ce6 Merge pull request #62 from Java-boi/master
Added basic tap-to-click for touchpad users
2020-12-24 18:55:06 -05:00
Devin J. Pohly
a42613db9d Merge pull request #66 from richardipsum/master
fix undeclared WLR_KEY_PRESSED
2020-12-24 14:28:04 -06:00
Stivvo
d21d5ee262 Change fullscreen policies
When a new client is spawned, fullscreen isn't disabled for all clients
in that monitor any more.

Instead, all fullscreen clients are kept fullscreen, while other clients
spawn in the background.

When fullscreen is disabled, all clients are rearranged.

This is made to make dwl more flexible allowing multiple fullscreen
clients at the same time, have floating clients on top of a fullscreen
one and let stuff happen without quitting fullscreen, like many other
WMs and DEs.
2020-12-24 21:05:34 +01:00
Stivvo
707c1710b7 quitallfullscreen() even when enabling fullscreen
Disable fullscreen on all visible clients in that monitor also before
enabling it on another client.

quitallfullscreen() is reintroduced becouse is now more useful

set c->isfullscreen later to avoid making quitallfullscreen() disable
fullscreen on the current client
2020-12-24 12:29:44 +01:00
Stivvo
86ba4c8526 Remove goto render (easier merge) 2020-12-24 00:34:33 +01:00
Guido Cella
3695ac643f spacing 2020-12-22 09:13:18 +01:00
Guido Cella
572ccd92c4 remove github directory 2020-12-21 21:39:26 +01:00
Guido Cella
bcf9d8fb9a disable natural scrolling by default
This inverts the scroll even on regular mice.
2020-12-21 13:06:06 +01:00
Guido Cella
33e8a3f1f3 update comments and remove debugging printf 2020-12-21 11:22:04 +01:00
Stivvo
5668c61616 Define monitor order with monrules[]
The order in which monitors are defined in monrules[] actually matters.

Monotors that aren't configured in monrules[], it will always be the
leftmost.
2020-12-21 11:12:44 +01:00
Guido Cella
cf7c5eae21 don't reset the cursor image
...in internal calls to restore pointer focus. Necessary for the
unclutter patch, and there's no harm in avoiding this call even in
mainline; might prevents issues in same edge cases.
2020-12-21 10:28:09 +01:00
Guido Cella
c9964016b8 update README.md
- A maximum SLOC can't be reasonably determined before implementing the
missing protocols, so not any time soon

- dwl definitely isn't a simple as dwm since it must implement lots of
Wayland protocols and not just manage windows. The status bar
integration, layer shell popups, damage tracking and IME are gonna
require hundreds more lines each.

- "Buffering of input when spawning a client so you don't have to wait
for the window (use `wl_client_get_credentials` to get the PID) - would
this require passing through something like dmenu?  Extension protocol?"
This sounds exoteric, if anything this should be patch.

- Can dwl really be started from within an X session? When I do it from
dwm it crashes.

- A window's texture is scaled for its "home" monitor only (noticeable
when window sits across a monitor boundary)
Gonna open a ticket for this rather than keep it in the README.
2020-12-21 10:28:04 +01:00
Guido Cella
499cb2c2b6 say TODO
just wtf is XXX supposed to be? It sounds like a pornographic thing.
2020-12-20 18:19:49 +01:00
Guido Cella
5ed227384b rename drw
It's impossible to understand that this stands from drawable if you're
not familiar with dwm's code.
2020-12-20 18:19:43 +01:00
Guido Cella
b161b5d8f4 don't notify of activity
...or update selmon when we just want to restore pointer focus.
2020-12-20 16:04:13 +01:00
Guido Cella
13c7e039bb deactivate the focused client on overlay focus 2020-12-20 15:55:52 +01:00
Guido Cella
a571ea465c replace shouldfocusclients with checking old
And don't activate clients while an overlay is focused.
2020-12-20 15:46:31 +01:00
Guido Cella
39946e07f2 fix keyboard focus with overlays
Don't let internal calls to motionnotify(0) meant to update the pointer
focus from maplayersurfacenotify and destroylayersurfacenotify also
shift the keyboard focus to the surface under the cursor with
sloppyfocus.
2020-12-20 15:46:31 +01:00
Guido Cella
f80f08848b ensure that xwayland cursor defaults to left_ptr
Don't show an X cursor when closing an Xwayland window or with certain
dropdowns.

Based on https://github.com/djpohly/dwl/pull/32
2020-12-20 14:57:41 +01:00
Guido Cella
444a5f9dec enable adaptive sync
The comment in this function's declaration says the backend is free to
ignore this setting, so maybe there's no need to make it configurable?
2020-12-20 14:57:41 +01:00
Guido Cella
6b47e2bb62 use bool
Because it's 2020. Passing integers to wlroots variables and functions
with bool in their signature is silly.
2020-12-20 14:57:39 +01:00
Guido Cella
0b2f4f213d remove -Werror=declaration-after-statement
wtf is the point of this crap? It makes the code harder to follow,
increases the line count and made me fail compilation a million times.
We shouldn't blindy follow everything about suckless's style.
2020-12-19 19:52:28 +01:00
Guido Cella
ba1540c3d0 remove goto when the border is 0
Rendering 0-dimension rectangles no longer crashes wlroots.
2020-12-19 19:32:16 +01:00
Guido Cella
2eaa8c6de3 remove useless assignment
calloc already initializes ints to 0.
2020-12-19 18:56:42 +01:00
Guido Cella
ee7e8688a7 s/maprequest/mapnotify
This should be consistent with other function names instead of keeping
the X name.
2020-12-19 18:51:22 +01:00
Keating950
05883b7b2f add install target to Makefile and corresponding prefix variable to config.mk 2020-12-19 18:45:49 +01:00
Guido Cella
feeacc88c4 tweak trackpad variables
Add static const and move them below in order to group the keyboard
options.
2020-12-19 18:39:30 +01:00
will
aa679c4f29 Added support for natural scrolling 2020-12-19 18:37:10 +01:00
will
4f1e557d3d Added basic tap-to-click for touchpad users 2020-12-19 18:37:10 +01:00
Oyren
bfbfe9f2b2 remove log flags from readme
The following commit has removed the logs but they are still in the
readme.
3b1992ca91
2020-12-19 18:36:29 +01:00
Bonicgamer
679f6493c9 Made scalebox the way sway does it
Scaling a wlr_box without rounding can sometimes make the borders not
connected and nice. I noticed this when setting scale in monrules to 1.2

So I've went and copied what Sway did in desktop/output.c but without
having a second function and now using a random rounding macro I found
on the internet so as to not use round from math.h.
2020-12-19 18:35:25 +01:00
Guido Cella
9c2524b06a s/prev/old
Be consistent with the rest of the code and dwm
2020-12-19 18:31:26 +01:00
Guido Cella
c89de53de3 remove togglefullscreen keybinding
Distribute it as a patch like in dwm since graphical applications
usually provide their own keybinding; I guess it's only for terminals.

Note that even though these commits don't let you open multiple windows
in fullscreen and cycle between them like in dwm, with just
fullscreennotify spawning new windows or changing tag would still exit
fullscreen automatically, but you would have to toggle fullscreen twice
when switching back to the fullscreen window to enter fullscreen again,
so this is better since it avoids that.
2020-12-19 18:23:23 +01:00
Stivvo
14ce016213 Readme: achieve fullscreen + allow borderpx = 0 2020-12-19 18:06:38 +01:00
Stivvo
1e134fde97 Quit fullscreen on new x11 window
After the removal of quitfullscreen() dwl wouldn't compile widh xwayland
enabled because createnotifyx11 was still using the old function
2020-12-19 18:06:38 +01:00
Stivvo
32612c90b6 Delete quitfullscreen()
quitfullscreen() was replicating the functionalities of setfullscreen(c,
0)

Reusing setfullscreen() in quitfullscreen() leads to a 3 line function,
which is useless since quitfullscreen() is used once anyway
2020-12-19 18:06:37 +01:00
Stivvo
5a16649e79 Keep windows fullscreen after redraw
This fixes the bug that happens when changing workspace (or any time
arrange() is called) where there are fullscreen windows, which are still
fullscreen but leave the space for layer surfaces like waybar (which
should be hidden when going fullscreen)

Also as soon one fullscreen window is found hte function returns to
improve efficiency
2020-12-19 18:06:11 +01:00
Stivvo
02a09cb854 Set fullscreen simpler 2020-12-19 18:06:11 +01:00
Stivvo
cb9269df41 use m->m (fullscreen on top of layers) 2020-12-19 18:06:11 +01:00
Guido Cella
36b9831ffd fix typo 2020-12-19 18:06:11 +01:00
Stivvo
5bd9be3a75 Allow borderpx = 0 2020-12-19 18:06:11 +01:00
Stivvo
f125e1b9a4 Toggle fullscreen on all clients
mod+e allows to toggle fullscreen any client, even those who don't
support it themselves
2020-12-19 18:06:11 +01:00
Stivvo
d41cc60ec1 Handle new windows
Windows lose fullscreen state when a new window is created in the same
tag
2020-12-19 18:06:09 +01:00
Stivvo
2abfd475de isfullscreen int 2020-12-19 18:05:51 +01:00
Stivvo
af68b71094 Same fscreen func for xdg and xwayland 2020-12-19 18:05:51 +01:00
Stivvo
64113a682f Fullscreen xwayland 2020-12-19 18:05:51 +01:00
Stivvo
573535c89c Unlink fullscreen 2020-12-19 18:05:51 +01:00
Stivvo
60a732ceb8 Restore windows after fullscreen
Store position and size of windows before going fullscreen. This is more
efficient than arrange() and also works with floating windows

All the clients keep their original position because arrange() isn't
used after quitting fullscreen
2020-12-19 18:05:51 +01:00
Stivvo
de6db97401 No borders on fullscreen windows
Some code has been borrowed from the smartBorders patch
2020-12-19 18:05:51 +01:00
Stivvo
dd3920e75d Toggle fullscreen 2020-12-19 18:05:51 +01:00
Stivvo
0f04c76387 Basic fullscreen 2020-12-19 18:05:51 +01:00
Guido Cella
0f48c9552e handle the x11 configure event
This fixes the window size of old games in Wine.
2020-12-19 12:34:32 +01:00
Guido Cella
0016a209e4 implement the virtual keyboard protocol
This is used by wtype.

Also properly cleanup keyboards. Without wl_list_remove(&kb->link) dwl
crashed after using wtype 2-3 times.
2020-12-19 12:34:32 +01:00
Guido Cella
90cc3b1e2c Allow toggling the layout before selecting a different one 2020-12-19 12:34:32 +01:00
Guido Cella
41cc23e1cf Implement the idle protocol
It allows clients such as swayidle and chat applications to monitor user
idle time.
2020-12-19 12:34:32 +01:00
Guido Cella
1024928c15 deactivate focused client when spawning a new one
Because maprequest immediately calls wl_list_insert(&fstack, &c->flink),
in the following call to setmon(), the selclient() which is passed to
focusclient() as the old client is actually the newly mapped client, and
the real old one is never deactivated. You can see this by, for example,
opening Chromium's devtools, then spawning a terminal. The background of
the focused line in the devtools doesn't change from light blue to grey.

We can't just remove wl_list_insert(&fstack, &c->flink) from maprequest,
because calling wl_list_remove in focusclient() with a client that has
not been added to the list causes a segmentation fault.
Therefore we fix the focusclient call by not passing it the old client
every time, but instead using the wlroots function that gets the focused
surface and deactivate that, like in TinyWL.
This also avoids getting the selected client and passing it to
focusclient() on every call unnecessarily, and will allow removing
shouldfocusclients in a future commit by checking if old is a layer
surface instead.
2020-12-19 12:34:31 +01:00
Guido Cella
64faad7cb6 implement the wlr-data-transfer protocol
It makes wl-clipboard work properly in neovim, without having to create
a transparent surface that steals focus and causes flickering. It's also
required for clipman.
2020-12-19 12:26:31 +01:00
Guido Cella
ee5bd9a643 fix temporarily disabling a single monitor
The code in this else completely freezes my system when I run the
swayidle command to replicate xset dpms force off. No idea if it works
on multiple monitors, but for now avoid running when there's 1 monitor.

Also remove the comment with the function name in sway.
2020-12-19 12:26:14 +01:00
Richard Ipsum
67896e9d8b fix undeclared WLR_KEY_PRESSED 2020-11-23 16:58:43 +00:00
Keating950
9578816487 add install target to Makefile and corresponding prefix variable to config.mk 2020-11-22 12:58:49 -05:00
Stivvo
d9ab75721a Don't switch to another disabled monitors
Since wlr_output_enable doesn't have any effect before finishing all the
procedure, a little hack allows to make use of focusmon(), which must
know the latest in about which output is currently disabled

Also improve performance in focusmon() and cleaner code in
outputmgrapplyortest()
2020-10-31 18:29:33 +01:00
Stivvo
80a685ee51 Fix crash with no monitors left
When there's no monitors left, prevent the while in cleanupmon() to
become an infinite loop

Also switch to the left monitors instead of the right
2020-10-31 17:11:16 +01:00
Stivvo
5221a329e2 closemon() has now only 1 parameter 2020-10-31 16:25:46 +01:00
Stivvo
934ce085b6 Don't switch to disabled mons after unplug 2020-10-31 16:25:29 +01:00
Stivvo
38606a1d23 Merge branch 'handleUnplug' into output-management 2020-10-31 16:16:22 +01:00
Stivvo
9f0b16868a Back to closemon() with one parameter
With the recent changes in output-management, the extra argument in
closemon() would be needed only when unplugging the monitor, so it isn't
worth it anymore. Also now is more efficient.
2020-10-31 13:19:31 +01:00
Stivvo
9f3f15b467 Disable mon faster
Since focusmon() now never focuses disabled monitors, there's no need to
focus the disabled monitor first
2020-10-31 13:00:55 +01:00
Stivvo
25671d7905 Fix crash when disabling focused mon
m->link.next leads to errors if the monitor to disable doesn't have a
"next" (right) monitor and is currently focused. dirtmon() does more
checks.

In some previous commits m->link.next is told to be left monitor, which
is wrong

Also focusclient() explicitly checks for disabled monitors (this fixes
in case of more than one disabled monitor)
2020-10-31 12:52:22 +01:00
Stivvo
60a63b637c Merge branch 'handleUnplug' into output-management 2020-10-31 11:25:05 +01:00
Stivvo
5622dbdaf3 Fix crash unplugging focused mon 2
Focus the top client on newmon, which we know for sure that it isn't
going to be unplugged or disabled and actually set that as the focused
monitor to move the focus. This is necessary to prevent crash when
disabling monitors with the output-management patch.
2020-10-31 11:17:57 +01:00
Stivvo
0a0e61e58d Merge branch 'handleUnplug' into output-management 2020-10-31 11:04:04 +01:00
Stivvo
fab42e7c41 Fix crash unplugging a focused mon
Focus newmon, which we know for sure that it isn't be unplugged or
disabled
2020-10-31 11:03:00 +01:00
Stivvo
dbd665c862 Merge branch 'handleUnplug' into output-management 2020-10-31 00:03:40 +01:00
Stivvo
a4d42ea798 Focus client on a new monitor before closing 2020-10-31 00:01:59 +01:00
Stivvo
62fb4c086e Block access to disabled monitor
Before this, pressing mod+comma or mod+period (focusmon function) moved
the focus to disabed monitors. Now, all disabled monitors are skipped
2020-10-30 23:49:01 +01:00
Stivvo
388ab9df2f Move disabled clients to the left
To the nearest monitor to the left of the disabled one
2020-10-30 23:34:26 +01:00
Stivvo
806ebffe7d Merge branch 'handleUnplug' into output-management 2020-10-30 23:31:46 +01:00
Stivvo
fbbc1fd656 Merge branch 'handleUnplug' of http://olidata.stivvo01.com:3000/Stivvo01/dwl into handleUnplug 2020-10-30 23:30:00 +01:00
Stivvo
d4178b9d2a Closemon(), newmon as parameter
This allows to fix output-management: move clients to the monitor on the
left of the disabled one, instead of the leftmost (which might happen to
be the disabled one)

Also using wl_list_foreach() and then brake after the first iteration is
ugly and inefficient
2020-10-30 23:22:55 +01:00
Stivvo
4deeddceff Actually move clients away from a disabled mon
When using wlr-randr every monitor's configuration is reevaluated, so it
must check which monitors are actually being disabled. The only way to
correctly do that is to compare the names.
2020-10-30 22:35:05 +01:00
Stivvo
874a4df389 Merge branch 'handleUnplug' into output-management 2020-10-30 19:56:14 +01:00
Stivvo
618972696d Fix crash when unplugging a focused monitor
Just focus a "safe" monitor before trying to to anything risky
2020-10-30 19:52:20 +01:00
Stivvo
7d67b77a96 Cleaner if statement 2020-10-30 16:21:00 +01:00
Stivvo
e64259abf5 Merge branch 'output-management' of http://olidata.stivvo01.com:3000/Stivvo01/dwl into output-management 2020-10-25 13:40:48 +01:00
Stivvo
42aea0b17d Handle monitor enable 2020-10-25 12:37:05 +01:00
Stivvo
3c3714aac0 Handle monitor enable 2020-10-25 11:56:21 +01:00
Stivvo
4c0d59c1a7 Move clients away from a disabled monitor
When a monitor is disabled with wlr_randr, all clients on that monitor
aren't lost but they are moved to the leftmost monitor with the same
method that handles monitor hot unplug
2020-10-25 11:22:58 +01:00
Stivvo
927352865c Merge branch 'handleUnplug' into output-management 2020-10-25 11:08:08 +01:00
Stivvo
ef7043e4d1 closemon()
Separate oputput movement from cleanupmon
2020-10-24 23:40:19 +02:00
Stivvo
db95024211 Merge branch 'handleUnplug' into output-management 2020-10-24 22:51:26 +02:00
Stivvo
fcc869ed84 Readme: achieve fullscreen + allow borderpx = 0 2020-10-24 16:51:22 +02:00
Stivvo
7017a0c64d fix compile error mixed declaration 2020-10-18 18:37:55 +02:00
Stivvo
96d9f010de Merge pull request #2 from guidocella/handleUnplug
Move sgeom assignment
2020-10-18 18:20:13 +02:00
Guido Cella
f21d3796b8 Move sgeom assignment
There is no need to repeat this. This needs to be reculalculated in my
output-management implementation too, and since I'm already calling
updatemons, this patch avoids having to repeat the assignment again.
2020-10-17 20:33:53 +02:00
Guido Cella
b30e18fa20 Implement the output management protocol
It allows clients such as wlr-randr to configure the display.
2020-10-17 20:11:31 +02:00
will
7ad14a9660 Added support for natural scrolling 2020-10-17 16:18:44 +02:00
will
598516d808 Added basic tap-to-click for touchpad users 2020-10-17 13:52:53 +02:00
Stivvo
c98686cf16 Quit fullscreen on new x11 window
After the removal of quitfullscreen() dwl wouldn't compile widh xwayland
enabled because createnotifyx11 was still using the old function
2020-10-14 17:30:10 +02:00
Stivvo
0ad8473a57 Delete quitfullscreen()
quitfullscreen() was replicating the functionalities of setfullscreen(c,
0)

Reusing setfullscreen() in quitfullscreen() leads to a 3 line function,
which is useless since quitfullscreen() is used once anyway
2020-10-14 15:46:35 +02:00
Stivvo
a2ed3d45bb Keep windows fullscreen after redraw
This fixes the bug that happens when changing workspace (or any time
arrange() is called) where there are fullscreen windows, which are still
fullscreen but leave the space for layer surfaces like waybar (which
should be hidden when going fullscreen)

Also as soon one fullscreen window is found hte function returns to
improve efficiency
2020-10-08 21:04:53 +02:00
Stivvo
172bcfd3ff Set fullscreen simpler 2020-10-08 21:04:28 +02:00
Stivvo
2b286ffeed use m->m (fullscreen on top of layers) 2020-09-16 09:20:09 +02:00
Stivvo
405280fd09 Merge pull request #1 from guidocella/fullscreen
fix typo
2020-09-16 08:55:01 +02:00
Stivvo
d8f752c9b4 Keep client tags on unplug
When unplugging a monitor, each client is moved to the same tag number
as before on the new monitor
2020-09-15 12:28:58 +02:00
Stivvo
bece225934 Handle monitor unplug
Floating widndows with "x < removed monitor's width" aren't resized
(they used to disappear in negative coordinates).

Actually delete monitors when they are unplugged, recalculate sgeom and
give a new monitor to clients that were on the removed one with setmon()

arrangefloat() funcion has been exploded to save iterations in
cleanupmon().

Also if a monitor that supports auto suspension is turned off, dwl will
count it as unplugged (it will become unreachable and all clients will
be moved to the leftmost monitor). However, if at least one monitor
isn't plugged in, dwl will still crash the same as before.

Unlike sway, when the output configuration is changed and restored,
(unplug + plug the same monitor for example) previous application
positions aren't kept. This is due to the fact that on sway every
workspace is unique among all monitors.
2020-09-15 12:28:49 +02:00
Oyren
a2e5c25e26 remove log flags from readme
The following commit has removed the logs but they are still in the readme.
3b1992ca91
2020-09-14 20:45:39 +02:00
Stivvo
537ad7e3fd Restore floating win position after mon add
Compensate the coordinate changes when adding a new monitor.

Every test so far confirms that monitors are always added to the left,
on top of the list, so every floating window's x coordinate has to be
incremented by the width of the new monitor.
2020-09-12 00:21:58 +02:00
Guido Cella
0bb25a73ec extract function and comment it 2020-09-11 14:52:59 +02:00
Guido Cella
e4d58c39e0 remove braces 2020-09-11 13:15:31 +02:00
Guido Cella
fbd905155a fix multi monitors even more
When a monitor is created or removed, the geometries of the old ones
must be updated. This is also more efficient than before since we
calculate the monitor geometries only when creating and destroying
monitors. arrangelayers() is needed to recalculate m->w. arrange() is so
clients don't move to the left monitor when plugging or unplugging
monitors (clients keep the same coordinates but the field below them
changes).
2020-09-11 13:09:18 +02:00
Guido Cella
8d8d24db09 fix typo 2020-09-10 09:09:46 +02:00
Guido Cella
8f0ce672d3 simplify 2020-09-10 06:01:18 +02:00
Guido Cella
143dce094c fix multi monitors further
Fix layer surfaces without an exculsive area by using the right x and y
for the current monitor (by Stivvo).
2020-09-09 17:13:30 +02:00
Bonicgamer
4915214e47 Made scalebox the way sway does it 2020-09-08 14:53:34 -04:00
Guido Cella
62250661cf remove unneeded line
The bug was caused by usable_area's x and y not being set in
arrangelayers. For example if on a 2nd HD monitor, x should be 1920
while the first one ends at 1919. So I don't see why m->m should be
recalculated after creating the monitor.
2020-09-08 13:36:46 +02:00
Guido Cella
68412d8957 try to fix again
Calculate x and y of usable_area, not just width and heigth.
2020-09-08 12:49:05 +02:00
Guido Cella
69847872bb fix multi monitors
If you don't recalculate the monitor's geometry before arranging,
clients get arranged in the first monitor. I don't understand why this
fixes the bug since tile() uses m->w rather than m->m, nor why it needs
to be recalculated after creating the monitor but sway does it too.

Although not necessary to fix the bug I also made arrangelayer() do like
sway again and recalculate usable_area instead of reusing m->m, since
m->m seems to be incorrect until it gets recalculated shortly after in
arrange(), so I suspect that leaving usable_area = m->m will cause
issues under certain circumstances.

Someone with a multi-monitor setup or better knowledge of Wayland may be
able to figure out the cause of the bug. For now, this makes layer shell
work.
2020-09-08 10:28:29 +02:00
Guido Cella
79f3bbaf38 remove variable 2020-09-06 19:59:58 +02:00
Stivvo
d8570d5ceb Allow borderpx = 0 2020-09-06 12:20:41 +02:00
Guido Cella
52a4d3a1e5 use size_t for lengths 2020-09-05 18:29:39 +02:00
Guido Cella
9743778d09 rename variable and merge 2 lines 2020-09-05 14:15:03 +02:00
Stivvo
621d4c9173 Toggle fullscreen on all clients
mod+e allows to toggle fullscreen any client, even those who don't
support it themselves
2020-09-05 11:22:24 +02:00
Stivvo
d9cf3e064c Handle new windows
Windows lose fullscreen state when a new window is created in the same
tag
2020-09-05 11:02:13 +02:00
Stivvo
73d717a924 isfullscreen int 2020-09-05 10:40:52 +02:00
Stivvo
bd222cb75d Same fscreen func for xdg and xwayland 2020-09-05 10:40:52 +02:00
Stivvo
dd2adb38ae Fullscreen xwayland 2020-09-05 10:40:52 +02:00
Stivvo
aeae3dadbb Unlink fullscreen 2020-09-05 10:37:59 +02:00
Guido Cella
6b25e7ef27 simplify 2020-09-05 06:58:54 +02:00
Guido Cella
8ee0200877 use unsigned int for loop indexes 2020-09-04 21:36:43 +02:00
Guido Cella
ae798c694a Don't let overlays lose focus
if you open a new window while an overlay is mapped, the overlay should
stay focused
2020-09-04 21:35:48 +02:00
Guido Cella
8de18f9bb4 fix restoring pointer focus
I don't know why I thought it was working before. Maybe I should go do
something else.
2020-09-04 21:14:02 +02:00
Guido Cella
71572521e9 improve code style 2020-09-04 18:45:30 +02:00
Guido Cella
9308a90d11 remove comment
I don't know why it wasn't working before but now it does ¯\(ツ)/¯
(it wasn't caused by the just removed code either)
2020-09-04 18:04:20 +02:00
Guido Cella
8e81c90f31 remove mysterious code
Why would a surface that's not keyboard interactive get focused? Let's
remove this for now and see if issues arise.
2020-09-04 17:38:37 +02:00
Guido Cella
2d84c74657 focus the previous client in the similar code too 2020-09-04 17:38:04 +02:00
Guido Cella
068352e888 refocus old client
When a layer surface is destroyed focus should be returned to the last
client. Luckily if there are multiple overlays the previous overlay
still gets focused.
2020-09-04 17:21:48 +02:00
Stivvo
43bd806291 Restore windows after fullscreen
Store position and size of windows before going fullscreen. This is more
efficient than arrange() and also works with floating windows

All the clients keep their original position because arrange() isn't
used after quitting fullscreen
2020-09-04 17:11:26 +02:00
Stivvo
4b1ab7804b No borders on fullscreen windows
Some code has been borrowed from the smartBorders patch
2020-09-04 17:09:42 +02:00
Guido Cella
4341deae8f fix alhpabetical order 2020-09-04 17:01:34 +02:00
Guido Cella
5dc9460044 simplify focus leave condition 2020-09-04 16:42:14 +02:00
Guido Cella
35b93669f1 reuse motionnotify() 2020-09-04 15:35:04 +02:00
Stivvo
06982a56b5 Toggle fullscreen 2020-09-04 14:04:19 +02:00
Stivvo
60f0b667b1 Basic fullscreen 2020-09-04 12:44:09 +02:00
Guido Cella
d98ca07a64 enable pointer on layer surfaces 2020-09-04 07:42:51 +02:00
Guido Cella
b26ede4727 more TODOs 2020-09-03 18:59:27 +02:00
Guido Cella
4017a27b67 fix focus leave condition
needs refactoring and testing
2020-09-03 18:58:27 +02:00
Guido Cella
b4d9a8662f send pressed keys to topmost layer surface 2020-09-03 18:34:41 +02:00
Guido Cella
d74d404026 update README 2020-08-29 08:47:28 +02:00
Guido Cella
5d4eadeb8e remove blank line 2020-08-29 08:42:17 +02:00
Guido Cella
3203d1bafd don't handle failed calloc
be consistent with the rest of the code
2020-08-29 08:41:51 +02:00
Guido Cella
ddd3c2ad7e order variables more how like they are initialized 2020-08-29 07:42:47 +02:00
Guido Cella
b237ea0e45 simplify make clean 2020-08-28 15:17:38 +02:00
Guido Cella
2c08d0b421 Reuse render() and struct timespec *now 2020-08-28 09:00:03 +02:00
Guido Cella
03c020f058 reuse m->m 2020-08-27 06:45:26 +02:00
Guido Cella
1473d03293 remove comment
wlr_output_layout_get_box internally calls
wlr_output_effective_resolution
2020-08-27 06:04:57 +02:00
Guido Cella
c9f92bdd0e set a monitor geometry only when creating it
Lets layers with an exclusive area shrink the usable area
2020-08-27 05:22:27 +02:00
Guido Cella
b8a6d3e86a render in the same order as sway 2020-08-27 05:03:01 +02:00
Guido Cella
d61658bdd7 update make clean 2020-08-26 21:05:44 +02:00
Bonicgamer
45a2e25d6d Merge pull request #2 from djpohly/master
Merge
2020-08-26 14:24:21 -04:00
Guido Cella
e13d193346 correct variable name 2020-08-26 19:52:03 +02:00
Guido Cella
ce7bc8125d rename functions too 2020-08-26 19:51:08 +02:00
Guido Cella
e69c3d7336 remove extra space 2020-08-26 19:16:13 +02:00
Guido Cella
b35182f519 render layer surfaces 2020-08-26 19:04:30 +02:00
Guido Cella
1e2dde6674 improve naming
rename Layer to LayerSurface; layer should refer to overlay, top, bottom
or background
LayerSurface variables are always called layersurface
wlr_layer_surface_v1 variables are always called wlr_layer_surface
2020-08-26 17:33:17 +02:00
Guido Cella
05df9201b3 layer shell initial attempt 2020-08-24 07:04:34 +02:00
Bonicgamer
a683ec501e Merge pull request #1 from djpohly/master
Pull Request
2020-08-15 13:56:22 -04:00
Alexander Courtis
2616812a7a #24 ensure that xwayland cursor defaults to left_ptr 2020-08-11 11:29:32 +10:00
Alexander Courtis
e7318f7623 Merge branch 'master' into 24-xwayland-cursor 2020-08-11 11:23:58 +10:00
Alexander Courtis
f593820ede #24 ensure that xwayland cursor defaults to left_ptr 2020-08-04 11:53:23 +10:00
16 changed files with 2202 additions and 669 deletions

View File

@@ -2,9 +2,21 @@
name: Bug report
about: Something in dwl isn't working correctly
title: ''
labels: 'Type: bug'
labels: 'A: bug'
assignees: ''
---
## Info
dwl's commit:
wlroots version:
## Description
<!--
Only report bugs that can be reproduced on the main line
Report patch issues to their respective authors
If the patch author doesn't respond within a reasonable time, email me:
Leonardo Hernández Hernández <leohdz172@protonmail.com>
but note that I'm NOT making any promises
-->

View File

@@ -2,7 +2,7 @@
name: Enhancement idea
about: Suggest a feature or improvement
title: ''
labels: 'Type: enhancement'
labels: 'A: enhancement'
assignees: ''
---

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@ dwl
*-protocol.c
*-protocol.h
.ccls-cache
config.h

View File

@@ -1,8 +1,8 @@
dwl - dwm for Wayland
Copyright © 2020 Devin J. Pohly
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.

View File

@@ -1,14 +1,27 @@
include config.mk
CFLAGS += -I. -DWLR_USE_UNSTABLE -std=c99 -Werror=declaration-after-statement
CFLAGS += -I. -DWLR_USE_UNSTABLE -std=c99 -pedantic
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
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)))
all: dwl
clean:
rm -f dwl *.o *-protocol.h *-protocol.c
install: dwl
install -Dm755 dwl $(DESTDIR)$(PREFIX)/bin/dwl
install -Dm644 dwl.1 $(DESTDIR)$(MANDIR)/man1/dwl.1
uninstall:
rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1
.PHONY: all clean install uninstall
# 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
@@ -23,15 +36,29 @@ xdg-shell-protocol.c:
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
cp config.def.h $@
dwl.o: config.h xdg-shell-protocol.h
dwl.o: config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h idle-protocol.h util.h
dwl: xdg-shell-protocol.o
clean:
rm -f dwl *.o xdg-shell-protocol.h xdg-shell-protocol.c
.DEFAULT_GOAL=dwl
.PHONY: clean
dwl: xdg-shell-protocol.o wlr-layer-shell-unstable-v1-protocol.o idle-protocol.o util.o

View File

@@ -1,79 +1,90 @@
# dwl - dwm for Wayland
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:
Join us on our [Discord server](https://discord.gg/jJxZnrGPWN)!
dwl is a compact, hackable compositor for Wayland based on [wlroots](https://gitlab.freedesktop.org/wlroots/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:
- Easy to understand, hack on, and extend with patches
- One C source file (or a very small number) configurable via `config.h`
- Limited to a maximum number of SLOC (to be determined)
- 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:
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. Since wlroots provides a number of features that are more complicated to accomplish with Xlib and select extensions, dwl can be in some ways more featureful than dwm *while remaining just as simple.* Intended default features are:
- Any features provided by dwm/Xlib: simple window borders, tags, keybindings, client rules, mouse move/resize (see below for why the built-in status bar is a possible exception)
- 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
- Wayland protocols needed for daily life in the tiling world: at a minimum, xdg-shell and layer-shell (for bars/menus). Protocols trivially provided by wlroots may also be added.
- XWayland support as provided by wlroots
- Idle-inhibit protocol which lets applications such as mpv disable idle monitoring
- Provide information to external status bars via stdout/stdin
- Urgency hints via xdg-activate protocol
- Support screen lockers via input-inhibitor protocol
- Various Wayland protocols
- XWayland support as provided by wlroots (can be enabled in `config.mk`)
- Zero flickering - Wayland users naturally expect that "every frame is perfect"
- Basic yes/no damage tracking to avoid needless redraws (if it can be done simply and has an impact on power consumption)
- Layer shell popups (used by Waybar)
- Damage tracking provided by scenegraph API
Features under consideration (possibly as patches) are:
Other features under consideration 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://github.com/djpohly/dwl/pull/12)
- Additional Wayland compositor protocols which are trivially provided by wlroots or can be conditionally included via `config.h` settings (e.g. screen capture)
- External bar support instead of a built-in status bar, to avoid taking a dependency on FreeType or Pango
- Buffering of input when spawning a client so you don't have to wait for the window (use `wl_client_get_credentials` to get the PID) - would this require passing through something like dmenu? Extension protocol?
- More in-depth damage region tracking
Feature *non-goals* include:
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
## Building dwl
dwl has only two dependencies: wlroots (git version currently required) and wayland-protocols. Simply install these and run `make`.
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`.
## 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)!
## Running dwl
dwl can be run as-is, with no arguments. In an existing Wayland or X11 session, this will open a window to act as a virtual display. When run from a TTY, the Wayland server will take over the entire virtual terminal. Clients started by dwl will have `WAYLAND_DISPLAY` set in their environment, and other clients can be started from outside the session by setting this variable accordingly.
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.
You can also specify a startup program using the `-s` option. The argument to this option will be run at startup as a shell command (using `sh -c`) and can serve a similar function to `.xinitrc`: starting a service manager or other startup applications. Unlike `.xinitrc`, the display server will not shut down when this process terminates. Instead, as dwl is shutting down, it will send this process a SIGTERM and wait for it to terminate (if it hasn't already). This makes it ideal not only for initialization but also for execing into a user-level service manager like s6 or `systemd --user`.
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.
More/less verbose output can be requested with flags as well:
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).
* `-q`: quiet (log level WLR_SILENT)
* `-v`: verbose (log level WLR_INFO)
* `-d`: debug (log level WLR_DEBUG)
Note: 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
dwl
### Status information
## Known limitations and issues
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:
dwl is a work in progress, and it has not yet reached its feature goals in a number of ways:
dwl -s 'foot --server <&-'
- A window's texture is scaled for its "home" monitor only (noticeable when window sits across a monitor boundary)
- XWayland support is new and could use testing
- Urgent/attention/focus-request ([not yet supported](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/9) by xdg-shell protocol)
- Statusbar support (built-in or external)
- layer-shell
- Damage tracking
- Fullscreen/fixed windows (or whatever the Wayland analogues are)
If your startup command is a shell script, you can achieve the same inside the script with the line
exec <&-
## 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).
## IRC channel
dwl's IRC channel is #dwl on irc.libera.chat.
## 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. Speaking of which, many thanks to suckless.org and the dwm developers and community for the inspiration.
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:
- Alexander Courtis for the XWayland implementation
- 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

245
client.h Normal file
View File

@@ -0,0 +1,245 @@
/*
* Attempt to consolidate unavoidable suck into one file, away from dwl.c. This
* file is not meant to be pretty. We use a .h file with static inline
* functions instead of a separate .c module, or function pointers like sway, so
* that they will simply compile out if the chosen #defines leave them unused.
*/
/* Leave these functions first; they're used in the others */
static inline int
client_is_x11(Client *c)
{
#ifdef XWAYLAND
return c->type == X11Managed || c->type == X11Unmanaged;
#else
return 0;
#endif
}
static inline struct wlr_surface *
client_surface(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return c->surface.xwayland->surface;
#endif
return c->surface.xdg->surface;
}
/* The others */
static inline void
client_activate_surface(struct wlr_surface *s, int activated)
{
#ifdef XWAYLAND
if (wlr_surface_is_xwayland_surface(s)) {
wlr_xwayland_surface_activate(
wlr_xwayland_surface_from_wlr_surface(s), activated);
return;
}
#endif
if (wlr_surface_is_xdg_surface(s))
wlr_xdg_toplevel_set_activated(
wlr_xdg_surface_from_wlr_surface(s), activated);
}
static inline void
client_for_each_surface(Client *c, wlr_surface_iterator_func_t fn, void *data)
{
wlr_surface_for_each_surface(client_surface(c), fn, data);
#ifdef XWAYLAND
if (client_is_x11(c))
return;
#endif
wlr_xdg_surface_for_each_popup_surface(c->surface.xdg, fn, data);
}
static inline const char *
client_get_appid(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return c->surface.xwayland->class;
#endif
return c->surface.xdg->toplevel->app_id;
}
static inline void
client_get_geometry(Client *c, struct wlr_box *geom)
{
#ifdef XWAYLAND
if (client_is_x11(c)) {
geom->x = c->surface.xwayland->x;
geom->y = c->surface.xwayland->y;
geom->width = c->surface.xwayland->width;
geom->height = c->surface.xwayland->height;
return;
}
#endif
wlr_xdg_surface_get_geometry(c->surface.xdg, geom);
}
static inline const char *
client_get_title(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return c->surface.xwayland->title;
#endif
return c->surface.xdg->toplevel->title;
}
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;
struct wlr_xwayland_surface_size_hints *size_hints;
if (surface->modal)
return 1;
for (size_t 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;
size_hints = surface->size_hints;
if (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))
return 1;
return 0;
}
#endif
toplevel = c->surface.xdg->toplevel;
state = toplevel->current;
return (state.min_width != 0 && state.min_height != 0
&& (state.min_width == state.max_width
|| state.min_height == state.max_height))
|| toplevel->parent;
}
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;
}
static inline int
client_is_unmanaged(Client *c)
{
#ifdef XWAYLAND
return c->type == X11Unmanaged;
#endif
return 0;
}
static inline void
client_send_close(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c)) {
wlr_xwayland_surface_close(c->surface.xwayland);
return;
}
#endif
wlr_xdg_toplevel_send_close(c->surface.xdg);
}
static inline void
client_set_fullscreen(Client *c, int fullscreen)
{
#ifdef XWAYLAND
if (client_is_x11(c)) {
wlr_xwayland_surface_set_fullscreen(c->surface.xwayland, fullscreen);
return;
}
#endif
wlr_xdg_toplevel_set_fullscreen(c->surface.xdg, fullscreen);
}
static inline uint32_t
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);
return 0;
}
#endif
return wlr_xdg_toplevel_set_size(c->surface.xdg, width, height);
}
static inline void
client_set_tiled(Client *c, uint32_t edges)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return;
#endif
wlr_xdg_toplevel_set_tiled(c->surface.xdg, edges);
}
static inline struct wlr_surface *
client_surface_at(Client *c, double cx, double cy, double *sx, double *sy)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return wlr_surface_surface_at(c->surface.xwayland->surface,
cx, cy, sx, sy);
#endif
return wlr_xdg_surface_surface_at(c->surface.xdg, cx, cy, sx, sy);
}
static inline void
client_min_size(Client *c, int *width, int *height)
{
struct wlr_xdg_toplevel *toplevel;
struct wlr_xdg_toplevel_state *state;
#ifdef XWAYLAND
if (client_is_x11(c)) {
struct wlr_xwayland_surface_size_hints *size_hints;
size_hints = c->surface.xwayland->size_hints;
*width = size_hints->min_width;
*height = size_hints->min_height;
return;
}
#endif
toplevel = c->surface.xdg->toplevel;
state = &toplevel->current;
*width = state->min_width;
*height = state->min_height;
}
static inline Client *
client_from_popup(struct wlr_xdg_popup *popup)
{
struct wlr_xdg_surface *surface = popup->base;
while (1) {
switch (surface->role) {
case WLR_XDG_SURFACE_ROLE_POPUP:
if (!wlr_surface_is_xdg_surface(surface->popup->parent))
return NULL;
surface = wlr_xdg_surface_from_wlr_surface(surface->popup->parent);
break;
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
return surface->data;
case WLR_XDG_SURFACE_ROLE_NONE:
return NULL;
}
}
}

View File

@@ -1,6 +1,7 @@
/* appearance */
static const int sloppyfocus = 1; /* focus follows mouse */
static const unsigned int borderpx = 1; /* border pixel of windows */
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
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};
@@ -12,8 +13,8 @@ static const Rule rules[] = {
/* app_id title tags mask isfloating monitor */
/* examples:
{ "Gimp", NULL, 0, 1, -1 },
{ "firefox", NULL, 1 << 8, 0, -1 },
*/
{ "firefox", NULL, 1 << 8, 0, -1 },
};
/* layout(s) */
@@ -40,10 +41,17 @@ static const struct xkb_rule_names xkb_rules = {
/* example:
.options = "ctrl:nocaps",
*/
.options = "",
};
static const int repeat_rate = 25;
static const int repeat_delay = 600;
/* Trackpad */
static const int tap_to_click = 1;
static const int natural_scrolling = 0;
/* If you want to use the windows key change this to WLR_MODIFIER_LOGO */
#define MODKEY WLR_MODIFIER_ALT
#define TAGKEYS(KEY,SKEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
@@ -55,11 +63,13 @@ static const int repeat_delay = 600;
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *termcmd[] = { "alacritty", NULL };
static const char *termcmd[] = { "alacritty", NULL };
static const char *menucmd[] = { "bemenu-run", NULL };
static const Key keys[] = {
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
/* modifier key function argument */
{ MODKEY, XKB_KEY_p, spawn, {.v = menucmd} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} },
{ MODKEY, XKB_KEY_j, focusstack, {.i = +1} },
{ MODKEY, XKB_KEY_k, focusstack, {.i = -1} },
@@ -75,22 +85,25 @@ 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_0, view, {.ui = ~0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} },
{ MODKEY, XKB_KEY_comma, focusmon, {.i = -1} },
{ MODKEY, XKB_KEY_period, focusmon, {.i = +1} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = -1} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = +1} },
{ 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} },
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_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),
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} },
/* 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} },
#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),

View File

@@ -1,5 +1,9 @@
# paths
PREFIX = /usr/local
MANDIR = $(PREFIX)/share/man
# Default compile flags (overridable by environment)
CFLAGS ?= -g -Wall -Wextra -Werror -Wno-unused-parameter -Wno-sign-compare -Wno-error=unused-function
CFLAGS ?= -g -Wall -Wextra -Werror -Wno-unused-parameter -Wno-sign-compare -Wno-unused-function -Wno-unused-variable -Wno-unused-result -Wdeclaration-after-statement
# Uncomment to build XWayland support
#CFLAGS += -DXWAYLAND

144
dwl.1 Normal file
View File

@@ -0,0 +1,144 @@
.Dd January 8, 2021
.Dt DWL 1
.Os
.Sh NAME
.Nm dwl
.Nd dwm for Wayland
.Sh SYNOPSIS
.Nm
.Op Fl s Ar 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 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 bemenu-run .
.It Mod-Shift-Return
Spawn
.Nm alacritty .
.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 containung 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 's6-svscan <&-'
.Sh SEE ALSO
.Xr alacritty 1 ,
.Xr bemenu 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.

1799
dwl.c

File diff suppressed because it is too large Load Diff

49
protocols/idle.xml Normal file
View File

@@ -0,0 +1,49 @@
<?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,390 @@
<?xml version="1.0" encoding="UTF-8"?>
<protocol name="wlr_layer_shell_unstable_v1">
<copyright>
Copyright © 2017 Drew DeVault
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of
the copyright holders not be used in advertising or publicity
pertaining to distribution of the software without specific,
written prior permission. The copyright holders make no
representations about the suitability of this software for any
purpose. It is provided "as is" without express or implied
warranty.
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
</copyright>
<interface name="zwlr_layer_shell_v1" version="4">
<description summary="create surfaces that are layers of the desktop">
Clients can use this interface to assign the surface_layer role to
wl_surfaces. Such surfaces are assigned to a "layer" of the output and
rendered with a defined z-depth respective to each other. They may also be
anchored to the edges and corners of a screen and specify input handling
semantics. This interface should be suitable for the implementation of
many desktop shell components, and a broad number of other applications
that interact with the desktop.
</description>
<request name="get_layer_surface">
<description summary="create a layer_surface from a surface">
Create a layer surface for an existing surface. This assigns the role of
layer_surface, or raises a protocol error if another role is already
assigned.
Creating a layer surface from a wl_surface which has a buffer attached
or committed is a client error, and any attempts by a client to attach
or manipulate a buffer prior to the first layer_surface.configure call
must also be treated as errors.
After creating a layer_surface object and setting it up, the client
must perform an initial commit without any buffer attached.
The compositor will reply with a layer_surface.configure event.
The client must acknowledge it and is then allowed to attach a buffer
to map the surface.
You may pass NULL for output to allow the compositor to decide which
output to use. Generally this will be the one that the user most
recently interacted with.
Clients can specify a namespace that defines the purpose of the layer
surface.
</description>
<arg name="id" type="new_id" interface="zwlr_layer_surface_v1"/>
<arg name="surface" type="object" interface="wl_surface"/>
<arg name="output" type="object" interface="wl_output" allow-null="true"/>
<arg name="layer" type="uint" enum="layer" summary="layer to add this surface to"/>
<arg name="namespace" type="string" summary="namespace for the layer surface"/>
</request>
<enum name="error">
<entry name="role" value="0" summary="wl_surface has another role"/>
<entry name="invalid_layer" value="1" summary="layer value is invalid"/>
<entry name="already_constructed" value="2" summary="wl_surface has a buffer attached or committed"/>
</enum>
<enum name="layer">
<description summary="available layers for surfaces">
These values indicate which layers a surface can be rendered in. They
are ordered by z depth, bottom-most first. Traditional shell surfaces
will typically be rendered between the bottom and top layers.
Fullscreen shell surfaces are typically rendered at the top layer.
Multiple surfaces can share a single layer, and ordering within a
single layer is undefined.
</description>
<entry name="background" value="0"/>
<entry name="bottom" value="1"/>
<entry name="top" value="2"/>
<entry name="overlay" value="3"/>
</enum>
<!-- Version 3 additions -->
<request name="destroy" type="destructor" since="3">
<description summary="destroy the layer_shell object">
This request indicates that the client will not use the layer_shell
object any more. Objects that have been created through this instance
are not affected.
</description>
</request>
</interface>
<interface name="zwlr_layer_surface_v1" version="4">
<description summary="layer metadata interface">
An interface that may be implemented by a wl_surface, for surfaces that
are designed to be rendered as a layer of a stacked desktop-like
environment.
Layer surface state (layer, size, anchor, exclusive zone,
margin, interactivity) is double-buffered, and will be applied at the
time wl_surface.commit of the corresponding wl_surface is called.
Attaching a null buffer to a layer surface unmaps it.
Unmapping a layer_surface means that the surface cannot be shown by the
compositor until it is explicitly mapped again. The layer_surface
returns to the state it had right after layer_shell.get_layer_surface.
The client can re-map the surface by performing a commit without any
buffer attached, waiting for a configure event and handling it as usual.
</description>
<request name="set_size">
<description summary="sets the size of the surface">
Sets the size of the surface in surface-local coordinates. The
compositor will display the surface centered with respect to its
anchors.
If you pass 0 for either value, the compositor will assign it and
inform you of the assignment in the configure event. You must set your
anchor to opposite edges in the dimensions you omit; not doing so is a
protocol error. Both values are 0 by default.
Size is double-buffered, see wl_surface.commit.
</description>
<arg name="width" type="uint"/>
<arg name="height" type="uint"/>
</request>
<request name="set_anchor">
<description summary="configures the anchor point of the surface">
Requests that the compositor anchor the surface to the specified edges
and corners. If two orthogonal edges are specified (e.g. 'top' and
'left'), then the anchor point will be the intersection of the edges
(e.g. the top left corner of the output); otherwise the anchor point
will be centered on that edge, or in the center if none is specified.
Anchor is double-buffered, see wl_surface.commit.
</description>
<arg name="anchor" type="uint" enum="anchor"/>
</request>
<request name="set_exclusive_zone">
<description summary="configures the exclusive geometry of this surface">
Requests that the compositor avoids occluding an area with other
surfaces. The compositor's use of this information is
implementation-dependent - do not assume that this region will not
actually be occluded.
A positive value is only meaningful if the surface is anchored to one
edge or an edge and both perpendicular edges. If the surface is not
anchored, anchored to only two perpendicular edges (a corner), anchored
to only two parallel edges or anchored to all edges, a positive value
will be treated the same as zero.
A positive zone is the distance from the edge in surface-local
coordinates to consider exclusive.
Surfaces that do not wish to have an exclusive zone may instead specify
how they should interact with surfaces that do. If set to zero, the
surface indicates that it would like to be moved to avoid occluding
surfaces with a positive exclusive zone. If set to -1, the surface
indicates that it would not like to be moved to accommodate for other
surfaces, and the compositor should extend it all the way to the edges
it is anchored to.
For example, a panel might set its exclusive zone to 10, so that
maximized shell surfaces are not shown on top of it. A notification
might set its exclusive zone to 0, so that it is moved to avoid
occluding the panel, but shell surfaces are shown underneath it. A
wallpaper or lock screen might set their exclusive zone to -1, so that
they stretch below or over the panel.
The default value is 0.
Exclusive zone is double-buffered, see wl_surface.commit.
</description>
<arg name="zone" type="int"/>
</request>
<request name="set_margin">
<description summary="sets a margin from the anchor point">
Requests that the surface be placed some distance away from the anchor
point on the output, in surface-local coordinates. Setting this value
for edges you are not anchored to has no effect.
The exclusive zone includes the margin.
Margin is double-buffered, see wl_surface.commit.
</description>
<arg name="top" type="int"/>
<arg name="right" type="int"/>
<arg name="bottom" type="int"/>
<arg name="left" type="int"/>
</request>
<enum name="keyboard_interactivity">
<description summary="types of keyboard interaction possible for a layer shell surface">
Types of keyboard interaction possible for layer shell surfaces. The
rationale for this is twofold: (1) some applications are not interested
in keyboard events and not allowing them to be focused can improve the
desktop experience; (2) some applications will want to take exclusive
keyboard focus.
</description>
<entry name="none" value="0">
<description summary="no keyboard focus is possible">
This value indicates that this surface is not interested in keyboard
events and the compositor should never assign it the keyboard focus.
This is the default value, set for newly created layer shell surfaces.
This is useful for e.g. desktop widgets that display information or
only have interaction with non-keyboard input devices.
</description>
</entry>
<entry name="exclusive" value="1">
<description summary="request exclusive keyboard focus">
Request exclusive keyboard focus if this surface is above the shell surface layer.
For the top and overlay layers, the seat will always give
exclusive keyboard focus to the top-most layer which has keyboard
interactivity set to exclusive. If this layer contains multiple
surfaces with keyboard interactivity set to exclusive, the compositor
determines the one receiving keyboard events in an implementation-
defined manner. In this case, no guarantee is made when this surface
will receive keyboard focus (if ever).
For the bottom and background layers, the compositor is allowed to use
normal focus semantics.
This setting is mainly intended for applications that need to ensure
they receive all keyboard events, such as a lock screen or a password
prompt.
</description>
</entry>
<entry name="on_demand" value="2" since="4">
<description summary="request regular keyboard focus semantics">
This requests the compositor to allow this surface to be focused and
unfocused by the user in an implementation-defined manner. The user
should be able to unfocus this surface even regardless of the layer
it is on.
Typically, the compositor will want to use its normal mechanism to
manage keyboard focus between layer shell surfaces with this setting
and regular toplevels on the desktop layer (e.g. click to focus).
Nevertheless, it is possible for a compositor to require a special
interaction to focus or unfocus layer shell surfaces (e.g. requiring
a click even if focus follows the mouse normally, or providing a
keybinding to switch focus between layers).
This setting is mainly intended for desktop shell components (e.g.
panels) that allow keyboard interaction. Using this option can allow
implementing a desktop shell that can be fully usable without the
mouse.
</description>
</entry>
</enum>
<request name="set_keyboard_interactivity">
<description summary="requests keyboard events">
Set how keyboard events are delivered to this surface. By default,
layer shell surfaces do not receive keyboard events; this request can
be used to change this.
This setting is inherited by child surfaces set by the get_popup
request.
Layer surfaces receive pointer, touch, and tablet events normally. If
you do not want to receive them, set the input region on your surface
to an empty region.
Keyboard interactivity is double-buffered, see wl_surface.commit.
</description>
<arg name="keyboard_interactivity" type="uint" enum="keyboard_interactivity"/>
</request>
<request name="get_popup">
<description summary="assign this layer_surface as an xdg_popup parent">
This assigns an xdg_popup's parent to this layer_surface. This popup
should have been created via xdg_surface::get_popup with the parent set
to NULL, and this request must be invoked before committing the popup's
initial state.
See the documentation of xdg_popup for more details about what an
xdg_popup is and how it is used.
</description>
<arg name="popup" type="object" interface="xdg_popup"/>
</request>
<request name="ack_configure">
<description summary="ack a configure event">
When a configure event is received, if a client commits the
surface in response to the configure event, then the client
must make an ack_configure request sometime before the commit
request, passing along the serial of the configure event.
If the client receives multiple configure events before it
can respond to one, it only has to ack the last configure event.
A client is not required to commit immediately after sending
an ack_configure request - it may even ack_configure several times
before its next surface commit.
A client may send multiple ack_configure requests before committing, but
only the last request sent before a commit indicates which configure
event the client really is responding to.
</description>
<arg name="serial" type="uint" summary="the serial from the configure event"/>
</request>
<request name="destroy" type="destructor">
<description summary="destroy the layer_surface">
This request destroys the layer surface.
</description>
</request>
<event name="configure">
<description summary="suggest a surface change">
The configure event asks the client to resize its surface.
Clients should arrange their surface for the new states, and then send
an ack_configure request with the serial sent in this configure event at
some point before committing the new surface.
The client is free to dismiss all but the last configure event it
received.
The width and height arguments specify the size of the window in
surface-local coordinates.
The size is a hint, in the sense that the client is free to ignore it if
it doesn't resize, pick a smaller size (to satisfy aspect ratio or
resize in steps of NxM pixels). If the client picks a smaller size and
is anchored to two opposite anchors (e.g. 'top' and 'bottom'), the
surface will be centered on this axis.
If the width or height arguments are zero, it means the client should
decide its own window dimension.
</description>
<arg name="serial" type="uint"/>
<arg name="width" type="uint"/>
<arg name="height" type="uint"/>
</event>
<event name="closed">
<description summary="surface should be closed">
The closed event is sent by the compositor when the surface will no
longer be shown. The output may have been destroyed or the user may
have asked for it to be removed. Further changes to the surface will be
ignored. The client should destroy the resource after receiving this
event, and create a new surface if they so choose.
</description>
</event>
<enum name="error">
<entry name="invalid_surface_state" value="0" summary="provided surface state is invalid"/>
<entry name="invalid_size" value="1" summary="size is invalid"/>
<entry name="invalid_anchor" value="2" summary="anchor bitfield is invalid"/>
<entry name="invalid_keyboard_interactivity" value="3" summary="keyboard interactivity is invalid"/>
</enum>
<enum name="anchor" bitfield="true">
<entry name="top" value="1" summary="the top edge of the anchor rectangle"/>
<entry name="bottom" value="2" summary="the bottom edge of the anchor rectangle"/>
<entry name="left" value="4" summary="the left edge of the anchor rectangle"/>
<entry name="right" value="8" summary="the right edge of the anchor rectangle"/>
</enum>
<!-- Version 2 additions -->
<request name="set_layer" since="2">
<description summary="change the layer of the surface">
Change the layer that the surface is rendered on.
Layer is double-buffered, see wl_surface.commit.
</description>
<arg name="layer" type="uint" enum="zwlr_layer_shell_v1.layer" summary="layer to move this surface to"/>
</request>
</interface>
</protocol>

35
util.c Normal file
View File

@@ -0,0 +1,35 @@
/* See LICENSE.dwm file for copyright and license details. */
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
void *
ecalloc(size_t nmemb, size_t size)
{
void *p;
if (!(p = calloc(nmemb, size)))
die("calloc:");
return p;
}
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);
}

4
util.h Normal file
View File

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