mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-31 07:52:42 +01:00 
			
		
		
		
	Update to new ipc version
This commit is contained in:
		| @@ -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; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 David Delarosa
					David Delarosa