diff --git a/README.md b/README.md index 79b5e9fc..4d3b37c8 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ $ ./build/waybar ``` Contributions welcome! - have fun :) +The style guidelines is [Google's](https://google.github.io/styleguide/cppguide.html) ## License diff --git a/include/IModule.hpp b/include/IModule.hpp index 856af147..d21c44c2 100644 --- a/include/IModule.hpp +++ b/include/IModule.hpp @@ -3,10 +3,12 @@ #include namespace waybar { - class IModule { - public: - virtual ~IModule() {} - virtual auto update() -> void = 0; - virtual operator Gtk::Widget &() = 0; - }; + +class IModule { + public: + virtual ~IModule() {} + virtual auto update() -> void = 0; + virtual operator Gtk::Widget &() = 0; +}; + } diff --git a/include/bar.hpp b/include/bar.hpp index c5d0845e..e4b2179b 100644 --- a/include/bar.hpp +++ b/include/bar.hpp @@ -7,44 +7,47 @@ namespace waybar { - struct Client; +class Client; - struct Bar { - Bar(Client& client, std::unique_ptr&& output); +class Bar { + public: + Bar(Client&, std::unique_ptr&&); Bar(const Bar&) = delete; + + auto setWidth(uint32_t) -> void; + auto toggle() -> void; + Client& client; Gtk::Window window; struct wl_surface *surface; - struct zwlr_layer_surface_v1 *layerSurface; + struct zwlr_layer_surface_v1 *layer_surface; std::unique_ptr output; - bool visible = true; std::string outputName; - auto setWidth(uint32_t) -> void; - auto toggle() -> void; + bool visible = true; private: - static void _handleLogicalPosition(void *data, - struct zxdg_output_v1 *zxdg_output_v1, int32_t x, int32_t y); - static void _handleLogicalSize(void *data, - struct zxdg_output_v1 *zxdg_output_v1, int32_t width, int32_t height); - static void _handleDone(void *data, struct zxdg_output_v1 *zxdg_output_v1); - static void _handleName(void *data, struct zxdg_output_v1 *xdg_output, - const char *name); - static void _handleDescription(void *data, - struct zxdg_output_v1 *zxdg_output_v1, const char *description); - static void _layerSurfaceHandleConfigure(void *data, - struct zwlr_layer_surface_v1 *surface, uint32_t serial, uint32_t width, - uint32_t height); - static void _layerSurfaceHandleClosed(void *data, - struct zwlr_layer_surface_v1 *surface); - auto _setupConfig() -> void; - auto _setupWidgets() -> void; - auto _setupCss() -> void; - uint32_t _width = 0; - uint32_t _height = 30; - Json::Value _config; - Glib::RefPtr _styleContext; - Glib::RefPtr _cssProvider; - struct zxdg_output_v1 *_xdgOutput; - }; + static void handleLogicalPosition(void *, struct zxdg_output_v1 *, int32_t, + int32_t); + static void handleLogicalSize(void *, struct zxdg_output_v1 *, int32_t, + int32_t); + static void handleDone(void *, struct zxdg_output_v1 *); + static void handleName(void *, struct zxdg_output_v1 *, const char *); + static void handleDescription(void *, struct zxdg_output_v1 *, + const char *); + static void layerSurfaceHandleConfigure(void *, + struct zwlr_layer_surface_v1 *, uint32_t, uint32_t, uint32_t); + static void layerSurfaceHandleClosed(void *, + struct zwlr_layer_surface_v1 *); + + auto setupConfig() -> void; + auto setupWidgets() -> void; + auto setupCss() -> void; + + uint32_t width_ = 0; + uint32_t height_ = 30; + Json::Value config_; + Glib::RefPtr style_context_; + Glib::RefPtr css_provider_; + struct zxdg_output_v1 *xdg_output_; +}; } diff --git a/include/client.hpp b/include/client.hpp index 67a02ab2..8db4c687 100644 --- a/include/client.hpp +++ b/include/client.hpp @@ -14,28 +14,30 @@ namespace waybar { - struct Client { - std::string cssFile; - std::string configFile; +class Client { + public: + Client(int argc, char *argv[]); + int main(int argc, char *argv[]); Gtk::Main gtk_main; - + std::string css_file; + std::string config_file; Glib::RefPtr gdk_display; - struct wl_display *wlDisplay = nullptr; + struct wl_display *wl_display = nullptr; struct wl_registry *registry = nullptr; - struct zwlr_layer_shell_v1 *layerShell = nullptr; - struct zxdg_output_manager_v1 *xdgOutputManager = nullptr; + struct zwlr_layer_shell_v1 *layer_shell = nullptr; + struct zxdg_output_manager_v1 *xdg_output_manager = nullptr; struct wl_seat *seat = nullptr; std::vector> bars; - Client(int argc, char* argv[]); - void bind_interfaces(); - auto setup_css(); - int main(int argc, char* argv[]); - private: - static void _handle_global(void *data, struct wl_registry *registry, - uint32_t name, const char *interface, uint32_t version); - static void _handle_global_remove(void *data, - struct wl_registry *registry, uint32_t name); - }; +private: + void bindInterfaces(); + auto setupCss(); + + static void handleGlobal(void *data, struct wl_registry *registry, + uint32_t name, const char *interface, uint32_t version); + static void handleGlobalRemove(void *data, + struct wl_registry *registry, uint32_t name); +}; + } diff --git a/include/factory.hpp b/include/factory.hpp index 971f14df..07f83d3d 100644 --- a/include/factory.hpp +++ b/include/factory.hpp @@ -13,13 +13,13 @@ namespace waybar { - class Factory { - public: - Factory(Bar &bar, Json::Value config); - IModule *makeModule(std::string name); - private: - Bar &_bar; - Json::Value _config; - }; +class Factory { + public: + Factory(Bar &bar, Json::Value config); + IModule *makeModule(const std::string &name); + private: + Bar &_bar; + Json::Value _config; +}; } diff --git a/include/modules/battery.hpp b/include/modules/battery.hpp index 375c10e9..82638476 100644 --- a/include/modules/battery.hpp +++ b/include/modules/battery.hpp @@ -12,20 +12,22 @@ namespace waybar::modules { - namespace fs = std::filesystem; +namespace fs = std::filesystem; - class Battery : public IModule { - public: - Battery(Json::Value config); - auto update() -> void; - operator Gtk::Widget&(); - private: - std::string _getIcon(uint16_t percentage); - static inline const fs::path _data_dir = "/sys/class/power_supply/"; - std::vector _batteries; - util::SleeperThread _thread; - Gtk::Label _label; - Json::Value _config; - }; +class Battery : public IModule { + public: + Battery(Json::Value); + auto update() -> void; + operator Gtk::Widget&(); + private: + std::string getIcon(uint16_t percentage); + + static inline const fs::path data_dir_ = "/sys/class/power_supply/"; + + Gtk::Label label_; + Json::Value config_; + util::SleeperThread thread_; + std::vector batteries_; +}; } diff --git a/include/modules/clock.hpp b/include/modules/clock.hpp index 2b2e01ba..ae332741 100644 --- a/include/modules/clock.hpp +++ b/include/modules/clock.hpp @@ -8,15 +8,15 @@ namespace waybar::modules { - class Clock : public IModule { - public: - Clock(Json::Value config); - auto update() -> void; - operator Gtk::Widget &(); - private: - Gtk::Label _label; - waybar::util::SleeperThread _thread; - Json::Value _config; - }; +class Clock : public IModule { + public: + Clock(Json::Value); + auto update() -> void; + operator Gtk::Widget &(); + private: + Gtk::Label label_; + waybar::util::SleeperThread thread_; + Json::Value config_; +}; } diff --git a/include/modules/cpu.hpp b/include/modules/cpu.hpp index b6c9248c..52f455f0 100644 --- a/include/modules/cpu.hpp +++ b/include/modules/cpu.hpp @@ -8,15 +8,15 @@ namespace waybar::modules { - class Cpu : public IModule { - public: - Cpu(Json::Value config); - auto update() -> void; - operator Gtk::Widget &(); - private: - Gtk::Label _label; - waybar::util::SleeperThread _thread; - Json::Value _config; - }; +class Cpu : public IModule { + public: + Cpu(Json::Value); + auto update() -> void; + operator Gtk::Widget &(); + private: + Gtk::Label label_; + waybar::util::SleeperThread thread_; + Json::Value config_; +}; } diff --git a/include/modules/custom.hpp b/include/modules/custom.hpp index 7140d96c..031d51ca 100644 --- a/include/modules/custom.hpp +++ b/include/modules/custom.hpp @@ -7,16 +7,16 @@ namespace waybar::modules { - class Custom : public IModule { - public: - Custom(std::string name, Json::Value config); - auto update() -> void; - operator Gtk::Widget &(); - private: - Gtk::Label _label; - waybar::util::SleeperThread _thread; - const std::string _name; - Json::Value _config; - }; +class Custom : public IModule { + public: + Custom(const std::string&, Json::Value); + auto update() -> void; + operator Gtk::Widget &(); + private: + const std::string name_; + Gtk::Label label_; + waybar::util::SleeperThread thread_; + Json::Value config_; +}; } diff --git a/include/modules/memory.hpp b/include/modules/memory.hpp index 6fc46375..fbe147b3 100644 --- a/include/modules/memory.hpp +++ b/include/modules/memory.hpp @@ -8,15 +8,15 @@ namespace waybar::modules { - class Memory : public IModule { - public: - Memory(Json::Value config); - auto update() -> void; - operator Gtk::Widget &(); - private: - Gtk::Label _label; - waybar::util::SleeperThread _thread; - Json::Value _config; - }; +class Memory : public IModule { + public: + Memory(Json::Value); + auto update() -> void; + operator Gtk::Widget &(); + private: + Gtk::Label label_; + waybar::util::SleeperThread thread_; + Json::Value config_; +}; } diff --git a/include/modules/network.hpp b/include/modules/network.hpp index 2b4c3b9e..f30e88ba 100644 --- a/include/modules/network.hpp +++ b/include/modules/network.hpp @@ -12,24 +12,26 @@ namespace waybar::modules { - class Network : public IModule { - public: - Network(Json::Value config); - auto update() -> void; - operator Gtk::Widget &(); - private: - void _parseEssid(struct nlattr **bss); - void _parseSignal(struct nlattr **bss); - bool _associatedOrJoined(struct nlattr **bss); - static int _scanCb(struct nl_msg *msg, void *data); - auto _getInfo() -> void; - Gtk::Label _label; - waybar::util::SleeperThread _thread; - Json::Value _config; - std::size_t _ifid; - std::string _essid; - int _signalStrengthdBm; - int _signalStrength; - }; +class Network : public IModule { + public: + Network(Json::Value); + auto update() -> void; + operator Gtk::Widget &(); + private: + static int scanCb(struct nl_msg*, void*); + + void parseEssid(struct nlattr**); + void parseSignal(struct nlattr**); + bool associatedOrJoined(struct nlattr**); + auto getInfo() -> void; + + Gtk::Label label_; + waybar::util::SleeperThread thread_; + Json::Value config_; + std::size_t ifid_; + std::string essid_; + int signal_strength_dbm_; + uint16_t signal_strength_; +}; } diff --git a/include/modules/pulseaudio.hpp b/include/modules/pulseaudio.hpp index 20ac7133..5f813a16 100644 --- a/include/modules/pulseaudio.hpp +++ b/include/modules/pulseaudio.hpp @@ -8,29 +8,29 @@ namespace waybar::modules { - class Pulseaudio : public IModule { - public: - Pulseaudio(Json::Value config); - auto update() -> void; - operator Gtk::Widget &(); - private: - std::string _getIcon(uint16_t percentage); - static void _subscribeCb(pa_context *context, - pa_subscription_event_type_t type, uint32_t idx, void *data); - static void _contextStateCb(pa_context *c, void *data); - static void _sinkInfoCb(pa_context *context, const pa_sink_info *i, - int eol, void *data); - static void _serverInfoCb(pa_context *context, const pa_server_info *i, - void *data); - Gtk::Label _label; - Json::Value _config; - pa_threaded_mainloop *_mainloop; - pa_mainloop_api *_mainloop_api; - pa_context *_context; - uint32_t _sinkIdx{0}; - int _volume; - bool _muted; - std::string _desc; - }; +class Pulseaudio : public IModule { + public: + Pulseaudio(Json::Value); + auto update() -> void; + operator Gtk::Widget &(); + private: + static void subscribeCb(pa_context*, pa_subscription_event_type_t, + uint32_t, void*); + static void contextStateCb(pa_context*, void*); + static void sinkInfoCb(pa_context*, const pa_sink_info*, int, void*); + static void serverInfoCb(pa_context*, const pa_server_info*, void*); + + std::string getIcon(uint16_t); + + Gtk::Label label_; + Json::Value config_; + pa_threaded_mainloop* mainloop_; + pa_mainloop_api* mainloop_api_; + pa_context* context_; + uint32_t sink_idx_{0}; + uint16_t volume_; + bool muted_; + std::string desc_; +}; } diff --git a/include/modules/sway/ipc/client.hpp b/include/modules/sway/ipc/client.hpp index c6ac230f..257a6946 100644 --- a/include/modules/sway/ipc/client.hpp +++ b/include/modules/sway/ipc/client.hpp @@ -16,17 +16,17 @@ struct ipc_response { /** * Gets the path to the IPC socket from sway. */ -std::string get_socketpath(void); +std::string getSocketPath(void); /** * Opens the sway socket. */ -int ipc_open_socket(std::string socket_path); +int ipcOpenSocket(const std::string &socketPath); /** * Issues a single IPC command and returns the buffer. len will be updated with * the length of the buffer returned from sway. */ -std::string ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len); +std::string ipcSingleCommand(int socketfd, uint32_t type, const char *payload, uint32_t *len); /** * Receives a single IPC response and returns an ipc_response. */ -struct ipc_response ipc_recv_response(int socketfd); +struct ipc_response ipcRecvResponse(int socketfd); diff --git a/include/modules/sway/window.hpp b/include/modules/sway/window.hpp index a4892002..eaf247bf 100644 --- a/include/modules/sway/window.hpp +++ b/include/modules/sway/window.hpp @@ -9,22 +9,23 @@ namespace waybar::modules::sway { - class Window : public IModule { - public: - Window(waybar::Bar &bar, Json::Value config); - auto update() -> void; - operator Gtk::Widget &(); - private: - std::string _getFocusedNode(Json::Value nodes); - void _getFocusedWindow(); - Bar &_bar; - Json::Value _config; - waybar::util::SleeperThread _thread; - Gtk::Label _label; - util::JsonParser _parser; - int _ipcfd; - int _ipcEventfd; - std::string _window; - }; +class Window : public IModule { + public: + Window(waybar::Bar&, Json::Value); + auto update() -> void; + operator Gtk::Widget &(); + private: + std::string getFocusedNode(Json::Value nodes); + void getFocusedWindow(); + + Bar& bar_; + Json::Value config_; + waybar::util::SleeperThread thread_; + Gtk::Label label_; + util::JsonParser parser_; + int ipcfd_; + int ipc_eventfd_; + std::string window_; +}; } diff --git a/include/modules/sway/workspaces.hpp b/include/modules/sway/workspaces.hpp index 33d3fadb..1fe33585 100644 --- a/include/modules/sway/workspaces.hpp +++ b/include/modules/sway/workspaces.hpp @@ -9,28 +9,29 @@ namespace waybar::modules::sway { - class Workspaces : public IModule { - public: - Workspaces(waybar::Bar &bar, Json::Value config); - auto update() -> void; - operator Gtk::Widget &(); - private: - void _addWorkspace(Json::Value node); - std::string _getIcon(std::string name); - bool _handleScroll(GdkEventScroll *e); - int _getPrevWorkspace(); - int _getNextWorkspace(); - Bar &_bar; - Json::Value _config; - waybar::util::SleeperThread _thread; - Gtk::Box _box; - util::JsonParser _parser; - std::mutex _mutex; - bool _scrolling; - std::unordered_map _buttons; - Json::Value _workspaces; - int _ipcfd; - int _ipcEventfd; - }; +class Workspaces : public IModule { + public: + Workspaces(waybar::Bar&, Json::Value); + auto update() -> void; + operator Gtk::Widget &(); + private: + void addWorkspace(Json::Value); + std::string getIcon(std::string); + bool handleScroll(GdkEventScroll*); + int getPrevWorkspace(); + int getNextWorkspace(); + + Bar& bar_; + Json::Value config_; + waybar::util::SleeperThread thread_; + Gtk::Box box_; + util::JsonParser parser_; + std::mutex mutex_; + bool scrolling_; + std::unordered_map buttons_; + Json::Value workspaces_; + int ipcfd_; + int ipc_eventfd_; +}; } diff --git a/meson.build b/meson.build index cf9024de..e452f51b 100644 --- a/meson.build +++ b/meson.build @@ -37,9 +37,11 @@ libpulse = dependency('libpulse') subdir('protocol') +src_files = run_command('find', './src', '-name', '*.cpp').stdout().strip().split('\n') + executable( 'waybar', - run_command('find', './src', '-name', '*.cpp').stdout().strip().split('\n'), + src_files, dependencies: [ thread_dep, wlroots, @@ -64,3 +66,15 @@ install_data( './resources/style.css', install_dir: '/etc/xdg/waybar', ) + +clangtidy = find_program('clang-tidy', required: false) + +if clangtidy.found() + run_target( + 'tidy', + command: [ + clangtidy, + '-checks=*,-fuchsia-default-arguments', + '-p', meson.build_root() + ] + src_files) +endif diff --git a/resources/config b/resources/config index 7fab92c1..cadaf897 100644 --- a/resources/config +++ b/resources/config @@ -10,13 +10,13 @@ // Modules configuration "sway/workspaces": { // "all-outputs": true, - "format-icons": { - "1": "", - "2": "", - "3": "", - "4": "", - "5": "" - } + // "format-icons": { + // "1": "", + // "2": "", + // "3": "", + // "4": "", + // "5": "" + // } }, "cpu": { "format": "{}% " diff --git a/src/bar.cpp b/src/bar.cpp index af18d8fe..578b43ea 100644 --- a/src/bar.cpp +++ b/src/bar.cpp @@ -8,98 +8,101 @@ waybar::Bar::Bar(Client &client, std::unique_ptr &&p_output) output(std::move(p_output)) { static const struct zxdg_output_v1_listener xdgOutputListener = { - .logical_position = _handleLogicalPosition, - .logical_size = _handleLogicalSize, - .done = _handleDone, - .name = _handleName, - .description = _handleDescription, + .logical_position = handleLogicalPosition, + .logical_size = handleLogicalSize, + .done = handleDone, + .name = handleName, + .description = handleDescription, }; - _xdgOutput = - zxdg_output_manager_v1_get_xdg_output(client.xdgOutputManager, *output); - zxdg_output_v1_add_listener(_xdgOutput, &xdgOutputListener, this); + xdg_output_ = + zxdg_output_manager_v1_get_xdg_output(client.xdg_output_manager, *output); + zxdg_output_v1_add_listener(xdg_output_, &xdgOutputListener, this); window.set_title("waybar"); window.set_decorated(false); - _setupConfig(); - _setupCss(); - _setupWidgets(); - if (_config["height"]) - _height = _config["height"].asUInt(); - bool positionBottom = _config["position"] == "bottom"; - bool layerTop = _config["layer"] == "top"; - gtk_widget_realize(GTK_WIDGET(window.gobj())); - GdkWindow *gdkWindow = gtk_widget_get_window(GTK_WIDGET(window.gobj())); - gdk_wayland_window_set_use_custom_surface(gdkWindow); - surface = gdk_wayland_window_get_wl_surface(gdkWindow); - layerSurface = zwlr_layer_shell_v1_get_layer_surface( - client.layerShell, surface, *output, - (layerTop ? ZWLR_LAYER_SHELL_V1_LAYER_TOP : ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM), - "waybar"); - zwlr_layer_surface_v1_set_anchor(layerSurface, - ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT | - (positionBottom ? ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM : ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)); - zwlr_layer_surface_v1_set_size(layerSurface, _width, _height); - static const struct zwlr_layer_surface_v1_listener layerSurfaceListener = { - .configure = _layerSurfaceHandleConfigure, - .closed = _layerSurfaceHandleClosed, + setupConfig(); + setupCss(); + setupWidgets(); + if (config_["height"]) { + height_ = config_["height"].asUInt(); + } + Gtk::Widget& wrap(window); + gtk_widget_realize(wrap.gobj()); + GdkWindow *gdk_window = gtk_widget_get_window(wrap.gobj()); + gdk_wayland_window_set_use_custom_surface(gdk_window); + surface = gdk_wayland_window_get_wl_surface(gdk_window); + std::size_t layer_top = config_["layer"] == "top" + ? ZWLR_LAYER_SHELL_V1_LAYER_TOP : ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM; + layer_surface = zwlr_layer_shell_v1_get_layer_surface( + client.layer_shell, surface, *output, layer_top, "waybar"); + std::size_t position_bottom = config_["position"] == "bottom" + ? ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM : ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP; + zwlr_layer_surface_v1_set_anchor(layer_surface, position_bottom + | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT); + zwlr_layer_surface_v1_set_size(layer_surface, width_, height_); + static const struct zwlr_layer_surface_v1_listener layer_surface_listener = { + .configure = layerSurfaceHandleConfigure, + .closed = layerSurfaceHandleClosed, }; - zwlr_layer_surface_v1_add_listener(layerSurface, &layerSurfaceListener, - this); + zwlr_layer_surface_v1_add_listener(layer_surface, + &layer_surface_listener, this); wl_surface_commit(surface); } -void waybar::Bar::_handleLogicalPosition(void *data, - struct zxdg_output_v1 *zxdg_output_v1, int32_t x, int32_t y) +void waybar::Bar::handleLogicalPosition(void* /*data*/, + struct zxdg_output_v1* /*zxdg_output_v1*/, int32_t /*x*/, int32_t /*y*/) { // Nothing here } -void waybar::Bar::_handleLogicalSize(void *data, - struct zxdg_output_v1 *zxdg_output_v1, int32_t width, int32_t height) +void waybar::Bar::handleLogicalSize(void* /*data*/, + struct zxdg_output_v1* /*zxdg_output_v1*/, int32_t /*width*/, + int32_t /*height*/) { // Nothing here } -void waybar::Bar::_handleDone(void *data, struct zxdg_output_v1 *zxdg_output_v1) +void waybar::Bar::handleDone(void* /*data*/, + struct zxdg_output_v1* /*zxdg_output_v1*/) { // Nothing here } -void waybar::Bar::_handleName(void *data, struct zxdg_output_v1 *xdg_output, - const char *name) +void waybar::Bar::handleName(void* data, struct zxdg_output_v1* /*xdg_output*/, + const char* name) { - auto o = reinterpret_cast(data); + auto o = static_cast(data); o->outputName = name; } -void waybar::Bar::_handleDescription(void *data, - struct zxdg_output_v1 *zxdg_output_v1, const char *description) +void waybar::Bar::handleDescription(void* /*data*/, + struct zxdg_output_v1* /*zxdg_output_v1*/, const char* /*description*/) { // Nothing here } -void waybar::Bar::_layerSurfaceHandleConfigure( - void *data, struct zwlr_layer_surface_v1 *surface, uint32_t serial, - uint32_t width, uint32_t height) +void waybar::Bar::layerSurfaceHandleConfigure(void* data, + struct zwlr_layer_surface_v1* surface, uint32_t serial, uint32_t width, + uint32_t height) { - auto o = reinterpret_cast(data); + auto o = static_cast(data); o->window.show_all(); - o->setWidth(o->_config["width"] ? o->_config["width"].asUInt() : width); + o->setWidth(o->config_["width"] ? o->config_["width"].asUInt() : width); zwlr_layer_surface_v1_ack_configure(surface, serial); - if (o->_height != height) { - height = o->_height; + if (o->height_ != height) { + height = o->height_; std::cout << fmt::format("New Height: {}", height) << std::endl; - zwlr_layer_surface_v1_set_size(surface, o->_width, height); + zwlr_layer_surface_v1_set_size(surface, o->width_, height); zwlr_layer_surface_v1_set_exclusive_zone(surface, o->visible ? height : 0); wl_surface_commit(o->surface); } } -void waybar::Bar::_layerSurfaceHandleClosed(void *data, - struct zwlr_layer_surface_v1 *surface) +void waybar::Bar::layerSurfaceHandleClosed(void* data, + struct zwlr_layer_surface_v1* /*surface*/) { - auto o = reinterpret_cast(data); - zwlr_layer_surface_v1_destroy(o->layerSurface); - o->layerSurface = nullptr; + auto o = static_cast(data); + zwlr_layer_surface_v1_destroy(o->layer_surface); + o->layer_surface = nullptr; wl_surface_destroy(o->surface); o->surface = nullptr; o->window.close(); @@ -107,48 +110,51 @@ void waybar::Bar::_layerSurfaceHandleClosed(void *data, auto waybar::Bar::setWidth(uint32_t width) -> void { - if (width == this->_width) return; + if (width == width_) { + return; + } std::cout << fmt::format("Bar width configured: {}", width) << std::endl; - this->_width = width; + width_ = width; window.set_size_request(width); - window.resize(width, _height); - zwlr_layer_surface_v1_set_size(layerSurface, width, _height + 1); + window.resize(width, height_); + zwlr_layer_surface_v1_set_size(layer_surface, width, height_ + 1); wl_surface_commit(surface); } auto waybar::Bar::toggle() -> void { visible = !visible; - auto zone = visible ? _height : 0; - zwlr_layer_surface_v1_set_exclusive_zone(layerSurface, zone); + auto zone = visible ? height_ : 0; + zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, zone); wl_surface_commit(surface); } -auto waybar::Bar::_setupConfig() -> void +auto waybar::Bar::setupConfig() -> void { util::JsonParser parser; - std::ifstream file(client.configFile); - if (!file.is_open()) + std::ifstream file(client.config_file); + if (!file.is_open()) { throw std::runtime_error("Can't open config file"); + } std::string str((std::istreambuf_iterator(file)), std::istreambuf_iterator()); - _config = parser.parse(str); + config_ = parser.parse(str); } -auto waybar::Bar::_setupCss() -> void +auto waybar::Bar::setupCss() -> void { - _cssProvider = Gtk::CssProvider::create(); - _styleContext = Gtk::StyleContext::create(); + css_provider_ = Gtk::CssProvider::create(); + style_context_ = Gtk::StyleContext::create(); // load our css file, wherever that may be hiding - if (_cssProvider->load_from_path(client.cssFile)) { + if (css_provider_->load_from_path(client.css_file)) { Glib::RefPtr screen = window.get_screen(); - _styleContext->add_provider_for_screen(screen, _cssProvider, + style_context_->add_provider_for_screen(screen, css_provider_, GTK_STYLE_PROVIDER_PRIORITY_USER); } } -auto waybar::Bar::_setupWidgets() -> void +auto waybar::Bar::setupWidgets() -> void { auto &left = *Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 0)); auto ¢er = *Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 0)); @@ -161,28 +167,31 @@ auto waybar::Bar::_setupWidgets() -> void box1.pack_start(center, false, false); box1.pack_end(right, true, true); - Factory factory(*this, _config); - - if (_config["modules-left"]) { - for (auto name : _config["modules-left"]) { + Factory factory(*this, config_); + + if (config_["modules-left"]) { + for (const auto &name : config_["modules-left"]) { auto module = factory.makeModule(name.asString()); - if (module) + if (module != nullptr) { left.pack_start(*module, false, true, 0); + } } } - if (_config["modules-center"]) { - for (auto name : _config["modules-center"]) { + if (config_["modules-center"]) { + for (const auto &name : config_["modules-center"]) { auto module = factory.makeModule(name.asString()); - if (module) + if (module != nullptr) { center.pack_start(*module, true, false, 10); + } } } - if (_config["modules-right"]) { - std::reverse(_config["modules-right"].begin(), _config["modules-right"].end()); - for (auto name : _config["modules-right"]) { + if (config_["modules-right"]) { + std::reverse(config_["modules-right"].begin(), config_["modules-right"].end()); + for (const auto &name : config_["modules-right"]) { auto module = factory.makeModule(name.asString()); - if (module) + if (module != nullptr) { right.pack_end(*module, false, false, 0); + } } } } diff --git a/src/client.cpp b/src/client.cpp index a9be1356..9a96409d 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -1,17 +1,16 @@ #include "client.hpp" waybar::Client::Client(int argc, char* argv[]) - : gtk_main(argc, argv), - gdk_display(Gdk::Display::get_default()), - wlDisplay(gdk_wayland_display_get_wl_display(gdk_display->gobj())) + : gtk_main(argc, argv), gdk_display(Gdk::Display::get_default()), + wl_display(gdk_wayland_display_get_wl_display(gdk_display->gobj())) { auto getFirstValidPath = [] (std::vector possiblePaths) { wordexp_t p; - for (std::string path: possiblePaths) { + for (const std::string &path: possiblePaths) { if (wordexp(path.c_str(), &p, 0) == 0) { - if (access(p.we_wordv[0], F_OK) == 0) { - std::string result = p.we_wordv[0]; + if (access(*p.we_wordv, F_OK) == 0) { + std::string result = *p.we_wordv; wordfree(&p); return result; } @@ -22,13 +21,13 @@ waybar::Client::Client(int argc, char* argv[]) return std::string(); }; - configFile = getFirstValidPath({ + config_file = getFirstValidPath({ "$XDG_CONFIG_HOME/waybar/config", "$HOME/waybar/config", "/etc/xdg/waybar/config", "./resources/config", }); - cssFile = getFirstValidPath({ + css_file = getFirstValidPath({ "$XDG_CONFIG_HOME/waybar/style.css", "$HOME/waybar/style.css", "/etc/xdg/waybar/style.css", @@ -37,49 +36,51 @@ waybar::Client::Client(int argc, char* argv[]) } -void waybar::Client::_handle_global(void *data, struct wl_registry *registry, +void waybar::Client::handleGlobal(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { - auto o = reinterpret_cast(data); - if (!strcmp(interface, zwlr_layer_shell_v1_interface.name)) - o->layerShell = (zwlr_layer_shell_v1 *)wl_registry_bind(registry, name, - &zwlr_layer_shell_v1_interface, version); - else if (!strcmp(interface, wl_output_interface.name)) { + auto o = static_cast(data); + if (strcmp(interface, zwlr_layer_shell_v1_interface.name) == 0) { + o->layer_shell = static_cast( + wl_registry_bind(registry, name, &zwlr_layer_shell_v1_interface, version)); + } else if (strcmp(interface, wl_output_interface.name) == 0) { auto output = std::make_unique(); - *output = (struct wl_output *)wl_registry_bind(registry, name, - &wl_output_interface, version); - if (o->xdgOutputManager) + *output = static_cast(wl_registry_bind(registry, name, + &wl_output_interface, version)); + if (o->xdg_output_manager != nullptr) { o->bars.emplace_back(std::make_unique(*o, std::move(output))); - } else if (!strcmp(interface, wl_seat_interface.name)) - o->seat = (struct wl_seat *)wl_registry_bind(registry, name, - &wl_seat_interface, version); - else if (!strcmp(interface, zxdg_output_manager_v1_interface.name) - && version >= ZXDG_OUTPUT_V1_NAME_SINCE_VERSION) - o->xdgOutputManager = - (struct zxdg_output_manager_v1 *)wl_registry_bind(registry, name, - &zxdg_output_manager_v1_interface, ZXDG_OUTPUT_V1_NAME_SINCE_VERSION); + } + } else if (strcmp(interface, wl_seat_interface.name) == 0) { + o->seat = static_cast(wl_registry_bind(registry, name, + &wl_seat_interface, version)); + } else if (strcmp(interface, zxdg_output_manager_v1_interface.name) == 0 + && version >= ZXDG_OUTPUT_V1_NAME_SINCE_VERSION) { + o->xdg_output_manager = static_cast( + wl_registry_bind(registry, name, + &zxdg_output_manager_v1_interface, ZXDG_OUTPUT_V1_NAME_SINCE_VERSION)); + } } -void waybar::Client::_handle_global_remove(void *data, - struct wl_registry *registry, uint32_t name) +void waybar::Client::handleGlobalRemove(void* /*data*/, + struct wl_registry* /*registry*/, uint32_t /*name*/) { - // TODO + // TODO(someone) } -void waybar::Client::bind_interfaces() +void waybar::Client::bindInterfaces() { - registry = wl_display_get_registry(wlDisplay); + registry = wl_display_get_registry(wl_display); static const struct wl_registry_listener registry_listener = { - .global = _handle_global, - .global_remove = _handle_global_remove, + .global = handleGlobal, + .global_remove = handleGlobalRemove, }; wl_registry_add_listener(registry, ®istry_listener, this); - wl_display_roundtrip(wlDisplay); + wl_display_roundtrip(wl_display); } -int waybar::Client::main(int argc, char* argv[]) +int waybar::Client::main(int /*argc*/, char* /*argv*/[]) { - bind_interfaces(); + bindInterfaces(); gtk_main.run(); return 0; } diff --git a/src/factory.cpp b/src/factory.cpp index 540bc199..840a1871 100644 --- a/src/factory.cpp +++ b/src/factory.cpp @@ -1,30 +1,39 @@ #include "factory.hpp" waybar::Factory::Factory(Bar &bar, Json::Value config) - : _bar(bar), _config(config) + : _bar(bar), _config(std::move(config)) {} -waybar::IModule *waybar::Factory::makeModule(std::string name) +waybar::IModule *waybar::Factory::makeModule(const std::string &name) { try { - if (name == "battery") + if (name == "battery") { return new waybar::modules::Battery(_config[name]); - if (name == "sway/workspaces") + } + if (name == "sway/workspaces") { return new waybar::modules::sway::Workspaces(_bar, _config[name]); - if (name == "sway/window") + } + if (name == "sway/window") { return new waybar::modules::sway::Window(_bar, _config[name]); - if (name == "memory") + } + if (name == "memory") { return new waybar::modules::Memory(_config[name]); - if (name == "cpu") + } + if (name == "cpu") { return new waybar::modules::Cpu(_config[name]); - if (name == "clock") + } + if (name == "clock") { return new waybar::modules::Clock(_config[name]); - if (name == "network") + } + if (name == "network") { return new waybar::modules::Network(_config[name]); - if (name == "pulseaudio") + } + if (name == "pulseaudio") { return new waybar::modules::Pulseaudio(_config[name]); - if (!name.compare(0, 7, "custom/") && name.size() > 7) + } + if (name.compare(0, 7, "custom/") == 0 && name.size() > 7) { return new waybar::modules::Custom(name.substr(7), _config[name]); + } std::cerr << "Unknown module: " + name << std::endl; } catch (const std::exception& e) { auto err = fmt::format("Disabling module \"{}\", {}", name, e.what()); diff --git a/src/main.cpp b/src/main.cpp index 915b205b..6646e031 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,12 @@ +#include "client.hpp" #include #include -#include "client.hpp" namespace waybar { - static Client* client; -} + +static Client* client; + +} // namespace waybar int main(int argc, char* argv[]) { @@ -13,7 +15,7 @@ int main(int argc, char* argv[]) waybar::client = &c; std::signal(SIGUSR1, [] (int signal) { for (auto& bar : waybar::client->bars) { - bar.get()->toggle(); + (*bar).toggle(); } }); diff --git a/src/modules/battery.cpp b/src/modules/battery.cpp index ba0f2fb5..455e3b93 100644 --- a/src/modules/battery.cpp +++ b/src/modules/battery.cpp @@ -1,34 +1,37 @@ #include "modules/battery.hpp" waybar::modules::Battery::Battery(Json::Value config) - : _config(config) + : config_(std::move(config)) { try { - for (auto &node : fs::directory_iterator(_data_dir)) { + for (auto &node : fs::directory_iterator(data_dir_)) { if (fs::is_directory(node) && fs::exists(node / "capacity") - && fs::exists(node / "status") && fs::exists(node / "uevent")) - _batteries.push_back(node); + && fs::exists(node / "status") && fs::exists(node / "uevent")) { + batteries_.push_back(node); + } } } catch (fs::filesystem_error &e) { throw std::runtime_error(e.what()); } - - if (!_batteries.size()) + if (batteries_.empty()) { throw std::runtime_error("No batteries."); - + } auto fd = inotify_init(); - if (fd == -1) + if (fd == -1) { throw std::runtime_error("Unable to listen batteries."); - for (auto &bat : _batteries) + } + for (auto &bat : batteries_) { inotify_add_watch(fd, (bat / "uevent").c_str(), IN_ACCESS); + } // Trigger first value - update(); - _label.set_name("battery"); - _thread = [this, fd] { - struct inotify_event event; + Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Battery::update)); + label_.set_name("battery"); + thread_ = [this, fd] { + struct inotify_event event = {}; int nbytes = read(fd, &event, sizeof(event)); - if (nbytes != sizeof(event)) + if (nbytes != sizeof(event)) { return; + } Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Battery::update)); }; } @@ -38,45 +41,50 @@ auto waybar::modules::Battery::update() -> void try { uint16_t total = 0; std::string status; - for (auto &bat : _batteries) { + for (auto &bat : batteries_) { uint16_t capacity; std::string _status; std::ifstream(bat / "capacity") >> capacity; std::ifstream(bat / "status") >> _status; - if (_status != "Unknown") + if (_status != "Unknown") { status = _status; + } total += capacity; } - uint16_t capacity = total / _batteries.size(); - auto format = _config["format"] - ? _config["format"].asString() : "{capacity}%"; - _label.set_text(fmt::format(format, fmt::arg("capacity", capacity), - fmt::arg("icon", _getIcon(capacity)))); - _label.set_tooltip_text(status); + uint16_t capacity = total / batteries_.size(); + auto format = config_["format"] + ? config_["format"].asString() : "{capacity}%"; + label_.set_text(fmt::format(format, fmt::arg("capacity", capacity), + fmt::arg("icon", getIcon(capacity)))); + label_.set_tooltip_text(status); bool charging = status == "Charging"; - if (charging) - _label.get_style_context()->add_class("charging"); - else - _label.get_style_context()->remove_class("charging"); - auto critical = _config["critical"] ? _config["critical"].asUInt() : 15; - if (capacity <= critical && !charging) - _label.get_style_context()->add_class("warning"); - else - _label.get_style_context()->remove_class("warning"); + if (charging) { + label_.get_style_context()->add_class("charging"); + } else { + label_.get_style_context()->remove_class("charging"); + } + auto critical = config_["critical"] ? config_["critical"].asUInt() : 15; + if (capacity <= critical && !charging) { + label_.get_style_context()->add_class("warning"); + } else { + label_.get_style_context()->remove_class("warning"); + } } catch (const std::exception& e) { std::cerr << e.what() << std::endl; } } -std::string waybar::modules::Battery::_getIcon(uint16_t percentage) +std::string waybar::modules::Battery::getIcon(uint16_t percentage) { - if (!_config["format-icons"] || !_config["format-icons"].isArray()) return ""; - auto size = _config["format-icons"].size(); + if (!config_["format-icons"] || !config_["format-icons"].isArray()) { + return ""; + } + auto size = config_["format-icons"].size(); auto idx = std::clamp(percentage / (100 / size), 0U, size - 1); - return _config["format-icons"][idx].asString(); + return config_["format-icons"][idx].asString(); } waybar::modules::Battery::operator Gtk::Widget &() { - return _label; + return label_; } diff --git a/src/modules/clock.cpp b/src/modules/clock.cpp index f9beffc0..e24e64ff 100644 --- a/src/modules/clock.cpp +++ b/src/modules/clock.cpp @@ -1,27 +1,26 @@ #include "modules/clock.hpp" waybar::modules::Clock::Clock(Json::Value config) - : _config(config) + : config_(std::move(config)) { - _label.set_name("clock"); - int interval = _config["interval"] ? _config["inveral"].asInt() : 60; - _thread = [this, interval] { + label_.set_name("clock"); + uint32_t interval = config_["interval"] ? config_["inveral"].asUInt() : 60; + thread_ = [this, interval] { auto now = waybar::chrono::clock::now(); Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Clock::update)); auto timeout = std::chrono::floor(now + std::chrono::seconds(interval)); - _thread.sleep_until(timeout); + thread_.sleep_until(timeout); }; }; auto waybar::modules::Clock::update() -> void { auto localtime = fmt::localtime(std::time(nullptr)); - auto format = - _config["format"] ? _config["format"].asString() : "{:%H:%M}"; - _label.set_text(fmt::format(format, localtime)); + auto format = config_["format"] ? config_["format"].asString() : "{:%H:%M}"; + label_.set_text(fmt::format(format, localtime)); } waybar::modules::Clock::operator Gtk::Widget &() { - return _label; + return label_; } diff --git a/src/modules/cpu.cpp b/src/modules/cpu.cpp index 2cc3db85..a484dcf7 100644 --- a/src/modules/cpu.cpp +++ b/src/modules/cpu.cpp @@ -1,27 +1,27 @@ #include "modules/cpu.hpp" waybar::modules::Cpu::Cpu(Json::Value config) - : _config(config) + : config_(std::move(config)) { - _label.set_name("cpu"); - int interval = _config["interval"] ? _config["inveral"].asInt() : 10; - _thread = [this, interval] { + label_.set_name("cpu"); + uint32_t interval = config_["interval"] ? config_["inveral"].asUInt() : 10; + thread_ = [this, interval] { Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Cpu::update)); - _thread.sleep_for(chrono::seconds(interval)); + thread_.sleep_for(chrono::seconds(interval)); }; }; auto waybar::modules::Cpu::update() -> void { - struct sysinfo info; - if (!sysinfo(&info)) { - float f_load = 1.f / (1 << SI_LOAD_SHIFT); - int load = info.loads[0] * f_load * 100 / get_nprocs(); - auto format = _config["format"] ? _config["format"].asString() : "{}%"; - _label.set_text(fmt::format(format, load)); + struct sysinfo info = {}; + if (sysinfo(&info) == 0) { + float f_load = 1.f / (1U << SI_LOAD_SHIFT); + uint16_t load = info.loads[0] * f_load * 100 / get_nprocs(); + auto format = config_["format"] ? config_["format"].asString() : "{}%"; + label_.set_text(fmt::format(format, load)); } } waybar::modules::Cpu::operator Gtk::Widget &() { - return _label; + return label_; } diff --git a/src/modules/custom.cpp b/src/modules/custom.cpp index 47608c69..7beb10b5 100644 --- a/src/modules/custom.cpp +++ b/src/modules/custom.cpp @@ -1,30 +1,33 @@ #include "modules/custom.hpp" #include -waybar::modules::Custom::Custom(std::string name, Json::Value config) - : _name(name), _config(config) +waybar::modules::Custom::Custom(const std::string &name, Json::Value config) + : name_(name), config_(std::move(config)) { - if (!_config["exec"]) - throw std::runtime_error(name + " has no exec path."); - int interval = _config["interval"] ? _config["inveral"].asInt() : 30; - _thread = [this, interval] { + if (!config_["exec"]) { + throw std::runtime_error(name_ + " has no exec path."); + } + uint32_t interval = config_["interval"] ? config_["inveral"].asUInt() : 30; + thread_ = [this, interval] { Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Custom::update)); - _thread.sleep_for(chrono::seconds(interval)); + thread_.sleep_for(chrono::seconds(interval)); }; }; auto waybar::modules::Custom::update() -> void { - std::array buffer; + std::array buffer = {0}; std::string output; - std::shared_ptr fp(popen(_config["exec"].asCString(), "r"), pclose); + std::shared_ptr fp(popen(config_["exec"].asCString(), "r"), pclose); if (!fp) { - std::cerr << _name + " can't exec " + _config["exec"].asString() << std::endl; + std::cerr << name_ + " can't exec " + config_["exec"].asString() << std::endl; return; } - while (!feof(fp.get())) { - if (fgets(buffer.data(), 128, fp.get()) != nullptr) + + while (feof(fp.get()) == 0) { + if (fgets(buffer.data(), 128, fp.get()) != nullptr) { output += buffer.data(); + } } // Remove last newline @@ -34,16 +37,16 @@ auto waybar::modules::Custom::update() -> void // Hide label if output is empty if (output.empty()) { - _label.set_name(""); - _label.hide(); + label_.set_name(""); + label_.hide(); } else { - _label.set_name("custom-" + _name); - auto format = _config["format"] ? _config["format"].asString() : "{}"; - _label.set_text(fmt::format(format, output)); - _label.show(); + label_.set_name("custom-" + name_); + auto format = config_["format"] ? config_["format"].asString() : "{}"; + label_.set_text(fmt::format(format, output)); + label_.show(); } } waybar::modules::Custom::operator Gtk::Widget &() { - return _label; + return label_; } diff --git a/src/modules/memory.cpp b/src/modules/memory.cpp index 837c4c7f..f49c9cfc 100644 --- a/src/modules/memory.cpp +++ b/src/modules/memory.cpp @@ -1,30 +1,30 @@ #include "modules/memory.hpp" waybar::modules::Memory::Memory(Json::Value config) - : _config(config) + : config_(std::move(config)) { - _label.set_name("memory"); - int interval = _config["interval"] ? _config["inveral"].asInt() : 30; - _thread = [this, interval] { + label_.set_name("memory"); + uint32_t interval = config_["interval"] ? config_["inveral"].asUInt() : 30; + thread_ = [this, interval] { Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Memory::update)); - _thread.sleep_for(chrono::seconds(interval)); + thread_.sleep_for(chrono::seconds(interval)); }; }; auto waybar::modules::Memory::update() -> void { - struct sysinfo info; - if (!sysinfo(&info)) { + struct sysinfo info = {}; + if (sysinfo(&info) == 0) { auto total = info.totalram * info.mem_unit; auto freeram = info.freeram * info.mem_unit; int used_ram_percentage = 100 * (total - freeram) / total; - auto format = _config["format"] ? _config["format"].asString() : "{}%"; - _label.set_text(fmt::format(format, used_ram_percentage)); + auto format = config_["format"] ? config_["format"].asString() : "{}%"; + label_.set_text(fmt::format(format, used_ram_percentage)); auto used_ram_gigabytes = (total - freeram) / std::pow(1024, 3); - _label.set_tooltip_text(fmt::format("{:.{}f}Gb used", used_ram_gigabytes, 1)); + label_.set_tooltip_text(fmt::format("{:.{}f}Gb used", used_ram_gigabytes, 1)); } } waybar::modules::Memory::operator Gtk::Widget &() { - return _label; + return label_; } diff --git a/src/modules/network.cpp b/src/modules/network.cpp index 8fc04c1c..58730184 100644 --- a/src/modules/network.cpp +++ b/src/modules/network.cpp @@ -1,30 +1,34 @@ #include "modules/network.hpp" +#include + waybar::modules::Network::Network(Json::Value config) - : _config(config), _ifid(if_nametoindex(config["interface"].asCString())) + : config_(std::move(config)), + ifid_(if_nametoindex(config_["interface"].asCString())) { - if (_ifid == 0) + if (ifid_ == 0) { throw std::runtime_error("Can't found network interface"); - _label.set_name("network"); - int interval = _config["interval"] ? _config["inveral"].asInt() : 30; - _thread = [this, interval] { + } + label_.set_name("network"); + uint32_t interval = config_["interval"] ? config_["inveral"].asUInt() : 30; + thread_ = [this, interval] { + getInfo(); Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Network::update)); - _thread.sleep_for(chrono::minutes(1)); + thread_.sleep_for(chrono::seconds(interval)); }; }; auto waybar::modules::Network::update() -> void { - _getInfo(); - auto format = _config["format"] ? _config["format"].asString() : "{essid}"; - _label.set_text(fmt::format(format, - fmt::arg("essid", _essid), - fmt::arg("signaldBm", _signalStrengthdBm), - fmt::arg("signalStrength", _signalStrength) + auto format = config_["format"] ? config_["format"].asString() : "{essid}"; + label_.set_text(fmt::format(format, + fmt::arg("essid", essid_), + fmt::arg("signaldBm", signal_strength_dbm_), + fmt::arg("signalStrength", signal_strength_) )); } -int waybar::modules::Network::_scanCb(struct nl_msg *msg, void *data) { +int waybar::modules::Network::scanCb(struct nl_msg *msg, void *data) { auto net = static_cast(data); auto gnlh = static_cast(nlmsg_data(nlmsg_hdr(msg))); struct nlattr* tb[NL80211_ATTR_MAX + 1]; @@ -40,23 +44,27 @@ int waybar::modules::Network::_scanCb(struct nl_msg *msg, void *data) { bss_policy[NL80211_BSS_SIGNAL_UNSPEC].type = NLA_U8; bss_policy[NL80211_BSS_STATUS].type = NLA_U32; - if (nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), nullptr) < 0) + if (nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), nullptr) < 0) { return NL_SKIP; - if (!tb[NL80211_ATTR_BSS]) + } + if (tb[NL80211_ATTR_BSS] == nullptr) { return NL_SKIP; - if (nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS], bss_policy)) + } + if (nla_parse_nested(bss, NL80211_BSS_MAX, tb[NL80211_ATTR_BSS], bss_policy) != 0) { return NL_SKIP; - if (!net->_associatedOrJoined(bss)) + } + if (!net->associatedOrJoined(bss)) { return NL_SKIP; - net->_parseEssid(bss); - net->_parseSignal(bss); - // TODO: parse quality + } + net->parseEssid(bss); + net->parseSignal(bss); + // TODO(someone): parse quality return NL_SKIP; } -void waybar::modules::Network::_parseEssid(struct nlattr **bss) +void waybar::modules::Network::parseEssid(struct nlattr **bss) { - _essid.clear(); + essid_.clear(); if (bss[NL80211_BSS_INFORMATION_ELEMENTS] != nullptr) { auto ies = static_cast(nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS])); @@ -69,29 +77,30 @@ void waybar::modules::Network::_parseEssid(struct nlattr **bss) if (ies_len > hdr_len && ies_len > ies[1] + hdr_len) { auto essid_begin = ies + hdr_len; auto essid_end = essid_begin + ies[1]; - std::copy(essid_begin, essid_end, std::back_inserter(_essid)); + std::copy(essid_begin, essid_end, std::back_inserter(essid_)); } } } -void waybar::modules::Network::_parseSignal(struct nlattr **bss) { +void waybar::modules::Network::parseSignal(struct nlattr **bss) { if (bss[NL80211_BSS_SIGNAL_MBM] != nullptr) { // signalstrength in dBm - _signalStrengthdBm = + signal_strength_dbm_ = static_cast(nla_get_u32(bss[NL80211_BSS_SIGNAL_MBM])) / 100; // WiFi-hardware usually operates in the range -90 to -20dBm. const int hardwareMax = -20; const int hardwareMin = -90; - _signalStrength = ((double)(_signalStrengthdBm - hardwareMin) - / (double)(hardwareMax - hardwareMin)) * 100; + signal_strength_ = ((signal_strength_dbm_ - hardwareMin) + / double{hardwareMax - hardwareMin}) * 100; } } -bool waybar::modules::Network::_associatedOrJoined(struct nlattr** bss) +bool waybar::modules::Network::associatedOrJoined(struct nlattr** bss) { - if (!bss[NL80211_BSS_STATUS]) + if (bss[NL80211_BSS_STATUS] == nullptr) { return false; + } auto status = nla_get_u32(bss[NL80211_BSS_STATUS]); switch (status) { case NL80211_BSS_STATUS_ASSOCIATED: @@ -103,14 +112,14 @@ bool waybar::modules::Network::_associatedOrJoined(struct nlattr** bss) } } -auto waybar::modules::Network::_getInfo() -> void +auto waybar::modules::Network::getInfo() -> void { struct nl_sock *sk = nl_socket_alloc(); if (genl_connect(sk) != 0) { nl_socket_free(sk); return; } - if (nl_socket_modify_cb(sk, NL_CB_VALID, NL_CB_CUSTOM, _scanCb, this) < 0) { + if (nl_socket_modify_cb(sk, NL_CB_VALID, NL_CB_CUSTOM, scanCb, this) < 0) { nl_socket_free(sk); return; } @@ -120,13 +129,13 @@ auto waybar::modules::Network::_getInfo() -> void return; } struct nl_msg *msg = nlmsg_alloc(); - if (!msg) { + if (msg == nullptr) { nl_socket_free(sk); return; } - if (!genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, nl80211_id, 0, - NLM_F_DUMP, NL80211_CMD_GET_SCAN, 0) || - nla_put_u32(msg, NL80211_ATTR_IFINDEX, _ifid) < 0) { + if (genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, nl80211_id, 0, NLM_F_DUMP, + NL80211_CMD_GET_SCAN, 0) == nullptr + || nla_put_u32(msg, NL80211_ATTR_IFINDEX, ifid_) < 0) { nlmsg_free(msg); return; } @@ -135,5 +144,5 @@ auto waybar::modules::Network::_getInfo() -> void } waybar::modules::Network::operator Gtk::Widget &() { - return _label; + return label_; } diff --git a/src/modules/pulseaudio.cpp b/src/modules/pulseaudio.cpp index 3225d6dd..c3eae764 100644 --- a/src/modules/pulseaudio.cpp +++ b/src/modules/pulseaudio.cpp @@ -1,39 +1,44 @@ #include "modules/pulseaudio.hpp" waybar::modules::Pulseaudio::Pulseaudio(Json::Value config) - : _config(config), _mainloop(nullptr), _mainloop_api(nullptr), - _context(nullptr), _sinkIdx(0), _volume(0), _muted(false) + : config_(std::move(config)), mainloop_(nullptr), mainloop_api_(nullptr), + context_(nullptr), sink_idx_(0), volume_(0), muted_(false) { - _label.set_name("pulseaudio"); - _mainloop = pa_threaded_mainloop_new(); - if (!_mainloop) + label_.set_name("pulseaudio"); + mainloop_ = pa_threaded_mainloop_new(); + if (mainloop_ == nullptr) { throw std::runtime_error("pa_mainloop_new() failed."); - pa_threaded_mainloop_lock(_mainloop); - _mainloop_api = pa_threaded_mainloop_get_api(_mainloop); - _context = pa_context_new(_mainloop_api, "waybar"); - if (!_context) + } + pa_threaded_mainloop_lock(mainloop_); + mainloop_api_ = pa_threaded_mainloop_get_api(mainloop_); + context_ = pa_context_new(mainloop_api_, "waybar"); + if (context_ == nullptr) { throw std::runtime_error("pa_context_new() failed."); - if (pa_context_connect(_context, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL) < 0) - throw std::runtime_error(fmt::format("pa_context_connect() failed: {}", - pa_strerror(pa_context_errno(_context)))); - pa_context_set_state_callback(_context, _contextStateCb, this); - if (pa_threaded_mainloop_start(_mainloop) < 0) + } + if (pa_context_connect(context_, nullptr, PA_CONTEXT_NOAUTOSPAWN, + nullptr) < 0) { + auto err = fmt::format("pa_context_connect() failed: {}", + pa_strerror(pa_context_errno(context_))); + throw std::runtime_error(err); + } + pa_context_set_state_callback(context_, contextStateCb, this); + if (pa_threaded_mainloop_start(mainloop_) < 0) { throw std::runtime_error("pa_mainloop_run() failed."); - pa_threaded_mainloop_unlock(_mainloop); + } + pa_threaded_mainloop_unlock(mainloop_); }; -void waybar::modules::Pulseaudio::_contextStateCb(pa_context *c, void *data) +void waybar::modules::Pulseaudio::contextStateCb(pa_context *c, void *data) { auto pa = static_cast(data); switch (pa_context_get_state(c)) { case PA_CONTEXT_TERMINATED: - pa->_mainloop_api->quit(pa->_mainloop_api, 0); + pa->mainloop_api_->quit(pa->mainloop_api_, 0); break; case PA_CONTEXT_READY: - pa_context_get_server_info(c, _serverInfoCb, data); - pa_context_set_subscribe_callback(c, _subscribeCb, data); - pa_context_subscribe(c, PA_SUBSCRIPTION_MASK_SINK, nullptr, - nullptr); + pa_context_get_server_info(c, serverInfoCb, data); + pa_context_set_subscribe_callback(c, subscribeCb, data); + pa_context_subscribe(c, PA_SUBSCRIPTION_MASK_SINK, nullptr, nullptr); break; case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: @@ -41,7 +46,7 @@ void waybar::modules::Pulseaudio::_contextStateCb(pa_context *c, void *data) break; case PA_CONTEXT_FAILED: default: - pa->_mainloop_api->quit(pa->_mainloop_api, 1); + pa->mainloop_api_->quit(pa->mainloop_api_, 1); break; } } @@ -49,37 +54,35 @@ void waybar::modules::Pulseaudio::_contextStateCb(pa_context *c, void *data) /* * Called when an event we subscribed to occurs. */ -void waybar::modules::Pulseaudio::_subscribeCb(pa_context *context, - pa_subscription_event_type_t type, uint32_t idx, void *data) +void waybar::modules::Pulseaudio::subscribeCb(pa_context* context, + pa_subscription_event_type_t type, uint32_t idx, void* data) { unsigned facility = type & PA_SUBSCRIPTION_EVENT_FACILITY_MASK; - pa_operation *op = nullptr; switch (facility) { - case PA_SUBSCRIPTION_EVENT_SINK: - pa_context_get_sink_info_by_index(context, idx, _sinkInfoCb, data); - break; - default: - assert(0); - break; + case PA_SUBSCRIPTION_EVENT_SINK: + pa_context_get_sink_info_by_index(context, idx, sinkInfoCb, data); + break; + default: + assert(0); + break; } - if (op) - pa_operation_unref(op); } /* * Called when the requested sink information is ready. */ -void waybar::modules::Pulseaudio::_sinkInfoCb(pa_context *context, - const pa_sink_info *i, int eol, void *data) +void waybar::modules::Pulseaudio::sinkInfoCb(pa_context* /*context*/, + const pa_sink_info* i, int /*eol*/, void* data) { - if (i) { + if (i != nullptr) { auto pa = static_cast(data); - float volume = (float)pa_cvolume_avg(&(i->volume)) / (float)PA_VOLUME_NORM; - pa->_sinkIdx = i->index; - pa->_volume = volume * 100.0f; - pa->_muted = i->mute; - pa->_desc = i->description; + float volume = static_cast(pa_cvolume_avg(&(i->volume))) + / float{PA_VOLUME_NORM}; + pa->sink_idx_ = i->index; + pa->volume_ = volume * 100.0f; + pa->muted_ = i->mute != 0; + pa->desc_ = i->description; Glib::signal_idle().connect_once(sigc::mem_fun(*pa, &Pulseaudio::update)); } } @@ -88,36 +91,40 @@ void waybar::modules::Pulseaudio::_sinkInfoCb(pa_context *context, * Called when the requested information on the server is ready. This is * used to find the default PulseAudio sink. */ -void waybar::modules::Pulseaudio::_serverInfoCb(pa_context *context, +void waybar::modules::Pulseaudio::serverInfoCb(pa_context *context, const pa_server_info *i, void *data) { - pa_context_get_sink_info_by_name(context, i->default_sink_name, _sinkInfoCb, - data); + pa_context_get_sink_info_by_name(context, i->default_sink_name, + sinkInfoCb, data); } auto waybar::modules::Pulseaudio::update() -> void { - auto format = _config["format"] ? _config["format"].asString() : "{volume}%"; - if (_muted) { + auto format = + config_["format"] ? config_["format"].asString() : "{volume}%"; + if (muted_) { format = - _config["format-muted"] ? _config["format-muted"].asString() : format; - _label.get_style_context()->add_class("muted"); - } else - _label.get_style_context()->remove_class("muted"); - _label.set_label(fmt::format(format, - fmt::arg("volume", _volume), - fmt::arg("icon", _getIcon(_volume)))); - _label.set_tooltip_text(_desc); + config_["format-muted"] ? config_["format-muted"].asString() : format; + label_.get_style_context()->add_class("muted"); + } else { + label_.get_style_context()->remove_class("muted"); + } + label_.set_label(fmt::format(format, + fmt::arg("volume", volume_), + fmt::arg("icon", getIcon(volume_)))); + label_.set_tooltip_text(desc_); } -std::string waybar::modules::Pulseaudio::_getIcon(uint16_t percentage) +std::string waybar::modules::Pulseaudio::getIcon(uint16_t percentage) { - if (!_config["format-icons"] || !_config["format-icons"].isArray()) return ""; - auto size = _config["format-icons"].size(); + if (!config_["format-icons"] || !config_["format-icons"].isArray()) { + return ""; + } + auto size = config_["format-icons"].size(); auto idx = std::clamp(percentage / (100 / size), 0U, size - 1); - return _config["format-icons"][idx].asString(); + return config_["format-icons"][idx].asString(); } waybar::modules::Pulseaudio::operator Gtk::Widget &() { - return _label; + return label_; } diff --git a/src/modules/sway/ipc/client.cpp b/src/modules/sway/ipc/client.cpp index f6485cfb..ead9d7de 100644 --- a/src/modules/sway/ipc/client.cpp +++ b/src/modules/sway/ipc/client.cpp @@ -1,22 +1,24 @@ #define _POSIX_C_SOURCE 200809L +#include "modules/sway/ipc/client.hpp" +#include #include -#include #include #include -#include "modules/sway/ipc/client.hpp" static const char ipc_magic[] = {'i', '3', '-', 'i', 'p', 'c'}; static const size_t ipc_header_size = sizeof(ipc_magic)+8; -std::string get_socketpath(void) { +std::string getSocketPath() { const char *env = getenv("SWAYSOCK"); - if (env) return std::string(env); + if (env != nullptr) { + return std::string(env); + } std::string str; { std::string str_buf; FILE* in; char buf[512] = { 0 }; - if (!(in = popen("sway --get-socketpath 2>/dev/null", "r"))) { + if ((in = popen("sway --get-socketpath 2>/dev/null", "r")) == nullptr) { throw std::runtime_error("Failed to get socket path"); } while (fgets(buf, sizeof(buf), in) != nullptr) { @@ -31,26 +33,26 @@ std::string get_socketpath(void) { return str; } -int ipc_open_socket(std::string socket_path) { - struct sockaddr_un addr; +int ipcOpenSocket(const std::string &socketPath) { + struct sockaddr_un addr = {}; int socketfd; if ((socketfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { throw std::runtime_error("Unable to open Unix socket"); } addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, socket_path.c_str(), sizeof(addr.sun_path) - 1); + strncpy(addr.sun_path, socketPath.c_str(), sizeof(addr.sun_path) - 1); addr.sun_path[sizeof(addr.sun_path) - 1] = 0; int l = sizeof(struct sockaddr_un); - if (connect(socketfd, (struct sockaddr *)&addr, l) == -1) { - throw std::runtime_error("Unable to connect to " + socket_path); + if (connect(socketfd, reinterpret_cast(&addr), l) == -1) { + throw std::runtime_error("Unable to connect to " + socketPath); } return socketfd; } -struct ipc_response ipc_recv_response(int socketfd) { +struct ipc_response ipcRecvResponse(int socketfd) { struct ipc_response response; char data[ipc_header_size]; - uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic)); + auto data32 = reinterpret_cast(data + sizeof(ipc_magic)); size_t total = 0; while (total < ipc_header_size) { @@ -78,18 +80,20 @@ struct ipc_response ipc_recv_response(int socketfd) { return response; } -std::string ipc_single_command(int socketfd, uint32_t type, const char *payload, uint32_t *len) { +std::string ipcSingleCommand(int socketfd, uint32_t type, const char *payload, uint32_t *len) { char data[ipc_header_size]; - uint32_t *data32 = (uint32_t *)(data + sizeof(ipc_magic)); + auto data32 = reinterpret_cast(data + sizeof(ipc_magic)); memcpy(data, ipc_magic, sizeof(ipc_magic)); data32[0] = *len; data32[1] = type; - if (send(socketfd, data, ipc_header_size, 0) == -1) + if (send(socketfd, data, ipc_header_size, 0) == -1) { throw std::runtime_error("Unable to send IPC header"); - if (send(socketfd, payload, *len, 0) == -1) + } + if (send(socketfd, payload, *len, 0) == -1) { throw std::runtime_error("Unable to send IPC payload"); - struct ipc_response resp = ipc_recv_response(socketfd); + } + struct ipc_response resp = ipcRecvResponse(socketfd); *len = resp.size; return resp.payload; } diff --git a/src/modules/sway/window.cpp b/src/modules/sway/window.cpp index a991c52f..1a41c016 100644 --- a/src/modules/sway/window.cpp +++ b/src/modules/sway/window.cpp @@ -2,28 +2,23 @@ #include "modules/sway/ipc/client.hpp" waybar::modules::sway::Window::Window(Bar &bar, Json::Value config) - : _bar(bar), _config(config) + : bar_(bar), config_(std::move(config)) { - _label.set_name("window"); - std::string socketPath = get_socketpath(); - _ipcfd = ipc_open_socket(socketPath); - _ipcEventfd = ipc_open_socket(socketPath); + label_.set_name("window"); + std::string socketPath = getSocketPath(); + ipcfd_ = ipcOpenSocket(socketPath); + ipc_eventfd_ = ipcOpenSocket(socketPath); const char *subscribe = "[ \"window\" ]"; uint32_t len = strlen(subscribe); - ipc_single_command(_ipcEventfd, IPC_SUBSCRIBE, subscribe, &len); - _getFocusedWindow(); - _thread = [this] { + ipcSingleCommand(ipc_eventfd_, IPC_SUBSCRIBE, subscribe, &len); + getFocusedWindow(); + thread_ = [this] { try { - if (_bar.outputName.empty()) { - // Wait for the name of the output - while (_bar.outputName.empty()) - _thread.sleep_for(chrono::milliseconds(150)); - } - auto res = ipc_recv_response(_ipcEventfd); - auto parsed = _parser.parse(res.payload); + auto res = ipcRecvResponse(ipc_eventfd_); + auto parsed = parser_.parse(res.payload); if ((parsed["change"] == "focus" || parsed["change"] == "title") && parsed["container"]["focused"].asBool()) { - _window = parsed["container"]["name"].asString(); + window_ = parsed["container"]["name"].asString(); Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Window::update)); } } catch (const std::exception& e) { @@ -34,29 +29,31 @@ waybar::modules::sway::Window::Window(Bar &bar, Json::Value config) auto waybar::modules::sway::Window::update() -> void { - _label.set_text(_window); - _label.set_tooltip_text(_window); + label_.set_text(window_); + label_.set_tooltip_text(window_); } -std::string waybar::modules::sway::Window::_getFocusedNode(Json::Value nodes) +std::string waybar::modules::sway::Window::getFocusedNode(Json::Value nodes) { for (auto &node : nodes) { - if (node["focused"].asBool()) + if (node["focused"].asBool()) { return node["name"].asString(); - auto res = _getFocusedNode(node["nodes"]); - if (!res.empty()) + } + auto res = getFocusedNode(node["nodes"]); + if (!res.empty()) { return res; + } } return std::string(); } -void waybar::modules::sway::Window::_getFocusedWindow() +void waybar::modules::sway::Window::getFocusedWindow() { try { uint32_t len = 0; - auto res = ipc_single_command(_ipcfd, IPC_GET_TREE, nullptr, &len); - auto parsed = _parser.parse(res); - _window = _getFocusedNode(parsed["nodes"]); + auto res = ipcSingleCommand(ipcfd_, IPC_GET_TREE, nullptr, &len); + auto parsed = parser_.parse(res); + window_ = getFocusedNode(parsed["nodes"]); Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Window::update)); } catch (const std::exception &e) { std::cerr << e.what() << std::endl; @@ -64,5 +61,5 @@ void waybar::modules::sway::Window::_getFocusedWindow() } waybar::modules::sway::Window::operator Gtk::Widget &() { - return _label; + return label_; } diff --git a/src/modules/sway/workspaces.cpp b/src/modules/sway/workspaces.cpp index 3b334825..c2eab23a 100644 --- a/src/modules/sway/workspaces.cpp +++ b/src/modules/sway/workspaces.cpp @@ -2,27 +2,29 @@ #include "modules/sway/ipc/client.hpp" waybar::modules::sway::Workspaces::Workspaces(Bar &bar, Json::Value config) - : _bar(bar), _config(config), _scrolling(false) + : bar_(bar), config_(std::move(config)), scrolling_(false) { - _box.set_name("workspaces"); - std::string socketPath = get_socketpath(); - _ipcfd = ipc_open_socket(socketPath); - _ipcEventfd = ipc_open_socket(socketPath); + box_.set_name("workspaces"); + std::string socketPath = getSocketPath(); + ipcfd_ = ipcOpenSocket(socketPath); + ipc_eventfd_ = ipcOpenSocket(socketPath); const char *subscribe = "[ \"workspace\" ]"; uint32_t len = strlen(subscribe); - ipc_single_command(_ipcEventfd, IPC_SUBSCRIBE, subscribe, &len); - _thread = [this] { + ipcSingleCommand(ipc_eventfd_, IPC_SUBSCRIBE, subscribe, &len); + thread_ = [this] { try { // Wait for the name of the output - if (!_config["all-outputs"].asBool() && _bar.outputName.empty()) { - while (_bar.outputName.empty()) - _thread.sleep_for(chrono::milliseconds(150)); - } else if (_workspaces.size()) - ipc_recv_response(_ipcEventfd); + if (!config_["all-outputs"].asBool() && bar_.outputName.empty()) { + while (bar_.outputName.empty()) { + thread_.sleep_for(chrono::milliseconds(150)); + } + } else if (!workspaces_.empty()) { + ipcRecvResponse(ipc_eventfd_); + } uint32_t len = 0; - std::lock_guard lock(_mutex); - auto str = ipc_single_command(_ipcfd, IPC_GET_WORKSPACES, nullptr, &len); - _workspaces = _parser.parse(str); + std::lock_guard lock(mutex_); + auto str = ipcSingleCommand(ipcfd_, IPC_GET_WORKSPACES, nullptr, &len); + workspaces_ = parser_.parse(str); Glib::signal_idle() .connect_once(sigc::mem_fun(*this, &Workspaces::update)); } catch (const std::exception& e) { @@ -33,156 +35,175 @@ waybar::modules::sway::Workspaces::Workspaces(Bar &bar, Json::Value config) auto waybar::modules::sway::Workspaces::update() -> void { - std::lock_guard lock(_mutex); + std::lock_guard lock(mutex_); bool needReorder = false; - for (auto it = _buttons.begin(); it != _buttons.end();) { - auto ws = std::find_if(_workspaces.begin(), _workspaces.end(), + for (auto it = buttons_.begin(); it != buttons_.end();) { + auto ws = std::find_if(workspaces_.begin(), workspaces_.end(), [it](auto node) -> bool { return node["num"].asInt() == it->first; }); - if (ws == _workspaces.end()) { - it = _buttons.erase(it); + if (ws == workspaces_.end()) { + it = buttons_.erase(it); needReorder = true; - } else + } else { ++it; + } } - for (auto node : _workspaces) { - if (!_config["all-outputs"].asBool() - && _bar.outputName != node["output"].asString()) + for (auto node : workspaces_) { + if (!config_["all-outputs"].asBool() + && bar_.outputName != node["output"].asString()) { continue; - auto it = _buttons.find(node["num"].asInt()); - if (it == _buttons.end()) { - _addWorkspace(node); + } + auto it = buttons_.find(node["num"].asInt()); + if (it == buttons_.end()) { + addWorkspace(node); needReorder = true; } else { auto &button = it->second; - if (node["focused"].asBool()) + if (node["focused"].asBool()) { button.get_style_context()->add_class("focused"); - else + } else { button.get_style_context()->remove_class("focused"); - if (node["visible"].asBool()) + } + if (node["visible"].asBool()) { button.get_style_context()->add_class("visible"); - else + } else { button.get_style_context()->remove_class("visible"); - if (node["urgent"].asBool()) + } + if (node["urgent"].asBool()) { button.get_style_context()->add_class("urgent"); - else + } else { button.get_style_context()->remove_class("urgent"); - if (needReorder) - _box.reorder_child(button, node["num"].asInt()); + } + if (needReorder) { + box_.reorder_child(button, node["num"].asInt()); + } button.show(); } } - if (_scrolling) - _scrolling = false; + if (scrolling_) { + scrolling_ = false; + } } -void waybar::modules::sway::Workspaces::_addWorkspace(Json::Value node) +void waybar::modules::sway::Workspaces::addWorkspace(Json::Value node) { - auto icon = _getIcon(node["name"].asString()); - auto pair = _buttons.emplace(node["num"].asInt(), icon); + auto icon = getIcon(node["name"].asString()); + auto pair = buttons_.emplace(node["num"].asInt(), icon); auto &button = pair.first->second; - if (icon != node["name"].asString()) + if (icon != node["name"].asString()) { button.get_style_context()->add_class("icon"); - _box.pack_start(button, false, false, 0); + } + box_.pack_start(button, false, false, 0); button.set_relief(Gtk::RELIEF_NONE); button.signal_clicked().connect([this, pair] { try { - std::lock_guard lock(_mutex); + std::lock_guard lock(mutex_); auto value = fmt::format("workspace \"{}\"", pair.first->first); uint32_t size = value.size(); - ipc_single_command(_ipcfd, IPC_COMMAND, value.c_str(), &size); + ipcSingleCommand(ipcfd_, IPC_COMMAND, value.c_str(), &size); } catch (const std::exception& e) { std::cerr << e.what() << std::endl; } }); button.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK); button.signal_scroll_event() - .connect(sigc::mem_fun(*this, &Workspaces::_handleScroll)); - _box.reorder_child(button, node["num"].asInt()); - if (node["focused"].asBool()) + .connect(sigc::mem_fun(*this, &Workspaces::handleScroll)); + box_.reorder_child(button, node["num"].asInt()); + if (node["focused"].asBool()) { button.get_style_context()->add_class("focused"); - if (node["visible"].asBool()) + } + if (node["visible"].asBool()) { button.get_style_context()->add_class("visible"); - if (node["urgent"].asBool()) + } + if (node["urgent"].asBool()) { button.get_style_context()->add_class("urgent"); + } button.show(); } -std::string waybar::modules::sway::Workspaces::_getIcon(std::string name) +std::string waybar::modules::sway::Workspaces::getIcon(std::string name) { - if (_config["format-icons"][name]) - return _config["format-icons"][name].asString(); - if (_config["format-icons"]["default"]) - return _config["format-icons"]["default"].asString(); + if (config_["format-icons"][name]) { + return config_["format-icons"][name].asString(); + } + if (config_["format-icons"]["default"]) { + return config_["format-icons"]["default"].asString(); + } return name; } -bool waybar::modules::sway::Workspaces::_handleScroll(GdkEventScroll *e) +bool waybar::modules::sway::Workspaces::handleScroll(GdkEventScroll *e) { - std::lock_guard lock(_mutex); + std::lock_guard lock(mutex_); // Avoid concurrent scroll event - if (_scrolling) + if (scrolling_) { return false; - _scrolling = true; + } + 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(); + for (; idx < workspaces_.size(); idx += 1) { + if (workspaces_[idx]["focused"].asBool()) { + id = workspaces_[idx]["num"].asInt(); break; } + } if (id == -1) { - _scrolling = false; + 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_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(); + gdk_event_get_scroll_deltas(reinterpret_cast(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; + 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); + ipcSingleCommand(ipcfd_, IPC_COMMAND, value.c_str(), &size); std::this_thread::sleep_for(std::chrono::milliseconds(150)); return true; } -int waybar::modules::sway::Workspaces::_getPrevWorkspace() +int waybar::modules::sway::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(); + for (uint16_t i = 0; i != workspaces_.size(); i += 1) { + if (workspaces_[i]["focused"].asBool()) { + if (i > 0) { + return workspaces_[i - 1]["num"].asInt(); + } + return workspaces_[workspaces_.size() - 1]["num"].asInt(); } - return current; + } + return -1; } -int waybar::modules::sway::Workspaces::_getNextWorkspace() +int waybar::modules::sway::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(); + for (uint16_t i = 0; i != workspaces_.size(); i += 1) { + if (workspaces_[i]["focused"].asBool()) { + if (i + 1U < workspaces_.size()) { + return workspaces_[i + 1]["num"].asInt(); + } + return workspaces_[0]["num"].asInt(); } - return current; + } + return -1; } waybar::modules::sway::Workspaces::operator Gtk::Widget &() { - return _box; + return box_; }