|
|
1.1 root 1: //
2: // nono
1.1.1.4 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.11 root 7: //
8: // メイン画面パネル
9: //
10:
1.1.1.4 root 11: #include "wxmainview.h"
1.1.1.11 root 12: #include "wxuimessage.h"
13: #include "bitmap.h"
1.1.1.10 root 14: #include "config.h"
1.1.1.11 root 15: #include "event.h"
1.1 root 16: #include "keyboard.h"
17: #include "renderer.h"
18: #include <wx/event.h>
19:
20: //#define KEYDEBUG 1
1.1.1.2 root 21: //#define MOUSEDEBUG 1
1.1 root 22:
23: #if defined(KEYDEBUG)
1.1.1.2 root 24: #define DKPRINTF(...) printf(__VA_ARGS__)
1.1 root 25: #else
1.1.1.2 root 26: #define DKPRINTF(...) /**/
27: #endif
28:
29: #if defined(MOUSEDEBUG)
30: #define DMPRINTF(...) printf(__VA_ARGS__)
31: #else
32: #define DMPRINTF(...) /**/
1.1 root 33: #endif
34:
35: // 再描画矩形の指定方法について。
36: // DoRefresh() にて、VM スレッドが自発的に画面を更新する際は、
37: // パフォーマンスの観点からも更新矩形だけを再描画すべき。
38: // これを wxWidgets に指示するのが wxWindow::Refresh{,Rect}() であるが
39: // 一部のプラットフォームではこれを呼び出すと、アプリケーションウィンドウ
40: // 全体がささってしまい、MainView だけでなくメニューバーも含めたすべてが
41: // 再描画できなくなってしまう。仕方がないので、これらのプラットフォームでは
42: // Refresh{,Rect}() を呼ばず、再描画矩形を画面全体として運用する。
43: // ちょっと無駄なだけなので (動かないことに比べれば) 気にしない。
44: //
1.1.1.4 root 45: // 今のところ NetBSD (5.0 以降) と OpenBSD(/amd64)(-6.7)
46: // (と Linux (CentOS 6.3/x86_64)) が該当する。
47: #if defined(__NetBSD__) || defined(__OpenBSD__)
1.1 root 48: #define DONT_USE_REFRESH 1
49: #endif
50:
51: WXMainView *gMainView;
52:
53: wxBEGIN_EVENT_TABLE(WXMainView, inherited)
54: EVT_PAINT(WXMainView::OnPaint)
55: EVT_KEY_DOWN(WXMainView::OnKeyDown)
56: EVT_KEY_UP(WXMainView::OnKeyUp)
1.1.1.10 root 57: EVT_CHAR(WXMainView::OnChar)
1.1.1.2 root 58: EVT_MOUSE_EVENTS(WXMainView::OnMouse)
1.1.1.12! root 59: EVT_MOUSE_CAPTURE_LOST(WXMainView::OnMouseCaptureLost)
1.1 root 60: wxEND_EVENT_TABLE()
61:
62: WXMainView::WXMainView(wxWindow *parent)
63: : inherited(parent)
64: {
65: // 仮想画面(VM が描画する画面)
66: rendwidth = gRenderer->GetWidth();
67: rendheight = gRenderer->GetHeight();
68:
1.1.1.11 root 69: gRenderer->Enable();
70:
71: // VM からの通知を受け取る
72: WXUIMessage::Connect(UIMessage::RENDER, this,
73: wxCommandEventHandler(WXMainView::OnRender));
1.1 root 74:
75: // 実画面 (ウィンドウの大きさ)
76: DoResize(screen_scale);
77:
1.1.1.11 root 78: // 更新間隔
79: gRenderer->SetRefreshInterval(33_msec);
1.1.1.5 root 80:
81: // 最初に一度描画
82: Refresh();
1.1 root 83: }
84:
85: WXMainView::~WXMainView()
86: {
1.1.1.10 root 87: // マウスをリリースしないと Assert される
88: if (HasCapture()) {
89: ReleaseMouse();
90: }
1.1.1.11 root 91: WXUIMessage::Disconnect(UIMessage::RENDER,
92: wxCommandEventHandler(WXMainView::OnRender));
1.1.1.10 root 93: }
94:
95: // (設定反映などの) 初期化
96: bool
97: WXMainView::Init()
98: {
99: // キーボードの入力モードの初期値設定
100: const ConfigItem& item_input = gConfig->Find("hostkbd-input");
101: const std::string input_mode = item_input.AsString();
102: if (input_mode == "char") {
103: SetCharInputMode(true);
104: } else if (input_mode == "jp") {
105: // 今は二択しかないのでちょっと噛み合ってないが
106: SetCharInputMode(false);
107: } else {
108: item_input.Err();
109: return false;
110: }
111:
112: return true;
1.1 root 113: }
114:
1.1.1.11 root 115: // 終了用に描画を停止する
1.1 root 116: void
1.1.1.11 root 117: WXMainView::Close()
1.1 root 118: {
1.1.1.11 root 119: // これで OnPaint() が何もせず帰るようになる。
120: viewwidth = 0;
121: viewheight = 0;
1.1 root 122: }
123:
1.1.1.11 root 124: // リフレッシュ要求イベント
1.1 root 125: void
1.1.1.11 root 126: WXMainView::OnRender(wxCommandEvent& event)
1.1 root 127: {
128: #if defined(DONT_USE_REFRESH)
129: // Refresh{,Rect}() が使えないので、再描画範囲は常に全体とする
130: #else
131: // 再描画範囲を更新矩形に限定
132: // XXX のはずだが、今の所全体
133: RefreshRect(wxRect(0, 0, viewwidth, viewheight), false);
134: #endif
1.1.1.11 root 135: // 実際に再描画する
136: Refresh();
137: // TODO: ビデオモニタにも通知する
1.1 root 138: }
139:
140: // 描画イベント
141: void
142: WXMainView::OnPaint(wxPaintEvent& event)
143: {
1.1.1.11 root 144: if (__predict_false(viewwidth == 0 || viewheight == 0)) {
1.1 root 145: return;
1.1.1.11 root 146: }
147:
148: const BitmapRGB& bitmap0 = gRenderer->GetBitmap();
149: BitmapRGB bitmap1;
150: uint8 *p = const_cast<uint8 *>(bitmap0.GetBuf());
1.1 root 151:
152: if (viewwidth != rendwidth || viewheight != rendheight) {
1.1.1.11 root 153: bitmap1.Create(viewwidth, viewheight);
154: Rect rect(0, 0, viewwidth, viewheight);
155: bitmap1.StretchDraw(rect, bitmap0);
156: p = bitmap1.GetBuf();
1.1 root 157: }
158:
1.1.1.11 root 159: wxImage image(viewwidth, viewheight, p, true);
160: wxBitmap bmp(image);
161:
162: // 実画面 DC にコピー
163: wxPaintDC dstDC(this);
164: dstDC.DrawBitmap(bmp, 0, 0);
1.1 root 165: }
166:
167: // リサイズ (UI スレッドから呼ぶこと)
168: void
169: WXMainView::DoResize(double scale)
170: {
171: screen_scale = scale;
172: int width = (double)rendwidth * scale;
173: int height = (double)rendheight * scale;
174: if (viewwidth != width || viewheight != height) {
175: // ウィンドウサイズ変更
176: viewwidth = width;
177: viewheight = height;
178: SetClientSize(viewwidth, viewheight);
1.1.1.8 root 179: SetMinClientSize(wxSize(viewwidth, viewheight));
1.1 root 180: }
181: }
182:
183: // 現在のスケールを返す。
184: // screen_scale は public static なので見えるんだけど一応お行儀で。
185: double
186: WXMainView::GetScale() const
187: {
188: return screen_scale;
189: }
190:
191: // 現在のスケール
192: /*static*/ double WXMainView::screen_scale;
193:
194:
195: //
1.1.1.2 root 196: // マウス入力
197: //
198:
199: // マウスモード設定
200: void
201: WXMainView::SetMouseMode(bool mode)
202: {
203: // XXX マウスモード ON にした時の座標を記憶してそこに戻るのはどうか
204:
205: mousemode = mode;
206: if (mousemode) {
207: // マウスモードを ON にする
208: DMPRINTF("SetMouseMode ON\n");
209:
210: // マウスカーソル OFF
211: ::wxSetCursor(wxCursor(wxCURSOR_BLANK));
212:
1.1.1.12! root 213: if (!HasCapture()) {
! 214: CaptureMouse();
! 215: }
1.1.1.4 root 216:
1.1.1.2 root 217: // このウィンドウから外れないように移動を検出し続けるため、
218: // マウスカーソルをウィンドウ中央に移す。
219: // ウィンドウとメニューバーが分離してる wxOSX のために必要。
220: MyWarpPointer(GetClientSize() / 2);
221: } else {
222: // マウスモードを OFF にする
223: DMPRINTF("SetMouseMode OFF\n");
224:
1.1.1.12! root 225: if (HasCapture()) {
! 226: ReleaseMouse();
! 227: }
1.1.1.4 root 228:
1.1.1.2 root 229: // 分かりやすさのため、マウスカーソルを中央へ戻してから復帰
1.1.1.4 root 230: wxSize pt = GetClientSize() / 2;
231: WarpPointer(pt.x, pt.y);
1.1.1.2 root 232:
233: // マウスカーソル ON
234: ::wxSetCursor(wxNullCursor);
235: }
236: }
237:
238: // マウスカーソルをクライアント座標 (x, y) に移動
239: void
240: WXMainView::MyWarpPointer(wxSize pos)
241: {
242: DMPRINTF("MyWarpPointer %d,%d\n", pos.x, pos.y);
243:
244: // この後の MDWarpPointer() でもう一度 EVT_MOTION が飛ぶので
245: // それを判別するためのフラグ。
246: motion_by_warp_pointer = true;
247:
248: WarpPointer(pos.x, pos.y);
249: }
250:
251: // マウスイベント
252: void
253: WXMainView::OnMouse(wxMouseEvent& event)
254: {
255: // マウスモードの時だけ処理。
256: // XXX 本当はイベントごと Disconnect したい
257: if (mousemode) {
258: bool leaving = event.Leaving();
259: bool moving = event.Moving();
1.1.1.3 root 260: bool dragging = event.Dragging();
1.1.1.2 root 261: // LeftDown() 等は押された時、LeftIsDown() 等は押されてる間 true。
262: bool rb = event.RightIsDown();
263: bool lb = event.LeftIsDown();
264: bool mb = event.MiddleIsDown();
1.1.1.5 root 265: const wxPoint& pos = event.GetPosition();
1.1.1.2 root 266: int dx = 0;
267: int dy = 0;
268:
1.1.1.3 root 269: #if defined(MOUSEDEBUG)
270: std::string dstr = "OnMouse";
271: if (moving || dragging || motion_by_warp_pointer) {
272: dstr += string_format(" (%d,%d)", pos.x, pos.y);
273: }
274: if (moving)
275: dstr += " Moving";
276: if (dragging)
277: dstr += " Dragging";
278: if (motion_by_warp_pointer)
279: dstr += " MotionByWarp";
1.1.1.4 root 280: if (lb || mb || rb) {
1.1.1.3 root 281: dstr += string_format(" Button(%c%c%c)",
282: (lb ? 'L' : '-'),
283: (mb ? 'M' : '-'),
284: (rb ? 'R' : '-'));
285: }
286: if (leaving)
287: dstr += " Leaving";
288: printf("%s\n", dstr.c_str());
289: #endif
1.1.1.2 root 290:
291: if (leaving) {
292: // タスクスイッチした時とかのための自動リリース
293: SetMouseMode(false);
294: }
295:
1.1.1.3 root 296: if (moving || dragging) {
1.1.1.2 root 297: // (My)WarpPointer() で自発的にマウスカーソルを移動させたことで
298: // 来る EVT_MOTION は無視する。
299: if (motion_by_warp_pointer) {
300: motion_by_warp_pointer = false;
301: // ここを基準点にする
302: prevpos = pos;
303: } else {
304: // 前回からの差を求める
305: dx = pos.x - prevpos.x;
306: dy = pos.y - prevpos.y;
307: prevpos = pos;
308:
309: // マウスカーソルを中心に戻す
310: if (dx != 0 || dy != 0) {
311: MyWarpPointer(GetClientSize() / 2);
312: }
313: }
314: }
315:
316: // VM に入力
1.1.1.3 root 317: if (dx != 0 ||
318: dy != 0 ||
319: lb != prevlb ||
320: mb != prevmb ||
321: rb != prevrb )
322: {
1.1.1.2 root 323: DMPRINTF(" Input dx=%d dy=%d %c%c%c\n",
324: dx, dy,
325: (lb ? 'L' : '-'),
326: (mb ? 'M' : '-'),
327: (rb ? 'R' : '-'));
328:
329: gKeyboard->MouseInput(dx, dy, rb, lb, mb);
330: }
1.1.1.3 root 331:
332: prevlb = lb;
333: prevmb = mb;
334: prevrb = rb;
1.1.1.2 root 335: }
336:
337: // EVT_LEFT_DOWN をデフォルト処理するため
338: event.Skip();
339: }
340:
1.1.1.12! root 341: // マウスキャプチャロスト
! 342: void
! 343: WXMainView::OnMouseCaptureLost(wxMouseCaptureLostEvent& event)
! 344: {
! 345: // 外部要因でマウスキャプチャをロストしたので、マウスモードを抜ける。
! 346: SetMouseMode(false);
! 347: }
! 348:
1.1.1.4 root 349: // アクティベートイベント。
350: // この(トップレベル)ウィンドウにフォーカスが当たるか外れるかで飛んでくる。
351: // 実際には WXMainFrame 宛てに飛んできたイベントをこちらに転送してある。
352: // マウスモード中にこのウィンドウからフォーカスが外れたら (例えば ALT+TAB の
353: // ようなウィンドウを切り替える操作)、マウスモードを解除するため。
354: void
355: WXMainView::OnActivate(wxActivateEvent& event)
356: {
357: // フォーカスが外れる際にマウスモード中ならマウスモードを解除
358: if (event.GetActive() == false) {
359: DMPRINTF("OnActivate FocusOut\n");
360: if (mousemode) {
361: SetMouseMode(false);
362: }
363: } else {
364: DMPRINTF("OnActivate FocusIn\n");
365: }
366: }
367:
368:
1.1.1.2 root 369: //
1.1 root 370: // キー入力
371: //
372:
373: // wxKeyEvent でキーコードを得るためのメソッドは
374: // GetKeyCode()、GetRawKeyCode()、GetRawKeyFlags() の3つが用意されていて
1.1.1.10 root 375: // wxWidgets の port (wxGTK、wxOSX とか) によってそれぞれ内容の定義が違う。
1.1 root 376: //
377: // wxGTK の場合
1.1.1.8 root 378: // GetKeyCode() が論理キーコードなのでこれをメインに使う。ただし左右 [SHIFT]
379: // のように論理キーコードだけでは区別の付かないものについては物理キー番号で
380: // ある GetRawKeyFlags() を併用する。
381: //
382: // 以下詳細。
1.1 root 383: // GetKeyCode() は wxWidgets の WXK_* (/usr/pkg/include/wx-3.0/wx/defs.h)。
1.1.1.8 root 384: // これは概ね論理キーコードであり、xorg.conf の swapcaps 設定や Xmodmap の
385: // 影響をうける。
386: // o 基本的に [SHIFT] キーの影響を受けないが、一部例外がある。
387: // - [^] (0x5e) と [SHIFT]+[^] (0x30)
388: // - [,] (0x2c) と [SHIFT]+[,] (0x3c)
389: // o [\] と [_] は同じ 0x5c になる ([SHIFT] 押しながらでも同様)。
390: // o [SHIFT], [CTRL], [ALT] の各左右キーは同じコードになる。
391: //
392: // GetRawKeyFlags() は物理キー番号ようだ。GDK の hardware keycode らしいが、
393: // それ以上の詳細は不明。
394: // o [SHIFT] キーの影響を受けない。
395: // GetKeyCode() では影響を受けた例外キーもここでは影響を受けない。
396: // o [SHIFT], [CTRL], [ALT] の各左右キーは違うコードになる。
1.1 root 397: //
398: // GetRawKeyCode() は GDK の keycode っぽい?
399: // (/usr/pkg/include/gtk-2.0/gdk/gdkkeysyms.h)。
400: // X11 の keysym から来てる? (/usr/X11R7/include/X11/keysymdef.h)。
1.1.1.8 root 401: // ただし [A] と [SHIFT]+[A] が違うコードを返すというか、文字コードで表現
402: // 出来る時は文字コード、みたいな感じになっているのでここでは使いづらい。
1.1 root 403: // 左右の SHIFT は区別可能。
404: //
405: // wxOSX の場合
406: // GetKeyCode()
1.1.1.8 root 407: // 英字キー [A] と [SHIFT]+[A] は同じコードになるが、
408: // 記号キー [1] と [SHIFT]+[1] は別になる体系のようだ。
409: // 左右の [SHIFT] は区別できない。
1.1 root 410: //
411: // GetRawKeyCode()
1.1.1.8 root 412: // これがたぶん物理キー番号。
413: // [1] と [SHIFT]+[1] は同じコードを返す。
414: // 左右の [SHIFT] は区別可能。
1.1 root 415: //
416: // GetRawKeyFlags() は状態フラグか何かのようだ。
417: //
418:
1.1.1.10 root 419: // 入力モード変更
420: void
421: WXMainView::SetCharInputMode(bool enable)
422: {
423: is_charinput = enable;
424: }
425:
1.1 root 426: // キーを押した
427: void
428: WXMainView::OnKeyDown(wxKeyEvent& event)
429: {
1.1.1.10 root 430: // メニューのアクセラレータのために必要
431: event.Skip();
432:
433: if (is_charinput) {
434: return;
435: }
436:
1.1.1.2 root 437: DKPRINTF("KeyDown ");
1.1 root 438: int keycode = GetKeyCode(event);
439: gKeyboard->MakeKey(keycode);
440: }
441:
442: // キーを離した
443: void
444: WXMainView::OnKeyUp(wxKeyEvent& event)
445: {
1.1.1.10 root 446: if (is_charinput) {
447: return;
448: }
449:
1.1.1.2 root 450: DKPRINTF("KeyUp ");
1.1 root 451: int keycode = GetKeyCode(event);
452: gKeyboard->BreakKey(keycode);
453: }
454:
1.1.1.10 root 455: // 文字による入力モード
456: void
457: WXMainView::OnChar(wxKeyEvent& event)
458: {
1.1.1.11 root 459: // メニューのアクセラレータのために必要
460: event.Skip();
461:
1.1.1.10 root 462: if (!is_charinput) {
463: return;
464: }
465:
466: uint ukey = event.GetUnicodeKey();
467: uint ukey_orig = ukey;
468: DKPRINTF("Char uni=0x%02x", ukey);
469: if (0x20 <= ukey && ukey < 0x7f) {
470: DKPRINTF(" '%c'", ukey);
471: }
472:
473: bool ctrl = event.ControlDown();
474: if (ctrl) {
475: DKPRINTF(" CTRL");
476:
477: // Ctrl + A .. Ctrl + Z までは 0x01(^A) .. 0x1a(^Z) の文字が来るが、
478: // Ctrl + 記号は記号の文字コードだけが送られてくるようだ。
479: // Ctrl + [ は 0x1b('^[') ではなく 0x5b('[') のような感じ。
480: // そこでこの場合は Ctrl キーが押されているかどうかを別途判定する。
481: if (0x40 <= ukey && ukey <= 0x5f) {
482: ukey -= 0x40;
483: // Ctrl+@ ('\0') はそのまま通せないので、別文字にエスケープ。
484: if (ukey == 0) {
485: ukey = CC_NUL;
486: }
487: }
488: }
489: // 文字コードが拾えなければキーコードから
490: if (ukey == WXK_NONE) {
491: uint wxkey = event.GetKeyCode();
492: DKPRINTF(" key=%3u(0x%03x)", wxkey, wxkey);
493: // 一部の特殊キーをここで対応。
494: // キーボード国籍による違いはないだろう。
495: switch (wxkey) {
496: case WXK_LEFT: ukey = CC_left; break;
497: case WXK_UP: ukey = CC_up; break;
498: case WXK_RIGHT: ukey = CC_right; break;
499: case WXK_DOWN: ukey = CC_down; break;
500: case WXK_F1: ukey = CC_F1; break;
501: case WXK_F2: ukey = CC_F2; break;
502: case WXK_F3: ukey = CC_F3; break;
503: case WXK_F4: ukey = CC_F4; break;
504: case WXK_F5: ukey = CC_F5; break;
505: case WXK_F6: ukey = CC_F6; break;
506: case WXK_F7: ukey = CC_F7; break;
507: case WXK_F8: ukey = CC_F8; break;
508: case WXK_F9: ukey = CC_F9; break;
509: case WXK_F10: ukey = CC_F10; break;
510: default:
511: ukey = 0;
512: break;
513: }
514: }
515: if (ukey != ukey_orig) {
516: DKPRINTF(" -> 0x%02x", ukey);
517: }
518: DKPRINTF("\n");
519: if (ukey == 0) {
520: return;
521: }
522: ukey &= 0xff;
523:
524: gKeyboard->CharInput(ukey);
525: }
526:
1.1 root 527: // 共通キーコードを取得する。
528: // 対応するキーがない場合は -1 を返す。
529: int
530: WXMainView::GetKeyCode(wxKeyEvent& event)
531: {
532: uint32 wxcode __unused = event.GetKeyCode();
533: uint32 rawcode __unused = event.GetRawKeyCode();
534: uint32 rawflags __unused = event.GetRawKeyFlags();
1.1.1.8 root 535: uint32 raw;
1.1 root 536: int keycode;
537:
1.1.1.8 root 538: // wx キーコードは10進、16進併記しないと読みづらい
539: DKPRINTF("key=%3d(0x%03x) ", wxcode, wxcode);
540: #if defined(__WXOSX__)
541: // wxOSX では raw が物理キー、flags はフラグっぽいものなので不要
542: DKPRINTF("raw=0x%02x (flags=0x%06x) ", rawcode, rawflags);
543: raw = rawcode;
544: #else
545: // wxGTK では flags が物理キー、raw は文字コードっぽいものなので不要
546: DKPRINTF("flags=0x%02x (raw=0x%04x) ", rawflags, rawcode);
547: raw = rawflags;
1.1 root 548: #endif
549:
1.1.1.8 root 550: // まず wx キーコードでテーブルを引く
551: if (wxcode < countof(keycode_table)) {
552: keycode = keycode_table[wxcode];
1.1 root 553: } else {
554: keycode = KC_none;
555: }
1.1.1.8 root 556:
557: // wx キーコードは論理キーコードなので [SHIFT] キーの左右を区別できないが
558: // ここでは左右を区別したいので、物理キー番号を見て区別する。
559: if (keycode == KC_SHIFT) {
560: #if defined(__WXOSX__)
561: if (raw == 0x3c)
562: #else
563: if (raw == 0x3e)
564: #endif
565: {
566: keycode = KC_SHIFT_R;
567: } else {
568: keycode = KC_SHIFT_L;
569: }
570: }
1.1 root 571:
572: #if defined(__WXGTK__)
1.1.1.8 root 573: // wxGTK では日本語キーボードの一部のキーが論理キーコードだけでは
574: // 判定できないようだ
1.1 root 575:
1.1.1.8 root 576: // [0] と [SHIFT]+[^] が同じキーコードになるようだ
577: if (keycode == KC_0) {
578: if (raw == 0x15) {
579: keycode = KC_circum;
580: } else {
581: keycode = KC_0;
582: }
583: }
584: // [\] と [_] が同じキーコードになるようだ
585: if (keycode == KC_backslash) {
586: if (raw == 0xd3) {
587: keycode = KC_underscore;
588: } else {
589: keycode = KC_backslash;
590: }
591: }
592: #endif
593:
1.1.1.9 root 594: DKPRINTF("keycode=%d %s\n", keycode, Keyboard::GetKeyName(keycode).c_str());
1.1.1.8 root 595: return keycode;
596: }
597:
598: // wx キーコード(WXK_*)を共通キーコードに変換するテーブル。
599: // 一部このテーブルだけでは判定できないものがある。すぐ上の GetKeyCode() 参照。
600: // 値 0 は本当は KC_none と書くべきだが、こっちのほうが読みやすいので。
601: //
602: // XXX: OSX の [CAPS] は押す離すで一回分の Down しか来ないのでちょっと放置。
603: // XXX: OSX の [英数] と [かな] もちょっと放置。
1.1 root 604: /*static*/ const int
1.1.1.8 root 605: WXMainView::keycode_table[0x190] = {
606: 0, // 0x00
607: 0, // 0x01
608: 0, // 0x02
609: 0, // 0x03
610: 0, // 0x04
611: 0, // 0x05
612: 0, // 0x06
613: 0, // 0x07
614: KC_BS, // 0x08 WXK_BACK
615: KC_TAB, // 0x09 WXK_TAB
616: 0, // 0x0a
617: 0, // 0x0b
618: 0, // 0x0c
619: KC_enter, // 0x0d WXK_RETURN
620: 0, // 0x0e
621: 0, // 0x0f
622:
623: 0, // 0x10
624: 0, // 0x11
625: 0, // 0x12
626: 0, // 0x13
627: 0, // 0x14
628: 0, // 0x15
629: 0, // 0x16
630: 0, // 0x17
631: 0, // 0x18
632: 0, // 0x19
633: 0, // 0x1a
634: KC_ESC, // 0x1b WXK_ESCAPE
635: 0, // 0x1c
636: 0, // 0x1d
637: 0, // 0x1e
638: 0, // 0x1f
639:
640: KC_space, // 0x20 WXK_SPACE
641: KC_1, // 0x21 (OSX: [SHIFT]+[1])
642: KC_2, // 0x22 (OSX: [SHIFT]+[2])
643: KC_3, // 0x23 (OSX: [SHIFT]+[3])
644: KC_4, // 0x24 (OSX: [SHIFT]+[4])
645: KC_5, // 0x25 (OSX: [SHIFT]+[5])
646: KC_6, // 0x26 (OSX: [SHIFT]+[6])
647: KC_7, // 0x27 (OSX: [SHIFT]+[7])
648: KC_8, // 0x28 (OSX: [SHIFT]+[8])
649: KC_9, // 0x29 (OSX: [SHIFT]+[9])
650: KC_colon, // 0x2a (OSX: [SHIFT]+[:])
651: KC_semicolon, // 0x2b (OSX: [SHIFT]+[;])
652: KC_comma, // 0x2c
653: KC_minus, // 0x2d
654: KC_period, // 0x2e
655: KC_slash, // 0x2f
656:
657: KC_0, // 0x30 (GTK: [0] と [SHIFT]+[^])
658: KC_1, // 0x31
659: KC_2, // 0x32
660: KC_3, // 0x33
661: KC_4, // 0x34
662: KC_5, // 0x35
663: KC_6, // 0x36
664: KC_7, // 0x37
665: KC_8, // 0x38
666: KC_9, // 0x39
667: KC_colon, // 0x3a
668: KC_semicolon, // 0x3b
669: KC_comma, // 0x3c (GTK: [,]は0x2c だが [SHIFT]+[,]は0x3c)
670: KC_minus, // 0x3d (OSX: [SHIFT]+[-])
671: KC_period, // 0x3e (OSX: [SHIFT]+[.])
672: KC_slash, // 0x3f (OSX: [SHIFT]+[/])
673:
674: KC_at, // 0x40
675: KC_A, // 0x41
676: KC_B, // 0x42
677: KC_C, // 0x43
678: KC_D, // 0x44
679: KC_E, // 0x45
680: KC_F, // 0x46
681: KC_G, // 0x47
682: KC_H, // 0x48
683: KC_I, // 0x49
684: KC_J, // 0x4a
685: KC_K, // 0x4b
686: KC_L, // 0x4c
687: KC_M, // 0x4d
688: KC_N, // 0x4e
689: KC_O, // 0x4f
690:
691: KC_P, // 0x50
692: KC_Q, // 0x51
693: KC_R, // 0x52
694: KC_S, // 0x53
695: KC_T, // 0x54
696: KC_U, // 0x55
697: KC_V, // 0x56
698: KC_W, // 0x57
699: KC_X, // 0x58
700: KC_Y, // 0x59
701: KC_Z, // 0x5a
702: KC_bracketleft, // 0x5b
703: KC_backslash, // 0x5c (GTK: [\] と [_])
704: KC_bracketright,// 0x5d
705: KC_circum, // 0x5e
706: KC_underscore, // 0x5f (OSX: [_])
707:
708: KC_at, // 0x60 (OSX: [SHIFT]+[@])
709: 0, // 0x61
710: 0, // 0x62
711: 0, // 0x63
712: 0, // 0x64
713: 0, // 0x65
714: 0, // 0x66
715: 0, // 0x67
716: 0, // 0x68
717: 0, // 0x69
718: 0, // 0x6a
719: 0, // 0x6b
720: 0, // 0x6c
721: 0, // 0x6d
722: 0, // 0x6e
723: 0, // 0x6f
724:
725: 0, // 0x70
726: 0, // 0x71
727: 0, // 0x72
728: 0, // 0x73
729: 0, // 0x74
730: 0, // 0x75
731: 0, // 0x76
732: 0, // 0x77
733: 0, // 0x78
734: 0, // 0x79
735: 0, // 0x7a
736: KC_bracketleft, // 0x7b (OSX: [SHIFT]+[[])
737: KC_backslash, // 0x7c (OSX: [SHIFT]+[\])
738: KC_bracketright,// 0x7d (OSX: [SHIFT]+[]])
739: KC_circum, // 0x7e (OSX: [SHIFT]+[^])
740: KC_DEL, // 0x7f
741:
742: 0,0,0,0, 0,0,0,0, // 0x80
743: 0,0,0,0, 0,0,0,0, // 0x88
744: 0,0,0,0, 0,0,0,0, // 0x90
745: 0,0,0,0, 0,0,0,0, // 0x98
746:
747: 0, // 0xa0
748: 0, // 0xa1
749: 0, // 0xa2
750: 0, // 0xa3
751: 0, // 0xa4
752: KC_backslash, // 0xa5 (OSX: [\])
753: 0, // 0xa6
754: 0, // 0xa7
755: 0, // 0xa8
756: 0, // 0xa9
757: 0, // 0xaa
758: 0, // 0xab
759: 0, // 0xac
760: 0, // 0xad
761: 0, // 0xae
762: 0, // 0xaf
763:
764: 0,0,0,0, 0,0,0,0, // 0xb0
765: 0,0,0,0, 0,0,0,0, // 0xb8
766:
767: 0, // 0xc0=192
768: 0, // 193 WXK_SPECIAL1
769: 0, // 194 WXK_SPECIAL2
770: 0, // 195 WXK_SPECIAL3
771: 0, // 196 WXK_SPECIAL4
772: 0, // 197 WXK_SPECIAL5
773: 0, // 198 WXK_SPECIAL6
774: 0, // 199 WXK_SPECIAL7
775:
776: 0, // 200 WXK_SPECIAL8
777: 0, // 201 WXK_SPECIAL9
778: 0, // 202 WXK_SPECIAL10
779: 0, // 203 WXK_SPECIAL11
780: 0, // 204 WXK_SPECIAL12
781: 0, // 205 WXK_SPECIAL13
782: 0, // 206 WXK_SPECIAL14
783: 0, // 207 WXK_SPECIAL15
784: 0, // 208 WXK_SPECIAL16
785: 0, // 209 WXK_SPECIAL17
786:
787: 0, // 210 WXK_SPECIAL18
788: 0, // 211 WXK_SPECIAL19
789: 0, // 212 WXK_SPECIAL20
790: 0, // 0xd5
791: 0, // 0xd6
792: 0, // 0xd7
793:
794: 0,0,0,0, 0,0,0,0, // 0xd8
795: 0,0,0,0, 0,0,0,0, // 0xe0
796: 0,0,0,0, 0,0,0,0, // 0xe8
797: 0,0,0,0, 0,0,0,0, // 0xf0
798: 0,0,0,0, 0,0,0,0, // 0xf8
799: 0,0,0,0, 0,0,0,0, // 0x100
800: 0,0,0,0, 0,0,0,0, // 0x108
801: 0,0,0,0, 0,0,0,0, // 0x110
802: 0,0,0,0, 0,0,0,0, // 0x118
803: 0,0,0,0, 0,0,0,0, // 0x120
804:
805: 0, // 0x128
806: 0, // 0x129
807: 0, // 0x12a
808: 0, // 0x12b
809: //
810: // WXK_* は10進数で定義されていて、特殊キーは 300 (=0x12c) から。
811: //
812: 0, // 300 WXK_START
813: 0, // 301 WXK_LBUTTON
814: 0, // 302 WXK_RBUTTON
815: 0, // 303 WXK_CANCEL
816: 0, // 304 WXK_MBUTTON
817: 0, // 305 WXK_CLEAR
818: KC_SHIFT, // 306 WXK_SHIFT (左右[SHIFT])
819: 0, // 307 WXK_ALT
820: KC_CTRL, // 308 WXK_CONTROL (ゲストに右[CTRL]はないので区別不要)
821: 0, // 309 WXK_MENU
822:
823: 0, // 310 WXK_PAUSE
824: 0, // 311 WXK_CAPITAL
825: 0, // 312 WXK_END
1.1.1.11 root 826: KC_HOME, // 313 WXK_HOME
1.1.1.8 root 827: KC_left, // 314 WXK_LEFT
828: KC_up, // 315 WXK_UP
829: KC_right, // 316 WXK_RIGHT
830: KC_down, // 317 WXK_DOWN
831: 0, // 318 WXK_SELECT
832: 0, // 319 WXK_PRINT
833:
834: 0, // 320 WXK_EXECUTE
835: 0, // 321 WXK_SNAPSHOT
836: KC_INS, // 322 WXK_INSERT
837: 0, // 323 WXK_HELP
838: KC_PAD_0, // 324 WXK_NUMPAD0
839: KC_PAD_1, // 325 WXK_NUMPAD1
840: KC_PAD_2, // 326 WXK_NUMPAD2
841: KC_PAD_3, // 327 WXK_NUMPAD3
842: KC_PAD_4, // 328 WXK_NUMPAD4
843: KC_PAD_5, // 329 WXK_NUMPAD5
844:
845: KC_PAD_6, // 330 WXK_NUMPAD6
846: KC_PAD_7, // 331 WXK_NUMPAD7
847: KC_PAD_8, // 332 WXK_NUMPAD8
848: KC_PAD_9, // 333 WXK_NUMPAD9
849: 0, // 334 WXK_MULTIPLY
850: 0, // 335 WXK_ADD
851: 0, // 336 WXK_SEPARATOR
852: 0, // 337 WXK_SUBTRACT
853: 0, // 338 WXK_DECIMAL
854: 0, // 339 WXK_DIVIDE
855:
856: KC_F1, // 340 WXK_F1
857: KC_F2, // 341 WXK_F2
858: KC_F3, // 342 WXK_F3
859: KC_F4, // 343 WXK_F4
860: KC_F5, // 344 WXK_F5
861: KC_F6, // 345 WXK_F6
862: KC_F7, // 346 WXK_F7
863: KC_F8, // 347 WXK_F8
864: KC_F9, // 348 WXK_F9
865: KC_F10, // 349 WXK_F10
866:
867: 0, // 350 WXK_F11
868: 0, // 351 WXK_F12
869: 0, // 352 WXK_F13
870: 0, // 353 WXK_F14
871: 0, // 354 WXK_F15
872: 0, // 355 WXK_F16
873: 0, // 356 WXK_F17
874: 0, // 357 WXK_F18
875: 0, // 358 WXK_F19
876: 0, // 359 WXK_F20
877:
878: 0, // 360 WXK_F21
879: 0, // 361 WXK_F22
880: 0, // 362 WXK_F23
881: 0, // 363 WXK_F24
882: 0, // 364 WXK_NUMLOCK
883: 0, // 365 WXK_SCROLL
884: 0, // 366 WXK_PAGEUP
885: 0, // 367 WXK_PAGEDOWN
886: 0, // 368 WXK_NUMPAD_SPACE
887: 0, // 369 WXK_NUMPAD_TAB
888:
889: KC_PAD_enter, // 370 WXK_NUMPAD_ENTER
890: 0, // 371 WXK_NUMPAD_F1
891: 0, // 372 WXK_NUMPAD_F2
892: 0, // 373 WXK_NUMPAD_F3
893: 0, // 374 WXK_NUMPAD_F4
894: 0, // 375 WXK_NUMPAD_HOME
895: 0, // 376 WXK_NUMPAD_LEFT
896: 0, // 377 WXK_NUMPAD_UP
897: 0, // 378 WXK_NUMPAD_RIGHT
898: 0, // 379 WXK_NUMPAD_DOWN
899:
900: 0, // 380 WXK_NUMPAD_PAGEUP
901: 0, // 381 WXK_NUMPAD_PAGEDOWN
902: 0, // 382 WXK_NUMPAD_END
903: 0, // 383 WXK_NUMPAD_BEGIN
904: 0, // 384 WXK_NUMPAD_INSERT
905: 0, // 385 WXK_NUMPAD_DELETE
1.1.1.10 root 906: KC_PAD_equal, // 386 WXK_NUMPAD_EQUAL
1.1.1.8 root 907: KC_PAD_multiply,// 387 WXK_NUMPAD_MULTIPLY
908: KC_PAD_plus, // 388 WXK_NUMPAD_ADD
909: 0, // 389 WXK_NUMPAD_SEPARATOR
910:
911: KC_PAD_minus, // 390 WXK_NUMPAD_SUBTRACT
912: KC_PAD_decimal, // 391 WXK_NUMPAD_DECIMAL
913: KC_PAD_divide, // 392 WXK_NUMPAD_DIVIDE
914: 0, // 393 WXK_WINDOWS_LEFT
915: 0, // 394 WXK_WINDOWS_RIGHT
916: 0, // 395 WXK_WINDOWS_MENU
917: // WXK_RAW_CONTROL は wxOSX でのみ定義してあり (wxOSX 以外では別名)、
918: // wxOSX とそれ以外とで定義済みキーの最大値が違う。そこが可変だとこの
919: // テーブルが困るので、wxOSX 以外でも常に WXK_RAW_CONTROL 分の枠は用意
920: // することにする。wxOSX 以外だと飛んでこないというだけで害はない。
921: KC_CTRL, // 396 WXK_RAW_CONTROL (OSX)
922:
923: 0, // 397
924: 0, // 398
925: 0, // 399=0x18f
1.1 root 926: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.