|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.