mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-11-04 01:32:42 +01:00 
			
		
		
		
	feature: created sway language submodule; added styles & config part for a sway language submodule
This commit is contained in:
		
							
								
								
									
										70
									
								
								src/modules/sway/language.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/modules/sway/language.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
#include "modules/sway/language.hpp"
 | 
			
		||||
#include <spdlog/spdlog.h>
 | 
			
		||||
 | 
			
		||||
namespace waybar::modules::sway {
 | 
			
		||||
 | 
			
		||||
Language::Language(const std::string& id, const Json::Value& config)
 | 
			
		||||
    : ALabel(config, "language", id, "{}", 0, true) {
 | 
			
		||||
  ipc_.subscribe(R"(["input"])");
 | 
			
		||||
  ipc_.signal_event.connect(sigc::mem_fun(*this, &Language::onEvent));
 | 
			
		||||
  ipc_.signal_cmd.connect(sigc::mem_fun(*this, &Language::onCmd));
 | 
			
		||||
  ipc_.sendCmd(IPC_GET_INPUTS);
 | 
			
		||||
  // Launch worker
 | 
			
		||||
  ipc_.setWorker([this] {
 | 
			
		||||
    try {
 | 
			
		||||
      ipc_.handleEvent();
 | 
			
		||||
    } catch (const std::exception& e) {
 | 
			
		||||
      spdlog::error("Language: {}", e.what());
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  dp.emit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Language::onCmd(const struct Ipc::ipc_response& res) {
 | 
			
		||||
  try {
 | 
			
		||||
    auto payload = parser_.parse(res.payload);
 | 
			
		||||
    //Display current layout of a device with a maximum count of layouts, expecting that all will be OK
 | 
			
		||||
    Json::Value::ArrayIndex maxId = 0, max = 0;
 | 
			
		||||
    for(Json::Value::ArrayIndex i = 0; i < payload.size(); i++) {
 | 
			
		||||
      if(payload[i]["xkb_layout_names"].size() > max) {
 | 
			
		||||
        max = payload[i]["xkb_layout_names"].size();
 | 
			
		||||
        maxId = i;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    auto layout_name = payload[maxId]["xkb_active_layout_name"].asString().substr(0,2);
 | 
			
		||||
    lang_ = Glib::Markup::escape_text(layout_name);
 | 
			
		||||
    dp.emit();
 | 
			
		||||
  } catch (const std::exception& e) {
 | 
			
		||||
    spdlog::error("Language: {}", e.what());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Language::onEvent(const struct Ipc::ipc_response& res) {
 | 
			
		||||
  try {
 | 
			
		||||
    std::lock_guard<std::mutex> lock(mutex_);
 | 
			
		||||
    auto payload = parser_.parse(res.payload)["input"];
 | 
			
		||||
    if (payload["type"].asString() == "keyboard") {
 | 
			
		||||
        auto layout_name = payload["xkb_active_layout_name"].asString().substr(0,2);
 | 
			
		||||
        lang_ = Glib::Markup::escape_text(layout_name);
 | 
			
		||||
    }
 | 
			
		||||
    dp.emit();
 | 
			
		||||
  } catch (const std::exception& e) {
 | 
			
		||||
    spdlog::error("Language: {}", e.what());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
auto Language::update() -> void {
 | 
			
		||||
  if (lang_.empty()) {
 | 
			
		||||
    event_box_.hide();
 | 
			
		||||
  } else {
 | 
			
		||||
    label_.set_markup(fmt::format(format_, lang_));
 | 
			
		||||
    if (tooltipEnabled()) {
 | 
			
		||||
      label_.set_tooltip_text(lang_);
 | 
			
		||||
    }
 | 
			
		||||
    event_box_.show();
 | 
			
		||||
  }
 | 
			
		||||
  // Call parent update
 | 
			
		||||
  ALabel::update();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace waybar::modules::sway
 | 
			
		||||
		Reference in New Issue
	
	Block a user