aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkolunmi <113054217+kolunmi@users.noreply.github.com>2023-07-22 07:50:01 -0700
committerGitHub <noreply@github.com>2023-07-22 07:50:01 -0700
commita5cb279696622d0b4c57611cf442dea5cc51054f (patch)
treec13275b5a3460cc0da4e89a607c2ecdf505c5e9a
parent31178baeafb2df71a9ad94dc02aba198dc236370 (diff)
parentb377ce7317d6a72ef68dc779ca8b46d24fda9df8 (diff)
downloaddwlb-a5cb279696622d0b4c57611cf442dea5cc51054f.tar.gz
Merge pull request #14 from NikitaIvanovV/dwl-ipc
Add support for dwl ipc patch
-rw-r--r--.gitignore4
-rw-r--r--Makefile14
-rw-r--r--config.def.h4
-rw-r--r--dwlb.c223
-rw-r--r--protocols/dwl-ipc-unstable-v2.xml181
-rw-r--r--protocols/net-tapesoftware-dwl-wm-unstable-v1.xml164
6 files changed, 324 insertions, 266 deletions
diff --git a/.gitignore b/.gitignore
index 79e08a9..48f0d83 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,5 +7,5 @@ xdg-shell-protocol.c
xdg-shell-protocol.h
xdg-output-unstable-v1-protocol.c
xdg-output-unstable-v1-protocol.h
-net-tapesoftware-dwl-wm-unstable-v1-protocol.c
-net-tapesoftware-dwl-wm-unstable-v1-protocol.h
+dwl-ipc-unstable-v2-protocol.c
+dwl-ipc-unstable-v2-protocol.h
diff --git a/Makefile b/Makefile
index 54314b5..bea7da7 100644
--- a/Makefile
+++ b/Makefile
@@ -35,16 +35,16 @@ wlr-layer-shell-unstable-v1-protocol.c:
$(WAYLAND_SCANNER) private-code protocols/wlr-layer-shell-unstable-v1.xml $@
wlr-layer-shell-unstable-v1-protocol.o: wlr-layer-shell-unstable-v1-protocol.h
-net-tapesoftware-dwl-wm-unstable-v1-protocol.h:
- $(WAYLAND_SCANNER) client-header protocols/net-tapesoftware-dwl-wm-unstable-v1.xml $@
-net-tapesoftware-dwl-wm-unstable-v1-protocol.c:
- $(WAYLAND_SCANNER) private-code protocols/net-tapesoftware-dwl-wm-unstable-v1.xml $@
-net-tapesoftware-dwl-wm-unstable-v1-protocol.o: net-tapesoftware-dwl-wm-unstable-v1-protocol.h
+dwl-ipc-unstable-v2-protocol.h:
+ $(WAYLAND_SCANNER) client-header protocols/dwl-ipc-unstable-v2.xml $@
+dwl-ipc-unstable-v2-protocol.c:
+ $(WAYLAND_SCANNER) private-code protocols/dwl-ipc-unstable-v2.xml $@
+dwl-ipc-unstable-v2-protocol.o: dwl-ipc-unstable-v2-protocol.h
-dwlb.o: utf8.h config.h xdg-shell-protocol.h xdg-output-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h net-tapesoftware-dwl-wm-unstable-v1-protocol.o
+dwlb.o: utf8.h config.h xdg-shell-protocol.h xdg-output-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h dwl-ipc-unstable-v2-protocol.h
# Protocol dependencies
-dwlb: xdg-shell-protocol.o xdg-output-unstable-v1-protocol.o wlr-layer-shell-unstable-v1-protocol.o net-tapesoftware-dwl-wm-unstable-v1-protocol.o
+dwlb: xdg-shell-protocol.o xdg-output-unstable-v1-protocol.o wlr-layer-shell-unstable-v1-protocol.o dwl-ipc-unstable-v2-protocol.o
# Library dependencies
dwlb: CFLAGS+=$(shell pkg-config --cflags wayland-client wayland-cursor fcft pixman-1)
diff --git a/config.def.h b/config.def.h
index f91787b..5b8b71d 100644
--- a/config.def.h
+++ b/config.def.h
@@ -18,8 +18,8 @@ static bool custom_title = false;
static uint32_t buffer_scale = 1;
// font
static char *fontstr = "monospace:size=16";
-// tag names if ipc is disabled
-static char *tags_noipc[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
+// tag names
+static char *tags_names[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
// set 16-bit colors for bar
// 8-bit color can be converted to 16-bit color by simply duplicating values e.g
diff --git a/dwlb.c b/dwlb.c
index 1a78f39..c1cdb79 100644
--- a/dwlb.c
+++ b/dwlb.c
@@ -25,7 +25,7 @@
#include "xdg-shell-protocol.h"
#include "xdg-output-unstable-v1-protocol.h"
#include "wlr-layer-shell-unstable-v1-protocol.h"
-#include "net-tapesoftware-dwl-wm-unstable-v1-protocol.h"
+#include "dwl-ipc-unstable-v2-protocol.h"
#define DIE(fmt, ...) \
do { \
@@ -133,7 +133,7 @@ typedef struct {
struct wl_surface *wl_surface;
struct zwlr_layer_surface_v1 *layer_surface;
struct zxdg_output_v1 *xdg_output;
- struct znet_tapesoftware_dwl_wm_monitor_v1 *dwl_wm_monitor;
+ struct zdwl_ipc_output_v2 *dwl_wm_output;
uint32_t registry_name;
char *xdg_output_name;
@@ -179,7 +179,10 @@ static struct wl_compositor *compositor;
static struct wl_shm *shm;
static struct zwlr_layer_shell_v1 *layer_shell;
static struct zxdg_output_manager_v1 *output_manager;
-static struct znet_tapesoftware_dwl_wm_v1 *dwl_wm;
+
+static struct zdwl_ipc_manager_v2 *dwl_wm;
+static struct wl_cursor_image *cursor_image;
+static struct wl_surface *cursor_surface;
static struct wl_list bar_list, seat_list;
@@ -635,19 +638,19 @@ pointer_frame(void *data, struct wl_pointer *pointer)
/* Clicked on tags */
if (ipc) {
if (seat->pointer_button == BTN_LEFT)
- znet_tapesoftware_dwl_wm_monitor_v1_set_tags(seat->bar->dwl_wm_monitor, 1 << i, 1);
+ zdwl_ipc_output_v2_set_tags(seat->bar->dwl_wm_output, 1 << i, 1);
else if (seat->pointer_button == BTN_MIDDLE)
- znet_tapesoftware_dwl_wm_monitor_v1_set_tags(seat->bar->dwl_wm_monitor, ~0, 1 << i);
+ zdwl_ipc_output_v2_set_tags(seat->bar->dwl_wm_output, ~0, 1);
else if (seat->pointer_button == BTN_RIGHT)
- znet_tapesoftware_dwl_wm_monitor_v1_set_tags(seat->bar->dwl_wm_monitor, 0, 1 << i);
+ zdwl_ipc_output_v2_set_tags(seat->bar->dwl_wm_output, seat->bar->mtags ^ (1 << i), 0);
}
} else if (seat->pointer_x < (x += TEXT_WIDTH(seat->bar->layout, seat->bar->width - x, seat->bar->textpadding))) {
/* Clicked on layout */
if (ipc) {
if (seat->pointer_button == BTN_LEFT)
- znet_tapesoftware_dwl_wm_monitor_v1_set_layout(seat->bar->dwl_wm_monitor, seat->bar->last_layout_idx);
+ zdwl_ipc_output_v2_set_layout(seat->bar->dwl_wm_output, seat->bar->last_layout_idx);
else if (seat->pointer_button == BTN_RIGHT)
- znet_tapesoftware_dwl_wm_monitor_v1_set_layout(seat->bar->dwl_wm_monitor, 2);
+ zdwl_ipc_output_v2_set_layout(seat->bar->dwl_wm_output, 2);
}
} else {
uint32_t status_x = seat->bar->width / buffer_scale - TEXT_WIDTH(seat->bar->status.text, seat->bar->width - x, seat->bar->textpadding) / buffer_scale;
@@ -755,16 +758,55 @@ static const struct wl_seat_listener seat_listener = {
};
static void
-dwl_wm_tag(void *data, struct znet_tapesoftware_dwl_wm_v1 *dwl_wm, const char *name)
+show_bar(Bar *bar)
{
- char **ptr;
- ARRAY_APPEND(tags, tags_l, tags_c, ptr);
- if (!(*ptr = strdup(name)))
- EDIE("strdup");
+ bar->wl_surface = wl_compositor_create_surface(compositor);
+ if (!bar->wl_surface)
+ DIE("Could not create wl_surface");
+
+ bar->layer_surface = zwlr_layer_shell_v1_get_layer_surface(layer_shell, bar->wl_surface, bar->wl_output,
+ ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM, PROGRAM);
+ if (!bar->layer_surface)
+ DIE("Could not create layer_surface");
+ zwlr_layer_surface_v1_add_listener(bar->layer_surface, &layer_surface_listener, bar);
+
+ zwlr_layer_surface_v1_set_size(bar->layer_surface, 0, bar->height / buffer_scale);
+ zwlr_layer_surface_v1_set_anchor(bar->layer_surface,
+ (bar->bottom ? ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM : ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)
+ | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT
+ | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT);
+ zwlr_layer_surface_v1_set_exclusive_zone(bar->layer_surface, bar->height / buffer_scale);
+ wl_surface_commit(bar->wl_surface);
+
+ bar->hidden = false;
}
static void
-dwl_wm_layout(void *data, struct znet_tapesoftware_dwl_wm_v1 *dwl_wm, const char *name)
+hide_bar(Bar *bar)
+{
+ zwlr_layer_surface_v1_destroy(bar->layer_surface);
+ wl_surface_destroy(bar->wl_surface);
+
+ bar->configured = false;
+ bar->hidden = true;
+}
+
+static void
+dwl_wm_tags(void *data, struct zdwl_ipc_manager_v2 *dwl_wm,
+ uint32_t amount)
+{
+ if (!tags && !(tags = malloc(amount * sizeof(char *))))
+ EDIE("malloc");
+ uint32_t i = tags_l;
+ ARRAY_EXPAND(tags, tags_l, tags_c, MAX(0, (int)amount - (int)tags_l));
+ for (; i < amount; i++)
+ if (!(tags[i] = strdup(tags_names[MIN(i, LENGTH(tags_names)-1)])))
+ EDIE("strdup");
+}
+
+static void
+dwl_wm_layout(void *data, struct zdwl_ipc_manager_v2 *dwl_wm,
+ const char *name)
{
char **ptr;
ARRAY_APPEND(layouts, layouts_l, layouts_c, ptr);
@@ -772,34 +814,39 @@ dwl_wm_layout(void *data, struct znet_tapesoftware_dwl_wm_v1 *dwl_wm, const char
EDIE("strdup");
}
-static const struct znet_tapesoftware_dwl_wm_v1_listener dwl_wm_listener = {
- .tag = dwl_wm_tag,
+static const struct zdwl_ipc_manager_v2_listener dwl_wm_listener = {
+ .tags = dwl_wm_tags,
.layout = dwl_wm_layout
};
static void
-dwl_wm_monitor_selected(void *data, struct znet_tapesoftware_dwl_wm_monitor_v1 *dwl_wm_monitor,
- uint32_t selected)
+dwl_wm_output_toggle_visibility(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output)
{
Bar *bar = (Bar *)data;
- if (selected != bar->sel) {
- bar->sel = selected;
- bar->redraw = true;
- }
+ if (bar->hidden)
+ show_bar(bar);
+ else
+ hide_bar(bar);
}
static void
-dwl_wm_monitor_tag(void *data, struct znet_tapesoftware_dwl_wm_monitor_v1 *dwl_wm_monitor,
- uint32_t tag, uint32_t state, uint32_t clients, int32_t focused_client)
+dwl_wm_output_active(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output,
+ uint32_t active)
{
Bar *bar = (Bar *)data;
- uint32_t imtags = bar->mtags;
- uint32_t ictags = bar->ctags;
- uint32_t iurg = bar->urg;
-
- if (state & ZNET_TAPESOFTWARE_DWL_WM_MONITOR_V1_TAG_STATE_ACTIVE)
+ if (active != bar->sel)
+ bar->sel = active;
+}
+
+static void
+dwl_wm_output_tag(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output,
+ uint32_t tag, uint32_t state, uint32_t clients, uint32_t focused)
+{
+ Bar *bar = (Bar *)data;
+
+ if (state & ZDWL_IPC_OUTPUT_V2_TAG_STATE_ACTIVE)
bar->mtags |= 1 << tag;
else
bar->mtags &= ~(1 << tag);
@@ -807,30 +854,25 @@ dwl_wm_monitor_tag(void *data, struct znet_tapesoftware_dwl_wm_monitor_v1 *dwl_w
bar->ctags |= 1 << tag;
else
bar->ctags &= ~(1 << tag);
- if (state & ZNET_TAPESOFTWARE_DWL_WM_MONITOR_V1_TAG_STATE_URGENT)
+ if (state & ZDWL_IPC_OUTPUT_V2_TAG_STATE_URGENT)
bar->urg |= 1 << tag;
else
bar->urg &= ~(1 << tag);
-
- if (bar->mtags != imtags || bar->ctags != ictags || bar->urg != iurg)
- bar->redraw = true;
}
static void
-dwl_wm_monitor_layout(void *data, struct znet_tapesoftware_dwl_wm_monitor_v1 *dwl_wm_monitor,
- uint32_t layout)
+dwl_wm_output_layout(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output,
+ uint32_t layout)
{
Bar *bar = (Bar *)data;
- bar->layout = layouts[layout];
bar->last_layout_idx = bar->layout_idx;
bar->layout_idx = layout;
- bar->redraw = true;
}
static void
-dwl_wm_monitor_title(void *data, struct znet_tapesoftware_dwl_wm_monitor_v1 *dwl_wm_monitor,
- const char *title)
+dwl_wm_output_title(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output,
+ const char *title)
{
if (custom_title)
return;
@@ -841,56 +883,59 @@ dwl_wm_monitor_title(void *data, struct znet_tapesoftware_dwl_wm_monitor_v1 *dwl
free(bar->window_title);
if (!(bar->window_title = strdup(title)))
EDIE("strdup");
- bar->redraw = true;
}
static void
-dwl_wm_monitor_frame(void *data, struct znet_tapesoftware_dwl_wm_monitor_v1 *dwl_wm_monitor)
+dwl_wm_output_appid(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output,
+ const char *appid)
{
}
-static const struct znet_tapesoftware_dwl_wm_monitor_v1_listener dwl_wm_monitor_listener = {
- .selected = dwl_wm_monitor_selected,
- .tag = dwl_wm_monitor_tag,
- .layout = dwl_wm_monitor_layout,
- .title = dwl_wm_monitor_title,
- .frame = dwl_wm_monitor_frame
-};
-
static void
-show_bar(Bar *bar)
+dwl_wm_output_layout_symbol(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output,
+ const char *layout)
{
- bar->wl_surface = wl_compositor_create_surface(compositor);
- if (!bar->wl_surface)
- DIE("Could not create wl_surface");
-
- bar->layer_surface = zwlr_layer_shell_v1_get_layer_surface(layer_shell, bar->wl_surface, bar->wl_output,
- ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM, PROGRAM);
- if (!bar->layer_surface)
- DIE("Could not create layer_surface");
- zwlr_layer_surface_v1_add_listener(bar->layer_surface, &layer_surface_listener, bar);
+ Bar *bar = (Bar *)data;
- zwlr_layer_surface_v1_set_size(bar->layer_surface, 0, bar->height / buffer_scale);
- zwlr_layer_surface_v1_set_anchor(bar->layer_surface,
- (bar->bottom ? ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM : ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)
- | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT
- | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT);
- zwlr_layer_surface_v1_set_exclusive_zone(bar->layer_surface, bar->height / buffer_scale);
- wl_surface_commit(bar->wl_surface);
+ if (layouts[bar->layout_idx])
+ free(layouts[bar->layout_idx]);
+ if (!(layouts[bar->layout_idx] = strdup(layout)))
+ EDIE("strdup");
+ bar->layout = layouts[bar->layout_idx];
+}
- bar->hidden = false;
+static void
+dwl_wm_output_frame(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output)
+{
+ Bar *bar = (Bar *)data;
+ bar->redraw = true;
}
static void
-hide_bar(Bar *bar)
+dwl_wm_output_fullscreen(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output,
+ uint32_t is_fullscreen)
{
- zwlr_layer_surface_v1_destroy(bar->layer_surface);
- wl_surface_destroy(bar->wl_surface);
+}
- bar->configured = false;
- bar->hidden = true;
+static void
+dwl_wm_output_floating(void *data, struct zdwl_ipc_output_v2 *dwl_wm_output,
+ uint32_t is_floating)
+{
}
+static const struct zdwl_ipc_output_v2_listener dwl_wm_output_listener = {
+ .toggle_visibility = dwl_wm_output_toggle_visibility,
+ .active = dwl_wm_output_active,
+ .tag = dwl_wm_output_tag,
+ .layout = dwl_wm_output_layout,
+ .title = dwl_wm_output_title,
+ .appid = dwl_wm_output_appid,
+ .layout_symbol = dwl_wm_output_layout_symbol,
+ .frame = dwl_wm_output_frame,
+ .fullscreen = dwl_wm_output_fullscreen,
+ .floating = dwl_wm_output_floating
+};
+
static void
setup_bar(Bar *bar)
{
@@ -905,10 +950,10 @@ setup_bar(Bar *bar)
zxdg_output_v1_add_listener(bar->xdg_output, &output_listener, bar);
if (ipc) {
- bar->dwl_wm_monitor = znet_tapesoftware_dwl_wm_v1_get_monitor(dwl_wm, bar->wl_output);
- if (!bar->dwl_wm_monitor)
- DIE("Could not create dwl_wm_monitor");
- znet_tapesoftware_dwl_wm_monitor_v1_add_listener(bar->dwl_wm_monitor, &dwl_wm_monitor_listener, bar);
+ bar->dwl_wm_output = zdwl_ipc_manager_v2_get_output(dwl_wm, bar->wl_output);
+ if (!bar->dwl_wm_output)
+ DIE("Could not create dwl_wm_output");
+ zdwl_ipc_output_v2_add_listener(bar->dwl_wm_output, &dwl_wm_output_listener, bar);
}
if (!bar->hidden)
@@ -927,10 +972,10 @@ handle_global(void *data, struct wl_registry *registry,
layer_shell = wl_registry_bind(registry, name, &zwlr_layer_shell_v1_interface, 1);
} else if (!strcmp(interface, zxdg_output_manager_v1_interface.name)) {
output_manager = wl_registry_bind(registry, name, &zxdg_output_manager_v1_interface, 2);
- } else if (!strcmp(interface, znet_tapesoftware_dwl_wm_v1_interface.name)) {
+ } else if (!strcmp(interface, zdwl_ipc_manager_v2_interface.name)) {
if (ipc) {
- dwl_wm = wl_registry_bind(registry, name, &znet_tapesoftware_dwl_wm_v1_interface, 1);
- znet_tapesoftware_dwl_wm_v1_add_listener(dwl_wm, &dwl_wm_listener, NULL);
+ dwl_wm = wl_registry_bind(registry, name, &zdwl_ipc_manager_v2_interface, 2);
+ zdwl_ipc_manager_v2_add_listener(dwl_wm, &dwl_wm_listener, NULL);
}
} else if (!strcmp(interface, wl_output_interface.name)) {
Bar *bar = calloc(1, sizeof(Bar));
@@ -963,10 +1008,12 @@ teardown_bar(Bar *bar)
free(bar->title.colors);
if (bar->title.buttons)
free(bar->title.buttons);
+ if (bar->window_title)
+ free(bar->window_title);
if (!ipc && bar->layout)
free(bar->layout);
if (ipc)
- znet_tapesoftware_dwl_wm_monitor_v1_destroy(bar->dwl_wm_monitor);
+ zdwl_ipc_output_v2_destroy(bar->dwl_wm_output);
if (bar->xdg_output_name)
free(bar->xdg_output_name);
if (!bar->hidden) {
@@ -1725,18 +1772,12 @@ main(int argc, char **argv)
height = font->height / buffer_scale + vertical_padding * 2;
/* Configure tag names */
- if (ipc && tags) {
- for (uint32_t i = 0; i < tags_l; i++)
- free(tags[i]);
- free(tags);
- tags_l = tags_c = 0;
- tags = NULL;
- } else if (!ipc && !tags) {
- if (!(tags = malloc(LENGTH(tags_noipc) * sizeof(char *))))
+ if (!ipc && !tags) {
+ if (!(tags = malloc(LENGTH(tags_names) * sizeof(char *))))
EDIE("malloc");
- tags_l = tags_c = LENGTH(tags_noipc);
+ tags_l = tags_c = LENGTH(tags_names);
for (uint32_t i = 0; i < tags_l; i++)
- if (!(tags[i] = strdup(tags_noipc[i])))
+ if (!(tags[i] = strdup(tags_names[i])))
EDIE("strdup");
}
@@ -1815,7 +1856,7 @@ main(int argc, char **argv)
zwlr_layer_shell_v1_destroy(layer_shell);
zxdg_output_manager_v1_destroy(output_manager);
if (ipc)
- znet_tapesoftware_dwl_wm_v1_destroy(dwl_wm);
+ zdwl_ipc_manager_v2_destroy(dwl_wm);
fcft_destroy(font);
fcft_fini();
diff --git a/protocols/dwl-ipc-unstable-v2.xml b/protocols/dwl-ipc-unstable-v2.xml
new file mode 100644
index 0000000..0a6e7e5
--- /dev/null
+++ b/protocols/dwl-ipc-unstable-v2.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+This is largely ripped from somebar's ipc patchset; just with some personal modifications.
+I would probably just submit raphi's patchset but I don't think that would be polite.
+-->
+<protocol name="dwl_ipc_unstable_v2">
+ <description summary="inter-proccess-communication about dwl's state">
+ This protocol allows clients to update and get updates from dwl.
+
+ Warning! The protocol described in this file is experimental and
+ backward incompatible changes may be made. Backward compatible
+ changes may be added together with the corresponding interface
+ version bump.
+ Backward incompatible changes are done by bumping the version
+ number in the protocol and interface names and resetting the
+ interface version. Once the protocol is to be declared stable,
+ the 'z' prefix and the version number in the protocol and
+ interface names are removed and the interface version number is
+ reset.
+ </description>
+
+ <interface name="zdwl_ipc_manager_v2" version="2">
+ <description summary="manage dwl state">
+ This interface is exposed as a global in wl_registry.
+
+ Clients can use this interface to get a dwl_ipc_output.
+ After binding the client will recieve the dwl_ipc_manager.tags and dwl_ipc_manager.layout events.
+ The dwl_ipc_manager.tags and dwl_ipc_manager.layout events expose tags and layouts to the client.
+ </description>
+
+ <request name="release" type="destructor">
+ <description summary="release dwl_ipc_manager">
+ Indicates that the client will not the dwl_ipc_manager object anymore.
+ Objects created through this instance are not affected.
+ </description>
+ </request>
+
+ <request name="get_output">
+ <description summary="get a dwl_ipc_outout for a wl_output">
+ Get a dwl_ipc_outout for the specified wl_output.
+ </description>
+ <arg name="id" type="new_id" interface="zdwl_ipc_output_v2"/>
+ <arg name="output" type="object" interface="wl_output"/>
+ </request>
+
+ <event name="tags">
+ <description summary="Announces tag amount">
+ This event is sent after binding.
+ A roundtrip after binding guarantees the client recieved all tags.
+ </description>
+ <arg name="amount" type="uint"/>
+ </event>
+
+ <event name="layout">
+ <description summary="Announces a layout">
+ This event is sent after binding.
+ A roundtrip after binding guarantees the client recieved all layouts.
+ </description>
+ <arg name="name" type="string"/>
+ </event>
+ </interface>
+
+ <interface name="zdwl_ipc_output_v2" version="2">
+ <description summary="control dwl output">
+ Observe and control a dwl output.
+
+ Events are double-buffered:
+ Clients should cache events and redraw when a dwl_ipc_output.frame event is sent.
+
+ Request are not double-buffered:
+ The compositor will update immediately upon request.
+ </description>
+
+ <enum name="tag_state">
+ <entry name="none" value="0" summary="no state"/>
+ <entry name="active" value="1" summary="tag is active"/>
+ <entry name="urgent" value="2" summary="tag has at least one urgent client"/>
+ </enum>
+
+ <request name="release" type="destructor">
+ <description summary="release dwl_ipc_outout">
+ Indicates to that the client no longer needs this dwl_ipc_output.
+ </description>
+ </request>
+
+ <event name="toggle_visibility">
+ <description summary="Toggle client visibilty">
+ Indicates the client should hide or show themselves.
+ If the client is visible then hide, if hidden then show.
+ </description>
+ </event>
+
+ <event name="active">
+ <description summary="Update the selected output.">
+ Indicates if the output is active. Zero is invalid, nonzero is valid.
+ </description>
+ <arg name="active" type="uint"/>
+ </event>
+
+ <event name="tag">
+ <description summary="Update the state of a tag.">
+ Indicates that a tag has been updated.
+ </description>
+ <arg name="tag" type="uint" summary="Index of the tag"/>
+ <arg name="state" type="uint" enum="tag_state" summary="The state of the tag."/>
+ <arg name="clients" type="uint" summary="The number of clients in the tag."/>
+ <arg name="focused" type="uint" summary="If there is a focused client. Nonzero being valid, zero being invalid."/>
+ </event>
+
+ <event name="layout">
+ <description summary="Update the layout.">
+ Indicates a new layout is selected.
+ </description>
+ <arg name="layout" type="uint" summary="Index of the layout."/>
+ </event>
+
+ <event name="title">
+ <description summary="Update the title.">
+ Indicates the title has changed.
+ </description>
+ <arg name="title" type="string" summary="The new title name."/>
+ </event>
+
+ <event name="appid" since="1">
+ <description summary="Update the appid.">
+ Indicates the appid has changed.
+ </description>
+ <arg name="appid" type="string" summary="The new appid."/>
+ </event>
+
+ <event name="layout_symbol" since="1">
+ <description summary="Update the current layout symbol">
+ Indicates the layout has changed. Since layout symbols are dynamic.
+ As opposed to the zdwl_ipc_manager.layout event, this should take precendence when displaying.
+ You can ignore the zdwl_ipc_output.layout event.
+ </description>
+ <arg name="layout" type="string" summary="The new layout"/>
+ </event>
+
+ <event name="frame">
+ <description summary="The update sequence is done.">
+ Indicates that a sequence of status updates have finished and the client should redraw.
+ </description>
+ </event>
+
+ <request name="set_tags">
+ <description summary="Set the active tags of this output"/>
+ <arg name="tagmask" type="uint" summary="bitmask of the tags that should be set."/>
+ <arg name="toggle_tagset" type="uint" summary="toggle the selected tagset, zero for invalid, nonzero for valid."/>
+ </request>
+
+ <request name="set_client_tags">
+ <description summary="Set the tags of the focused client.">
+ The tags are updated as follows:
+ new_tags = (current_tags AND and_tags) XOR xor_tags
+ </description>
+ <arg name="and_tags" type="uint"/>
+ <arg name="xor_tags" type="uint"/>
+ </request>
+
+ <request name="set_layout">
+ <description summary="Set the layout of this output"/>
+ <arg name="index" type="uint" summary="index of a layout recieved by dwl_ipc_manager.layout"/>
+ </request>
+
+ <!-- Version 2 -->
+ <event name="fullscreen" since="2">
+ <description summary="Update fullscreen status">
+ Indicates if the selected client on this output is fullscreen.
+ </description>
+ <arg name="is_fullscreen" type="uint" summary="If the selected client is fullscreen. Nonzero is valid, zero invalid"/>
+ </event>
+
+ <event name="floating" since="2">
+ <description summary="Update the floating status">
+ Indicates if the selected client on this output is floating.
+ </description>
+ <arg name="is_floating" type="uint" summary="If the selected client is floating. Nonzero is valid, zero invalid"/>
+ </event>
+ </interface>
+</protocol>
diff --git a/protocols/net-tapesoftware-dwl-wm-unstable-v1.xml b/protocols/net-tapesoftware-dwl-wm-unstable-v1.xml
deleted file mode 100644
index 4fe5b73..0000000
--- a/protocols/net-tapesoftware-dwl-wm-unstable-v1.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?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>