--- nono/cli/cuimessage.cpp 2026/04/29 17:05:27 1.1.1.3 +++ nono/cli/cuimessage.cpp 2026/04/29 17:05:49 1.1.1.4 @@ -12,18 +12,9 @@ #include "cuimessage.h" #include "kevent.h" -std::array CUIMessage::func_table; - /*static*/ autofd CUIMessage::wpipe; /*static*/ autofd CUIMessage::rpipe; -// UIMessage を func に接続する -/*static*/ void -CUIMessage::Connect(UIMessage::ID id, CUIMessage::Func func) -{ - func_table[id] = func; -} - // CUIMessage の初期化。パイプを用意して kqueue ディスクリプタを返す。 int CUIMessage::Init() @@ -55,39 +46,27 @@ CUIMessage::Init() return kq; } -// UIMessage を処理する +// UIMessage::Post() で呼ばれるコールバック関数。 /*static*/ void -CUIMessage::Process(UIMessage::Queue& queue) +CUIMessage::Process(uint id, int arg) { - UIMessage m; - - while (queue.Dequeue(&m)) { - UIMessage::ID id = m.GetID(); - - if (id >= UIMessage::ID_MAX) { - PANIC("Invalid UIMessage %u", id); - } - - // パイプで通知。クラス(構造体)をそのまま書き込む。 - int r; - r = write(wpipe, &m, sizeof(m)); - if (r < 0) { - warn("CUIMessage::Process: write"); - continue; - } - if (r < sizeof(m)) { - warnx("CUIMessage::Process: write: too short"); - continue; - } + if (id >= UIMessage::ID_MAX) { + PANIC("Invalid UIMessage %u", (uint)id); } -} -// UIMessage をディスパッチする (メインスレッドで呼ばれる) -/*static*/ void -CUIMessage::Dispatch(const UIMessage& m) -{ - auto func = func_table[m.GetID()]; - if (func) { - func(m); + union64 m; + m.h = id; + m.l = arg; + + // パイプで通知。 + int r; + r = write(wpipe, &m, sizeof(m)); + if (r < 0) { + warn("CUIMessage::Process: write"); + return; + } + if (r < sizeof(m)) { + warnx("CUIMessage::Process: write: too short"); + return; } }