Merge pull request #2185 from xdavidel/dwl-module
Update to new ipc version
This commit is contained in:
commit
13a9c4a08b
|
@ -5,7 +5,7 @@
|
|||
|
||||
#include "AModule.hpp"
|
||||
#include "bar.hpp"
|
||||
#include "dwl-bar-ipc-unstable-v1-client-protocol.h"
|
||||
#include "dwl-ipc-unstable-v2-client-protocol.h"
|
||||
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||
|
||||
namespace waybar::modules::dwl {
|
||||
|
@ -21,14 +21,14 @@ class Tags : public waybar::AModule {
|
|||
void handle_primary_clicked(uint32_t tag);
|
||||
bool handle_button_press(GdkEventButton *event_button, uint32_t tag);
|
||||
|
||||
struct zdwl_manager_v1 *status_manager_;
|
||||
struct zdwl_ipc_manager_v2 *status_manager_;
|
||||
struct wl_seat *seat_;
|
||||
|
||||
private:
|
||||
const waybar::Bar &bar_;
|
||||
Gtk::Box box_;
|
||||
std::vector<Gtk::Button> buttons_;
|
||||
struct zdwl_output_v1 *output_status_;
|
||||
struct zdwl_ipc_output_v2 *output_status_;
|
||||
};
|
||||
|
||||
} /* namespace waybar::modules::dwl */
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
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_bar_ipc_unstable_v1">
|
||||
<protocol name="dwl_ipc_unstable_v2">
|
||||
<description summary="inter-proccess-communication about dwl's state">
|
||||
This protocol allows clients to get updates from dwl and vice versa.
|
||||
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
|
||||
|
@ -19,36 +19,36 @@ I would probably just submit raphi's patchset but I don't think that would be po
|
|||
reset.
|
||||
</description>
|
||||
|
||||
<interface name="zdwl_manager_v1" version="3">
|
||||
<interface name="zdwl_ipc_manager_v2" version="1">
|
||||
<description summary="manage dwl state">
|
||||
This interface is exposed as a global in wl_registry.
|
||||
|
||||
Clients can use this interface to get a dwl_output.
|
||||
After binding the client will revieve dwl_manager.tag and dwl_manager.layout events.
|
||||
The dwl_manager.tag and dwl_manager.layout events expose tags and layouts to the client.
|
||||
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_manager">
|
||||
Indicates that the client will not the dwl_manager object anymore.
|
||||
<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_output for a wl_output">
|
||||
Get a dwl_output for the specified wl_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_output_v1"/>
|
||||
<arg name="id" type="new_id" interface="zdwl_ipc_output_v2"/>
|
||||
<arg name="output" type="object" interface="wl_output"/>
|
||||
</request>
|
||||
|
||||
<event name="tag">
|
||||
<description summary="Announces a tag">
|
||||
<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="tag" type="int"/>
|
||||
<arg name="amount" type="uint"/>
|
||||
</event>
|
||||
|
||||
<event name="layout">
|
||||
|
@ -60,12 +60,12 @@ I would probably just submit raphi's patchset but I don't think that would be po
|
|||
</event>
|
||||
</interface>
|
||||
|
||||
<interface name="zdwl_output_v1" version="3">
|
||||
<interface name="zdwl_ipc_output_v2" version="1">
|
||||
<description summary="control dwl output">
|
||||
Observe and control a dwl output.
|
||||
|
||||
Events are double-buffered:
|
||||
Clients should cache events and redraw when a dwl_output.done event is sent.
|
||||
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.
|
||||
|
@ -78,8 +78,8 @@ I would probably just submit raphi's patchset but I don't think that would be po
|
|||
</enum>
|
||||
|
||||
<request name="release" type="destructor">
|
||||
<description summary="release dwl_output">
|
||||
Indicates to that the client no longer needs this dwl_output.
|
||||
<description summary="release dwl_ipc_outout">
|
||||
Indicates to that the client no longer needs this dwl_ipc_output.
|
||||
</description>
|
||||
</request>
|
||||
|
||||
|
@ -121,34 +121,28 @@ I would probably just submit raphi's patchset but I don't think that would be po
|
|||
<arg name="title" type="string" summary="The new title name."/>
|
||||
</event>
|
||||
|
||||
<event name="appid" since="2">
|
||||
<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="3">
|
||||
<event name="layout_symbol" since="1">
|
||||
<description summary="Update the current layout symbol">
|
||||
Indicates the layout has changed. Since layout symbols are now dynamic.
|
||||
As opposed to the zdwl_manager_v1.layout event, this should take precendence when displaying.
|
||||
This also means ignoring the zdwl_output_v1.layout event.
|
||||
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_layout">
|
||||
<description summary="Set the layout of this output"/>
|
||||
<arg name="index" type="uint" summary="index of a layout recieved by dwl_manager.layout"/>
|
||||
</request>
|
||||
|
||||
<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."/>
|
||||
|
@ -163,5 +157,10 @@ I would probably just submit raphi's patchset but I don't think that would be po
|
|||
<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>
|
||||
</interface>
|
||||
</protocol>
|
|
@ -30,7 +30,7 @@ client_protocols = [
|
|||
['ext-workspace-unstable-v1.xml'],
|
||||
['river-status-unstable-v1.xml'],
|
||||
['river-control-unstable-v1.xml'],
|
||||
['dwl-bar-ipc-unstable-v1.xml'],
|
||||
['dwl-ipc-unstable-v2.xml'],
|
||||
]
|
||||
|
||||
client_protos_src = []
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <algorithm>
|
||||
|
||||
#include "client.hpp"
|
||||
#include "dwl-bar-ipc-unstable-v1-client-protocol.h"
|
||||
#include "dwl-ipc-unstable-v2-client-protocol.h"
|
||||
|
||||
#define TAG_INACTIVE 0
|
||||
#define TAG_ACTIVE 1
|
||||
|
@ -21,43 +21,43 @@ wl_array tags, layouts;
|
|||
|
||||
static uint num_tags = 0;
|
||||
|
||||
void toggle_visibility(void *data, zdwl_output_v1 *zdwl_output_v1) {
|
||||
void toggle_visibility(void *data, zdwl_ipc_output_v2 *zdwl_output_v2) {
|
||||
// Intentionally empty
|
||||
}
|
||||
|
||||
void active(void *data, zdwl_output_v1 *zdwl_output_v1, uint32_t active) {
|
||||
void active(void *data, zdwl_ipc_output_v2 *zdwl_output_v2, uint32_t active) {
|
||||
// Intentionally empty
|
||||
}
|
||||
|
||||
static void set_tag(void *data, zdwl_output_v1 *zdwl_output_v1, uint32_t tag, uint32_t state,
|
||||
static void set_tag(void *data, zdwl_ipc_output_v2 *zdwl_output_v2, uint32_t tag, uint32_t state,
|
||||
uint32_t clients, uint32_t focused) {
|
||||
static_cast<Tags *>(data)->handle_view_tags(tag, state, clients, focused);
|
||||
|
||||
num_tags =
|
||||
(state & ZDWL_OUTPUT_V1_TAG_STATE_ACTIVE) ? num_tags | (1 << tag) : num_tags & ~(1 << tag);
|
||||
num_tags = (state & ZDWL_IPC_OUTPUT_V2_TAG_STATE_ACTIVE) ? num_tags | (1 << tag)
|
||||
: num_tags & ~(1 << tag);
|
||||
}
|
||||
|
||||
void set_layout_symbol(void *data, zdwl_output_v1 *zdwl_output_v1, const char *layout) {
|
||||
void set_layout_symbol(void *data, zdwl_ipc_output_v2 *zdwl_output_v2, const char *layout) {
|
||||
// Intentionally empty
|
||||
}
|
||||
|
||||
void title(void *data, zdwl_output_v1 *zdwl_output_v1, const char *title) {
|
||||
void title(void *data, zdwl_ipc_output_v2 *zdwl_output_v2, const char *title) {
|
||||
// Intentionally empty
|
||||
}
|
||||
|
||||
void dwl_frame(void *data, zdwl_output_v1 *zdwl_output_v1) {
|
||||
void dwl_frame(void *data, zdwl_ipc_output_v2 *zdwl_output_v2) {
|
||||
// Intentionally empty
|
||||
}
|
||||
|
||||
static void set_layout(void *data, zdwl_output_v1 *zdwl_output_v1, uint32_t layout) {
|
||||
static void set_layout(void *data, zdwl_ipc_output_v2 *zdwl_output_v2, uint32_t layout) {
|
||||
// Intentionally empty
|
||||
}
|
||||
|
||||
static void appid(void *data, zdwl_output_v1 *zdwl_output_v1, const char *appid){
|
||||
static void appid(void *data, zdwl_ipc_output_v2 *zdwl_output_v2, const char *appid){
|
||||
// Intentionally empty
|
||||
};
|
||||
|
||||
static const zdwl_output_v1_listener output_status_listener_impl{
|
||||
static const zdwl_ipc_output_v2_listener output_status_listener_impl{
|
||||
.toggle_visibility = toggle_visibility,
|
||||
.active = active,
|
||||
.tag = set_tag,
|
||||
|
@ -70,9 +70,9 @@ static const zdwl_output_v1_listener output_status_listener_impl{
|
|||
|
||||
static void handle_global(void *data, struct wl_registry *registry, uint32_t name,
|
||||
const char *interface, uint32_t version) {
|
||||
if (std::strcmp(interface, zdwl_manager_v1_interface.name) == 0) {
|
||||
static_cast<Tags *>(data)->status_manager_ = static_cast<struct zdwl_manager_v1 *>(
|
||||
(zdwl_manager_v1 *)wl_registry_bind(registry, name, &zdwl_manager_v1_interface, 3));
|
||||
if (std::strcmp(interface, zdwl_ipc_manager_v2_interface.name) == 0) {
|
||||
static_cast<Tags *>(data)->status_manager_ = static_cast<struct zdwl_ipc_manager_v2 *>(
|
||||
(zdwl_ipc_manager_v2 *)wl_registry_bind(registry, name, &zdwl_ipc_manager_v2_interface, 3));
|
||||
}
|
||||
if (std::strcmp(interface, wl_seat_interface.name) == 0) {
|
||||
version = std::min<uint32_t>(version, 1);
|
||||
|
@ -101,7 +101,7 @@ Tags::Tags(const std::string &id, const waybar::Bar &bar, const Json::Value &con
|
|||
wl_display_roundtrip(display);
|
||||
|
||||
if (!status_manager_) {
|
||||
spdlog::error("dwl_status_manager_v1 not advertised");
|
||||
spdlog::error("dwl_status_manager_v2 not advertised");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -146,29 +146,29 @@ Tags::Tags(const std::string &id, const waybar::Bar &bar, const Json::Value &con
|
|||
}
|
||||
|
||||
struct wl_output *output = gdk_wayland_monitor_get_wl_output(bar_.output->monitor->gobj());
|
||||
output_status_ = zdwl_manager_v1_get_output(status_manager_, output);
|
||||
zdwl_output_v1_add_listener(output_status_, &output_status_listener_impl, this);
|
||||
output_status_ = zdwl_ipc_manager_v2_get_output(status_manager_, output);
|
||||
zdwl_ipc_output_v2_add_listener(output_status_, &output_status_listener_impl, this);
|
||||
|
||||
zdwl_manager_v1_destroy(status_manager_);
|
||||
zdwl_ipc_manager_v2_destroy(status_manager_);
|
||||
status_manager_ = nullptr;
|
||||
}
|
||||
|
||||
Tags::~Tags() {
|
||||
if (status_manager_) {
|
||||
zdwl_manager_v1_destroy(status_manager_);
|
||||
zdwl_ipc_manager_v2_destroy(status_manager_);
|
||||
}
|
||||
}
|
||||
|
||||
void Tags::handle_primary_clicked(uint32_t tag) {
|
||||
if (!output_status_) return;
|
||||
|
||||
zdwl_output_v1_set_tags(output_status_, tag, 1);
|
||||
zdwl_ipc_output_v2_set_tags(output_status_, tag, 1);
|
||||
}
|
||||
|
||||
bool Tags::handle_button_press(GdkEventButton *event_button, uint32_t tag) {
|
||||
if (event_button->type == GDK_BUTTON_PRESS && event_button->button == 3) {
|
||||
if (!output_status_) return true;
|
||||
zdwl_output_v1_set_tags(output_status_, num_tags ^ tag, 0);
|
||||
zdwl_ipc_output_v2_set_tags(output_status_, num_tags ^ tag, 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue