mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-31 07:52:42 +01:00 
			
		
		
		
	Very basic hypr window title module
This commit is contained in:
		| @@ -45,6 +45,11 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name) const { | ||||
|     if (ref == "river/tags") { | ||||
|       return new waybar::modules::river::Tags(id, bar_, config_[name]); | ||||
|     } | ||||
| #endif | ||||
| #ifdef HAVE_HYPR | ||||
|     if (ref == "hypr/window") { | ||||
|       return new waybar::modules::hypr::Window(id, config_[name]); | ||||
|     } | ||||
| #endif | ||||
|     if (ref == "idle_inhibitor") { | ||||
|       return new waybar::modules::IdleInhibitor(id, bar_, config_[name]); | ||||
|   | ||||
							
								
								
									
										86
									
								
								src/modules/hypr/ipc.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/modules/hypr/ipc.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| #include "modules/hypr/ipc.hpp" | ||||
|  | ||||
| #include <ctype.h> | ||||
| #include <netdb.h> | ||||
| #include <netinet/in.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <sys/socket.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/types.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #include "util/string.hpp" | ||||
|  | ||||
| std::string waybar::modules::hypr::makeRequest(std::string req) { | ||||
|   const auto SERVERSOCKET = socket(AF_INET, SOCK_STREAM, 0); | ||||
|  | ||||
|   if (SERVERSOCKET < 0) { | ||||
|     spdlog::error("[Hypr IPC] Couldn't open a socket."); | ||||
|     return ""; | ||||
|   } | ||||
|  | ||||
|   const auto SERVER = gethostbyname("localhost"); | ||||
|  | ||||
|   if (!SERVER) { | ||||
|     spdlog::error("[Hypr IPC] Couldn't get localhost."); | ||||
|     return ""; | ||||
|   } | ||||
|  | ||||
|   sockaddr_in serverAddress = {0}; | ||||
|   serverAddress.sin_family = AF_INET; | ||||
|   bcopy((char*)SERVER->h_addr, (char*)&serverAddress.sin_addr.s_addr, SERVER->h_length); | ||||
|  | ||||
|   std::ifstream socketPortStream; | ||||
|   socketPortStream.open("/tmp/hypr/.socket"); | ||||
|  | ||||
|   if (!socketPortStream.good()) { | ||||
|     spdlog::error("[Hypr IPC] No socket file. Is Hyprland running?"); | ||||
|     return ""; | ||||
|   } | ||||
|  | ||||
|   std::string port = ""; | ||||
|   std::getline(socketPortStream, port); | ||||
|   socketPortStream.close(); | ||||
|  | ||||
|   int portInt = 0; | ||||
|   try { | ||||
|     portInt = std::stoi(port.c_str()); | ||||
|   } catch (...) { | ||||
|     spdlog::error("[Hypr IPC] Port not an int?!"); | ||||
|     return ""; | ||||
|   } | ||||
|  | ||||
|   if (portInt == 0) { | ||||
|     spdlog::error("[Hypr IPC] Port 0. Aborting."); | ||||
|     return ""; | ||||
|   } | ||||
|  | ||||
|   serverAddress.sin_port = portInt; | ||||
|  | ||||
|   if (connect(SERVERSOCKET, (sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) { | ||||
|     spdlog::error("[Hypr IPC] Couldn't connect to port {} , is Hyprland running?", port); | ||||
|     return ""; | ||||
|   } | ||||
|  | ||||
|   auto sizeWritten = write(SERVERSOCKET, req.c_str(), req.length()); | ||||
|  | ||||
|   if (sizeWritten < 0) { | ||||
|     spdlog::error("[Hypr IPC] Couldn't write to the socket."); | ||||
|     return ""; | ||||
|   } | ||||
|  | ||||
|   char buffer[8192] = {0}; | ||||
|  | ||||
|   sizeWritten = read(SERVERSOCKET, buffer, 8192); | ||||
|  | ||||
|   if (sizeWritten < 0) { | ||||
|     spdlog::error("[Hypr IPC] Couldn't cread from the socket."); | ||||
|     return ""; | ||||
|   } | ||||
|  | ||||
|   close(SERVERSOCKET); | ||||
|  | ||||
|   return std::string(buffer); | ||||
| } | ||||
							
								
								
									
										27
									
								
								src/modules/hypr/window.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/modules/hypr/window.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| #include "modules/hypr/window.hpp" | ||||
| #include "modules/hypr/ipc.hpp" | ||||
|  | ||||
| using namespace waybar::util; | ||||
|  | ||||
| waybar::modules::hypr::Window::Window(const std::string& id, const Json::Value& config) : ALabel(config, "window", id, "{window}", 0.5f) { | ||||
|   thread_ = [this] { | ||||
|     dp.emit(); | ||||
|     thread_.sleep_for(interval_); | ||||
|   }; | ||||
| } | ||||
|  | ||||
| auto waybar::modules::hypr::Window::update() -> void { | ||||
|   auto format = format_; | ||||
|  | ||||
|   std::string windowName = waybar::modules::hypr::makeRequest("activewindow"); | ||||
|  | ||||
|   if (windowName != "") | ||||
|      windowName = windowName.substr(windowName.find_first_of('>') + 2, windowName.find_first_of('\n') - windowName.find_first_of('>') - 3); | ||||
|  | ||||
|   event_box_.show(); | ||||
|   label_.set_markup(fmt::format(format, | ||||
|                                 fmt::arg("window", windowName))); | ||||
|  | ||||
|   // Call parent update | ||||
|   ALabel::update(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 vaxerski
					vaxerski