--- nono/wx/wxsoftkey.cpp 2026/04/29 17:04:37 1.1.1.4 +++ nono/wx/wxsoftkey.cpp 2026/04/29 17:05:04 1.1.1.9 @@ -6,7 +6,9 @@ #include "wxsoftkey.h" #include "wxcolor.h" +#include "wxmainview.h" #include "wxtextscreen.h" +#include "wxuimessage.h" #include "sram.h" // @@ -27,37 +29,89 @@ wxBEGIN_EVENT_TABLE(WXSoftKeyPanel, inhe EVT_LEFT_DCLICK(WXSoftKeyPanel::OnLeftDClick) EVT_RIGHT_DOWN(WXSoftKeyPanel::OnRightDown) EVT_PAINT(WXSoftKeyPanel::OnPaint) - EVT_SIZE(WXSoftKeyPanel::OnSize) + EVT_TIMER(wxID_ANY, WXSoftKeyPanel::OnTimer) wxEND_EVENT_TABLE() // コンストラクタ WXSoftKeyPanel::WXSoftKeyPanel(wxWindow *parent, - int u_width_, int u_height_) + const std::vector& keydata_, int u_width_, int u_height_) : inherited(parent) + , keydata(keydata_) { + timer.SetOwner(this); + u_width = u_width_; u_height = u_height_; + + DoSize(); + + // 残光の初期化。 + // persistence は keydata 分の配列ではなく共通キーコード分の配列。 + // 使われない領域も多いが、共通キーコードから keydata 番号への逆引きは + // 面倒なので。 + persistence.resize(KC_max); + std::fill(persistence.begin(), persistence.end(), 0); + + // このパネルへのキー入力はメインビューへのキー入力と同じ。 + Connect(wxEVT_CHAR, wxCharEventHandler(WXMainView::OnChar), NULL, + gMainView); + Connect(wxEVT_KEY_UP, wxKeyEventHandler(WXMainView::OnKeyUp), NULL, + gMainView); + Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(WXMainView::OnKeyDown), NULL, + gMainView); + + // VM からの通知を受け取る + WXUIMessage::Connect(UIMessage::KEYBOARD, this, + wxCommandEventHandler(WXSoftKeyPanel::OnKeyChanged)); } // デストラクタ WXSoftKeyPanel::~WXSoftKeyPanel() { - bitmap.reset(); - image.reset(); - bmpbuf.reset(); + // SHIFT キーのワンショットは解放する? + // (長押しは開放しない) + + timer.Stop(); + + WXUIMessage::Disconnect(UIMessage::KEYBOARD, + wxCommandEventHandler(WXSoftKeyPanel::OnKeyChanged)); +} + +// color.Keytop の初期化(補間)。 +// num はキートップの種類の数。1 か 2 +void +WXSoftKeyPanel::InitColorKeytop(int num) +{ + wxColour pressed = UD_BLUE; + + auto f = [](int a, int b, int x) { + return a * x / 100 + b * (100 - x) / 100; + }; + + // Keytop[i][9] は押されたときの色 + // Keytop[i][0] は押されていないときの色 + for (int i = 0; i < num; i++) { + for (int j = 1; j < 10; j++) { + int n = j * 100 / 9; + color.Keytop[i][j] = wxColour( + f(pressed.Red(), color.Keytop[i][0].Red(), n), + f(pressed.Green(), color.Keytop[i][0].Green(), n), + f(pressed.Blue(), color.Keytop[i][0].Blue(), n)); + } + } } // フォントサイズ変更 (外部インタフェース) void -WXSoftKeyPanel::SetFontSize(fontsize_t new_fontsize) +WXSoftKeyPanel::SetFontSize(FontId new_fontid) { // 同じなら何もしない - if (fontsize == new_fontsize) { + if (fontid == new_fontid) { return; } // フォントを更新 - UpdateFont(new_fontsize); + UpdateFont(new_fontid); // サイズ変更処理 DoSize(); @@ -70,37 +124,40 @@ WXSoftKeyPanel::SetFontSize(fontsize_t n void WXSoftKeyPanel::DoSize() { - assert(fontsize != FONT_NONE); + assert(fontid != FontId::None); // このパネル内の描画の基本単位 unit = font_height / 4; // エンターキーだけ矩形でないのでここでリージョンを計算。 // unit が確定したところで一回行う。 + // ただし SHIFT_R のキーコードはちょっと使いづらいので、ここでは SHIFT_R + // を使わず [_] キーで代用する。 + // + // | ^ | \ | BS | + // | | | | + // --+---+---+--(A)--+------(B) + // | | | + // | [ | | + // | | Enter | + // --+---+---+--(F)-(E) | + // | | | | + // | : | ] | | + // | | | | + // --+---+---+------(D)-----(C) + // | | + // _ | SHIFT | // - // | ^ | \ | BS | - // | | | | - // +---+---+--(A)--+------(B) - // | | | - // | [ | | - // | | Enter | - // +---+---+--(F)-(E) | - // | | | | - // | : | ] | | - // | | | | - // +---+---+------(D)-----(C) - // | | - // | SHIFT | const keydata_t& keybs = FindKeydata(KC_BS); const keydata_t& keyleft = FindKeydata(KC_bracketleft); const keydata_t& keyright = FindKeydata(KC_bracketright); - const keydata_t& keyshift = FindKeydata(KC_SHIFT_R); + const keydata_t& keyscore = FindKeydata(KC_underscore); // 各点のピクセル座標 enter_points = { { keyleft.right() * unit, keyleft.y * unit }, // A { keybs.right() * unit, keyleft.y * unit }, // B - { keyshift.right() * unit, keyshift.y * unit }, // C - { keyright.right() * unit, keyshift.y * unit }, // D + { keybs.right() * unit, keyscore.y * unit }, // C + { keyright.right() * unit, keyscore.y * unit }, // D { keyright.right() * unit, keyright.y * unit }, // E { keyleft.right() * unit, keyright.y * unit }, // F }; @@ -110,36 +167,47 @@ WXSoftKeyPanel::DoSize() // コントロールの大きさを変更 wxSize size(u_width * unit, u_height * unit); SetClientSize(size); - SetMinSize(size); + SetMinClientSize(size); + + // ビットマップ作成 + bitmap.Create(size.x, size.y); + + // 再描画を指示 + Refresh(); } -// サイズ変更イベント void -WXSoftKeyPanel::OnSize(wxSizeEvent& event) +WXSoftKeyPanel::OnTimer(wxTimerEvent& event) { - // Mac ではウィンドウ作成時に 0 以下の値が来ることがある - // GTK では 1 で来ることがある - wxSize size = event.GetSize(); - if (size.x <= 1 || size.y <= 1) { - return; - } - - view_width = size.x; - view_height = size.y; - - // ビットマップを持っていれば一旦解放 - bitmap.reset(); - image.reset(); - bmpbuf.reset(); + Refresh(); +} - // ビットマップ作成 - // 正しく描かれなかった時に分かりやすいよう初期値は濃いグレーにしておく - bmpbuf.reset(new uint8 [view_width * view_height * 3]); - memset(&bmpbuf[0], 0x70, view_width * view_height * 3); - image.reset(new wxImage(view_width, view_height, bmpbuf.get(), true)); - bitmap.reset(new wxBitmap(*image)); +// キー状態変更イベント (UIMessage) +// +// キー状態変更イベントは、キーの状態が変わるたびに都度通知される。 +// ソフトウェアキーボード入力とパススルーモードの入力では、どのキーに変化 +// (押下 or 開放)があったかの情報は付属しない。各キーの押下状態は全キーを +// 逐一調査することで判定する。人間時間で起きる事象なのでこの計算量は許容。 +// Char 入力モードの場合は、イベントのパラメータ引数 (GetInt() で取得可) に +// 入力のあったキーの共通キーコードが入っている (複数のキーが同時に押される +// 場合はキーの回数分のイベントが飛んでくる)。Char 入力モードにはキー開放 +// という概念はない。 +void +WXSoftKeyPanel::OnKeyChanged(wxCommandEvent& event) +{ + // Char 入力モードでキーが押された場合は、共通キーコードが送られてくるので、 + // persistence[] をここでセットする。 + // Char 入力モードでは、キーの Make/Break が一瞬で終わるため、このイベント + // を受け取って Refresh() を発行 -> OnPaint() -> Draw() 内で IsPressed() + // を調べた頃にはタイミング問題でもうキーが離されている可能性があるので、 + // 描画時に全キーを調べる方法は使えない。 + uint keycode = event.GetInt(); + if (keycode != 0) { + assert(keycode < persistence.size()); + // 9 が減光時の初期値 (10 は減光しない点灯) + persistence[keycode] = 9; + } - // 再描画を指示 Refresh(); } @@ -149,35 +217,69 @@ WXSoftKeyPanel::OnPaint(wxPaintEvent& ev { // メモリ DC に描画 wxMemoryDC memDC; - memDC.SelectObject(*bitmap); + memDC.SelectObject(bitmap); Draw(memDC); // 実画面 DC にコピー wxPaintDC dstDC(this); - dstDC.Blit(0, 0, view_width, view_height, &memDC, 0, 0); + wxSize size = bitmap.GetSize(); + dstDC.Blit(0, 0, size.x, size.y, &memDC, 0, 0); } // 描画本体 void WXSoftKeyPanel::Draw(wxDC& dc) { + bool timer_start = false; + + // キー刻印の表示更新用に修飾キーの状態を更新。 + // 本来は IsShift() だけで判定すべきだが、Char 入力モードでいずれかの + // SHIFT キーが減光中は SHIFT 刻印を継続してみるのはどうか。 + // 0 まで待つとうちの環境だと消灯した少し後に刻印が戻るように見えるため、 + // ある程度暗くなったところでもう切り替えてみる。閾値は適当。 + if ((2 < persistence[KC_SHIFT_L] && persistence[KC_SHIFT_L] < 10) || + (2 < persistence[KC_SHIFT_R] && persistence[KC_SHIFT_R] < 10) || + (2 < persistence[KC_SHIFT] && persistence[KC_SHIFT] < 10) || + gKeyboard->IsShift()) + { + modifier = ModShift; + } else { + modifier = ModNormal; + } + dc.SetPen(wxPen(color.Background)); dc.SetBrush(wxBrush(color.Background)); dc.DrawRectangle(wxPoint(0, 0), GetSize()); dc.SetPen(color.Text); SetTextForeColor(color.Text); - for (const auto& key : GetKeydata()) { - if (hit[key.keycode]) { - // 押されている - SetTextBackColor(color.KeyPressed); - dc.SetBrush(color.KeyPressed); + for (const auto& key : keydata) { + int c = persistence[key.keycode]; + if (0 < c && c < 10) { + // Char 入力モードで減光中 + c--; + timer_start = true; } else { - // 押されていない - SetTextBackColor(color.Keytop[key.coltype]); - dc.SetBrush(wxBrush(color.Keytop[key.coltype])); + // そうでない場合に限り、現在の状態を問い合わせる + bool is_pressed = gKeyboard->IsPressed(key.keycode); + if (is_pressed) { + // 押されている + c = 10; + } else { + // 押されていない + c = 0; + } + } + // persistence[] は 10 が(減光しない)点灯、9..1 が減光中を示す。 + persistence[key.keycode] = c; + // ただし色配列は 0..9 で 9 が最大点灯色 + if (c > 9) { + c = 9; } + SetTextBackColor(color.Keytop[key.coltype][c]); + dc.SetBrush(color.Keytop[key.coltype][c]); + // エンターキーだけ枠の描き方が違うので別処理 if (__predict_false(key.x < 0)) { DrawEnterKey(dc); @@ -186,6 +288,12 @@ WXSoftKeyPanel::Draw(wxDC& dc) } } + if (timer_start) { + timer.Start(25); + } else { + timer.Stop(); + } + #if 0 // X68k キーボードだとどこに表示するか SetTextBackColor(color.Background); @@ -315,7 +423,7 @@ WXSoftKeyPanel::DrawEnterMark(wxDC& dc, const keydata_t& WXSoftKeyPanel::FindKeydata(uint keycode) const { - for (const auto& key : GetKeydata()) { + for (const auto& key : keydata) { if (key.keycode == keycode) { return key; } @@ -324,30 +432,62 @@ WXSoftKeyPanel::FindKeydata(uint keycode assertmsg(0, "keycode %d not found", keycode); } +// keycode が SHIFT キーなら true を返す +// (SHIFT キーが押されているかとかではない) +/*static*/ bool +WXSoftKeyPanel::IsShiftKey(uint keycode) +{ + if (keycode == KC_SHIFT_L || + keycode == KC_SHIFT_R || + keycode == KC_SHIFT) + { + return true; + } + return false; +} + // マウス左クリック (Down) イベント void WXSoftKeyPanel::OnLeftDown(wxMouseEvent& event) { - wxPoint pt = event.GetPosition(); + const wxPoint& pt = event.GetPosition(); const keydata_t *key = GetKeydataFromPoint(pt); - DoLeftDown(key); + if (key != NULL) { + DoLeftDown(key); + } } // マウス左クリック (Down) 処理 void WXSoftKeyPanel::DoLeftDown(const keydata_t *key) { - if (key != NULL) { - uint code = key->keycode; - if (hit[code]) { - // 押下(長押し)中のキーならここで開放 - KeyUp(*key); + assert(key); + + // SHIFT キーの左クリックはトグル状動作。 + // SHIFT 状態で押すと、すべての SHIFT キーを開放。 + // 非 SHIFT 状態で押すと、次のキー押下までこの SHIFT キーを押下維持。 + if (IsShiftKey(key->keycode)) { + if (gKeyboard->IsShift()) { + // SHIFT 状態で SHIFT キーが押されたのですべての SHIFT キーを開放 + if (key->keycode == KC_SHIFT) { + KeyUp(*key); + } else { + KeyUp(FindKeydata(KC_SHIFT_L)); + KeyUp(FindKeydata(KC_SHIFT_R)); + } } else { - // 押下して、LeftUp のために覚えておく + // 非 SHIFT 状態で SHIFT キーが押されたのでこのキーを押下 KeyDown(*key); - leftdown_key = key; + shift_hold = false; } + + // SHIFT キーなら LeftUp では何もしない + leftdown_key = NULL; + } else { + // SHIFT 以外のキーは押下して LeftUp のために覚えておく + KeyDown(*key); + leftdown_key = key; } } @@ -359,20 +499,24 @@ WXSoftKeyPanel::OnLeftUp(wxMouseEvent& e // 直近に LeftDown したキーコードをターゲットにする。 const keydata_t *key = leftdown_key; - DoLeftUp(key); -} - -// マウス左クリック (Up) 処理 -void -WXSoftKeyPanel::DoLeftUp(const keydata_t *key) -{ if (key != NULL) { - // 押されていたら開放 - uint code = key->keycode; - if (hit[code]) { - KeyUp(*key); + KeyUp(*key); + + // キーが離された時、長押しでない SHIFT キーがあれば開放 + if (gKeyboard->IsShift() && shift_hold == false) { + // XXX どの SHIFT が存在するのか分からないのがなんかアレ + if (gKeyboard->IsPressed(KC_SHIFT_L)) { + KeyUp(FindKeydata(KC_SHIFT_L)); + } + if (gKeyboard->IsPressed(KC_SHIFT_R)) { + KeyUp(FindKeydata(KC_SHIFT_R)); + } + if (gKeyboard->IsPressed(KC_SHIFT)) { + KeyUp(FindKeydata(KC_SHIFT)); + } } } + leftdown_key = NULL; } @@ -389,10 +533,12 @@ WXSoftKeyPanel::DoLeftUp(const keydata_t void WXSoftKeyPanel::OnLeftDClick(wxMouseEvent& event) { - wxPoint pt = event.GetPosition(); + const wxPoint& pt = event.GetPosition(); const keydata_t *key = GetKeydataFromPoint(pt); - DoLeftDown(key); + if (key != NULL) { + DoLeftDown(key); + } } // マウス右クリック (Down) イベント @@ -401,17 +547,21 @@ WXSoftKeyPanel::OnLeftDClick(wxMouseEven void WXSoftKeyPanel::OnRightDown(wxMouseEvent& event) { - wxPoint pt = event.GetPosition(); + const wxPoint& pt = event.GetPosition(); const keydata_t *key = GetKeydataFromPoint(pt); if (key != NULL) { uint code = key->keycode; - if (hit[code]) { + if (gKeyboard->IsPressed(code)) { // 押されていたら開放 KeyUp(*key); } else { // 押されてなければ長押し開始 KeyDown(*key); + + if (IsShiftKey(key->keycode)) { + shift_hold = true; + } } } } @@ -426,7 +576,7 @@ WXSoftKeyPanel::GetKeydataFromPoint(cons return &FindKeydata(KC_enter); } - for (const auto& key : GetKeydata()) { + for (const auto& key : keydata) { if (key.x < 0) { continue; } @@ -443,13 +593,34 @@ WXSoftKeyPanel::GetKeydataFromPoint(cons return NULL; } +// このキーが押された処理 +void +WXSoftKeyPanel::KeyDown(const keydata_t& key) +{ + uint code = key.keycode; + + // VM に通知 (Keyboard がホストに通知する) + gKeyboard->MakeKey(code); +} + +// このキーが放された処理 +void +WXSoftKeyPanel::KeyUp(const keydata_t& key) +{ + uint code = key.keycode; + + // VM に通知 (Keyboard がホストに通知する) + gKeyboard->BreakKey(code); +} + + // // LUNA ソフトウェアキーボード (パネル) // // コンストラクタ WXLunaSoftKeyPanel::WXLunaSoftKeyPanel(wxWindow *parent) - : inherited(parent, 226, 54) + : inherited(parent, keydata, 226, 54) { // LUNA では // BS キーの左隣 (0x5c) は円記号ではなくバックスラッシュ。 @@ -458,33 +629,26 @@ WXLunaSoftKeyPanel::WXLunaSoftKeyPanel(w SetGlyph5C(true); SetGlyph7E(true); + // 白黒モデル共通 + color.Border = *wxBLACK; + color.LED[0] = UD_RED; + // キートップの濃淡はユニバーサルデザインの推奨色ではないけど // ここは見分けを付けるためではなくただのデザインなので。 if (1) { // 白モデル - color = { - .Background = UD_LIGHT_GREY, // 現物新品は何色だったんだろう - .Text = *wxBLACK, - .Keytop = { *wxWHITE, wxColour(200, 200, 203) }, - // 白黒共通 - .KeyPressed = UD_BLUE, - .Border = *wxBLACK, - .LED = { UD_RED }, - }; + color.Background = UD_LIGHT_GREY; // 現物新品は何色だったんだろう + color.Text = *wxBLACK; + color.Keytop[0][0] = *wxWHITE; + color.Keytop[1][0] = wxColour(200, 200, 203); } else { // 黒モデル - color = { - .Background = *wxBLACK, - .Text = *wxWHITE, - .Keytop = { wxColour(50, 50, 53), *wxBLACK }, - // 白黒共通 - .KeyPressed = UD_BLUE, - .Border = *wxBLACK, - .LED = { UD_RED }, - }; + color.Background = *wxBLACK; + color.Text = *wxWHITE; + color.Keytop[0][0] = wxColour(50, 50, 53); + color.Keytop[1][0] = *wxBLACK; } - - DoSize(); + InitColorKeytop(2); } // デストラクタ @@ -504,8 +668,9 @@ WXLunaSoftKeyPanel::DrawLED(wxDC& dc, co dc.SetBrush(color.LED[0]); } else { // 消灯時は元のキートップの色で、枠は薄めにしたい - dc.SetPen(GetTextDisableColor()); - dc.SetBrush(color.Keytop[key.coltype]); + // (枠の色は今の所全モデル共通なので ColorPalette に含めていない) + dc.SetPen(UD_GREY); + dc.SetBrush(color.Keytop[key.coltype][0]); } // LED を左肩に描く @@ -517,48 +682,6 @@ WXLunaSoftKeyPanel::DrawLED(wxDC& dc, co return +1; } -// このキーが押された処理 -void -WXLunaSoftKeyPanel::KeyDown(const keydata_t& key) -{ - uint code = key.keycode; - - // 押された - hit[code] = true; - - // VM に通知 (Keyboard がそれをホストに通知するかはまた別) - gKeyboard->MakeKey(code); - - // 修飾キー - if (code == KC_SHIFT_L || code == KC_SHIFT_R) { - modifier = ModShift; - } - - // キー状態が変わった(かも知れない)ので再描画 - Refresh(); -} - -// このキーが放された処理 -void -WXLunaSoftKeyPanel::KeyUp(const keydata_t& key) -{ - uint code = key.keycode; - - // 放された - hit[code] = false; - - // VM に通知 (Keyboard がそれをホストに通知するかはまた別) - gKeyboard->BreakKey(code); - - // 修飾キー - if (code == KC_SHIFT_L || code == KC_SHIFT_R) { - modifier = ModNormal; - } - - // キー状態が変わった(かも知れない)ので再描画 - Refresh(); -} - // キーデータ #define H (8) // キーの高さ #define L0 (2) // ファンクションキーの行 @@ -695,7 +818,7 @@ WXLunaSoftKeyPanel::keydata { // コンストラクタ WXX68kSoftKeyPanel::WXX68kSoftKeyPanel(wxWindow *parent) - : inherited(parent, 235, 54) + : inherited(parent, keydata, 235, 54) { // X68k では SRAM 設定に同期させる。 uint8 sw = gSRAM->Peek8(0xed0059); @@ -704,16 +827,13 @@ WXX68kSoftKeyPanel::WXX68kSoftKeyPanel(w SetGlyph7C((sw & 0x04)); // とりあえず黒のみ - color = { - .Background = wxColour(50, 50, 53), - .Text = *wxWHITE, - .Keytop = { *wxBLACK }, - .KeyPressed = UD_BLUE, - .Border = *wxBLACK, - .LED = { UD_RED, UD_YELLOW_GREEN }, - }; - - DoSize(); + color.Background = wxColour(50, 50, 53); + color.Text = *wxWHITE; + color.Border = *wxBLACK; + color.LED[0] = UD_RED; + color.LED[1] = UD_YELLOW_GREEN; + color.Keytop[0][0] = *wxBLACK; + InitColorKeytop(1); } // デストラクタ @@ -743,8 +863,9 @@ WXX68kSoftKeyPanel::DrawLED(wxDC& dc, co dc.SetBrush(color.LED[n]); } else { // 消灯時は元のキートップの色で、枠は薄めにしたい - dc.SetPen(GetTextDisableColor()); - dc.SetBrush(color.Keytop[key.coltype]); + // (枠の色は今の所全モデル共通なので ColorPalette に含めていない) + dc.SetPen(UD_GREY); + dc.SetBrush(color.Keytop[key.coltype][0]); } // LED は中央前方(画面でいうと下) @@ -756,54 +877,13 @@ WXX68kSoftKeyPanel::DrawLED(wxDC& dc, co return -1; } -// このキーが押された処理 -void -WXX68kSoftKeyPanel::KeyDown(const keydata_t& key) -{ - uint code = key.keycode; - - // 押された - hit[code] = true; - - // VM に通知 (Keyboard がそれをホストに通知するかはまた別) - gKeyboard->MakeKey(code); - - // 修飾キー - if (code == KC_SHIFT_L || code == KC_SHIFT_R) { - modifier = ModShift; - } - - // キー状態が変わった(かも知れない)ので再描画 - Refresh(); -} - -// このキーが放された処理 -void -WXX68kSoftKeyPanel::KeyUp(const keydata_t& key) -{ - uint code = key.keycode; - - hit[code] = false; - - // VM に通知 (Keyboard がそれをホストに通知するかはまた別) - gKeyboard->BreakKey(code); - - // 修飾キー - if (code == KC_SHIFT_L || code == KC_SHIFT_R) { - modifier = ModNormal; - } - - // キー状態が変わった(かも知れない)ので再描画 - Refresh(); -} - #define LF (L0 + 2) // ファンクションキーは少し低い(横長い) #define HT (H * 2) // 縦2倍角のキー /*static*/ std::vector WXX68kSoftKeyPanel::keydata { // +- 0以上なら LED 番号 // X Y W H C L KeyCode 通常 SHIFT - { 2, L0, 10, H, 0,-1, KC_BREAK, { "BRK" } }, + { 2, L0, 10, H, 0,-1, KC_BREAK, { "\x4\x5\x6\x7" } }, { 15, L0, 10, H, 0,-1, KC_COPY, { "COPY" } }, { 29, LF, 12, 6, 0,-1, KC_F1, { "F1" } }, { 41, LF, 12, 6, 0,-1, KC_F2, { "F2" } }, @@ -860,7 +940,7 @@ WXX68kSoftKeyPanel::keydata { { 121, L3, 10, H, 0,-1, KC_colon, { ":", "*" } }, { 131, L3, 10, H, 0,-1, KC_bracketright, { "]", "}" } }, - { 2, L4, 24, H, 0,-1, KC_SHIFT_L, { "SHIFT" } }, + { 2, L4, 24, H, 0,-1, KC_SHIFT, { "SHIFT" } }, { 26, L4, 10, H, 0,-1, KC_Z, { "z", "Z" } }, { 36, L4, 10, H, 0,-1, KC_X, { "x", "X" } }, { 46, L4, 10, H, 0,-1, KC_C, { "c", "C" } }, @@ -872,7 +952,7 @@ WXX68kSoftKeyPanel::keydata { { 106, L4, 10, H, 0,-1, KC_period, { ".", ">" } }, { 116, L4, 10, H, 0,-1, KC_slash, { "/", "?" } }, { 126, L4, 10, H, 0,-1, KC_underscore, { " ", "_" } }, - { 136, L4, 19, H, 0,-1, KC_SHIFT_R, { "SHIFT" } }, + { 136, L4, 19, H, 0,-1, KC_SHIFT, { "SHIFT" } }, { 21, L5, 10, H, 0, 5, KC_hira, { "ひら" } }, { 31, L5, 12, H, 0,-1, KC_XF1, { "XF1" } }, @@ -920,7 +1000,7 @@ WXX68kSoftKeyPanel::keydata { { 193, L4, 10, H, 0,-1, KC_PAD_1, { "1" } }, { 203, L4, 10, H, 0,-1, KC_PAD_2, { "2" } }, { 213, L4, 10, H, 0,-1, KC_PAD_3, { "3" } }, - { 223, L4, 10, HT,0,-1, KC_PAD_enter, { "ENT" } }, + { 223, L4, 10, HT,0,-1, KC_PAD_enter, { "\xb\xc\xd\xe" } }, { 193, L5, 10, H, 0,-1, KC_PAD_0, { "0" } }, { 203, L5, 10, H, 0,-1, KC_PAD_comma, { "," } }, { 213, L5, 10, H, 0,-1, KC_PAD_decimal, { "." } }, @@ -931,61 +1011,29 @@ WXX68kSoftKeyPanel::keydata { }; // -// LUNA ソフトウェアキーボード (ウィンドウ) +// ソフトウェアキーボード (ウィンドウ) // // コンストラクタ -WXLunaSoftKeyWindow::WXLunaSoftKeyWindow(wxWindow *parent, wxWindowID id) - : inherited(parent, id, _("Software Keyboard")) -{ - panel = new WXLunaSoftKeyPanel(this); - - // 大きさをそれに固定 - Layout(); - Fit(); -} - -// デストラクタ -WXLunaSoftKeyWindow::~WXLunaSoftKeyWindow() +WXSoftKeyWindow::WXSoftKeyWindow(wxWindow *parent, vmtype_t vmtype) + : inherited(parent, wxID_ANY, _("Software Keyboard")) { -} + wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL); -// フォントサイズ変更 -void -WXLunaSoftKeyWindow::SetFontSize(fontsize_t fontsize) -{ - panel->SetFontSize(fontsize); - // 大きさ変更 - Layout(); - Fit(); -} - -// -// X680x0 ソフトウェアキーボード (ウィンドウ) -// + if (vmtype == VMTYPE_X68030) { + panel = new WXX68kSoftKeyPanel(this); + } else { + panel = new WXLunaSoftKeyPanel(this); + } -// コンストラクタ -WXX68kSoftKeyWindow::WXX68kSoftKeyWindow(wxWindow *parent, wxWindowID id) - : inherited(parent, id, _("Software Keyboard")) -{ - panel = new WXX68kSoftKeyPanel(this); + topsizer->Add(panel, 0, wxEXPAND); + SetSizer(topsizer); // 大きさをそれに固定 - Layout(); Fit(); } // デストラクタ -WXX68kSoftKeyWindow::~WXX68kSoftKeyWindow() +WXSoftKeyWindow::~WXSoftKeyWindow() { } - -// フォントサイズ変更 -void -WXX68kSoftKeyWindow::SetFontSize(fontsize_t fontsize) -{ - panel->SetFontSize(fontsize); - // 大きさ変更 - Layout(); - Fit(); -}