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

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);
1.1.1.2 ! root      207:        wxString utfstr(wxT("右クリックで長押し"));
1.1       root      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.