mirror of
https://codeberg.org/dwl/dwl.git
synced 2026-06-22 23:22:44 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7c3c5ffcc2 | |||
| 81c8ebf677 | |||
| a89872f02e | |||
| a41d817979 | |||
| a4e4fd3d25 | |||
| 0259e9a8ab | |||
| 04079a0946 | |||
| daf5ee475f | |||
| 156a13d9f9 | |||
| dcb7a4d910 |
@@ -1,98 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
* [0.5](#0.5)
|
||||
|
||||
## 0.5
|
||||
|
||||
### Added
|
||||
|
||||
* Allow configure x and y position of outputs ([#301][301])
|
||||
* Implement repeatable keybindings ([#368][368])
|
||||
* Print app id in printstatus() output ([#381][381])
|
||||
* Display client count in monocle symbol ([#387][387])
|
||||
* Export XCURSOR_SIZE to fix apps using an older version of Qt ([#425][425])
|
||||
* Support for wp-fractional-scale-v1 (through wlr_scene: [wlroots!3511][wlroots!3511])
|
||||
* dwl now sends `wl_surface.preferred_buffer_scale` (through wlr_scene: [wlroots!4269][wlroots!4269])
|
||||
* Add support for xdg-shell v6 ([#465][465])
|
||||
* Add support for wp-cursor-shape-v1 ([#444][444])
|
||||
* Add desktop file ([#484][484])
|
||||
* Add macro to easily configure colors ([#466][466])
|
||||
* Color of urgent clients are now red ([#494][494])
|
||||
* New flag `-d` and option `log_level` to change the wlroots debug level
|
||||
* Add CHANGELOG.md ([#501][501])
|
||||
|
||||
[301]: https://github.com/djpohly/dwl/pull/301
|
||||
[368]: https://github.com/djpohly/dwl/pull/368
|
||||
[381]: https://github.com/djpohly/dwl/pull/381
|
||||
[387]: https://github.com/djpohly/dwl/issues/387
|
||||
[425]: https://github.com/djpohly/dwl/pull/425
|
||||
[wlroots!4269]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4269
|
||||
[wlroots!3511]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3511
|
||||
[465]: https://github.com/djpohly/dwl/pull/465
|
||||
[444]: https://github.com/djpohly/dwl/pull/444
|
||||
[484]: https://github.com/djpohly/dwl/pull/484
|
||||
[466]: https://github.com/djpohly/dwl/issues/466
|
||||
[494]: https://github.com/djpohly/dwl/pull/494
|
||||
[501]: https://github.com/djpohly/dwl/pull/501
|
||||
|
||||
|
||||
### Changed
|
||||
|
||||
* Replace `tags` with `TAGCOUNT` in config.def.h ([#403][403])
|
||||
* Pop ups are now destroyed when focusing another client ([#408][408])
|
||||
* dwl does not longer respect size hints, instead clip windows if they are
|
||||
larger than they should be ([#455][455])
|
||||
* The version of wlr-layer-shell-unstable-v1 was lowered to 3 (from 4)
|
||||
* Use the same border color as dwm ([#494][494])
|
||||
|
||||
[403]: https://github.com/djpohly/dwl/pull/403
|
||||
[408]: https://github.com/djpohly/dwl/pull/409
|
||||
[455]: https://github.com/djpohly/dwl/pull/455
|
||||
[494]: https://github.com/djpohly/dwl/pull/494
|
||||
|
||||
|
||||
### Removed
|
||||
|
||||
* Remove unused `rootcolor` option ([#401][401])
|
||||
* Remove support for wlr-input-inhibitor-unstable-v1 ([#430][430])
|
||||
* Remove support for KDE idle protocol ([#431][431])
|
||||
|
||||
[401]: https://github.com/djpohly/dwl/pull/401
|
||||
[430]: https://github.com/djpohly/dwl/pull/430
|
||||
[431]: https://github.com/djpohly/dwl/pull/431
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
* Fix crash when creating a layer surface with all outputs disabled
|
||||
([#421][421])
|
||||
* Fix other clients being shown as focused if the focused client have pop ups
|
||||
open ([#408][408])
|
||||
* Resize fullscreen clients when updating monitor mode
|
||||
* dwl no longer crash at exit like sometimes did
|
||||
* Fullscreen background appearing above clients ([#487][487])
|
||||
* Fix a segfault when user provides invalid xkb_rules ([#518][518])
|
||||
|
||||
[421]: https://github.com/djpohly/dwl/pull/421
|
||||
[408]: https://github.com/djpohly/dwl/issues/408
|
||||
[487]: https://github.com/djpohly/dwl/issues/487
|
||||
[518]: https://github.com/djpohly/dwl/pull/518
|
||||
|
||||
|
||||
### Contributors
|
||||
|
||||
* A Frederick Christensen
|
||||
* Angelo Antony
|
||||
* Ben Collerson
|
||||
* Devin J. Pohly
|
||||
* Forrest Bushstone
|
||||
* gan-of-culture
|
||||
* godalming123
|
||||
* Job79
|
||||
* link2xt
|
||||
* Micah Gorrell
|
||||
* Nikita Ivanov
|
||||
* Palanix
|
||||
* pino-desktop
|
||||
* Weiseguy
|
||||
* Yves Zoundi
|
||||
@@ -5,7 +5,7 @@ include config.mk
|
||||
|
||||
# flags for compiling
|
||||
DWLCPPFLAGS = -I. -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XWAYLAND)
|
||||
DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement -Wno-unused-parameter -Wno-sign-compare -Wshadow -Wunused-macros\
|
||||
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
|
||||
|
||||
# CFLAGS / LDFLAGS
|
||||
@@ -16,7 +16,7 @@ LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(LIBS)
|
||||
all: dwl
|
||||
dwl: dwl.o util.o
|
||||
$(CC) dwl.o util.o $(LDLIBS) $(LDFLAGS) $(DWLCFLAGS) -o $@
|
||||
dwl.o: dwl.c config.mk config.h client.h cursor-shape-v1-protocol.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h
|
||||
dwl.o: dwl.c push.c config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h
|
||||
util.o: util.c util.h
|
||||
|
||||
# wayland-scanner is a tool which generates C headers and rigging for Wayland
|
||||
@@ -31,9 +31,6 @@ xdg-shell-protocol.h:
|
||||
wlr-layer-shell-unstable-v1-protocol.h:
|
||||
$(WAYLAND_SCANNER) server-header \
|
||||
protocols/wlr-layer-shell-unstable-v1.xml $@
|
||||
cursor-shape-v1-protocol.h:
|
||||
$(WAYLAND_SCANNER) server-header \
|
||||
$(WAYLAND_PROTOCOLS)/staging/cursor-shape/cursor-shape-v1.xml $@
|
||||
|
||||
config.h:
|
||||
cp config.def.h $@
|
||||
@@ -43,7 +40,7 @@ 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.desktop\
|
||||
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)
|
||||
@@ -55,11 +52,8 @@ install: dwl
|
||||
mkdir -p $(DESTDIR)$(MANDIR)/man1
|
||||
cp -f dwl.1 $(DESTDIR)$(MANDIR)/man1
|
||||
chmod 644 $(DESTDIR)$(MANDIR)/man1/dwl.1
|
||||
mkdir -p $(DESTDIR)$(DATADIR)/wayland-sessions
|
||||
cp -f dwl.desktop $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop
|
||||
chmod 644 $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop
|
||||
uninstall:
|
||||
rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1 $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop
|
||||
rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1
|
||||
|
||||
.SUFFIXES: .c .o
|
||||
.c.o:
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# dwl - dwm for Wayland
|
||||
|
||||
Join us on our IRC channel: [#dwl on Libera Chat]
|
||||
Or on our [Discord server].
|
||||
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,
|
||||
@@ -27,7 +26,7 @@ given the base on which it is built. Implemented default features are:
|
||||
monitoring
|
||||
- Provide information to external status bars via stdout/stdin
|
||||
- Urgency hints via xdg-activate protocol
|
||||
- Support screen lockers via ext-session-lock-v1 protocol
|
||||
- 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"
|
||||
@@ -50,28 +49,14 @@ Feature *non-goals* for the main codebase include:
|
||||
|
||||
## Building dwl
|
||||
|
||||
dwl has the following dependencies:
|
||||
```
|
||||
libinput
|
||||
wayland
|
||||
wlroots (compiled with the libinput backend)
|
||||
xkbcommon
|
||||
wayland-protocols (compile-time only)
|
||||
pkg-config (compile-time only)
|
||||
```
|
||||
If you enable X11 support:
|
||||
```
|
||||
libxcb
|
||||
libxcb-wm
|
||||
wlroots (compiled with X11 support)
|
||||
Xwayland (runtime only)
|
||||
```
|
||||
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 uncomment its flags in `config.mk`.
|
||||
To enable XWayland, you should also install xorg-xwayland and uncomment its flag
|
||||
in `config.mk`.
|
||||
|
||||
## Configuration
|
||||
|
||||
@@ -97,7 +82,6 @@ When dwl is run with no arguments, it will launch the server and begin handling
|
||||
any shortcuts configured in `config.h`. There is no status bar or other
|
||||
decoration initially; these are instead clients that can be run within
|
||||
the Wayland session.
|
||||
Do note that the background color is black.
|
||||
|
||||
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
|
||||
@@ -121,7 +105,7 @@ automatically, you will need to configure it prior to launching `dwl`, e.g.:
|
||||
|
||||
### Status information
|
||||
|
||||
Information about selected layouts, current window title, app-id, and
|
||||
Information about selected layouts, current window title, and
|
||||
selected/occupied/urgent tags is written to the stdin of the `-s` command (see
|
||||
the `printstatus()` function for details). This information can be used to
|
||||
populate an external status bar with a script that parses the information.
|
||||
@@ -159,7 +143,7 @@ inspiration, and to the various contributors to the project, including:
|
||||
|
||||
|
||||
[Discord server]: https://discord.gg/jJxZnrGPWN
|
||||
[#dwl on Libera Chat]: https://web.libera.chat/?channels=#dwl
|
||||
[#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
|
||||
|
||||
@@ -11,8 +11,34 @@ client_is_x11(Client *c)
|
||||
{
|
||||
#ifdef XWAYLAND
|
||||
return c->type == X11Managed || c->type == X11Unmanaged;
|
||||
#endif
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
client_get_size_hints(Client *c, struct wlr_box *max, struct wlr_box *min)
|
||||
{
|
||||
struct wlr_xdg_toplevel *toplevel;
|
||||
struct wlr_xdg_toplevel_state *state;
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c)) {
|
||||
xcb_size_hints_t *size_hints = c->surface.xwayland->size_hints;
|
||||
if (size_hints) {
|
||||
max->width = size_hints->max_width;
|
||||
max->height = size_hints->max_height;
|
||||
min->width = size_hints->min_width;
|
||||
min->height = size_hints->min_height;
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
toplevel = c->surface.xdg->toplevel;
|
||||
state = &toplevel->current;
|
||||
max->width = state->max_width;
|
||||
max->height = state->max_height;
|
||||
min->width = state->min_width;
|
||||
min->height = state->min_height;
|
||||
}
|
||||
|
||||
static inline struct wlr_surface *
|
||||
@@ -28,7 +54,7 @@ client_surface(Client *c)
|
||||
static inline int
|
||||
toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl)
|
||||
{
|
||||
struct wlr_xdg_surface *xdg_surface, *tmp_xdg_surface;
|
||||
struct wlr_xdg_surface *xdg_surface;
|
||||
struct wlr_surface *root_surface;
|
||||
struct wlr_layer_surface_v1 *layer_surface;
|
||||
Client *c = NULL;
|
||||
@@ -39,44 +65,44 @@ toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl)
|
||||
#endif
|
||||
|
||||
if (!s)
|
||||
return -1;
|
||||
return type;
|
||||
root_surface = wlr_surface_get_root_surface(s);
|
||||
|
||||
#ifdef XWAYLAND
|
||||
if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(root_surface))) {
|
||||
if (wlr_surface_is_xwayland_surface(root_surface)
|
||||
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(root_surface))) {
|
||||
c = xsurface->data;
|
||||
type = c->type;
|
||||
goto end;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((layer_surface = wlr_layer_surface_v1_try_from_wlr_surface(root_surface))) {
|
||||
if (wlr_surface_is_layer_surface(root_surface)
|
||||
&& (layer_surface = wlr_layer_surface_v1_from_wlr_surface(root_surface))) {
|
||||
l = layer_surface->data;
|
||||
type = LayerShell;
|
||||
goto end;
|
||||
}
|
||||
|
||||
xdg_surface = wlr_xdg_surface_try_from_wlr_surface(root_surface);
|
||||
while (xdg_surface) {
|
||||
tmp_xdg_surface = NULL;
|
||||
switch (xdg_surface->role) {
|
||||
case WLR_XDG_SURFACE_ROLE_POPUP:
|
||||
if (!xdg_surface->popup || !xdg_surface->popup->parent)
|
||||
if (wlr_surface_is_xdg_surface(root_surface)
|
||||
&& (xdg_surface = wlr_xdg_surface_from_wlr_surface(root_surface))) {
|
||||
while (1) {
|
||||
switch (xdg_surface->role) {
|
||||
case WLR_XDG_SURFACE_ROLE_POPUP:
|
||||
if (!xdg_surface->popup->parent)
|
||||
return -1;
|
||||
else if (!wlr_surface_is_xdg_surface(xdg_surface->popup->parent))
|
||||
return toplevel_from_wlr_surface(xdg_surface->popup->parent, pc, pl);
|
||||
|
||||
xdg_surface = wlr_xdg_surface_from_wlr_surface(xdg_surface->popup->parent);
|
||||
break;
|
||||
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
|
||||
c = xdg_surface->data;
|
||||
type = c->type;
|
||||
goto end;
|
||||
case WLR_XDG_SURFACE_ROLE_NONE:
|
||||
return -1;
|
||||
|
||||
tmp_xdg_surface = wlr_xdg_surface_try_from_wlr_surface(xdg_surface->popup->parent);
|
||||
|
||||
if (!tmp_xdg_surface)
|
||||
return toplevel_from_wlr_surface(xdg_surface->popup->parent, pc, pl);
|
||||
|
||||
xdg_surface = tmp_xdg_surface;
|
||||
break;
|
||||
case WLR_XDG_SURFACE_ROLE_TOPLEVEL:
|
||||
c = xdg_surface->data;
|
||||
type = c->type;
|
||||
goto end;
|
||||
case WLR_XDG_SURFACE_ROLE_NONE:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,16 +118,19 @@ end:
|
||||
static inline void
|
||||
client_activate_surface(struct wlr_surface *s, int activated)
|
||||
{
|
||||
struct wlr_xdg_toplevel *toplevel;
|
||||
struct wlr_xdg_surface *surface;
|
||||
#ifdef XWAYLAND
|
||||
struct wlr_xwayland_surface *xsurface;
|
||||
if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(s))) {
|
||||
if (wlr_surface_is_xwayland_surface(s)
|
||||
&& (xsurface = wlr_xwayland_surface_from_wlr_surface(s))) {
|
||||
wlr_xwayland_surface_activate(xsurface, activated);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if ((toplevel = wlr_xdg_toplevel_try_from_wlr_surface(s)))
|
||||
wlr_xdg_toplevel_set_activated(toplevel, activated);
|
||||
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->toplevel, activated);
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
@@ -111,16 +140,23 @@ client_set_bounds(Client *c, int32_t width, int32_t height)
|
||||
if (client_is_x11(c))
|
||||
return 0;
|
||||
#endif
|
||||
if (wl_resource_get_version(c->surface.xdg->toplevel->resource) >=
|
||||
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION && width >= 0 && height >= 0
|
||||
&& (c->bounds.width != width || c->bounds.height != height)) {
|
||||
c->bounds.width = width;
|
||||
c->bounds.height = height;
|
||||
if (c->surface.xdg->client->shell->version >=
|
||||
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION && width >= 0 && height >= 0)
|
||||
return wlr_xdg_toplevel_set_bounds(c->surface.xdg->toplevel, width, height);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
client_for_each_surface(Client *c, wlr_surface_iterator_func_t fn, void *data)
|
||||
{
|
||||
wlr_surface_for_each_surface(client_surface(c), fn, data);
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c))
|
||||
return;
|
||||
#endif
|
||||
wlr_xdg_surface_for_each_popup_surface(c->surface.xdg, fn, data);
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
client_get_appid(Client *c)
|
||||
{
|
||||
@@ -131,27 +167,6 @@ client_get_appid(Client *c)
|
||||
return c->surface.xdg->toplevel->app_id;
|
||||
}
|
||||
|
||||
static inline void
|
||||
client_get_clip(Client *c, struct wlr_box *clip)
|
||||
{
|
||||
struct wlr_box xdg_geom = {0};
|
||||
*clip = (struct wlr_box){
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.width = c->geom.width - c->bw,
|
||||
.height = c->geom.height - c->bw,
|
||||
};
|
||||
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c))
|
||||
return;
|
||||
#endif
|
||||
|
||||
wlr_xdg_surface_get_geometry(c->surface.xdg, &xdg_geom);
|
||||
clip->x = xdg_geom.x;
|
||||
clip->y = xdg_geom.y;
|
||||
}
|
||||
|
||||
static inline void
|
||||
client_get_geometry(Client *c, struct wlr_box *geom)
|
||||
{
|
||||
@@ -177,6 +192,7 @@ client_get_parent(Client *c)
|
||||
#endif
|
||||
if (c->surface.xdg->toplevel->parent)
|
||||
toplevel_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface, &p, NULL);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -193,35 +209,35 @@ client_get_title(Client *c)
|
||||
static inline int
|
||||
client_is_float_type(Client *c)
|
||||
{
|
||||
struct wlr_xdg_toplevel *toplevel;
|
||||
struct wlr_xdg_toplevel_state state;
|
||||
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;
|
||||
xcb_size_hints_t *size_hints = surface->size_hints;
|
||||
size_t i;
|
||||
if (surface->modal)
|
||||
return 1;
|
||||
|
||||
for (i = 0; i < surface->window_type_len; i++)
|
||||
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;
|
||||
|
||||
return size_hints && size_hints->min_width > 0 && size_hints->min_height > 0
|
||||
&& (size_hints->max_width == size_hints->min_width
|
||||
|| size_hints->max_height == size_hints->min_height);
|
||||
}
|
||||
#endif
|
||||
return ((min.width > 0 || min.height > 0 || max.width > 0 || max.height > 0)
|
||||
&& (min.width == max.width || min.height == max.height));
|
||||
}
|
||||
|
||||
toplevel = c->surface.xdg->toplevel;
|
||||
state = toplevel->current;
|
||||
return toplevel->parent || (state.min_width != 0 && state.min_height != 0
|
||||
&& (state.min_width == state.max_width
|
||||
|| state.min_height == state.max_height));
|
||||
static inline int
|
||||
client_is_mapped(Client *c)
|
||||
{
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c))
|
||||
return c->surface.xwayland->mapped;
|
||||
#endif
|
||||
return c->surface.xdg->mapped;
|
||||
}
|
||||
|
||||
static inline int
|
||||
@@ -231,8 +247,7 @@ client_is_rendered_on_mon(Client *c, Monitor *m)
|
||||
* but rather actual displaying of the pixels.
|
||||
* Usually VISIBLEON suffices and is also faster. */
|
||||
struct wlr_surface_output *s;
|
||||
int unused_lx, unused_ly;
|
||||
if (!wlr_scene_node_coords(&c->scene->node, &unused_lx, &unused_ly))
|
||||
if (!c->scene->node.enabled)
|
||||
return 0;
|
||||
wl_list_for_each(s, &client_surface(c)->current_outputs, link)
|
||||
if (s->output == m->wlr_output)
|
||||
@@ -308,14 +323,6 @@ client_send_close(Client *c)
|
||||
wlr_xdg_toplevel_send_close(c->surface.xdg->toplevel);
|
||||
}
|
||||
|
||||
static inline void
|
||||
client_set_border_color(Client *c, const float color[static 4])
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 4; i++)
|
||||
wlr_scene_rect_set_color(c->border[i], color);
|
||||
}
|
||||
|
||||
static inline void
|
||||
client_set_fullscreen(Client *c, int fullscreen)
|
||||
{
|
||||
@@ -351,25 +358,18 @@ client_set_tiled(Client *c, uint32_t edges)
|
||||
if (client_is_x11(c))
|
||||
return;
|
||||
#endif
|
||||
if (wl_resource_get_version(c->surface.xdg->resource)
|
||||
>= XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) {
|
||||
wlr_xdg_toplevel_set_tiled(c->surface.xdg->toplevel, edges);
|
||||
} else {
|
||||
wlr_xdg_toplevel_set_maximized(c->surface.xdg->toplevel, edges != WLR_EDGE_NONE);
|
||||
}
|
||||
wlr_xdg_toplevel_set_tiled(c->surface.xdg->toplevel, edges);
|
||||
}
|
||||
|
||||
static inline void
|
||||
client_set_suspended(Client *c, int suspended)
|
||||
static inline struct wlr_surface *
|
||||
client_surface_at(Client *c, double cx, double cy, double *sx, double *sy)
|
||||
{
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c)) {
|
||||
wlr_xwayland_surface_set_withdrawn(c->surface.xwayland, suspended);
|
||||
return;
|
||||
}
|
||||
if (client_is_x11(c))
|
||||
return wlr_surface_surface_at(c->surface.xwayland->surface,
|
||||
cx, cy, sx, sy);
|
||||
#endif
|
||||
|
||||
wlr_xdg_toplevel_set_suspended(c->surface.xdg->toplevel, suspended);
|
||||
return wlr_xdg_surface_surface_at(c->surface.xdg, cx, cy, sx, sy);
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
||||
+5
-17
@@ -1,23 +1,14 @@
|
||||
/* Taken from https://github.com/djpohly/dwl/issues/466 */
|
||||
#define COLOR(hex) { ((hex >> 24) & 0xFF) / 255.0f, \
|
||||
((hex >> 16) & 0xFF) / 255.0f, \
|
||||
((hex >> 8) & 0xFF) / 255.0f, \
|
||||
(hex & 0xFF) / 255.0f }
|
||||
/* appearance */
|
||||
static const int sloppyfocus = 1; /* focus follows mouse */
|
||||
static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
|
||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||
static const float bordercolor[] = COLOR(0x444444ff);
|
||||
static const float focuscolor[] = COLOR(0x005577ff);
|
||||
static const float urgentcolor[] = COLOR(0xff0000ff);
|
||||
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}; /* You can also use glsl colors */
|
||||
static const float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0};
|
||||
|
||||
/* tagging - TAGCOUNT must be no greater than 31 */
|
||||
#define TAGCOUNT (9)
|
||||
|
||||
/* logging */
|
||||
static int log_level = WLR_ERROR;
|
||||
/* tagging - tagcount must be no greater than 31 */
|
||||
static const int tagcount = 9;
|
||||
|
||||
static const Rule rules[] = {
|
||||
/* app_id title tags mask isfloating monitor */
|
||||
@@ -154,9 +145,6 @@ static const Key keys[] = {
|
||||
|
||||
/* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */
|
||||
{ WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} },
|
||||
/* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is
|
||||
* do not remove them.
|
||||
*/
|
||||
#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} }
|
||||
CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6),
|
||||
CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
_VERSION = 0.5
|
||||
_VERSION = 0.4
|
||||
VERSION = `git describe --tags --dirty 2>/dev/null || echo $(_VERSION)`
|
||||
|
||||
PKG_CONFIG = pkg-config
|
||||
@@ -6,7 +6,6 @@ PKG_CONFIG = pkg-config
|
||||
# paths
|
||||
PREFIX = /usr/local
|
||||
MANDIR = $(PREFIX)/share/man
|
||||
DATADIR = $(PREFIX)/share
|
||||
|
||||
XWAYLAND =
|
||||
XLIBS =
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl v
|
||||
.Op Fl d
|
||||
.Op Fl s Ar startup command
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
@@ -23,12 +22,6 @@ option,
|
||||
writes its name and version to standard error and exits unsuccessfully.
|
||||
.Pp
|
||||
When given the
|
||||
.Fl d
|
||||
option,
|
||||
.Nm
|
||||
enables full wlroots logging, including debug information.
|
||||
.Pp
|
||||
When given the
|
||||
.Fl s
|
||||
option,
|
||||
.Nm
|
||||
@@ -108,7 +101,7 @@ These environment variables are used by
|
||||
A directory where temporary user files, such as the Wayland socket,
|
||||
are stored.
|
||||
.It Ev XDG_CONFIG_DIR
|
||||
A directory containing configuration of various programs and
|
||||
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.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name=dwl
|
||||
Comment=dwm for Wayland
|
||||
Exec=dwl
|
||||
Type=Application
|
||||
@@ -0,0 +1,63 @@
|
||||
static Client *
|
||||
nexttiled(Client *sel) {
|
||||
Client *c;
|
||||
wl_list_for_each(c, &sel->link, link) {
|
||||
if (&c->link == &clients)
|
||||
break; /* don't wrap */
|
||||
if (!c->isfloating && VISIBLEON(c, selmon))
|
||||
return c;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static Client *
|
||||
prevtiled(Client *sel) {
|
||||
Client *c;
|
||||
wl_list_for_each_reverse(c, &sel->link, link) {
|
||||
if (&c->link == &clients)
|
||||
break; /* don't wrap */
|
||||
if (!c->isfloating && VISIBLEON(c, selmon))
|
||||
return c;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
pushup(const Arg *arg) {
|
||||
Client *sel = focustop(selmon);
|
||||
Client *c;
|
||||
|
||||
if(!sel || sel->isfloating)
|
||||
return;
|
||||
if((c = prevtiled(sel))) {
|
||||
/* attach before c */
|
||||
wl_list_remove(&sel->link);
|
||||
wl_list_insert(c->link.prev, &sel->link);
|
||||
} else {
|
||||
/* move to the end */
|
||||
wl_list_remove(&sel->link);
|
||||
wl_list_insert(clients.prev, &sel->link);
|
||||
}
|
||||
focusclient(sel, 1);
|
||||
arrange(selmon);
|
||||
}
|
||||
|
||||
static void
|
||||
pushdown(const Arg *arg) {
|
||||
Client *sel = focustop(selmon);
|
||||
Client *c;
|
||||
|
||||
if(!sel || sel->isfloating)
|
||||
return;
|
||||
if((c = nexttiled(sel))) {
|
||||
/* attach after c */
|
||||
wl_list_remove(&sel->link);
|
||||
wl_list_insert(&c->link, &sel->link);
|
||||
} else {
|
||||
/* move to the front */
|
||||
wl_list_remove(&sel->link);
|
||||
wl_list_insert(&clients, &sel->link);
|
||||
}
|
||||
focusclient(sel, 1);
|
||||
arrange(selmon);
|
||||
}
|
||||
Reference in New Issue
Block a user