1 #pragma once
2 
3 #include <fmt/format.h>
4 #include <gdk/gdk.h>
5 #include <gdk/gdkwayland.h>
6 #include <wayland-client.h>
7 
8 #include "bar.hpp"
9 #include "config.hpp"
10 
11 struct zwlr_layer_shell_v1;
12 struct zwp_idle_inhibitor_v1;
13 struct zwp_idle_inhibit_manager_v1;
14 
15 namespace waybar {
16 
17 class Client {
18  public:
19   static Client *inst();
20   int            main(int argc, char *argv[]);
21   void           reset();
22 
23   Glib::RefPtr<Gtk::Application>      gtk_app;
24   Glib::RefPtr<Gdk::Display>          gdk_display;
25   struct wl_display *                 wl_display = nullptr;
26   struct wl_registry *                registry = nullptr;
27   struct zwlr_layer_shell_v1 *        layer_shell = nullptr;
28   struct zxdg_output_manager_v1 *     xdg_output_manager = nullptr;
29   struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = nullptr;
30   std::vector<std::unique_ptr<Bar>>   bars;
31   Config                              config;
32   std::string                         bar_id;
33 
34  private:
35   Client() = default;
36   const std::string        getStyle(const std::string &style);
37   void                     bindInterfaces();
38   void                     handleOutput(struct waybar_output &output);
39   auto                     setupCss(const std::string &css_file) -> void;
40   struct waybar_output &   getOutput(void *);
41   std::vector<Json::Value> getOutputConfigs(struct waybar_output &output);
42 
43   static void handleGlobal(void *data, struct wl_registry *registry, uint32_t name,
44                            const char *interface, uint32_t version);
45   static void handleGlobalRemove(void *data, struct wl_registry *registry, uint32_t name);
46   static void handleOutputDone(void *, struct zxdg_output_v1 *);
47   static void handleOutputName(void *, struct zxdg_output_v1 *, const char *);
48   static void handleOutputDescription(void *, struct zxdg_output_v1 *, const char *);
49   void        handleMonitorAdded(Glib::RefPtr<Gdk::Monitor> monitor);
50   void        handleMonitorRemoved(Glib::RefPtr<Gdk::Monitor> monitor);
51   void        handleDeferredMonitorRemoval(Glib::RefPtr<Gdk::Monitor> monitor);
52 
53   Glib::RefPtr<Gtk::StyleContext> style_context_;
54   Glib::RefPtr<Gtk::CssProvider>  css_provider_;
55   std::list<struct waybar_output> outputs_;
56 };
57 
58 }  // namespace waybar
59