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

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

unix.superglobalmegacorp.com

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