Added cffi/* module for third-party advanced modules

This commit is contained in:
Crom (Thibaut CHARLES)
2023-10-16 22:13:51 +02:00
parent 6ae354f564
commit 088ca6b963
14 changed files with 334 additions and 143 deletions

View File

@ -91,7 +91,7 @@
#include "modules/cava.hpp"
#endif
#include "bar.hpp"
#include "modules/cabi.hpp"
#include "modules/cffi.hpp"
#include "modules/custom.hpp"
#include "modules/image.hpp"
#include "modules/temperature.hpp"

View File

@ -1,28 +0,0 @@
#pragma once
#include <fmt/format.h>
#include <csignal>
#include <string>
#include "AModule.hpp"
#include "util/command.hpp"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
class CABI : public AModule {
public:
CABI(const std::string&, const std::string&, const Json::Value&);
virtual ~CABI();
private:
void* cabi_instance_ = nullptr;
std::function<void*(GtkContainer*)> wbcabi_init_ = nullptr;
std::function<void(void*)> wbcabi_deinit_ = [](void*) {};
std::function<const char*(void*)> wbcabi_last_error_str_ = [](void*) { return nullptr; };
};
} // namespace waybar::modules

50
include/modules/cffi.hpp Normal file
View File

@ -0,0 +1,50 @@
#pragma once
#include <string>
#include "AModule.hpp"
#include "util/command.hpp"
#include "util/json.hpp"
#include "util/sleeper_thread.hpp"
namespace waybar::modules {
extern "C" {
// C ABI representation of a config key/value pair
struct wbcffi_config_entry {
const char* key;
const char* value;
};
}
class CFFI : public AModule {
public:
CFFI(const std::string&, const std::string&, const Json::Value&);
virtual ~CFFI();
// virtual auto update() -> void override;
// virtual operator Gtk::Widget&() override;
virtual auto refresh(int signal) -> void override;
virtual auto doAction(const std::string& name) -> void override;
private:
///
void* cffi_instance_ = nullptr;
typedef void*(InitFn)(GtkContainer*, const struct wbcffi_config_entry* config_entries,
size_t config_entries_len);
typedef void(DenitFn)(void* instance);
typedef void(RefreshFn)(void* instance, int signal);
typedef void(DoActionFn)(void* instance, const char* name);
// FFI hooks
struct {
std::function<InitFn> init = nullptr;
std::function<DenitFn> deinit = nullptr;
std::function<RefreshFn> refresh = [](void*, int) {};
std::function<DoActionFn> doAction = [](void*, const char*) {};
} hooks_;
};
} // namespace waybar::modules