polybar-dwm/include/components/eventloop.hpp

141 lines
3.0 KiB
C++
Raw Normal View History

#pragma once
#include <moodycamel/blockingconcurrentqueue.h>
2016-11-20 22:04:31 +00:00
#include <chrono>
2016-12-09 08:02:47 +00:00
#include <condition_variable>
#include <mutex>
#include <thread>
#include "common.hpp"
#include "events/signal_emitter.hpp"
#include "events/signal_fwd.hpp"
#include "events/signal_receiver.hpp"
2016-12-09 08:02:47 +00:00
#include "utils/concurrency.hpp"
2016-11-19 05:22:44 +00:00
POLYBAR_NS
2016-12-09 08:02:47 +00:00
// fwd
namespace modules {
struct module_interface;
}
enum class alignment : uint8_t;
class config;
class logger;
using namespace signals::eventloop;
using module_t = unique_ptr<modules::module_interface>;
2016-12-09 08:02:47 +00:00
using modulemap_t = std::map<alignment, vector<module_t>>;
2016-12-14 04:42:46 +00:00
namespace chrono = std::chrono;
2016-12-09 08:02:47 +00:00
using namespace std::chrono_literals;
class eventloop : public signal_receiver<SIGN_PRIORITY_EVENTLOOP, process_quit, process_input, process_check,
enqueue_event, enqueue_quit, enqueue_update, enqueue_input, enqueue_check> {
public:
enum class event_type : uint8_t {
NONE = 0,
UPDATE,
CHECK,
INPUT,
QUIT,
};
struct event {
uint8_t type{static_cast<uint8_t>(event_type::NONE)};
bool flag{false};
};
template <typename EventType>
using queue_t = moodycamel::BlockingConcurrentQueue<EventType>;
public:
2016-12-09 08:40:46 +00:00
using make_type = unique_ptr<eventloop>;
static make_type make();
2016-12-09 08:02:47 +00:00
explicit eventloop(signal_emitter& emitter, const logger& logger, const config& config);
2016-12-01 07:41:49 +00:00
~eventloop();
void start();
2016-11-02 19:22:45 +00:00
void stop();
bool enqueue(event&& evt);
2016-12-14 04:42:46 +00:00
bool enqueue(string&& evt);
2016-11-02 19:22:45 +00:00
void add_module(const alignment pos, module_t&& module);
const modulemap_t& modules() const;
size_t module_count() const;
2016-12-09 08:02:47 +00:00
static event make_quit_evt(bool reload = false);
static event make_update_evt(bool force = false);
static event make_input_evt();
static event make_check_evt();
2016-12-03 21:54:58 +00:00
protected:
void dispatch_modules();
2016-12-14 04:42:46 +00:00
void handle_inputdata();
bool on(const process_input& evt);
bool on(const process_check& evt);
bool on(const process_quit& evt);
bool on(const enqueue_event& evt);
bool on(const enqueue_quit& evt);
bool on(const enqueue_update& evt);
bool on(const enqueue_input& evt);
bool on(const enqueue_check& evt);
private:
signal_emitter& m_sig;
const logger& m_log;
const config& m_conf;
/**
* @brief Event queue
*/
queue_t<event> m_queue;
/**
* @brief Loaded modules
*/
modulemap_t m_modules;
/**
* @brief Flag to indicate current run state
*/
stateflag m_running;
/**
* @brief Time to wait for subsequent events
*/
2016-12-14 04:42:46 +00:00
chrono::milliseconds m_swallow_update{10ms};
/**
* @brief Maximum amount of subsequent events to swallow within timeframe
*/
2016-12-14 04:42:46 +00:00
size_t m_swallow_limit{5U};
/**
* @brief Time to throttle input events
*/
chrono::milliseconds m_swallow_input{30ms};
2016-12-14 04:42:46 +00:00
/**
2016-12-14 18:04:33 +00:00
* @brief Time of last handled input event
2016-12-14 04:42:46 +00:00
*/
2016-12-14 18:04:33 +00:00
chrono::time_point<chrono::system_clock, chrono::milliseconds> m_lastinput;
2016-12-14 04:42:46 +00:00
/**
2016-12-14 18:04:33 +00:00
* @brief Mutex used to guard input data
2016-12-14 04:42:46 +00:00
*/
2016-12-14 18:04:33 +00:00
std::mutex m_inputlock;
2016-12-14 04:42:46 +00:00
/**
* @brief Input data
*/
string m_inputdata;
};
2016-11-19 05:22:44 +00:00
POLYBAR_NS_END