1 #pragma once
2 
3 #include "common.hpp"
4 #include "components/ipc.hpp"
5 #include "components/parser.hpp"
6 #include "components/types.hpp"
7 #include "utils/functional.hpp"
8 
9 POLYBAR_NS
10 
11 namespace signals {
12   namespace detail {
13     class signal {
14      public:
15       explicit signal() = default;
~signal()16       virtual ~signal() {}
17       virtual size_t size() const = 0;
18     };
19 
20     template <typename Derived>
21     class base_signal : public signal {
22      public:
23       using base_type = base_signal<Derived>;
24 
25       explicit base_signal() = default;
~base_signal()26       virtual ~base_signal() {}
27 
size() const28       virtual size_t size() const override {
29         return sizeof(Derived);
30       };
31     };
32 
33     template <typename Derived, typename ValueType>
34     class value_signal : public base_signal<Derived> {
35      public:
36       using base_type = value_signal<Derived, ValueType>;
37 
value_signal(void * data)38       explicit value_signal(void* data) : m_ptr(data) {}
value_signal(ValueType && data)39       explicit value_signal(ValueType&& data) : m_ptr(&data) {}
40 
~value_signal()41       virtual ~value_signal() {}
42 
cast() const43       inline ValueType cast() const {
44         return *static_cast<ValueType*>(m_ptr);
45       }
46 
47      private:
48       void* m_ptr;
49     };
50   }  // namespace detail
51 
52   namespace eventqueue {
53     struct start : public detail::base_signal<start> {
54       using base_type::base_type;
55     };
56     struct exit_terminate : public detail::base_signal<exit_terminate> {
57       using base_type::base_type;
58     };
59     struct exit_reload : public detail::base_signal<exit_reload> {
60       using base_type::base_type;
61     };
62     struct notify_change : public detail::base_signal<notify_change> {
63       using base_type::base_type;
64     };
65     struct notify_forcechange : public detail::base_signal<notify_forcechange> {
66       using base_type::base_type;
67     };
68     struct check_state : public detail::base_signal<check_state> {
69       using base_type::base_type;
70     };
71   }  // namespace eventqueue
72 
73   namespace ipc {
74     struct command : public detail::value_signal<command, string> {
75       using base_type::base_type;
76     };
77     struct hook : public detail::value_signal<hook, string> {
78       using base_type::base_type;
79     };
80     struct action : public detail::value_signal<action, string> {
81       using base_type::base_type;
82     };
83   }  // namespace ipc
84 
85   namespace ui {
86     struct ready : public detail::base_signal<ready> {
87       using base_type::base_type;
88     };
89     struct changed : public detail::base_signal<changed> {
90       using base_type::base_type;
91     };
92     struct tick : public detail::base_signal<tick> {
93       using base_type::base_type;
94     };
95     struct button_press : public detail::value_signal<button_press, string> {
96       using base_type::base_type;
97     };
98     struct cursor_change : public detail::value_signal<cursor_change, string> {
99       using base_type::base_type;
100     };
101     struct visibility_change : public detail::value_signal<visibility_change, bool> {
102       using base_type::base_type;
103     };
104     struct dim_window : public detail::value_signal<dim_window, double> {
105       using base_type::base_type;
106     };
107     struct shade_window : public detail::base_signal<shade_window> {
108       using base_type::base_type;
109     };
110     struct unshade_window : public detail::base_signal<unshade_window> {
111       using base_type::base_type;
112     };
113     struct request_snapshot : public detail::value_signal<request_snapshot, string> {
114       using base_type::base_type;
115     };
116     /// emitted whenever the desktop background slice changes
117     struct update_background : public detail::base_signal<update_background> {
118       using base_type::base_type;
119     };
120     /// emitted when the bar geometry changes (such as position of the bar on the screen)
121     struct update_geometry : public detail::base_signal<update_geometry> {
122       using base_type::base_type;
123     };
124   }  // namespace ui
125 
126   namespace ui_tray {
127     struct mapped_clients : public detail::value_signal<mapped_clients, unsigned int> {
128       using base_type::base_type;
129     };
130   }  // namespace ui_tray
131 
132   namespace parser {
133     struct change_background : public detail::value_signal<change_background, rgba> {
134       using base_type::base_type;
135     };
136     struct change_foreground : public detail::value_signal<change_foreground, rgba> {
137       using base_type::base_type;
138     };
139     struct change_underline : public detail::value_signal<change_underline, rgba> {
140       using base_type::base_type;
141     };
142     struct change_overline : public detail::value_signal<change_overline, rgba> {
143       using base_type::base_type;
144     };
145     struct change_font : public detail::value_signal<change_font, int> {
146       using base_type::base_type;
147     };
148     struct change_alignment : public detail::value_signal<change_alignment, alignment> {
149       using base_type::base_type;
150     };
151     struct reverse_colors : public detail::base_signal<reverse_colors> {
152       using base_type::base_type;
153     };
154     struct offset_pixel : public detail::value_signal<offset_pixel, int> {
155       using base_type::base_type;
156     };
157     struct attribute_set : public detail::value_signal<attribute_set, attribute> {
158       using base_type::base_type;
159     };
160     struct attribute_unset : public detail::value_signal<attribute_unset, attribute> {
161       using base_type::base_type;
162     };
163     struct attribute_toggle : public detail::value_signal<attribute_toggle, attribute> {
164       using base_type::base_type;
165     };
166     struct action_begin : public detail::value_signal<action_begin, action> {
167       using base_type::base_type;
168     };
169     struct action_end : public detail::value_signal<action_end, mousebtn> {
170       using base_type::base_type;
171     };
172     struct text : public detail::value_signal<text, string> {
173       using base_type::base_type;
174     };
175     struct control : public detail::value_signal<control, controltag> {
176       using base_type::base_type;
177     };
178   }  // namespace parser
179 }  // namespace signals
180 
181 POLYBAR_NS_END
182