♻️ move GMenu to ALabel class
This commit is contained in:
parent
884b909e7d
commit
3b87b83076
|
@ -27,6 +27,10 @@ class ALabel : public AModule {
|
||||||
|
|
||||||
bool handleToggle(GdkEventButton *const &e) override;
|
bool handleToggle(GdkEventButton *const &e) override;
|
||||||
virtual std::string getState(uint8_t value, bool lesser = false);
|
virtual std::string getState(uint8_t value, bool lesser = false);
|
||||||
|
|
||||||
|
std::map<std::string, GtkMenuItem*> submenus_;
|
||||||
|
std::map<std::string, std::string> menuActionsMap_;
|
||||||
|
static void handleGtkMenuEvent(GtkMenuItem* menuitem, gpointer data);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
|
|
@ -45,6 +45,7 @@ class AModule : public IModule {
|
||||||
virtual bool handleMouseLeave(GdkEventCrossing *const &ev);
|
virtual bool handleMouseLeave(GdkEventCrossing *const &ev);
|
||||||
virtual bool handleScroll(GdkEventScroll *);
|
virtual bool handleScroll(GdkEventScroll *);
|
||||||
virtual bool handleRelease(GdkEventButton *const &ev);
|
virtual bool handleRelease(GdkEventButton *const &ev);
|
||||||
|
GObject* menu_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool handleUserEvent(GdkEventButton *const &ev);
|
bool handleUserEvent(GdkEventButton *const &ev);
|
||||||
|
@ -53,10 +54,6 @@ class AModule : public IModule {
|
||||||
std::vector<int> pid_;
|
std::vector<int> pid_;
|
||||||
gdouble distance_scrolled_y_;
|
gdouble distance_scrolled_y_;
|
||||||
gdouble distance_scrolled_x_;
|
gdouble distance_scrolled_x_;
|
||||||
GObject* menu_;
|
|
||||||
std::map<std::string, GtkMenuItem*> submenus_;
|
|
||||||
std::map<std::string, std::string> menuActionsMap_;
|
|
||||||
static void handleGtkMenuEvent(GtkMenuItem* menuitem, gpointer data);
|
|
||||||
std::map<std::string, std::string> eventActionMap_;
|
std::map<std::string, std::string> eventActionMap_;
|
||||||
static const inline std::map<std::pair<uint, GdkEventType>, std::string> eventMap_{
|
static const inline std::map<std::pair<uint, GdkEventType>, std::string> eventMap_{
|
||||||
{std::make_pair(1, GdkEventType::GDK_BUTTON_PRESS), "on-click"},
|
{std::make_pair(1, GdkEventType::GDK_BUTTON_PRESS), "on-click"},
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace waybar {
|
||||||
ALabel::ALabel(const Json::Value& config, const std::string& name, const std::string& id,
|
ALabel::ALabel(const Json::Value& config, const std::string& name, const std::string& id,
|
||||||
const std::string& format, uint16_t interval, bool ellipsize, bool enable_click,
|
const std::string& format, uint16_t interval, bool ellipsize, bool enable_click,
|
||||||
bool enable_scroll)
|
bool enable_scroll)
|
||||||
: AModule(config, name, id, config["format-alt"].isString() || enable_click, enable_scroll),
|
: AModule(config, name, id, config["format-alt"].isString() || config["menu"].isString() || enable_click, enable_scroll),
|
||||||
format_(config_["format"].isString() ? config_["format"].asString() : format),
|
format_(config_["format"].isString() ? config_["format"].asString() : format),
|
||||||
interval_(config_["interval"] == "once"
|
interval_(config_["interval"] == "once"
|
||||||
? std::chrono::seconds::max()
|
? std::chrono::seconds::max()
|
||||||
|
@ -51,6 +51,22 @@ ALabel::ALabel(const Json::Value& config, const std::string& name, const std::st
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If a GTKMenu is requested in the config
|
||||||
|
if (config_["menu"].isString()) {
|
||||||
|
// Create the GTKMenu widget
|
||||||
|
GtkBuilder* builder = gtk_builder_new_from_file(config_["menu-file"].asString().c_str());
|
||||||
|
menu_ = gtk_builder_get_object(builder, "menu");
|
||||||
|
submenus_ = std::map<std::string, GtkMenuItem*>();
|
||||||
|
menuActionsMap_ = std::map<std::string, std::string>();
|
||||||
|
// Linking actions to the GTKMenu based on
|
||||||
|
for (Json::Value::const_iterator it = config_["menu-actions"].begin(); it != config_["menu-actions"].end(); ++it) {
|
||||||
|
std::string key = it.key().asString();
|
||||||
|
submenus_[key] = GTK_MENU_ITEM(gtk_builder_get_object(builder, key.c_str()));
|
||||||
|
menuActionsMap_[key] = it->asString();
|
||||||
|
g_signal_connect(submenus_[key], "activate", G_CALLBACK(handleGtkMenuEvent), (gpointer) menuActionsMap_[key].c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (config_["justify"].isString()) {
|
if (config_["justify"].isString()) {
|
||||||
auto justify_str = config_["justify"].asString();
|
auto justify_str = config_["justify"].asString();
|
||||||
if (justify_str == "left") {
|
if (justify_str == "left") {
|
||||||
|
@ -125,6 +141,10 @@ bool waybar::ALabel::handleToggle(GdkEventButton* const& e) {
|
||||||
return AModule::handleToggle(e);
|
return AModule::handleToggle(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ALabel::handleGtkMenuEvent(GtkMenuItem* menuitem, gpointer data) {
|
||||||
|
waybar::util::command::res res = waybar::util::command::exec((char*) data, "GtkMenu");
|
||||||
|
}
|
||||||
|
|
||||||
std::string ALabel::getState(uint8_t value, bool lesser) {
|
std::string ALabel::getState(uint8_t value, bool lesser) {
|
||||||
if (!config_["states"].isObject()) {
|
if (!config_["states"].isObject()) {
|
||||||
return "";
|
return "";
|
||||||
|
|
|
@ -27,24 +27,6 @@ AModule::AModule(const Json::Value& config, const std::string& name, const std::
|
||||||
else
|
else
|
||||||
spdlog::warn("Wrong actions section configuration. See config by index: {}", it.index());
|
spdlog::warn("Wrong actions section configuration. See config by index: {}", it.index());
|
||||||
}
|
}
|
||||||
// If a GTKMenu is requested in the config
|
|
||||||
if (config_["menu"].isString()) {
|
|
||||||
// Create the GTKMenu widget
|
|
||||||
GtkBuilder* builder = gtk_builder_new_from_file(config_["menu-file"].asString().c_str());
|
|
||||||
menu_ = gtk_builder_get_object(builder, "menu");
|
|
||||||
submenus_ = std::map<std::string, GtkMenuItem*>();
|
|
||||||
menuActionsMap_ = std::map<std::string, std::string>();
|
|
||||||
// Linking actions to the GTKMenu based on
|
|
||||||
for (Json::Value::const_iterator it = config_["menu-actions"].begin(); it != config_["menu-actions"].end(); ++it) {
|
|
||||||
std::string key = it.key().asString();
|
|
||||||
submenus_[key] = GTK_MENU_ITEM(gtk_builder_get_object(builder, key.c_str()));
|
|
||||||
menuActionsMap_[key] = it->asString();
|
|
||||||
g_signal_connect(submenus_[key], "activate", G_CALLBACK(handleGtkMenuEvent), (gpointer) menuActionsMap_[key].c_str());
|
|
||||||
|
|
||||||
}
|
|
||||||
// Enable click
|
|
||||||
enable_click = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
event_box_.signal_enter_notify_event().connect(sigc::mem_fun(*this, &AModule::handleMouseEnter));
|
event_box_.signal_enter_notify_event().connect(sigc::mem_fun(*this, &AModule::handleMouseEnter));
|
||||||
event_box_.signal_leave_notify_event().connect(sigc::mem_fun(*this, &AModule::handleMouseLeave));
|
event_box_.signal_leave_notify_event().connect(sigc::mem_fun(*this, &AModule::handleMouseLeave));
|
||||||
|
@ -84,10 +66,6 @@ AModule::AModule(const Json::Value& config, const std::string& name, const std::
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AModule::handleGtkMenuEvent(GtkMenuItem* menuitem, gpointer data) {
|
|
||||||
waybar::util::command::res res = waybar::util::command::exec((char*) data, "TLP");
|
|
||||||
}
|
|
||||||
|
|
||||||
AModule::~AModule() {
|
AModule::~AModule() {
|
||||||
for (const auto& pid : pid_) {
|
for (const auto& pid : pid_) {
|
||||||
if (pid != -1) {
|
if (pid != -1) {
|
||||||
|
|
Loading…
Reference in New Issue