|
|
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.