polybar-dwm/include/events/signal.hpp
patrick96 96239597ed Move most action state out of renderer
The renderer now only stores the positions of the actions because that
is specific to the renderer and because the actual position can only be
finalized after all the rendering is done because intitially the
positions are relative to the alignment and not the bar.
2021-02-12 20:01:22 +01:00

141 lines
4.2 KiB
C++

#pragma once
#include "common.hpp"
#include "components/ipc.hpp"
#include "components/types.hpp"
#include "tags/dispatch.hpp"
#include "tags/types.hpp"
#include "utils/functional.hpp"
POLYBAR_NS
namespace signals {
namespace detail {
class signal {
public:
explicit signal() = default;
virtual ~signal() {}
virtual size_t size() const = 0;
};
template <typename Derived>
class base_signal : public signal {
public:
using base_type = base_signal<Derived>;
explicit base_signal() = default;
virtual ~base_signal() {}
virtual size_t size() const override {
return sizeof(Derived);
};
};
template <typename Derived, typename ValueType>
class value_signal : public base_signal<Derived> {
public:
using base_type = value_signal<Derived, ValueType>;
explicit value_signal(void* data) : m_ptr(data) {}
explicit value_signal(ValueType&& data) : m_ptr(&data) {}
explicit value_signal(ValueType& data) : m_ptr(&data) {}
virtual ~value_signal() {}
inline ValueType cast() const {
return *static_cast<ValueType*>(m_ptr);
}
private:
void* m_ptr;
};
} // namespace detail
namespace eventqueue {
struct start : public detail::base_signal<start> {
using base_type::base_type;
};
struct exit_terminate : public detail::base_signal<exit_terminate> {
using base_type::base_type;
};
struct exit_reload : public detail::base_signal<exit_reload> {
using base_type::base_type;
};
struct notify_change : public detail::base_signal<notify_change> {
using base_type::base_type;
};
struct notify_forcechange : public detail::base_signal<notify_forcechange> {
using base_type::base_type;
};
struct check_state : public detail::base_signal<check_state> {
using base_type::base_type;
};
} // namespace eventqueue
namespace ipc {
struct command : public detail::value_signal<command, string> {
using base_type::base_type;
};
struct hook : public detail::value_signal<hook, string> {
using base_type::base_type;
};
struct action : public detail::value_signal<action, string> {
using base_type::base_type;
};
} // namespace ipc
namespace ui {
struct ready : public detail::base_signal<ready> {
using base_type::base_type;
};
struct changed : public detail::base_signal<changed> {
using base_type::base_type;
};
struct tick : public detail::base_signal<tick> {
using base_type::base_type;
};
struct button_press : public detail::value_signal<button_press, string> {
using base_type::base_type;
};
struct cursor_change : public detail::value_signal<cursor_change, string> {
using base_type::base_type;
};
struct visibility_change : public detail::value_signal<visibility_change, bool> {
using base_type::base_type;
};
struct dim_window : public detail::value_signal<dim_window, double> {
using base_type::base_type;
};
struct shade_window : public detail::base_signal<shade_window> {
using base_type::base_type;
};
struct unshade_window : public detail::base_signal<unshade_window> {
using base_type::base_type;
};
struct request_snapshot : public detail::value_signal<request_snapshot, string> {
using base_type::base_type;
};
/// emitted whenever the desktop background slice changes
struct update_background : public detail::base_signal<update_background> {
using base_type::base_type;
};
/// emitted when the bar geometry changes (such as position of the bar on the screen)
struct update_geometry : public detail::base_signal<update_geometry> {
using base_type::base_type;
};
} // namespace ui
namespace ui_tray {
struct mapped_clients : public detail::value_signal<mapped_clients, unsigned int> {
using base_type::base_type;
};
} // namespace ui_tray
namespace parser {
struct change_alignment : public detail::value_signal<change_alignment, alignment> {
using base_type::base_type;
};
} // namespace parser
} // namespace signals
POLYBAR_NS_END