Workspaces scroll event (#19)
parent
18c7ad0026
commit
cee031d2fa
|
@ -17,11 +17,15 @@ namespace waybar::modules {
|
||||||
private:
|
private:
|
||||||
void _addWorkspace(Json::Value node);
|
void _addWorkspace(Json::Value node);
|
||||||
Json::Value _getWorkspaces(const std::string data);
|
Json::Value _getWorkspaces(const std::string data);
|
||||||
|
bool _handleScroll(GdkEventScroll *e);
|
||||||
|
int _getPrevWorkspace();
|
||||||
|
int _getNextWorkspace();
|
||||||
Bar &_bar;
|
Bar &_bar;
|
||||||
waybar::util::SleeperThread _thread;
|
waybar::util::SleeperThread _thread;
|
||||||
Gtk::Box _box;
|
Gtk::Box _box;
|
||||||
util::JsonParser _parser;
|
util::JsonParser _parser;
|
||||||
std::mutex _mutex;
|
std::mutex _mutex;
|
||||||
|
bool _scrolling;
|
||||||
std::unordered_map<int, Gtk::Button> _buttons;
|
std::unordered_map<int, Gtk::Button> _buttons;
|
||||||
Json::Value _workspaces;
|
Json::Value _workspaces;
|
||||||
int _ipcfd;
|
int _ipcfd;
|
||||||
|
|
|
@ -57,7 +57,8 @@ auto waybar::modules::Battery::update() -> void
|
||||||
_label.get_style_context()->add_class("charging");
|
_label.get_style_context()->add_class("charging");
|
||||||
else
|
else
|
||||||
_label.get_style_context()->remove_class("charging");
|
_label.get_style_context()->remove_class("charging");
|
||||||
if (capacity < 16 && !charging)
|
auto critical = _config["critical"] ? _config["critical"].asUInt() : 15;
|
||||||
|
if (capacity <= critical && !charging)
|
||||||
_label.get_style_context()->add_class("warning");
|
_label.get_style_context()->add_class("warning");
|
||||||
else
|
else
|
||||||
_label.get_style_context()->remove_class("warning");
|
_label.get_style_context()->remove_class("warning");
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "ipc/client.hpp"
|
#include "ipc/client.hpp"
|
||||||
|
|
||||||
waybar::modules::Workspaces::Workspaces(Bar &bar)
|
waybar::modules::Workspaces::Workspaces(Bar &bar)
|
||||||
: _bar(bar)
|
: _bar(bar), _scrolling(false)
|
||||||
{
|
{
|
||||||
_box.get_style_context()->add_class("workspaces");
|
_box.get_style_context()->add_class("workspaces");
|
||||||
std::string socketPath = get_socketpath();
|
std::string socketPath = get_socketpath();
|
||||||
|
@ -58,10 +58,12 @@ auto waybar::modules::Workspaces::update() -> void
|
||||||
button.get_style_context()->add_class("current");
|
button.get_style_context()->add_class("current");
|
||||||
}
|
}
|
||||||
if (needReorder)
|
if (needReorder)
|
||||||
_box.reorder_child(button, node["num"].asInt() - 1);
|
_box.reorder_child(button, node["num"].asInt());
|
||||||
button.show();
|
button.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (_scrolling)
|
||||||
|
_scrolling = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void waybar::modules::Workspaces::_addWorkspace(Json::Value node)
|
void waybar::modules::Workspaces::_addWorkspace(Json::Value node)
|
||||||
|
@ -80,13 +82,82 @@ void waybar::modules::Workspaces::_addWorkspace(Json::Value node)
|
||||||
std::cerr << e.what() << std::endl;
|
std::cerr << e.what() << std::endl;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
_box.reorder_child(button, node["num"].asInt() - 1);
|
button.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
||||||
if (node["focused"].asBool()) {
|
button.signal_scroll_event()
|
||||||
|
.connect(sigc::mem_fun(*this, &Workspaces::_handleScroll));
|
||||||
|
_box.reorder_child(button, node["num"].asInt());
|
||||||
|
if (node["focused"].asBool())
|
||||||
button.get_style_context()->add_class("current");
|
button.get_style_context()->add_class("current");
|
||||||
}
|
|
||||||
button.show();
|
button.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool waybar::modules::Workspaces::_handleScroll(GdkEventScroll *e)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(_mutex);
|
||||||
|
// Avoid concurrent scroll event
|
||||||
|
if (_scrolling)
|
||||||
|
return false;
|
||||||
|
_scrolling = true;
|
||||||
|
int id = -1;
|
||||||
|
uint16_t idx = 0;
|
||||||
|
for (; idx < _workspaces.size(); idx += 1)
|
||||||
|
if (_workspaces[idx]["focused"].asBool()) {
|
||||||
|
id = _workspaces[idx]["num"].asInt();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (id == -1) {
|
||||||
|
_scrolling = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (e->direction == GDK_SCROLL_UP)
|
||||||
|
id = _getNextWorkspace();
|
||||||
|
if (e->direction == GDK_SCROLL_DOWN)
|
||||||
|
id = _getPrevWorkspace();
|
||||||
|
if (e->direction == GDK_SCROLL_SMOOTH) {
|
||||||
|
gdouble delta_x, delta_y;
|
||||||
|
gdk_event_get_scroll_deltas ((const GdkEvent *) e, &delta_x, &delta_y);
|
||||||
|
if (delta_y < 0)
|
||||||
|
id = _getNextWorkspace();
|
||||||
|
else if (delta_y > 0)
|
||||||
|
id = _getPrevWorkspace();
|
||||||
|
}
|
||||||
|
if (id == _workspaces[idx]["num"].asInt()) {
|
||||||
|
_scrolling = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
auto value = fmt::format("workspace \"{}\"", id);
|
||||||
|
uint32_t size = value.size();
|
||||||
|
ipc_single_command(_ipcfd, IPC_COMMAND, value.c_str(), &size);
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(150));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int waybar::modules::Workspaces::_getPrevWorkspace()
|
||||||
|
{
|
||||||
|
int current = -1;
|
||||||
|
for (uint16_t i = 0; i != _workspaces.size(); i += 1)
|
||||||
|
if (_workspaces[i]["focused"].asBool()) {
|
||||||
|
current = _workspaces[i]["num"].asInt();
|
||||||
|
if (i > 0)
|
||||||
|
return _workspaces[i - 1]["num"].asInt();
|
||||||
|
return _workspaces[_workspaces.size() - 1]["num"].asInt();
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
int waybar::modules::Workspaces::_getNextWorkspace()
|
||||||
|
{
|
||||||
|
int current = -1;
|
||||||
|
for (uint16_t i = 0; i != _workspaces.size(); i += 1)
|
||||||
|
if (_workspaces[i]["focused"].asBool()) {
|
||||||
|
current = _workspaces[i]["num"].asInt();
|
||||||
|
if (i + 1U < _workspaces.size())
|
||||||
|
return _workspaces[i + 1]["num"].asInt();
|
||||||
|
return _workspaces[0]["num"].asInt();
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
Json::Value waybar::modules::Workspaces::_getWorkspaces(const std::string data)
|
Json::Value waybar::modules::Workspaces::_getWorkspaces(const std::string data)
|
||||||
{
|
{
|
||||||
Json::Value res;
|
Json::Value res;
|
||||||
|
|
Loading…
Reference in New Issue