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