Annotation of nono/wx/wxuimessage.cpp, revision 1.1.1.3

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.