Annotation of nono/wx/wxsoftkey.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2019 [email protected]
        !             4: //
        !             5: 
        !             6: #include "wxheader.h"
        !             7: #include "wxcolor.h"
        !             8: #include "wxsoftkey.h"
        !             9: #include "wxtextscreen.h"
        !            10: 
        !            11: //
        !            12: // LUNA ソフトウェアキーボード (パネル)
        !            13: //
        !            14: 
        !            15: // イベントテーブル
        !            16: wxBEGIN_EVENT_TABLE(WXLunaSoftKeyPanel, inherited)
        !            17:        EVT_LEFT_DOWN(WXLunaSoftKeyPanel::OnLeftDown)
        !            18:        EVT_LEFT_UP(WXLunaSoftKeyPanel::OnLeftUp)
        !            19:        EVT_LEFT_DCLICK(WXLunaSoftKeyPanel::OnLeftDClick)
        !            20:        EVT_RIGHT_DOWN(WXLunaSoftKeyPanel::OnRightDown)
        !            21:        EVT_PAINT(WXLunaSoftKeyPanel::OnPaint)
        !            22:        EVT_SIZE(WXLunaSoftKeyPanel::OnSize)
        !            23: wxEND_EVENT_TABLE()
        !            24: 
        !            25: // コンストラクタ
        !            26: WXLunaSoftKeyPanel::WXLunaSoftKeyPanel(wxWindow *parent)
        !            27:        : inherited(parent)
        !            28: {
        !            29:        // LUNA では
        !            30:        // BS キーの左隣 (0x5c) は円記号ではなくバックスラッシュ。
        !            31:        // それを SHIFT したやつ(0x7c) は破線でないパイプ。
        !            32:        // そのもう一つ左隣 (0x7e) はオーバーラインではなくチルダ。
        !            33:        SetGlyph5C(true);
        !            34:        SetGlyph7E(true);
        !            35: 
        !            36:        DoSize();
        !            37: }
        !            38: 
        !            39: // デストラクタ
        !            40: WXLunaSoftKeyPanel::~WXLunaSoftKeyPanel()
        !            41: {
        !            42: }
        !            43: 
        !            44: // フォントサイズ変更 (外部インタフェース)
        !            45: void
        !            46: WXLunaSoftKeyPanel::SetFontSize(fontsize_t new_fontsize)
        !            47: {
        !            48:        // 同じなら何もしない
        !            49:        if (fontsize == new_fontsize) {
        !            50:                return;
        !            51:        }
        !            52: 
        !            53:        // フォントを更新
        !            54:        UpdateFont(new_fontsize);
        !            55: 
        !            56:        // サイズ変更処理
        !            57:        DoSize();
        !            58: }
        !            59: 
        !            60: // サイズ変更処理
        !            61: // サイズを変更したい時に呼ぶ (サイズが変更されたらではない)。
        !            62: // ここではサイズは fontsize にのみ依存しているので、フォントサイズが
        !            63: // 変化/確定した時に呼び出すこと。
        !            64: void
        !            65: WXLunaSoftKeyPanel::DoSize()
        !            66: {
        !            67:        assert(fontsize != FONT_NONE);
        !            68: 
        !            69:        // このパネル内の描画の基本単位
        !            70:        unit = font_height / 4;
        !            71: 
        !            72:        // エンターキーだけ矩形でないのでここでリージョンを計算。
        !            73:        // unit が確定したところで一回行う。
        !            74:        //
        !            75:        // |   ^   |   \   |   BS  |
        !            76:        // |       |       |       |
        !            77:        // +---+---+--(A)--+------(B)
        !            78:        //     |       |           |
        !            79:        //     |   [   |           |
        !            80:        //     |       |    Enter  |
        !            81:        // +---+---+--(F)-(E)      |
        !            82:        // |       |       |       |
        !            83:        // |   :   |   ]   |       |
        !            84:        // |       |       |       |
        !            85:        // +---+---+------(D)-----(C)
        !            86:        //     |                   |
        !            87:        //     |      SHIFT        |
        !            88:        const keydata_t& keybs = FindKeydata(KC_BS);
        !            89:        const keydata_t& keyleft = FindKeydata(KC_bracketleft);
        !            90:        const keydata_t& keyright = FindKeydata(KC_bracketright);
        !            91:        const keydata_t& keyshift = FindKeydata(KC_SHIFT_R);
        !            92:        // 各点のピクセル座標
        !            93:        enter_points = {
        !            94:                { keyleft.right() * unit, keyleft.y * unit },   // A
        !            95:                { keybs.right() * unit, keyleft.y * unit },             // B
        !            96:                { keyshift.right() * unit, keyshift.y * unit }, // C
        !            97:                { keyright.right() * unit, keyshift.y * unit }, // D
        !            98:                { keyright.right() * unit, keyright.y * unit }, // E
        !            99:                { keyleft.right() * unit, keyright.y * unit },  // F
        !           100:        };
        !           101:        // 当たり判定用のリージョン
        !           102:        enter_region = wxRegion(enter_points.size(), enter_points.data());
        !           103: 
        !           104:        // コントロールの大きさを変更
        !           105:        wxSize size(228 * unit, 54 * unit);
        !           106:        SetClientSize(size);
        !           107:        SetMinSize(size);
        !           108: }
        !           109: 
        !           110: // サイズ変更イベント
        !           111: void
        !           112: WXLunaSoftKeyPanel::OnSize(wxSizeEvent& event)
        !           113: {
        !           114:        // Mac ではウィンドウ作成時に 0 以下の値が来ることがある
        !           115:        // GTK では 1 で来ることがある
        !           116:        wxSize size = event.GetSize();
        !           117:        if (size.x <= 1 || size.y <= 1) {
        !           118:                return;
        !           119:        }
        !           120: 
        !           121:        view_width = size.x;
        !           122:        view_height = size.y;
        !           123: 
        !           124:        // ビットマップを持っていれば一旦解放
        !           125:        if (bitmap) {
        !           126:                delete bitmap;
        !           127:                bitmap = NULL;
        !           128:        }
        !           129:        if (image) {
        !           130:                delete image;
        !           131:                image = NULL;
        !           132:        }
        !           133:        if (bmpbuf) {
        !           134:                delete bmpbuf;
        !           135:                bmpbuf = NULL;
        !           136:        }
        !           137: 
        !           138:        // ビットマップ作成
        !           139:        // 正しく描かれなかった時に分かりやすいよう初期値は濃いグレーにしておく
        !           140:        bmpbuf = new uint8 [view_width * view_height * 3];
        !           141:        memset(bmpbuf, 0x70, view_width * view_height * 3);
        !           142:        image = new wxImage(view_width, view_height, bmpbuf, true);
        !           143:        bitmap = new wxBitmap(*image);
        !           144: 
        !           145:        // 再描画を指示
        !           146:        Refresh();
        !           147: }
        !           148: 
        !           149: // 描画イベント (UI スレッドから呼ばれる)
        !           150: void
        !           151: WXLunaSoftKeyPanel::OnPaint(wxPaintEvent& event)
        !           152: {
        !           153:        // メモリ DC に描画
        !           154:        wxMemoryDC memDC;
        !           155:        memDC.SelectObject(*bitmap);
        !           156:        Draw(memDC);
        !           157: 
        !           158:        // 実画面 DC にコピー
        !           159:        wxPaintDC dstDC(this);
        !           160:        dstDC.Blit(0, 0, view_width, view_height, &memDC, 0, 0);
        !           161: }
        !           162: 
        !           163: // 描画本体
        !           164: void
        !           165: WXLunaSoftKeyPanel::Draw(wxDC& dc)
        !           166: {
        !           167:        wxColour fgcolor;                                               // 前景色
        !           168:        wxColour bgcolor;                                               // 背景というかガワの色
        !           169:        wxColour keydown_color = UD_BLUE;               // キーが押された時の色
        !           170: 
        !           171:        if (black_keyboard) {
        !           172:                fgcolor = *wxWHITE;
        !           173:                bgcolor = *wxBLACK;
        !           174:        } else {
        !           175:                fgcolor = *wxBLACK;
        !           176:                bgcolor = GetTextBackColor();
        !           177:        }
        !           178: 
        !           179:        // 新品現物のガワは何色だったんだろう
        !           180:        dc.SetPen(wxPen(bgcolor));
        !           181:        dc.SetBrush(wxBrush(bgcolor));
        !           182:        dc.DrawRectangle(wxPoint(0, 0), GetSize());
        !           183: 
        !           184:        dc.SetPen(fgcolor);
        !           185:        SetTextForeColor(fgcolor);
        !           186:        for (const auto& key : keydata) {
        !           187:                if (hit[key.keycode]) {
        !           188:                        // 押されている
        !           189:                        SetTextBackColor(keydown_color);
        !           190:                        dc.SetBrush(keydown_color);
        !           191:                } else {
        !           192:                        // 押されていない
        !           193:                        const wxColour& keytop = GetTopColor(key);
        !           194:                        SetTextBackColor(keytop);
        !           195:                        dc.SetBrush(wxBrush(keytop));
        !           196:                }
        !           197: 
        !           198:                // エンターキーだけ枠の描き方が違うので別処理
        !           199:                if (__predict_false(key.x < 0)) {
        !           200:                        DrawEnterKey(dc);
        !           201:                } else {
        !           202:                        DrawKey(dc, key);
        !           203:                }
        !           204:        }
        !           205: 
        !           206:        SetTextBackColor(bgcolor);
        !           207:        wxString utfstr("右クリックで長押し");
        !           208:        const char *sjis = (const char *)utfstr.mb_str(conv);
        !           209:        DrawStringSJIS(dc, 190 * unit, 2 * unit, sjis, TA::Disable);
        !           210: }
        !           211: 
        !           212: // 指定のキーを一つ (枠から刻印まで) 描画する。
        !           213: void
        !           214: WXLunaSoftKeyPanel::DrawKey(wxDC& dc, const keydata_t& key)
        !           215: {
        !           216:        // 枠
        !           217:        wxPoint pt(key.x * unit, key.y * unit);
        !           218:        wxSize sz(key.w * unit + 1, key.h * unit + 1);
        !           219:        dc.DrawRectangle(pt, sz);
        !           220: 
        !           221:        // 刻印を選択
        !           222:        const char *disp = key.disp[modifier];
        !           223:        if (disp == NULL) {
        !           224:                disp = key.disp[0];
        !           225:        }
        !           226: 
        !           227:        // Shift_JIS に変換
        !           228:        wxString utfstr(disp, wxConvUTF8);
        !           229:        const char *sjis = (const char *)utfstr.mb_str(conv);
        !           230:        // Shift_JIS での文字数なので半角換算の文字数と一致する。
        !           231:        int sjislen = strlen(sjis);
        !           232: 
        !           233:        // センタリング
        !           234:        int x = key.x + (key.w - sjislen * 2) / 2;
        !           235:        int y = key.y + (key.h - 4) / 2;
        !           236:        // 「CAP」と「KANA」は LED 付き
        !           237:        if (IsLEDKey(key.keycode)) {
        !           238:                bool led = (key.keycode == KC_CAPS)
        !           239:                        ? led_cap
        !           240:                        : led_kana;
        !           241: 
        !           242:                const wxPen oldpen = dc.GetPen();
        !           243:                const wxBrush oldbrush = dc.GetBrush();
        !           244:                if (led) {
        !           245:                        // 点灯時は赤、枠は黒
        !           246:                        dc.SetPen(*wxBLACK);
        !           247:                        dc.SetBrush(UD_RED);
        !           248:                } else {
        !           249:                        // 消灯時は元のキートップの色で、枠は薄めにしたい
        !           250:                        dc.SetPen(GetTextDisableColor());
        !           251:                        dc.SetBrush(GetTopColor(key));
        !           252:                }
        !           253:                dc.DrawRectangle(
        !           254:                        wxPoint(key.x * unit + 2, key.y * unit + 2),
        !           255:                        wxSize(4 * unit - 2, 3 * unit - 2));
        !           256:                dc.SetPen(oldpen);
        !           257:                dc.SetBrush(oldbrush);
        !           258: 
        !           259:                // LED を描くため文字を少し下げる
        !           260:                y += 1;
        !           261:        }
        !           262: 
        !           263:        // 文字を描画
        !           264:        pt = wxPoint(x * unit + 1, y * unit + 1);
        !           265:        if (key.keycode == KC_PAD_enter) {
        !           266:                DrawEnterMark(dc, pt);
        !           267:        } else {
        !           268:                DrawStringSJIS(dc, pt.x, pt.y, sjis);
        !           269:        }
        !           270: }
        !           271: 
        !           272: // エンターキー
        !           273: void
        !           274: WXLunaSoftKeyPanel::DrawEnterKey(wxDC& dc)
        !           275: {
        !           276:        // エンターキーを描画
        !           277:        dc.DrawPolygon(enter_points.size(), enter_points.data());
        !           278: 
        !           279:        // エンター記号を描画
        !           280:        DrawEnterMark(dc, wxPoint(
        !           281:                (enter_points[0].x + enter_points[1].x) / 2 - (4 / 2),
        !           282:                (enter_points[1].y + enter_points[2].y) / 2 - (4 / 2)));
        !           283: }
        !           284: 
        !           285: // 指定の位置にエンター記号を描画する (エンターキー全体の描画ではない)。
        !           286: // メインキーとテンキーの両方で同じ図柄を使う。
        !           287: // 大きさは (3unit, 4unit) なので実質全角1文字分くらい。
        !           288: void
        !           289: WXLunaSoftKeyPanel::DrawEnterMark(wxDC& dc, const wxPoint& basep)
        !           290: {
        !           291:        // エンター記号は幅 3 unit、高さ 4 unit。
        !           292:        //    +0 +1 +2 +3
        !           293:        // +0 .. .. .. 1.
        !           294:        //    .. .. .. 1.
        !           295:        // +1 .. .. .. 1.
        !           296:        //    .. .. .. 1.
        !           297:        // +2 .. 1. .. 1.
        !           298:        //    .1 .. .. 1.
        !           299:        // +3 11 11 11 1.
        !           300:        //    .1 .. .. ..
        !           301:        // +4 .. 1. .. ..
        !           302:        //    .. .. .. ..
        !           303:        static const std::vector<std::pair<int,int>> entermark {
        !           304:                {  3, 0 },
        !           305:                {  3, 3 },      // │
        !           306:                {  0, 3 },      // ─
        !           307:                {  1, 2 },      // /
        !           308:                {  0, 3 },      // (一筆書きなので戻る)
        !           309:                {  1, 4 },      // \
        !           310:        };
        !           311:        for (int i = 1; i < entermark.size(); i++) {
        !           312:                auto start = entermark[i - 1];
        !           313:                auto end   = entermark[i];
        !           314:                wxPoint startp(start.first * unit, start.second * unit);
        !           315:                wxPoint endp(end.first * unit, end.second * unit);
        !           316:                dc.DrawLine(basep + startp, basep + endp);
        !           317:        }
        !           318: }
        !           319: 
        !           320: // キートップの色を返す。
        !           321: const wxColour
        !           322: WXLunaSoftKeyPanel::GetTopColor(const keydata_t& key) const
        !           323: {
        !           324:        // 濃いキートップに UD_GREY は濃すぎるので薄めた色を使う。
        !           325:        // ここは濃淡で見分けを付けたいわけではなくてただのデザインなので。
        !           326:        if (key.coltype == 0) {
        !           327:                // 薄いキートップ
        !           328:                if (black_keyboard) {
        !           329:                        return wxColour(50, 50, 53);
        !           330:                } else {
        !           331:                        return *wxWHITE;
        !           332:                }
        !           333:        } else {
        !           334:                // 濃いキートップ
        !           335:                if (black_keyboard) {
        !           336:                        return *wxBLACK;
        !           337:                } else {
        !           338:                        return wxColour(200, 200, 203);
        !           339:                }
        !           340:        }
        !           341: }
        !           342: 
        !           343: // keycode に対応する keydata を返す
        !           344: const keydata_t&
        !           345: WXLunaSoftKeyPanel::FindKeydata(uint keycode) const
        !           346: {
        !           347:        for (const auto& key : keydata) {
        !           348:                if (key.keycode == keycode) {
        !           349:                        return key;
        !           350:                }
        !           351:        }
        !           352:        // 見付からないはずはない
        !           353:        warnx("keycode %d not found", keycode);
        !           354:        assert(true);
        !           355:        __unreachable();
        !           356: }
        !           357: 
        !           358: // マウス左クリック (Down) イベント
        !           359: void
        !           360: WXLunaSoftKeyPanel::OnLeftDown(wxMouseEvent& event)
        !           361: {
        !           362:        wxPoint pt = event.GetPosition();
        !           363:        uint code = GetKeycodeFromPoint(pt);
        !           364: 
        !           365:        DoLeftDown(code);
        !           366: }
        !           367: 
        !           368: // マウス左クリック (Down) 処理
        !           369: void
        !           370: WXLunaSoftKeyPanel::DoLeftDown(uint code)
        !           371: {
        !           372:        if (code != 0) {
        !           373:                if (hit[code]) {
        !           374:                        // 押下(長押し)中のキーならここで開放
        !           375:                        KeyUp(code);
        !           376:                } else {
        !           377:                        // 押下して、LeftUp のために覚えておく
        !           378:                        KeyDown(code);
        !           379:                        leftdown_keycode = code;
        !           380:                }
        !           381:        }
        !           382: }
        !           383: 
        !           384: // マウス左クリック (Up) イベント
        !           385: void
        !           386: WXLunaSoftKeyPanel::OnLeftUp(wxMouseEvent& event)
        !           387: {
        !           388:        // Up 時は、これが起きた地点のキーコードではなく
        !           389:        // 直近に LeftDown したキーコードをターゲットにする。
        !           390:        uint code = leftdown_keycode;
        !           391: 
        !           392:        DoLeftUp(code);
        !           393: }
        !           394: 
        !           395: // マウス左クリック (Up) 処理
        !           396: void
        !           397: WXLunaSoftKeyPanel::DoLeftUp(uint code)
        !           398: {
        !           399:        if (code != 0) {
        !           400:                // 押されていたら開放
        !           401:                if (hit[code]) {
        !           402:                        KeyUp(code);
        !           403:                }
        !           404:        }
        !           405:        leftdown_keycode = 0;
        !           406: }
        !           407: 
        !           408: // マウス左ダブルクリックイベント
        !           409: // ダブルクリックという操作に特別何かを割り当ててはいないが、
        !           410: // キーを連打するとその間隔によってはダブルクリックと扱われるため、
        !           411: // 受け取ってここで処理する。
        !           412: //
        !           413: // DClick イベントは LeftDown、LeftUp、LeftDClick、LeftUp の順で
        !           414: // 飛んでくるので、ここでは2回目の押下だけ処理すればよい。というか
        !           415: // 処理自体は LeftDown とまったく同じになるので、イベントテーブルで
        !           416: // 直接 EVT_LEFT_DCLICK => OnLeftDown に割り付けることも出来そうだが
        !           417: // デバッグが紛らわしくなりそうなので独立したイベントとしておく。
        !           418: void
        !           419: WXLunaSoftKeyPanel::OnLeftDClick(wxMouseEvent& event)
        !           420: {
        !           421:        wxPoint pt = event.GetPosition();
        !           422:        uint code = GetKeycodeFromPoint(pt);
        !           423: 
        !           424:        DoLeftDown(code);
        !           425: }
        !           426: 
        !           427: // マウス右クリック (Down) イベント
        !           428: // 長押し開始/解除。
        !           429: // 右クリックのほうは Down だけで Up は使わない。
        !           430: void
        !           431: WXLunaSoftKeyPanel::OnRightDown(wxMouseEvent& event)
        !           432: {
        !           433:        wxPoint pt = event.GetPosition();
        !           434:        uint code = GetKeycodeFromPoint(pt);
        !           435: 
        !           436:        if (code != 0) {
        !           437:                if (hit[code]) {
        !           438:                        // 押されていたら開放
        !           439:                        KeyUp(code);
        !           440:                } else {
        !           441:                        // 押されてなければ長押し開始
        !           442:                        KeyDown(code);
        !           443:                }
        !           444:        }
        !           445: }
        !           446: 
        !           447: // このキーが押された処理
        !           448: void
        !           449: WXLunaSoftKeyPanel::KeyDown(uint code)
        !           450: {
        !           451:        // 押された
        !           452:        hit[code] = true;
        !           453: 
        !           454:        // LED キーは押下時に変化(反転)させて、その結果
        !           455:        // 点灯なら Make、消灯なら Break を送信。
        !           456:        if (code == KC_CAPS) {
        !           457:                led_cap = !led_cap;
        !           458:                if (led_cap) {
        !           459:                        gKeyboard->MakeKey(code);
        !           460:                } else {
        !           461:                        gKeyboard->BreakKey(code);
        !           462:                }
        !           463:        } else if (code == KC_kana) {
        !           464:                led_kana = !led_kana;
        !           465:                if (led_kana) {
        !           466:                        gKeyboard->MakeKey(code);
        !           467:                } else {
        !           468:                        gKeyboard->BreakKey(code);
        !           469:                }
        !           470:        } else {
        !           471:                // 通常キーは押下で Make 送信。
        !           472:                gKeyboard->MakeKey(code);
        !           473:        }
        !           474: 
        !           475:        // 修飾キー
        !           476:        if (code == KC_SHIFT_L || code == KC_SHIFT_R) {
        !           477:                modifier = ModShift;
        !           478:        }
        !           479: 
        !           480:        // キー状態が変わった(かも知れない)ので再描画
        !           481:        Refresh();
        !           482: }
        !           483: 
        !           484: // このキーが放された処理
        !           485: void
        !           486: WXLunaSoftKeyPanel::KeyUp(uint code)
        !           487: {
        !           488:        hit[code] = false;
        !           489:        // 通常キーなら Break を送る。(LED キーは KeyDown で送っているので不要)
        !           490:        if (!IsLEDKey(code)) {
        !           491:                gKeyboard->BreakKey(code);
        !           492:        }
        !           493: 
        !           494:        // 修飾キー
        !           495:        if (code == KC_SHIFT_L || code == KC_SHIFT_R) {
        !           496:                modifier = ModNormal;
        !           497:        }
        !           498: 
        !           499:        // キー状態が変わった(かも知れない)ので再描画
        !           500:        Refresh();
        !           501: }
        !           502: 
        !           503: // 座標からキーコード(KC_*)を返す。
        !           504: // キーに当たっていなければ KC_none を返す。
        !           505: uint
        !           506: WXLunaSoftKeyPanel::GetKeycodeFromPoint(const wxPoint& pt) const
        !           507: {
        !           508:        // エンターキーだけ先に別判定
        !           509:        if (enter_region.Contains(pt) == wxInRegion) {
        !           510:                return KC_enter;
        !           511:        }
        !           512: 
        !           513:        for (const auto& key : keydata) {
        !           514:                if (key.x == -1) {
        !           515:                        continue;
        !           516:                }
        !           517:                // 始点と幅の +1/-1 は罫線の分
        !           518:                wxRect rect(
        !           519:                        (key.x * unit) + 1,
        !           520:                        (key.y * unit) + 1,
        !           521:                        (key.w * unit) - 1,
        !           522:                        (key.h * unit) - 1);
        !           523:                if (rect.Contains(pt)) {
        !           524:                        return key.keycode;
        !           525:                }
        !           526:        }
        !           527:        return KC_none;
        !           528: }
        !           529: 
        !           530: // キーデータ
        !           531: #define H       (8)    // キーの高さ
        !           532: #define L0      (2)    // ファンクションキーの行
        !           533: #define L1     (12)    // ESC の行
        !           534: #define L2     (20)    // TAB の行
        !           535: #define L3     (28)    // CTRL の行
        !           536: #define L4     (36)    // SHIFT の行
        !           537: #define L5     (44)    // space の行
        !           538: // エンター記号は半角2文字幅なので空白2個で表現しておく。
        !           539: // 文字数から文字幅をカウントするのに使っているだけで、描画には使わない。
        !           540: #define EnterMark      "  "
        !           541: /*static*/ std::vector<keydata_t>
        !           542: WXLunaSoftKeyPanel::keydata {
        !           543:        //                +--- キートップの色種別(0:薄い 1:濃い)
        !           544:        //                |
        !           545:        //  X   Y   W  H  C  KeyCode                    通常  SHIFT
        !           546:        {   2, L0, 15, H, 1, KC_F1,                             { "PF1" } },
        !           547:        {  17, L0, 15, H, 1, KC_F2,                             { "PF2" } },
        !           548:        {  32, L0, 15, H, 1, KC_F3,                             { "PF3" } },
        !           549:        {  47, L0, 15, H, 1, KC_F4,                             { "PF4" } },
        !           550:        {  62, L0, 15, H, 1, KC_F5,                             { "PF5" } },
        !           551:        {  81, L0, 15, H, 1, KC_F6,                             { "PF6" } },
        !           552:        {  96, L0, 15, H, 1, KC_F7,                             { "PF7" } },
        !           553:        { 111, L0, 15, H, 1, KC_F8,                             { "PF8" } },
        !           554:        { 126, L0, 15, H, 1, KC_F9,                             { "PF9" } },
        !           555:        { 141, L0, 15, H, 1, KC_F10,                    { "PF10" } },
        !           556: 
        !           557:        {   2, L1, 12, H, 1, KC_ESC,                    { "ESC" } },
        !           558:        {  14, L1, 10, H, 0, KC_1,                              { "1",  "!" } },
        !           559:        {  24, L1, 10, H, 0, KC_2,                              { "2",  "\"" } },
        !           560:        {  34, L1, 10, H, 0, KC_3,                              { "3",  "#" } },
        !           561:        {  44, L1, 10, H, 0, KC_4,                              { "4",  "$" } },
        !           562:        {  54, L1, 10, H, 0, KC_5,                              { "5",  "%" } },
        !           563:        {  64, L1, 10, H, 0, KC_6,                              { "6",  "&" } },
        !           564:        {  74, L1, 10, H, 0, KC_7,                              { "7",  "'" } },
        !           565:        {  84, L1, 10, H, 0, KC_8,                              { "8",  "(" } },
        !           566:        {  94, L1, 10, H, 0, KC_9,                              { "9",  ")" } },
        !           567:        { 104, L1, 10, H, 0, KC_0,                              { "0",  " " } },
        !           568:        { 114, L1, 10, H, 0, KC_minus,                  { "-",  "=" } },
        !           569:        { 124, L1, 10, H, 0, KC_circum,                 { "^",  "~" } },
        !           570:        { 134, L1, 10, H, 0, KC_backslash,              { "\\", "|" } },
        !           571:        { 144, L1, 12, H, 1, KC_BS,                             { "BS" } },
        !           572: 
        !           573:        {   2, L2, 17, H, 1, KC_TAB,                    { "TAB" } },
        !           574:        {  19, L2, 10, H, 0, KC_Q,                              { "q",  "Q" } },
        !           575:        {  29, L2, 10, H, 0, KC_W,                              { "w",  "W" } },
        !           576:        {  39, L2, 10, H, 0, KC_E,                              { "e",  "E" } },
        !           577:        {  49, L2, 10, H, 0, KC_R,                              { "r",  "R" } },
        !           578:        {  59, L2, 10, H, 0, KC_T,                              { "t",  "T" } },
        !           579:        {  69, L2, 10, H, 0, KC_Y,                              { "y",  "Y" } },
        !           580:        {  79, L2, 10, H, 0, KC_U,                              { "u",  "U" } },
        !           581:        {  89, L2, 10, H, 0, KC_I,                              { "i",  "I" } },
        !           582:        {  99, L2, 10, H, 0, KC_O,                              { "o",  "O" } },
        !           583:        { 109, L2, 10, H, 0, KC_P,                              { "p",  "P" } },
        !           584:        { 119, L2, 10, H, 0, KC_at,                             { "@",  "`" } },
        !           585:        { 129, L2, 10, H, 0, KC_bracketleft,    { "[",  "{" } },
        !           586: 
        !           587:        {   2, L3, 20, H, 1, KC_CTRL,                   { "CTRL" } },
        !           588:        {  22, L3, 10, H, 0, KC_A,                              { "a",  "A" } },
        !           589:        {  32, L3, 10, H, 0, KC_S,                              { "s",  "S" } },
        !           590:        {  42, L3, 10, H, 0, KC_D,                              { "d",  "D" } },
        !           591:        {  52, L3, 10, H, 0, KC_F,                              { "f",  "F" } },
        !           592:        {  62, L3, 10, H, 0, KC_G,                              { "g",  "G" } },
        !           593:        {  72, L3, 10, H, 0, KC_H,                              { "h",  "H" } },
        !           594:        {  82, L3, 10, H, 0, KC_J,                              { "j",  "J" } },
        !           595:        {  92, L3, 10, H, 0, KC_K,                              { "k",  "K" } },
        !           596:        { 102, L3, 10, H, 0, KC_L,                              { "l",  "L" } },
        !           597:        { 112, L3, 10, H, 0, KC_semicolon,              { ";",  "+" } },
        !           598:        { 122, L3, 10, H, 0, KC_colon,                  { ":",  "*" } },
        !           599:        { 132, L3, 10, H, 0, KC_bracketright,   { "]",  "}" } },
        !           600: 
        !           601:        {   2, L4, 25, H, 1, KC_SHIFT_L,                { "SHIFT" } },
        !           602:        {  27, L4, 10, H, 0, KC_Z,                              { "z",  "Z" } },
        !           603:        {  37, L4, 10, H, 0, KC_X,                              { "x",  "X" } },
        !           604:        {  47, L4, 10, H, 0, KC_C,                              { "c",  "C" } },
        !           605:        {  57, L4, 10, H, 0, KC_V,                              { "v",  "V" } },
        !           606:        {  67, L4, 10, H, 0, KC_B,                              { "b",  "B" } },
        !           607:        {  77, L4, 10, H, 0, KC_N,                              { "n",  "N" } },
        !           608:        {  87, L4, 10, H, 0, KC_M,                              { "m",  "M" } },
        !           609:        {  97, L4, 10, H, 0, KC_comma,                  { ",",  "<" } },
        !           610:        { 107, L4, 10, H, 0, KC_period,                 { ".",  ">" } },
        !           611:        { 117, L4, 10, H, 0, KC_slash,                  { "/",  "?" } },
        !           612:        { 127, L4, 10, H, 0, KC_underscore,             { " ",  "_" } },
        !           613:        { 137, L4, 19, H, 1, KC_SHIFT_R,                { "SHIFT" } },
        !           614: 
        !           615:        {   2, L5, 20, H, 1, KC_VALID,                  { "確定" } },
        !           616:        {  22, L5, 10, H, 1, KC_SF,                             { "前面" } },
        !           617:        {  32, L5, 10, H, 1, KC_CAPS,                   { "CAP" } },
        !           618:        {  42, L5, 80, H, 0, KC_space,                  { " " } },
        !           619:        { 122, L5, 10, H, 1, KC_kana,                   { "かな" } },
        !           620:        { 132, L5, 24, H, 1, KC_XFER,                   { "変換" } },
        !           621: 
        !           622:        // カーソルキー島
        !           623:        { 158, L1, 13, H, 1, KC_PF11,                   { "消去" } },
        !           624:        { 171, L1, 13, H, 1, KC_PF12,                   { "呼出" } },
        !           625:        { 158, L2, 13, H, 1, KC_PF13,                   { "文節←" } },
        !           626:        { 171, L2, 13, H, 1, KC_PF14,                   { "文節→" } },
        !           627:        { 158, L3, 26, H, 1, KC_up,                             { "↑" } },
        !           628:        { 158, L4, 13, H, 1, KC_left,                   { "←" } },
        !           629:        { 171, L4, 13, H, 1, KC_right,                  { "→" } },
        !           630:        { 158, L5, 26, H, 1, KC_down,                   { "↓" } },
        !           631: 
        !           632:        // テンキー島
        !           633:        { 186, L1, 10, H, 1, KC_DEL,                    { "DEL" } },
        !           634:        { 196, L1, 10, H, 1, KC_PAD_plus,               { "+" } },
        !           635:        { 206, L1, 10, H, 1, KC_PAD_minus,              { "-" } },
        !           636:        { 216, L1, 10, H, 1, KC_PAD_multiply,   { "*" } },
        !           637: 
        !           638:        { 186, L2, 10, H, 0, KC_PAD_7,                  { "7" } },
        !           639:        { 196, L2, 10, H, 0, KC_PAD_8,                  { "8" } },
        !           640:        { 206, L2, 10, H, 0, KC_PAD_9,                  { "9" } },
        !           641:        { 216, L2, 10, H, 1, KC_PAD_divide,             { "/" } },
        !           642: 
        !           643:        { 186, L3, 10, H, 0, KC_PAD_4,                  { "4" } },
        !           644:        { 196, L3, 10, H, 0, KC_PAD_5,                  { "5" } },
        !           645:        { 206, L3, 10, H, 0, KC_PAD_6,                  { "6" } },
        !           646:        { 216, L3, 10, H, 1, KC_PAD_equal,              { "=" } },
        !           647: 
        !           648:        { 186, L4, 10, H, 0, KC_PAD_1,                  { "1" } },
        !           649:        { 196, L4, 10, H, 0, KC_PAD_2,                  { "2" } },
        !           650:        { 206, L4, 10, H, 0, KC_PAD_3,                  { "3" } },
        !           651:        { 216, L4, 10, H, 1, KC_PAD_comma,              { "," } },
        !           652: 
        !           653:        { 186, L5, 10, H, 0, KC_PAD_0,                  { "0" } },
        !           654:        { 196, L5, 10, H, 0, KC_PAD_decimal,    { "." } },
        !           655:        { 206, L5, 20, H, 1, KC_PAD_enter,              { EnterMark } },
        !           656: 
        !           657:        // Enter だけ矩形でないので別処理するが
        !           658:        // この構造体には全部のキー情報が統一的に並んでいるほうがよかろう。
        !           659:        { -1, -1, -1, -1, 1, KC_enter,                  { EnterMark } },
        !           660: };
        !           661: 
        !           662: 
        !           663: //
        !           664: // LUNA ソフトウェアキーボード (ウィンドウ)
        !           665: //
        !           666: 
        !           667: // コンストラクタ
        !           668: WXLunaSoftKeyWindow::WXLunaSoftKeyWindow(wxWindow *parent, wxWindowID id)
        !           669:        : inherited(parent, id, wxT("ソフトウェアキーボード"))
        !           670: {
        !           671:        panel = new WXLunaSoftKeyPanel(this);
        !           672: 
        !           673:        // 大きさをそれに固定
        !           674:        Layout();
        !           675:        Fit();
        !           676: }
        !           677: 
        !           678: // デストラクタ
        !           679: WXLunaSoftKeyWindow::~WXLunaSoftKeyWindow()
        !           680: {
        !           681: }
        !           682: 
        !           683: // フォントサイズ変更
        !           684: void
        !           685: WXLunaSoftKeyWindow::SetFontSize(fontsize_t fontsize)
        !           686: {
        !           687:        panel->SetFontSize(fontsize);
        !           688:        // 大きさ変更
        !           689:        Layout();
        !           690:        Fit();
        !           691: }

unix.superglobalmegacorp.com

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