1 #pragma once
2 
3 #include "common.hpp"
4 #include "components/types.hpp"
5 #include "events/signal_emitter.hpp"
6 #include "events/signal_fwd.hpp"
7 #include "x11/extensions/randr.hpp"
8 #include "x11/types.hpp"
9 #include "x11/window.hpp"
10 
11 POLYBAR_NS
12 
13 // fwd
14 class config;
15 class logger;
16 class connection;
17 class signal_emitter;
18 
19 class screen : public xpp::event::sink<evt::randr_screen_change_notify> {
20  public:
21   using make_type = unique_ptr<screen>;
22   static make_type make();
23 
24   explicit screen(connection& conn, signal_emitter& emitter, const logger& logger, const config& conf);
25   ~screen();
26 
size() const27   struct size size() const {
28     return m_size;
29   }
30 
root() const31   xcb_window_t root() const {
32     return m_root;
33   }
34 
35  protected:
36   void handle(const evt::randr_screen_change_notify& evt);
37 
38  private:
39   connection& m_connection;
40   signal_emitter& m_sig;
41   const logger& m_log;
42   const config& m_conf;
43 
44   xcb_window_t m_root;
45   xcb_window_t m_proxy{XCB_NONE};
46 
47   vector<monitor_t> m_monitors;
48   struct size m_size {0U, 0U};
49   bool m_sigraised{false};
50 
51   bool have_monitors_changed() const;
52 };
53 
54 POLYBAR_NS_END
55