Merge branch 'master' into master
commit
6ad1f6b853
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
BasedOnStyle: Google
|
BasedOnStyle: Google
|
||||||
AlignConsecutiveDeclarations: true
|
AlignConsecutiveDeclarations: false
|
||||||
BinPackArguments: false
|
|
||||||
ColumnLimit: 100
|
ColumnLimit: 100
|
||||||
...
|
...
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
name: Linter
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: DoozyX/clang-format-lint-action@v0.13
|
||||||
|
with:
|
||||||
|
source: '.'
|
||||||
|
extensions: 'h,cpp,c'
|
||||||
|
clangFormatVersion: 12
|
|
@ -13,11 +13,11 @@ class AIconLabel : public ALabel {
|
||||||
const std::string &format, uint16_t interval = 0, bool ellipsize = false,
|
const std::string &format, uint16_t interval = 0, bool ellipsize = false,
|
||||||
bool enable_click = false, bool enable_scroll = false);
|
bool enable_click = false, bool enable_scroll = false);
|
||||||
virtual ~AIconLabel() = default;
|
virtual ~AIconLabel() = default;
|
||||||
virtual auto update() -> void;
|
virtual auto update() -> void;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Gtk::Image image_;
|
Gtk::Image image_;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
|
|
||||||
bool iconEnabled() const;
|
bool iconEnabled() const;
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <glibmm/markup.h>
|
#include <glibmm/markup.h>
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
@ -10,20 +11,21 @@ namespace waybar {
|
||||||
class ALabel : public AModule {
|
class ALabel : public AModule {
|
||||||
public:
|
public:
|
||||||
ALabel(const Json::Value &, const std::string &, const std::string &, const std::string &format,
|
ALabel(const Json::Value &, const std::string &, const std::string &, const std::string &format,
|
||||||
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false, bool enable_scroll = false);
|
uint16_t interval = 0, bool ellipsize = false, bool enable_click = false,
|
||||||
|
bool enable_scroll = false);
|
||||||
virtual ~ALabel() = default;
|
virtual ~ALabel() = default;
|
||||||
virtual auto update() -> void;
|
virtual auto update() -> void;
|
||||||
virtual std::string getIcon(uint16_t, const std::string &alt = "", uint16_t max = 0);
|
virtual std::string getIcon(uint16_t, const std::string &alt = "", uint16_t max = 0);
|
||||||
virtual std::string getIcon(uint16_t, const std::vector<std::string> &alts, uint16_t max = 0);
|
virtual std::string getIcon(uint16_t, const std::vector<std::string> &alts, uint16_t max = 0);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Gtk::Label label_;
|
Gtk::Label label_;
|
||||||
std::string format_;
|
std::string format_;
|
||||||
const std::chrono::seconds interval_;
|
const std::chrono::seconds interval_;
|
||||||
bool alt_ = false;
|
bool alt_ = false;
|
||||||
std::string default_format_;
|
std::string default_format_;
|
||||||
|
|
||||||
virtual bool handleToggle(GdkEventButton *const &e);
|
virtual bool handleToggle(GdkEventButton *const &e);
|
||||||
virtual std::string getState(uint8_t value, bool lesser = false);
|
virtual std::string getState(uint8_t value, bool lesser = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ class AModule : public IModule {
|
||||||
bool enable_scroll = false);
|
bool enable_scroll = false);
|
||||||
virtual ~AModule();
|
virtual ~AModule();
|
||||||
virtual auto update() -> void;
|
virtual auto update() -> void;
|
||||||
virtual operator Gtk::Widget &();
|
virtual operator Gtk::Widget &();
|
||||||
|
|
||||||
Glib::Dispatcher dp;
|
Glib::Dispatcher dp;
|
||||||
|
|
||||||
|
@ -23,36 +23,35 @@ class AModule : public IModule {
|
||||||
enum SCROLL_DIR { NONE, UP, DOWN, LEFT, RIGHT };
|
enum SCROLL_DIR { NONE, UP, DOWN, LEFT, RIGHT };
|
||||||
|
|
||||||
SCROLL_DIR getScrollDir(GdkEventScroll *e);
|
SCROLL_DIR getScrollDir(GdkEventScroll *e);
|
||||||
bool tooltipEnabled();
|
bool tooltipEnabled();
|
||||||
|
|
||||||
const std::string name_;
|
const std::string name_;
|
||||||
const Json::Value &config_;
|
const Json::Value &config_;
|
||||||
Gtk::EventBox event_box_;
|
Gtk::EventBox event_box_;
|
||||||
|
|
||||||
virtual bool handleToggle(GdkEventButton *const &ev);
|
virtual bool handleToggle(GdkEventButton *const &ev);
|
||||||
virtual bool handleScroll(GdkEventScroll *);
|
virtual bool handleScroll(GdkEventScroll *);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<int> pid_;
|
std::vector<int> pid_;
|
||||||
gdouble distance_scrolled_y_;
|
gdouble distance_scrolled_y_;
|
||||||
gdouble distance_scrolled_x_;
|
gdouble distance_scrolled_x_;
|
||||||
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"},
|
||||||
{std::make_pair(1, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click"},
|
{std::make_pair(1, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click"},
|
||||||
{std::make_pair(1, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click"},
|
{std::make_pair(1, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click"},
|
||||||
{std::make_pair(2, GdkEventType::GDK_BUTTON_PRESS), "on-click-middle"},
|
{std::make_pair(2, GdkEventType::GDK_BUTTON_PRESS), "on-click-middle"},
|
||||||
{std::make_pair(2, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-middle"},
|
{std::make_pair(2, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-middle"},
|
||||||
{std::make_pair(2, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-middle"},
|
{std::make_pair(2, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-middle"},
|
||||||
{std::make_pair(3, GdkEventType::GDK_BUTTON_PRESS), "on-click-right"},
|
{std::make_pair(3, GdkEventType::GDK_BUTTON_PRESS), "on-click-right"},
|
||||||
{std::make_pair(3, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-right"},
|
{std::make_pair(3, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-right"},
|
||||||
{std::make_pair(3, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-right"},
|
{std::make_pair(3, GdkEventType::GDK_3BUTTON_PRESS), "on-triple-click-right"},
|
||||||
{std::make_pair(8, GdkEventType::GDK_BUTTON_PRESS), "on-click-backward"},
|
{std::make_pair(8, GdkEventType::GDK_BUTTON_PRESS), "on-click-backward"},
|
||||||
{std::make_pair(8, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-backward"},
|
{std::make_pair(8, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-backward"},
|
||||||
{std::make_pair(8, GdkEventType::GDK_2BUTTON_PRESS), "on-triple-click-backward"},
|
{std::make_pair(8, GdkEventType::GDK_2BUTTON_PRESS), "on-triple-click-backward"},
|
||||||
{std::make_pair(9, GdkEventType::GDK_BUTTON_PRESS), "on-click-forward"},
|
{std::make_pair(9, GdkEventType::GDK_BUTTON_PRESS), "on-click-forward"},
|
||||||
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-forward"},
|
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-double-click-forward"},
|
||||||
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-triple-click-forward"}
|
{std::make_pair(9, GdkEventType::GDK_2BUTTON_PRESS), "on-triple-click-forward"}};
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
|
|
@ -7,8 +7,8 @@ namespace waybar {
|
||||||
class IModule {
|
class IModule {
|
||||||
public:
|
public:
|
||||||
virtual ~IModule() = default;
|
virtual ~IModule() = default;
|
||||||
virtual auto update() -> void = 0;
|
virtual auto update() -> void = 0;
|
||||||
virtual operator Gtk::Widget &() = 0;
|
virtual operator Gtk::Widget&() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
|
|
@ -19,8 +19,8 @@ namespace waybar {
|
||||||
class Factory;
|
class Factory;
|
||||||
struct waybar_output {
|
struct waybar_output {
|
||||||
Glib::RefPtr<Gdk::Monitor> monitor;
|
Glib::RefPtr<Gdk::Monitor> monitor;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string identifier;
|
std::string identifier;
|
||||||
|
|
||||||
std::unique_ptr<struct zxdg_output_v1, decltype(&zxdg_output_v1_destroy)> xdg_output = {
|
std::unique_ptr<struct zxdg_output_v1, decltype(&zxdg_output_v1_destroy)> xdg_output = {
|
||||||
nullptr, &zxdg_output_v1_destroy};
|
nullptr, &zxdg_output_v1_destroy};
|
||||||
|
@ -41,9 +41,9 @@ struct bar_margins {
|
||||||
|
|
||||||
struct bar_mode {
|
struct bar_mode {
|
||||||
bar_layer layer;
|
bar_layer layer;
|
||||||
bool exclusive;
|
bool exclusive;
|
||||||
bool passthrough;
|
bool passthrough;
|
||||||
bool visible;
|
bool visible;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef HAVE_SWAY
|
#ifdef HAVE_SWAY
|
||||||
|
@ -71,7 +71,7 @@ class BarSurface {
|
||||||
class Bar {
|
class Bar {
|
||||||
public:
|
public:
|
||||||
using bar_mode_map = std::map<std::string_view, struct bar_mode>;
|
using bar_mode_map = std::map<std::string_view, struct bar_mode>;
|
||||||
static const bar_mode_map PRESET_MODES;
|
static const bar_mode_map PRESET_MODES;
|
||||||
static const std::string_view MODE_DEFAULT;
|
static const std::string_view MODE_DEFAULT;
|
||||||
static const std::string_view MODE_INVISIBLE;
|
static const std::string_view MODE_INVISIBLE;
|
||||||
|
|
||||||
|
@ -85,11 +85,11 @@ class Bar {
|
||||||
void handleSignal(int);
|
void handleSignal(int);
|
||||||
|
|
||||||
struct waybar_output *output;
|
struct waybar_output *output;
|
||||||
Json::Value config;
|
Json::Value config;
|
||||||
struct wl_surface *surface;
|
struct wl_surface *surface;
|
||||||
bool visible = true;
|
bool visible = true;
|
||||||
bool vertical = false;
|
bool vertical = false;
|
||||||
Gtk::Window window;
|
Gtk::Window window;
|
||||||
|
|
||||||
#ifdef HAVE_SWAY
|
#ifdef HAVE_SWAY
|
||||||
std::string bar_id;
|
std::string bar_id;
|
||||||
|
@ -98,20 +98,20 @@ class Bar {
|
||||||
private:
|
private:
|
||||||
void onMap(GdkEventAny *);
|
void onMap(GdkEventAny *);
|
||||||
auto setupWidgets() -> void;
|
auto setupWidgets() -> void;
|
||||||
void getModules(const Factory &, const std::string &, Gtk::Box*);
|
void getModules(const Factory &, const std::string &, Gtk::Box *);
|
||||||
void setupAltFormatKeyForModule(const std::string &module_name);
|
void setupAltFormatKeyForModule(const std::string &module_name);
|
||||||
void setupAltFormatKeyForModuleList(const char *module_list_name);
|
void setupAltFormatKeyForModuleList(const char *module_list_name);
|
||||||
void setMode(const bar_mode &);
|
void setMode(const bar_mode &);
|
||||||
|
|
||||||
/* Copy initial set of modes to allow customization */
|
/* Copy initial set of modes to allow customization */
|
||||||
bar_mode_map configured_modes = PRESET_MODES;
|
bar_mode_map configured_modes = PRESET_MODES;
|
||||||
std::string last_mode_{MODE_DEFAULT};
|
std::string last_mode_{MODE_DEFAULT};
|
||||||
|
|
||||||
std::unique_ptr<BarSurface> surface_impl_;
|
std::unique_ptr<BarSurface> surface_impl_;
|
||||||
Gtk::Box left_;
|
Gtk::Box left_;
|
||||||
Gtk::Box center_;
|
Gtk::Box center_;
|
||||||
Gtk::Box right_;
|
Gtk::Box right_;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
std::vector<std::shared_ptr<waybar::AModule>> modules_left_;
|
std::vector<std::shared_ptr<waybar::AModule>> modules_left_;
|
||||||
std::vector<std::shared_ptr<waybar::AModule>> modules_center_;
|
std::vector<std::shared_ptr<waybar::AModule>> modules_center_;
|
||||||
std::vector<std::shared_ptr<waybar::AModule>> modules_right_;
|
std::vector<std::shared_ptr<waybar::AModule>> modules_right_;
|
||||||
|
|
|
@ -17,27 +17,27 @@ namespace waybar {
|
||||||
class Client {
|
class Client {
|
||||||
public:
|
public:
|
||||||
static Client *inst();
|
static Client *inst();
|
||||||
int main(int argc, char *argv[]);
|
int main(int argc, char *argv[]);
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
Glib::RefPtr<Gtk::Application> gtk_app;
|
Glib::RefPtr<Gtk::Application> gtk_app;
|
||||||
Glib::RefPtr<Gdk::Display> gdk_display;
|
Glib::RefPtr<Gdk::Display> gdk_display;
|
||||||
struct wl_display * wl_display = nullptr;
|
struct wl_display *wl_display = nullptr;
|
||||||
struct wl_registry * registry = nullptr;
|
struct wl_registry *registry = nullptr;
|
||||||
struct zwlr_layer_shell_v1 * layer_shell = nullptr;
|
struct zwlr_layer_shell_v1 *layer_shell = nullptr;
|
||||||
struct zxdg_output_manager_v1 * xdg_output_manager = nullptr;
|
struct zxdg_output_manager_v1 *xdg_output_manager = nullptr;
|
||||||
struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = nullptr;
|
struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = nullptr;
|
||||||
std::vector<std::unique_ptr<Bar>> bars;
|
std::vector<std::unique_ptr<Bar>> bars;
|
||||||
Config config;
|
Config config;
|
||||||
std::string bar_id;
|
std::string bar_id;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Client() = default;
|
Client() = default;
|
||||||
const std::string getStyle(const std::string &style);
|
const std::string getStyle(const std::string &style);
|
||||||
void bindInterfaces();
|
void bindInterfaces();
|
||||||
void handleOutput(struct waybar_output &output);
|
void handleOutput(struct waybar_output &output);
|
||||||
auto setupCss(const std::string &css_file) -> void;
|
auto setupCss(const std::string &css_file) -> void;
|
||||||
struct waybar_output & getOutput(void *);
|
struct waybar_output &getOutput(void *);
|
||||||
std::vector<Json::Value> getOutputConfigs(struct waybar_output &output);
|
std::vector<Json::Value> getOutputConfigs(struct waybar_output &output);
|
||||||
|
|
||||||
static void handleGlobal(void *data, struct wl_registry *registry, uint32_t name,
|
static void handleGlobal(void *data, struct wl_registry *registry, uint32_t name,
|
||||||
|
@ -46,12 +46,12 @@ class Client {
|
||||||
static void handleOutputDone(void *, struct zxdg_output_v1 *);
|
static void handleOutputDone(void *, struct zxdg_output_v1 *);
|
||||||
static void handleOutputName(void *, struct zxdg_output_v1 *, const char *);
|
static void handleOutputName(void *, struct zxdg_output_v1 *, const char *);
|
||||||
static void handleOutputDescription(void *, struct zxdg_output_v1 *, const char *);
|
static void handleOutputDescription(void *, struct zxdg_output_v1 *, const char *);
|
||||||
void handleMonitorAdded(Glib::RefPtr<Gdk::Monitor> monitor);
|
void handleMonitorAdded(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
void handleMonitorRemoved(Glib::RefPtr<Gdk::Monitor> monitor);
|
void handleMonitorRemoved(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
void handleDeferredMonitorRemoval(Glib::RefPtr<Gdk::Monitor> monitor);
|
void handleDeferredMonitorRemoval(Glib::RefPtr<Gdk::Monitor> monitor);
|
||||||
|
|
||||||
Glib::RefPtr<Gtk::StyleContext> style_context_;
|
Glib::RefPtr<Gtk::StyleContext> style_context_;
|
||||||
Glib::RefPtr<Gtk::CssProvider> css_provider_;
|
Glib::RefPtr<Gtk::CssProvider> css_provider_;
|
||||||
std::list<struct waybar_output> outputs_;
|
std::list<struct waybar_output> outputs_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
#include "modules/simpleclock.hpp"
|
#include "modules/simpleclock.hpp"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SWAY
|
#ifdef HAVE_SWAY
|
||||||
|
#include "modules/sway/language.hpp"
|
||||||
#include "modules/sway/mode.hpp"
|
#include "modules/sway/mode.hpp"
|
||||||
#include "modules/sway/window.hpp"
|
#include "modules/sway/window.hpp"
|
||||||
#include "modules/sway/workspaces.hpp"
|
#include "modules/sway/workspaces.hpp"
|
||||||
#include "modules/sway/language.hpp"
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_WLR
|
#ifdef HAVE_WLR
|
||||||
#include "modules/wlr/taskbar.hpp"
|
#include "modules/wlr/taskbar.hpp"
|
||||||
|
@ -61,9 +61,9 @@
|
||||||
#include "modules/custom.hpp"
|
#include "modules/custom.hpp"
|
||||||
#include "modules/temperature.hpp"
|
#include "modules/temperature.hpp"
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
# ifdef WANT_RFKILL
|
#ifdef WANT_RFKILL
|
||||||
# include "modules/bluetooth.hpp"
|
#include "modules/bluetooth.hpp"
|
||||||
# endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
@ -74,7 +74,7 @@ class Factory {
|
||||||
AModule* makeModule(const std::string& name) const;
|
AModule* makeModule(const std::string& name) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
const Json::Value& config_;
|
const Json::Value& config_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <gtkmm/widget.h>
|
|
||||||
#include <gtkmm/box.h>
|
#include <gtkmm/box.h>
|
||||||
|
#include <gtkmm/widget.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "factory.hpp"
|
#include "factory.hpp"
|
||||||
|
@ -14,7 +15,7 @@ class Group : public AModule {
|
||||||
Group(const std::string&, const Bar&, const Json::Value&);
|
Group(const std::string&, const Bar&, const Json::Value&);
|
||||||
~Group() = default;
|
~Group() = default;
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
operator Gtk::Widget &();
|
operator Gtk::Widget&();
|
||||||
Gtk::Box box;
|
Gtk::Box box;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -19,19 +19,19 @@ class Backlight : public ALabel {
|
||||||
public:
|
public:
|
||||||
BacklightDev() = default;
|
BacklightDev() = default;
|
||||||
BacklightDev(std::string name, int actual, int max);
|
BacklightDev(std::string name, int actual, int max);
|
||||||
std::string_view name() const;
|
std::string_view name() const;
|
||||||
int get_actual() const;
|
int get_actual() const;
|
||||||
void set_actual(int actual);
|
void set_actual(int actual);
|
||||||
int get_max() const;
|
int get_max() const;
|
||||||
void set_max(int max);
|
void set_max(int max);
|
||||||
friend inline bool operator==(const BacklightDev &lhs, const BacklightDev &rhs) {
|
friend inline bool operator==(const BacklightDev &lhs, const BacklightDev &rhs) {
|
||||||
return lhs.name_ == rhs.name_ && lhs.actual_ == rhs.actual_ && lhs.max_ == rhs.max_;
|
return lhs.name_ == rhs.name_ && lhs.actual_ == rhs.actual_ && lhs.max_ == rhs.max_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
int actual_ = 1;
|
int actual_ = 1;
|
||||||
int max_ = 1;
|
int max_ = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -47,13 +47,13 @@ class Backlight : public ALabel {
|
||||||
template <class ForwardIt, class Inserter>
|
template <class ForwardIt, class Inserter>
|
||||||
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
||||||
|
|
||||||
const std::string preferred_device_;
|
const std::string preferred_device_;
|
||||||
static constexpr int EPOLL_MAX_EVENTS = 16;
|
static constexpr int EPOLL_MAX_EVENTS = 16;
|
||||||
|
|
||||||
std::optional<BacklightDev> previous_best_;
|
std::optional<BacklightDev> previous_best_;
|
||||||
std::string previous_format_;
|
std::string previous_format_;
|
||||||
|
|
||||||
std::mutex udev_thread_mutex_;
|
std::mutex udev_thread_mutex_;
|
||||||
std::vector<BacklightDev> devices_;
|
std::vector<BacklightDev> devices_;
|
||||||
// thread must destruct before shared data
|
// thread must destruct before shared data
|
||||||
util::SleeperThread udev_thread_;
|
util::SleeperThread udev_thread_;
|
||||||
|
|
|
@ -7,10 +7,12 @@
|
||||||
#endif
|
#endif
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <sys/inotify.h>
|
#include <sys/inotify.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
@ -31,23 +33,23 @@ class Battery : public ALabel {
|
||||||
private:
|
private:
|
||||||
static inline const fs::path data_dir_ = "/sys/class/power_supply/";
|
static inline const fs::path data_dir_ = "/sys/class/power_supply/";
|
||||||
|
|
||||||
void refreshBatteries();
|
void refreshBatteries();
|
||||||
void worker();
|
void worker();
|
||||||
const std::string getAdapterStatus(uint8_t capacity) const;
|
const std::string getAdapterStatus(uint8_t capacity) const;
|
||||||
const std::tuple<uint8_t, float, std::string, float> getInfos();
|
const std::tuple<uint8_t, float, std::string, float> getInfos();
|
||||||
const std::string formatTimeRemaining(float hoursRemaining);
|
const std::string formatTimeRemaining(float hoursRemaining);
|
||||||
|
|
||||||
int global_watch;
|
int global_watch;
|
||||||
std::map<fs::path,int> batteries_;
|
std::map<fs::path, int> batteries_;
|
||||||
fs::path adapter_;
|
fs::path adapter_;
|
||||||
int battery_watch_fd_;
|
int battery_watch_fd_;
|
||||||
int global_watch_fd_;
|
int global_watch_fd_;
|
||||||
std::mutex battery_list_mutex_;
|
std::mutex battery_list_mutex_;
|
||||||
std::string old_status_;
|
std::string old_status_;
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
util::SleeperThread thread_battery_update_;
|
util::SleeperThread thread_battery_update_;
|
||||||
util::SleeperThread thread_timer_;
|
util::SleeperThread thread_timer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <date/tz.h>
|
#include <date/tz.h>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
@ -24,7 +25,7 @@ class Clock : public ALabel {
|
||||||
std::locale locale_;
|
std::locale locale_;
|
||||||
std::vector<const date::time_zone*> time_zones_;
|
std::vector<const date::time_zone*> time_zones_;
|
||||||
int current_time_zone_idx_;
|
int current_time_zone_idx_;
|
||||||
date::year_month_day cached_calendar_ymd_ = date::January/1/0;
|
date::year_month_day cached_calendar_ymd_ = date::January / 1 / 0;
|
||||||
std::string cached_calendar_text_;
|
std::string cached_calendar_text_;
|
||||||
bool is_calendar_in_tooltip_;
|
bool is_calendar_in_tooltip_;
|
||||||
bool is_timezoned_list_in_tooltip_;
|
bool is_timezoned_list_in_tooltip_;
|
||||||
|
@ -38,7 +39,7 @@ class Clock : public ALabel {
|
||||||
auto print_iso_weeknum(std::ostream& os,
|
auto print_iso_weeknum(std::ostream& os,
|
||||||
int weeknum) -> void;
|
int weeknum) -> void;
|
||||||
bool is_timezone_fixed();
|
bool is_timezone_fixed();
|
||||||
auto timezones_text(std::chrono::system_clock::time_point *now) -> std::string;
|
auto timezones_text(std::chrono::system_clock::time_point* now) -> std::string;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace modules
|
} // namespace modules
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
@ -19,11 +21,11 @@ class Cpu : public ALabel {
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double getCpuLoad();
|
double getCpuLoad();
|
||||||
std::tuple<std::vector<uint16_t>, std::string> getCpuUsage();
|
std::tuple<std::vector<uint16_t>, std::string> getCpuUsage();
|
||||||
std::tuple<float, float, float> getCpuFrequency();
|
std::tuple<float, float, float> getCpuFrequency();
|
||||||
std::vector<std::tuple<size_t, size_t>> parseCpuinfo();
|
std::vector<std::tuple<size_t, size_t>> parseCpuinfo();
|
||||||
std::vector<float> parseCpuFrequencies();
|
std::vector<float> parseCpuFrequencies();
|
||||||
|
|
||||||
std::vector<std::tuple<size_t, size_t>> prev_times_;
|
std::vector<std::tuple<size_t, size_t>> prev_times_;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/command.hpp"
|
#include "util/command.hpp"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
|
@ -26,16 +28,16 @@ class Custom : public ALabel {
|
||||||
bool handleScroll(GdkEventScroll* e);
|
bool handleScroll(GdkEventScroll* e);
|
||||||
bool handleToggle(GdkEventButton* const& e);
|
bool handleToggle(GdkEventButton* const& e);
|
||||||
|
|
||||||
const std::string name_;
|
const std::string name_;
|
||||||
std::string text_;
|
std::string text_;
|
||||||
std::string alt_;
|
std::string alt_;
|
||||||
std::string tooltip_;
|
std::string tooltip_;
|
||||||
std::vector<std::string> class_;
|
std::vector<std::string> class_;
|
||||||
int percentage_;
|
int percentage_;
|
||||||
FILE* fp_;
|
FILE* fp_;
|
||||||
int pid_;
|
int pid_;
|
||||||
util::command::res output_;
|
util::command::res output_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <fstream>
|
|
||||||
#include <sys/statvfs.h>
|
#include <sys/statvfs.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
|
||||||
#include "util/format.hpp"
|
#include "util/format.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
|
@ -13,14 +14,14 @@ class IdleInhibitor : public ALabel {
|
||||||
~IdleInhibitor();
|
~IdleInhibitor();
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
static std::list<waybar::AModule*> modules;
|
static std::list<waybar::AModule*> modules;
|
||||||
static bool status;
|
static bool status;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool handleToggle(GdkEventButton* const& e);
|
bool handleToggle(GdkEventButton* const& e);
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
struct zwp_idle_inhibitor_v1* idle_inhibitor_;
|
struct zwp_idle_inhibitor_v1* idle_inhibitor_;
|
||||||
int pid_;
|
int pid_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
|
|
||||||
|
@ -19,9 +19,9 @@ class Inhibitor : public ALabel {
|
||||||
private:
|
private:
|
||||||
auto handleToggle(::GdkEventButton* const& e) -> bool;
|
auto handleToggle(::GdkEventButton* const& e) -> bool;
|
||||||
|
|
||||||
const std::unique_ptr<::GDBusConnection, void(*)(::GDBusConnection*)> dbus_;
|
const std::unique_ptr<::GDBusConnection, void (*)(::GDBusConnection*)> dbus_;
|
||||||
const std::string inhibitors_;
|
const std::string inhibitors_;
|
||||||
int handle_ = -1;
|
int handle_ = -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
|
|
@ -6,10 +6,11 @@
|
||||||
#else
|
#else
|
||||||
#include <fmt/chrono.h>
|
#include <fmt/chrono.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
#include <gtkmm/label.h>
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <libevdev/libevdev.h>
|
#include <libevdev/libevdev.h>
|
||||||
|
@ -24,10 +25,10 @@ class KeyboardState : public AModule {
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
Gtk::Label numlock_label_;
|
Gtk::Label numlock_label_;
|
||||||
Gtk::Label capslock_label_;
|
Gtk::Label capslock_label_;
|
||||||
Gtk::Label scrolllock_label_;
|
Gtk::Label scrolllock_label_;
|
||||||
|
|
||||||
std::string numlock_format_;
|
std::string numlock_format_;
|
||||||
std::string capslock_format_;
|
std::string capslock_format_;
|
||||||
|
@ -36,8 +37,8 @@ class KeyboardState : public AModule {
|
||||||
std::string icon_locked_;
|
std::string icon_locked_;
|
||||||
std::string icon_unlocked_;
|
std::string icon_unlocked_;
|
||||||
|
|
||||||
int fd_;
|
int fd_;
|
||||||
libevdev* dev_;
|
libevdev* dev_;
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
@ -15,7 +17,7 @@ class Memory : public ALabel {
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void parseMeminfo();
|
void parseMeminfo();
|
||||||
|
|
||||||
std::unordered_map<std::string, unsigned long> meminfo_;
|
std::unordered_map<std::string, unsigned long> meminfo_;
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,8 @@ class MPD : public ALabel {
|
||||||
|
|
||||||
// Not using unique_ptr since we don't manage the pointer
|
// Not using unique_ptr since we don't manage the pointer
|
||||||
// (It's either nullptr, or from the config)
|
// (It's either nullptr, or from the config)
|
||||||
const char* server_;
|
const char* server_;
|
||||||
const unsigned port_;
|
const unsigned port_;
|
||||||
const std::string password_;
|
const std::string password_;
|
||||||
|
|
||||||
unsigned timeout_;
|
unsigned timeout_;
|
||||||
|
@ -31,8 +31,8 @@ class MPD : public ALabel {
|
||||||
detail::unique_connection connection_;
|
detail::unique_connection connection_;
|
||||||
|
|
||||||
detail::unique_status status_;
|
detail::unique_status status_;
|
||||||
mpd_state state_;
|
mpd_state state_;
|
||||||
detail::unique_song song_;
|
detail::unique_song song_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MPD(const std::string&, const Json::Value&);
|
MPD(const std::string&, const Json::Value&);
|
||||||
|
@ -41,7 +41,7 @@ class MPD : public ALabel {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string getTag(mpd_tag_type type, unsigned idx = 0) const;
|
std::string getTag(mpd_tag_type type, unsigned idx = 0) const;
|
||||||
void setLabel();
|
void setLabel();
|
||||||
std::string getStateIcon() const;
|
std::string getStateIcon() const;
|
||||||
std::string getOptionIcon(std::string optionName, bool activated) const;
|
std::string getOptionIcon(std::string optionName, bool activated) const;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <mpd/client.h>
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
#include <mpd/client.h>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
@ -57,7 +57,7 @@ class State {
|
||||||
};
|
};
|
||||||
|
|
||||||
class Idle : public State {
|
class Idle : public State {
|
||||||
Context* const ctx_;
|
Context* const ctx_;
|
||||||
sigc::connection idle_connection_;
|
sigc::connection idle_connection_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -80,7 +80,7 @@ class Idle : public State {
|
||||||
};
|
};
|
||||||
|
|
||||||
class Playing : public State {
|
class Playing : public State {
|
||||||
Context* const ctx_;
|
Context* const ctx_;
|
||||||
sigc::connection timer_connection_;
|
sigc::connection timer_connection_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -102,7 +102,7 @@ class Playing : public State {
|
||||||
};
|
};
|
||||||
|
|
||||||
class Paused : public State {
|
class Paused : public State {
|
||||||
Context* const ctx_;
|
Context* const ctx_;
|
||||||
sigc::connection timer_connection_;
|
sigc::connection timer_connection_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -124,7 +124,7 @@ class Paused : public State {
|
||||||
};
|
};
|
||||||
|
|
||||||
class Stopped : public State {
|
class Stopped : public State {
|
||||||
Context* const ctx_;
|
Context* const ctx_;
|
||||||
sigc::connection timer_connection_;
|
sigc::connection timer_connection_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -146,7 +146,7 @@ class Stopped : public State {
|
||||||
};
|
};
|
||||||
|
|
||||||
class Disconnected : public State {
|
class Disconnected : public State {
|
||||||
Context* const ctx_;
|
Context* const ctx_;
|
||||||
sigc::connection timer_connection_;
|
sigc::connection timer_connection_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -170,7 +170,7 @@ class Disconnected : public State {
|
||||||
|
|
||||||
class Context {
|
class Context {
|
||||||
std::unique_ptr<State> state_;
|
std::unique_ptr<State> state_;
|
||||||
waybar::modules::MPD* mpd_module_;
|
waybar::modules::MPD* mpd_module_;
|
||||||
|
|
||||||
friend class State;
|
friend class State;
|
||||||
friend class Playing;
|
friend class Playing;
|
||||||
|
@ -188,18 +188,18 @@ class Context {
|
||||||
state_->entry();
|
state_->entry();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_connected() const;
|
bool is_connected() const;
|
||||||
bool is_playing() const;
|
bool is_playing() const;
|
||||||
bool is_paused() const;
|
bool is_paused() const;
|
||||||
bool is_stopped() const;
|
bool is_stopped() const;
|
||||||
constexpr std::size_t interval() const;
|
constexpr std::size_t interval() const;
|
||||||
void tryConnect() const;
|
void tryConnect() const;
|
||||||
void checkErrors(mpd_connection*) const;
|
void checkErrors(mpd_connection*) const;
|
||||||
void do_update();
|
void do_update();
|
||||||
void queryMPD() const;
|
void queryMPD() const;
|
||||||
void fetchState() const;
|
void fetchState() const;
|
||||||
constexpr mpd_state state() const;
|
constexpr mpd_state state() const;
|
||||||
void emit() const;
|
void emit() const;
|
||||||
[[nodiscard]] unique_connection& connection();
|
[[nodiscard]] unique_connection& connection();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -8,13 +8,11 @@ inline bool Context::is_paused() const { return mpd_module_->paused(); }
|
||||||
inline bool Context::is_stopped() const { return mpd_module_->stopped(); }
|
inline bool Context::is_stopped() const { return mpd_module_->stopped(); }
|
||||||
|
|
||||||
constexpr inline std::size_t Context::interval() const { return mpd_module_->interval_.count(); }
|
constexpr inline std::size_t Context::interval() const { return mpd_module_->interval_.count(); }
|
||||||
inline void Context::tryConnect() const { mpd_module_->tryConnect(); }
|
inline void Context::tryConnect() const { mpd_module_->tryConnect(); }
|
||||||
inline unique_connection& Context::connection() { return mpd_module_->connection_; }
|
inline unique_connection& Context::connection() { return mpd_module_->connection_; }
|
||||||
constexpr inline mpd_state Context::state() const { return mpd_module_->state_; }
|
constexpr inline mpd_state Context::state() const { return mpd_module_->state_; }
|
||||||
|
|
||||||
inline void Context::do_update() {
|
inline void Context::do_update() { mpd_module_->setLabel(); }
|
||||||
mpd_module_->setLabel();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void Context::checkErrors(mpd_connection* conn) const { mpd_module_->checkErrors(conn); }
|
inline void Context::checkErrors(mpd_connection* conn) const { mpd_module_->checkErrors(conn); }
|
||||||
inline void Context::queryMPD() const { mpd_module_->queryMPD(); }
|
inline void Context::queryMPD() const { mpd_module_->queryMPD(); }
|
||||||
|
|
|
@ -7,6 +7,9 @@
|
||||||
#include <netlink/genl/genl.h>
|
#include <netlink/genl/genl.h>
|
||||||
#include <netlink/netlink.h>
|
#include <netlink/netlink.h>
|
||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
#ifdef WANT_RFKILL
|
#ifdef WANT_RFKILL
|
||||||
|
@ -31,51 +34,51 @@ class Network : public ALabel {
|
||||||
|
|
||||||
void askForStateDump(void);
|
void askForStateDump(void);
|
||||||
|
|
||||||
void worker();
|
void worker();
|
||||||
void createInfoSocket();
|
void createInfoSocket();
|
||||||
void createEventSocket();
|
void createEventSocket();
|
||||||
void parseEssid(struct nlattr**);
|
void parseEssid(struct nlattr**);
|
||||||
void parseSignal(struct nlattr**);
|
void parseSignal(struct nlattr**);
|
||||||
void parseFreq(struct nlattr**);
|
void parseFreq(struct nlattr**);
|
||||||
bool associatedOrJoined(struct nlattr**);
|
bool associatedOrJoined(struct nlattr**);
|
||||||
bool checkInterface(std::string name);
|
bool checkInterface(std::string name);
|
||||||
auto getInfo() -> void;
|
auto getInfo() -> void;
|
||||||
const std::string getNetworkState() const;
|
const std::string getNetworkState() const;
|
||||||
void clearIface();
|
void clearIface();
|
||||||
bool wildcardMatch(const std::string& pattern, const std::string& text) const;
|
bool wildcardMatch(const std::string& pattern, const std::string& text) const;
|
||||||
std::optional<std::pair<unsigned long long, unsigned long long>> readBandwidthUsage();
|
std::optional<std::pair<unsigned long long, unsigned long long>> readBandwidthUsage();
|
||||||
|
|
||||||
int ifid_;
|
int ifid_;
|
||||||
sa_family_t family_;
|
sa_family_t family_;
|
||||||
struct sockaddr_nl nladdr_ = {0};
|
struct sockaddr_nl nladdr_ = {0};
|
||||||
struct nl_sock* sock_ = nullptr;
|
struct nl_sock* sock_ = nullptr;
|
||||||
struct nl_sock* ev_sock_ = nullptr;
|
struct nl_sock* ev_sock_ = nullptr;
|
||||||
int efd_;
|
int efd_;
|
||||||
int ev_fd_;
|
int ev_fd_;
|
||||||
int nl80211_id_;
|
int nl80211_id_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
|
|
||||||
bool want_route_dump_;
|
bool want_route_dump_;
|
||||||
bool want_link_dump_;
|
bool want_link_dump_;
|
||||||
bool want_addr_dump_;
|
bool want_addr_dump_;
|
||||||
bool dump_in_progress_;
|
bool dump_in_progress_;
|
||||||
|
|
||||||
unsigned long long bandwidth_down_total_;
|
unsigned long long bandwidth_down_total_;
|
||||||
unsigned long long bandwidth_up_total_;
|
unsigned long long bandwidth_up_total_;
|
||||||
|
|
||||||
std::string state_;
|
std::string state_;
|
||||||
std::string essid_;
|
std::string essid_;
|
||||||
bool carrier_;
|
bool carrier_;
|
||||||
std::string ifname_;
|
std::string ifname_;
|
||||||
std::string ipaddr_;
|
std::string ipaddr_;
|
||||||
std::string gwaddr_;
|
std::string gwaddr_;
|
||||||
std::string netmask_;
|
std::string netmask_;
|
||||||
int cidr_;
|
int cidr_;
|
||||||
int32_t signal_strength_dbm_;
|
int32_t signal_strength_dbm_;
|
||||||
uint8_t signal_strength_;
|
uint8_t signal_strength_;
|
||||||
std::string signal_strength_app_;
|
std::string signal_strength_app_;
|
||||||
float frequency_;
|
float frequency_;
|
||||||
uint32_t route_priority;
|
uint32_t route_priority;
|
||||||
|
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
util::SleeperThread thread_timer_;
|
util::SleeperThread thread_timer_;
|
||||||
|
|
|
@ -3,8 +3,10 @@
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <pulse/pulseaudio.h>
|
#include <pulse/pulseaudio.h>
|
||||||
#include <pulse/volume.h>
|
#include <pulse/volume.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
@ -23,27 +25,27 @@ class Pulseaudio : public ALabel {
|
||||||
static void serverInfoCb(pa_context*, const pa_server_info*, void*);
|
static void serverInfoCb(pa_context*, const pa_server_info*, void*);
|
||||||
static void volumeModifyCb(pa_context*, int, void*);
|
static void volumeModifyCb(pa_context*, int, void*);
|
||||||
|
|
||||||
bool handleScroll(GdkEventScroll* e);
|
bool handleScroll(GdkEventScroll* e);
|
||||||
const std::vector<std::string> getPulseIcon() const;
|
const std::vector<std::string> getPulseIcon() const;
|
||||||
|
|
||||||
pa_threaded_mainloop* mainloop_;
|
pa_threaded_mainloop* mainloop_;
|
||||||
pa_mainloop_api* mainloop_api_;
|
pa_mainloop_api* mainloop_api_;
|
||||||
pa_context* context_;
|
pa_context* context_;
|
||||||
// SINK
|
// SINK
|
||||||
uint32_t sink_idx_{0};
|
uint32_t sink_idx_{0};
|
||||||
uint16_t volume_;
|
uint16_t volume_;
|
||||||
pa_cvolume pa_volume_;
|
pa_cvolume pa_volume_;
|
||||||
bool muted_;
|
bool muted_;
|
||||||
std::string port_name_;
|
std::string port_name_;
|
||||||
std::string form_factor_;
|
std::string form_factor_;
|
||||||
std::string desc_;
|
std::string desc_;
|
||||||
std::string monitor_;
|
std::string monitor_;
|
||||||
std::string current_sink_name_;
|
std::string current_sink_name_;
|
||||||
bool current_sink_running_;
|
bool current_sink_running_;
|
||||||
// SOURCE
|
// SOURCE
|
||||||
uint32_t source_idx_{0};
|
uint32_t source_idx_{0};
|
||||||
uint16_t source_volume_;
|
uint16_t source_volume_;
|
||||||
bool source_muted_;
|
bool source_muted_;
|
||||||
std::string source_port_name_;
|
std::string source_port_name_;
|
||||||
std::string source_desc_;
|
std::string source_desc_;
|
||||||
std::string default_source_name_;
|
std::string default_source_name_;
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "river-status-unstable-v1-client-protocol.h"
|
|
||||||
#include "river-control-unstable-v1-client-protocol.h"
|
#include "river-control-unstable-v1-client-protocol.h"
|
||||||
|
#include "river-status-unstable-v1-client-protocol.h"
|
||||||
#include "xdg-output-unstable-v1-client-protocol.h"
|
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
namespace waybar::modules::river {
|
namespace waybar::modules::river {
|
||||||
|
@ -29,8 +29,8 @@ class Tags : public waybar::AModule {
|
||||||
struct wl_seat *seat_;
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const waybar::Bar & bar_;
|
const waybar::Bar &bar_;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
std::vector<Gtk::Button> buttons_;
|
std::vector<Gtk::Button> buttons_;
|
||||||
struct zriver_output_status_v1 *output_status_;
|
struct zriver_output_status_v1 *output_status_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <sndio.h>
|
#include <sndio.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
@ -9,13 +11,13 @@ namespace waybar::modules {
|
||||||
|
|
||||||
class Sndio : public ALabel {
|
class Sndio : public ALabel {
|
||||||
public:
|
public:
|
||||||
Sndio(const std::string&, const Json::Value&);
|
Sndio(const std::string &, const Json::Value &);
|
||||||
~Sndio();
|
~Sndio();
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
auto set_desc(struct sioctl_desc *, unsigned int) -> void;
|
auto set_desc(struct sioctl_desc *, unsigned int) -> void;
|
||||||
auto put_val(unsigned int, unsigned int) -> void;
|
auto put_val(unsigned int, unsigned int) -> void;
|
||||||
bool handleScroll(GdkEventScroll *);
|
bool handleScroll(GdkEventScroll *);
|
||||||
bool handleToggle(GdkEventButton* const&);
|
bool handleToggle(GdkEventButton *const &);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
auto connect_to_sndio() -> void;
|
auto connect_to_sndio() -> void;
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
#include <giomm.h>
|
#include <giomm.h>
|
||||||
#include <glibmm/refptr.h>
|
#include <glibmm/refptr.h>
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "modules/sni/item.hpp"
|
#include "modules/sni/item.hpp"
|
||||||
|
|
||||||
|
@ -18,27 +20,27 @@ class Host {
|
||||||
~Host();
|
~Host();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void busAcquired(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
void busAcquired(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
||||||
void nameAppeared(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring,
|
void nameAppeared(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring,
|
||||||
const Glib::ustring&);
|
const Glib::ustring&);
|
||||||
void nameVanished(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
void nameVanished(const Glib::RefPtr<Gio::DBus::Connection>&, Glib::ustring);
|
||||||
static void proxyReady(GObject*, GAsyncResult*, gpointer);
|
static void proxyReady(GObject*, GAsyncResult*, gpointer);
|
||||||
static void registerHost(GObject*, GAsyncResult*, gpointer);
|
static void registerHost(GObject*, GAsyncResult*, gpointer);
|
||||||
static void itemRegistered(SnWatcher*, const gchar*, gpointer);
|
static void itemRegistered(SnWatcher*, const gchar*, gpointer);
|
||||||
static void itemUnregistered(SnWatcher*, const gchar*, gpointer);
|
static void itemUnregistered(SnWatcher*, const gchar*, gpointer);
|
||||||
|
|
||||||
std::tuple<std::string, std::string> getBusNameAndObjectPath(const std::string);
|
std::tuple<std::string, std::string> getBusNameAndObjectPath(const std::string);
|
||||||
void addRegisteredItem(std::string service);
|
void addRegisteredItem(std::string service);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Item>> items_;
|
std::vector<std::unique_ptr<Item>> items_;
|
||||||
const std::string bus_name_;
|
const std::string bus_name_;
|
||||||
const std::string object_path_;
|
const std::string object_path_;
|
||||||
std::size_t bus_name_id_;
|
std::size_t bus_name_id_;
|
||||||
std::size_t watcher_id_;
|
std::size_t watcher_id_;
|
||||||
GCancellable* cancellable_ = nullptr;
|
GCancellable* cancellable_ = nullptr;
|
||||||
SnWatcher* watcher_ = nullptr;
|
SnWatcher* watcher_ = nullptr;
|
||||||
const Json::Value& config_;
|
const Json::Value& config_;
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
const std::function<void(std::unique_ptr<Item>&)> on_add_;
|
const std::function<void(std::unique_ptr<Item>&)> on_add_;
|
||||||
const std::function<void(std::unique_ptr<Item>&)> on_remove_;
|
const std::function<void(std::unique_ptr<Item>&)> on_remove_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -31,25 +31,25 @@ class Item : public sigc::trackable {
|
||||||
std::string bus_name;
|
std::string bus_name;
|
||||||
std::string object_path;
|
std::string object_path;
|
||||||
|
|
||||||
int icon_size;
|
int icon_size;
|
||||||
int effective_icon_size;
|
int effective_icon_size;
|
||||||
Gtk::Image image;
|
Gtk::Image image;
|
||||||
Gtk::EventBox event_box;
|
Gtk::EventBox event_box;
|
||||||
std::string category;
|
std::string category;
|
||||||
std::string id;
|
std::string id;
|
||||||
|
|
||||||
std::string title;
|
std::string title;
|
||||||
std::string icon_name;
|
std::string icon_name;
|
||||||
Glib::RefPtr<Gdk::Pixbuf> icon_pixmap;
|
Glib::RefPtr<Gdk::Pixbuf> icon_pixmap;
|
||||||
Glib::RefPtr<Gtk::IconTheme> icon_theme;
|
Glib::RefPtr<Gtk::IconTheme> icon_theme;
|
||||||
std::string overlay_icon_name;
|
std::string overlay_icon_name;
|
||||||
std::string attention_icon_name;
|
std::string attention_icon_name;
|
||||||
std::string attention_movie_name;
|
std::string attention_movie_name;
|
||||||
std::string icon_theme_path;
|
std::string icon_theme_path;
|
||||||
std::string menu;
|
std::string menu;
|
||||||
ToolTip tooltip;
|
ToolTip tooltip;
|
||||||
DbusmenuGtkMenu* dbus_menu = nullptr;
|
DbusmenuGtkMenu* dbus_menu = nullptr;
|
||||||
Gtk::Menu* gtk_menu = nullptr;
|
Gtk::Menu* gtk_menu = nullptr;
|
||||||
/**
|
/**
|
||||||
* ItemIsMenu flag means that the item only supports the context menu.
|
* ItemIsMenu flag means that the item only supports the context menu.
|
||||||
* Default value is true because libappindicator supports neither ItemIsMenu nor Activate method
|
* Default value is true because libappindicator supports neither ItemIsMenu nor Activate method
|
||||||
|
@ -67,15 +67,15 @@ class Item : public sigc::trackable {
|
||||||
void onSignal(const Glib::ustring& sender_name, const Glib::ustring& signal_name,
|
void onSignal(const Glib::ustring& sender_name, const Glib::ustring& signal_name,
|
||||||
const Glib::VariantContainerBase& arguments);
|
const Glib::VariantContainerBase& arguments);
|
||||||
|
|
||||||
void updateImage();
|
void updateImage();
|
||||||
Glib::RefPtr<Gdk::Pixbuf> extractPixBuf(GVariant* variant);
|
Glib::RefPtr<Gdk::Pixbuf> extractPixBuf(GVariant* variant);
|
||||||
Glib::RefPtr<Gdk::Pixbuf> getIconPixbuf();
|
Glib::RefPtr<Gdk::Pixbuf> getIconPixbuf();
|
||||||
Glib::RefPtr<Gdk::Pixbuf> getIconByName(const std::string& name, int size);
|
Glib::RefPtr<Gdk::Pixbuf> getIconByName(const std::string& name, int size);
|
||||||
double getScaledIconSize();
|
double getScaledIconSize();
|
||||||
static void onMenuDestroyed(Item* self, GObject* old_menu_pointer);
|
static void onMenuDestroyed(Item* self, GObject* old_menu_pointer);
|
||||||
void makeMenu();
|
void makeMenu();
|
||||||
bool handleClick(GdkEventButton* const& /*ev*/);
|
bool handleClick(GdkEventButton* const& /*ev*/);
|
||||||
bool handleScroll(GdkEventScroll* const&);
|
bool handleScroll(GdkEventScroll* const&);
|
||||||
|
|
||||||
// smooth scrolling threshold
|
// smooth scrolling threshold
|
||||||
gdouble scroll_threshold_ = 0;
|
gdouble scroll_threshold_ = 0;
|
||||||
|
@ -86,7 +86,7 @@ class Item : public sigc::trackable {
|
||||||
|
|
||||||
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
|
Glib::RefPtr<Gio::DBus::Proxy> proxy_;
|
||||||
Glib::RefPtr<Gio::Cancellable> cancellable_;
|
Glib::RefPtr<Gio::Cancellable> cancellable_;
|
||||||
std::set<std::string_view> update_pending_;
|
std::set<std::string_view> update_pending_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::SNI
|
} // namespace waybar::modules::SNI
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "modules/sni/host.hpp"
|
#include "modules/sni/host.hpp"
|
||||||
|
@ -20,9 +21,9 @@ class Tray : public AModule {
|
||||||
void onRemove(std::unique_ptr<Item>& item);
|
void onRemove(std::unique_ptr<Item>& item);
|
||||||
|
|
||||||
static inline std::size_t nb_hosts_ = 0;
|
static inline std::size_t nb_hosts_ = 0;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
SNI::Watcher::singleton watcher_;
|
SNI::Watcher::singleton watcher_;
|
||||||
SNI::Host host_;
|
SNI::Host host_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::SNI
|
} // namespace waybar::modules::SNI
|
||||||
|
|
|
@ -30,26 +30,26 @@ class Watcher {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GfWatchType type;
|
GfWatchType type;
|
||||||
Watcher * watcher;
|
Watcher *watcher;
|
||||||
gchar * service;
|
gchar *service;
|
||||||
gchar * bus_name;
|
gchar *bus_name;
|
||||||
gchar * object_path;
|
gchar *object_path;
|
||||||
guint watch_id;
|
guint watch_id;
|
||||||
} GfWatch;
|
} GfWatch;
|
||||||
|
|
||||||
void busAcquired(const Glib::RefPtr<Gio::DBus::Connection> &, Glib::ustring);
|
void busAcquired(const Glib::RefPtr<Gio::DBus::Connection> &, Glib::ustring);
|
||||||
static gboolean handleRegisterHost(Watcher *, GDBusMethodInvocation *, const gchar *);
|
static gboolean handleRegisterHost(Watcher *, GDBusMethodInvocation *, const gchar *);
|
||||||
static gboolean handleRegisterItem(Watcher *, GDBusMethodInvocation *, const gchar *);
|
static gboolean handleRegisterItem(Watcher *, GDBusMethodInvocation *, const gchar *);
|
||||||
static GfWatch *gfWatchFind(GSList *list, const gchar *bus_name, const gchar *object_path);
|
static GfWatch *gfWatchFind(GSList *list, const gchar *bus_name, const gchar *object_path);
|
||||||
static GfWatch *gfWatchNew(GfWatchType, const gchar *, const gchar *, const gchar *, Watcher *);
|
static GfWatch *gfWatchNew(GfWatchType, const gchar *, const gchar *, const gchar *, Watcher *);
|
||||||
static void nameVanished(GDBusConnection *connection, const char *name, gpointer data);
|
static void nameVanished(GDBusConnection *connection, const char *name, gpointer data);
|
||||||
static void gfWatchFree(gpointer data);
|
static void gfWatchFree(gpointer data);
|
||||||
|
|
||||||
void updateRegisteredItems(SnWatcher *obj);
|
void updateRegisteredItems(SnWatcher *obj);
|
||||||
|
|
||||||
uint32_t bus_name_id_;
|
uint32_t bus_name_id_;
|
||||||
GSList * hosts_ = nullptr;
|
GSList *hosts_ = nullptr;
|
||||||
GSList * items_ = nullptr;
|
GSList *items_ = nullptr;
|
||||||
SnWatcher *watcher_ = nullptr;
|
SnWatcher *watcher_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -34,14 +34,14 @@ class BarIpcClient {
|
||||||
void onVisibilityUpdate(bool visible_by_modifier);
|
void onVisibilityUpdate(bool visible_by_modifier);
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
Bar& bar_;
|
Bar& bar_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
|
|
||||||
swaybar_config bar_config_;
|
swaybar_config bar_config_;
|
||||||
bool visible_by_modifier_ = false;
|
bool visible_by_modifier_ = false;
|
||||||
|
|
||||||
SafeSignal<bool> signal_visible_;
|
SafeSignal<bool> signal_visible_;
|
||||||
SafeSignal<swaybar_config> signal_config_;
|
SafeSignal<swaybar_config> signal_config_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include "ipc.hpp"
|
#include "ipc.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
@ -18,8 +20,8 @@ class Ipc {
|
||||||
~Ipc();
|
~Ipc();
|
||||||
|
|
||||||
struct ipc_response {
|
struct ipc_response {
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
std::string payload;
|
std::string payload;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,16 +35,16 @@ class Ipc {
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static inline const std::string ipc_magic_ = "i3-ipc";
|
static inline const std::string ipc_magic_ = "i3-ipc";
|
||||||
static inline const size_t ipc_header_size_ = ipc_magic_.size() + 8;
|
static inline const size_t ipc_header_size_ = ipc_magic_.size() + 8;
|
||||||
|
|
||||||
const std::string getSocketPath() const;
|
const std::string getSocketPath() const;
|
||||||
int open(const std::string &) const;
|
int open(const std::string &) const;
|
||||||
struct ipc_response send(int fd, uint32_t type, const std::string &payload = "");
|
struct ipc_response send(int fd, uint32_t type, const std::string &payload = "");
|
||||||
struct ipc_response recv(int fd);
|
struct ipc_response recv(int fd);
|
||||||
|
|
||||||
int fd_;
|
int fd_;
|
||||||
int fd_event_;
|
int fd_event_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ enum ipc_command_type {
|
||||||
IPC_EVENT_SHUTDOWN = ((1 << 31) | 6),
|
IPC_EVENT_SHUTDOWN = ((1 << 31) | 6),
|
||||||
IPC_EVENT_TICK = ((1 << 31) | 7),
|
IPC_EVENT_TICK = ((1 << 31) | 7),
|
||||||
|
|
||||||
// sway-specific event types
|
// sway-specific event types
|
||||||
IPC_EVENT_BAR_STATE_UPDATE = ((1<<31) | 20),
|
IPC_EVENT_BAR_STATE_UPDATE = ((1 << 31) | 20),
|
||||||
IPC_EVENT_INPUT = ((1<<31) | 21),
|
IPC_EVENT_INPUT = ((1 << 31) | 21),
|
||||||
};
|
};
|
||||||
|
|
|
@ -21,11 +21,7 @@ class Language : public ALabel, public sigc::trackable {
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class DispayedShortFlag {
|
enum class DispayedShortFlag { None = 0, ShortName = 1, ShortDescription = 1 << 1 };
|
||||||
None = 0,
|
|
||||||
ShortName = 1,
|
|
||||||
ShortDescription = 1 << 1
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Layout {
|
struct Layout {
|
||||||
std::string full_name;
|
std::string full_name;
|
||||||
|
@ -37,14 +33,15 @@ class Language : public ALabel, public sigc::trackable {
|
||||||
|
|
||||||
class XKBContext {
|
class XKBContext {
|
||||||
public:
|
public:
|
||||||
XKBContext();
|
XKBContext();
|
||||||
~XKBContext();
|
~XKBContext();
|
||||||
auto next_layout() -> Layout*;
|
auto next_layout() -> Layout*;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rxkb_context* context_ = nullptr;
|
rxkb_context* context_ = nullptr;
|
||||||
rxkb_layout* xkb_layout_ = nullptr;
|
rxkb_layout* xkb_layout_ = nullptr;
|
||||||
Layout* layout_ = nullptr;
|
Layout* layout_ = nullptr;
|
||||||
std::map<std::string, rxkb_layout*> base_layouts_by_name_;
|
std::map<std::string, rxkb_layout*> base_layouts_by_name_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
|
@ -56,15 +53,15 @@ class Language : public ALabel, public sigc::trackable {
|
||||||
const static std::string XKB_LAYOUT_NAMES_KEY;
|
const static std::string XKB_LAYOUT_NAMES_KEY;
|
||||||
const static std::string XKB_ACTIVE_LAYOUT_NAME_KEY;
|
const static std::string XKB_ACTIVE_LAYOUT_NAME_KEY;
|
||||||
|
|
||||||
Layout layout_;
|
Layout layout_;
|
||||||
std::string tooltip_format_ = "";
|
std::string tooltip_format_ = "";
|
||||||
std::map<std::string, Layout> layouts_map_;
|
std::map<std::string, Layout> layouts_map_;
|
||||||
bool is_variant_displayed;
|
bool is_variant_displayed;
|
||||||
std::byte displayed_short_flag = static_cast<std::byte>(DispayedShortFlag::None);
|
std::byte displayed_short_flag = static_cast<std::byte>(DispayedShortFlag::None);
|
||||||
|
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::sway
|
} // namespace waybar::modules::sway
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
|
@ -18,10 +19,10 @@ class Mode : public ALabel, public sigc::trackable {
|
||||||
private:
|
private:
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
|
|
||||||
std::string mode_;
|
std::string mode_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::sway
|
} // namespace waybar::modules::sway
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
#include "AIconLabel.hpp"
|
#include "AIconLabel.hpp"
|
||||||
|
@ -18,23 +19,23 @@ class Window : public AIconLabel, public sigc::trackable {
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
void onCmd(const struct Ipc::ipc_response&);
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
std::tuple<std::size_t, int, std::string, std::string> getFocusedNode(const Json::Value& nodes,
|
std::tuple<std::size_t, int, std::string, std::string> getFocusedNode(const Json::Value& nodes,
|
||||||
std::string& output);
|
std::string& output);
|
||||||
void getTree();
|
void getTree();
|
||||||
std::string rewriteTitle(const std::string& title);
|
std::string rewriteTitle(const std::string& title);
|
||||||
void updateAppIcon();
|
void updateAppIcon();
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
std::string window_;
|
std::string window_;
|
||||||
int windowId_;
|
int windowId_;
|
||||||
std::string app_id_;
|
std::string app_id_;
|
||||||
std::string old_app_id_;
|
std::string old_app_id_;
|
||||||
std::size_t app_nb_;
|
std::size_t app_nb_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::sway
|
} // namespace waybar::modules::sway
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <gtkmm/button.h>
|
#include <gtkmm/button.h>
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
|
@ -24,25 +25,25 @@ class Workspaces : public AModule, public sigc::trackable {
|
||||||
|
|
||||||
static int convertWorkspaceNameToNum(std::string name);
|
static int convertWorkspaceNameToNum(std::string name);
|
||||||
|
|
||||||
void onCmd(const struct Ipc::ipc_response&);
|
void onCmd(const struct Ipc::ipc_response&);
|
||||||
void onEvent(const struct Ipc::ipc_response&);
|
void onEvent(const struct Ipc::ipc_response&);
|
||||||
bool filterButtons();
|
bool filterButtons();
|
||||||
Gtk::Button& addButton(const Json::Value&);
|
Gtk::Button& addButton(const Json::Value&);
|
||||||
void onButtonReady(const Json::Value&, Gtk::Button&);
|
void onButtonReady(const Json::Value&, Gtk::Button&);
|
||||||
std::string getIcon(const std::string&, const Json::Value&);
|
std::string getIcon(const std::string&, const Json::Value&);
|
||||||
const std::string getCycleWorkspace(std::vector<Json::Value>::iterator, bool prev) const;
|
const std::string getCycleWorkspace(std::vector<Json::Value>::iterator, bool prev) const;
|
||||||
uint16_t getWorkspaceIndex(const std::string& name) const;
|
uint16_t getWorkspaceIndex(const std::string& name) const;
|
||||||
std::string trimWorkspaceName(std::string);
|
std::string trimWorkspaceName(std::string);
|
||||||
bool handleScroll(GdkEventScroll*);
|
bool handleScroll(GdkEventScroll*);
|
||||||
|
|
||||||
const Bar& bar_;
|
const Bar& bar_;
|
||||||
std::vector<Json::Value> workspaces_;
|
std::vector<Json::Value> workspaces_;
|
||||||
std::vector<std::string> workspaces_order_;
|
std::vector<std::string> workspaces_order_;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
std::unordered_map<std::string, Gtk::Button> buttons_;
|
std::unordered_map<std::string, Gtk::Button> buttons_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
Ipc ipc_;
|
Ipc ipc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::sway
|
} // namespace waybar::modules::sway
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
#include "util/sleeper_thread.hpp"
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
@ -14,10 +16,10 @@ class Temperature : public ALabel {
|
||||||
auto update() -> void;
|
auto update() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float getTemperature();
|
float getTemperature();
|
||||||
bool isCritical(uint16_t);
|
bool isCritical(uint16_t);
|
||||||
|
|
||||||
std::string file_path_;
|
std::string file_path_;
|
||||||
util::SleeperThread thread_;
|
util::SleeperThread thread_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -38,41 +38,41 @@ class UPower : public AModule {
|
||||||
gpointer data);
|
gpointer data);
|
||||||
static void upowerDisappear(GDBusConnection *connection, const gchar *name, gpointer user_data);
|
static void upowerDisappear(GDBusConnection *connection, const gchar *name, gpointer user_data);
|
||||||
|
|
||||||
void removeDevice(const gchar *objectPath);
|
void removeDevice(const gchar *objectPath);
|
||||||
void addDevice(UpDevice *device);
|
void addDevice(UpDevice *device);
|
||||||
void setDisplayDevice();
|
void setDisplayDevice();
|
||||||
void resetDevices();
|
void resetDevices();
|
||||||
void removeDevices();
|
void removeDevices();
|
||||||
bool show_tooltip_callback(int, int, bool, const Glib::RefPtr<Gtk::Tooltip> &tooltip);
|
bool show_tooltip_callback(int, int, bool, const Glib::RefPtr<Gtk::Tooltip> &tooltip);
|
||||||
bool handleToggle(GdkEventButton *const &);
|
bool handleToggle(GdkEventButton *const &);
|
||||||
std::string timeToString(gint64 time);
|
std::string timeToString(gint64 time);
|
||||||
|
|
||||||
const std::string getDeviceStatus(UpDeviceState &state);
|
const std::string getDeviceStatus(UpDeviceState &state);
|
||||||
|
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
Gtk::Image icon_;
|
Gtk::Image icon_;
|
||||||
Gtk::Label label_;
|
Gtk::Label label_;
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
bool hideIfEmpty = true;
|
bool hideIfEmpty = true;
|
||||||
bool tooltip_enabled = true;
|
bool tooltip_enabled = true;
|
||||||
uint tooltip_spacing = 4;
|
uint tooltip_spacing = 4;
|
||||||
uint tooltip_padding = 4;
|
uint tooltip_padding = 4;
|
||||||
uint iconSize = 20;
|
uint iconSize = 20;
|
||||||
std::string format = DEFAULT_FORMAT;
|
std::string format = DEFAULT_FORMAT;
|
||||||
std::string format_alt = DEFAULT_FORMAT_ALT;
|
std::string format_alt = DEFAULT_FORMAT_ALT;
|
||||||
|
|
||||||
Devices devices;
|
Devices devices;
|
||||||
std::mutex m_Mutex;
|
std::mutex m_Mutex;
|
||||||
UpClient *client;
|
UpClient *client;
|
||||||
UpDevice *displayDevice;
|
UpDevice *displayDevice;
|
||||||
guint login1_id;
|
guint login1_id;
|
||||||
GDBusConnection *login1_connection;
|
GDBusConnection *login1_connection;
|
||||||
UPowerTooltip *upower_tooltip;
|
UPowerTooltip *upower_tooltip;
|
||||||
std::string lastStatus;
|
std::string lastStatus;
|
||||||
bool showAltText;
|
bool showAltText;
|
||||||
bool upowerRunning;
|
bool upowerRunning;
|
||||||
guint upowerWatcher_id;
|
guint upowerWatcher_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules::upower
|
} // namespace waybar::modules::upower
|
||||||
|
|
|
@ -1,174 +1,168 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <gdk/gdk.h>
|
||||||
|
#include <glibmm/refptr.h>
|
||||||
|
#include <gtkmm/box.h>
|
||||||
|
#include <gtkmm/button.h>
|
||||||
|
#include <gtkmm/icontheme.h>
|
||||||
|
#include <gtkmm/image.h>
|
||||||
|
#include <gtkmm/label.h>
|
||||||
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
#include "giomm/desktopappinfo.h"
|
#include "giomm/desktopappinfo.h"
|
||||||
#include "util/json.hpp"
|
#include "util/json.hpp"
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
#include <unordered_set>
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
|
||||||
|
|
||||||
#include <glibmm/refptr.h>
|
|
||||||
|
|
||||||
#include <gtkmm/box.h>
|
|
||||||
#include <gtkmm/button.h>
|
|
||||||
#include <gtkmm/image.h>
|
|
||||||
#include <gtkmm/label.h>
|
|
||||||
#include <gtkmm/icontheme.h>
|
|
||||||
|
|
||||||
#include <wayland-client.h>
|
|
||||||
#include "wlr-foreign-toplevel-management-unstable-v1-client-protocol.h"
|
#include "wlr-foreign-toplevel-management-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
|
||||||
namespace waybar::modules::wlr {
|
namespace waybar::modules::wlr {
|
||||||
|
|
||||||
class Taskbar;
|
class Taskbar;
|
||||||
|
|
||||||
class Task
|
class Task {
|
||||||
{
|
public:
|
||||||
public:
|
Task(const waybar::Bar &, const Json::Value &, Taskbar *,
|
||||||
Task(const waybar::Bar&, const Json::Value&, Taskbar*,
|
struct zwlr_foreign_toplevel_handle_v1 *, struct wl_seat *);
|
||||||
struct zwlr_foreign_toplevel_handle_v1 *, struct wl_seat*);
|
~Task();
|
||||||
~Task();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum State {
|
enum State {
|
||||||
MAXIMIZED = (1 << 0),
|
MAXIMIZED = (1 << 0),
|
||||||
MINIMIZED = (1 << 1),
|
MINIMIZED = (1 << 1),
|
||||||
ACTIVE = (1 << 2),
|
ACTIVE = (1 << 2),
|
||||||
FULLSCREEN = (1 << 3),
|
FULLSCREEN = (1 << 3),
|
||||||
INVALID = (1 << 4)
|
INVALID = (1 << 4)
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static uint32_t global_id;
|
static uint32_t global_id;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const waybar::Bar &bar_;
|
const waybar::Bar &bar_;
|
||||||
const Json::Value &config_;
|
const Json::Value &config_;
|
||||||
Taskbar *tbar_;
|
Taskbar *tbar_;
|
||||||
struct zwlr_foreign_toplevel_handle_v1 *handle_;
|
struct zwlr_foreign_toplevel_handle_v1 *handle_;
|
||||||
struct wl_seat *seat_;
|
struct wl_seat *seat_;
|
||||||
|
|
||||||
uint32_t id_;
|
uint32_t id_;
|
||||||
|
|
||||||
Gtk::Button button_;
|
Gtk::Button button_;
|
||||||
Gtk::Box content_;
|
Gtk::Box content_;
|
||||||
Gtk::Image icon_;
|
Gtk::Image icon_;
|
||||||
Gtk::Label text_before_;
|
Gtk::Label text_before_;
|
||||||
Gtk::Label text_after_;
|
Gtk::Label text_after_;
|
||||||
Glib::RefPtr<Gio::DesktopAppInfo> app_info_;
|
Glib::RefPtr<Gio::DesktopAppInfo> app_info_;
|
||||||
bool button_visible_ = false;
|
bool button_visible_ = false;
|
||||||
bool ignored_ = false;
|
bool ignored_ = false;
|
||||||
|
|
||||||
bool with_icon_ = false;
|
bool with_icon_ = false;
|
||||||
bool with_name_ = false;
|
bool with_name_ = false;
|
||||||
std::string format_before_;
|
std::string format_before_;
|
||||||
std::string format_after_;
|
std::string format_after_;
|
||||||
|
|
||||||
std::string format_tooltip_;
|
std::string format_tooltip_;
|
||||||
|
|
||||||
std::string name_;
|
std::string name_;
|
||||||
std::string title_;
|
std::string title_;
|
||||||
std::string app_id_;
|
std::string app_id_;
|
||||||
uint32_t state_ = 0;
|
uint32_t state_ = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string repr() const;
|
std::string repr() const;
|
||||||
std::string state_string(bool = false) const;
|
std::string state_string(bool = false) const;
|
||||||
void set_app_info_from_app_id_list(const std::string& app_id_list);
|
void set_app_info_from_app_id_list(const std::string &app_id_list);
|
||||||
bool image_load_icon(Gtk::Image& image, const Glib::RefPtr<Gtk::IconTheme>& icon_theme, Glib::RefPtr<Gio::DesktopAppInfo> app_info, int size);
|
bool image_load_icon(Gtk::Image &image, const Glib::RefPtr<Gtk::IconTheme> &icon_theme,
|
||||||
void hide_if_ignored();
|
Glib::RefPtr<Gio::DesktopAppInfo> app_info, int size);
|
||||||
|
void hide_if_ignored();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/* Getter functions */
|
/* Getter functions */
|
||||||
uint32_t id() const { return id_; }
|
uint32_t id() const { return id_; }
|
||||||
std::string title() const { return title_; }
|
std::string title() const { return title_; }
|
||||||
std::string app_id() const { return app_id_; }
|
std::string app_id() const { return app_id_; }
|
||||||
uint32_t state() const { return state_; }
|
uint32_t state() const { return state_; }
|
||||||
bool maximized() const { return state_ & MAXIMIZED; }
|
bool maximized() const { return state_ & MAXIMIZED; }
|
||||||
bool minimized() const { return state_ & MINIMIZED; }
|
bool minimized() const { return state_ & MINIMIZED; }
|
||||||
bool active() const { return state_ & ACTIVE; }
|
bool active() const { return state_ & ACTIVE; }
|
||||||
bool fullscreen() const { return state_ & FULLSCREEN; }
|
bool fullscreen() const { return state_ & FULLSCREEN; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/* Callbacks for the wlr protocol */
|
/* Callbacks for the wlr protocol */
|
||||||
void handle_title(const char *);
|
void handle_title(const char *);
|
||||||
void handle_app_id(const char *);
|
void handle_app_id(const char *);
|
||||||
void handle_output_enter(struct wl_output *);
|
void handle_output_enter(struct wl_output *);
|
||||||
void handle_output_leave(struct wl_output *);
|
void handle_output_leave(struct wl_output *);
|
||||||
void handle_state(struct wl_array *);
|
void handle_state(struct wl_array *);
|
||||||
void handle_done();
|
void handle_done();
|
||||||
void handle_closed();
|
void handle_closed();
|
||||||
|
|
||||||
/* Callbacks for Gtk events */
|
/* Callbacks for Gtk events */
|
||||||
bool handle_clicked(GdkEventButton *);
|
bool handle_clicked(GdkEventButton *);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool operator==(const Task&) const;
|
bool operator==(const Task &) const;
|
||||||
bool operator!=(const Task&) const;
|
bool operator!=(const Task &) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/* Interaction with the tasks */
|
/* Interaction with the tasks */
|
||||||
void maximize(bool);
|
void maximize(bool);
|
||||||
void minimize(bool);
|
void minimize(bool);
|
||||||
void activate();
|
void activate();
|
||||||
void fullscreen(bool);
|
void fullscreen(bool);
|
||||||
void close();
|
void close();
|
||||||
};
|
};
|
||||||
|
|
||||||
using TaskPtr = std::unique_ptr<Task>;
|
using TaskPtr = std::unique_ptr<Task>;
|
||||||
|
|
||||||
|
class Taskbar : public waybar::AModule {
|
||||||
|
public:
|
||||||
|
Taskbar(const std::string &, const waybar::Bar &, const Json::Value &);
|
||||||
|
~Taskbar();
|
||||||
|
void update();
|
||||||
|
|
||||||
class Taskbar : public waybar::AModule
|
private:
|
||||||
{
|
const waybar::Bar &bar_;
|
||||||
public:
|
Gtk::Box box_;
|
||||||
Taskbar(const std::string&, const waybar::Bar&, const Json::Value&);
|
std::vector<TaskPtr> tasks_;
|
||||||
~Taskbar();
|
|
||||||
void update();
|
|
||||||
|
|
||||||
private:
|
std::vector<Glib::RefPtr<Gtk::IconTheme>> icon_themes_;
|
||||||
const waybar::Bar &bar_;
|
std::unordered_set<std::string> ignore_list_;
|
||||||
Gtk::Box box_;
|
std::map<std::string, std::string> app_ids_replace_map_;
|
||||||
std::vector<TaskPtr> tasks_;
|
|
||||||
|
|
||||||
std::vector<Glib::RefPtr<Gtk::IconTheme>> icon_themes_;
|
struct zwlr_foreign_toplevel_manager_v1 *manager_;
|
||||||
std::unordered_set<std::string> ignore_list_;
|
struct wl_seat *seat_;
|
||||||
std::map<std::string, std::string> app_ids_replace_map_;
|
|
||||||
|
|
||||||
struct zwlr_foreign_toplevel_manager_v1 *manager_;
|
public:
|
||||||
struct wl_seat *seat_;
|
/* Callbacks for global registration */
|
||||||
|
void register_manager(struct wl_registry *, uint32_t name, uint32_t version);
|
||||||
|
void register_seat(struct wl_registry *, uint32_t name, uint32_t version);
|
||||||
|
|
||||||
public:
|
/* Callbacks for the wlr protocol */
|
||||||
/* Callbacks for global registration */
|
void handle_toplevel_create(struct zwlr_foreign_toplevel_handle_v1 *);
|
||||||
void register_manager(struct wl_registry*, uint32_t name, uint32_t version);
|
void handle_finished();
|
||||||
void register_seat(struct wl_registry*, uint32_t name, uint32_t version);
|
|
||||||
|
|
||||||
/* Callbacks for the wlr protocol */
|
public:
|
||||||
void handle_toplevel_create(struct zwlr_foreign_toplevel_handle_v1 *);
|
void add_button(Gtk::Button &);
|
||||||
void handle_finished();
|
void move_button(Gtk::Button &, int);
|
||||||
|
void remove_button(Gtk::Button &);
|
||||||
|
void remove_task(uint32_t);
|
||||||
|
|
||||||
public:
|
bool show_output(struct wl_output *) const;
|
||||||
void add_button(Gtk::Button &);
|
bool all_outputs() const;
|
||||||
void move_button(Gtk::Button &, int);
|
|
||||||
void remove_button(Gtk::Button &);
|
|
||||||
void remove_task(uint32_t);
|
|
||||||
|
|
||||||
bool show_output(struct wl_output *) const;
|
const std::vector<Glib::RefPtr<Gtk::IconTheme>> &icon_themes() const;
|
||||||
bool all_outputs() const;
|
const std::unordered_set<std::string> &ignore_list() const;
|
||||||
|
const std::map<std::string, std::string> &app_ids_replace_map() const;
|
||||||
const std::vector<Glib::RefPtr<Gtk::IconTheme>>& icon_themes() const;
|
|
||||||
const std::unordered_set<std::string>& ignore_list() const;
|
|
||||||
const std::map<std::string, std::string>& app_ids_replace_map() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace waybar::modules::wlr */
|
} /* namespace waybar::modules::wlr */
|
||||||
|
|
|
@ -53,24 +53,24 @@ class Workspace {
|
||||||
private:
|
private:
|
||||||
auto get_icon() -> std::string;
|
auto get_icon() -> std::string;
|
||||||
|
|
||||||
const Bar &bar_;
|
const Bar &bar_;
|
||||||
const Json::Value &config_;
|
const Json::Value &config_;
|
||||||
WorkspaceGroup &workspace_group_;
|
WorkspaceGroup &workspace_group_;
|
||||||
|
|
||||||
// wlr stuff
|
// wlr stuff
|
||||||
zext_workspace_handle_v1 *workspace_handle_;
|
zext_workspace_handle_v1 *workspace_handle_;
|
||||||
uint32_t state_ = 0;
|
uint32_t state_ = 0;
|
||||||
|
|
||||||
uint32_t id_;
|
uint32_t id_;
|
||||||
std::string name_;
|
std::string name_;
|
||||||
std::vector<uint32_t> coordinates_;
|
std::vector<uint32_t> coordinates_;
|
||||||
static std::map<std::string, std::string> icons_map_;
|
static std::map<std::string, std::string> icons_map_;
|
||||||
std::string format_;
|
std::string format_;
|
||||||
bool with_icon_ = false;
|
bool with_icon_ = false;
|
||||||
|
|
||||||
Gtk::Button button_;
|
Gtk::Button button_;
|
||||||
Gtk::Box content_;
|
Gtk::Box content_;
|
||||||
Gtk::Label label_;
|
Gtk::Label label_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WorkspaceGroup {
|
class WorkspaceGroup {
|
||||||
|
@ -102,19 +102,19 @@ class WorkspaceGroup {
|
||||||
auto commit() -> void;
|
auto commit() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static uint32_t workspace_global_id;
|
static uint32_t workspace_global_id;
|
||||||
const waybar::Bar &bar_;
|
const waybar::Bar &bar_;
|
||||||
Gtk::Box &box_;
|
Gtk::Box &box_;
|
||||||
const Json::Value &config_;
|
const Json::Value &config_;
|
||||||
WorkspaceManager &workspace_manager_;
|
WorkspaceManager &workspace_manager_;
|
||||||
|
|
||||||
// wlr stuff
|
// wlr stuff
|
||||||
zext_workspace_group_handle_v1 *workspace_group_handle_;
|
zext_workspace_group_handle_v1 *workspace_group_handle_;
|
||||||
wl_output *output_ = nullptr;
|
wl_output *output_ = nullptr;
|
||||||
|
|
||||||
uint32_t id_;
|
uint32_t id_;
|
||||||
std::vector<std::unique_ptr<Workspace>> workspaces_;
|
std::vector<std::unique_ptr<Workspace>> workspaces_;
|
||||||
bool need_to_sort = false;
|
bool need_to_sort = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WorkspaceManager : public AModule {
|
class WorkspaceManager : public AModule {
|
||||||
|
@ -141,8 +141,8 @@ class WorkspaceManager : public AModule {
|
||||||
auto commit() -> void;
|
auto commit() -> void;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const waybar::Bar &bar_;
|
const waybar::Bar &bar_;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
std::vector<std::unique_ptr<WorkspaceGroup>> groups_;
|
std::vector<std::unique_ptr<WorkspaceGroup>> groups_;
|
||||||
|
|
||||||
// wlr stuff
|
// wlr stuff
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#include "ext-workspace-unstable-v1-client-protocol.h"
|
#include "ext-workspace-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
namespace waybar::modules::wlr {
|
namespace waybar::modules::wlr {
|
||||||
void add_registry_listener(void *data);
|
void add_registry_listener(void *data);
|
||||||
void add_workspace_listener(zext_workspace_handle_v1 *workspace_handle, void *data);
|
void add_workspace_listener(zext_workspace_handle_v1 *workspace_handle, void *data);
|
||||||
void add_workspace_group_listener(zext_workspace_group_handle_v1 *workspace_group_handle, void *data);
|
void add_workspace_group_listener(zext_workspace_group_handle_v1 *workspace_group_handle,
|
||||||
zext_workspace_manager_v1* workspace_manager_bind(wl_registry *registry, uint32_t name, uint32_t version, void *data);
|
void *data);
|
||||||
}
|
zext_workspace_manager_v1 *workspace_manager_bind(wl_registry *registry, uint32_t name,
|
||||||
|
uint32_t version, void *data);
|
||||||
|
} // namespace waybar::modules::wlr
|
||||||
|
|
|
@ -64,10 +64,10 @@ struct SafeSignal : sigc::signal<void(std::decay_t<Args>...)> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Glib::Dispatcher dp_;
|
Glib::Dispatcher dp_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
std::queue<arg_tuple_t> queue_;
|
std::queue<arg_tuple_t> queue_;
|
||||||
const std::thread::id main_tid_ = std::this_thread::get_id();
|
const std::thread::id main_tid_ = std::this_thread::get_id();
|
||||||
// cache functor for signal emission to avoid recreating it on each event
|
// cache functor for signal emission to avoid recreating it on each event
|
||||||
const slot_t cached_fn_ = make_slot();
|
const slot_t cached_fn_ = make_slot();
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -20,13 +20,13 @@ extern std::list<pid_t> reap;
|
||||||
namespace waybar::util::command {
|
namespace waybar::util::command {
|
||||||
|
|
||||||
struct res {
|
struct res {
|
||||||
int exit_code;
|
int exit_code;
|
||||||
std::string out;
|
std::string out;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::string read(FILE* fp) {
|
inline std::string read(FILE* fp) {
|
||||||
std::array<char, 128> buffer = {0};
|
std::array<char, 128> buffer = {0};
|
||||||
std::string output;
|
std::string output;
|
||||||
while (feof(fp) == 0) {
|
while (feof(fp) == 0) {
|
||||||
if (fgets(buffer.data(), 128, fp) != nullptr) {
|
if (fgets(buffer.data(), 128, fp) != nullptr) {
|
||||||
output += buffer.data();
|
output += buffer.data();
|
||||||
|
@ -68,7 +68,7 @@ inline int close(FILE* fp, pid_t pid) {
|
||||||
inline FILE* open(const std::string& cmd, int& pid) {
|
inline FILE* open(const std::string& cmd, int& pid) {
|
||||||
if (cmd == "") return nullptr;
|
if (cmd == "") return nullptr;
|
||||||
int fd[2];
|
int fd[2];
|
||||||
if (pipe(fd) != 0){
|
if (pipe(fd) != 0) {
|
||||||
spdlog::error("Unable to pipe fd");
|
spdlog::error("Unable to pipe fd");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ inline FILE* open(const std::string& cmd, int& pid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline struct res exec(const std::string& cmd) {
|
inline struct res exec(const std::string& cmd) {
|
||||||
int pid;
|
int pid;
|
||||||
auto fp = command::open(cmd, pid);
|
auto fp = command::open(cmd, pid);
|
||||||
if (!fp) return {-1, ""};
|
if (!fp) return {-1, ""};
|
||||||
auto output = command::read(fp);
|
auto output = command::read(fp);
|
||||||
|
@ -121,7 +121,7 @@ inline struct res exec(const std::string& cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline struct res execNoRead(const std::string& cmd) {
|
inline struct res execNoRead(const std::string& cmd) {
|
||||||
int pid;
|
int pid;
|
||||||
auto fp = command::open(cmd, pid);
|
auto fp = command::open(cmd, pid);
|
||||||
if (!fp) return {-1, ""};
|
if (!fp) return {-1, ""};
|
||||||
auto stat = command::close(fp, pid);
|
auto stat = command::close(fp, pid);
|
||||||
|
|
|
@ -4,96 +4,94 @@
|
||||||
#include <glibmm/ustring.h>
|
#include <glibmm/ustring.h>
|
||||||
|
|
||||||
class pow_format {
|
class pow_format {
|
||||||
public:
|
public:
|
||||||
pow_format(long long val, std::string&& unit, bool binary = false):
|
pow_format(long long val, std::string&& unit, bool binary = false)
|
||||||
val_(val), unit_(unit), binary_(binary) { };
|
: val_(val), unit_(unit), binary_(binary){};
|
||||||
|
|
||||||
long long val_;
|
long long val_;
|
||||||
std::string unit_;
|
std::string unit_;
|
||||||
bool binary_;
|
bool binary_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
namespace fmt {
|
namespace fmt {
|
||||||
template <>
|
template <>
|
||||||
struct formatter<pow_format> {
|
struct formatter<pow_format> {
|
||||||
char spec = 0;
|
char spec = 0;
|
||||||
int width = 0;
|
int width = 0;
|
||||||
|
|
||||||
template <typename ParseContext>
|
template <typename ParseContext>
|
||||||
constexpr auto parse(ParseContext& ctx) -> decltype (ctx.begin()) {
|
constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
||||||
auto it = ctx.begin(), end = ctx.end();
|
auto it = ctx.begin(), end = ctx.end();
|
||||||
if (it != end && *it == ':') ++it;
|
if (it != end && *it == ':') ++it;
|
||||||
if (it && (*it == '>' || *it == '<' || *it == '=')) {
|
if (it && (*it == '>' || *it == '<' || *it == '=')) {
|
||||||
spec = *it;
|
spec = *it;
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
if (it == end || *it == '}') return it;
|
if (it == end || *it == '}') return it;
|
||||||
if ('0' <= *it && *it <= '9') {
|
if ('0' <= *it && *it <= '9') {
|
||||||
// We ignore it for now, but keep it for compatibility with
|
// We ignore it for now, but keep it for compatibility with
|
||||||
// existing configs where the format for pow_format'ed numbers was
|
// existing configs where the format for pow_format'ed numbers was
|
||||||
// 'string' and specifications such as {:>9} were valid.
|
// 'string' and specifications such as {:>9} were valid.
|
||||||
// The rationale for ignoring it is that the only reason to specify
|
// The rationale for ignoring it is that the only reason to specify
|
||||||
// an alignment and a with is to get a fixed width bar, and ">" is
|
// an alignment and a with is to get a fixed width bar, and ">" is
|
||||||
// sufficient in this implementation.
|
// sufficient in this implementation.
|
||||||
#if FMT_VERSION < 80000
|
#if FMT_VERSION < 80000
|
||||||
width = parse_nonnegative_int(it, end, ctx);
|
width = parse_nonnegative_int(it, end, ctx);
|
||||||
#else
|
#else
|
||||||
width = detail::parse_nonnegative_int(it, end, -1);
|
width = detail::parse_nonnegative_int(it, end, -1);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return it;
|
return it;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class FormatContext>
|
template <class FormatContext>
|
||||||
auto format(const pow_format& s, FormatContext &ctx) -> decltype (ctx.out()) {
|
auto format(const pow_format& s, FormatContext& ctx) -> decltype(ctx.out()) {
|
||||||
const char* units[] = { "", "k", "M", "G", "T", "P", nullptr};
|
const char* units[] = {"", "k", "M", "G", "T", "P", nullptr};
|
||||||
|
|
||||||
auto base = s.binary_ ? 1024ull : 1000ll;
|
auto base = s.binary_ ? 1024ull : 1000ll;
|
||||||
auto fraction = (double) s.val_;
|
auto fraction = (double)s.val_;
|
||||||
|
|
||||||
int pow;
|
int pow;
|
||||||
for (pow = 0; units[pow+1] != nullptr && fraction / base >= 1; ++pow) {
|
for (pow = 0; units[pow + 1] != nullptr && fraction / base >= 1; ++pow) {
|
||||||
fraction /= base;
|
fraction /= base;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto max_width = 4 // coeff in {:.3g} format
|
auto max_width = 4 // coeff in {:.3g} format
|
||||||
+ 1 // prefix from units array
|
+ 1 // prefix from units array
|
||||||
+ s.binary_ // for the 'i' in GiB.
|
+ s.binary_ // for the 'i' in GiB.
|
||||||
+ s.unit_.length();
|
+ s.unit_.length();
|
||||||
|
|
||||||
const char * format;
|
const char* format;
|
||||||
std::string string;
|
std::string string;
|
||||||
switch (spec) {
|
switch (spec) {
|
||||||
case '>':
|
case '>':
|
||||||
return format_to(ctx.out(), "{:>{}}", fmt::format("{}", s), max_width);
|
return format_to(ctx.out(), "{:>{}}", fmt::format("{}", s), max_width);
|
||||||
case '<':
|
case '<':
|
||||||
return format_to(ctx.out(), "{:<{}}", fmt::format("{}", s), max_width);
|
return format_to(ctx.out(), "{:<{}}", fmt::format("{}", s), max_width);
|
||||||
case '=':
|
case '=':
|
||||||
format = "{coefficient:<4.3g}{padding}{prefix}{unit}";
|
format = "{coefficient:<4.3g}{padding}{prefix}{unit}";
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
default:
|
default:
|
||||||
format = "{coefficient:.3g}{prefix}{unit}";
|
format = "{coefficient:.3g}{prefix}{unit}";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return format_to(ctx.out(), format
|
return format_to(
|
||||||
, fmt::arg("coefficient", fraction)
|
ctx.out(), format, fmt::arg("coefficient", fraction),
|
||||||
, fmt::arg("prefix", std::string() + units[pow] + ((s.binary_ && pow) ? "i" : ""))
|
fmt::arg("prefix", std::string() + units[pow] + ((s.binary_ && pow) ? "i" : "")),
|
||||||
, fmt::arg("unit", s.unit_)
|
fmt::arg("unit", s.unit_),
|
||||||
, fmt::arg("padding", pow ? "" : s.binary_ ? " " : " ")
|
fmt::arg("padding", pow ? ""
|
||||||
);
|
: s.binary_ ? " "
|
||||||
}
|
: " "));
|
||||||
};
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Glib ustirng support
|
|
||||||
template <>
|
|
||||||
struct formatter<Glib::ustring> : formatter<std::string> {
|
|
||||||
template <typename FormatContext>
|
|
||||||
auto format(const Glib::ustring& value, FormatContext& ctx) {
|
|
||||||
return formatter<std::string>::format(value, ctx);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Glib ustirng support
|
||||||
|
template <>
|
||||||
|
struct formatter<Glib::ustring> : formatter<std::string> {
|
||||||
|
template <typename FormatContext>
|
||||||
|
auto format(const Glib::ustring& value, FormatContext& ctx) {
|
||||||
|
return formatter<std::string>::format(value, ctx);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace fmt
|
||||||
|
|
|
@ -13,7 +13,7 @@ struct JsonParser {
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
std::unique_ptr<Json::CharReader> const reader(builder_.newCharReader());
|
std::unique_ptr<Json::CharReader> const reader(builder_.newCharReader());
|
||||||
std::string err;
|
std::string err;
|
||||||
bool res = reader->parse(data.c_str(), data.c_str() + data.size(), &root, &err);
|
bool res = reader->parse(data.c_str(), data.c_str() + data.size(), &root, &err);
|
||||||
if (!res) throw std::runtime_error(err);
|
if (!res) throw std::runtime_error(err);
|
||||||
return root;
|
return root;
|
||||||
|
|
|
@ -17,8 +17,8 @@ class Rfkill : public sigc::trackable {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum rfkill_type rfkill_type_;
|
enum rfkill_type rfkill_type_;
|
||||||
bool state_ = false;
|
bool state_ = false;
|
||||||
int fd_ = -1;
|
int fd_ = -1;
|
||||||
|
|
||||||
bool on_event(Glib::IOCondition cond);
|
bool on_event(Glib::IOCondition cond);
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,7 +17,8 @@ namespace waybar::util {
|
||||||
*/
|
*/
|
||||||
class CancellationGuard {
|
class CancellationGuard {
|
||||||
int oldstate;
|
int oldstate;
|
||||||
public:
|
|
||||||
|
public:
|
||||||
CancellationGuard() { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); }
|
CancellationGuard() { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); }
|
||||||
~CancellationGuard() { pthread_setcancelstate(oldstate, &oldstate); }
|
~CancellationGuard() { pthread_setcancelstate(oldstate, &oldstate); }
|
||||||
};
|
};
|
||||||
|
@ -47,7 +48,7 @@ class SleeperThread {
|
||||||
bool isRunning() const { return do_run_; }
|
bool isRunning() const { return do_run_; }
|
||||||
|
|
||||||
auto sleep_for(std::chrono::system_clock::duration dur) {
|
auto sleep_for(std::chrono::system_clock::duration dur) {
|
||||||
std::unique_lock lk(mutex_);
|
std::unique_lock lk(mutex_);
|
||||||
CancellationGuard cancel_lock;
|
CancellationGuard cancel_lock;
|
||||||
return condvar_.wait_for(lk, dur, [this] { return signal_ || !do_run_; });
|
return condvar_.wait_for(lk, dur, [this] { return signal_ || !do_run_; });
|
||||||
}
|
}
|
||||||
|
@ -55,7 +56,7 @@ class SleeperThread {
|
||||||
auto sleep_until(
|
auto sleep_until(
|
||||||
std::chrono::time_point<std::chrono::system_clock, std::chrono::system_clock::duration>
|
std::chrono::time_point<std::chrono::system_clock, std::chrono::system_clock::duration>
|
||||||
time_point) {
|
time_point) {
|
||||||
std::unique_lock lk(mutex_);
|
std::unique_lock lk(mutex_);
|
||||||
CancellationGuard cancel_lock;
|
CancellationGuard cancel_lock;
|
||||||
return condvar_.wait_until(lk, time_point, [this] { return signal_ || !do_run_; });
|
return condvar_.wait_until(lk, time_point, [this] { return signal_ || !do_run_; });
|
||||||
}
|
}
|
||||||
|
@ -90,11 +91,11 @@ class SleeperThread {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::thread thread_;
|
std::thread thread_;
|
||||||
std::condition_variable condvar_;
|
std::condition_variable condvar_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
bool do_run_ = true;
|
bool do_run_ = true;
|
||||||
bool signal_ = false;
|
bool signal_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::util
|
} // namespace waybar::util
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
struct waybar_time {
|
struct waybar_time {
|
||||||
std::locale locale;
|
std::locale locale;
|
||||||
date::zoned_seconds ztime;
|
date::zoned_seconds ztime;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "ALabel.hpp"
|
#include "ALabel.hpp"
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <util/command.hpp>
|
#include <util/command.hpp>
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
@ -46,15 +48,10 @@ ALabel::ALabel(const Json::Value& config, const std::string& name, const std::st
|
||||||
} else {
|
} else {
|
||||||
label_.set_xalign(align);
|
label_.set_xalign(align);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ALabel::update() -> void {
|
auto ALabel::update() -> void { AModule::update(); }
|
||||||
AModule::update();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ALabel::getIcon(uint16_t percentage, const std::string& alt, uint16_t max) {
|
std::string ALabel::getIcon(uint16_t percentage, const std::string& alt, uint16_t max) {
|
||||||
auto format_icons = config_["format-icons"];
|
auto format_icons = config_["format-icons"];
|
||||||
|
@ -78,7 +75,8 @@ std::string ALabel::getIcon(uint16_t percentage, const std::string& alt, uint16_
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ALabel::getIcon(uint16_t percentage, const std::vector<std::string>& alts, uint16_t max) {
|
std::string ALabel::getIcon(uint16_t percentage, const std::vector<std::string>& alts,
|
||||||
|
uint16_t max) {
|
||||||
auto format_icons = config_["format-icons"];
|
auto format_icons = config_["format-icons"];
|
||||||
if (format_icons.isObject()) {
|
if (format_icons.isObject()) {
|
||||||
std::string _alt = "default";
|
std::string _alt = "default";
|
||||||
|
|
|
@ -1,24 +1,28 @@
|
||||||
#include "AModule.hpp"
|
#include "AModule.hpp"
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <util/command.hpp>
|
#include <util/command.hpp>
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
AModule::AModule(const Json::Value& config, const std::string& name, const std::string& id,
|
AModule::AModule(const Json::Value& config, const std::string& name, const std::string& id,
|
||||||
bool enable_click, bool enable_scroll)
|
bool enable_click, bool enable_scroll)
|
||||||
: name_(std::move(name)), config_(std::move(config))
|
: name_(std::move(name)),
|
||||||
, distance_scrolled_y_(0.0)
|
config_(std::move(config)),
|
||||||
, distance_scrolled_x_(0.0) {
|
distance_scrolled_y_(0.0),
|
||||||
|
distance_scrolled_x_(0.0) {
|
||||||
// configure events' user commands
|
// configure events' user commands
|
||||||
if (enable_click) {
|
if (enable_click) {
|
||||||
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
||||||
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &AModule::handleToggle));
|
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &AModule::handleToggle));
|
||||||
} else {
|
} else {
|
||||||
std::map<std::pair<uint, GdkEventType>, std::string>::const_iterator it{eventMap_.cbegin()};
|
std::map<std::pair<uint, GdkEventType>, std::string>::const_iterator it{eventMap_.cbegin()};
|
||||||
while(it != eventMap_.cend()) {
|
while (it != eventMap_.cend()) {
|
||||||
if (config_[it->second].isString()) {
|
if (config_[it->second].isString()) {
|
||||||
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
||||||
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &AModule::handleToggle));
|
event_box_.signal_button_press_event().connect(
|
||||||
|
sigc::mem_fun(*this, &AModule::handleToggle));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++it;
|
++it;
|
||||||
|
@ -27,7 +31,7 @@ AModule::AModule(const Json::Value& config, const std::string& name, const std::
|
||||||
if (config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString() || enable_scroll) {
|
if (config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString() || enable_scroll) {
|
||||||
event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
||||||
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &AModule::handleScroll));
|
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &AModule::handleScroll));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AModule::~AModule() {
|
AModule::~AModule() {
|
||||||
|
@ -46,12 +50,15 @@ auto AModule::update() -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AModule::handleToggle(GdkEventButton* const& e) {
|
bool AModule::handleToggle(GdkEventButton* const& e) {
|
||||||
const std::map<std::pair<uint, GdkEventType>, std::string>::const_iterator& rec{eventMap_.find(std::pair(e->button, e->type))};
|
const std::map<std::pair<uint, GdkEventType>, std::string>::const_iterator& rec{
|
||||||
std::string format{ (rec != eventMap_.cend()) ? rec->second : std::string{""}};
|
eventMap_.find(std::pair(e->button, e->type))};
|
||||||
|
std::string format{(rec != eventMap_.cend()) ? rec->second : std::string{""}};
|
||||||
|
|
||||||
if (!format.empty()) {
|
if (!format.empty()) {
|
||||||
if (config_[format].isString()) format = config_[format].asString();
|
if (config_[format].isString())
|
||||||
else format.clear();
|
format = config_[format].asString();
|
||||||
|
else
|
||||||
|
format.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!format.empty()) {
|
if (!format.empty()) {
|
||||||
|
@ -62,11 +69,15 @@ bool AModule::handleToggle(GdkEventButton* const& e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
AModule::SCROLL_DIR AModule::getScrollDir(GdkEventScroll* e) {
|
AModule::SCROLL_DIR AModule::getScrollDir(GdkEventScroll* e) {
|
||||||
switch (e -> direction) {
|
switch (e->direction) {
|
||||||
case GDK_SCROLL_UP: return SCROLL_DIR::UP;
|
case GDK_SCROLL_UP:
|
||||||
case GDK_SCROLL_DOWN: return SCROLL_DIR::DOWN;
|
return SCROLL_DIR::UP;
|
||||||
case GDK_SCROLL_LEFT: return SCROLL_DIR::LEFT;
|
case GDK_SCROLL_DOWN:
|
||||||
case GDK_SCROLL_RIGHT: return SCROLL_DIR::RIGHT;
|
return SCROLL_DIR::DOWN;
|
||||||
|
case GDK_SCROLL_LEFT:
|
||||||
|
return SCROLL_DIR::LEFT;
|
||||||
|
case GDK_SCROLL_RIGHT:
|
||||||
|
return SCROLL_DIR::RIGHT;
|
||||||
case GDK_SCROLL_SMOOTH: {
|
case GDK_SCROLL_SMOOTH: {
|
||||||
SCROLL_DIR dir{SCROLL_DIR::NONE};
|
SCROLL_DIR dir{SCROLL_DIR::NONE};
|
||||||
|
|
||||||
|
@ -104,7 +115,8 @@ AModule::SCROLL_DIR AModule::getScrollDir(GdkEventScroll* e) {
|
||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
// Silence -Wreturn-type:
|
// Silence -Wreturn-type:
|
||||||
default: return SCROLL_DIR::NONE;
|
default:
|
||||||
|
return SCROLL_DIR::NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
63
src/bar.cpp
63
src/bar.cpp
|
@ -170,10 +170,8 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable {
|
||||||
vertical_ = true;
|
vertical_ = true;
|
||||||
unanchored = GTK_LAYER_SHELL_EDGE_LEFT;
|
unanchored = GTK_LAYER_SHELL_EDGE_LEFT;
|
||||||
}
|
}
|
||||||
for (auto edge : {GTK_LAYER_SHELL_EDGE_LEFT,
|
for (auto edge : {GTK_LAYER_SHELL_EDGE_LEFT, GTK_LAYER_SHELL_EDGE_RIGHT,
|
||||||
GTK_LAYER_SHELL_EDGE_RIGHT,
|
GTK_LAYER_SHELL_EDGE_TOP, GTK_LAYER_SHELL_EDGE_BOTTOM}) {
|
||||||
GTK_LAYER_SHELL_EDGE_TOP,
|
|
||||||
GTK_LAYER_SHELL_EDGE_BOTTOM}) {
|
|
||||||
gtk_layer_set_anchor(window_.gobj(), edge, unanchored != edge);
|
gtk_layer_set_anchor(window_.gobj(), edge, unanchored != edge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -186,11 +184,11 @@ struct GLSSurfaceImpl : public BarSurface, public sigc::trackable {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Gtk::Window& window_;
|
Gtk::Window& window_;
|
||||||
std::string output_name_;
|
std::string output_name_;
|
||||||
uint32_t width_;
|
uint32_t width_;
|
||||||
uint32_t height_;
|
uint32_t height_;
|
||||||
bool passthrough_ = false;
|
bool passthrough_ = false;
|
||||||
bool vertical_ = false;
|
bool vertical_ = false;
|
||||||
|
|
||||||
void onMap(GdkEventAny* ev) { setPassThrough(passthrough_); }
|
void onMap(GdkEventAny* ev) { setPassThrough(passthrough_); }
|
||||||
|
|
||||||
|
@ -276,8 +274,8 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable {
|
||||||
margins_ = margins;
|
margins_ = margins;
|
||||||
// updating already mapped window
|
// updating already mapped window
|
||||||
if (layer_surface_) {
|
if (layer_surface_) {
|
||||||
zwlr_layer_surface_v1_set_margin(
|
zwlr_layer_surface_v1_set_margin(layer_surface_.get(), margins_.top, margins_.right,
|
||||||
layer_surface_.get(), margins_.top, margins_.right, margins_.bottom, margins_.left);
|
margins_.bottom, margins_.left);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,21 +333,21 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable {
|
||||||
using layer_surface_ptr =
|
using layer_surface_ptr =
|
||||||
std::unique_ptr<zwlr_layer_surface_v1, deleter_fn<zwlr_layer_surface_v1_destroy>>;
|
std::unique_ptr<zwlr_layer_surface_v1, deleter_fn<zwlr_layer_surface_v1_destroy>>;
|
||||||
|
|
||||||
Gtk::Window& window_;
|
Gtk::Window& window_;
|
||||||
std::string output_name_;
|
std::string output_name_;
|
||||||
uint32_t configured_width_ = 0;
|
uint32_t configured_width_ = 0;
|
||||||
uint32_t configured_height_ = 0;
|
uint32_t configured_height_ = 0;
|
||||||
uint32_t width_ = 0;
|
uint32_t width_ = 0;
|
||||||
uint32_t height_ = 0;
|
uint32_t height_ = 0;
|
||||||
uint8_t anchor_ = HORIZONTAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP;
|
uint8_t anchor_ = HORIZONTAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP;
|
||||||
bool exclusive_zone_ = true;
|
bool exclusive_zone_ = true;
|
||||||
bool passthrough_ = false;
|
bool passthrough_ = false;
|
||||||
struct bar_margins margins_;
|
struct bar_margins margins_;
|
||||||
|
|
||||||
zwlr_layer_shell_v1_layer layer_ = ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM;
|
zwlr_layer_shell_v1_layer layer_ = ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM;
|
||||||
struct wl_output* output_ = nullptr; // owned by GTK
|
struct wl_output* output_ = nullptr; // owned by GTK
|
||||||
struct wl_surface* surface_ = nullptr; // owned by GTK
|
struct wl_surface* surface_ = nullptr; // owned by GTK
|
||||||
layer_surface_ptr layer_surface_;
|
layer_surface_ptr layer_surface_;
|
||||||
|
|
||||||
void onRealize() {
|
void onRealize() {
|
||||||
auto gdk_window = window_.get_window()->gobj();
|
auto gdk_window = window_.get_window()->gobj();
|
||||||
|
@ -365,14 +363,14 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable {
|
||||||
auto gdk_window = window_.get_window()->gobj();
|
auto gdk_window = window_.get_window()->gobj();
|
||||||
surface_ = gdk_wayland_window_get_wl_surface(gdk_window);
|
surface_ = gdk_wayland_window_get_wl_surface(gdk_window);
|
||||||
|
|
||||||
layer_surface_.reset(zwlr_layer_shell_v1_get_layer_surface(
|
layer_surface_.reset(zwlr_layer_shell_v1_get_layer_surface(client->layer_shell, surface_,
|
||||||
client->layer_shell, surface_, output_, layer_, "waybar"));
|
output_, layer_, "waybar"));
|
||||||
|
|
||||||
zwlr_layer_surface_v1_add_listener(layer_surface_.get(), &layer_surface_listener, this);
|
zwlr_layer_surface_v1_add_listener(layer_surface_.get(), &layer_surface_listener, this);
|
||||||
zwlr_layer_surface_v1_set_keyboard_interactivity(layer_surface_.get(), false);
|
zwlr_layer_surface_v1_set_keyboard_interactivity(layer_surface_.get(), false);
|
||||||
zwlr_layer_surface_v1_set_anchor(layer_surface_.get(), anchor_);
|
zwlr_layer_surface_v1_set_anchor(layer_surface_.get(), anchor_);
|
||||||
zwlr_layer_surface_v1_set_margin(
|
zwlr_layer_surface_v1_set_margin(layer_surface_.get(), margins_.top, margins_.right,
|
||||||
layer_surface_.get(), margins_.top, margins_.right, margins_.bottom, margins_.left);
|
margins_.bottom, margins_.left);
|
||||||
|
|
||||||
setSurfaceSize(width_, height_);
|
setSurfaceSize(width_, height_);
|
||||||
setExclusiveZone(exclusive_zone_);
|
setExclusiveZone(exclusive_zone_);
|
||||||
|
@ -453,10 +451,8 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable {
|
||||||
o->window_.set_size_request(o->width_, o->height_);
|
o->window_.set_size_request(o->width_, o->height_);
|
||||||
o->window_.resize(o->width_, o->height_);
|
o->window_.resize(o->width_, o->height_);
|
||||||
o->setExclusiveZone(o->exclusive_zone_);
|
o->setExclusiveZone(o->exclusive_zone_);
|
||||||
spdlog::info(BAR_SIZE_MSG,
|
spdlog::info(BAR_SIZE_MSG, o->width_ == 1 ? "auto" : std::to_string(o->width_),
|
||||||
o->width_ == 1 ? "auto" : std::to_string(o->width_),
|
o->height_ == 1 ? "auto" : std::to_string(o->height_), o->output_name_);
|
||||||
o->height_ == 1 ? "auto" : std::to_string(o->height_),
|
|
||||||
o->output_name_);
|
|
||||||
o->commit();
|
o->commit();
|
||||||
}
|
}
|
||||||
zwlr_layer_surface_v1_ack_configure(surface, serial);
|
zwlr_layer_surface_v1_ack_configure(surface, serial);
|
||||||
|
@ -520,7 +516,7 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config)
|
||||||
config["margin-left"].isInt() ? config["margin-left"].asInt() : 0,
|
config["margin-left"].isInt() ? config["margin-left"].asInt() : 0,
|
||||||
};
|
};
|
||||||
} else if (config["margin"].isString()) {
|
} else if (config["margin"].isString()) {
|
||||||
std::istringstream iss(config["margin"].asString());
|
std::istringstream iss(config["margin"].asString());
|
||||||
std::vector<std::string> margins{std::istream_iterator<std::string>(iss), {}};
|
std::vector<std::string> margins{std::istream_iterator<std::string>(iss), {}};
|
||||||
try {
|
try {
|
||||||
if (margins.size() == 1) {
|
if (margins.size() == 1) {
|
||||||
|
@ -723,7 +719,8 @@ void waybar::Bar::handleSignal(int signal) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void waybar::Bar::getModules(const Factory& factory, const std::string& pos, Gtk::Box* group = nullptr) {
|
void waybar::Bar::getModules(const Factory& factory, const std::string& pos,
|
||||||
|
Gtk::Box* group = nullptr) {
|
||||||
auto module_list = group ? config[pos]["modules"] : config[pos];
|
auto module_list = group ? config[pos]["modules"] : config[pos];
|
||||||
if (module_list.isArray()) {
|
if (module_list.isArray()) {
|
||||||
for (const auto& name : module_list) {
|
for (const auto& name : module_list) {
|
||||||
|
|
|
@ -32,7 +32,7 @@ void waybar::Client::handleGlobal(void *data, struct wl_registry *registry, uint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void waybar::Client::handleGlobalRemove(void * data, struct wl_registry * /*registry*/,
|
void waybar::Client::handleGlobalRemove(void *data, struct wl_registry * /*registry*/,
|
||||||
uint32_t name) {
|
uint32_t name) {
|
||||||
// Nothing here
|
// Nothing here
|
||||||
}
|
}
|
||||||
|
@ -52,8 +52,8 @@ void waybar::Client::handleOutput(struct waybar_output &output) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct waybar::waybar_output &waybar::Client::getOutput(void *addr) {
|
struct waybar::waybar_output &waybar::Client::getOutput(void *addr) {
|
||||||
auto it = std::find_if(
|
auto it = std::find_if(outputs_.begin(), outputs_.end(),
|
||||||
outputs_.begin(), outputs_.end(), [&addr](const auto &output) { return &output == addr; });
|
[&addr](const auto &output) { return &output == addr; });
|
||||||
if (it == outputs_.end()) {
|
if (it == outputs_.end()) {
|
||||||
throw std::runtime_error("Unable to find valid output");
|
throw std::runtime_error("Unable to find valid output");
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ void waybar::Client::handleOutputDone(void *data, struct zxdg_output_v1 * /*xdg_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void waybar::Client::handleOutputName(void * data, struct zxdg_output_v1 * /*xdg_output*/,
|
void waybar::Client::handleOutputName(void *data, struct zxdg_output_v1 * /*xdg_output*/,
|
||||||
const char *name) {
|
const char *name) {
|
||||||
auto client = waybar::Client::inst();
|
auto client = waybar::Client::inst();
|
||||||
try {
|
try {
|
||||||
|
@ -108,7 +108,7 @@ void waybar::Client::handleOutputDescription(void *data, struct zxdg_output_v1 *
|
||||||
const char *description) {
|
const char *description) {
|
||||||
auto client = waybar::Client::inst();
|
auto client = waybar::Client::inst();
|
||||||
try {
|
try {
|
||||||
auto & output = client->getOutput(data);
|
auto &output = client->getOutput(data);
|
||||||
const char *open_paren = strrchr(description, '(');
|
const char *open_paren = strrchr(description, '(');
|
||||||
|
|
||||||
// Description format: "identifier (name)"
|
// Description format: "identifier (name)"
|
||||||
|
@ -169,8 +169,8 @@ auto waybar::Client::setupCss(const std::string &css_file) -> void {
|
||||||
throw std::runtime_error("Can't open style file");
|
throw std::runtime_error("Can't open style file");
|
||||||
}
|
}
|
||||||
// there's always only one screen
|
// there's always only one screen
|
||||||
style_context_->add_provider_for_screen(
|
style_context_->add_provider_for_screen(Gdk::Screen::get_default(), css_provider_,
|
||||||
Gdk::Screen::get_default(), css_provider_, GTK_STYLE_PROVIDER_PRIORITY_USER);
|
GTK_STYLE_PROVIDER_PRIORITY_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
void waybar::Client::bindInterfaces() {
|
void waybar::Client::bindInterfaces() {
|
||||||
|
@ -195,12 +195,12 @@ void waybar::Client::bindInterfaces() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int waybar::Client::main(int argc, char *argv[]) {
|
int waybar::Client::main(int argc, char *argv[]) {
|
||||||
bool show_help = false;
|
bool show_help = false;
|
||||||
bool show_version = false;
|
bool show_version = false;
|
||||||
std::string config_opt;
|
std::string config_opt;
|
||||||
std::string style_opt;
|
std::string style_opt;
|
||||||
std::string log_level;
|
std::string log_level;
|
||||||
auto cli = clara::detail::Help(show_help) |
|
auto cli = clara::detail::Help(show_help) |
|
||||||
clara::detail::Opt(show_version)["-v"]["--version"]("Show version") |
|
clara::detail::Opt(show_version)["-v"]["--version"]("Show version") |
|
||||||
clara::detail::Opt(config_opt, "config")["-c"]["--config"]("Config path") |
|
clara::detail::Opt(config_opt, "config")["-c"]["--config"]("Config path") |
|
||||||
clara::detail::Opt(style_opt, "style")["-s"]["--style"]("Style path") |
|
clara::detail::Opt(style_opt, "style")["-s"]["--style"]("Style path") |
|
||||||
|
@ -224,8 +224,8 @@ int waybar::Client::main(int argc, char *argv[]) {
|
||||||
if (!log_level.empty()) {
|
if (!log_level.empty()) {
|
||||||
spdlog::set_level(spdlog::level::from_str(log_level));
|
spdlog::set_level(spdlog::level::from_str(log_level));
|
||||||
}
|
}
|
||||||
gtk_app = Gtk::Application::create(
|
gtk_app = Gtk::Application::create(argc, argv, "fr.arouillard.waybar",
|
||||||
argc, argv, "fr.arouillard.waybar", Gio::APPLICATION_HANDLES_COMMAND_LINE);
|
Gio::APPLICATION_HANDLES_COMMAND_LINE);
|
||||||
gdk_display = Gdk::Display::get_default();
|
gdk_display = Gdk::Display::get_default();
|
||||||
if (!gdk_display) {
|
if (!gdk_display) {
|
||||||
throw std::runtime_error("Can't find display");
|
throw std::runtime_error("Can't find display");
|
||||||
|
@ -244,6 +244,4 @@ int waybar::Client::main(int argc, char *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void waybar::Client::reset() {
|
void waybar::Client::reset() { gtk_app->quit(); }
|
||||||
gtk_app->quit();
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,12 +13,8 @@
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
const std::vector<std::string> Config::CONFIG_DIRS = {
|
const std::vector<std::string> Config::CONFIG_DIRS = {
|
||||||
"$XDG_CONFIG_HOME/waybar/",
|
"$XDG_CONFIG_HOME/waybar/", "$HOME/.config/waybar/", "$HOME/waybar/",
|
||||||
"$HOME/.config/waybar/",
|
"/etc/xdg/waybar/", SYSCONFDIR "/xdg/waybar/", "./resources/",
|
||||||
"$HOME/waybar/",
|
|
||||||
"/etc/xdg/waybar/",
|
|
||||||
SYSCONFDIR "/xdg/waybar/",
|
|
||||||
"./resources/",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::optional<std::string> tryExpandPath(const std::string &path) {
|
std::optional<std::string> tryExpandPath(const std::string &path) {
|
||||||
|
@ -55,9 +51,9 @@ void Config::setupConfig(Json::Value &dst, const std::string &config_file, int d
|
||||||
if (!file.is_open()) {
|
if (!file.is_open()) {
|
||||||
throw std::runtime_error("Can't open config file");
|
throw std::runtime_error("Can't open config file");
|
||||||
}
|
}
|
||||||
std::string str((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
|
std::string str((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
|
||||||
util::JsonParser parser;
|
util::JsonParser parser;
|
||||||
Json::Value tmp_config = parser.parse(str);
|
Json::Value tmp_config = parser.parse(str);
|
||||||
if (tmp_config.isArray()) {
|
if (tmp_config.isArray()) {
|
||||||
for (auto &config_part : tmp_config) {
|
for (auto &config_part : tmp_config) {
|
||||||
resolveConfigIncludes(config_part, depth);
|
resolveConfigIncludes(config_part, depth);
|
||||||
|
|
|
@ -28,7 +28,7 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name) const {
|
||||||
return new waybar::modules::sway::Window(id, bar_, config_[name]);
|
return new waybar::modules::sway::Window(id, bar_, config_[name]);
|
||||||
}
|
}
|
||||||
if (ref == "sway/language") {
|
if (ref == "sway/language") {
|
||||||
return new waybar::modules::sway::Language(id, config_[name]);
|
return new waybar::modules::sway::Language(id, config_[name]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_WLR
|
#ifdef HAVE_WLR
|
||||||
|
@ -109,11 +109,11 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name) const {
|
||||||
return new waybar::modules::Temperature(id, config_[name]);
|
return new waybar::modules::Temperature(id, config_[name]);
|
||||||
}
|
}
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
# ifdef WANT_RFKILL
|
#ifdef WANT_RFKILL
|
||||||
if (ref == "bluetooth") {
|
if (ref == "bluetooth") {
|
||||||
return new waybar::modules::Bluetooth(id, config_[name]);
|
return new waybar::modules::Bluetooth(id, config_[name]);
|
||||||
}
|
}
|
||||||
# endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
if (ref.compare(0, 7, "custom/") == 0 && ref.size() > 7) {
|
if (ref.compare(0, 7, "custom/") == 0 && ref.size() > 7) {
|
||||||
return new waybar::modules::Custom(ref.substr(7), id, config_[name]);
|
return new waybar::modules::Custom(ref.substr(7), id, config_[name]);
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
#include "group.hpp"
|
#include "group.hpp"
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
#include <util/command.hpp>
|
#include <util/command.hpp>
|
||||||
|
|
||||||
namespace waybar {
|
namespace waybar {
|
||||||
|
|
||||||
Group::Group(const std::string& name, const Bar& bar, const Json::Value& config)
|
Group::Group(const std::string& name, const Bar& bar, const Json::Value& config)
|
||||||
: AModule(config, name, "", false, false),
|
: AModule(config, name, "", false, false),
|
||||||
box{bar.vertical ? Gtk::ORIENTATION_HORIZONTAL : Gtk::ORIENTATION_VERTICAL, 0}
|
box{bar.vertical ? Gtk::ORIENTATION_HORIZONTAL : Gtk::ORIENTATION_VERTICAL, 0} {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
auto Group::update() -> void {
|
auto Group::update() -> void {
|
||||||
// noop
|
// noop
|
||||||
|
|
17
src/main.cpp
17
src/main.cpp
|
@ -1,9 +1,11 @@
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <spdlog/spdlog.h>
|
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
|
|
||||||
std::mutex reap_mtx;
|
std::mutex reap_mtx;
|
||||||
|
@ -38,8 +40,7 @@ void* signalThread(void* args) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
spdlog::debug("Received signal with number {}, but not handling",
|
spdlog::debug("Received signal with number {}, but not handling", signum);
|
||||||
signum);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,9 +80,9 @@ int main(int argc, char* argv[]) {
|
||||||
});
|
});
|
||||||
|
|
||||||
std::signal(SIGUSR2, [](int /*signal*/) {
|
std::signal(SIGUSR2, [](int /*signal*/) {
|
||||||
spdlog::info("Reloading...");
|
spdlog::info("Reloading...");
|
||||||
reload = true;
|
reload = true;
|
||||||
waybar::Client::inst()->reset();
|
waybar::Client::inst()->reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
for (int sig = SIGRTMIN + 1; sig <= SIGRTMAX; ++sig) {
|
for (int sig = SIGRTMIN + 1; sig <= SIGRTMAX; ++sig) {
|
||||||
|
|
|
@ -93,8 +93,8 @@ waybar::modules::Backlight::Backlight(const std::string &id, const Json::Value &
|
||||||
{
|
{
|
||||||
std::unique_ptr<udev, UdevDeleter> udev_check{udev_new()};
|
std::unique_ptr<udev, UdevDeleter> udev_check{udev_new()};
|
||||||
check_nn(udev_check.get(), "Udev check new failed");
|
check_nn(udev_check.get(), "Udev check new failed");
|
||||||
enumerate_devices(
|
enumerate_devices(devices_.begin(), devices_.end(), std::back_inserter(devices_),
|
||||||
devices_.begin(), devices_.end(), std::back_inserter(devices_), udev_check.get());
|
udev_check.get());
|
||||||
if (devices_.empty()) {
|
if (devices_.empty()) {
|
||||||
throw std::runtime_error("No backlight found");
|
throw std::runtime_error("No backlight found");
|
||||||
}
|
}
|
||||||
|
@ -108,8 +108,7 @@ waybar::modules::Backlight::Backlight(const std::string &id, const Json::Value &
|
||||||
std::unique_ptr<udev_monitor, UdevMonitorDeleter> mon{
|
std::unique_ptr<udev_monitor, UdevMonitorDeleter> mon{
|
||||||
udev_monitor_new_from_netlink(udev.get(), "udev")};
|
udev_monitor_new_from_netlink(udev.get(), "udev")};
|
||||||
check_nn(mon.get(), "udev monitor new failed");
|
check_nn(mon.get(), "udev monitor new failed");
|
||||||
check_gte(udev_monitor_filter_add_match_subsystem_devtype(mon.get(), "backlight", nullptr),
|
check_gte(udev_monitor_filter_add_match_subsystem_devtype(mon.get(), "backlight", nullptr), 0,
|
||||||
0,
|
|
||||||
"udev failed to add monitor filter: ");
|
"udev failed to add monitor filter: ");
|
||||||
udev_monitor_enable_receiving(mon.get());
|
udev_monitor_enable_receiving(mon.get());
|
||||||
|
|
||||||
|
@ -126,8 +125,8 @@ waybar::modules::Backlight::Backlight(const std::string &id, const Json::Value &
|
||||||
epoll_event events[EPOLL_MAX_EVENTS];
|
epoll_event events[EPOLL_MAX_EVENTS];
|
||||||
|
|
||||||
while (udev_thread_.isRunning()) {
|
while (udev_thread_.isRunning()) {
|
||||||
const int event_count = epoll_wait(
|
const int event_count = epoll_wait(epoll_fd.get(), events, EPOLL_MAX_EVENTS,
|
||||||
epoll_fd.get(), events, EPOLL_MAX_EVENTS, std::chrono::milliseconds{interval_}.count());
|
std::chrono::milliseconds{interval_}.count());
|
||||||
if (!udev_thread_.isRunning()) {
|
if (!udev_thread_.isRunning()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -173,9 +172,10 @@ auto waybar::modules::Backlight::update() -> void {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t percent = best->get_max() == 0 ? 100 : round(best->get_actual() * 100.0f / best->get_max());
|
const uint8_t percent =
|
||||||
label_.set_markup(fmt::format(
|
best->get_max() == 0 ? 100 : round(best->get_actual() * 100.0f / best->get_max());
|
||||||
format_, fmt::arg("percent", std::to_string(percent)), fmt::arg("icon", getIcon(percent))));
|
label_.set_markup(fmt::format(format_, fmt::arg("percent", std::to_string(percent)),
|
||||||
|
fmt::arg("icon", getIcon(percent))));
|
||||||
getState(percent);
|
getState(percent);
|
||||||
} else {
|
} else {
|
||||||
if (!previous_best_.has_value()) {
|
if (!previous_best_.has_value()) {
|
||||||
|
@ -241,7 +241,7 @@ void waybar::modules::Backlight::enumerate_devices(ForwardIt first, ForwardIt la
|
||||||
udev_list_entry *enum_devices = udev_enumerate_get_list_entry(enumerate.get());
|
udev_list_entry *enum_devices = udev_enumerate_get_list_entry(enumerate.get());
|
||||||
udev_list_entry *dev_list_entry;
|
udev_list_entry *dev_list_entry;
|
||||||
udev_list_entry_foreach(dev_list_entry, enum_devices) {
|
udev_list_entry_foreach(dev_list_entry, enum_devices) {
|
||||||
const char * path = udev_list_entry_get_name(dev_list_entry);
|
const char *path = udev_list_entry_get_name(dev_list_entry);
|
||||||
std::unique_ptr<udev_device, UdevDeviceDeleter> dev{udev_device_new_from_syspath(udev, path)};
|
std::unique_ptr<udev_device, UdevDeviceDeleter> dev{udev_device_new_from_syspath(udev, path)};
|
||||||
check_nn(dev.get(), "dev new failed");
|
check_nn(dev.get(), "dev new failed");
|
||||||
upsert_device(first, last, inserter, dev.get());
|
upsert_device(first, last, inserter, dev.get());
|
||||||
|
|
|
@ -52,7 +52,7 @@ void waybar::modules::Battery::worker() {
|
||||||
};
|
};
|
||||||
thread_ = [this] {
|
thread_ = [this] {
|
||||||
struct inotify_event event = {0};
|
struct inotify_event event = {0};
|
||||||
int nbytes = read(battery_watch_fd_, &event, sizeof(event));
|
int nbytes = read(battery_watch_fd_, &event, sizeof(event));
|
||||||
if (nbytes != sizeof(event) || event.mask & IN_IGNORED) {
|
if (nbytes != sizeof(event) || event.mask & IN_IGNORED) {
|
||||||
thread_.stop();
|
thread_.stop();
|
||||||
return;
|
return;
|
||||||
|
@ -61,7 +61,7 @@ void waybar::modules::Battery::worker() {
|
||||||
};
|
};
|
||||||
thread_battery_update_ = [this] {
|
thread_battery_update_ = [this] {
|
||||||
struct inotify_event event = {0};
|
struct inotify_event event = {0};
|
||||||
int nbytes = read(global_watch_fd_, &event, sizeof(event));
|
int nbytes = read(global_watch_fd_, &event, sizeof(event));
|
||||||
if (nbytes != sizeof(event) || event.mask & IN_IGNORED) {
|
if (nbytes != sizeof(event) || event.mask & IN_IGNORED) {
|
||||||
thread_.stop();
|
thread_.stop();
|
||||||
return;
|
return;
|
||||||
|
@ -94,7 +94,7 @@ void waybar::modules::Battery::refreshBatteries() {
|
||||||
std::string type;
|
std::string type;
|
||||||
std::ifstream(node.path() / "type") >> type;
|
std::ifstream(node.path() / "type") >> type;
|
||||||
|
|
||||||
if (!type.compare("Battery")){
|
if (!type.compare("Battery")) {
|
||||||
check_map[node.path()] = true;
|
check_map[node.path()] = true;
|
||||||
auto search = batteries_.find(node.path());
|
auto search = batteries_.find(node.path());
|
||||||
if (search == batteries_.end()) {
|
if (search == batteries_.end()) {
|
||||||
|
@ -139,11 +139,16 @@ void waybar::modules::Battery::refreshBatteries() {
|
||||||
|
|
||||||
// Unknown > Full > Not charging > Discharging > Charging
|
// Unknown > Full > Not charging > Discharging > Charging
|
||||||
static bool status_gt(const std::string& a, const std::string& b) {
|
static bool status_gt(const std::string& a, const std::string& b) {
|
||||||
if (a == b) return false;
|
if (a == b)
|
||||||
else if (a == "Unknown") return true;
|
return false;
|
||||||
else if (a == "Full" && b != "Unknown") return true;
|
else if (a == "Unknown")
|
||||||
else if (a == "Not charging" && b != "Unknown" && b != "Full") return true;
|
return true;
|
||||||
else if (a == "Discharging" && b != "Unknown" && b != "Full" && b != "Not charging") return true;
|
else if (a == "Full" && b != "Unknown")
|
||||||
|
return true;
|
||||||
|
else if (a == "Not charging" && b != "Unknown" && b != "Full")
|
||||||
|
return true;
|
||||||
|
else if (a == "Discharging" && b != "Unknown" && b != "Full" && b != "Not charging")
|
||||||
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,19 +156,19 @@ const std::tuple<uint8_t, float, std::string, float> waybar::modules::Battery::g
|
||||||
std::lock_guard<std::mutex> guard(battery_list_mutex_);
|
std::lock_guard<std::mutex> guard(battery_list_mutex_);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
uint32_t total_power = 0; // μW
|
uint32_t total_power = 0; // μW
|
||||||
uint32_t total_energy = 0; // μWh
|
uint32_t total_energy = 0; // μWh
|
||||||
uint32_t total_energy_full = 0;
|
uint32_t total_energy_full = 0;
|
||||||
uint32_t total_energy_full_design = 0;
|
uint32_t total_energy_full_design = 0;
|
||||||
uint32_t total_capacity{0};
|
uint32_t total_capacity{0};
|
||||||
std::string status = "Unknown";
|
std::string status = "Unknown";
|
||||||
for (auto const& item : batteries_) {
|
for (auto const& item : batteries_) {
|
||||||
auto bat = item.first;
|
auto bat = item.first;
|
||||||
uint32_t power_now;
|
uint32_t power_now;
|
||||||
uint32_t energy_full;
|
uint32_t energy_full;
|
||||||
uint32_t energy_now;
|
uint32_t energy_now;
|
||||||
uint32_t energy_full_design;
|
uint32_t energy_full_design;
|
||||||
uint32_t capacity{0};
|
uint32_t capacity{0};
|
||||||
std::string _status;
|
std::string _status;
|
||||||
std::getline(std::ifstream(bat / "status"), _status);
|
std::getline(std::ifstream(bat / "status"), _status);
|
||||||
|
|
||||||
|
@ -198,17 +203,17 @@ const std::tuple<uint8_t, float, std::string, float> waybar::modules::Battery::g
|
||||||
energy_now = ((uint64_t)charge_now * (uint64_t)voltage_now) / 1000000;
|
energy_now = ((uint64_t)charge_now * (uint64_t)voltage_now) / 1000000;
|
||||||
energy_full = ((uint64_t)charge_full * (uint64_t)voltage_now) / 1000000;
|
energy_full = ((uint64_t)charge_full * (uint64_t)voltage_now) / 1000000;
|
||||||
energy_full_design = ((uint64_t)charge_full_design * (uint64_t)voltage_now) / 1000000;
|
energy_full_design = ((uint64_t)charge_full_design * (uint64_t)voltage_now) / 1000000;
|
||||||
} // Gamepads such as PS Dualshock provide the only capacity
|
} // Gamepads such as PS Dualshock provide the only capacity
|
||||||
else if (fs::exists(bat / "energy_now") && fs::exists(bat / "energy_full")) {
|
else if (fs::exists(bat / "energy_now") && fs::exists(bat / "energy_full")) {
|
||||||
std::ifstream(bat / "power_now") >> power_now;
|
std::ifstream(bat / "power_now") >> power_now;
|
||||||
std::ifstream(bat / "energy_now") >> energy_now;
|
std::ifstream(bat / "energy_now") >> energy_now;
|
||||||
std::ifstream(bat / "energy_full") >> energy_full;
|
std::ifstream(bat / "energy_full") >> energy_full;
|
||||||
std::ifstream(bat / "energy_full_design") >> energy_full_design;
|
std::ifstream(bat / "energy_full_design") >> energy_full_design;
|
||||||
} else {
|
} else {
|
||||||
std::ifstream(bat / "capacity") >> capacity;
|
std::ifstream(bat / "capacity") >> capacity;
|
||||||
power_now = 0;
|
power_now = 0;
|
||||||
energy_now = 0;
|
energy_now = 0;
|
||||||
energy_full = 0;
|
energy_full = 0;
|
||||||
energy_full_design = 0;
|
energy_full_design = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,14 +246,14 @@ const std::tuple<uint8_t, float, std::string, float> waybar::modules::Battery::g
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
float capacity{0.0f};
|
float capacity{0.0f};
|
||||||
if(total_energy_full > 0.0f) {
|
if (total_energy_full > 0.0f) {
|
||||||
capacity = ((float)total_energy * 100.0f / (float) total_energy_full);
|
capacity = ((float)total_energy * 100.0f / (float)total_energy_full);
|
||||||
} else {
|
} else {
|
||||||
capacity = (float)total_capacity;
|
capacity = (float)total_capacity;
|
||||||
}
|
}
|
||||||
// Handle design-capacity
|
// Handle design-capacity
|
||||||
if (config_["design-capacity"].isBool() ? config_["design-capacity"].asBool() : false) {
|
if (config_["design-capacity"].isBool() ? config_["design-capacity"].asBool() : false) {
|
||||||
capacity = ((float)total_energy * 100.0f / (float) total_energy_full_design);
|
capacity = ((float)total_energy * 100.0f / (float)total_energy_full_design);
|
||||||
}
|
}
|
||||||
// Handle full-at
|
// Handle full-at
|
||||||
if (config_["full-at"].isUInt()) {
|
if (config_["full-at"].isUInt()) {
|
||||||
|
@ -295,7 +300,7 @@ const std::string waybar::modules::Battery::formatTimeRemaining(float hoursRemai
|
||||||
hoursRemaining = std::fabs(hoursRemaining);
|
hoursRemaining = std::fabs(hoursRemaining);
|
||||||
uint16_t full_hours = static_cast<uint16_t>(hoursRemaining);
|
uint16_t full_hours = static_cast<uint16_t>(hoursRemaining);
|
||||||
uint16_t minutes = static_cast<uint16_t>(60 * (hoursRemaining - full_hours));
|
uint16_t minutes = static_cast<uint16_t>(60 * (hoursRemaining - full_hours));
|
||||||
auto format = std::string("{H} h {M} min");
|
auto format = std::string("{H} h {M} min");
|
||||||
if (full_hours == 0 && minutes == 0) {
|
if (full_hours == 0 && minutes == 0) {
|
||||||
// Migh as well not show "0h 0min"
|
// Migh as well not show "0h 0min"
|
||||||
return "";
|
return "";
|
||||||
|
@ -317,9 +322,8 @@ auto waybar::modules::Battery::update() -> void {
|
||||||
}
|
}
|
||||||
auto status_pretty = status;
|
auto status_pretty = status;
|
||||||
// Transform to lowercase and replace space with dash
|
// Transform to lowercase and replace space with dash
|
||||||
std::transform(status.begin(), status.end(), status.begin(), [](char ch) {
|
std::transform(status.begin(), status.end(), status.begin(),
|
||||||
return ch == ' ' ? '-' : std::tolower(ch);
|
[](char ch) { return ch == ' ' ? '-' : std::tolower(ch); });
|
||||||
});
|
|
||||||
auto format = format_;
|
auto format = format_;
|
||||||
auto state = getState(capacity, true);
|
auto state = getState(capacity, true);
|
||||||
auto time_remaining_formatted = formatTimeRemaining(time_remaining);
|
auto time_remaining_formatted = formatTimeRemaining(time_remaining);
|
||||||
|
@ -341,8 +345,7 @@ auto waybar::modules::Battery::update() -> void {
|
||||||
} else if (config_["tooltip-format"].isString()) {
|
} else if (config_["tooltip-format"].isString()) {
|
||||||
tooltip_format = config_["tooltip-format"].asString();
|
tooltip_format = config_["tooltip-format"].asString();
|
||||||
}
|
}
|
||||||
label_.set_tooltip_text(fmt::format(tooltip_format,
|
label_.set_tooltip_text(fmt::format(tooltip_format, fmt::arg("timeTo", tooltip_text_default),
|
||||||
fmt::arg("timeTo", tooltip_text_default),
|
|
||||||
fmt::arg("capacity", capacity),
|
fmt::arg("capacity", capacity),
|
||||||
fmt::arg("time", time_remaining_formatted)));
|
fmt::arg("time", time_remaining_formatted)));
|
||||||
}
|
}
|
||||||
|
@ -363,9 +366,7 @@ auto waybar::modules::Battery::update() -> void {
|
||||||
} else {
|
} else {
|
||||||
event_box_.show();
|
event_box_.show();
|
||||||
auto icons = std::vector<std::string>{status + "-" + state, status, state};
|
auto icons = std::vector<std::string>{status + "-" + state, status, state};
|
||||||
label_.set_markup(fmt::format(format,
|
label_.set_markup(fmt::format(format, fmt::arg("capacity", capacity), fmt::arg("power", power),
|
||||||
fmt::arg("capacity", capacity),
|
|
||||||
fmt::arg("power", power),
|
|
||||||
fmt::arg("icon", getIcon(capacity, icons)),
|
fmt::arg("icon", getIcon(capacity, icons)),
|
||||||
fmt::arg("time", time_remaining_formatted)));
|
fmt::arg("time", time_remaining_formatted)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,44 +25,38 @@ waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "clock", id, "{:%H:%M}", 60, false, false, true),
|
: ALabel(config, "clock", id, "{:%H:%M}", 60, false, false, true),
|
||||||
current_time_zone_idx_(0),
|
current_time_zone_idx_(0),
|
||||||
is_calendar_in_tooltip_(false),
|
is_calendar_in_tooltip_(false),
|
||||||
is_timezoned_list_in_tooltip_(false)
|
is_timezoned_list_in_tooltip_(false) {
|
||||||
{
|
|
||||||
if (config_["timezones"].isArray() && !config_["timezones"].empty()) {
|
if (config_["timezones"].isArray() && !config_["timezones"].empty()) {
|
||||||
for (const auto& zone_name: config_["timezones"]) {
|
for (const auto& zone_name : config_["timezones"]) {
|
||||||
if (!zone_name.isString() || zone_name.asString().empty()) {
|
if (!zone_name.isString() || zone_name.asString().empty()) {
|
||||||
time_zones_.push_back(nullptr);
|
time_zones_.push_back(nullptr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
time_zones_.push_back(
|
time_zones_.push_back(date::locate_zone(zone_name.asString()));
|
||||||
date::locate_zone(
|
|
||||||
zone_name.asString()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
} else if (config_["timezone"].isString() && !config_["timezone"].asString().empty()) {
|
} else if (config_["timezone"].isString() && !config_["timezone"].asString().empty()) {
|
||||||
time_zones_.push_back(
|
time_zones_.push_back(date::locate_zone(config_["timezone"].asString()));
|
||||||
date::locate_zone(
|
|
||||||
config_["timezone"].asString()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If all timezones are parsed and no one is good, add nullptr to the timezones vector, to mark that local time should be shown.
|
// If all timezones are parsed and no one is good, add nullptr to the timezones vector, to mark
|
||||||
|
// that local time should be shown.
|
||||||
if (!time_zones_.size()) {
|
if (!time_zones_.size()) {
|
||||||
time_zones_.push_back(nullptr);
|
time_zones_.push_back(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_timezone_fixed()) {
|
if (!is_timezone_fixed()) {
|
||||||
spdlog::warn("As using a timezone, some format args may be missing as the date library haven't got a release since 2018.");
|
spdlog::warn(
|
||||||
|
"As using a timezone, some format args may be missing as the date library haven't got a "
|
||||||
|
"release since 2018.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if a particular placeholder is present in the tooltip format, to know what to calculate on update.
|
// Check if a particular placeholder is present in the tooltip format, to know what to calculate
|
||||||
|
// on update.
|
||||||
if (config_["tooltip-format"].isString()) {
|
if (config_["tooltip-format"].isString()) {
|
||||||
std::string trimmed_format = config_["tooltip-format"].asString();
|
std::string trimmed_format = config_["tooltip-format"].asString();
|
||||||
trimmed_format.erase(std::remove_if(trimmed_format.begin(),
|
trimmed_format.erase(std::remove_if(trimmed_format.begin(), trimmed_format.end(),
|
||||||
trimmed_format.end(),
|
[](unsigned char x) { return std::isspace(x); }),
|
||||||
[](unsigned char x){return std::isspace(x);}),
|
trimmed_format.end());
|
||||||
trimmed_format.end());
|
|
||||||
if (trimmed_format.find("{" + kCalendarPlaceholder + "}") != std::string::npos) {
|
if (trimmed_format.find("{" + kCalendarPlaceholder + "}") != std::string::npos) {
|
||||||
is_calendar_in_tooltip_ = true;
|
is_calendar_in_tooltip_ = true;
|
||||||
}
|
}
|
||||||
|
@ -87,7 +81,8 @@ waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config)
|
||||||
}
|
}
|
||||||
|
|
||||||
const date::time_zone* waybar::modules::Clock::current_timezone() {
|
const date::time_zone* waybar::modules::Clock::current_timezone() {
|
||||||
return time_zones_[current_time_zone_idx_] ? time_zones_[current_time_zone_idx_] : date::current_zone();
|
return time_zones_[current_time_zone_idx_] ? time_zones_[current_time_zone_idx_]
|
||||||
|
: date::current_zone();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool waybar::modules::Clock::is_timezone_fixed() {
|
bool waybar::modules::Clock::is_timezone_fixed() {
|
||||||
|
@ -121,7 +116,9 @@ auto waybar::modules::Clock::update() -> void {
|
||||||
timezoned_time_lines = timezones_text(&now);
|
timezoned_time_lines = timezones_text(&now);
|
||||||
}
|
}
|
||||||
auto tooltip_format = config_["tooltip-format"].asString();
|
auto tooltip_format = config_["tooltip-format"].asString();
|
||||||
text = fmt::format(tooltip_format, wtime, fmt::arg(kCalendarPlaceholder.c_str(), calendar_lines), fmt::arg(KTimezonedTimeListPlaceholder.c_str(), timezoned_time_lines));
|
text =
|
||||||
|
fmt::format(tooltip_format, wtime, fmt::arg(kCalendarPlaceholder.c_str(), calendar_lines),
|
||||||
|
fmt::arg(KTimezonedTimeListPlaceholder.c_str(), timezoned_time_lines));
|
||||||
label_.set_tooltip_markup(text);
|
label_.set_tooltip_markup(text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,7 +127,7 @@ auto waybar::modules::Clock::update() -> void {
|
||||||
ALabel::update();
|
ALabel::update();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool waybar::modules::Clock::handleScroll(GdkEventScroll *e) {
|
bool waybar::modules::Clock::handleScroll(GdkEventScroll* e) {
|
||||||
// defer to user commands if set
|
// defer to user commands if set
|
||||||
if (config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString()) {
|
if (config_["on-scroll-up"].isString() || config_["on-scroll-down"].isString()) {
|
||||||
return AModule::handleScroll(e);
|
return AModule::handleScroll(e);
|
||||||
|
@ -149,7 +146,8 @@ bool waybar::modules::Clock::handleScroll(GdkEventScroll *e) {
|
||||||
size_t new_idx = current_time_zone_idx_ + 1;
|
size_t new_idx = current_time_zone_idx_ + 1;
|
||||||
current_time_zone_idx_ = new_idx == nr_zones ? 0 : new_idx;
|
current_time_zone_idx_ = new_idx == nr_zones ? 0 : new_idx;
|
||||||
} else {
|
} else {
|
||||||
current_time_zone_idx_ = current_time_zone_idx_ == 0 ? nr_zones - 1 : current_time_zone_idx_ - 1;
|
current_time_zone_idx_ =
|
||||||
|
current_time_zone_idx_ == 0 ? nr_zones - 1 : current_time_zone_idx_ - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
update();
|
update();
|
||||||
|
@ -164,14 +162,15 @@ auto waybar::modules::Clock::calendar_text(const waybar_time& wtime) -> std::str
|
||||||
}
|
}
|
||||||
|
|
||||||
const date::year_month ym(ymd.year(), ymd.month());
|
const date::year_month ym(ymd.year(), ymd.month());
|
||||||
const auto curr_day = ymd.day();
|
const auto curr_day = ymd.day();
|
||||||
|
|
||||||
std::stringstream os;
|
std::stringstream os;
|
||||||
const auto first_dow = first_day_of_week();
|
|
||||||
|
const auto first_dow = first_day_of_week();
|
||||||
int ws{0}; // weeks-pos: side(1 - left, 2 - right)
|
int ws{0}; // weeks-pos: side(1 - left, 2 - right)
|
||||||
int wn{0}; // weeknumber
|
int wn{0}; // weeknumber
|
||||||
if (config_["calendar-weeks-pos"].isString()) {
|
if (config_["calendar-weeks-pos"].isString()) {
|
||||||
wn = (date::sys_days{date::year_month_day{ym / 1}} - date::sys_days{date::year_month_day{ymd.year() / 1 / 1}}).count() / 7 + 1;
|
wn = (date::sys_days{date::year_month_day{ym/1}} - date::sys_days{date::year_month_day{ymd.year()/1/1}}).count()/7+1;
|
||||||
if (config_["calendar-weeks-pos"].asString() == "left") {
|
if (config_["calendar-weeks-pos"].asString() == "left") {
|
||||||
ws = 1;
|
ws = 1;
|
||||||
// Add paddings before the header
|
// Add paddings before the header
|
||||||
|
@ -180,6 +179,7 @@ auto waybar::modules::Clock::calendar_text(const waybar_time& wtime) -> std::str
|
||||||
ws = 2;
|
ws = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
weekdays_header(first_dow, os);
|
weekdays_header(first_dow, os);
|
||||||
/* Print weeknumber on the left for the first row*/
|
/* Print weeknumber on the left for the first row*/
|
||||||
if (ws == 1) {
|
if (ws == 1) {
|
||||||
|
@ -246,7 +246,7 @@ auto waybar::modules::Clock::weekdays_header(const date::weekday& first_dow, std
|
||||||
auto clen = ustring_clen(wd_ustring);
|
auto clen = ustring_clen(wd_ustring);
|
||||||
auto wd_len = wd_ustring.length();
|
auto wd_len = wd_ustring.length();
|
||||||
while (clen > 2) {
|
while (clen > 2) {
|
||||||
wd_ustring = wd_ustring.substr(0, wd_len-1);
|
wd_ustring = wd_ustring.substr(0, wd_len - 1);
|
||||||
wd_len--;
|
wd_len--;
|
||||||
clen = ustring_clen(wd_ustring);
|
clen = ustring_clen(wd_ustring);
|
||||||
}
|
}
|
||||||
|
@ -260,7 +260,8 @@ auto waybar::modules::Clock::weekdays_header(const date::weekday& first_dow, std
|
||||||
} else os << res.str();
|
} else os << res.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto waybar::modules::Clock::timezones_text(std::chrono::system_clock::time_point *now) -> std::string {
|
auto waybar::modules::Clock::timezones_text(std::chrono::system_clock::time_point* now)
|
||||||
|
-> std::string {
|
||||||
if (time_zones_.size() == 1) {
|
if (time_zones_.size() == 1) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
@ -305,9 +306,9 @@ auto waybar::modules::Clock::first_day_of_week() -> date::weekday {
|
||||||
newlocale(LC_ALL, locale_.name().c_str(), nullptr)};
|
newlocale(LC_ALL, locale_.name().c_str(), nullptr)};
|
||||||
if (posix_locale) {
|
if (posix_locale) {
|
||||||
const int i = (std::intptr_t)nl_langinfo_l(_NL_TIME_WEEK_1STDAY, posix_locale.get());
|
const int i = (std::intptr_t)nl_langinfo_l(_NL_TIME_WEEK_1STDAY, posix_locale.get());
|
||||||
auto ymd = date::year(i / 10000) / (i / 100 % 100) / (i % 100);
|
auto ymd = date::year(i / 10000) / (i / 100 % 100) / (i % 100);
|
||||||
auto wd = date::weekday(ymd);
|
auto wd = date::weekday(ymd);
|
||||||
uint8_t j = *nl_langinfo_l(_NL_TIME_FIRST_WEEKDAY, posix_locale.get());
|
uint8_t j = *nl_langinfo_l(_NL_TIME_FIRST_WEEKDAY, posix_locale.get());
|
||||||
return wd + date::days(j - 1);
|
return wd + date::days(j - 1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,16 +1,19 @@
|
||||||
#include "modules/cpu.hpp"
|
#include <spdlog/spdlog.h>
|
||||||
|
// clang-format off
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#include <spdlog/spdlog.h>
|
// clang-format on
|
||||||
#include <cstdlib> // malloc
|
#include <unistd.h> // sysconf
|
||||||
#include <unistd.h> // sysconf
|
|
||||||
#include <cmath> // NAN
|
#include <cmath> // NAN
|
||||||
|
#include <cstdlib> // malloc
|
||||||
|
|
||||||
|
#include "modules/cpu.hpp"
|
||||||
|
|
||||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
# include <sys/sched.h>
|
#include <sys/sched.h>
|
||||||
#else
|
#else
|
||||||
# include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__NetBSD__)
|
#if defined(__NetBSD__)
|
||||||
|
@ -32,26 +35,26 @@ std::vector<std::tuple<size_t, size_t>> waybar::modules::Cpu::parseCpuinfo() {
|
||||||
pcp_time_t *cp_time = static_cast<pcp_time_t *>(malloc(sz)), *pcp_time = cp_time;
|
pcp_time_t *cp_time = static_cast<pcp_time_t *>(malloc(sz)), *pcp_time = cp_time;
|
||||||
#if defined(__NetBSD__)
|
#if defined(__NetBSD__)
|
||||||
int mib[] = {
|
int mib[] = {
|
||||||
CTL_KERN,
|
CTL_KERN,
|
||||||
KERN_CP_TIME,
|
KERN_CP_TIME,
|
||||||
};
|
};
|
||||||
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), sum_cp_time, &sum_sz, NULL, 0)) {
|
if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), sum_cp_time, &sum_sz, NULL, 0)) {
|
||||||
throw std::runtime_error("sysctl kern.cp_time failed");
|
throw std::runtime_error("sysctl kern.cp_time failed");
|
||||||
}
|
}
|
||||||
for (int state = 0; state < CPUSTATES; state++) {
|
for (int state = 0; state < CPUSTATES; state++) {
|
||||||
cp_time[state] = sum_cp_time[state];
|
cp_time[state] = sum_cp_time[state];
|
||||||
}
|
}
|
||||||
pcp_time += CPUSTATES;
|
pcp_time += CPUSTATES;
|
||||||
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), pcp_time, &sz, NULL, 0)) {
|
if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), pcp_time, &sz, NULL, 0)) {
|
||||||
throw std::runtime_error("sysctl kern.cp_time failed");
|
throw std::runtime_error("sysctl kern.cp_time failed");
|
||||||
}
|
}
|
||||||
#elif defined(__OpenBSD__)
|
#elif defined(__OpenBSD__)
|
||||||
{
|
{
|
||||||
int mib[] = {
|
int mib[] = {
|
||||||
CTL_KERN,
|
CTL_KERN,
|
||||||
KERN_CPTIME,
|
KERN_CPTIME,
|
||||||
};
|
};
|
||||||
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), sum_cp_time, &sum_sz, NULL, 0)) {
|
if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), sum_cp_time, &sum_sz, NULL, 0)) {
|
||||||
throw std::runtime_error("sysctl kern.cp_time failed");
|
throw std::runtime_error("sysctl kern.cp_time failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,14 +65,14 @@ std::vector<std::tuple<size_t, size_t>> waybar::modules::Cpu::parseCpuinfo() {
|
||||||
sz /= ncpu + 1;
|
sz /= ncpu + 1;
|
||||||
{
|
{
|
||||||
int mib[] = {
|
int mib[] = {
|
||||||
CTL_KERN,
|
CTL_KERN,
|
||||||
KERN_CPTIME2,
|
KERN_CPTIME2,
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
for (int cpu = 0; cpu < ncpu; cpu++) {
|
for (int cpu = 0; cpu < ncpu; cpu++) {
|
||||||
mib[2] = cpu;
|
mib[2] = cpu;
|
||||||
pcp_time += CPUSTATES;
|
pcp_time += CPUSTATES;
|
||||||
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), pcp_time, &sz, NULL, 0)) {
|
if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), pcp_time, &sz, NULL, 0)) {
|
||||||
throw std::runtime_error("sysctl kern.cp_time2 failed");
|
throw std::runtime_error("sysctl kern.cp_time2 failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +104,8 @@ std::vector<std::tuple<size_t, size_t>> waybar::modules::Cpu::parseCpuinfo() {
|
||||||
std::vector<float> waybar::modules::Cpu::parseCpuFrequencies() {
|
std::vector<float> waybar::modules::Cpu::parseCpuFrequencies() {
|
||||||
static std::vector<float> frequencies;
|
static std::vector<float> frequencies;
|
||||||
if (frequencies.empty()) {
|
if (frequencies.empty()) {
|
||||||
spdlog::warn("cpu/bsd: parseCpuFrequencies is not implemented, expect garbage in {*_frequency}");
|
spdlog::warn(
|
||||||
|
"cpu/bsd: parseCpuFrequencies is not implemented, expect garbage in {*_frequency}");
|
||||||
frequencies.push_back(NAN);
|
frequencies.push_back(NAN);
|
||||||
}
|
}
|
||||||
return frequencies;
|
return frequencies;
|
||||||
|
|
|
@ -46,11 +46,11 @@ auto waybar::modules::Cpu::update() -> void {
|
||||||
store.push_back(fmt::arg("min_frequency", min_frequency));
|
store.push_back(fmt::arg("min_frequency", min_frequency));
|
||||||
store.push_back(fmt::arg("avg_frequency", avg_frequency));
|
store.push_back(fmt::arg("avg_frequency", avg_frequency));
|
||||||
for (size_t i = 1; i < cpu_usage.size(); ++i) {
|
for (size_t i = 1; i < cpu_usage.size(); ++i) {
|
||||||
auto core_i = i - 1;
|
auto core_i = i - 1;
|
||||||
auto core_format = fmt::format("usage{}", core_i);
|
auto core_format = fmt::format("usage{}", core_i);
|
||||||
store.push_back(fmt::arg(core_format.c_str(), cpu_usage[i]));
|
store.push_back(fmt::arg(core_format.c_str(), cpu_usage[i]));
|
||||||
auto icon_format = fmt::format("icon{}", core_i);
|
auto icon_format = fmt::format("icon{}", core_i);
|
||||||
store.push_back(fmt::arg(icon_format.c_str(), getIcon(cpu_usage[i], icons)));
|
store.push_back(fmt::arg(icon_format.c_str(), getIcon(cpu_usage[i], icons)));
|
||||||
}
|
}
|
||||||
label_.set_markup(fmt::vformat(format, store));
|
label_.set_markup(fmt::vformat(format, store));
|
||||||
}
|
}
|
||||||
|
@ -73,14 +73,14 @@ std::tuple<std::vector<uint16_t>, std::string> waybar::modules::Cpu::getCpuUsage
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
}
|
}
|
||||||
std::vector<std::tuple<size_t, size_t>> curr_times = parseCpuinfo();
|
std::vector<std::tuple<size_t, size_t>> curr_times = parseCpuinfo();
|
||||||
std::string tooltip;
|
std::string tooltip;
|
||||||
std::vector<uint16_t> usage;
|
std::vector<uint16_t> usage;
|
||||||
for (size_t i = 0; i < curr_times.size(); ++i) {
|
for (size_t i = 0; i < curr_times.size(); ++i) {
|
||||||
auto [curr_idle, curr_total] = curr_times[i];
|
auto [curr_idle, curr_total] = curr_times[i];
|
||||||
auto [prev_idle, prev_total] = prev_times_[i];
|
auto [prev_idle, prev_total] = prev_times_[i];
|
||||||
const float delta_idle = curr_idle - prev_idle;
|
const float delta_idle = curr_idle - prev_idle;
|
||||||
const float delta_total = curr_total - prev_total;
|
const float delta_total = curr_total - prev_total;
|
||||||
uint16_t tmp = 100 * (1 - delta_idle / delta_total);
|
uint16_t tmp = 100 * (1 - delta_idle / delta_total);
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
tooltip = fmt::format("Total: {}%", tmp);
|
tooltip = fmt::format("Total: {}%", tmp);
|
||||||
} else {
|
} else {
|
||||||
|
@ -95,12 +95,13 @@ std::tuple<std::vector<uint16_t>, std::string> waybar::modules::Cpu::getCpuUsage
|
||||||
std::tuple<float, float, float> waybar::modules::Cpu::getCpuFrequency() {
|
std::tuple<float, float, float> waybar::modules::Cpu::getCpuFrequency() {
|
||||||
std::vector<float> frequencies = parseCpuFrequencies();
|
std::vector<float> frequencies = parseCpuFrequencies();
|
||||||
auto [min, max] = std::minmax_element(std::begin(frequencies), std::end(frequencies));
|
auto [min, max] = std::minmax_element(std::begin(frequencies), std::end(frequencies));
|
||||||
float avg_frequency = std::accumulate(std::begin(frequencies), std::end(frequencies), 0.0) / frequencies.size();
|
float avg_frequency =
|
||||||
|
std::accumulate(std::begin(frequencies), std::end(frequencies), 0.0) / frequencies.size();
|
||||||
|
|
||||||
// Round frequencies with double decimal precision to get GHz
|
// Round frequencies with double decimal precision to get GHz
|
||||||
float max_frequency = std::ceil(*max / 10.0) / 100.0;
|
float max_frequency = std::ceil(*max / 10.0) / 100.0;
|
||||||
float min_frequency = std::ceil(*min / 10.0) / 100.0;
|
float min_frequency = std::ceil(*min / 10.0) / 100.0;
|
||||||
avg_frequency = std::ceil(avg_frequency / 10.0) / 100.0;
|
avg_frequency = std::ceil(avg_frequency / 10.0) / 100.0;
|
||||||
|
|
||||||
return { max_frequency, min_frequency, avg_frequency };
|
return {max_frequency, min_frequency, avg_frequency};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
#include "modules/cpu.hpp"
|
#include "modules/cpu.hpp"
|
||||||
|
|
||||||
std::vector<std::tuple<size_t, size_t>> waybar::modules::Cpu::parseCpuinfo() {
|
std::vector<std::tuple<size_t, size_t>> waybar::modules::Cpu::parseCpuinfo() {
|
||||||
|
@ -8,12 +9,12 @@ std::vector<std::tuple<size_t, size_t>> waybar::modules::Cpu::parseCpuinfo() {
|
||||||
throw std::runtime_error("Can't open " + data_dir_);
|
throw std::runtime_error("Can't open " + data_dir_);
|
||||||
}
|
}
|
||||||
std::vector<std::tuple<size_t, size_t>> cpuinfo;
|
std::vector<std::tuple<size_t, size_t>> cpuinfo;
|
||||||
std::string line;
|
std::string line;
|
||||||
while (getline(info, line)) {
|
while (getline(info, line)) {
|
||||||
if (line.substr(0, 3).compare("cpu") != 0) {
|
if (line.substr(0, 3).compare("cpu") != 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
std::stringstream sline(line.substr(5));
|
std::stringstream sline(line.substr(5));
|
||||||
std::vector<size_t> times;
|
std::vector<size_t> times;
|
||||||
for (size_t time = 0; sline >> time; times.push_back(time))
|
for (size_t time = 0; sline >> time; times.push_back(time))
|
||||||
;
|
;
|
||||||
|
@ -51,12 +52,9 @@ std::vector<float> waybar::modules::Cpu::parseCpuFrequencies() {
|
||||||
if (frequencies.size() <= 0) {
|
if (frequencies.size() <= 0) {
|
||||||
std::string cpufreq_dir = "/sys/devices/system/cpu/cpufreq";
|
std::string cpufreq_dir = "/sys/devices/system/cpu/cpufreq";
|
||||||
if (std::filesystem::exists(cpufreq_dir)) {
|
if (std::filesystem::exists(cpufreq_dir)) {
|
||||||
std::vector<std::string> frequency_files = {
|
std::vector<std::string> frequency_files = {"/cpuinfo_min_freq", "/cpuinfo_max_freq"};
|
||||||
"/cpuinfo_min_freq",
|
for (auto& p : std::filesystem::directory_iterator(cpufreq_dir)) {
|
||||||
"/cpuinfo_max_freq"
|
for (auto freq_file : frequency_files) {
|
||||||
};
|
|
||||||
for (auto& p: std::filesystem::directory_iterator(cpufreq_dir)) {
|
|
||||||
for (auto freq_file: frequency_files) {
|
|
||||||
std::string freq_file_path = p.path().string() + freq_file;
|
std::string freq_file_path = p.path().string() + freq_file;
|
||||||
if (std::filesystem::exists(freq_file_path)) {
|
if (std::filesystem::exists(freq_file_path)) {
|
||||||
std::string freq_value;
|
std::string freq_value;
|
||||||
|
|
|
@ -48,7 +48,7 @@ void waybar::modules::Custom::continuousWorker() {
|
||||||
throw std::runtime_error("Unable to open " + cmd);
|
throw std::runtime_error("Unable to open " + cmd);
|
||||||
}
|
}
|
||||||
thread_ = [this, cmd] {
|
thread_ = [this, cmd] {
|
||||||
char* buff = nullptr;
|
char* buff = nullptr;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
if (getline(&buff, &len, fp_) == -1) {
|
if (getline(&buff, &len, fp_) == -1) {
|
||||||
int exit_code = 1;
|
int exit_code = 1;
|
||||||
|
@ -120,9 +120,7 @@ auto waybar::modules::Custom::update() -> void {
|
||||||
} else {
|
} else {
|
||||||
parseOutputRaw();
|
parseOutputRaw();
|
||||||
}
|
}
|
||||||
auto str = fmt::format(format_,
|
auto str = fmt::format(format_, text_, fmt::arg("alt", alt_),
|
||||||
text_,
|
|
||||||
fmt::arg("alt", alt_),
|
|
||||||
fmt::arg("icon", getIcon(percentage_, alt_)),
|
fmt::arg("icon", getIcon(percentage_, alt_)),
|
||||||
fmt::arg("percentage", percentage_));
|
fmt::arg("percentage", percentage_));
|
||||||
if (str.empty()) {
|
if (str.empty()) {
|
||||||
|
@ -156,8 +154,8 @@ auto waybar::modules::Custom::update() -> void {
|
||||||
|
|
||||||
void waybar::modules::Custom::parseOutputRaw() {
|
void waybar::modules::Custom::parseOutputRaw() {
|
||||||
std::istringstream output(output_.out);
|
std::istringstream output(output_.out);
|
||||||
std::string line;
|
std::string line;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (getline(output, line)) {
|
while (getline(output, line)) {
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
if (config_["escape"].isBool() && config_["escape"].asBool()) {
|
if (config_["escape"].isBool() && config_["escape"].asBool()) {
|
||||||
|
@ -180,7 +178,7 @@ void waybar::modules::Custom::parseOutputRaw() {
|
||||||
|
|
||||||
void waybar::modules::Custom::parseOutputJson() {
|
void waybar::modules::Custom::parseOutputJson() {
|
||||||
std::istringstream output(output_.out);
|
std::istringstream output(output_.out);
|
||||||
std::string line;
|
std::string line;
|
||||||
class_.clear();
|
class_.clear();
|
||||||
while (getline(output, line)) {
|
while (getline(output, line)) {
|
||||||
auto parsed = parser_.parse(line);
|
auto parsed = parser_.parse(line);
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
using namespace waybar::util;
|
using namespace waybar::util;
|
||||||
|
|
||||||
waybar::modules::Disk::Disk(const std::string& id, const Json::Value& config)
|
waybar::modules::Disk::Disk(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "disk", id, "{}%", 30)
|
: ALabel(config, "disk", id, "{}%", 30), path_("/") {
|
||||||
, path_("/")
|
|
||||||
{
|
|
||||||
thread_ = [this] {
|
thread_ = [this] {
|
||||||
dp.emit();
|
dp.emit();
|
||||||
thread_.sleep_for(interval_);
|
thread_.sleep_for(interval_);
|
||||||
|
@ -28,7 +26,8 @@ auto waybar::modules::Disk::update() -> void {
|
||||||
unsigned long f_fsid; // filesystem ID
|
unsigned long f_fsid; // filesystem ID
|
||||||
unsigned long f_flag; // mount flags
|
unsigned long f_flag; // mount flags
|
||||||
unsigned long f_namemax; // maximum filename length
|
unsigned long f_namemax; // maximum filename length
|
||||||
}; */ stats;
|
}; */
|
||||||
|
stats;
|
||||||
int err = statvfs(path_.c_str(), &stats);
|
int err = statvfs(path_.c_str(), &stats);
|
||||||
|
|
||||||
/* Conky options
|
/* Conky options
|
||||||
|
@ -59,15 +58,11 @@ auto waybar::modules::Disk::update() -> void {
|
||||||
event_box_.hide();
|
event_box_.hide();
|
||||||
} else {
|
} else {
|
||||||
event_box_.show();
|
event_box_.show();
|
||||||
label_.set_markup(fmt::format(format
|
label_.set_markup(
|
||||||
, stats.f_bavail * 100 / stats.f_blocks
|
fmt::format(format, stats.f_bavail * 100 / stats.f_blocks, fmt::arg("free", free),
|
||||||
, fmt::arg("free", free)
|
fmt::arg("percentage_free", stats.f_bavail * 100 / stats.f_blocks),
|
||||||
, fmt::arg("percentage_free", stats.f_bavail * 100 / stats.f_blocks)
|
fmt::arg("used", used), fmt::arg("percentage_used", percentage_used),
|
||||||
, fmt::arg("used", used)
|
fmt::arg("total", total), fmt::arg("path", path_)));
|
||||||
, fmt::arg("percentage_used", percentage_used)
|
|
||||||
, fmt::arg("total", total)
|
|
||||||
, fmt::arg("path", path_)
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tooltipEnabled()) {
|
if (tooltipEnabled()) {
|
||||||
|
@ -75,15 +70,11 @@ auto waybar::modules::Disk::update() -> void {
|
||||||
if (config_["tooltip-format"].isString()) {
|
if (config_["tooltip-format"].isString()) {
|
||||||
tooltip_format = config_["tooltip-format"].asString();
|
tooltip_format = config_["tooltip-format"].asString();
|
||||||
}
|
}
|
||||||
label_.set_tooltip_text(fmt::format(tooltip_format
|
label_.set_tooltip_text(
|
||||||
, stats.f_bavail * 100 / stats.f_blocks
|
fmt::format(tooltip_format, stats.f_bavail * 100 / stats.f_blocks, fmt::arg("free", free),
|
||||||
, fmt::arg("free", free)
|
fmt::arg("percentage_free", stats.f_bavail * 100 / stats.f_blocks),
|
||||||
, fmt::arg("percentage_free", stats.f_bavail * 100 / stats.f_blocks)
|
fmt::arg("used", used), fmt::arg("percentage_used", percentage_used),
|
||||||
, fmt::arg("used", used)
|
fmt::arg("total", total), fmt::arg("path", path_)));
|
||||||
, fmt::arg("percentage_used", percentage_used)
|
|
||||||
, fmt::arg("total", total)
|
|
||||||
, fmt::arg("path", path_)
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
// Call parent update
|
// Call parent update
|
||||||
ALabel::update();
|
ALabel::update();
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "util/command.hpp"
|
#include "util/command.hpp"
|
||||||
|
|
||||||
std::list<waybar::AModule*> waybar::modules::IdleInhibitor::modules;
|
std::list<waybar::AModule*> waybar::modules::IdleInhibitor::modules;
|
||||||
bool waybar::modules::IdleInhibitor::status = false;
|
bool waybar::modules::IdleInhibitor::status = false;
|
||||||
|
|
||||||
waybar::modules::IdleInhibitor::IdleInhibitor(const std::string& id, const Bar& bar,
|
waybar::modules::IdleInhibitor::IdleInhibitor(const std::string& id, const Bar& bar,
|
||||||
const Json::Value& config)
|
const Json::Value& config)
|
||||||
|
@ -47,7 +47,7 @@ auto waybar::modules::IdleInhibitor::update() -> void {
|
||||||
label_.get_style_context()->remove_class("deactivated");
|
label_.get_style_context()->remove_class("deactivated");
|
||||||
if (idle_inhibitor_ == nullptr) {
|
if (idle_inhibitor_ == nullptr) {
|
||||||
idle_inhibitor_ = zwp_idle_inhibit_manager_v1_create_inhibitor(
|
idle_inhibitor_ = zwp_idle_inhibit_manager_v1_create_inhibitor(
|
||||||
waybar::Client::inst()->idle_inhibit_manager, bar_.surface);
|
waybar::Client::inst()->idle_inhibit_manager, bar_.surface);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
label_.get_style_context()->remove_class("activated");
|
label_.get_style_context()->remove_class("activated");
|
||||||
|
@ -58,8 +58,8 @@ auto waybar::modules::IdleInhibitor::update() -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string status_text = status ? "activated" : "deactivated";
|
std::string status_text = status ? "activated" : "deactivated";
|
||||||
label_.set_markup(
|
label_.set_markup(fmt::format(format_, fmt::arg("status", status_text),
|
||||||
fmt::format(format_, fmt::arg("status", status_text), fmt::arg("icon", getIcon(0, status_text))));
|
fmt::arg("icon", getIcon(0, status_text))));
|
||||||
label_.get_style_context()->add_class(status_text);
|
label_.get_style_context()->add_class(status_text);
|
||||||
if (tooltipEnabled()) {
|
if (tooltipEnabled()) {
|
||||||
label_.set_tooltip_text(status_text);
|
label_.set_tooltip_text(status_text);
|
||||||
|
|
|
@ -6,12 +6,11 @@
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using DBus = std::unique_ptr<GDBusConnection, void(*)(GDBusConnection*)>;
|
using DBus = std::unique_ptr<GDBusConnection, void (*)(GDBusConnection*)>;
|
||||||
|
|
||||||
auto dbus() -> DBus {
|
auto dbus() -> DBus {
|
||||||
GError *error = nullptr;
|
GError* error = nullptr;
|
||||||
GDBusConnection* connection =
|
GDBusConnection* connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
|
||||||
g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
|
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
spdlog::error("g_bus_get_sync() failed: {}", error->message);
|
spdlog::error("g_bus_get_sync() failed: {}", error->message);
|
||||||
|
@ -20,46 +19,29 @@ auto dbus() -> DBus {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto destructor = [](GDBusConnection* connection) {
|
auto destructor = [](GDBusConnection* connection) {
|
||||||
GError *error = nullptr;
|
GError* error = nullptr;
|
||||||
g_dbus_connection_close_sync(connection, nullptr, &error);
|
g_dbus_connection_close_sync(connection, nullptr, &error);
|
||||||
if (error) {
|
if (error) {
|
||||||
spdlog::error(
|
spdlog::error("g_bus_connection_close_sync failed(): {}", error->message);
|
||||||
"g_bus_connection_close_sync failed(): {}",
|
g_error_free(error);
|
||||||
error->message);
|
}
|
||||||
g_error_free(error);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return DBus{connection, destructor};
|
return DBus{connection, destructor};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto getLocks(const DBus& bus, const std::string& inhibitors) -> int {
|
auto getLocks(const DBus& bus, const std::string& inhibitors) -> int {
|
||||||
GError *error = nullptr;
|
GError* error = nullptr;
|
||||||
GUnixFDList* fd_list;
|
GUnixFDList* fd_list;
|
||||||
int handle;
|
int handle;
|
||||||
|
|
||||||
auto reply = g_dbus_connection_call_with_unix_fd_list_sync(bus.get(),
|
auto reply = g_dbus_connection_call_with_unix_fd_list_sync(
|
||||||
"org.freedesktop.login1",
|
bus.get(), "org.freedesktop.login1", "/org/freedesktop/login1",
|
||||||
"/org/freedesktop/login1",
|
"org.freedesktop.login1.Manager", "Inhibit",
|
||||||
"org.freedesktop.login1.Manager",
|
g_variant_new("(ssss)", inhibitors.c_str(), "waybar", "Asked by user", "block"),
|
||||||
"Inhibit",
|
G_VARIANT_TYPE("(h)"), G_DBUS_CALL_FLAGS_NONE, -1, nullptr, &fd_list, nullptr, &error);
|
||||||
g_variant_new(
|
|
||||||
"(ssss)",
|
|
||||||
inhibitors.c_str(),
|
|
||||||
"waybar",
|
|
||||||
"Asked by user",
|
|
||||||
"block"),
|
|
||||||
G_VARIANT_TYPE("(h)"),
|
|
||||||
G_DBUS_CALL_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
nullptr,
|
|
||||||
&fd_list,
|
|
||||||
nullptr,
|
|
||||||
&error);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
spdlog::error(
|
spdlog::error("g_dbus_connection_call_with_unix_fd_list_sync() failed: {}", error->message);
|
||||||
"g_dbus_connection_call_with_unix_fd_list_sync() failed: {}",
|
|
||||||
error->message);
|
|
||||||
g_error_free(error);
|
g_error_free(error);
|
||||||
handle = -1;
|
handle = -1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -74,18 +56,15 @@ auto getLocks(const DBus& bus, const std::string& inhibitors) -> int {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto checkInhibitor(const std::string& inhibitor) -> const std::string& {
|
auto checkInhibitor(const std::string& inhibitor) -> const std::string& {
|
||||||
static const auto inhibitors = std::array{
|
static const auto inhibitors = std::array{"idle",
|
||||||
"idle",
|
"shutdown",
|
||||||
"shutdown",
|
"sleep",
|
||||||
"sleep",
|
"handle-power-key",
|
||||||
"handle-power-key",
|
"handle-suspend-key",
|
||||||
"handle-suspend-key",
|
"handle-hibernate-key",
|
||||||
"handle-hibernate-key",
|
"handle-lid-switch"};
|
||||||
"handle-lid-switch"
|
|
||||||
};
|
|
||||||
|
|
||||||
if (std::find(inhibitors.begin(), inhibitors.end(), inhibitor)
|
if (std::find(inhibitors.begin(), inhibitors.end(), inhibitor) == inhibitors.end()) {
|
||||||
== inhibitors.end()) {
|
|
||||||
throw std::runtime_error("invalid logind inhibitor " + inhibitor);
|
throw std::runtime_error("invalid logind inhibitor " + inhibitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,18 +93,16 @@ auto getInhibitors(const Json::Value& config) -> std::string {
|
||||||
return inhibitors;
|
return inhibitors;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} // namespace
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
Inhibitor::Inhibitor(const std::string& id, const Bar& bar,
|
Inhibitor::Inhibitor(const std::string& id, const Bar& bar, const Json::Value& config)
|
||||||
const Json::Value& config)
|
|
||||||
: ALabel(config, "inhibitor", id, "{status}", true),
|
: ALabel(config, "inhibitor", id, "{status}", true),
|
||||||
dbus_(::dbus()),
|
dbus_(::dbus()),
|
||||||
inhibitors_(::getInhibitors(config)) {
|
inhibitors_(::getInhibitors(config)) {
|
||||||
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
||||||
event_box_.signal_button_press_event().connect(
|
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &Inhibitor::handleToggle));
|
||||||
sigc::mem_fun(*this, &Inhibitor::handleToggle));
|
|
||||||
dp.emit();
|
dp.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,18 +112,14 @@ Inhibitor::~Inhibitor() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Inhibitor::activated() -> bool {
|
auto Inhibitor::activated() -> bool { return handle_ != -1; }
|
||||||
return handle_ != -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto Inhibitor::update() -> void {
|
auto Inhibitor::update() -> void {
|
||||||
std::string status_text = activated() ? "activated" : "deactivated";
|
std::string status_text = activated() ? "activated" : "deactivated";
|
||||||
|
|
||||||
label_.get_style_context()->remove_class(
|
label_.get_style_context()->remove_class(activated() ? "deactivated" : "activated");
|
||||||
activated() ? "deactivated" : "activated");
|
label_.set_markup(fmt::format(format_, fmt::arg("status", status_text),
|
||||||
label_.set_markup(
|
fmt::arg("icon", getIcon(0, status_text))));
|
||||||
fmt::format(format_, fmt::arg("status", status_text),
|
|
||||||
fmt::arg("icon", getIcon(0, status_text))));
|
|
||||||
label_.get_style_context()->add_class(status_text);
|
label_.get_style_context()->add_class(status_text);
|
||||||
|
|
||||||
if (tooltipEnabled()) {
|
if (tooltipEnabled()) {
|
||||||
|
@ -172,4 +145,4 @@ auto Inhibitor::handleToggle(GdkEventButton* const& e) -> bool {
|
||||||
return ALabel::handleToggle(e);
|
return ALabel::handleToggle(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // waybar::modules
|
} // namespace waybar::modules
|
||||||
|
|
|
@ -1,31 +1,32 @@
|
||||||
#include "modules/keyboard_state.hpp"
|
#include "modules/keyboard_state.hpp"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <filesystem>
|
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
class errno_error : public std::runtime_error {
|
class errno_error : public std::runtime_error {
|
||||||
public:
|
public:
|
||||||
int code;
|
int code;
|
||||||
errno_error(int code, const std::string& msg)
|
errno_error(int code, const std::string& msg)
|
||||||
: std::runtime_error(getErrorMsg(code, msg.c_str())),
|
: std::runtime_error(getErrorMsg(code, msg.c_str())), code(code) {}
|
||||||
code(code) {}
|
errno_error(int code, const char* msg) : std::runtime_error(getErrorMsg(code, msg)), code(code) {}
|
||||||
errno_error(int code, const char* msg)
|
|
||||||
: std::runtime_error(getErrorMsg(code, msg)),
|
|
||||||
code(code) {}
|
|
||||||
private:
|
private:
|
||||||
static auto getErrorMsg(int err, const char* msg) -> std::string {
|
static auto getErrorMsg(int err, const char* msg) -> std::string {
|
||||||
std::string error_msg{msg};
|
std::string error_msg{msg};
|
||||||
error_msg += ": ";
|
error_msg += ": ";
|
||||||
|
|
||||||
#if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 32)
|
#if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 32)
|
||||||
// strerrorname_np gets the error code's name; it's nice to have, but it's a recent GNU extension
|
// strerrorname_np gets the error code's name; it's nice to have, but it's a recent GNU
|
||||||
|
// extension
|
||||||
const auto errno_name = strerrorname_np(err);
|
const auto errno_name = strerrorname_np(err);
|
||||||
error_msg += errno_name;
|
error_msg += errno_name;
|
||||||
error_msg += " ";
|
error_msg += " ";
|
||||||
|
@ -67,33 +68,37 @@ auto openDevice(int fd) -> libevdev* {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto supportsLockStates(const libevdev* dev) -> bool {
|
auto supportsLockStates(const libevdev* dev) -> bool {
|
||||||
return libevdev_has_event_type(dev, EV_LED)
|
return libevdev_has_event_type(dev, EV_LED) && libevdev_has_event_code(dev, EV_LED, LED_NUML) &&
|
||||||
&& libevdev_has_event_code(dev, EV_LED, LED_NUML)
|
libevdev_has_event_code(dev, EV_LED, LED_CAPSL) &&
|
||||||
&& libevdev_has_event_code(dev, EV_LED, LED_CAPSL)
|
libevdev_has_event_code(dev, EV_LED, LED_SCROLLL);
|
||||||
&& libevdev_has_event_code(dev, EV_LED, LED_SCROLLL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
waybar::modules::KeyboardState::KeyboardState(const std::string& id, const Bar& bar, const Json::Value& config)
|
waybar::modules::KeyboardState::KeyboardState(const std::string& id, const Bar& bar,
|
||||||
|
const Json::Value& config)
|
||||||
: AModule(config, "keyboard-state", id, false, !config["disable-scroll"].asBool()),
|
: AModule(config, "keyboard-state", id, false, !config["disable-scroll"].asBool()),
|
||||||
box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0),
|
box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0),
|
||||||
numlock_label_(""),
|
numlock_label_(""),
|
||||||
capslock_label_(""),
|
capslock_label_(""),
|
||||||
numlock_format_(config_["format"].isString() ? config_["format"].asString()
|
numlock_format_(config_["format"].isString() ? config_["format"].asString()
|
||||||
: config_["format"]["numlock"].isString() ? config_["format"]["numlock"].asString()
|
: config_["format"]["numlock"].isString()
|
||||||
: "{name} {icon}"),
|
? config_["format"]["numlock"].asString()
|
||||||
|
: "{name} {icon}"),
|
||||||
capslock_format_(config_["format"].isString() ? config_["format"].asString()
|
capslock_format_(config_["format"].isString() ? config_["format"].asString()
|
||||||
: config_["format"]["capslock"].isString() ? config_["format"]["capslock"].asString()
|
: config_["format"]["capslock"].isString()
|
||||||
: "{name} {icon}"),
|
? config_["format"]["capslock"].asString()
|
||||||
|
: "{name} {icon}"),
|
||||||
scrolllock_format_(config_["format"].isString() ? config_["format"].asString()
|
scrolllock_format_(config_["format"].isString() ? config_["format"].asString()
|
||||||
: config_["format"]["scrolllock"].isString() ? config_["format"]["scrolllock"].asString()
|
: config_["format"]["scrolllock"].isString()
|
||||||
: "{name} {icon}"),
|
? config_["format"]["scrolllock"].asString()
|
||||||
interval_(std::chrono::seconds(config_["interval"].isUInt() ? config_["interval"].asUInt() : 1)),
|
: "{name} {icon}"),
|
||||||
|
interval_(
|
||||||
|
std::chrono::seconds(config_["interval"].isUInt() ? config_["interval"].asUInt() : 1)),
|
||||||
icon_locked_(config_["format-icons"]["locked"].isString()
|
icon_locked_(config_["format-icons"]["locked"].isString()
|
||||||
? config_["format-icons"]["locked"].asString()
|
? config_["format-icons"]["locked"].asString()
|
||||||
: "locked"),
|
: "locked"),
|
||||||
icon_unlocked_(config_["format-icons"]["unlocked"].isString()
|
icon_unlocked_(config_["format-icons"]["unlocked"].isString()
|
||||||
? config_["format-icons"]["unlocked"].asString()
|
? config_["format-icons"]["unlocked"].asString()
|
||||||
: "unlocked"),
|
: "unlocked"),
|
||||||
fd_(0),
|
fd_(0),
|
||||||
dev_(nullptr) {
|
dev_(nullptr) {
|
||||||
box_.set_name("keyboard-state");
|
box_.set_name("keyboard-state");
|
||||||
|
@ -120,7 +125,7 @@ waybar::modules::KeyboardState::KeyboardState(const std::string& id, const Bar&
|
||||||
if (dev_dir == nullptr) {
|
if (dev_dir == nullptr) {
|
||||||
throw errno_error(errno, "Failed to open /dev/input");
|
throw errno_error(errno, "Failed to open /dev/input");
|
||||||
}
|
}
|
||||||
dirent *ep;
|
dirent* ep;
|
||||||
while ((ep = readdir(dev_dir))) {
|
while ((ep = readdir(dev_dir))) {
|
||||||
if (ep->d_type != DT_CHR) continue;
|
if (ep->d_type != DT_CHR) continue;
|
||||||
std::string dev_path = std::string("/dev/input/") + ep->d_name;
|
std::string dev_path = std::string("/dev/input/") + ep->d_name;
|
||||||
|
@ -128,7 +133,7 @@ waybar::modules::KeyboardState::KeyboardState(const std::string& id, const Bar&
|
||||||
try {
|
try {
|
||||||
auto dev = openDevice(fd);
|
auto dev = openDevice(fd);
|
||||||
if (supportsLockStates(dev)) {
|
if (supportsLockStates(dev)) {
|
||||||
spdlog::info("Found device {} at '{}'", libevdev_get_name(dev), dev_path);
|
spdlog::info("Found device {} at '{}'", libevdev_get_name(dev), dev_path);
|
||||||
fd_ = fd;
|
fd_ = fd;
|
||||||
dev_ = dev;
|
dev_ = dev;
|
||||||
break;
|
break;
|
||||||
|
@ -184,9 +189,9 @@ auto waybar::modules::KeyboardState::update() -> void {
|
||||||
const std::string& format;
|
const std::string& format;
|
||||||
const char* name;
|
const char* name;
|
||||||
} label_states[] = {
|
} label_states[] = {
|
||||||
{(bool) numl, numlock_label_, numlock_format_, "Num"},
|
{(bool)numl, numlock_label_, numlock_format_, "Num"},
|
||||||
{(bool) capsl, capslock_label_, capslock_format_, "Caps"},
|
{(bool)capsl, capslock_label_, capslock_format_, "Caps"},
|
||||||
{(bool) scrolll, scrolllock_label_, scrolllock_format_, "Scroll"},
|
{(bool)scrolll, scrolllock_label_, scrolllock_format_, "Scroll"},
|
||||||
};
|
};
|
||||||
for (auto& label_state : label_states) {
|
for (auto& label_state : label_states) {
|
||||||
std::string text;
|
std::string text;
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
#include "modules/memory.hpp"
|
// clang-format off
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#include <unistd.h> // getpagesize
|
// clang-format on
|
||||||
|
#include <unistd.h> // getpagesize
|
||||||
|
|
||||||
|
#include "modules/memory.hpp"
|
||||||
|
|
||||||
#if defined(__DragonFly__)
|
#if defined(__DragonFly__)
|
||||||
# include <sys/vmmeter.h> // struct vmstats
|
#include <sys/vmmeter.h> // struct vmstats
|
||||||
#elif defined(__NetBSD__)
|
#elif defined(__NetBSD__)
|
||||||
# include <uvm/uvm_extern.h> // struct uvmexp_sysctl
|
#include <uvm/uvm_extern.h> // struct uvmexp_sysctl
|
||||||
#elif defined(__OpenBSD__)
|
#elif defined(__OpenBSD__)
|
||||||
# include <uvm/uvmexp.h> // struct uvmexp
|
#include <uvm/uvmexp.h> // struct uvmexp
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static uint64_t get_total_memory() {
|
static uint64_t get_total_memory() {
|
||||||
|
@ -43,33 +45,27 @@ static uint64_t get_free_memory() {
|
||||||
if (sysctlbyname("vm.vmstats", &vms, &sz, NULL, 0)) {
|
if (sysctlbyname("vm.vmstats", &vms, &sz, NULL, 0)) {
|
||||||
throw std::runtime_error("sysctl vm.vmstats failed");
|
throw std::runtime_error("sysctl vm.vmstats failed");
|
||||||
}
|
}
|
||||||
return static_cast<uint64_t>
|
return static_cast<uint64_t>(vms.v_free_count + vms.v_inactive_count + vms.v_cache_count) *
|
||||||
(vms.v_free_count + vms.v_inactive_count + vms.v_cache_count)
|
getpagesize();
|
||||||
* getpagesize();
|
|
||||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||||
u_int v_free_count = 0, v_inactive_count = 0, v_cache_count = 0;
|
u_int v_free_count = 0, v_inactive_count = 0, v_cache_count = 0;
|
||||||
size_t sz = sizeof(u_int);
|
size_t sz = sizeof(u_int);
|
||||||
sysctlbyname("vm.stats.vm.v_free_count",
|
sysctlbyname("vm.stats.vm.v_free_count", &v_free_count, &sz, NULL, 0);
|
||||||
&v_free_count, &sz, NULL, 0);
|
sysctlbyname("vm.stats.vm.v_inactive_count", &v_inactive_count, &sz, NULL, 0);
|
||||||
sysctlbyname("vm.stats.vm.v_inactive_count",
|
sysctlbyname("vm.stats.vm.v_cache_count", &v_cache_count, &sz, NULL, 0);
|
||||||
&v_inactive_count, &sz, NULL, 0);
|
return static_cast<uint64_t>(v_free_count + v_inactive_count + v_cache_count) * getpagesize();
|
||||||
sysctlbyname("vm.stats.vm.v_cache_count",
|
|
||||||
&v_cache_count, &sz, NULL, 0);
|
|
||||||
return static_cast<uint64_t>
|
|
||||||
(v_free_count + v_inactive_count + v_cache_count)
|
|
||||||
* getpagesize();
|
|
||||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
#ifdef VM_UVMEXP2
|
#ifdef VM_UVMEXP2
|
||||||
# undef VM_UVMEXP
|
#undef VM_UVMEXP
|
||||||
# define VM_UVMEXP VM_UVMEXP2
|
#define VM_UVMEXP VM_UVMEXP2
|
||||||
# define uvmexp uvmexp_sysctl
|
#define uvmexp uvmexp_sysctl
|
||||||
#else
|
#else
|
||||||
# define filepages vnodepages
|
#define filepages vnodepages
|
||||||
# define execpages vtextpages
|
#define execpages vtextpages
|
||||||
#endif
|
#endif
|
||||||
int mib[] = {
|
int mib[] = {
|
||||||
CTL_VM,
|
CTL_VM,
|
||||||
VM_UVMEXP,
|
VM_UVMEXP,
|
||||||
};
|
};
|
||||||
u_int miblen = sizeof(mib) / sizeof(mib[0]);
|
u_int miblen = sizeof(mib) / sizeof(mib[0]);
|
||||||
struct uvmexp uvmexp;
|
struct uvmexp uvmexp;
|
||||||
|
@ -77,9 +73,9 @@ static uint64_t get_free_memory() {
|
||||||
if (sysctl(mib, miblen, &uvmexp, &sz, NULL, 0)) {
|
if (sysctl(mib, miblen, &uvmexp, &sz, NULL, 0)) {
|
||||||
throw std::runtime_error("sysctl vm.uvmexp failed");
|
throw std::runtime_error("sysctl vm.uvmexp failed");
|
||||||
}
|
}
|
||||||
return static_cast<uint64_t>
|
return static_cast<uint64_t>(uvmexp.free + uvmexp.inactive + uvmexp.filepages +
|
||||||
(uvmexp.free + uvmexp.inactive + uvmexp.filepages + uvmexp.execpages)
|
uvmexp.execpages) *
|
||||||
* uvmexp.pagesize;
|
uvmexp.pagesize;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,8 +33,8 @@ auto waybar::modules::Memory::update() -> void {
|
||||||
if (memtotal > 0 && memfree >= 0) {
|
if (memtotal > 0 && memfree >= 0) {
|
||||||
auto total_ram_gigabytes = memtotal / std::pow(1024, 2);
|
auto total_ram_gigabytes = memtotal / std::pow(1024, 2);
|
||||||
auto total_swap_gigabytes = swaptotal / std::pow(1024, 2);
|
auto total_swap_gigabytes = swaptotal / std::pow(1024, 2);
|
||||||
int used_ram_percentage = 100 * (memtotal - memfree) / memtotal;
|
int used_ram_percentage = 100 * (memtotal - memfree) / memtotal;
|
||||||
int used_swap_percentage = 0;
|
int used_swap_percentage = 0;
|
||||||
if (swaptotal && swapfree) {
|
if (swaptotal && swapfree) {
|
||||||
used_swap_percentage = 100 * (swaptotal - swapfree) / swaptotal;
|
used_swap_percentage = 100 * (swaptotal - swapfree) / swaptotal;
|
||||||
}
|
}
|
||||||
|
@ -54,32 +54,25 @@ auto waybar::modules::Memory::update() -> void {
|
||||||
} else {
|
} else {
|
||||||
event_box_.show();
|
event_box_.show();
|
||||||
auto icons = std::vector<std::string>{state};
|
auto icons = std::vector<std::string>{state};
|
||||||
label_.set_markup(fmt::format(format,
|
label_.set_markup(fmt::format(
|
||||||
used_ram_percentage,
|
format, used_ram_percentage, fmt::arg("icon", getIcon(used_ram_percentage, icons)),
|
||||||
fmt::arg("icon", getIcon(used_ram_percentage, icons)),
|
fmt::arg("total", total_ram_gigabytes), fmt::arg("swapTotal", total_swap_gigabytes),
|
||||||
fmt::arg("total", total_ram_gigabytes),
|
fmt::arg("percentage", used_ram_percentage),
|
||||||
fmt::arg("swapTotal", total_swap_gigabytes),
|
fmt::arg("swapPercentage", used_swap_percentage), fmt::arg("used", used_ram_gigabytes),
|
||||||
fmt::arg("percentage", used_ram_percentage),
|
fmt::arg("swapUsed", used_swap_gigabytes), fmt::arg("avail", available_ram_gigabytes),
|
||||||
fmt::arg("swapPercentage", used_swap_percentage),
|
fmt::arg("swapAvail", available_swap_gigabytes)));
|
||||||
fmt::arg("used", used_ram_gigabytes),
|
|
||||||
fmt::arg("swapUsed", used_swap_gigabytes),
|
|
||||||
fmt::arg("avail", available_ram_gigabytes),
|
|
||||||
fmt::arg("swapAvail", available_swap_gigabytes)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tooltipEnabled()) {
|
if (tooltipEnabled()) {
|
||||||
if (config_["tooltip-format"].isString()) {
|
if (config_["tooltip-format"].isString()) {
|
||||||
auto tooltip_format = config_["tooltip-format"].asString();
|
auto tooltip_format = config_["tooltip-format"].asString();
|
||||||
label_.set_tooltip_text(fmt::format(tooltip_format,
|
label_.set_tooltip_text(fmt::format(
|
||||||
used_ram_percentage,
|
tooltip_format, used_ram_percentage, fmt::arg("total", total_ram_gigabytes),
|
||||||
fmt::arg("total", total_ram_gigabytes),
|
fmt::arg("swapTotal", total_swap_gigabytes),
|
||||||
fmt::arg("swapTotal", total_swap_gigabytes),
|
fmt::arg("percentage", used_ram_percentage),
|
||||||
fmt::arg("percentage", used_ram_percentage),
|
fmt::arg("swapPercentage", used_swap_percentage), fmt::arg("used", used_ram_gigabytes),
|
||||||
fmt::arg("swapPercentage", used_swap_percentage),
|
fmt::arg("swapUsed", used_swap_gigabytes), fmt::arg("avail", available_ram_gigabytes),
|
||||||
fmt::arg("used", used_ram_gigabytes),
|
fmt::arg("swapAvail", available_swap_gigabytes)));
|
||||||
fmt::arg("swapUsed", used_swap_gigabytes),
|
|
||||||
fmt::arg("avail", available_ram_gigabytes),
|
|
||||||
fmt::arg("swapAvail", available_swap_gigabytes)));
|
|
||||||
} else {
|
} else {
|
||||||
label_.set_tooltip_text(fmt::format("{:.{}f}GiB used", used_ram_gigabytes, 1));
|
label_.set_tooltip_text(fmt::format("{:.{}f}GiB used", used_ram_gigabytes, 1));
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,8 @@ static unsigned zfsArcSize() {
|
||||||
std::ifstream zfs_arc_stats{"/proc/spl/kstat/zfs/arcstats"};
|
std::ifstream zfs_arc_stats{"/proc/spl/kstat/zfs/arcstats"};
|
||||||
|
|
||||||
if (zfs_arc_stats.is_open()) {
|
if (zfs_arc_stats.is_open()) {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string type;
|
std::string type;
|
||||||
unsigned long data{0};
|
unsigned long data{0};
|
||||||
|
|
||||||
std::string line;
|
std::string line;
|
||||||
|
@ -23,7 +23,7 @@ static unsigned zfsArcSize() {
|
||||||
|
|
||||||
void waybar::modules::Memory::parseMeminfo() {
|
void waybar::modules::Memory::parseMeminfo() {
|
||||||
const std::string data_dir_ = "/proc/meminfo";
|
const std::string data_dir_ = "/proc/meminfo";
|
||||||
std::ifstream info(data_dir_);
|
std::ifstream info(data_dir_);
|
||||||
if (!info.is_open()) {
|
if (!info.is_open()) {
|
||||||
throw std::runtime_error("Can't open " + data_dir_);
|
throw std::runtime_error("Can't open " + data_dir_);
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ void waybar::modules::Memory::parseMeminfo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string name = line.substr(0, posDelim);
|
std::string name = line.substr(0, posDelim);
|
||||||
int64_t value = std::stol(line.substr(posDelim + 1));
|
int64_t value = std::stol(line.substr(posDelim + 1));
|
||||||
meminfo_[name] = value;
|
meminfo_[name] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
#include "modules/mpd/mpd.hpp"
|
#include "modules/mpd/mpd.hpp"
|
||||||
|
|
||||||
#include <fmt/chrono.h>
|
#include <fmt/chrono.h>
|
||||||
#include <spdlog/spdlog.h>
|
|
||||||
#include <glibmm/ustring.h>
|
#include <glibmm/ustring.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
#include "modules/mpd/state.hpp"
|
#include "modules/mpd/state.hpp"
|
||||||
#if defined(MPD_NOINLINE)
|
#if defined(MPD_NOINLINE)
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
@ -98,9 +99,9 @@ void waybar::modules::MPD::setLabel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto format = format_;
|
auto format = format_;
|
||||||
Glib::ustring artist, album_artist, album, title;
|
Glib::ustring artist, album_artist, album, title;
|
||||||
std::string date;
|
std::string date;
|
||||||
int song_pos = 0, queue_length = 0, volume = 0;
|
int song_pos = 0, queue_length = 0, volume = 0;
|
||||||
std::chrono::seconds elapsedTime, totalTime;
|
std::chrono::seconds elapsedTime, totalTime;
|
||||||
|
|
||||||
std::string stateIcon = "";
|
std::string stateIcon = "";
|
||||||
|
@ -139,37 +140,32 @@ void waybar::modules::MPD::setLabel() {
|
||||||
totalTime = std::chrono::seconds(mpd_status_get_total_time(status_.get()));
|
totalTime = std::chrono::seconds(mpd_status_get_total_time(status_.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool consumeActivated = mpd_status_get_consume(status_.get());
|
bool consumeActivated = mpd_status_get_consume(status_.get());
|
||||||
std::string consumeIcon = getOptionIcon("consume", consumeActivated);
|
std::string consumeIcon = getOptionIcon("consume", consumeActivated);
|
||||||
bool randomActivated = mpd_status_get_random(status_.get());
|
bool randomActivated = mpd_status_get_random(status_.get());
|
||||||
std::string randomIcon = getOptionIcon("random", randomActivated);
|
std::string randomIcon = getOptionIcon("random", randomActivated);
|
||||||
bool repeatActivated = mpd_status_get_repeat(status_.get());
|
bool repeatActivated = mpd_status_get_repeat(status_.get());
|
||||||
std::string repeatIcon = getOptionIcon("repeat", repeatActivated);
|
std::string repeatIcon = getOptionIcon("repeat", repeatActivated);
|
||||||
bool singleActivated = mpd_status_get_single(status_.get());
|
bool singleActivated = mpd_status_get_single(status_.get());
|
||||||
std::string singleIcon = getOptionIcon("single", singleActivated);
|
std::string singleIcon = getOptionIcon("single", singleActivated);
|
||||||
if (config_["artist-len"].isInt()) artist = artist.substr(0, config_["artist-len"].asInt());
|
if (config_["artist-len"].isInt()) artist = artist.substr(0, config_["artist-len"].asInt());
|
||||||
if (config_["album-artist-len"].isInt()) album_artist = album_artist.substr(0, config_["album-artist-len"].asInt());
|
if (config_["album-artist-len"].isInt())
|
||||||
|
album_artist = album_artist.substr(0, config_["album-artist-len"].asInt());
|
||||||
if (config_["album-len"].isInt()) album = album.substr(0, config_["album-len"].asInt());
|
if (config_["album-len"].isInt()) album = album.substr(0, config_["album-len"].asInt());
|
||||||
if (config_["title-len"].isInt()) title = title.substr(0,config_["title-len"].asInt());
|
if (config_["title-len"].isInt()) title = title.substr(0, config_["title-len"].asInt());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
label_.set_markup(
|
label_.set_markup(
|
||||||
fmt::format(format,
|
fmt::format(format, fmt::arg("artist", Glib::Markup::escape_text(artist).raw()),
|
||||||
fmt::arg("artist", Glib::Markup::escape_text(artist).raw()),
|
|
||||||
fmt::arg("albumArtist", Glib::Markup::escape_text(album_artist).raw()),
|
fmt::arg("albumArtist", Glib::Markup::escape_text(album_artist).raw()),
|
||||||
fmt::arg("album", Glib::Markup::escape_text(album).raw()),
|
fmt::arg("album", Glib::Markup::escape_text(album).raw()),
|
||||||
fmt::arg("title", Glib::Markup::escape_text(title).raw()),
|
fmt::arg("title", Glib::Markup::escape_text(title).raw()),
|
||||||
fmt::arg("date", Glib::Markup::escape_text(date).raw()),
|
fmt::arg("date", Glib::Markup::escape_text(date).raw()),
|
||||||
fmt::arg("volume", volume),
|
fmt::arg("volume", volume), fmt::arg("elapsedTime", elapsedTime),
|
||||||
fmt::arg("elapsedTime", elapsedTime),
|
fmt::arg("totalTime", totalTime), fmt::arg("songPosition", song_pos),
|
||||||
fmt::arg("totalTime", totalTime),
|
fmt::arg("queueLength", queue_length), fmt::arg("stateIcon", stateIcon),
|
||||||
fmt::arg("songPosition", song_pos),
|
fmt::arg("consumeIcon", consumeIcon), fmt::arg("randomIcon", randomIcon),
|
||||||
fmt::arg("queueLength", queue_length),
|
fmt::arg("repeatIcon", repeatIcon), fmt::arg("singleIcon", singleIcon)));
|
||||||
fmt::arg("stateIcon", stateIcon),
|
|
||||||
fmt::arg("consumeIcon", consumeIcon),
|
|
||||||
fmt::arg("randomIcon", randomIcon),
|
|
||||||
fmt::arg("repeatIcon", repeatIcon),
|
|
||||||
fmt::arg("singleIcon", singleIcon)));
|
|
||||||
} catch (fmt::format_error const& e) {
|
} catch (fmt::format_error const& e) {
|
||||||
spdlog::warn("mpd: format error: {}", e.what());
|
spdlog::warn("mpd: format error: {}", e.what());
|
||||||
}
|
}
|
||||||
|
@ -179,22 +175,15 @@ void waybar::modules::MPD::setLabel() {
|
||||||
tooltip_format = config_["tooltip-format"].isString() ? config_["tooltip-format"].asString()
|
tooltip_format = config_["tooltip-format"].isString() ? config_["tooltip-format"].asString()
|
||||||
: "MPD (connected)";
|
: "MPD (connected)";
|
||||||
try {
|
try {
|
||||||
auto tooltip_text = fmt::format(tooltip_format,
|
auto tooltip_text =
|
||||||
fmt::arg("artist", artist.raw()),
|
fmt::format(tooltip_format, fmt::arg("artist", artist.raw()),
|
||||||
fmt::arg("albumArtist", album_artist.raw()),
|
fmt::arg("albumArtist", album_artist.raw()), fmt::arg("album", album.raw()),
|
||||||
fmt::arg("album", album.raw()),
|
fmt::arg("title", title.raw()), fmt::arg("date", date),
|
||||||
fmt::arg("title", title.raw()),
|
fmt::arg("volume", volume), fmt::arg("elapsedTime", elapsedTime),
|
||||||
fmt::arg("date", date),
|
fmt::arg("totalTime", totalTime), fmt::arg("songPosition", song_pos),
|
||||||
fmt::arg("volume", volume),
|
fmt::arg("queueLength", queue_length), fmt::arg("stateIcon", stateIcon),
|
||||||
fmt::arg("elapsedTime", elapsedTime),
|
fmt::arg("consumeIcon", consumeIcon), fmt::arg("randomIcon", randomIcon),
|
||||||
fmt::arg("totalTime", totalTime),
|
fmt::arg("repeatIcon", repeatIcon), fmt::arg("singleIcon", singleIcon));
|
||||||
fmt::arg("songPosition", song_pos),
|
|
||||||
fmt::arg("queueLength", queue_length),
|
|
||||||
fmt::arg("stateIcon", stateIcon),
|
|
||||||
fmt::arg("consumeIcon", consumeIcon),
|
|
||||||
fmt::arg("randomIcon", randomIcon),
|
|
||||||
fmt::arg("repeatIcon", repeatIcon),
|
|
||||||
fmt::arg("singleIcon", singleIcon));
|
|
||||||
label_.set_tooltip_text(tooltip_text);
|
label_.set_tooltip_text(tooltip_text);
|
||||||
} catch (fmt::format_error const& e) {
|
} catch (fmt::format_error const& e) {
|
||||||
spdlog::warn("mpd: format error (tooltip): {}", e.what());
|
spdlog::warn("mpd: format error (tooltip): {}", e.what());
|
||||||
|
|
|
@ -50,7 +50,7 @@ void Idle::update() noexcept {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Idle::entry() noexcept {
|
void Idle::entry() noexcept {
|
||||||
auto conn = ctx_->connection().get();
|
auto conn = ctx_->connection().get();
|
||||||
assert(conn != nullptr);
|
assert(conn != nullptr);
|
||||||
|
|
||||||
if (!mpd_send_idle_mask(
|
if (!mpd_send_idle_mask(
|
||||||
|
@ -61,8 +61,7 @@ void Idle::entry() noexcept {
|
||||||
spdlog::debug("mpd: Idle: watching FD");
|
spdlog::debug("mpd: Idle: watching FD");
|
||||||
sigc::slot<bool, Glib::IOCondition const&> idle_slot = sigc::mem_fun(*this, &Idle::on_io);
|
sigc::slot<bool, Glib::IOCondition const&> idle_slot = sigc::mem_fun(*this, &Idle::on_io);
|
||||||
idle_connection_ =
|
idle_connection_ =
|
||||||
Glib::signal_io().connect(idle_slot,
|
Glib::signal_io().connect(idle_slot, mpd_connection_get_fd(conn),
|
||||||
mpd_connection_get_fd(conn),
|
|
||||||
Glib::IO_IN | Glib::IO_PRI | Glib::IO_ERR | Glib::IO_HUP);
|
Glib::IO_IN | Glib::IO_PRI | Glib::IO_ERR | Glib::IO_HUP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,7 +74,7 @@ void Idle::exit() noexcept {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Idle::on_io(Glib::IOCondition const&) {
|
bool Idle::on_io(Glib::IOCondition const&) {
|
||||||
auto conn = ctx_->connection().get();
|
auto conn = ctx_->connection().get();
|
||||||
|
|
||||||
// callback should do this:
|
// callback should do this:
|
||||||
enum mpd_idle events = mpd_recv_idle(conn, /* ignore_timeout?= */ false);
|
enum mpd_idle events = mpd_recv_idle(conn, /* ignore_timeout?= */ false);
|
||||||
|
@ -193,7 +192,7 @@ void Paused::exit() noexcept {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Paused::on_timer() {
|
bool Paused::on_timer() {
|
||||||
bool rc = true;
|
bool rc = true;
|
||||||
|
|
||||||
// Attempt to connect with MPD.
|
// Attempt to connect with MPD.
|
||||||
try {
|
try {
|
||||||
|
@ -264,7 +263,7 @@ void Stopped::exit() noexcept {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Stopped::on_timer() {
|
bool Stopped::on_timer() {
|
||||||
bool rc = true;
|
bool rc = true;
|
||||||
|
|
||||||
// Attempt to connect with MPD.
|
// Attempt to connect with MPD.
|
||||||
try {
|
try {
|
||||||
|
@ -327,8 +326,7 @@ void Disconnected::arm_timer(int interval) noexcept {
|
||||||
|
|
||||||
// register timer
|
// register timer
|
||||||
sigc::slot<bool> timer_slot = sigc::mem_fun(*this, &Disconnected::on_timer);
|
sigc::slot<bool> timer_slot = sigc::mem_fun(*this, &Disconnected::on_timer);
|
||||||
timer_connection_ =
|
timer_connection_ = Glib::signal_timeout().connect(timer_slot, interval);
|
||||||
Glib::signal_timeout().connect(timer_slot, interval);
|
|
||||||
spdlog::debug("mpd: Disconnected: enabled interval timer.");
|
spdlog::debug("mpd: Disconnected: enabled interval timer.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,9 +343,7 @@ void Disconnected::entry() noexcept {
|
||||||
arm_timer(1'000);
|
arm_timer(1'000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disconnected::exit() noexcept {
|
void Disconnected::exit() noexcept { disarm_timer(); }
|
||||||
disarm_timer();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Disconnected::on_timer() {
|
bool Disconnected::on_timer() {
|
||||||
// Attempt to connect with MPD.
|
// Attempt to connect with MPD.
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
|
#include "modules/network.hpp"
|
||||||
|
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <sys/eventfd.h>
|
#include <sys/eventfd.h>
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include "modules/network.hpp"
|
|
||||||
#include "util/format.hpp"
|
#include "util/format.hpp"
|
||||||
#ifdef WANT_RFKILL
|
#ifdef WANT_RFKILL
|
||||||
#include "util/rfkill.hpp"
|
#include "util/rfkill.hpp"
|
||||||
|
@ -39,7 +40,7 @@ waybar::modules::Network::readBandwidthUsage() {
|
||||||
std::istringstream iss(line);
|
std::istringstream iss(line);
|
||||||
|
|
||||||
std::string ifacename;
|
std::string ifacename;
|
||||||
iss >> ifacename; // ifacename contains "eth0:"
|
iss >> ifacename; // ifacename contains "eth0:"
|
||||||
ifacename.pop_back(); // remove trailing ':'
|
ifacename.pop_back(); // remove trailing ':'
|
||||||
if (!checkInterface(ifacename)) {
|
if (!checkInterface(ifacename)) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -58,9 +59,13 @@ waybar::modules::Network::readBandwidthUsage() {
|
||||||
// Skip all the other columns in the received group
|
// Skip all the other columns in the received group
|
||||||
for (int colsToSkip = 7; colsToSkip > 0; colsToSkip--) {
|
for (int colsToSkip = 7; colsToSkip > 0; colsToSkip--) {
|
||||||
// skip whitespace between columns
|
// skip whitespace between columns
|
||||||
while (iss.peek() == ' ') { iss.ignore(); }
|
while (iss.peek() == ' ') {
|
||||||
|
iss.ignore();
|
||||||
|
}
|
||||||
// skip the irrelevant column
|
// skip the irrelevant column
|
||||||
while (iss.peek() != ' ') { iss.ignore(); }
|
while (iss.peek() != ' ') {
|
||||||
|
iss.ignore();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Read transmit bytes
|
// Read transmit bytes
|
||||||
iss >> t;
|
iss >> t;
|
||||||
|
@ -192,7 +197,7 @@ void waybar::modules::Network::createEventSocket() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto fd = nl_socket_get_fd(ev_sock_);
|
auto fd = nl_socket_get_fd(ev_sock_);
|
||||||
struct epoll_event event;
|
struct epoll_event event;
|
||||||
memset(&event, 0, sizeof(event));
|
memset(&event, 0, sizeof(event));
|
||||||
event.events = EPOLLIN | EPOLLET | EPOLLRDHUP;
|
event.events = EPOLLIN | EPOLLET | EPOLLRDHUP;
|
||||||
|
@ -274,8 +279,7 @@ void waybar::modules::Network::worker() {
|
||||||
const std::string waybar::modules::Network::getNetworkState() const {
|
const std::string waybar::modules::Network::getNetworkState() const {
|
||||||
if (ifid_ == -1) {
|
if (ifid_ == -1) {
|
||||||
#ifdef WANT_RFKILL
|
#ifdef WANT_RFKILL
|
||||||
if (rfkill_.getState())
|
if (rfkill_.getState()) return "disabled";
|
||||||
return "disabled";
|
|
||||||
#endif
|
#endif
|
||||||
return "disconnected";
|
return "disconnected";
|
||||||
}
|
}
|
||||||
|
@ -287,7 +291,7 @@ const std::string waybar::modules::Network::getNetworkState() const {
|
||||||
|
|
||||||
auto waybar::modules::Network::update() -> void {
|
auto waybar::modules::Network::update() -> void {
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
std::string tooltip_format;
|
std::string tooltip_format;
|
||||||
|
|
||||||
auto bandwidth = readBandwidthUsage();
|
auto bandwidth = readBandwidthUsage();
|
||||||
auto bandwidth_down = 0ull;
|
auto bandwidth_down = 0ull;
|
||||||
|
@ -327,17 +331,11 @@ auto waybar::modules::Network::update() -> void {
|
||||||
getState(signal_strength_);
|
getState(signal_strength_);
|
||||||
|
|
||||||
auto text = fmt::format(
|
auto text = fmt::format(
|
||||||
format_,
|
format_, fmt::arg("essid", essid_), fmt::arg("signaldBm", signal_strength_dbm_),
|
||||||
fmt::arg("essid", essid_),
|
|
||||||
fmt::arg("signaldBm", signal_strength_dbm_),
|
|
||||||
fmt::arg("signalStrength", signal_strength_),
|
fmt::arg("signalStrength", signal_strength_),
|
||||||
fmt::arg("signalStrengthApp", signal_strength_app_),
|
fmt::arg("signalStrengthApp", signal_strength_app_), fmt::arg("ifname", ifname_),
|
||||||
fmt::arg("ifname", ifname_),
|
fmt::arg("netmask", netmask_), fmt::arg("ipaddr", ipaddr_), fmt::arg("gwaddr", gwaddr_),
|
||||||
fmt::arg("netmask", netmask_),
|
fmt::arg("cidr", cidr_), fmt::arg("frequency", fmt::format("{:.1f}", frequency_)),
|
||||||
fmt::arg("ipaddr", ipaddr_),
|
|
||||||
fmt::arg("gwaddr", gwaddr_),
|
|
||||||
fmt::arg("cidr", cidr_),
|
|
||||||
fmt::arg("frequency", fmt::format("{:.1f}", frequency_)),
|
|
||||||
fmt::arg("icon", getIcon(signal_strength_, state_)),
|
fmt::arg("icon", getIcon(signal_strength_, state_)),
|
||||||
fmt::arg("bandwidthDownBits", pow_format(bandwidth_down * 8ull / interval_.count(), "b/s")),
|
fmt::arg("bandwidthDownBits", pow_format(bandwidth_down * 8ull / interval_.count(), "b/s")),
|
||||||
fmt::arg("bandwidthUpBits", pow_format(bandwidth_up * 8ull / interval_.count(), "b/s")),
|
fmt::arg("bandwidthUpBits", pow_format(bandwidth_up * 8ull / interval_.count(), "b/s")),
|
||||||
|
@ -359,17 +357,11 @@ auto waybar::modules::Network::update() -> void {
|
||||||
}
|
}
|
||||||
if (!tooltip_format.empty()) {
|
if (!tooltip_format.empty()) {
|
||||||
auto tooltip_text = fmt::format(
|
auto tooltip_text = fmt::format(
|
||||||
tooltip_format,
|
tooltip_format, fmt::arg("essid", essid_), fmt::arg("signaldBm", signal_strength_dbm_),
|
||||||
fmt::arg("essid", essid_),
|
|
||||||
fmt::arg("signaldBm", signal_strength_dbm_),
|
|
||||||
fmt::arg("signalStrength", signal_strength_),
|
fmt::arg("signalStrength", signal_strength_),
|
||||||
fmt::arg("signalStrengthApp", signal_strength_app_),
|
fmt::arg("signalStrengthApp", signal_strength_app_), fmt::arg("ifname", ifname_),
|
||||||
fmt::arg("ifname", ifname_),
|
fmt::arg("netmask", netmask_), fmt::arg("ipaddr", ipaddr_), fmt::arg("gwaddr", gwaddr_),
|
||||||
fmt::arg("netmask", netmask_),
|
fmt::arg("cidr", cidr_), fmt::arg("frequency", fmt::format("{:.1f}", frequency_)),
|
||||||
fmt::arg("ipaddr", ipaddr_),
|
|
||||||
fmt::arg("gwaddr", gwaddr_),
|
|
||||||
fmt::arg("cidr", cidr_),
|
|
||||||
fmt::arg("frequency", fmt::format("{:.1f}", frequency_)),
|
|
||||||
fmt::arg("icon", getIcon(signal_strength_, state_)),
|
fmt::arg("icon", getIcon(signal_strength_, state_)),
|
||||||
fmt::arg("bandwidthDownBits",
|
fmt::arg("bandwidthDownBits",
|
||||||
pow_format(bandwidth_down * 8ull / interval_.count(), "b/s")),
|
pow_format(bandwidth_down * 8ull / interval_.count(), "b/s")),
|
||||||
|
@ -414,286 +406,279 @@ void waybar::modules::Network::clearIface() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
||||||
auto net = static_cast<waybar::modules::Network *>(data);
|
auto net = static_cast<waybar::modules::Network *>(data);
|
||||||
std::lock_guard<std::mutex> lock(net->mutex_);
|
std::lock_guard<std::mutex> lock(net->mutex_);
|
||||||
auto nh = nlmsg_hdr(msg);
|
auto nh = nlmsg_hdr(msg);
|
||||||
bool is_del_event = false;
|
bool is_del_event = false;
|
||||||
|
|
||||||
switch (nh->nlmsg_type) {
|
switch (nh->nlmsg_type) {
|
||||||
case RTM_DELLINK:
|
case RTM_DELLINK:
|
||||||
is_del_event = true;
|
is_del_event = true;
|
||||||
case RTM_NEWLINK: {
|
case RTM_NEWLINK: {
|
||||||
struct ifinfomsg *ifi = static_cast<struct ifinfomsg *>(NLMSG_DATA(nh));
|
struct ifinfomsg *ifi = static_cast<struct ifinfomsg *>(NLMSG_DATA(nh));
|
||||||
ssize_t attrlen = IFLA_PAYLOAD(nh);
|
ssize_t attrlen = IFLA_PAYLOAD(nh);
|
||||||
struct rtattr *ifla = IFLA_RTA(ifi);
|
struct rtattr *ifla = IFLA_RTA(ifi);
|
||||||
const char *ifname = NULL;
|
const char *ifname = NULL;
|
||||||
size_t ifname_len = 0;
|
size_t ifname_len = 0;
|
||||||
std::optional<bool> carrier;
|
std::optional<bool> carrier;
|
||||||
|
|
||||||
if (net->ifid_ != -1 && ifi->ifi_index != net->ifid_) {
|
if (net->ifid_ != -1 && ifi->ifi_index != net->ifid_) {
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the interface goes "down" and if we want to detect the
|
|
||||||
// external interface.
|
|
||||||
if (net->ifid_ != -1 && !(ifi->ifi_flags & IFF_UP)
|
|
||||||
&& !net->config_["interface"].isString()) {
|
|
||||||
// The current interface is now down, all the routes associated with
|
|
||||||
// it have been deleted, so start looking for a new default route.
|
|
||||||
spdlog::debug("network: if{} down", net->ifid_);
|
|
||||||
net->clearIface();
|
|
||||||
net->dp.emit();
|
|
||||||
net->want_route_dump_ = true;
|
|
||||||
net->askForStateDump();
|
|
||||||
return NL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; RTA_OK(ifla, attrlen); ifla = RTA_NEXT(ifla, attrlen)) {
|
|
||||||
switch (ifla->rta_type) {
|
|
||||||
case IFLA_IFNAME:
|
|
||||||
ifname = static_cast<const char *>(RTA_DATA(ifla));
|
|
||||||
ifname_len = RTA_PAYLOAD(ifla) - 1; // minus \0
|
|
||||||
break;
|
|
||||||
case IFLA_CARRIER: {
|
|
||||||
carrier = *(char*)RTA_DATA(ifla) == 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_del_event && ifi->ifi_index == net->ifid_) {
|
|
||||||
// Update interface information
|
|
||||||
if (net->ifname_.empty() && ifname != NULL) {
|
|
||||||
std::string new_ifname (ifname, ifname_len);
|
|
||||||
net->ifname_ = new_ifname;
|
|
||||||
}
|
|
||||||
if (carrier.has_value()) {
|
|
||||||
if (net->carrier_ != *carrier) {
|
|
||||||
if (*carrier) {
|
|
||||||
// Ask for WiFi information
|
|
||||||
net->thread_timer_.wake_up();
|
|
||||||
} else {
|
|
||||||
// clear state related to WiFi connection
|
|
||||||
net->essid_.clear();
|
|
||||||
net->signal_strength_dbm_ = 0;
|
|
||||||
net->signal_strength_ = 0;
|
|
||||||
net->signal_strength_app_.clear();
|
|
||||||
net->frequency_ = 0.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
net->carrier_ = carrier.value();
|
|
||||||
}
|
|
||||||
} else if (!is_del_event && net->ifid_ == -1) {
|
|
||||||
// Checking if it's an interface we care about.
|
|
||||||
std::string new_ifname (ifname, ifname_len);
|
|
||||||
if (net->checkInterface(new_ifname)) {
|
|
||||||
spdlog::debug("network: selecting new interface {}/{}", new_ifname, ifi->ifi_index);
|
|
||||||
|
|
||||||
net->ifname_ = new_ifname;
|
|
||||||
net->ifid_ = ifi->ifi_index;
|
|
||||||
if (carrier.has_value()) {
|
|
||||||
net->carrier_ = carrier.value();
|
|
||||||
}
|
|
||||||
net->thread_timer_.wake_up();
|
|
||||||
/* An address for this new interface should be received via an
|
|
||||||
* RTM_NEWADDR event either because we ask for a dump of both links
|
|
||||||
* and addrs, or because this interface has just been created and
|
|
||||||
* the addr will be sent after the RTM_NEWLINK event.
|
|
||||||
* So we don't need to do anything. */
|
|
||||||
}
|
|
||||||
} else if (is_del_event && net->ifid_ >= 0) {
|
|
||||||
// Our interface has been deleted, start looking/waiting for one we care.
|
|
||||||
spdlog::debug("network: interface {}/{} deleted", net->ifname_, net->ifid_);
|
|
||||||
|
|
||||||
net->clearIface();
|
|
||||||
net->dp.emit();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case RTM_DELADDR:
|
|
||||||
is_del_event = true;
|
|
||||||
case RTM_NEWADDR: {
|
|
||||||
struct ifaddrmsg *ifa = static_cast<struct ifaddrmsg *>(NLMSG_DATA(nh));
|
|
||||||
ssize_t attrlen = IFA_PAYLOAD(nh);
|
|
||||||
struct rtattr *ifa_rta = IFA_RTA(ifa);
|
|
||||||
|
|
||||||
if ((int)ifa->ifa_index != net->ifid_) {
|
|
||||||
return NL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ifa->ifa_family != net->family_) {
|
|
||||||
return NL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We ignore address mark as scope for the link or host,
|
|
||||||
// which should leave scope global addresses.
|
|
||||||
if (ifa->ifa_scope >= RT_SCOPE_LINK) {
|
|
||||||
return NL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; RTA_OK(ifa_rta, attrlen); ifa_rta = RTA_NEXT(ifa_rta, attrlen)) {
|
|
||||||
switch (ifa_rta->rta_type) {
|
|
||||||
case IFA_ADDRESS: {
|
|
||||||
char ipaddr[INET6_ADDRSTRLEN];
|
|
||||||
if (!is_del_event) {
|
|
||||||
net->ipaddr_ = inet_ntop(ifa->ifa_family, RTA_DATA(ifa_rta),
|
|
||||||
ipaddr, sizeof (ipaddr));
|
|
||||||
net->cidr_ = ifa->ifa_prefixlen;
|
|
||||||
switch (ifa->ifa_family) {
|
|
||||||
case AF_INET: {
|
|
||||||
struct in_addr netmask;
|
|
||||||
netmask.s_addr = htonl(~0 << (32 - ifa->ifa_prefixlen));
|
|
||||||
net->netmask_ = inet_ntop(ifa->ifa_family, &netmask,
|
|
||||||
ipaddr, sizeof (ipaddr));
|
|
||||||
}
|
|
||||||
case AF_INET6: {
|
|
||||||
struct in6_addr netmask;
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
int v = (i + 1) * 8 - ifa->ifa_prefixlen;
|
|
||||||
if (v < 0) v = 0;
|
|
||||||
if (v > 8) v = 8;
|
|
||||||
netmask.s6_addr[i] = ~0 << v;
|
|
||||||
}
|
|
||||||
net->netmask_ = inet_ntop(ifa->ifa_family, &netmask,
|
|
||||||
ipaddr, sizeof (ipaddr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spdlog::debug("network: {}, new addr {}/{}", net->ifname_, net->ipaddr_, net->cidr_);
|
|
||||||
} else {
|
|
||||||
net->ipaddr_.clear();
|
|
||||||
net->cidr_ = 0;
|
|
||||||
net->netmask_.clear();
|
|
||||||
spdlog::debug("network: {} addr deleted {}/{}",
|
|
||||||
net->ifname_,
|
|
||||||
inet_ntop(ifa->ifa_family, RTA_DATA(ifa_rta),
|
|
||||||
ipaddr, sizeof (ipaddr)),
|
|
||||||
ifa->ifa_prefixlen);
|
|
||||||
}
|
|
||||||
net->dp.emit();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
char temp_gw_addr[INET6_ADDRSTRLEN];
|
|
||||||
case RTM_DELROUTE:
|
|
||||||
is_del_event = true;
|
|
||||||
case RTM_NEWROUTE: {
|
|
||||||
// Based on https://gist.github.com/Yawning/c70d804d4b8ae78cc698
|
|
||||||
// to find the interface used to reach the outside world
|
|
||||||
|
|
||||||
struct rtmsg *rtm = static_cast<struct rtmsg *>(NLMSG_DATA(nh));
|
|
||||||
ssize_t attrlen = RTM_PAYLOAD(nh);
|
|
||||||
struct rtattr *attr = RTM_RTA(rtm);
|
|
||||||
bool has_gateway = false;
|
|
||||||
bool has_destination = false;
|
|
||||||
int temp_idx = -1;
|
|
||||||
uint32_t priority = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/* Find the message(s) concerting the main routing table, each message
|
|
||||||
* corresponds to a single routing table entry.
|
|
||||||
*/
|
|
||||||
if (rtm->rtm_table != RT_TABLE_MAIN) {
|
|
||||||
return NL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse all the attributes for a single routing table entry. */
|
|
||||||
for (; RTA_OK(attr, attrlen); attr = RTA_NEXT(attr, attrlen)) {
|
|
||||||
/* Determine if this routing table entry corresponds to the default
|
|
||||||
* route by seeing if it has a gateway, and if a destination addr is
|
|
||||||
* set, that it is all 0s.
|
|
||||||
*/
|
|
||||||
switch(attr->rta_type) {
|
|
||||||
case RTA_GATEWAY:
|
|
||||||
/* The gateway of the route.
|
|
||||||
*
|
|
||||||
* If someone ever needs to figure out the gateway address as well,
|
|
||||||
* it's here as the attribute payload.
|
|
||||||
*/
|
|
||||||
inet_ntop(net->family_, RTA_DATA(attr), temp_gw_addr, sizeof(temp_gw_addr));
|
|
||||||
has_gateway = true;
|
|
||||||
break;
|
|
||||||
case RTA_DST: {
|
|
||||||
/* The destination address.
|
|
||||||
* Should be either missing, or maybe all 0s. Accept both.
|
|
||||||
*/
|
|
||||||
const uint32_t nr_zeroes = (net->family_ == AF_INET) ? 4 : 16;
|
|
||||||
unsigned char c = 0;
|
|
||||||
size_t dstlen = RTA_PAYLOAD(attr);
|
|
||||||
if (dstlen != nr_zeroes) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for (uint32_t i = 0; i < dstlen; i += 1) {
|
|
||||||
c |= *((unsigned char *)RTA_DATA(attr) + i);
|
|
||||||
}
|
|
||||||
has_destination = (c == 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case RTA_OIF:
|
|
||||||
/* The output interface index. */
|
|
||||||
temp_idx = *static_cast<int *>(RTA_DATA(attr));
|
|
||||||
break;
|
|
||||||
case RTA_PRIORITY:
|
|
||||||
priority = *(uint32_t*)RTA_DATA(attr);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if we have a default route.
|
|
||||||
if (has_gateway && !has_destination && temp_idx != -1) {
|
|
||||||
// Check if this is the first default route we see, or if this new
|
|
||||||
// route have a higher priority.
|
|
||||||
if (!is_del_event && ((net->ifid_ == -1) || (priority < net->route_priority))) {
|
|
||||||
// Clear if's state for the case were there is a higher priority
|
|
||||||
// route on a different interface.
|
|
||||||
net->clearIface();
|
|
||||||
net->ifid_ = temp_idx;
|
|
||||||
net->route_priority = priority;
|
|
||||||
net->gwaddr_ = temp_gw_addr;
|
|
||||||
spdlog::debug("network: new default route via {} on if{} metric {}", temp_gw_addr, temp_idx, priority);
|
|
||||||
|
|
||||||
/* Ask ifname associated with temp_idx as well as carrier status */
|
|
||||||
struct ifinfomsg ifinfo_hdr = {
|
|
||||||
.ifi_family = AF_UNSPEC,
|
|
||||||
.ifi_index = temp_idx,
|
|
||||||
};
|
|
||||||
int err;
|
|
||||||
err = nl_send_simple(net->ev_sock_, RTM_GETLINK, NLM_F_REQUEST,
|
|
||||||
&ifinfo_hdr, sizeof (ifinfo_hdr));
|
|
||||||
if (err < 0) {
|
|
||||||
spdlog::error("network: failed to ask link info: {}", err);
|
|
||||||
/* Ask for a dump of all links instead */
|
|
||||||
net->want_link_dump_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Also ask for the address. Asking for a addresses of a specific
|
|
||||||
* interface doesn't seems to work so ask for a dump of all
|
|
||||||
* addresses. */
|
|
||||||
net->want_addr_dump_ = true;
|
|
||||||
net->askForStateDump();
|
|
||||||
net->thread_timer_.wake_up();
|
|
||||||
} else if (is_del_event && temp_idx == net->ifid_
|
|
||||||
&& net->route_priority == priority) {
|
|
||||||
spdlog::debug("network: default route deleted {}/if{} metric {}",
|
|
||||||
net->ifname_, temp_idx, priority);
|
|
||||||
|
|
||||||
|
// Check if the interface goes "down" and if we want to detect the
|
||||||
|
// external interface.
|
||||||
|
if (net->ifid_ != -1 && !(ifi->ifi_flags & IFF_UP) && !net->config_["interface"].isString()) {
|
||||||
|
// The current interface is now down, all the routes associated with
|
||||||
|
// it have been deleted, so start looking for a new default route.
|
||||||
|
spdlog::debug("network: if{} down", net->ifid_);
|
||||||
net->clearIface();
|
net->clearIface();
|
||||||
net->dp.emit();
|
net->dp.emit();
|
||||||
/* Ask for a dump of all routes in case another one is already
|
|
||||||
* setup. If there's none, there'll be an event with new one
|
|
||||||
* later. */
|
|
||||||
net->want_route_dump_ = true;
|
net->want_route_dump_ = true;
|
||||||
net->askForStateDump();
|
net->askForStateDump();
|
||||||
|
return NL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (; RTA_OK(ifla, attrlen); ifla = RTA_NEXT(ifla, attrlen)) {
|
||||||
|
switch (ifla->rta_type) {
|
||||||
|
case IFLA_IFNAME:
|
||||||
|
ifname = static_cast<const char *>(RTA_DATA(ifla));
|
||||||
|
ifname_len = RTA_PAYLOAD(ifla) - 1; // minus \0
|
||||||
|
break;
|
||||||
|
case IFLA_CARRIER: {
|
||||||
|
carrier = *(char *)RTA_DATA(ifla) == 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_del_event && ifi->ifi_index == net->ifid_) {
|
||||||
|
// Update interface information
|
||||||
|
if (net->ifname_.empty() && ifname != NULL) {
|
||||||
|
std::string new_ifname(ifname, ifname_len);
|
||||||
|
net->ifname_ = new_ifname;
|
||||||
|
}
|
||||||
|
if (carrier.has_value()) {
|
||||||
|
if (net->carrier_ != *carrier) {
|
||||||
|
if (*carrier) {
|
||||||
|
// Ask for WiFi information
|
||||||
|
net->thread_timer_.wake_up();
|
||||||
|
} else {
|
||||||
|
// clear state related to WiFi connection
|
||||||
|
net->essid_.clear();
|
||||||
|
net->signal_strength_dbm_ = 0;
|
||||||
|
net->signal_strength_ = 0;
|
||||||
|
net->signal_strength_app_.clear();
|
||||||
|
net->frequency_ = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
net->carrier_ = carrier.value();
|
||||||
|
}
|
||||||
|
} else if (!is_del_event && net->ifid_ == -1) {
|
||||||
|
// Checking if it's an interface we care about.
|
||||||
|
std::string new_ifname(ifname, ifname_len);
|
||||||
|
if (net->checkInterface(new_ifname)) {
|
||||||
|
spdlog::debug("network: selecting new interface {}/{}", new_ifname, ifi->ifi_index);
|
||||||
|
|
||||||
|
net->ifname_ = new_ifname;
|
||||||
|
net->ifid_ = ifi->ifi_index;
|
||||||
|
if (carrier.has_value()) {
|
||||||
|
net->carrier_ = carrier.value();
|
||||||
|
}
|
||||||
|
net->thread_timer_.wake_up();
|
||||||
|
/* An address for this new interface should be received via an
|
||||||
|
* RTM_NEWADDR event either because we ask for a dump of both links
|
||||||
|
* and addrs, or because this interface has just been created and
|
||||||
|
* the addr will be sent after the RTM_NEWLINK event.
|
||||||
|
* So we don't need to do anything. */
|
||||||
|
}
|
||||||
|
} else if (is_del_event && net->ifid_ >= 0) {
|
||||||
|
// Our interface has been deleted, start looking/waiting for one we care.
|
||||||
|
spdlog::debug("network: interface {}/{} deleted", net->ifname_, net->ifid_);
|
||||||
|
|
||||||
|
net->clearIface();
|
||||||
|
net->dp.emit();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case RTM_DELADDR:
|
||||||
|
is_del_event = true;
|
||||||
|
case RTM_NEWADDR: {
|
||||||
|
struct ifaddrmsg *ifa = static_cast<struct ifaddrmsg *>(NLMSG_DATA(nh));
|
||||||
|
ssize_t attrlen = IFA_PAYLOAD(nh);
|
||||||
|
struct rtattr *ifa_rta = IFA_RTA(ifa);
|
||||||
|
|
||||||
|
if ((int)ifa->ifa_index != net->ifid_) {
|
||||||
|
return NL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ifa->ifa_family != net->family_) {
|
||||||
|
return NL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We ignore address mark as scope for the link or host,
|
||||||
|
// which should leave scope global addresses.
|
||||||
|
if (ifa->ifa_scope >= RT_SCOPE_LINK) {
|
||||||
|
return NL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; RTA_OK(ifa_rta, attrlen); ifa_rta = RTA_NEXT(ifa_rta, attrlen)) {
|
||||||
|
switch (ifa_rta->rta_type) {
|
||||||
|
case IFA_ADDRESS: {
|
||||||
|
char ipaddr[INET6_ADDRSTRLEN];
|
||||||
|
if (!is_del_event) {
|
||||||
|
net->ipaddr_ = inet_ntop(ifa->ifa_family, RTA_DATA(ifa_rta), ipaddr, sizeof(ipaddr));
|
||||||
|
net->cidr_ = ifa->ifa_prefixlen;
|
||||||
|
switch (ifa->ifa_family) {
|
||||||
|
case AF_INET: {
|
||||||
|
struct in_addr netmask;
|
||||||
|
netmask.s_addr = htonl(~0 << (32 - ifa->ifa_prefixlen));
|
||||||
|
net->netmask_ = inet_ntop(ifa->ifa_family, &netmask, ipaddr, sizeof(ipaddr));
|
||||||
|
}
|
||||||
|
case AF_INET6: {
|
||||||
|
struct in6_addr netmask;
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
int v = (i + 1) * 8 - ifa->ifa_prefixlen;
|
||||||
|
if (v < 0) v = 0;
|
||||||
|
if (v > 8) v = 8;
|
||||||
|
netmask.s6_addr[i] = ~0 << v;
|
||||||
|
}
|
||||||
|
net->netmask_ = inet_ntop(ifa->ifa_family, &netmask, ipaddr, sizeof(ipaddr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spdlog::debug("network: {}, new addr {}/{}", net->ifname_, net->ipaddr_, net->cidr_);
|
||||||
|
} else {
|
||||||
|
net->ipaddr_.clear();
|
||||||
|
net->cidr_ = 0;
|
||||||
|
net->netmask_.clear();
|
||||||
|
spdlog::debug("network: {} addr deleted {}/{}", net->ifname_,
|
||||||
|
inet_ntop(ifa->ifa_family, RTA_DATA(ifa_rta), ipaddr, sizeof(ipaddr)),
|
||||||
|
ifa->ifa_prefixlen);
|
||||||
|
}
|
||||||
|
net->dp.emit();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
char temp_gw_addr[INET6_ADDRSTRLEN];
|
||||||
|
case RTM_DELROUTE:
|
||||||
|
is_del_event = true;
|
||||||
|
case RTM_NEWROUTE: {
|
||||||
|
// Based on https://gist.github.com/Yawning/c70d804d4b8ae78cc698
|
||||||
|
// to find the interface used to reach the outside world
|
||||||
|
|
||||||
|
struct rtmsg *rtm = static_cast<struct rtmsg *>(NLMSG_DATA(nh));
|
||||||
|
ssize_t attrlen = RTM_PAYLOAD(nh);
|
||||||
|
struct rtattr *attr = RTM_RTA(rtm);
|
||||||
|
bool has_gateway = false;
|
||||||
|
bool has_destination = false;
|
||||||
|
int temp_idx = -1;
|
||||||
|
uint32_t priority = 0;
|
||||||
|
|
||||||
|
/* Find the message(s) concerting the main routing table, each message
|
||||||
|
* corresponds to a single routing table entry.
|
||||||
|
*/
|
||||||
|
if (rtm->rtm_table != RT_TABLE_MAIN) {
|
||||||
|
return NL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse all the attributes for a single routing table entry. */
|
||||||
|
for (; RTA_OK(attr, attrlen); attr = RTA_NEXT(attr, attrlen)) {
|
||||||
|
/* Determine if this routing table entry corresponds to the default
|
||||||
|
* route by seeing if it has a gateway, and if a destination addr is
|
||||||
|
* set, that it is all 0s.
|
||||||
|
*/
|
||||||
|
switch (attr->rta_type) {
|
||||||
|
case RTA_GATEWAY:
|
||||||
|
/* The gateway of the route.
|
||||||
|
*
|
||||||
|
* If someone ever needs to figure out the gateway address as well,
|
||||||
|
* it's here as the attribute payload.
|
||||||
|
*/
|
||||||
|
inet_ntop(net->family_, RTA_DATA(attr), temp_gw_addr, sizeof(temp_gw_addr));
|
||||||
|
has_gateway = true;
|
||||||
|
break;
|
||||||
|
case RTA_DST: {
|
||||||
|
/* The destination address.
|
||||||
|
* Should be either missing, or maybe all 0s. Accept both.
|
||||||
|
*/
|
||||||
|
const uint32_t nr_zeroes = (net->family_ == AF_INET) ? 4 : 16;
|
||||||
|
unsigned char c = 0;
|
||||||
|
size_t dstlen = RTA_PAYLOAD(attr);
|
||||||
|
if (dstlen != nr_zeroes) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (uint32_t i = 0; i < dstlen; i += 1) {
|
||||||
|
c |= *((unsigned char *)RTA_DATA(attr) + i);
|
||||||
|
}
|
||||||
|
has_destination = (c == 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case RTA_OIF:
|
||||||
|
/* The output interface index. */
|
||||||
|
temp_idx = *static_cast<int *>(RTA_DATA(attr));
|
||||||
|
break;
|
||||||
|
case RTA_PRIORITY:
|
||||||
|
priority = *(uint32_t *)RTA_DATA(attr);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we have a default route.
|
||||||
|
if (has_gateway && !has_destination && temp_idx != -1) {
|
||||||
|
// Check if this is the first default route we see, or if this new
|
||||||
|
// route have a higher priority.
|
||||||
|
if (!is_del_event && ((net->ifid_ == -1) || (priority < net->route_priority))) {
|
||||||
|
// Clear if's state for the case were there is a higher priority
|
||||||
|
// route on a different interface.
|
||||||
|
net->clearIface();
|
||||||
|
net->ifid_ = temp_idx;
|
||||||
|
net->route_priority = priority;
|
||||||
|
net->gwaddr_ = temp_gw_addr;
|
||||||
|
spdlog::debug("network: new default route via {} on if{} metric {}", temp_gw_addr,
|
||||||
|
temp_idx, priority);
|
||||||
|
|
||||||
|
/* Ask ifname associated with temp_idx as well as carrier status */
|
||||||
|
struct ifinfomsg ifinfo_hdr = {
|
||||||
|
.ifi_family = AF_UNSPEC,
|
||||||
|
.ifi_index = temp_idx,
|
||||||
|
};
|
||||||
|
int err;
|
||||||
|
err = nl_send_simple(net->ev_sock_, RTM_GETLINK, NLM_F_REQUEST, &ifinfo_hdr,
|
||||||
|
sizeof(ifinfo_hdr));
|
||||||
|
if (err < 0) {
|
||||||
|
spdlog::error("network: failed to ask link info: {}", err);
|
||||||
|
/* Ask for a dump of all links instead */
|
||||||
|
net->want_link_dump_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Also ask for the address. Asking for a addresses of a specific
|
||||||
|
* interface doesn't seems to work so ask for a dump of all
|
||||||
|
* addresses. */
|
||||||
|
net->want_addr_dump_ = true;
|
||||||
|
net->askForStateDump();
|
||||||
|
net->thread_timer_.wake_up();
|
||||||
|
} else if (is_del_event && temp_idx == net->ifid_ && net->route_priority == priority) {
|
||||||
|
spdlog::debug("network: default route deleted {}/if{} metric {}", net->ifname_, temp_idx,
|
||||||
|
priority);
|
||||||
|
|
||||||
|
net->clearIface();
|
||||||
|
net->dp.emit();
|
||||||
|
/* Ask for a dump of all routes in case another one is already
|
||||||
|
* setup. If there's none, there'll be an event with new one
|
||||||
|
* later. */
|
||||||
|
net->want_route_dump_ = true;
|
||||||
|
net->askForStateDump();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
@ -702,30 +687,26 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
||||||
void waybar::modules::Network::askForStateDump(void) {
|
void waybar::modules::Network::askForStateDump(void) {
|
||||||
/* We need to wait until the current dump is done before sending new
|
/* We need to wait until the current dump is done before sending new
|
||||||
* messages. handleEventsDone() is called when a dump is done. */
|
* messages. handleEventsDone() is called when a dump is done. */
|
||||||
if (dump_in_progress_)
|
if (dump_in_progress_) return;
|
||||||
return;
|
|
||||||
|
|
||||||
struct rtgenmsg rt_hdr = {
|
struct rtgenmsg rt_hdr = {
|
||||||
.rtgen_family = AF_UNSPEC,
|
.rtgen_family = AF_UNSPEC,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (want_route_dump_) {
|
if (want_route_dump_) {
|
||||||
rt_hdr.rtgen_family = family_;
|
rt_hdr.rtgen_family = family_;
|
||||||
nl_send_simple(ev_sock_, RTM_GETROUTE, NLM_F_DUMP,
|
nl_send_simple(ev_sock_, RTM_GETROUTE, NLM_F_DUMP, &rt_hdr, sizeof(rt_hdr));
|
||||||
&rt_hdr, sizeof (rt_hdr));
|
|
||||||
want_route_dump_ = false;
|
want_route_dump_ = false;
|
||||||
dump_in_progress_ = true;
|
dump_in_progress_ = true;
|
||||||
|
|
||||||
} else if (want_link_dump_) {
|
} else if (want_link_dump_) {
|
||||||
nl_send_simple(ev_sock_, RTM_GETLINK, NLM_F_DUMP,
|
nl_send_simple(ev_sock_, RTM_GETLINK, NLM_F_DUMP, &rt_hdr, sizeof(rt_hdr));
|
||||||
&rt_hdr, sizeof (rt_hdr));
|
|
||||||
want_link_dump_ = false;
|
want_link_dump_ = false;
|
||||||
dump_in_progress_ = true;
|
dump_in_progress_ = true;
|
||||||
|
|
||||||
} else if (want_addr_dump_) {
|
} else if (want_addr_dump_) {
|
||||||
rt_hdr.rtgen_family = family_;
|
rt_hdr.rtgen_family = family_;
|
||||||
nl_send_simple(ev_sock_, RTM_GETADDR, NLM_F_DUMP,
|
nl_send_simple(ev_sock_, RTM_GETADDR, NLM_F_DUMP, &rt_hdr, sizeof(rt_hdr));
|
||||||
&rt_hdr, sizeof (rt_hdr));
|
|
||||||
want_addr_dump_ = false;
|
want_addr_dump_ = false;
|
||||||
dump_in_progress_ = true;
|
dump_in_progress_ = true;
|
||||||
}
|
}
|
||||||
|
@ -739,10 +720,10 @@ int waybar::modules::Network::handleEventsDone(struct nl_msg *msg, void *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int waybar::modules::Network::handleScan(struct nl_msg *msg, void *data) {
|
int waybar::modules::Network::handleScan(struct nl_msg *msg, void *data) {
|
||||||
auto net = static_cast<waybar::modules::Network *>(data);
|
auto net = static_cast<waybar::modules::Network *>(data);
|
||||||
auto gnlh = static_cast<genlmsghdr *>(nlmsg_data(nlmsg_hdr(msg)));
|
auto gnlh = static_cast<genlmsghdr *>(nlmsg_data(nlmsg_hdr(msg)));
|
||||||
struct nlattr * tb[NL80211_ATTR_MAX + 1];
|
struct nlattr *tb[NL80211_ATTR_MAX + 1];
|
||||||
struct nlattr * bss[NL80211_BSS_MAX + 1];
|
struct nlattr *bss[NL80211_BSS_MAX + 1];
|
||||||
struct nla_policy bss_policy[NL80211_BSS_MAX + 1]{};
|
struct nla_policy bss_policy[NL80211_BSS_MAX + 1]{};
|
||||||
bss_policy[NL80211_BSS_TSF].type = NLA_U64;
|
bss_policy[NL80211_BSS_TSF].type = NLA_U64;
|
||||||
bss_policy[NL80211_BSS_FREQUENCY].type = NLA_U32;
|
bss_policy[NL80211_BSS_FREQUENCY].type = NLA_U32;
|
||||||
|
@ -754,8 +735,8 @@ int waybar::modules::Network::handleScan(struct nl_msg *msg, void *data) {
|
||||||
bss_policy[NL80211_BSS_SIGNAL_UNSPEC].type = NLA_U8;
|
bss_policy[NL80211_BSS_SIGNAL_UNSPEC].type = NLA_U8;
|
||||||
bss_policy[NL80211_BSS_STATUS].type = NLA_U32;
|
bss_policy[NL80211_BSS_STATUS].type = NLA_U32;
|
||||||
|
|
||||||
if (nla_parse(
|
if (nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0),
|
||||||
tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), nullptr) < 0) {
|
nullptr) < 0) {
|
||||||
return NL_SKIP;
|
return NL_SKIP;
|
||||||
}
|
}
|
||||||
if (tb[NL80211_ATTR_BSS] == nullptr) {
|
if (tb[NL80211_ATTR_BSS] == nullptr) {
|
||||||
|
@ -775,16 +756,16 @@ int waybar::modules::Network::handleScan(struct nl_msg *msg, void *data) {
|
||||||
|
|
||||||
void waybar::modules::Network::parseEssid(struct nlattr **bss) {
|
void waybar::modules::Network::parseEssid(struct nlattr **bss) {
|
||||||
if (bss[NL80211_BSS_INFORMATION_ELEMENTS] != nullptr) {
|
if (bss[NL80211_BSS_INFORMATION_ELEMENTS] != nullptr) {
|
||||||
auto ies = static_cast<char *>(nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]));
|
auto ies = static_cast<char *>(nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]));
|
||||||
auto ies_len = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
|
auto ies_len = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
|
||||||
const auto hdr_len = 2;
|
const auto hdr_len = 2;
|
||||||
while (ies_len > hdr_len && ies[0] != 0) {
|
while (ies_len > hdr_len && ies[0] != 0) {
|
||||||
ies_len -= ies[1] + hdr_len;
|
ies_len -= ies[1] + hdr_len;
|
||||||
ies += ies[1] + hdr_len;
|
ies += ies[1] + hdr_len;
|
||||||
}
|
}
|
||||||
if (ies_len > hdr_len && ies_len > ies[1] + hdr_len) {
|
if (ies_len > hdr_len && ies_len > ies[1] + hdr_len) {
|
||||||
auto essid_begin = ies + hdr_len;
|
auto essid_begin = ies + hdr_len;
|
||||||
auto essid_end = essid_begin + ies[1];
|
auto essid_end = essid_begin + ies[1];
|
||||||
std::string essid_raw;
|
std::string essid_raw;
|
||||||
std::copy(essid_begin, essid_end, std::back_inserter(essid_raw));
|
std::copy(essid_begin, essid_end, std::back_inserter(essid_raw));
|
||||||
essid_ = Glib::Markup::escape_text(essid_raw);
|
essid_ = Glib::Markup::escape_text(essid_raw);
|
||||||
|
@ -804,7 +785,9 @@ void waybar::modules::Network::parseSignal(struct nlattr **bss) {
|
||||||
const int hardwareOptimum = -45;
|
const int hardwareOptimum = -45;
|
||||||
const int hardwareMin = -90;
|
const int hardwareMin = -90;
|
||||||
const int strength =
|
const int strength =
|
||||||
100 - ((abs(signal_strength_dbm_ - hardwareOptimum) / double{hardwareOptimum - hardwareMin}) * 100);
|
100 -
|
||||||
|
((abs(signal_strength_dbm_ - hardwareOptimum) / double{hardwareOptimum - hardwareMin}) *
|
||||||
|
100);
|
||||||
signal_strength_ = std::clamp(strength, 0, 100);
|
signal_strength_ = std::clamp(strength, 0, 100);
|
||||||
|
|
||||||
if (signal_strength_dbm_ >= -50) {
|
if (signal_strength_dbm_ >= -50) {
|
||||||
|
@ -829,7 +812,7 @@ void waybar::modules::Network::parseSignal(struct nlattr **bss) {
|
||||||
void waybar::modules::Network::parseFreq(struct nlattr **bss) {
|
void waybar::modules::Network::parseFreq(struct nlattr **bss) {
|
||||||
if (bss[NL80211_BSS_FREQUENCY] != nullptr) {
|
if (bss[NL80211_BSS_FREQUENCY] != nullptr) {
|
||||||
// in GHz
|
// in GHz
|
||||||
frequency_ = (double) nla_get_u32(bss[NL80211_BSS_FREQUENCY]) / 1000;
|
frequency_ = (double)nla_get_u32(bss[NL80211_BSS_FREQUENCY]) / 1000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -853,9 +836,8 @@ auto waybar::modules::Network::getInfo() -> void {
|
||||||
if (nl_msg == nullptr) {
|
if (nl_msg == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (genlmsg_put(
|
if (genlmsg_put(nl_msg, NL_AUTO_PORT, NL_AUTO_SEQ, nl80211_id_, 0, NLM_F_DUMP,
|
||||||
nl_msg, NL_AUTO_PORT, NL_AUTO_SEQ, nl80211_id_, 0, NLM_F_DUMP, NL80211_CMD_GET_SCAN, 0) ==
|
NL80211_CMD_GET_SCAN, 0) == nullptr ||
|
||||||
nullptr ||
|
|
||||||
nla_put_u32(nl_msg, NL80211_ATTR_IFINDEX, ifid_) < 0) {
|
nla_put_u32(nl_msg, NL80211_ATTR_IFINDEX, ifid_) < 0) {
|
||||||
nlmsg_free(nl_msg);
|
nlmsg_free(nl_msg);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -50,15 +50,14 @@ void waybar::modules::Pulseaudio::contextStateCb(pa_context *c, void *data) {
|
||||||
case PA_CONTEXT_READY:
|
case PA_CONTEXT_READY:
|
||||||
pa_context_get_server_info(c, serverInfoCb, data);
|
pa_context_get_server_info(c, serverInfoCb, data);
|
||||||
pa_context_set_subscribe_callback(c, subscribeCb, data);
|
pa_context_set_subscribe_callback(c, subscribeCb, data);
|
||||||
pa_context_subscribe(
|
pa_context_subscribe(c,
|
||||||
c,
|
static_cast<enum pa_subscription_mask>(
|
||||||
static_cast<enum pa_subscription_mask>(static_cast<int>(PA_SUBSCRIPTION_MASK_SERVER) |
|
static_cast<int>(PA_SUBSCRIPTION_MASK_SERVER) |
|
||||||
static_cast<int>(PA_SUBSCRIPTION_MASK_SINK) |
|
static_cast<int>(PA_SUBSCRIPTION_MASK_SINK) |
|
||||||
static_cast<int>(PA_SUBSCRIPTION_MASK_SINK_INPUT) |
|
static_cast<int>(PA_SUBSCRIPTION_MASK_SINK_INPUT) |
|
||||||
static_cast<int>(PA_SUBSCRIPTION_MASK_SOURCE) |
|
static_cast<int>(PA_SUBSCRIPTION_MASK_SOURCE) |
|
||||||
static_cast<int>(PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT)),
|
static_cast<int>(PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT)),
|
||||||
nullptr,
|
nullptr, nullptr);
|
||||||
nullptr);
|
|
||||||
break;
|
break;
|
||||||
case PA_CONTEXT_FAILED:
|
case PA_CONTEXT_FAILED:
|
||||||
pa->mainloop_api_->quit(pa->mainloop_api_, 1);
|
pa->mainloop_api_->quit(pa->mainloop_api_, 1);
|
||||||
|
@ -81,16 +80,16 @@ bool waybar::modules::Pulseaudio::handleScroll(GdkEventScroll *e) {
|
||||||
if (dir == SCROLL_DIR::NONE) {
|
if (dir == SCROLL_DIR::NONE) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (config_["reverse-scrolling"].asInt() == 1){
|
if (config_["reverse-scrolling"].asInt() == 1) {
|
||||||
if (dir == SCROLL_DIR::UP) {
|
if (dir == SCROLL_DIR::UP) {
|
||||||
dir = SCROLL_DIR::DOWN;
|
dir = SCROLL_DIR::DOWN;
|
||||||
} else if (dir == SCROLL_DIR::DOWN) {
|
} else if (dir == SCROLL_DIR::DOWN) {
|
||||||
dir = SCROLL_DIR::UP;
|
dir = SCROLL_DIR::UP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
double volume_tick = static_cast<double>(PA_VOLUME_NORM) / 100;
|
double volume_tick = static_cast<double>(PA_VOLUME_NORM) / 100;
|
||||||
pa_volume_t change = volume_tick;
|
pa_volume_t change = volume_tick;
|
||||||
pa_cvolume pa_volume = pa_volume_;
|
pa_cvolume pa_volume = pa_volume_;
|
||||||
// isDouble returns true for integers as well, just in case
|
// isDouble returns true for integers as well, just in case
|
||||||
if (config_["scroll-step"].isDouble()) {
|
if (config_["scroll-step"].isDouble()) {
|
||||||
change = round(config_["scroll-step"].asDouble() * volume_tick);
|
change = round(config_["scroll-step"].asDouble() * volume_tick);
|
||||||
|
@ -111,7 +110,7 @@ bool waybar::modules::Pulseaudio::handleScroll(GdkEventScroll *e) {
|
||||||
/*
|
/*
|
||||||
* Called when an event we subscribed to occurs.
|
* Called when an event we subscribed to occurs.
|
||||||
*/
|
*/
|
||||||
void waybar::modules::Pulseaudio::subscribeCb(pa_context * context,
|
void waybar::modules::Pulseaudio::subscribeCb(pa_context *context,
|
||||||
pa_subscription_event_type_t type, uint32_t idx,
|
pa_subscription_event_type_t type, uint32_t idx,
|
||||||
void *data) {
|
void *data) {
|
||||||
unsigned facility = type & PA_SUBSCRIPTION_EVENT_FACILITY_MASK;
|
unsigned facility = type & PA_SUBSCRIPTION_EVENT_FACILITY_MASK;
|
||||||
|
@ -164,8 +163,7 @@ void waybar::modules::Pulseaudio::sourceInfoCb(pa_context * /*context*/, const p
|
||||||
*/
|
*/
|
||||||
void waybar::modules::Pulseaudio::sinkInfoCb(pa_context * /*context*/, const pa_sink_info *i,
|
void waybar::modules::Pulseaudio::sinkInfoCb(pa_context * /*context*/, const pa_sink_info *i,
|
||||||
int /*eol*/, void *data) {
|
int /*eol*/, void *data) {
|
||||||
if (i == nullptr)
|
if (i == nullptr) return;
|
||||||
return;
|
|
||||||
|
|
||||||
auto pa = static_cast<waybar::modules::Pulseaudio *>(data);
|
auto pa = static_cast<waybar::modules::Pulseaudio *>(data);
|
||||||
if (pa->current_sink_name_ == i->name) {
|
if (pa->current_sink_name_ == i->name) {
|
||||||
|
@ -212,15 +210,7 @@ void waybar::modules::Pulseaudio::serverInfoCb(pa_context *context, const pa_ser
|
||||||
}
|
}
|
||||||
|
|
||||||
static const std::array<std::string, 9> ports = {
|
static const std::array<std::string, 9> ports = {
|
||||||
"headphone",
|
"headphone", "speaker", "hdmi", "headset", "hands-free", "portable", "car", "hifi", "phone",
|
||||||
"speaker",
|
|
||||||
"hdmi",
|
|
||||||
"headset",
|
|
||||||
"hands-free",
|
|
||||||
"portable",
|
|
||||||
"car",
|
|
||||||
"hifi",
|
|
||||||
"phone",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::vector<std::string> waybar::modules::Pulseaudio::getPulseIcon() const {
|
const std::vector<std::string> waybar::modules::Pulseaudio::getPulseIcon() const {
|
||||||
|
@ -238,11 +228,11 @@ const std::vector<std::string> waybar::modules::Pulseaudio::getPulseIcon() const
|
||||||
|
|
||||||
auto waybar::modules::Pulseaudio::update() -> void {
|
auto waybar::modules::Pulseaudio::update() -> void {
|
||||||
auto format = format_;
|
auto format = format_;
|
||||||
std::string tooltip_format;
|
std::string tooltip_format;
|
||||||
if (!alt_) {
|
if (!alt_) {
|
||||||
std::string format_name = "format";
|
std::string format_name = "format";
|
||||||
if (monitor_.find("a2dp_sink") != std::string::npos || // PulseAudio
|
if (monitor_.find("a2dp_sink") != std::string::npos || // PulseAudio
|
||||||
monitor_.find("a2dp-sink") != std::string::npos) { // PipeWire
|
monitor_.find("a2dp-sink") != std::string::npos) { // PipeWire
|
||||||
format_name = format_name + "-bluetooth";
|
format_name = format_name + "-bluetooth";
|
||||||
label_.get_style_context()->add_class("bluetooth");
|
label_.get_style_context()->add_class("bluetooth");
|
||||||
} else {
|
} else {
|
||||||
|
@ -260,8 +250,7 @@ auto waybar::modules::Pulseaudio::update() -> void {
|
||||||
label_.get_style_context()->remove_class("muted");
|
label_.get_style_context()->remove_class("muted");
|
||||||
label_.get_style_context()->remove_class("sink-muted");
|
label_.get_style_context()->remove_class("sink-muted");
|
||||||
}
|
}
|
||||||
format =
|
format = config_[format_name].isString() ? config_[format_name].asString() : format;
|
||||||
config_[format_name].isString() ? config_[format_name].asString() : format;
|
|
||||||
}
|
}
|
||||||
// TODO: find a better way to split source/sink
|
// TODO: find a better way to split source/sink
|
||||||
std::string format_source = "{volume}%";
|
std::string format_source = "{volume}%";
|
||||||
|
@ -277,13 +266,10 @@ auto waybar::modules::Pulseaudio::update() -> void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
format_source = fmt::format(format_source, fmt::arg("volume", source_volume_));
|
format_source = fmt::format(format_source, fmt::arg("volume", source_volume_));
|
||||||
label_.set_markup(fmt::format(format,
|
label_.set_markup(fmt::format(
|
||||||
fmt::arg("desc", desc_),
|
format, fmt::arg("desc", desc_), fmt::arg("volume", volume_),
|
||||||
fmt::arg("volume", volume_),
|
fmt::arg("format_source", format_source), fmt::arg("source_volume", source_volume_),
|
||||||
fmt::arg("format_source", format_source),
|
fmt::arg("source_desc", source_desc_), fmt::arg("icon", getIcon(volume_, getPulseIcon()))));
|
||||||
fmt::arg("source_volume", source_volume_),
|
|
||||||
fmt::arg("source_desc", source_desc_),
|
|
||||||
fmt::arg("icon", getIcon(volume_, getPulseIcon()))));
|
|
||||||
getState(volume_);
|
getState(volume_);
|
||||||
|
|
||||||
if (tooltipEnabled()) {
|
if (tooltipEnabled()) {
|
||||||
|
@ -292,13 +278,10 @@ auto waybar::modules::Pulseaudio::update() -> void {
|
||||||
}
|
}
|
||||||
if (!tooltip_format.empty()) {
|
if (!tooltip_format.empty()) {
|
||||||
label_.set_tooltip_text(fmt::format(
|
label_.set_tooltip_text(fmt::format(
|
||||||
tooltip_format,
|
tooltip_format, fmt::arg("desc", desc_), fmt::arg("volume", volume_),
|
||||||
fmt::arg("desc", desc_),
|
fmt::arg("format_source", format_source), fmt::arg("source_volume", source_volume_),
|
||||||
fmt::arg("volume", volume_),
|
fmt::arg("source_desc", source_desc_),
|
||||||
fmt::arg("format_source", format_source),
|
fmt::arg("icon", getIcon(volume_, getPulseIcon()))));
|
||||||
fmt::arg("source_volume", source_volume_),
|
|
||||||
fmt::arg("source_desc", source_desc_),
|
|
||||||
fmt::arg("icon", getIcon(volume_, getPulseIcon()))));
|
|
||||||
} else {
|
} else {
|
||||||
label_.set_tooltip_text(desc_);
|
label_.set_tooltip_text(desc_);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include "modules/river/tags.hpp"
|
||||||
|
|
||||||
#include <gtkmm/button.h>
|
#include <gtkmm/button.h>
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
@ -6,7 +8,6 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
#include "modules/river/tags.hpp"
|
|
||||||
#include "xdg-output-unstable-v1-client-protocol.h"
|
#include "xdg-output-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
namespace waybar::modules::river {
|
namespace waybar::modules::river {
|
||||||
|
@ -44,7 +45,7 @@ static void listen_command_failure(void *data,
|
||||||
spdlog::error("failure when selecting/toggling tags {}", output);
|
spdlog::error("failure when selecting/toggling tags {}", output);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const zriver_command_callback_v1_listener command_callback_listener_impl {
|
static const zriver_command_callback_v1_listener command_callback_listener_impl{
|
||||||
.success = listen_command_success,
|
.success = listen_command_success,
|
||||||
.failure = listen_command_failure,
|
.failure = listen_command_failure,
|
||||||
};
|
};
|
||||||
|
@ -77,7 +78,6 @@ static void handle_global_remove(void *data, struct wl_registry *registry, uint3
|
||||||
/* Ignore event */
|
/* Ignore event */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const wl_registry_listener registry_listener_impl = {.global = handle_global,
|
static const wl_registry_listener registry_listener_impl = {.global = handle_global,
|
||||||
.global_remove = handle_global_remove};
|
.global_remove = handle_global_remove};
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ Tags::Tags(const std::string &id, const waybar::Bar &bar, const Json::Value &con
|
||||||
bar_(bar),
|
bar_(bar),
|
||||||
box_{bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0},
|
box_{bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0},
|
||||||
output_status_{nullptr} {
|
output_status_{nullptr} {
|
||||||
struct wl_display * display = Client::inst()->wl_display;
|
struct wl_display *display = Client::inst()->wl_display;
|
||||||
struct wl_registry *registry = wl_display_get_registry(display);
|
struct wl_registry *registry = wl_display_get_registry(display);
|
||||||
wl_registry_add_listener(registry, ®istry_listener_impl, this);
|
wl_registry_add_listener(registry, ®istry_listener_impl, this);
|
||||||
wl_display_roundtrip(display);
|
wl_display_roundtrip(display);
|
||||||
|
@ -119,7 +119,7 @@ Tags::Tags(const std::string &id, const waybar::Bar &bar, const Json::Value &con
|
||||||
|
|
||||||
std::vector<std::string> tag_labels(num_tags);
|
std::vector<std::string> tag_labels(num_tags);
|
||||||
for (uint32_t tag = 0; tag < num_tags; ++tag) {
|
for (uint32_t tag = 0; tag < num_tags; ++tag) {
|
||||||
tag_labels[tag] = std::to_string(tag+1);
|
tag_labels[tag] = std::to_string(tag + 1);
|
||||||
}
|
}
|
||||||
const Json::Value custom_labels = config["tag-labels"];
|
const Json::Value custom_labels = config["tag-labels"];
|
||||||
if (custom_labels.isArray() && !custom_labels.empty()) {
|
if (custom_labels.isArray() && !custom_labels.empty()) {
|
||||||
|
@ -134,8 +134,10 @@ Tags::Tags(const std::string &id, const waybar::Bar &bar, const Json::Value &con
|
||||||
button.set_relief(Gtk::RELIEF_NONE);
|
button.set_relief(Gtk::RELIEF_NONE);
|
||||||
box_.pack_start(button, false, false, 0);
|
box_.pack_start(button, false, false, 0);
|
||||||
if (!config_["disable-click"].asBool()) {
|
if (!config_["disable-click"].asBool()) {
|
||||||
button.signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &Tags::handle_primary_clicked), i));
|
button.signal_clicked().connect(
|
||||||
button.signal_button_press_event().connect(sigc::bind(sigc::mem_fun(*this, &Tags::handle_button_press), i));
|
sigc::bind(sigc::mem_fun(*this, &Tags::handle_primary_clicked), i));
|
||||||
|
button.signal_button_press_event().connect(
|
||||||
|
sigc::bind(sigc::mem_fun(*this, &Tags::handle_button_press), i));
|
||||||
}
|
}
|
||||||
button.show();
|
button.show();
|
||||||
i <<= 1;
|
i <<= 1;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "modules/simpleclock.hpp"
|
#include "modules/simpleclock.hpp"
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config)
|
waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config)
|
||||||
|
@ -13,7 +14,7 @@ waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config)
|
||||||
}
|
}
|
||||||
|
|
||||||
auto waybar::modules::Clock::update() -> void {
|
auto waybar::modules::Clock::update() -> void {
|
||||||
tzset(); // Update timezone information
|
tzset(); // Update timezone information
|
||||||
auto now = std::chrono::system_clock::now();
|
auto now = std::chrono::system_clock::now();
|
||||||
auto localtime = fmt::localtime(std::chrono::system_clock::to_time_t(now));
|
auto localtime = fmt::localtime(std::chrono::system_clock::to_time_t(now));
|
||||||
auto text = fmt::format(format_, localtime);
|
auto text = fmt::format(format_, localtime);
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
#include "modules/sndio.hpp"
|
#include "modules/sndio.hpp"
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <poll.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <poll.h>
|
|
||||||
#include <fmt/format.h>
|
|
||||||
#include <spdlog/spdlog.h>
|
|
||||||
|
|
||||||
namespace waybar::modules {
|
namespace waybar::modules {
|
||||||
|
|
||||||
void ondesc(void *arg, struct sioctl_desc *d, int curval) {
|
void ondesc(void *arg, struct sioctl_desc *d, int curval) {
|
||||||
auto self = static_cast<Sndio*>(arg);
|
auto self = static_cast<Sndio *>(arg);
|
||||||
if (d == NULL) {
|
if (d == NULL) {
|
||||||
// d is NULL when the list is done
|
// d is NULL when the list is done
|
||||||
return;
|
return;
|
||||||
|
@ -17,7 +19,7 @@ void ondesc(void *arg, struct sioctl_desc *d, int curval) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void onval(void *arg, unsigned int addr, unsigned int val) {
|
void onval(void *arg, unsigned int addr, unsigned int val) {
|
||||||
auto self = static_cast<Sndio*>(arg);
|
auto self = static_cast<Sndio *>(arg);
|
||||||
self->put_val(addr, val);
|
self->put_val(addr, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,10 +54,8 @@ Sndio::Sndio(const std::string &id, const Json::Value &config)
|
||||||
event_box_.show();
|
event_box_.show();
|
||||||
|
|
||||||
event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK | Gdk::BUTTON_PRESS_MASK);
|
event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK | Gdk::BUTTON_PRESS_MASK);
|
||||||
event_box_.signal_scroll_event().connect(
|
event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &Sndio::handleScroll));
|
||||||
sigc::mem_fun(*this, &Sndio::handleScroll));
|
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &Sndio::handleToggle));
|
||||||
event_box_.signal_button_press_event().connect(
|
|
||||||
sigc::mem_fun(*this, &Sndio::handleToggle));
|
|
||||||
|
|
||||||
thread_ = [this] {
|
thread_ = [this] {
|
||||||
dp.emit();
|
dp.emit();
|
||||||
|
@ -80,7 +80,7 @@ Sndio::Sndio(const std::string &id, const Json::Value &config)
|
||||||
while (thread_.isRunning()) {
|
while (thread_.isRunning()) {
|
||||||
try {
|
try {
|
||||||
connect_to_sndio();
|
connect_to_sndio();
|
||||||
} catch(std::runtime_error const& e) {
|
} catch (std::runtime_error const &e) {
|
||||||
// avoid leaking hdl_
|
// avoid leaking hdl_
|
||||||
if (hdl_) {
|
if (hdl_) {
|
||||||
sioctl_close(hdl_);
|
sioctl_close(hdl_);
|
||||||
|
@ -98,9 +98,7 @@ Sndio::Sndio(const std::string &id, const Json::Value &config)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Sndio::~Sndio() {
|
Sndio::~Sndio() { sioctl_close(hdl_); }
|
||||||
sioctl_close(hdl_);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto Sndio::update() -> void {
|
auto Sndio::update() -> void {
|
||||||
auto format = format_;
|
auto format = format_;
|
||||||
|
@ -112,9 +110,7 @@ auto Sndio::update() -> void {
|
||||||
label_.get_style_context()->remove_class("muted");
|
label_.get_style_context()->remove_class("muted");
|
||||||
}
|
}
|
||||||
|
|
||||||
label_.set_markup(fmt::format(format,
|
label_.set_markup(fmt::format(format, fmt::arg("volume", vol), fmt::arg("raw_value", volume_)));
|
||||||
fmt::arg("volume", vol),
|
|
||||||
fmt::arg("raw_value", volume_)));
|
|
||||||
|
|
||||||
ALabel::update();
|
ALabel::update();
|
||||||
}
|
}
|
||||||
|
@ -177,7 +173,7 @@ bool Sndio::handleScroll(GdkEventScroll *e) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sndio::handleToggle(GdkEventButton* const& e) {
|
bool Sndio::handleToggle(GdkEventButton *const &e) {
|
||||||
// toggle mute only when no user provided events are configured
|
// toggle mute only when no user provided events are configured
|
||||||
if (config_["on-click"].isString()) {
|
if (config_["on-click"].isString()) {
|
||||||
return AModule::handleToggle(e);
|
return AModule::handleToggle(e);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "modules/sni/host.hpp"
|
#include "modules/sni/host.hpp"
|
||||||
|
|
||||||
#include <fmt/ostream.h>
|
#include <fmt/ostream.h>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
|
@ -32,8 +33,7 @@ Host::~Host() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Host::busAcquired(const Glib::RefPtr<Gio::DBus::Connection>& conn, Glib::ustring name) {
|
void Host::busAcquired(const Glib::RefPtr<Gio::DBus::Connection>& conn, Glib::ustring name) {
|
||||||
watcher_id_ = Gio::DBus::watch_name(conn,
|
watcher_id_ = Gio::DBus::watch_name(conn, "org.kde.StatusNotifierWatcher",
|
||||||
"org.kde.StatusNotifierWatcher",
|
|
||||||
sigc::mem_fun(*this, &Host::nameAppeared),
|
sigc::mem_fun(*this, &Host::nameAppeared),
|
||||||
sigc::mem_fun(*this, &Host::nameVanished));
|
sigc::mem_fun(*this, &Host::nameVanished));
|
||||||
}
|
}
|
||||||
|
@ -45,13 +45,8 @@ void Host::nameAppeared(const Glib::RefPtr<Gio::DBus::Connection>& conn, const G
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cancellable_ = g_cancellable_new();
|
cancellable_ = g_cancellable_new();
|
||||||
sn_watcher_proxy_new(conn->gobj(),
|
sn_watcher_proxy_new(conn->gobj(), G_DBUS_PROXY_FLAGS_NONE, "org.kde.StatusNotifierWatcher",
|
||||||
G_DBUS_PROXY_FLAGS_NONE,
|
"/StatusNotifierWatcher", cancellable_, &Host::proxyReady, this);
|
||||||
"org.kde.StatusNotifierWatcher",
|
|
||||||
"/StatusNotifierWatcher",
|
|
||||||
cancellable_,
|
|
||||||
&Host::proxyReady,
|
|
||||||
this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Host::nameVanished(const Glib::RefPtr<Gio::DBus::Connection>& conn, const Glib::ustring name) {
|
void Host::nameVanished(const Glib::RefPtr<Gio::DBus::Connection>& conn, const Glib::ustring name) {
|
||||||
|
@ -62,7 +57,7 @@ void Host::nameVanished(const Glib::RefPtr<Gio::DBus::Connection>& conn, const G
|
||||||
}
|
}
|
||||||
|
|
||||||
void Host::proxyReady(GObject* src, GAsyncResult* res, gpointer data) {
|
void Host::proxyReady(GObject* src, GAsyncResult* res, gpointer data) {
|
||||||
GError* error = nullptr;
|
GError* error = nullptr;
|
||||||
SnWatcher* watcher = sn_watcher_proxy_new_finish(res, &error);
|
SnWatcher* watcher = sn_watcher_proxy_new_finish(res, &error);
|
||||||
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
|
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
|
||||||
spdlog::error("Host: {}", error->message);
|
spdlog::error("Host: {}", error->message);
|
||||||
|
@ -76,8 +71,8 @@ void Host::proxyReady(GObject* src, GAsyncResult* res, gpointer data) {
|
||||||
g_error_free(error);
|
g_error_free(error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sn_watcher_call_register_host(
|
sn_watcher_call_register_host(host->watcher_, host->object_path_.c_str(), host->cancellable_,
|
||||||
host->watcher_, host->object_path_.c_str(), host->cancellable_, &Host::registerHost, data);
|
&Host::registerHost, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Host::registerHost(GObject* src, GAsyncResult* res, gpointer data) {
|
void Host::registerHost(GObject* src, GAsyncResult* res, gpointer data) {
|
||||||
|
|
|
@ -31,7 +31,7 @@ struct fmt::formatter<Glib::VariantBase> : formatter<std::string> {
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
||||||
static const Glib::ustring SNI_INTERFACE_NAME = sn_item_interface_info()->name;
|
static const Glib::ustring SNI_INTERFACE_NAME = sn_item_interface_info()->name;
|
||||||
static const unsigned UPDATE_DEBOUNCE_TIME = 10;
|
static const unsigned UPDATE_DEBOUNCE_TIME = 10;
|
||||||
|
|
||||||
Item::Item(const std::string& bn, const std::string& op, const Json::Value& config, const Bar& bar)
|
Item::Item(const std::string& bn, const std::string& op, const Json::Value& config, const Bar& bar)
|
||||||
: bus_name(bn),
|
: bus_name(bn),
|
||||||
|
@ -49,7 +49,7 @@ Item::Item(const std::string& bn, const std::string& op, const Json::Value& conf
|
||||||
show_passive_ = config["show-passive-items"].asBool();
|
show_passive_ = config["show-passive-items"].asBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &window = const_cast<Bar &>(bar).window;
|
auto& window = const_cast<Bar&>(bar).window;
|
||||||
window.signal_configure_event().connect_notify(sigc::mem_fun(*this, &Item::onConfigure));
|
window.signal_configure_event().connect_notify(sigc::mem_fun(*this, &Item::onConfigure));
|
||||||
event_box.add(image);
|
event_box.add(image);
|
||||||
event_box.add_events(Gdk::BUTTON_PRESS_MASK | Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
event_box.add_events(Gdk::BUTTON_PRESS_MASK | Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK);
|
||||||
|
@ -62,18 +62,12 @@ Item::Item(const std::string& bn, const std::string& op, const Json::Value& conf
|
||||||
cancellable_ = Gio::Cancellable::create();
|
cancellable_ = Gio::Cancellable::create();
|
||||||
|
|
||||||
auto interface = Glib::wrap(sn_item_interface_info(), true);
|
auto interface = Glib::wrap(sn_item_interface_info(), true);
|
||||||
Gio::DBus::Proxy::create_for_bus(Gio::DBus::BusType::BUS_TYPE_SESSION,
|
Gio::DBus::Proxy::create_for_bus(Gio::DBus::BusType::BUS_TYPE_SESSION, bus_name, object_path,
|
||||||
bus_name,
|
SNI_INTERFACE_NAME, sigc::mem_fun(*this, &Item::proxyReady),
|
||||||
object_path,
|
cancellable_, interface);
|
||||||
SNI_INTERFACE_NAME,
|
|
||||||
sigc::mem_fun(*this, &Item::proxyReady),
|
|
||||||
cancellable_,
|
|
||||||
interface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::onConfigure(GdkEventConfigure* ev) {
|
void Item::onConfigure(GdkEventConfigure* ev) { this->updateImage(); }
|
||||||
this->updateImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Item::proxyReady(Glib::RefPtr<Gio::AsyncResult>& result) {
|
void Item::proxyReady(Glib::RefPtr<Gio::AsyncResult>& result) {
|
||||||
try {
|
try {
|
||||||
|
@ -167,16 +161,10 @@ void Item::setProperty(const Glib::ustring& name, Glib::VariantBase& value) {
|
||||||
}
|
}
|
||||||
} catch (const Glib::Error& err) {
|
} catch (const Glib::Error& err) {
|
||||||
spdlog::warn("Failed to set tray item property: {}.{}, value = {}, err = {}",
|
spdlog::warn("Failed to set tray item property: {}.{}, value = {}, err = {}",
|
||||||
id.empty() ? bus_name : id,
|
id.empty() ? bus_name : id, name, value, err.what());
|
||||||
name,
|
|
||||||
value,
|
|
||||||
err.what());
|
|
||||||
} catch (const std::exception& err) {
|
} catch (const std::exception& err) {
|
||||||
spdlog::warn("Failed to set tray item property: {}.{}, value = {}, err = {}",
|
spdlog::warn("Failed to set tray item property: {}.{}, value = {}, err = {}",
|
||||||
id.empty() ? bus_name : id,
|
id.empty() ? bus_name : id, name, value, err.what());
|
||||||
name,
|
|
||||||
value,
|
|
||||||
err.what());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,8 +187,7 @@ void Item::getUpdatedProperties() {
|
||||||
auto params = Glib::VariantContainerBase::create_tuple(
|
auto params = Glib::VariantContainerBase::create_tuple(
|
||||||
{Glib::Variant<Glib::ustring>::create(SNI_INTERFACE_NAME)});
|
{Glib::Variant<Glib::ustring>::create(SNI_INTERFACE_NAME)});
|
||||||
proxy_->call("org.freedesktop.DBus.Properties.GetAll",
|
proxy_->call("org.freedesktop.DBus.Properties.GetAll",
|
||||||
sigc::mem_fun(*this, &Item::processUpdatedProperties),
|
sigc::mem_fun(*this, &Item::processUpdatedProperties), params);
|
||||||
params);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void Item::processUpdatedProperties(Glib::RefPtr<Gio::AsyncResult>& _result) {
|
void Item::processUpdatedProperties(Glib::RefPtr<Gio::AsyncResult>& _result) {
|
||||||
|
@ -266,11 +253,11 @@ Glib::RefPtr<Gdk::Pixbuf> Item::extractPixBuf(GVariant* variant) {
|
||||||
return Glib::RefPtr<Gdk::Pixbuf>{};
|
return Glib::RefPtr<Gdk::Pixbuf>{};
|
||||||
}
|
}
|
||||||
GVariant* val;
|
GVariant* val;
|
||||||
gint lwidth = 0;
|
gint lwidth = 0;
|
||||||
gint lheight = 0;
|
gint lheight = 0;
|
||||||
gint width;
|
gint width;
|
||||||
gint height;
|
gint height;
|
||||||
guchar* array = nullptr;
|
guchar* array = nullptr;
|
||||||
while (g_variant_iter_loop(it, "(ii@ay)", &width, &height, &val)) {
|
while (g_variant_iter_loop(it, "(ii@ay)", &width, &height, &val)) {
|
||||||
if (width > 0 && height > 0 && val != nullptr && width * height > lwidth * lheight) {
|
if (width > 0 && height > 0 && val != nullptr && width * height > lwidth * lheight) {
|
||||||
auto size = g_variant_get_size(val);
|
auto size = g_variant_get_size(val);
|
||||||
|
@ -303,14 +290,8 @@ Glib::RefPtr<Gdk::Pixbuf> Item::extractPixBuf(GVariant* variant) {
|
||||||
array[i + 2] = array[i + 3];
|
array[i + 2] = array[i + 3];
|
||||||
array[i + 3] = alpha;
|
array[i + 3] = alpha;
|
||||||
}
|
}
|
||||||
return Gdk::Pixbuf::create_from_data(array,
|
return Gdk::Pixbuf::create_from_data(array, Gdk::Colorspace::COLORSPACE_RGB, true, 8, lwidth,
|
||||||
Gdk::Colorspace::COLORSPACE_RGB,
|
lheight, 4 * lwidth, &pixbuf_data_deleter);
|
||||||
true,
|
|
||||||
8,
|
|
||||||
lwidth,
|
|
||||||
lheight,
|
|
||||||
4 * lwidth,
|
|
||||||
&pixbuf_data_deleter);
|
|
||||||
}
|
}
|
||||||
return Glib::RefPtr<Gdk::Pixbuf>{};
|
return Glib::RefPtr<Gdk::Pixbuf>{};
|
||||||
}
|
}
|
||||||
|
@ -374,15 +355,15 @@ Glib::RefPtr<Gdk::Pixbuf> Item::getIconByName(const std::string& name, int reque
|
||||||
tmp_size = request_size;
|
tmp_size = request_size;
|
||||||
}
|
}
|
||||||
if (!icon_theme_path.empty() &&
|
if (!icon_theme_path.empty() &&
|
||||||
icon_theme->lookup_icon(
|
icon_theme->lookup_icon(name.c_str(), tmp_size,
|
||||||
name.c_str(), tmp_size, Gtk::IconLookupFlags::ICON_LOOKUP_FORCE_SIZE)) {
|
Gtk::IconLookupFlags::ICON_LOOKUP_FORCE_SIZE)) {
|
||||||
return icon_theme->load_icon(
|
return icon_theme->load_icon(name.c_str(), tmp_size,
|
||||||
name.c_str(), tmp_size, Gtk::IconLookupFlags::ICON_LOOKUP_FORCE_SIZE);
|
Gtk::IconLookupFlags::ICON_LOOKUP_FORCE_SIZE);
|
||||||
}
|
}
|
||||||
Glib::RefPtr<Gtk::IconTheme> default_theme = Gtk::IconTheme::get_default();
|
Glib::RefPtr<Gtk::IconTheme> default_theme = Gtk::IconTheme::get_default();
|
||||||
default_theme->rescan_if_needed();
|
default_theme->rescan_if_needed();
|
||||||
return default_theme->load_icon(
|
return default_theme->load_icon(name.c_str(), tmp_size,
|
||||||
name.c_str(), tmp_size, Gtk::IconLookupFlags::ICON_LOOKUP_FORCE_SIZE);
|
Gtk::IconLookupFlags::ICON_LOOKUP_FORCE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
double Item::getScaledIconSize() {
|
double Item::getScaledIconSize() {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "modules/sni/tray.hpp"
|
#include "modules/sni/tray.hpp"
|
||||||
|
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace waybar::modules::SNI {
|
namespace waybar::modules::SNI {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "modules/sni/watcher.hpp"
|
#include "modules/sni/watcher.hpp"
|
||||||
|
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
using namespace waybar::modules::SNI;
|
using namespace waybar::modules::SNI;
|
||||||
|
@ -29,8 +30,8 @@ Watcher::~Watcher() {
|
||||||
|
|
||||||
void Watcher::busAcquired(const Glib::RefPtr<Gio::DBus::Connection>& conn, Glib::ustring name) {
|
void Watcher::busAcquired(const Glib::RefPtr<Gio::DBus::Connection>& conn, Glib::ustring name) {
|
||||||
GError* error = nullptr;
|
GError* error = nullptr;
|
||||||
g_dbus_interface_skeleton_export(
|
g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(watcher_), conn->gobj(),
|
||||||
G_DBUS_INTERFACE_SKELETON(watcher_), conn->gobj(), "/StatusNotifierWatcher", &error);
|
"/StatusNotifierWatcher", &error);
|
||||||
if (error != nullptr) {
|
if (error != nullptr) {
|
||||||
// Don't print an error when a watcher is already present
|
// Don't print an error when a watcher is already present
|
||||||
if (error->code != 2) {
|
if (error->code != 2) {
|
||||||
|
@ -39,10 +40,10 @@ void Watcher::busAcquired(const Glib::RefPtr<Gio::DBus::Connection>& conn, Glib:
|
||||||
g_error_free(error);
|
g_error_free(error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
g_signal_connect_swapped(
|
g_signal_connect_swapped(watcher_, "handle-register-item",
|
||||||
watcher_, "handle-register-item", G_CALLBACK(&Watcher::handleRegisterItem), this);
|
G_CALLBACK(&Watcher::handleRegisterItem), this);
|
||||||
g_signal_connect_swapped(
|
g_signal_connect_swapped(watcher_, "handle-register-host",
|
||||||
watcher_, "handle-register-host", G_CALLBACK(&Watcher::handleRegisterHost), this);
|
G_CALLBACK(&Watcher::handleRegisterHost), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean Watcher::handleRegisterHost(Watcher* obj, GDBusMethodInvocation* invocation,
|
gboolean Watcher::handleRegisterHost(Watcher* obj, GDBusMethodInvocation* invocation,
|
||||||
|
@ -55,22 +56,16 @@ gboolean Watcher::handleRegisterHost(Watcher* obj, GDBusMethodInvocation* invoca
|
||||||
object_path = service;
|
object_path = service;
|
||||||
}
|
}
|
||||||
if (g_dbus_is_name(bus_name) == FALSE) {
|
if (g_dbus_is_name(bus_name) == FALSE) {
|
||||||
g_dbus_method_invocation_return_error(invocation,
|
g_dbus_method_invocation_return_error(invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
|
||||||
G_DBUS_ERROR,
|
"D-Bus bus name '%s' is not valid", bus_name);
|
||||||
G_DBUS_ERROR_INVALID_ARGS,
|
|
||||||
"D-Bus bus name '%s' is not valid",
|
|
||||||
bus_name);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
auto watch = gfWatchFind(obj->hosts_, bus_name, object_path);
|
auto watch = gfWatchFind(obj->hosts_, bus_name, object_path);
|
||||||
if (watch != nullptr) {
|
if (watch != nullptr) {
|
||||||
g_dbus_method_invocation_return_error(
|
g_dbus_method_invocation_return_error(
|
||||||
invocation,
|
invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
|
||||||
G_DBUS_ERROR,
|
|
||||||
G_DBUS_ERROR_INVALID_ARGS,
|
|
||||||
"Status Notifier Host with bus name '%s' and object path '%s' is already registered",
|
"Status Notifier Host with bus name '%s' and object path '%s' is already registered",
|
||||||
bus_name,
|
bus_name, object_path);
|
||||||
object_path);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
watch = gfWatchNew(GF_WATCH_TYPE_HOST, service, bus_name, object_path, obj);
|
watch = gfWatchNew(GF_WATCH_TYPE_HOST, service, bus_name, object_path, obj);
|
||||||
|
@ -93,18 +88,14 @@ gboolean Watcher::handleRegisterItem(Watcher* obj, GDBusMethodInvocation* invoca
|
||||||
object_path = service;
|
object_path = service;
|
||||||
}
|
}
|
||||||
if (g_dbus_is_name(bus_name) == FALSE) {
|
if (g_dbus_is_name(bus_name) == FALSE) {
|
||||||
g_dbus_method_invocation_return_error(invocation,
|
g_dbus_method_invocation_return_error(invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
|
||||||
G_DBUS_ERROR,
|
"D-Bus bus name '%s' is not valid", bus_name);
|
||||||
G_DBUS_ERROR_INVALID_ARGS,
|
|
||||||
"D-Bus bus name '%s' is not valid",
|
|
||||||
bus_name);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
auto watch = gfWatchFind(obj->items_, bus_name, object_path);
|
auto watch = gfWatchFind(obj->items_, bus_name, object_path);
|
||||||
if (watch != nullptr) {
|
if (watch != nullptr) {
|
||||||
g_warning("Status Notifier Item with bus name '%s' and object path '%s' is already registered",
|
g_warning("Status Notifier Item with bus name '%s' and object path '%s' is already registered",
|
||||||
bus_name,
|
bus_name, object_path);
|
||||||
object_path);
|
|
||||||
sn_watcher_complete_register_item(obj->watcher_, invocation);
|
sn_watcher_complete_register_item(obj->watcher_, invocation);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -152,13 +143,8 @@ Watcher::GfWatch* Watcher::gfWatchNew(GfWatchType type, const gchar* service, co
|
||||||
watch->service = g_strdup(service);
|
watch->service = g_strdup(service);
|
||||||
watch->bus_name = g_strdup(bus_name);
|
watch->bus_name = g_strdup(bus_name);
|
||||||
watch->object_path = g_strdup(object_path);
|
watch->object_path = g_strdup(object_path);
|
||||||
watch->watch_id = g_bus_watch_name(G_BUS_TYPE_SESSION,
|
watch->watch_id = g_bus_watch_name(G_BUS_TYPE_SESSION, bus_name, G_BUS_NAME_WATCHER_FLAGS_NONE,
|
||||||
bus_name,
|
nullptr, &Watcher::nameVanished, watch, nullptr);
|
||||||
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
|
||||||
nullptr,
|
|
||||||
&Watcher::nameVanished,
|
|
||||||
watch,
|
|
||||||
nullptr);
|
|
||||||
return watch;
|
return watch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,12 +169,12 @@ void Watcher::updateRegisteredItems(SnWatcher* obj) {
|
||||||
GVariantBuilder builder;
|
GVariantBuilder builder;
|
||||||
g_variant_builder_init(&builder, G_VARIANT_TYPE("as"));
|
g_variant_builder_init(&builder, G_VARIANT_TYPE("as"));
|
||||||
for (GSList* l = items_; l != nullptr; l = g_slist_next(l)) {
|
for (GSList* l = items_; l != nullptr; l = g_slist_next(l)) {
|
||||||
auto watch = static_cast<GfWatch*>(l->data);
|
auto watch = static_cast<GfWatch*>(l->data);
|
||||||
gchar* item = g_strdup_printf("%s%s", watch->bus_name, watch->object_path);
|
gchar* item = g_strdup_printf("%s%s", watch->bus_name, watch->object_path);
|
||||||
g_variant_builder_add(&builder, "s", item);
|
g_variant_builder_add(&builder, "s", item);
|
||||||
g_free(item);
|
g_free(item);
|
||||||
}
|
}
|
||||||
GVariant* variant = g_variant_builder_end(&builder);
|
GVariant* variant = g_variant_builder_end(&builder);
|
||||||
const gchar** items = g_variant_get_strv(variant, nullptr);
|
const gchar** items = g_variant_get_strv(variant, nullptr);
|
||||||
sn_watcher_set_registered_items(obj, items);
|
sn_watcher_set_registered_items(obj, items);
|
||||||
g_variant_unref(variant);
|
g_variant_unref(variant);
|
||||||
|
|
|
@ -79,11 +79,8 @@ void BarIpcClient::onIpcEvent(const struct Ipc::ipc_response& res) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void BarIpcClient::onConfigUpdate(const swaybar_config& config) {
|
void BarIpcClient::onConfigUpdate(const swaybar_config& config) {
|
||||||
spdlog::info("config update for {}: id {}, mode {}, hidden_state {}",
|
spdlog::info("config update for {}: id {}, mode {}, hidden_state {}", bar_.bar_id, config.id,
|
||||||
bar_.bar_id,
|
config.mode, config.hidden_state);
|
||||||
config.id,
|
|
||||||
config.mode,
|
|
||||||
config.hidden_state);
|
|
||||||
bar_config_ = config;
|
bar_config_ = config;
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "modules/sway/ipc/client.hpp"
|
#include "modules/sway/ipc/client.hpp"
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
@ -35,8 +36,8 @@ const std::string Ipc::getSocketPath() const {
|
||||||
std::string str;
|
std::string str;
|
||||||
{
|
{
|
||||||
std::string str_buf;
|
std::string str_buf;
|
||||||
FILE* in;
|
FILE* in;
|
||||||
char buf[512] = {0};
|
char buf[512] = {0};
|
||||||
if ((in = popen("sway --get-socketpath 2>/dev/null", "r")) == nullptr) {
|
if ((in = popen("sway --get-socketpath 2>/dev/null", "r")) == nullptr) {
|
||||||
throw std::runtime_error("Failed to get socket path");
|
throw std::runtime_error("Failed to get socket path");
|
||||||
}
|
}
|
||||||
|
@ -76,7 +77,7 @@ int Ipc::open(const std::string& socketPath) const {
|
||||||
struct Ipc::ipc_response Ipc::recv(int fd) {
|
struct Ipc::ipc_response Ipc::recv(int fd) {
|
||||||
std::string header;
|
std::string header;
|
||||||
header.resize(ipc_header_size_);
|
header.resize(ipc_header_size_);
|
||||||
auto data32 = reinterpret_cast<uint32_t*>(header.data() + ipc_magic_.size());
|
auto data32 = reinterpret_cast<uint32_t*>(header.data() + ipc_magic_.size());
|
||||||
size_t total = 0;
|
size_t total = 0;
|
||||||
|
|
||||||
while (total < ipc_header_size_) {
|
while (total < ipc_header_size_) {
|
||||||
|
|
|
@ -51,8 +51,8 @@ void Language::onCmd(const struct Ipc::ipc_response& res) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
auto payload = parser_.parse(res.payload);
|
auto payload = parser_.parse(res.payload);
|
||||||
std::vector<std::string> used_layouts;
|
std::vector<std::string> used_layouts;
|
||||||
// Display current layout of a device with a maximum count of layouts, expecting that all will
|
// Display current layout of a device with a maximum count of layouts, expecting that all will
|
||||||
// be OK
|
// be OK
|
||||||
Json::ArrayIndex max_id = 0, max = 0;
|
Json::ArrayIndex max_id = 0, max = 0;
|
||||||
|
@ -83,7 +83,7 @@ void Language::onEvent(const struct Ipc::ipc_response& res) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
auto payload = parser_.parse(res.payload)["input"];
|
auto payload = parser_.parse(res.payload)["input"];
|
||||||
if (payload["type"].asString() == "keyboard") {
|
if (payload["type"].asString() == "keyboard") {
|
||||||
set_current_layout(payload[XKB_ACTIVE_LAYOUT_NAME_KEY].asString());
|
set_current_layout(payload[XKB_ACTIVE_LAYOUT_NAME_KEY].asString());
|
||||||
}
|
}
|
||||||
|
@ -95,21 +95,18 @@ void Language::onEvent(const struct Ipc::ipc_response& res) {
|
||||||
|
|
||||||
auto Language::update() -> void {
|
auto Language::update() -> void {
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
auto display_layout = trim(fmt::format(format_,
|
auto display_layout = trim(fmt::format(
|
||||||
fmt::arg("short", layout_.short_name),
|
format_, fmt::arg("short", layout_.short_name),
|
||||||
fmt::arg("shortDescription", layout_.short_description),
|
fmt::arg("shortDescription", layout_.short_description), fmt::arg("long", layout_.full_name),
|
||||||
fmt::arg("long", layout_.full_name),
|
fmt::arg("variant", layout_.variant), fmt::arg("flag", layout_.country_flag())));
|
||||||
fmt::arg("variant", layout_.variant),
|
|
||||||
fmt::arg("flag", layout_.country_flag())));
|
|
||||||
label_.set_markup(display_layout);
|
label_.set_markup(display_layout);
|
||||||
if (tooltipEnabled()) {
|
if (tooltipEnabled()) {
|
||||||
if (tooltip_format_ != "") {
|
if (tooltip_format_ != "") {
|
||||||
auto tooltip_display_layout = trim(fmt::format(tooltip_format_,
|
auto tooltip_display_layout = trim(
|
||||||
fmt::arg("short", layout_.short_name),
|
fmt::format(tooltip_format_, fmt::arg("short", layout_.short_name),
|
||||||
fmt::arg("shortDescription", layout_.short_description),
|
fmt::arg("shortDescription", layout_.short_description),
|
||||||
fmt::arg("long", layout_.full_name),
|
fmt::arg("long", layout_.full_name), fmt::arg("variant", layout_.variant),
|
||||||
fmt::arg("variant", layout_.variant),
|
fmt::arg("flag", layout_.country_flag())));
|
||||||
fmt::arg("flag", layout_.country_flag())));
|
|
||||||
label_.set_tooltip_markup(tooltip_display_layout);
|
label_.set_tooltip_markup(tooltip_display_layout);
|
||||||
} else {
|
} else {
|
||||||
label_.set_tooltip_markup(display_layout);
|
label_.set_tooltip_markup(display_layout);
|
||||||
|
@ -129,7 +126,7 @@ auto Language::set_current_layout(std::string current_layout) -> void {
|
||||||
auto Language::init_layouts_map(const std::vector<std::string>& used_layouts) -> void {
|
auto Language::init_layouts_map(const std::vector<std::string>& used_layouts) -> void {
|
||||||
std::map<std::string, std::vector<Layout*>> found_by_short_names;
|
std::map<std::string, std::vector<Layout*>> found_by_short_names;
|
||||||
XKBContext xkb_context;
|
XKBContext xkb_context;
|
||||||
auto layout = xkb_context.next_layout();
|
auto layout = xkb_context.next_layout();
|
||||||
for (; layout != nullptr; layout = xkb_context.next_layout()) {
|
for (; layout != nullptr; layout = xkb_context.next_layout()) {
|
||||||
if (std::find(used_layouts.begin(), used_layouts.end(), layout->full_name) ==
|
if (std::find(used_layouts.begin(), used_layouts.end(), layout->full_name) ==
|
||||||
used_layouts.end()) {
|
used_layouts.end()) {
|
||||||
|
@ -155,8 +152,7 @@ auto Language::init_layouts_map(const std::vector<std::string>& used_layouts) ->
|
||||||
std::map<std::string, int> short_name_to_number_map;
|
std::map<std::string, int> short_name_to_number_map;
|
||||||
for (const auto& used_layout_name : used_layouts) {
|
for (const auto& used_layout_name : used_layouts) {
|
||||||
auto found = layouts_map_.find(used_layout_name);
|
auto found = layouts_map_.find(used_layout_name);
|
||||||
if (found == layouts_map_.end())
|
if (found == layouts_map_.end()) continue;
|
||||||
continue;
|
|
||||||
auto used_layout = &found->second;
|
auto used_layout = &found->second;
|
||||||
auto layouts_with_same_name_list = found_by_short_names[used_layout->short_name];
|
auto layouts_with_same_name_list = found_by_short_names[used_layout->short_name];
|
||||||
if (layouts_with_same_name_list.size() < 2) {
|
if (layouts_with_same_name_list.size() < 2) {
|
||||||
|
@ -169,10 +165,8 @@ auto Language::init_layouts_map(const std::vector<std::string>& used_layouts) ->
|
||||||
|
|
||||||
if (displayed_short_flag != static_cast<std::byte>(0)) {
|
if (displayed_short_flag != static_cast<std::byte>(0)) {
|
||||||
int& number = short_name_to_number_map[used_layout->short_name];
|
int& number = short_name_to_number_map[used_layout->short_name];
|
||||||
used_layout->short_name =
|
used_layout->short_name = used_layout->short_name + std::to_string(number);
|
||||||
used_layout->short_name + std::to_string(number);
|
used_layout->short_description = used_layout->short_description + std::to_string(number);
|
||||||
used_layout->short_description =
|
|
||||||
used_layout->short_description + std::to_string(number);
|
|
||||||
++number;
|
++number;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -194,18 +188,19 @@ auto Language::XKBContext::next_layout() -> Layout* {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto description = std::string(rxkb_layout_get_description(xkb_layout_));
|
auto description = std::string(rxkb_layout_get_description(xkb_layout_));
|
||||||
auto name = std::string(rxkb_layout_get_name(xkb_layout_));
|
auto name = std::string(rxkb_layout_get_name(xkb_layout_));
|
||||||
auto variant_ = rxkb_layout_get_variant(xkb_layout_);
|
auto variant_ = rxkb_layout_get_variant(xkb_layout_);
|
||||||
std::string variant = variant_ == nullptr ? "" : std::string(variant_);
|
std::string variant = variant_ == nullptr ? "" : std::string(variant_);
|
||||||
auto short_description_ = rxkb_layout_get_brief(xkb_layout_);
|
auto short_description_ = rxkb_layout_get_brief(xkb_layout_);
|
||||||
std::string short_description;
|
std::string short_description;
|
||||||
if (short_description_ != nullptr) {
|
if (short_description_ != nullptr) {
|
||||||
short_description = std::string(short_description_);
|
short_description = std::string(short_description_);
|
||||||
base_layouts_by_name_.emplace(name, xkb_layout_);
|
base_layouts_by_name_.emplace(name, xkb_layout_);
|
||||||
} else {
|
} else {
|
||||||
auto base_layout = base_layouts_by_name_[name];
|
auto base_layout = base_layouts_by_name_[name];
|
||||||
short_description = base_layout == nullptr ? "" : std::string(rxkb_layout_get_brief(base_layout));
|
short_description =
|
||||||
|
base_layout == nullptr ? "" : std::string(rxkb_layout_get_brief(base_layout));
|
||||||
}
|
}
|
||||||
delete layout_;
|
delete layout_;
|
||||||
layout_ = new Layout{description, name, variant, short_description};
|
layout_ = new Layout{description, name, variant, short_description};
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "modules/sway/mode.hpp"
|
#include "modules/sway/mode.hpp"
|
||||||
|
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
@ -21,7 +22,7 @@ Mode::Mode(const std::string& id, const Json::Value& config)
|
||||||
void Mode::onEvent(const struct Ipc::ipc_response& res) {
|
void Mode::onEvent(const struct Ipc::ipc_response& res) {
|
||||||
try {
|
try {
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
auto payload = parser_.parse(res.payload);
|
auto payload = parser_.parse(res.payload);
|
||||||
if (payload["change"] != "default") {
|
if (payload["change"] != "default") {
|
||||||
if (payload["pango_markup"].asBool()) {
|
if (payload["pango_markup"].asBool()) {
|
||||||
mode_ = payload["change"].asString();
|
mode_ = payload["change"].asString();
|
||||||
|
|
|
@ -70,11 +70,11 @@ std::optional<Glib::ustring> getIconName(const std::string& app_id) {
|
||||||
}
|
}
|
||||||
return icon_name;
|
return icon_name;
|
||||||
} catch (Glib::FileError& error) {
|
} catch (Glib::FileError& error) {
|
||||||
spdlog::warn(
|
spdlog::warn("Error while loading desktop file {}: {}", desktop_file_path.value(),
|
||||||
"Error while loading desktop file {}: {}", desktop_file_path.value(), error.what().c_str());
|
error.what().c_str());
|
||||||
} catch (Glib::KeyFileError& error) {
|
} catch (Glib::KeyFileError& error) {
|
||||||
spdlog::warn(
|
spdlog::warn("Error while loading desktop file {}: {}", desktop_file_path.value(),
|
||||||
"Error while loading desktop file {}: {}", desktop_file_path.value(), error.what().c_str());
|
error.what().c_str());
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -114,8 +114,8 @@ auto Window::update() -> void {
|
||||||
bar_.window.get_style_context()->remove_class("solo");
|
bar_.window.get_style_context()->remove_class("solo");
|
||||||
bar_.window.get_style_context()->remove_class("empty");
|
bar_.window.get_style_context()->remove_class("empty");
|
||||||
}
|
}
|
||||||
label_.set_markup(fmt::format(format_, fmt::arg("title", rewriteTitle(window_)),
|
label_.set_markup(
|
||||||
fmt::arg("app_id", app_id_)));
|
fmt::format(format_, fmt::arg("title", rewriteTitle(window_)), fmt::arg("app_id", app_id_)));
|
||||||
if (tooltipEnabled()) {
|
if (tooltipEnabled()) {
|
||||||
label_.set_tooltip_text(window_);
|
label_.set_tooltip_text(window_);
|
||||||
}
|
}
|
||||||
|
@ -126,28 +126,26 @@ auto Window::update() -> void {
|
||||||
int leafNodesInWorkspace(const Json::Value& node) {
|
int leafNodesInWorkspace(const Json::Value& node) {
|
||||||
auto const& nodes = node["nodes"];
|
auto const& nodes = node["nodes"];
|
||||||
auto const& floating_nodes = node["floating_nodes"];
|
auto const& floating_nodes = node["floating_nodes"];
|
||||||
if(nodes.empty() && floating_nodes.empty()) {
|
if (nodes.empty() && floating_nodes.empty()) {
|
||||||
if(node["type"] == "workspace")
|
if (node["type"] == "workspace")
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
if (!nodes.empty()) {
|
if (!nodes.empty()) {
|
||||||
for(auto const& node : nodes)
|
for (auto const& node : nodes) sum += leafNodesInWorkspace(node);
|
||||||
sum += leafNodesInWorkspace(node);
|
|
||||||
}
|
}
|
||||||
if (!floating_nodes.empty()) {
|
if (!floating_nodes.empty()) {
|
||||||
for(auto const& node : floating_nodes)
|
for (auto const& node : floating_nodes) sum += leafNodesInWorkspace(node);
|
||||||
sum += leafNodesInWorkspace(node);
|
|
||||||
}
|
}
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<std::size_t, int, std::string, std::string> gfnWithWorkspace(
|
std::tuple<std::size_t, int, std::string, std::string> gfnWithWorkspace(
|
||||||
const Json::Value& nodes, std::string& output, const Json::Value& config_,
|
const Json::Value& nodes, std::string& output, const Json::Value& config_, const Bar& bar_,
|
||||||
const Bar& bar_, Json::Value& parentWorkspace) {
|
Json::Value& parentWorkspace) {
|
||||||
for(auto const& node : nodes) {
|
for (auto const& node : nodes) {
|
||||||
if (node["output"].isString()) {
|
if (node["output"].isString()) {
|
||||||
output = node["output"].asString();
|
output = node["output"].asString();
|
||||||
}
|
}
|
||||||
|
@ -156,25 +154,22 @@ std::tuple<std::size_t, int, std::string, std::string> gfnWithWorkspace(
|
||||||
if ((!config_["all-outputs"].asBool() && output == bar_.output->name) ||
|
if ((!config_["all-outputs"].asBool() && output == bar_.output->name) ||
|
||||||
config_["all-outputs"].asBool()) {
|
config_["all-outputs"].asBool()) {
|
||||||
auto app_id = node["app_id"].isString() ? node["app_id"].asString()
|
auto app_id = node["app_id"].isString() ? node["app_id"].asString()
|
||||||
: node["window_properties"]["instance"].asString();
|
: node["window_properties"]["instance"].asString();
|
||||||
int nb = node.size();
|
int nb = node.size();
|
||||||
if(parentWorkspace != 0)
|
if (parentWorkspace != 0) nb = leafNodesInWorkspace(parentWorkspace);
|
||||||
nb = leafNodesInWorkspace(parentWorkspace);
|
return {nb, node["id"].asInt(), Glib::Markup::escape_text(node["name"].asString()), app_id};
|
||||||
return {nb,
|
|
||||||
node["id"].asInt(),
|
|
||||||
Glib::Markup::escape_text(node["name"].asString()),
|
|
||||||
app_id};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// iterate
|
// iterate
|
||||||
if(node["type"] == "workspace")
|
if (node["type"] == "workspace") parentWorkspace = node;
|
||||||
parentWorkspace = node;
|
auto [nb, id, name, app_id] =
|
||||||
auto [nb, id, name, app_id] = gfnWithWorkspace(node["nodes"], output, config_, bar_, parentWorkspace);
|
gfnWithWorkspace(node["nodes"], output, config_, bar_, parentWorkspace);
|
||||||
if (id > -1 && !name.empty()) {
|
if (id > -1 && !name.empty()) {
|
||||||
return {nb, id, name, app_id};
|
return {nb, id, name, app_id};
|
||||||
}
|
}
|
||||||
// Search for floating node
|
// Search for floating node
|
||||||
std::tie(nb, id, name, app_id) = gfnWithWorkspace(node["floating_nodes"], output, config_, bar_, parentWorkspace);
|
std::tie(nb, id, name, app_id) =
|
||||||
|
gfnWithWorkspace(node["floating_nodes"], output, config_, bar_, parentWorkspace);
|
||||||
if (id > -1 && !name.empty()) {
|
if (id > -1 && !name.empty()) {
|
||||||
return {nb, id, name, app_id};
|
return {nb, id, name, app_id};
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace waybar::modules::sway {
|
||||||
int Workspaces::convertWorkspaceNameToNum(std::string name) {
|
int Workspaces::convertWorkspaceNameToNum(std::string name) {
|
||||||
if (isdigit(name[0])) {
|
if (isdigit(name[0])) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
char * endptr = NULL;
|
char *endptr = NULL;
|
||||||
long long parsed_num = strtoll(name.c_str(), &endptr, 10);
|
long long parsed_num = strtoll(name.c_str(), &endptr, 10);
|
||||||
if (errno != 0 || parsed_num > INT32_MAX || parsed_num < 0 || endptr == name.c_str()) {
|
if (errno != 0 || parsed_num > INT32_MAX || parsed_num < 0 || endptr == name.c_str()) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -65,11 +65,9 @@ void Workspaces::onCmd(const struct Ipc::ipc_response &res) {
|
||||||
try {
|
try {
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
auto payload = parser_.parse(res.payload);
|
auto payload = parser_.parse(res.payload);
|
||||||
workspaces_.clear();
|
workspaces_.clear();
|
||||||
std::copy_if(payload.begin(),
|
std::copy_if(payload.begin(), payload.end(), std::back_inserter(workspaces_),
|
||||||
payload.end(),
|
|
||||||
std::back_inserter(workspaces_),
|
|
||||||
[&](const auto &workspace) {
|
[&](const auto &workspace) {
|
||||||
return !config_["all-outputs"].asBool()
|
return !config_["all-outputs"].asBool()
|
||||||
? workspace["output"].asString() == bar_.output->name
|
? workspace["output"].asString() == bar_.output->name
|
||||||
|
@ -78,12 +76,12 @@ void Workspaces::onCmd(const struct Ipc::ipc_response &res) {
|
||||||
|
|
||||||
// adding persistent workspaces (as per the config file)
|
// adding persistent workspaces (as per the config file)
|
||||||
if (config_["persistent_workspaces"].isObject()) {
|
if (config_["persistent_workspaces"].isObject()) {
|
||||||
const Json::Value & p_workspaces = config_["persistent_workspaces"];
|
const Json::Value &p_workspaces = config_["persistent_workspaces"];
|
||||||
const std::vector<std::string> p_workspaces_names = p_workspaces.getMemberNames();
|
const std::vector<std::string> p_workspaces_names = p_workspaces.getMemberNames();
|
||||||
|
|
||||||
for (const std::string &p_w_name : p_workspaces_names) {
|
for (const std::string &p_w_name : p_workspaces_names) {
|
||||||
const Json::Value &p_w = p_workspaces[p_w_name];
|
const Json::Value &p_w = p_workspaces[p_w_name];
|
||||||
auto it =
|
auto it =
|
||||||
std::find_if(payload.begin(), payload.end(), [&p_w_name](const Json::Value &node) {
|
std::find_if(payload.begin(), payload.end(), [&p_w_name](const Json::Value &node) {
|
||||||
return node["name"].asString() == p_w_name;
|
return node["name"].asString() == p_w_name;
|
||||||
});
|
});
|
||||||
|
@ -133,10 +131,10 @@ void Workspaces::onCmd(const struct Ipc::ipc_response &res) {
|
||||||
// unnumbered workspaces behind numbered ones when computing the sort
|
// unnumbered workspaces behind numbered ones when computing the sort
|
||||||
// attribute.
|
// attribute.
|
||||||
int max_num = -1;
|
int max_num = -1;
|
||||||
for (auto & workspace : workspaces_) {
|
for (auto &workspace : workspaces_) {
|
||||||
max_num = std::max(workspace["num"].asInt(), max_num);
|
max_num = std::max(workspace["num"].asInt(), max_num);
|
||||||
}
|
}
|
||||||
for (auto & workspace : workspaces_) {
|
for (auto &workspace : workspaces_) {
|
||||||
auto workspace_num = workspace["num"].asInt();
|
auto workspace_num = workspace["num"].asInt();
|
||||||
if (workspace_num > -1) {
|
if (workspace_num > -1) {
|
||||||
workspace["sort"] = workspace_num;
|
workspace["sort"] = workspace_num;
|
||||||
|
@ -144,13 +142,12 @@ void Workspaces::onCmd(const struct Ipc::ipc_response &res) {
|
||||||
workspace["sort"] = ++max_num;
|
workspace["sort"] = ++max_num;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::sort(workspaces_.begin(),
|
std::sort(workspaces_.begin(), workspaces_.end(),
|
||||||
workspaces_.end(),
|
|
||||||
[](const Json::Value &lhs, const Json::Value &rhs) {
|
[](const Json::Value &lhs, const Json::Value &rhs) {
|
||||||
auto lname = lhs["name"].asString();
|
auto lname = lhs["name"].asString();
|
||||||
auto rname = rhs["name"].asString();
|
auto rname = rhs["name"].asString();
|
||||||
int l = lhs["sort"].asInt();
|
int l = lhs["sort"].asInt();
|
||||||
int r = rhs["sort"].asInt();
|
int r = rhs["sort"].asInt();
|
||||||
|
|
||||||
if (l == r) {
|
if (l == r) {
|
||||||
// In case both integers are the same, lexicographical
|
// In case both integers are the same, lexicographical
|
||||||
|
@ -161,7 +158,6 @@ void Workspaces::onCmd(const struct Ipc::ipc_response &res) {
|
||||||
|
|
||||||
return l < r;
|
return l < r;
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
dp.emit();
|
dp.emit();
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
|
@ -173,9 +169,8 @@ void Workspaces::onCmd(const struct Ipc::ipc_response &res) {
|
||||||
bool Workspaces::filterButtons() {
|
bool Workspaces::filterButtons() {
|
||||||
bool needReorder = false;
|
bool needReorder = false;
|
||||||
for (auto it = buttons_.begin(); it != buttons_.end();) {
|
for (auto it = buttons_.begin(); it != buttons_.end();) {
|
||||||
auto ws = std::find_if(workspaces_.begin(), workspaces_.end(), [it](const auto &node) {
|
auto ws = std::find_if(workspaces_.begin(), workspaces_.end(),
|
||||||
return node["name"].asString() == it->first;
|
[it](const auto &node) { return node["name"].asString() == it->first; });
|
||||||
});
|
|
||||||
if (ws == workspaces_.end() ||
|
if (ws == workspaces_.end() ||
|
||||||
(!config_["all-outputs"].asBool() && (*ws)["output"].asString() != bar_.output->name)) {
|
(!config_["all-outputs"].asBool() && (*ws)["output"].asString() != bar_.output->name)) {
|
||||||
it = buttons_.erase(it);
|
it = buttons_.erase(it);
|
||||||
|
@ -189,7 +184,7 @@ bool Workspaces::filterButtons() {
|
||||||
|
|
||||||
auto Workspaces::update() -> void {
|
auto Workspaces::update() -> void {
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
bool needReorder = filterButtons();
|
bool needReorder = filterButtons();
|
||||||
for (auto it = workspaces_.begin(); it != workspaces_.end(); ++it) {
|
for (auto it = workspaces_.begin(); it != workspaces_.end(); ++it) {
|
||||||
auto bit = buttons_.find((*it)["name"].asString());
|
auto bit = buttons_.find((*it)["name"].asString());
|
||||||
if (bit == buttons_.end()) {
|
if (bit == buttons_.end()) {
|
||||||
|
@ -231,10 +226,8 @@ auto Workspaces::update() -> void {
|
||||||
std::string output = (*it)["name"].asString();
|
std::string output = (*it)["name"].asString();
|
||||||
if (config_["format"].isString()) {
|
if (config_["format"].isString()) {
|
||||||
auto format = config_["format"].asString();
|
auto format = config_["format"].asString();
|
||||||
output = fmt::format(format,
|
output = fmt::format(format, fmt::arg("icon", getIcon(output, *it)),
|
||||||
fmt::arg("icon", getIcon(output, *it)),
|
fmt::arg("value", output), fmt::arg("name", trimWorkspaceName(output)),
|
||||||
fmt::arg("value", output),
|
|
||||||
fmt::arg("name", trimWorkspaceName(output)),
|
|
||||||
fmt::arg("index", (*it)["num"].asString()));
|
fmt::arg("index", (*it)["num"].asString()));
|
||||||
}
|
}
|
||||||
if (!config_["disable-markup"].asBool()) {
|
if (!config_["disable-markup"].asBool()) {
|
||||||
|
@ -249,7 +242,7 @@ auto Workspaces::update() -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
Gtk::Button &Workspaces::addButton(const Json::Value &node) {
|
Gtk::Button &Workspaces::addButton(const Json::Value &node) {
|
||||||
auto pair = buttons_.emplace(node["name"].asString(), node["name"].asString());
|
auto pair = buttons_.emplace(node["name"].asString(), node["name"].asString());
|
||||||
auto &&button = pair.first->second;
|
auto &&button = pair.first->second;
|
||||||
box_.pack_start(button, false, false, 0);
|
box_.pack_start(button, false, false, 0);
|
||||||
button.set_name("sway-workspace-" + node["name"].asString());
|
button.set_name("sway-workspace-" + node["name"].asString());
|
||||||
|
@ -258,22 +251,18 @@ Gtk::Button &Workspaces::addButton(const Json::Value &node) {
|
||||||
button.signal_pressed().connect([this, node] {
|
button.signal_pressed().connect([this, node] {
|
||||||
try {
|
try {
|
||||||
if (node["target_output"].isString()) {
|
if (node["target_output"].isString()) {
|
||||||
ipc_.sendCmd(
|
ipc_.sendCmd(IPC_COMMAND,
|
||||||
IPC_COMMAND,
|
fmt::format(workspace_switch_cmd_ + "; move workspace to output \"{}\"; " +
|
||||||
fmt::format(workspace_switch_cmd_ + "; move workspace to output \"{}\"; " + workspace_switch_cmd_,
|
workspace_switch_cmd_,
|
||||||
"--no-auto-back-and-forth",
|
"--no-auto-back-and-forth", node["name"].asString(),
|
||||||
node["name"].asString(),
|
node["target_output"].asString(), "--no-auto-back-and-forth",
|
||||||
node["target_output"].asString(),
|
node["name"].asString()));
|
||||||
"--no-auto-back-and-forth",
|
|
||||||
node["name"].asString()));
|
|
||||||
} else {
|
} else {
|
||||||
ipc_.sendCmd(
|
ipc_.sendCmd(IPC_COMMAND, fmt::format("workspace {} \"{}\"",
|
||||||
IPC_COMMAND,
|
config_["disable-auto-back-and-forth"].asBool()
|
||||||
fmt::format("workspace {} \"{}\"",
|
? "--no-auto-back-and-forth"
|
||||||
config_["disable-auto-back-and-forth"].asBool()
|
: "",
|
||||||
? "--no-auto-back-and-forth"
|
node["name"].asString()));
|
||||||
: "",
|
|
||||||
node["name"].asString()));
|
|
||||||
}
|
}
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
spdlog::error("Workspaces: {}", e.what());
|
spdlog::error("Workspaces: {}", e.what());
|
||||||
|
@ -316,9 +305,8 @@ bool Workspaces::handleScroll(GdkEventScroll *e) {
|
||||||
std::string name;
|
std::string name;
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
auto it = std::find_if(workspaces_.begin(), workspaces_.end(), [](const auto &workspace) {
|
auto it = std::find_if(workspaces_.begin(), workspaces_.end(),
|
||||||
return workspace["focused"].asBool();
|
[](const auto &workspace) { return workspace["focused"].asBool(); });
|
||||||
});
|
|
||||||
if (it == workspaces_.end()) {
|
if (it == workspaces_.end()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -334,9 +322,7 @@ bool Workspaces::handleScroll(GdkEventScroll *e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
ipc_.sendCmd(
|
ipc_.sendCmd(IPC_COMMAND, fmt::format(workspace_switch_cmd_, "--no-auto-back-and-forth", name));
|
||||||
IPC_COMMAND,
|
|
||||||
fmt::format(workspace_switch_cmd_, "--no-auto-back-and-forth", name));
|
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
spdlog::error("Workspaces: {}", e.what());
|
spdlog::error("Workspaces: {}", e.what());
|
||||||
}
|
}
|
||||||
|
@ -344,7 +330,7 @@ bool Workspaces::handleScroll(GdkEventScroll *e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string Workspaces::getCycleWorkspace(std::vector<Json::Value>::iterator it,
|
const std::string Workspaces::getCycleWorkspace(std::vector<Json::Value>::iterator it,
|
||||||
bool prev) const {
|
bool prev) const {
|
||||||
if (prev && it == workspaces_.begin() && !config_["disable-scroll-wraparound"].asBool()) {
|
if (prev && it == workspaces_.begin() && !config_["disable-scroll-wraparound"].asBool()) {
|
||||||
return (*(--workspaces_.end()))["name"].asString();
|
return (*(--workspaces_.end()))["name"].asString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "modules/temperature.hpp"
|
#include "modules/temperature.hpp"
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
waybar::modules::Temperature::Temperature(const std::string& id, const Json::Value& config)
|
waybar::modules::Temperature::Temperature(const std::string& id, const Json::Value& config)
|
||||||
|
@ -6,7 +7,10 @@ waybar::modules::Temperature::Temperature(const std::string& id, const Json::Val
|
||||||
if (config_["hwmon-path"].isString()) {
|
if (config_["hwmon-path"].isString()) {
|
||||||
file_path_ = config_["hwmon-path"].asString();
|
file_path_ = config_["hwmon-path"].asString();
|
||||||
} else if (config_["hwmon-path-abs"].isString() && config_["input-filename"].isString()) {
|
} else if (config_["hwmon-path-abs"].isString() && config_["input-filename"].isString()) {
|
||||||
file_path_ = (*std::filesystem::directory_iterator(config_["hwmon-path-abs"].asString())).path().string() + "/" + config_["input-filename"].asString();
|
file_path_ = (*std::filesystem::directory_iterator(config_["hwmon-path-abs"].asString()))
|
||||||
|
.path()
|
||||||
|
.string() +
|
||||||
|
"/" + config_["input-filename"].asString();
|
||||||
} else {
|
} else {
|
||||||
auto zone = config_["thermal-zone"].isInt() ? config_["thermal-zone"].asInt() : 0;
|
auto zone = config_["thermal-zone"].isInt() ? config_["thermal-zone"].asInt() : 0;
|
||||||
file_path_ = fmt::format("/sys/class/thermal/thermal_zone{}/temp", zone);
|
file_path_ = fmt::format("/sys/class/thermal/thermal_zone{}/temp", zone);
|
||||||
|
@ -35,7 +39,7 @@ auto waybar::modules::Temperature::update() -> void {
|
||||||
label_.get_style_context()->remove_class("critical");
|
label_.get_style_context()->remove_class("critical");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(format.empty()) {
|
if (format.empty()) {
|
||||||
event_box_.hide();
|
event_box_.hide();
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
@ -43,8 +47,7 @@ auto waybar::modules::Temperature::update() -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto max_temp = config_["critical-threshold"].isInt() ? config_["critical-threshold"].asInt() : 0;
|
auto max_temp = config_["critical-threshold"].isInt() ? config_["critical-threshold"].asInt() : 0;
|
||||||
label_.set_markup(fmt::format(format,
|
label_.set_markup(fmt::format(format, fmt::arg("temperatureC", temperature_c),
|
||||||
fmt::arg("temperatureC", temperature_c),
|
|
||||||
fmt::arg("temperatureF", temperature_f),
|
fmt::arg("temperatureF", temperature_f),
|
||||||
fmt::arg("temperatureK", temperature_k),
|
fmt::arg("temperatureK", temperature_k),
|
||||||
fmt::arg("icon", getIcon(temperature_c, "", max_temp))));
|
fmt::arg("icon", getIcon(temperature_c, "", max_temp))));
|
||||||
|
@ -53,10 +56,9 @@ auto waybar::modules::Temperature::update() -> void {
|
||||||
if (config_["tooltip-format"].isString()) {
|
if (config_["tooltip-format"].isString()) {
|
||||||
tooltip_format = config_["tooltip-format"].asString();
|
tooltip_format = config_["tooltip-format"].asString();
|
||||||
}
|
}
|
||||||
label_.set_tooltip_text(fmt::format(tooltip_format,
|
label_.set_tooltip_text(fmt::format(tooltip_format, fmt::arg("temperatureC", temperature_c),
|
||||||
fmt::arg("temperatureC", temperature_c),
|
fmt::arg("temperatureF", temperature_f),
|
||||||
fmt::arg("temperatureF", temperature_f),
|
fmt::arg("temperatureK", temperature_k)));
|
||||||
fmt::arg("temperatureK", temperature_k)));
|
|
||||||
}
|
}
|
||||||
// Call parent update
|
// Call parent update
|
||||||
ALabel::update();
|
ALabel::update();
|
||||||
|
@ -72,7 +74,7 @@ float waybar::modules::Temperature::getTemperature() {
|
||||||
getline(temp, line);
|
getline(temp, line);
|
||||||
}
|
}
|
||||||
temp.close();
|
temp.close();
|
||||||
auto temperature_c = std::strtol(line.c_str(), nullptr, 10) / 1000.0;
|
auto temperature_c = std::strtol(line.c_str(), nullptr, 10) / 1000.0;
|
||||||
return temperature_c;
|
return temperature_c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,13 +68,9 @@ UPower::UPower(const std::string& id, const Json::Value& config)
|
||||||
box_.signal_query_tooltip().connect(sigc::mem_fun(*this, &UPower::show_tooltip_callback));
|
box_.signal_query_tooltip().connect(sigc::mem_fun(*this, &UPower::show_tooltip_callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
upowerWatcher_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM,
|
upowerWatcher_id = g_bus_watch_name(G_BUS_TYPE_SYSTEM, "org.freedesktop.UPower",
|
||||||
"org.freedesktop.UPower",
|
G_BUS_NAME_WATCHER_FLAGS_AUTO_START, upowerAppear,
|
||||||
G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
|
upowerDisappear, this, NULL);
|
||||||
upowerAppear,
|
|
||||||
upowerDisappear,
|
|
||||||
this,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
GError* error = NULL;
|
GError* error = NULL;
|
||||||
client = up_client_new_full(NULL, &error);
|
client = up_client_new_full(NULL, &error);
|
||||||
|
@ -87,16 +83,10 @@ UPower::UPower(const std::string& id, const Json::Value& config)
|
||||||
if (!login1_connection) {
|
if (!login1_connection) {
|
||||||
throw std::runtime_error("Unable to connect to the SYSTEM Bus!...");
|
throw std::runtime_error("Unable to connect to the SYSTEM Bus!...");
|
||||||
} else {
|
} else {
|
||||||
login1_id = g_dbus_connection_signal_subscribe(login1_connection,
|
login1_id = g_dbus_connection_signal_subscribe(
|
||||||
"org.freedesktop.login1",
|
login1_connection, "org.freedesktop.login1", "org.freedesktop.login1.Manager",
|
||||||
"org.freedesktop.login1.Manager",
|
"PrepareForSleep", "/org/freedesktop/login1", NULL, G_DBUS_SIGNAL_FLAGS_NONE,
|
||||||
"PrepareForSleep",
|
prepareForSleep_cb, this, NULL);
|
||||||
"/org/freedesktop/login1",
|
|
||||||
NULL,
|
|
||||||
G_DBUS_SIGNAL_FLAGS_NONE,
|
|
||||||
prepareForSleep_cb,
|
|
||||||
this,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &UPower::handleToggle));
|
event_box_.signal_button_press_event().connect(sigc::mem_fun(*this, &UPower::handleToggle));
|
||||||
|
@ -284,26 +274,15 @@ auto UPower::update() -> void {
|
||||||
// Don't update widget if the UPower service isn't running
|
// Don't update widget if the UPower service isn't running
|
||||||
if (!upowerRunning) return;
|
if (!upowerRunning) return;
|
||||||
|
|
||||||
UpDeviceKind kind;
|
UpDeviceKind kind;
|
||||||
UpDeviceState state;
|
UpDeviceState state;
|
||||||
double percentage;
|
double percentage;
|
||||||
gint64 time_empty;
|
gint64 time_empty;
|
||||||
gint64 time_full;
|
gint64 time_full;
|
||||||
gchar* icon_name;
|
gchar* icon_name;
|
||||||
|
|
||||||
g_object_get(displayDevice,
|
g_object_get(displayDevice, "kind", &kind, "state", &state, "percentage", &percentage,
|
||||||
"kind",
|
"icon-name", &icon_name, "time-to-empty", &time_empty, "time-to-full", &time_full,
|
||||||
&kind,
|
|
||||||
"state",
|
|
||||||
&state,
|
|
||||||
"percentage",
|
|
||||||
&percentage,
|
|
||||||
"icon-name",
|
|
||||||
&icon_name,
|
|
||||||
"time-to-empty",
|
|
||||||
&time_empty,
|
|
||||||
"time-to-full",
|
|
||||||
&time_full,
|
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
bool displayDeviceValid =
|
bool displayDeviceValid =
|
||||||
|
@ -357,9 +336,9 @@ auto UPower::update() -> void {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
std::string label_format = fmt::format(showAltText ? format_alt : format,
|
std::string label_format =
|
||||||
fmt::arg("percentage", percentString),
|
fmt::format(showAltText ? format_alt : format, fmt::arg("percentage", percentString),
|
||||||
fmt::arg("time", time_format));
|
fmt::arg("time", time_format));
|
||||||
// Only set the label text if it doesn't only contain spaces
|
// Only set the label text if it doesn't only contain spaces
|
||||||
bool onlySpaces = true;
|
bool onlySpaces = true;
|
||||||
for (auto& character : label_format) {
|
for (auto& character : label_format) {
|
||||||
|
|
|
@ -35,7 +35,7 @@ uint UPowerTooltip::updateTooltip(Devices& devices) {
|
||||||
uint deviceCount = 0;
|
uint deviceCount = 0;
|
||||||
// Adds all valid devices
|
// Adds all valid devices
|
||||||
for (auto pair : devices) {
|
for (auto pair : devices) {
|
||||||
UpDevice* device = pair.second;
|
UpDevice* device = pair.second;
|
||||||
std::string objectPath = pair.first;
|
std::string objectPath = pair.first;
|
||||||
|
|
||||||
if (!G_IS_OBJECT(device)) continue;
|
if (!G_IS_OBJECT(device)) continue;
|
||||||
|
@ -43,23 +43,13 @@ uint UPowerTooltip::updateTooltip(Devices& devices) {
|
||||||
Gtk::Box* box = new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, tooltipSpacing);
|
Gtk::Box* box = new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, tooltipSpacing);
|
||||||
|
|
||||||
UpDeviceKind kind;
|
UpDeviceKind kind;
|
||||||
double percentage;
|
double percentage;
|
||||||
gchar* native_path;
|
gchar* native_path;
|
||||||
gchar* model;
|
gchar* model;
|
||||||
gchar* icon_name;
|
gchar* icon_name;
|
||||||
|
|
||||||
g_object_get(device,
|
g_object_get(device, "kind", &kind, "percentage", &percentage, "native-path", &native_path,
|
||||||
"kind",
|
"model", &model, "icon-name", &icon_name, NULL);
|
||||||
&kind,
|
|
||||||
"percentage",
|
|
||||||
&percentage,
|
|
||||||
"native-path",
|
|
||||||
&native_path,
|
|
||||||
"model",
|
|
||||||
&model,
|
|
||||||
"icon-name",
|
|
||||||
&icon_name,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
// Skip Line_Power and BAT0 devices
|
// Skip Line_Power and BAT0 devices
|
||||||
if (kind == UP_DEVICE_KIND_LINE_POWER || native_path == NULL || strlen(native_path) == 0 ||
|
if (kind == UP_DEVICE_KIND_LINE_POWER || native_path == NULL || strlen(native_path) == 0 ||
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -13,8 +13,8 @@
|
||||||
|
|
||||||
namespace waybar::modules::wlr {
|
namespace waybar::modules::wlr {
|
||||||
|
|
||||||
uint32_t WorkspaceGroup::workspace_global_id = 0;
|
uint32_t WorkspaceGroup::workspace_global_id = 0;
|
||||||
uint32_t WorkspaceManager::group_global_id = 0;
|
uint32_t WorkspaceManager::group_global_id = 0;
|
||||||
std::map<std::string, std::string> Workspace::icons_map_;
|
std::map<std::string, std::string> Workspace::icons_map_;
|
||||||
|
|
||||||
WorkspaceManager::WorkspaceManager(const std::string &id, const waybar::Bar &bar,
|
WorkspaceManager::WorkspaceManager(const std::string &id, const waybar::Bar &bar,
|
||||||
|
@ -156,8 +156,7 @@ WorkspaceManager::~WorkspaceManager() {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto WorkspaceManager::remove_workspace_group(uint32_t id) -> void {
|
auto WorkspaceManager::remove_workspace_group(uint32_t id) -> void {
|
||||||
auto it = std::find_if(groups_.begin(),
|
auto it = std::find_if(groups_.begin(), groups_.end(),
|
||||||
groups_.end(),
|
|
||||||
[id](const std::unique_ptr<WorkspaceGroup> &g) { return g->id() == id; });
|
[id](const std::unique_ptr<WorkspaceGroup> &g) { return g->id() == id; });
|
||||||
|
|
||||||
if (it == groups_.end()) {
|
if (it == groups_.end()) {
|
||||||
|
@ -170,7 +169,7 @@ auto WorkspaceManager::remove_workspace_group(uint32_t id) -> void {
|
||||||
auto WorkspaceManager::commit() -> void { zext_workspace_manager_v1_commit(workspace_manager_); }
|
auto WorkspaceManager::commit() -> void { zext_workspace_manager_v1_commit(workspace_manager_); }
|
||||||
|
|
||||||
WorkspaceGroup::WorkspaceGroup(const Bar &bar, Gtk::Box &box, const Json::Value &config,
|
WorkspaceGroup::WorkspaceGroup(const Bar &bar, Gtk::Box &box, const Json::Value &config,
|
||||||
WorkspaceManager &manager,
|
WorkspaceManager &manager,
|
||||||
zext_workspace_group_handle_v1 *workspace_group_handle, uint32_t id)
|
zext_workspace_group_handle_v1 *workspace_group_handle, uint32_t id)
|
||||||
: bar_(bar),
|
: bar_(bar),
|
||||||
box_(box),
|
box_(box),
|
||||||
|
@ -257,8 +256,7 @@ auto WorkspaceGroup::update() -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto WorkspaceGroup::remove_workspace(uint32_t id) -> void {
|
auto WorkspaceGroup::remove_workspace(uint32_t id) -> void {
|
||||||
auto it = std::find_if(workspaces_.begin(),
|
auto it = std::find_if(workspaces_.begin(), workspaces_.end(),
|
||||||
workspaces_.end(),
|
|
||||||
[id](const std::unique_ptr<Workspace> &w) { return w->id() == id; });
|
[id](const std::unique_ptr<Workspace> &w) { return w->id() == id; });
|
||||||
|
|
||||||
if (it == workspaces_.end()) {
|
if (it == workspaces_.end()) {
|
||||||
|
@ -353,8 +351,8 @@ Workspace::~Workspace() {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Workspace::update() -> void {
|
auto Workspace::update() -> void {
|
||||||
label_.set_markup(fmt::format(
|
label_.set_markup(fmt::format(format_, fmt::arg("name", name_),
|
||||||
format_, fmt::arg("name", name_), fmt::arg("icon", with_icon_ ? get_icon() : "")));
|
fmt::arg("icon", with_icon_ ? get_icon() : "")));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Workspace::handle_state(const std::vector<uint32_t> &state) -> void {
|
auto Workspace::handle_state(const std::vector<uint32_t> &state) -> void {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "modules/wlr/workspace_manager_binding.hpp"
|
#include "modules/wlr/workspace_manager_binding.hpp"
|
||||||
|
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "client.hpp"
|
#include "client.hpp"
|
||||||
|
@ -23,7 +24,7 @@ static const wl_registry_listener registry_listener_impl = {.global = handle_glo
|
||||||
.global_remove = handle_global_remove};
|
.global_remove = handle_global_remove};
|
||||||
|
|
||||||
void add_registry_listener(void *data) {
|
void add_registry_listener(void *data) {
|
||||||
wl_display * display = Client::inst()->wl_display;
|
wl_display *display = Client::inst()->wl_display;
|
||||||
wl_registry *registry = wl_display_get_registry(display);
|
wl_registry *registry = wl_display_get_registry(display);
|
||||||
|
|
||||||
wl_registry_add_listener(registry, ®istry_listener_impl, data);
|
wl_registry_add_listener(registry, ®istry_listener_impl, data);
|
||||||
|
@ -89,7 +90,7 @@ static const zext_workspace_group_handle_v1_listener workspace_group_impl = {
|
||||||
.remove = workspace_group_handle_remove};
|
.remove = workspace_group_handle_remove};
|
||||||
|
|
||||||
void add_workspace_group_listener(zext_workspace_group_handle_v1 *workspace_group_handle,
|
void add_workspace_group_listener(zext_workspace_group_handle_v1 *workspace_group_handle,
|
||||||
void * data) {
|
void *data) {
|
||||||
zext_workspace_group_handle_v1_add_listener(workspace_group_handle, &workspace_group_impl, data);
|
zext_workspace_group_handle_v1_add_listener(workspace_group_handle, &workspace_group_impl, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +101,7 @@ void workspace_handle_name(void *data, struct zext_workspace_handle_v1 *_, const
|
||||||
void workspace_handle_coordinates(void *data, struct zext_workspace_handle_v1 *_,
|
void workspace_handle_coordinates(void *data, struct zext_workspace_handle_v1 *_,
|
||||||
struct wl_array *coordinates) {
|
struct wl_array *coordinates) {
|
||||||
std::vector<uint32_t> coords_vec;
|
std::vector<uint32_t> coords_vec;
|
||||||
auto coords = static_cast<uint32_t *>(coordinates->data);
|
auto coords = static_cast<uint32_t *>(coordinates->data);
|
||||||
for (size_t i = 0; i < coordinates->size / sizeof(uint32_t); ++i) {
|
for (size_t i = 0; i < coordinates->size / sizeof(uint32_t); ++i) {
|
||||||
coords_vec.push_back(coords[i]);
|
coords_vec.push_back(coords[i]);
|
||||||
}
|
}
|
||||||
|
@ -111,7 +112,7 @@ void workspace_handle_coordinates(void *data, struct zext_workspace_handle_v1 *_
|
||||||
void workspace_handle_state(void *data, struct zext_workspace_handle_v1 *workspace_handle,
|
void workspace_handle_state(void *data, struct zext_workspace_handle_v1 *workspace_handle,
|
||||||
struct wl_array *state) {
|
struct wl_array *state) {
|
||||||
std::vector<uint32_t> state_vec;
|
std::vector<uint32_t> state_vec;
|
||||||
auto states = static_cast<uint32_t *>(state->data);
|
auto states = static_cast<uint32_t *>(state->data);
|
||||||
for (size_t i = 0; i < state->size / sizeof(uint32_t); ++i) {
|
for (size_t i = 0; i < state->size / sizeof(uint32_t); ++i) {
|
||||||
state_vec.push_back(states[i]);
|
state_vec.push_back(states[i]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,8 +39,8 @@ waybar::util::Rfkill::Rfkill(const enum rfkill_type rfkill_type) : rfkill_type_(
|
||||||
fd_ = -1;
|
fd_ = -1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Glib::signal_io().connect(
|
Glib::signal_io().connect(sigc::mem_fun(*this, &Rfkill::on_event), fd_,
|
||||||
sigc::mem_fun(*this, &Rfkill::on_event), fd_, Glib::IO_IN | Glib::IO_ERR | Glib::IO_HUP);
|
Glib::IO_IN | Glib::IO_ERR | Glib::IO_HUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
waybar::util::Rfkill::~Rfkill() {
|
waybar::util::Rfkill::~Rfkill() {
|
||||||
|
@ -52,7 +52,7 @@ waybar::util::Rfkill::~Rfkill() {
|
||||||
bool waybar::util::Rfkill::on_event(Glib::IOCondition cond) {
|
bool waybar::util::Rfkill::on_event(Glib::IOCondition cond) {
|
||||||
if (cond & Glib::IO_IN) {
|
if (cond & Glib::IO_IN) {
|
||||||
struct rfkill_event event;
|
struct rfkill_event event;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
len = read(fd_, &event, sizeof(event));
|
len = read(fd_, &event, sizeof(event));
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "util/ustring_clen.hpp"
|
#include "util/ustring_clen.hpp"
|
||||||
|
|
||||||
int ustring_clen(const Glib::ustring &str){
|
int ustring_clen(const Glib::ustring &str) {
|
||||||
int total = 0;
|
int total = 0;
|
||||||
for (auto i = str.begin(); i != str.end(); ++i) {
|
for (auto i = str.begin(); i != str.end(); ++i) {
|
||||||
total += g_unichar_iswide(*i) + 1;
|
total += g_unichar_iswide(*i) + 1;
|
||||||
|
|
|
@ -20,12 +20,12 @@ using remove_cvref_t = typename std::remove_cv<typename std::remove_reference<T>
|
||||||
*/
|
*/
|
||||||
TEST_CASE_METHOD(GlibTestsFixture, "SafeSignal basic functionality", "[signal][thread][util]") {
|
TEST_CASE_METHOD(GlibTestsFixture, "SafeSignal basic functionality", "[signal][thread][util]") {
|
||||||
const int NUM_EVENTS = 100;
|
const int NUM_EVENTS = 100;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int last_value = 0;
|
int last_value = 0;
|
||||||
|
|
||||||
SafeSignal<int, std::string> test_signal;
|
SafeSignal<int, std::string> test_signal;
|
||||||
|
|
||||||
const auto main_tid = std::this_thread::get_id();
|
const auto main_tid = std::this_thread::get_id();
|
||||||
std::thread producer;
|
std::thread producer;
|
||||||
|
|
||||||
// timeout the test in 500ms
|
// timeout the test in 500ms
|
||||||
|
@ -63,7 +63,7 @@ TEST_CASE_METHOD(GlibTestsFixture, "SafeSignal basic functionality", "[signal][t
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct TestObject {
|
struct TestObject {
|
||||||
T value;
|
T value;
|
||||||
unsigned copied = 0;
|
unsigned copied = 0;
|
||||||
unsigned moved = 0;
|
unsigned moved = 0;
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ struct TestObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(T other) const { return value == other; }
|
bool operator==(T other) const { return value == other; }
|
||||||
operator T() const { return value; }
|
operator T() const { return value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -101,7 +101,7 @@ struct TestObject {
|
||||||
*/
|
*/
|
||||||
TEST_CASE_METHOD(GlibTestsFixture, "SafeSignal copy/move counter", "[signal][thread][util]") {
|
TEST_CASE_METHOD(GlibTestsFixture, "SafeSignal copy/move counter", "[signal][thread][util]") {
|
||||||
const int NUM_EVENTS = 3;
|
const int NUM_EVENTS = 3;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
SafeSignal<TestObject<int>> test_signal;
|
SafeSignal<TestObject<int>> test_signal;
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ int main(int argc, char* argv[]) {
|
||||||
Glib::init();
|
Glib::init();
|
||||||
|
|
||||||
session.applyCommandLine(argc, argv);
|
session.applyCommandLine(argc, argv);
|
||||||
const auto logger = spdlog::default_logger();
|
const auto logger = spdlog::default_logger();
|
||||||
const auto& reporter_name = session.config().getReporterName();
|
const auto& reporter_name = session.config().getReporterName();
|
||||||
if (reporter_name == "tap") {
|
if (reporter_name == "tap") {
|
||||||
spdlog::set_pattern("# [%l] %v");
|
spdlog::set_pattern("# [%l] %v");
|
||||||
|
|
Loading…
Reference in New Issue