workspace taskbars: Focus window on click
This commit is contained in:
@ -88,6 +88,7 @@ class Workspace {
|
|||||||
Gtk::Label m_labelAfter;
|
Gtk::Label m_labelAfter;
|
||||||
|
|
||||||
void updateTaskbar(const std::string& workspace_icon);
|
void updateTaskbar(const std::string& workspace_icon);
|
||||||
|
static void focusWindow(WindowAddress const& addr);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::hyprland
|
} // namespace waybar::modules::hyprland
|
||||||
|
@ -248,6 +248,18 @@ void Workspace::updateTaskbar(const std::string &workspace_icon) {
|
|||||||
for (const auto &window_repr : m_windowMap) {
|
for (const auto &window_repr : m_windowMap) {
|
||||||
auto window_box = Gtk::make_managed<Gtk::Box>(Gtk::ORIENTATION_HORIZONTAL);
|
auto window_box = Gtk::make_managed<Gtk::Box>(Gtk::ORIENTATION_HORIZONTAL);
|
||||||
window_box->set_tooltip_text(window_repr.window_title);
|
window_box->set_tooltip_text(window_repr.window_title);
|
||||||
|
window_box->get_style_context()->add_class("taskbar-window");
|
||||||
|
auto event_box = Gtk::manage(new Gtk::EventBox());
|
||||||
|
event_box->add(*window_box);
|
||||||
|
event_box->signal_button_press_event().connect(
|
||||||
|
[window_repr](GdkEventButton const *bt) {
|
||||||
|
if (bt->type == GDK_BUTTON_PRESS) {
|
||||||
|
focusWindow(window_repr.address);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
false);
|
||||||
|
|
||||||
auto text_before = fmt::format(fmt::runtime(m_workspaceManager.taskbarFormatBefore()),
|
auto text_before = fmt::format(fmt::runtime(m_workspaceManager.taskbarFormatBefore()),
|
||||||
fmt::arg("title", window_repr.window_title));
|
fmt::arg("title", window_repr.window_title));
|
||||||
@ -271,8 +283,8 @@ void Workspace::updateTaskbar(const std::string &workspace_icon) {
|
|||||||
window_box->pack_start(*window_label_after, true, true);
|
window_box->pack_start(*window_label_after, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_content.pack_start(*window_box, true, false);
|
m_content.pack_start(*event_box, true, false);
|
||||||
window_box->show_all();
|
event_box->show_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto formatAfter = m_workspaceManager.formatAfter();
|
auto formatAfter = m_workspaceManager.formatAfter();
|
||||||
@ -285,4 +297,12 @@ void Workspace::updateTaskbar(const std::string &workspace_icon) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Workspace::focusWindow(WindowAddress const &addr) {
|
||||||
|
try {
|
||||||
|
IPC::getSocket1Reply("dispatch focuswindow address:0x" + addr);
|
||||||
|
} catch (const std::exception &e) {
|
||||||
|
spdlog::error("Failed to dispatch window: {}", e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace waybar::modules::hyprland
|
} // namespace waybar::modules::hyprland
|
||||||
|
Reference in New Issue
Block a user