562 Commits

Author SHA1 Message Date
548fac74e1 IPC patch applied
Along with customizations
2022-11-19 14:33:00 -08:00
Leonardo Hernández Hernández
569f554016 don't unfocus focused client when starting a drag
this fix chromium keyboard focus loss after a drag
Fix: 3cc22de712
2022-11-19 01:34:15 -06:00
Leonardo Hernández Hernández
b59c7f6a2e config.def.h: fix comment
Fixes: https://github.com/djpohly/dwl/issues/333
2022-11-10 23:14:03 -06:00
shua
f1639ba9d5 check null in toplevel_from_popup
managed to SEGFAULT the server by trying to create a popup
without setting a parent first.

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

Fixes: https://github.com/djpohly/dwl/issues/328
2022-11-01 12:52:25 -06:00
Leonardo Hernández Hernández
3cc22de712 client: don't change border color during drags
Fixes: https://github.com/djpohly/dwl/issues/318
2022-10-31 23:46:02 -06:00
Leonardo Hernández Hernández
846ce52b92 fix crash in dirtomon() when selmon is disabled 2022-10-29 16:48:50 -05:00
Leonardo Hernández Hernández
a9e2ebaf41 closemon() now updates selmon if needed 2022-10-29 16:48:50 -05:00
Leonardo Hernández Hernández
9b5f0f0fc5 use just one loop in outputmgrapplyortest()
we do the magic in updatemons()
2022-10-29 16:48:50 -05:00
Leonardo Hernández Hernández
cb01ce9bcf move focus and clients off disabled monitors 2022-10-29 16:48:50 -05:00
Leonardo Hernández Hernández
9588b46b5c only raise the client's node in monocle()
Fixes: https://github.com/djpohly/dwl/issues/326
2022-10-29 16:47:17 -05:00
Leonardo Hernández Hernández
2f7834b130 sort util.c functions 2022-10-29 14:57:22 -05:00
Leonardo Hernández Hernández
f494891a9a limit the line length to 79 in the readme 2022-10-29 14:47:24 -05:00
Leonardo Hernández Hernández
fd2c47cb70 mention the polkit dependency when using elogind or systemd-logind
Bug: https://github.com/djpohly/dwl/issues/138
2022-10-29 14:09:38 -05:00
Leonardo Hernández Hernández
e9826de295 Revert "stop trying resize clients during commitnotify()"
This reverts commit 2d9d758c8d.

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

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

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

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

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

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

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

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

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

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

