|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2021 nono project
4: // Licensed under nono-license.txt
5: //
6:
1.1.1.2 root 7: //
8: // UI スレッドへのメッセージ機構 (GUI 側)
9: //
10:
1.1 root 11: #include "wxuimessage.h"
12:
13: // イベントタイプの定義
14: wxDEFINE_EVENT(NONO_EVT_UIMESSAGE, wxCommandEvent);
15:
16: /*static*/
1.1.1.3 ! root 17: std::array<std::vector<wxEvtHandler *>, UIMessage::ID_MAX>
! 18: WXUIMessage::dest_table;
1.1 root 19:
20: // UIMessage を wxWidgets のイベントハンドラに接続する
21: /*static*/ void
22: WXUIMessage::Connect(UIMessage::ID id, wxEvtHandler *dest,
23: wxObjectEventFunction function)
24: {
25: dest->Connect(id, NONO_EVT_UIMESSAGE, function);
1.1.1.3 ! root 26: dest_table[id].push_back(dest);
1.1 root 27: }
28:
29: // イベントハンドラの接続を解除する
30: /*static*/ void
1.1.1.3 ! root 31: WXUIMessage::Disconnect(UIMessage::ID id, wxEvtHandler *dest,
! 32: wxObjectEventFunction function)
1.1 root 33: {
1.1.1.3 ! root 34: dest->Disconnect(NONO_EVT_UIMESSAGE, function);
! 35: for (auto it = dest_table[id].begin(); it != dest_table[id].end(); ++it) {
! 36: if (*it == dest) {
! 37: dest_table[id].erase(it);
! 38: break;
! 39: }
1.1 root 40: }
41: }
42:
43: // UIMessage を処理する
44: /*static*/ void
45: WXUIMessage::Process(UIMessage::Queue& queue)
46: {
47: UIMessage m;
48:
49: while (queue.Dequeue(&m)) {
50: UIMessage::ID id = m.GetID();
51: if (id < 0 || id >= UIMessage::ID_MAX) {
52: PANIC("Invalid UIMessage %d", id);
53: }
1.1.1.3 ! root 54: for (auto dest : dest_table[id]) {
1.1 root 55: wxCommandEvent ev(NONO_EVT_UIMESSAGE, id);
56: ev.SetInt(m.GetArg());
57: wxPostEvent(dest, ev);
58: }
59: }
60: }
1.1.1.2 root 61:
62: // すべてのハンドラが解除されているかチェックする (開発用)
63: /*static*/ void
64: WXUIMessage::AssertAllDisconnected()
65: {
66: for (int i = 0; i < dest_table.size(); i++) {
1.1.1.3 ! root 67: if (dest_table[i].empty() == false) {
1.1.1.2 root 68: warnx("UIMessage ID=%d not disconnected", i);
69: }
70: }
71: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.