Skip to content

Commit

Permalink
add event_js.cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
eagleoflqj committed Oct 22, 2024
1 parent c19088c commit 9152634
Showing 1 changed file with 134 additions and 0 deletions.
134 changes: 134 additions & 0 deletions src/lib/fcitx-utils/event_js.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
#include <emscripten.h>
#include "event.h"

namespace fcitx {

template <typename Interface>
struct JSEventSourceBase : public Interface {
public:
~JSEventSourceBase() override {}

bool isEnabled() const override { return enabled_; }

void setEnabled(bool enabled) override { enabled_ = enabled; }

bool isOneShot() const override { return oneShot_; }

void setOneShot() override { oneShot_ = true; }

private:
bool enabled_ = false;
bool oneShot_ = false;
};

struct JSEventSource : public JSEventSourceBase<EventSource> {
JSEventSource(EventCallback _callback)
: callback_(std::make_shared<EventCallback>(std::move(_callback))) {}

std::shared_ptr<EventCallback> callback_;
};

struct JSEventSourceIO : public JSEventSourceBase<EventSourceIO> {
JSEventSourceIO(IOCallback _callback) {}

int fd() const override { return 0; }

void setFd(int fd) override {}

IOEventFlags events() const override { return IOEventFlag::In; }

void setEvents(IOEventFlags flags) override {}

IOEventFlags revents() const override { return IOEventFlag::In; }
};

void TimeEventCallback(void *arg);

struct JSEventSourceTime : public JSEventSourceBase<EventSourceTime> {
JSEventSourceTime(TimeCallback _callback, uint64_t time, clockid_t clockid)
: callback_(std::make_shared<TimeCallback>(std::move(_callback))),
time_(time), clockid_(clockid) {
setOneShot();
}

void setOneShot() override {
int t = std::max<int64_t>(0, time_ - now(CLOCK_MONOTONIC)) / 1000;
emscripten_async_call(TimeEventCallback, this, t);
}

uint64_t time() const override { return time_; }

void setTime(uint64_t time) override { time_ = time; }

uint64_t accuracy() const override { return 0; }

void setAccuracy(uint64_t time) override {}

clockid_t clock() const override { return clockid_; }

std::shared_ptr<TimeCallback> callback_;

private:
uint64_t time_;
clockid_t clockid_;
};

void TimeEventCallback(void *arg) {
auto source = static_cast<JSEventSourceTime *>(arg);
(*source->callback_)(source, source->time());
}

class EventLoopPrivate {
public:
EventLoopPrivate() {}

~EventLoopPrivate() {}
};

EventLoop::EventLoop() : d_ptr(std::make_unique<EventLoopPrivate>()) {}

EventLoop::~EventLoop() = default;

const char *EventLoop::impl() { return "js-event"; }

void *EventLoop::nativeHandle() { return nullptr; }

bool EventLoop::exec() { return true; }

void EventLoop::exit() {}

std::unique_ptr<EventSourceIO> EventLoop::addIOEvent(int fd, IOEventFlags flags,
IOCallback callback) {
auto source = std::make_unique<JSEventSourceIO>(std::move(callback));
return source;
}

std::unique_ptr<EventSourceTime>
EventLoop::addTimeEvent(clockid_t clock, uint64_t usec, uint64_t accuracy,
TimeCallback callback) {
auto source =
std::make_unique<JSEventSourceTime>(std::move(callback), usec, clock);
return source;
}

std::unique_ptr<EventSource> EventLoop::addExitEvent(EventCallback callback) {
auto source = std::make_unique<JSEventSource>(std::move(callback));
return source;
}

std::unique_ptr<EventSource> EventLoop::addDeferEvent(EventCallback callback) {
return addTimeEvent(
CLOCK_MONOTONIC, now(CLOCK_MONOTONIC), 0,
[callback = std::move(callback)](EventSourceTime *source, uint64_t) {
return callback(source);
});
}

std::unique_ptr<EventSource> EventLoop::addPostEvent(EventCallback callback) {
return addTimeEvent(
CLOCK_MONOTONIC, now(CLOCK_MONOTONIC), 0,
[callback = std::move(callback)](EventSourceTime *source, uint64_t) {
return callback(source);
});
}
} // namespace fcitx

0 comments on commit 9152634

Please sign in to comment.