Fixes: ae31391115 ("initialize rules and xkb_rules")
2022-06-03 01:23:35 +02:00
Leonardo Hernández Hernández
2623a96ebf call client_set-size() if client has a resize 2022-05-27 00:19:17 -05:00
Leonardo Hernández Hernández
52e0d00942 check client_surface() returning NULL
now client_surface()->data is a pointer to the wlr_scene_tree of clients
which allows us to not call wlr_scene_node_lower_to_bottom() for every clients
2022-05-25 17:12:44 -05:00
Leonardo Hernández Hernández
7018b9b65c correct libinput function name for drag_lock 2022-05-25 15:01:38 -05:00
Leonardo Hernández Hernández
48ec914f43 destroy layersurface's scene node in destroylayersurfacenotify() 2022-05-25 14:49:32 -05:00
Leonardo Hernández Hernández
40449fa64f add a new function to get a client from a wlr_surface 2022-05-23 10:55:28 -05:00
Ben Jargowsky
ecbc2c61db Add configuration options for touchpads 2022-05-23 00:01:47 +02:00
Leonardo Hernández Hernández
8870ba0bb8 implement urgency hints for xwayland clients 2022-05-17 14:38:18 -05:00
Leonardo Hernández Hernández
5de68ba713 sync manpage and help info
Signed-off-by: Leonardo Hernández Hernández <leohdz172@protonmail.com>
2022-05-17 13:26:57 -05:00
Ben Jargowsky
2f8736b986 Check if XWayland client size_hints are NULL 2022-05-15 23:09:21 +02:00
Leonardo Hernández Hernández
3c11ad9aa6 fix segfault when dragging chromium tabs 2022-05-14 00:29:35 -05:00
Ben Jargowsky
06d9230a96 Run focusclient when switching to monocle layout 2022-05-13 10:20:28 +02:00
Leonardo Hernández Hernández
22bd75226b remove trailing whitespaces 2022-05-10 11:42:40 -05:00
Leonardo Hernández Hernández
063736f898 add -v flag to the manpage
Thanks @Humm42
2022-05-10 11:39:33 -05:00
Leonardo Hernández Hernández
d5a741c9b4 add dist target 2022-05-09 16:25:03 -05:00
Leonardo Hernández Hernández
5d8084daa7 add flag to print version and exit 2022-05-09 16:24:36 -05:00
Sevz
07d56c6d7b Merge pull request #230 from BenJarg/null-wlr_seat_get_keyboard
Handle 'wlr_seat_get_keyboard' possibly returning null.
2022-05-09 13:18:19 -05:00
Ben Jargowsky
e0d310fd84 Handle 'wlr_seat_get_keyboard' possibly returning null. 2022-05-09 14:00:21 +02:00
Leonardo Hernández Hernández
3a4b7d104f restack xwayland surface on focusclient() 2022-04-29 17:45:02 -05:00
Ben Jargowsky
d071a899f3 Run printstatus() when a monitor is removed 2022-04-25 13:50:53 -07:00
Leonardo Hernández Hernández
a48ce99e6a use pointer math in xytonode() 2022-04-15 17:40:02 -05:00
Leonardo Hernández Hernández
b86fcf6504 add missing return in client_is_floating_type()
This causes all Xwayland clients to be treated as floating
2022-04-10 21:38:48 -05:00
Leonardo Hernández Hernández
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 3018 additions and 742 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,37 +1,69 @@
.POSIX:
.SUFFIXES:
include config.mk
CFLAGS += -I. -DWLR_USE_UNSTABLE -std=c99 -Werror=declaration-after-statement
# flags for compiling
DWLCPPFLAGS = -I. -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XWAYLAND)
DWLDEVCFLAGS = -pedantic -Wall -Wextra -Wdeclaration-after-statement -Wno-unused-parameter -Wno-sign-compare -Wshadow -Wunused-macros\
-Werror=strict-prototypes -Werror=implicit -Werror=return-type -Werror=incompatible-pointer-types
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
CFLAGS += $(foreach p,$(PKGS),$(shell pkg-config --cflags $(p)))
LDLIBS += $(foreach p,$(PKGS),$(shell pkg-config --libs $(p)))
# CFLAGS / LDFLAGS
PKGS = wlroots wayland-server xkbcommon libinput $(XLIBS)
DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS)
LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(LIBS)
all: dwl
dwl: dwl.o util.o net-tapesoftware-dwl-wm-unstable-v1-protocol.o
$(CC) dwl.o util.o net-tapesoftware-dwl-wm-unstable-v1-protocol.o $(LDLIBS) $(LDFLAGS) $(DWLCFLAGS) -o $@
dwl.o: dwl.c config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h net-tapesoftware-dwl-wm-unstable-v1-protocol.h
util.o: util.c util.h
# wayland-scanner is a tool which generates C headers and rigging for Wayland
# protocols, which are specified in XML. wlroots requires you to rig these up
# to your build system yourself and provide them in the include path.
WAYLAND_SCANNER = `$(PKG_CONFIG) --variable=wayland_scanner wayland-scanner`
WAYLAND_PROTOCOLS = `$(PKG_CONFIG) --variable=pkgdatadir wayland-protocols`
xdg-shell-protocol.h:
$(WAYLAND_SCANNER) server-header \
$(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@
wlr-layer-shell-unstable-v1-protocol.h:
$(WAYLAND_SCANNER) server-header \
protocols/wlr-layer-shell-unstable-v1.xml $@
xdg-shell-protocol.c:
# install rules
net-tapesoftware-dwl-wm-unstable-v1-protocol.h: protocols/net-tapesoftware-dwl-wm-unstable-v1.xml
$(WAYLAND_SCANNER) server-header \
protocols/net-tapesoftware-dwl-wm-unstable-v1.xml $@
net-tapesoftware-dwl-wm-unstable-v1-protocol.c: protocols/net-tapesoftware-dwl-wm-unstable-v1.xml
$(WAYLAND_SCANNER) private-code \
$(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@
protocols/net-tapesoftware-dwl-wm-unstable-v1.xml $@
net-tapesoftware-dwl-wm-unstable-v1-protocol.o: net-tapesoftware-dwl-wm-unstable-v1-protocol.h
xdg-shell-protocol.o: xdg-shell-protocol.h
config.h: | config.def.h
config.h:
cp config.def.h $@
dwl.o: config.h xdg-shell-protocol.h
dwl: xdg-shell-protocol.o
clean:
rm -f dwl *.o xdg-shell-protocol.h xdg-shell-protocol.c
rm -f dwl *.o *-protocol.h
.DEFAULT_GOAL=dwl
.PHONY: clean
dist: clean
mkdir -p dwl-$(VERSION)
cp -R LICENSE* Makefile README.md client.h config.def.h\
config.mk protocols dwl.1 dwl.c util.c util.h\
dwl-$(VERSION)
tar -caf dwl-$(VERSION).tar.gz dwl-$(VERSION)
rm -rf dwl-$(VERSION)
install: dwl
mkdir -p $(DESTDIR)$(PREFIX)/bin
cp -f dwl $(DESTDIR)$(PREFIX)/bin
chmod 755 $(DESTDIR)$(PREFIX)/bin/dwl
mkdir -p $(DESTDIR)$(MANDIR)/man1
cp -f dwl.1 $(DESTDIR)$(MANDIR)/man1
chmod 644 $(DESTDIR)$(MANDIR)/man1/dwl.1
uninstall:
rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1
.SUFFIXES: .c .o
.c.o:
$(CC) $(CPPFLAGS) $(DWLCFLAGS) -c $<

154
README.md
View File

@@ -1,79 +1,157 @@
# 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] or at [#dwl] on irc.libera.chat.
dwl is a compact, hackable compositor for [Wayland] based on [wlroots]. It is
intended to fill the same space in the Wayland world that dwm does in X11,
primarily in terms of 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 2200 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/235)
- 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
- 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].
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]!
## 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. If you are using `elogind` or `systemd-logind` you need to install
polkit; otherwise you need to add yourself in the `seat` group and
enable/start the seatd daemon.
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], [anopa], [runit], or [`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 <&-
To get a list of status bars that work with dwl consult our [wiki].
## Replacements for X applications
You can find a [list of useful resources on our wiki].
## 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
[Discord server]: https://discord.gg/jJxZnrGPWN
[#dwl]: https://web.libera.chat/?channels=#dwl
[Wayland]: https://wayland.freedesktop.org/
[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots/
[wlroots-next branch]: https://github.com/djpohly/dwl/tree/wlroots-next
[patches page on our wiki]: https://github.com/djpohly/dwl/wiki/Patches
[s6]: https://skarnet.org/software/s6/
[anopa]: https://jjacky.com/anopa/
[runit]: http://smarden.org/runit/faq.html#userservices
[`systemd --user`]: https://wiki.archlinux.org/title/Systemd/User
[wiki]: https://github.com/djpohly/dwl/wiki#compatible-status-bars
[list of useful resources on our wiki]:
https://github.com/djpohly/dwl/wiki#migrating-from-x

337
client.h Normal file
View File

@@ -0,0 +1,337 @@
/*
* 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 Client *
client_from_wlr_surface(struct wlr_surface *s)
{
struct wlr_xdg_surface *surface;
#ifdef XWAYLAND
struct wlr_xwayland_surface *xsurface;
if (s && wlr_surface_is_xwayland_surface(s)
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(s)))
return xsurface->data;
#endif
if (s && wlr_surface_is_xdg_surface(s)
&& (surface = wlr_xdg_surface_from_wlr_surface(s))
&& surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL)
return surface->data;
if (s && wlr_surface_is_subsurface(s))
return client_from_wlr_surface(wlr_surface_get_root_surface(s));
return NULL;
}
static inline Client *
client_get_parent(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c) && c->surface.xwayland->parent)
return client_from_wlr_surface(c->surface.xwayland->parent->surface);
#endif
if (c->surface.xdg->toplevel->parent)
return client_from_wlr_surface(c->surface.xdg->toplevel->parent->surface);
return NULL;
}
static inline void
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
{
struct wlr_xdg_toplevel *toplevel;
struct wlr_xdg_toplevel_state *state;
#ifdef XWAYLAND
if (client_is_x11(c)) {
struct wlr_xwayland_surface_size_hints *size_hints;
size_hints = c->surface.xwayland->size_hints;
if (size_hints) {
max->width = size_hints->max_width;
max->height = size_hints->max_height;
min->width = size_hints->min_width;
min->height = size_hints->min_height;
}
return;
}
#endif
toplevel = c->surface.xdg->toplevel;
state = &toplevel->current;
max->width = state->max_width;
max->height = state->max_height;
min->width = state->min_width;
min->height = state->min_height;
}
static inline struct wlr_surface *
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)
{
struct wlr_xdg_surface *surface;
#ifdef XWAYLAND
struct wlr_xwayland_surface *xsurface;
if (wlr_surface_is_xwayland_surface(s)
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(s))) {
wlr_xwayland_surface_activate(xsurface, activated);
return;
}
#endif
if (wlr_surface_is_xdg_surface(s)
&& (surface = wlr_xdg_surface_from_wlr_surface(s))
&& surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL)
wlr_xdg_toplevel_set_activated(surface, 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_box min = {0}, max = {0};
client_get_size_hints(c, &max, &min);
#ifdef XWAYLAND
if (client_is_x11(c)) {
struct wlr_xwayland_surface *surface = c->surface.xwayland;
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;
}
#endif
return ((min.width > 0 || min.height > 0 || max.width > 0 || max.height > 0)
&& (min.width == max.width || min.height == max.height))
|| client_get_parent(c);
}
static inline int
client_is_mapped(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return c->surface.xwayland->mapped;
#endif
return c->surface.xdg->mapped;
}
static inline int
client_is_unmanaged(Client *c)
{
#ifdef XWAYLAND
return c->type == X11Unmanaged;
#endif
return 0;
}
static inline void
client_notify_enter(struct wlr_surface *s, struct wlr_keyboard *kb)
{
if (kb)
wlr_seat_keyboard_notify_enter(seat, s, kb->keycodes,
kb->num_keycodes, &kb->modifiers);
else
wlr_seat_keyboard_notify_enter(seat, s, NULL, 0, NULL);
}
static inline void
client_restack_surface(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
wlr_xwayland_surface_restack(c->surface.xwayland, NULL,
XCB_STACK_MODE_ABOVE);
#endif
return;
}
static inline void
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 int
client_wants_focus(Client *c)
{
#ifdef XWAYLAND
return client_is_unmanaged(c)
&& wlr_xwayland_or_surface_wants_focus(c->surface.xwayland)
&& wlr_xwayland_icccm_input_model(c->surface.xwayland) != WLR_ICCCM_INPUT_MODEL_NONE;
#endif
return 0;
}
static inline int
client_wants_fullscreen(Client *c)
{
#ifdef XWAYLAND
if (client_is_x11(c))
return c->surface.xwayland->fullscreen;
#endif
return c->surface.xdg->toplevel->requested.fullscreen;
}
static inline void *
toplevel_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 (!surface->popup->parent)
return NULL;
else if (wlr_surface_is_layer_surface(surface->popup->parent))
return wlr_layer_surface_v1_from_wlr_surface(surface->popup->parent)->data;
else 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;
}
}
}
static inline void *
toplevel_from_wlr_layer_surface(struct wlr_surface *s)
{
Client *c;
struct wlr_layer_surface_v1 *wlr_layer_surface;
if ((c = client_from_wlr_surface(s)))
return c;
else if (s && wlr_surface_is_layer_surface(s)
&& (wlr_layer_surface = wlr_layer_surface_v1_from_wlr_surface(s)))
return wlr_layer_surface->data;
return NULL;
}

View File

@@ -1,9 +1,12 @@
/* 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};
/* To conform the xdg-protocol, set the alpha to zero to restore the old behavior */
static const float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0};
/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
@@ -12,8 +15,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,11 +43,52 @@ static const struct xkb_rule_names xkb_rules = {
/* example:
.options = "ctrl:nocaps",
*/
.options = NULL,
};
static const int repeat_rate = 25;
static const int repeat_delay = 600;
/* Trackpad */
static const int tap_to_click = 1;
static const int tap_and_drag = 1;
static const int drag_lock = 1;
static const int natural_scrolling = 0;
static const int disable_while_typing = 1;
static const int left_handed = 0;
static const int middle_button_emulation = 0;
/* You can choose between:
LIBINPUT_CONFIG_SCROLL_NO_SCROLL
LIBINPUT_CONFIG_SCROLL_2FG
LIBINPUT_CONFIG_SCROLL_EDGE
LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN
*/
static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
/* You can choose between:
LIBINPUT_CONFIG_CLICK_METHOD_NONE
LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS
LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
*/
static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
/* You can choose between:
LIBINPUT_CONFIG_SEND_EVENTS_ENABLED
LIBINPUT_CONFIG_SEND_EVENTS_DISABLED
LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE
*/
static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED;
/* You can choose between:
LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT
LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE
*/
static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE;
static const double accel_speed = 0.0;
/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */
#define MODKEY WLR_MODIFIER_ALT
#define TAGKEYS(KEY,SKEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \
@@ -55,11 +99,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[] = { "foot", 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 +121,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,14 @@
# Default compile flags (overridable by environment)
CFLAGS ?= -g -Wall -Wextra -Werror -Wno-unused-parameter -Wno-sign-compare -Wno-error=unused-function
_VERSION = 0.3.1-dev
VERSION = `git describe --long --tags --dirty 2>/dev/null || echo $(_VERSION)`
PKG_CONFIG = pkg-config
# paths
PREFIX = /usr/local
MANDIR = $(PREFIX)/share/man
XWAYLAND =
XLIBS =
# Uncomment to build XWayland support
#CFLAGS += -DXWAYLAND
#XWAYLAND = -DXWAYLAND
#XLIBS = xcb

151
dwl.1 Normal file
View File

@@ -0,0 +1,151 @@
.Dd January 8, 2021
.Dt DWL 1
.Os
.Sh NAME
.Nm dwl
.Nd dwm for Wayland
.Sh SYNOPSIS
.Nm
.Op Fl v
.Op Fl s Ar startup command
.Sh DESCRIPTION
.Nm
is a Wayland compositor based on wlroots.
It is intended to fill the same space in the Wayland world that
.Nm dwm
does for X11.
.Pp
When given the
.Fl v
option,
.Nm
writes its name and version to standard error and exits unsuccessfully.
.Pp
When given the
.Fl 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.

2313
dwl.c

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -0,0 +1,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
die(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
fputc(' ', stderr);
perror(NULL);
} else {
fputc('\n', stderr);
}
exit(1);
}
void *
ecalloc(size_t nmemb, size_t size)
{
void *p;
if (!(p = calloc(nmemb, size)))
die("calloc:");
return p;
}

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);