diff options
author | Leonard Kugis <leonard@kug.is> | 2025-05-23 11:41:09 +0000 |
---|---|---|
committer | Leonard Kugis <leonard@kug.is> | 2025-05-23 11:41:09 +0000 |
commit | c70505d7c7b7b48600f273357694b56ccf5d2a15 (patch) | |
tree | 21c27ac6ffced8d6d904e35bdb39baa5d685d829 /dwl-patches/patches/headless | |
download | dotfiles-c70505d7c7b7b48600f273357694b56ccf5d2a15.tar.gz dotfiles-c70505d7c7b7b48600f273357694b56ccf5d2a15.tar.bz2 dotfiles-c70505d7c7b7b48600f273357694b56ccf5d2a15.zip |
Diffstat (limited to 'dwl-patches/patches/headless')
-rw-r--r-- | dwl-patches/patches/headless/README.md | 11 | ||||
-rw-r--r-- | dwl-patches/patches/headless/headless.patch | 130 |
2 files changed, 141 insertions, 0 deletions
diff --git a/dwl-patches/patches/headless/README.md b/dwl-patches/patches/headless/README.md new file mode 100644 index 0000000..990a5d9 --- /dev/null +++ b/dwl-patches/patches/headless/README.md @@ -0,0 +1,11 @@ +### Description
+Implements `swaymsg create_output` command, it allows you to create virtual/headless outputs. But in combination with a VNC server (for example wayvnc), this allows you to essentially have additional monitors, by connecting to the VNC server with an appropiate client (for example on an tablet or laptop).
+
+If you plan to use wayvnc, you'll need [virtual-pointer](https://codeberg.org/dwl/dwl-patches/wiki/virtual-pointer.-) patch as well
+
+### Download
+- [git branch](https://codeberg.org/wochap/dwl/src/v0.5/headless)
+- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/0096e49402bc59b4050e12cdb9befb79d0011006/headless/headless.patch)
+
+### Authors
+- [wochap](https://codeberg.org/wochap)
\ No newline at end of file diff --git a/dwl-patches/patches/headless/headless.patch b/dwl-patches/patches/headless/headless.patch new file mode 100644 index 0000000..fb01fda --- /dev/null +++ b/dwl-patches/patches/headless/headless.patch @@ -0,0 +1,130 @@ +From 2e1123af5c7ae4354ec997d59cb36143fb2fdd27 Mon Sep 17 00:00:00 2001 +From: wochap <gean.marroquin@gmail.com> +Date: Mon, 8 Apr 2024 10:23:40 -0500 +Subject: [PATCH] feat: implement headless backend + +--- + config.def.h | 1 + + dwl.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 59 insertions(+) + +diff --git a/config.def.h b/config.def.h +index db0babc..f0a2080 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -141,6 +141,7 @@ static const Key keys[] = { + { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, ++ { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT, XKB_KEY_M, create_output, {0} }, + TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), + TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), + TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), +diff --git a/dwl.c b/dwl.c +index ef27a1d..79a63b0 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -12,7 +12,10 @@ + #include <unistd.h> + #include <wayland-server-core.h> + #include <wlr/backend.h> ++#include <wlr/backend/headless.h> + #include <wlr/backend/libinput.h> ++#include <wlr/backend/multi.h> ++#include <wlr/backend/wayland.h> + #include <wlr/render/allocator.h> + #include <wlr/render/wlr_renderer.h> + #include <wlr/types/wlr_compositor.h> +@@ -58,6 +61,9 @@ + #include <xcb/xcb.h> + #include <xcb/xcb_icccm.h> + #endif ++#if WLR_HAS_X11_BACKEND ++#include <wlr/backend/x11.h> ++#endif + + #include "util.h" + +@@ -327,6 +333,8 @@ static Monitor *xytomon(double x, double y); + static void xytonode(double x, double y, struct wlr_surface **psurface, + Client **pc, LayerSurface **pl, double *nx, double *ny); + static void zoom(const Arg *arg); ++static void _create_output(struct wlr_backend *backend, void *data); ++static void create_output(const Arg *arg); + + /* variables */ + static const char broken[] = "broken"; +@@ -335,6 +343,7 @@ static int locked; + static void *exclusive_focus; + static struct wl_display *dpy; + static struct wlr_backend *backend; ++static struct wlr_backend *headless_backend; + static struct wlr_scene *scene; + static struct wlr_scene_tree *layers[NUM_LAYERS]; + static struct wlr_scene_tree *drag_icon; +@@ -2321,6 +2330,16 @@ setup(void) + cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1); + LISTEN_STATIC(&cursor_shape_mgr->events.request_set_shape, setcursorshape); + ++ /** ++ * Initialize headless backend ++ */ ++ headless_backend = wlr_headless_backend_create(dpy); ++ if (!headless_backend) { ++ die("Failed to create secondary headless backend"); ++ } else { ++ wlr_multi_backend_add(backend, headless_backend); ++ } ++ + /* + * Configures a seat, which is a single "seat" at which a user sits and + * operates the computer. This conceptually includes up to one keyboard, +@@ -2746,6 +2765,45 @@ zoom(const Arg *arg) + arrange(selmon); + } + ++void ++_create_output(struct wlr_backend *_backend, void *data) ++{ ++ bool *done = data; ++ if (*done) { ++ return; ++ } ++ ++ if (wlr_backend_is_wl(_backend)) { ++ wlr_wl_output_create(_backend); ++ *done = true; ++ } else if (wlr_backend_is_headless(_backend)) { ++ wlr_headless_add_output(_backend, 1920, 1080); ++ *done = true; ++ } ++#if WLR_HAS_X11_BACKEND ++ else if (wlr_backend_is_x11(backend)) { ++ wlr_x11_output_create(backend); ++ *done = true; ++ } ++#endif ++} ++ ++void ++create_output(const Arg *arg) ++{ ++ bool done = false; ++ ++ if (!wlr_backend_is_multi(backend)) { ++ die("Expected a multi backend"); ++ } ++ ++ wlr_multi_for_each_backend(backend, _create_output, &done); ++ ++ if (!done) { ++ die("Can only create outputs for Wayland, X11 or headless backends"); ++ } ++} ++ + #ifdef XWAYLAND + void + activatex11(struct wl_listener *listener, void *data) +-- +2.43.2 + |