Update to new ipc version
This commit is contained in:
		
							parent
							
								
									7b0d2e8043
								
							
						
					
					
						commit
						7e9bfc504c
					
				| 
						 | 
				
			
			@ -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,42 @@ 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,
 | 
			
		||||
                    uint32_t clients, uint32_t focused) {
 | 
			
		||||
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){
 | 
			
		||||
    // Intentionally empty
 | 
			
		||||
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 +69,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 +100,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 +145,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