|
|
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*/
17: std::array<wxEvtHandler *, UIMessage::ID_MAX> WXUIMessage::dest_table;
18:
19: // UIMessage を wxWidgets のイベントハンドラに接続する
20: /*static*/ void
21: WXUIMessage::Connect(UIMessage::ID id, wxEvtHandler *dest,
22: wxObjectEventFunction function)
23: {
24: dest->Connect(id, NONO_EVT_UIMESSAGE, function);
25: dest_table[id] = dest;
26: }
27:
28: // イベントハンドラの接続を解除する
29: /*static*/ void
30: WXUIMessage::Disconnect(UIMessage::ID id, wxObjectEventFunction function)
31: {
32: wxEvtHandler *dest = dest_table[id];
33: if (dest) {
34: dest->Disconnect(NONO_EVT_UIMESSAGE, function);
35: dest_table[id] = NULL;
36: }
37: }
38:
39: // UIMessage を処理する
40: /*static*/ void
41: WXUIMessage::Process(UIMessage::Queue& queue)
42: {
43: UIMessage m;
44:
45: while (queue.Dequeue(&m)) {
46: UIMessage::ID id = m.GetID();
47: if (id < 0 || id >= UIMessage::ID_MAX) {
48: PANIC("Invalid UIMessage %d", id);
49: }
50: auto dest = dest_table[id];
51: if (dest) {
52: wxCommandEvent ev(NONO_EVT_UIMESSAGE, id);
53: ev.SetInt(m.GetArg());
54: wxPostEvent(dest, ev);
55: }
56: }
57: }
1.1.1.2 ! root 58:
! 59: // すべてのハンドラが解除されているかチェックする (開発用)
! 60: /*static*/ void
! 61: WXUIMessage::AssertAllDisconnected()
! 62: {
! 63: for (int i = 0; i < dest_table.size(); i++) {
! 64: if (dest_table[i] != NULL) {
! 65: warnx("UIMessage ID=%d not disconnected", i);
! 66: }
! 67: }
! 68: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.