« 2017年2月 | トップページ | 2017年4月 »

2017年3月

2017年3月22日 (水)

言語依存データの外部ファイル化について考える その3

バイナリファイル化について検討しました。

基本的には現在 Qt Brynhildr が内部的に持っている情報をそのままバイナリファイルとして出力したものになります。次回からはなんにも考えず、このファイルを読み込めばよいことになります。ただし、最低限の内容チェックは必要ですけど。

暫定ですが拡張子はこんな感じ。

テキスト形式: Japanese.lng

バイナリ形式: Japanese.lngx

以下書きかけのドキュメントから。

==========================================================================================
[バイナリ形式]
==========================================================================================

起動時に解析結果をバイナリ化し、次回以降はこのバイナリファイルを読み込む。
ただし、テキスト形式が更新されていた場合は再解析し、バイナリファイルも更新する。

このバイナリファイルは基本的にインストールされているマシンでのみ有効とする。
つまり、他のプラットフォームにバイナリファイルをコピーしてはならない。
(データアライン、バイトオーダーはプラットフォームに依存するため)

以下の3つのパートから成る。

1) LFHeader

ファイルヘッダー情報と言語情報フェーズ([Geneal]セクション)の情報を含む。

2) Keys Entries (* keynum)

Eventconverter::KeyEventのデータをkeynum個分を含む。

3) SoftKeys Entrise (* softkeynum)

SoftwareKeyboard::KeyTopInfoのデータをsoftkeynum個分を含む。

------------------------------------------------------------------------------------------
1) LFHeader
------------------------------------------------------------------------------------------

typedef struct {
// File Header
char magic[4]; // file magic
char padding[4]; // padding
int spec; // SpecVersion
int size; // file size
int keynum; // Keys Entry Num
int softkeynum; // SoftKeys Entry Num

// [General] Section
char name[64]; // Name strings
char author[64]; // Author strings
} LFHeader;


-- ファイルヘッダー --

magic : ファイルマジック ("LF00") : 暫定

spac : SpecVersionの値

size : バイナリファイルのトータルサイズ

keynum : 物理キーボード定義フェーズの情報のエントリ数

softkeynum : ソフトウェア・キーボード定義フェーズの情報のエントリ数

-- [Geneal]セクションの情報 --

name : [Geneal]セクションのNameの値(文字列)

author : [Geneal]セクションのAuthorの値(文字列)

------------------------------------------------------------------------------------------
2) Keys Entries (* keynum)
------------------------------------------------------------------------------------------

物理キーボード定義フェーズの情報を解析した結果をバイナリ形式で保持する。

プラットフォーム指定を解決済みのデータとなるためプラットフォーム指定の情報はこれには含まれない。

------------------------------------------------------------------------------------------
3) SoftKeys Entrise (* softkeynum)
------------------------------------------------------------------------------------------

ソフトウェア・キーボード定義フェーズの情報を解析した結果をバイナリ形式で保持する。

------------------------- ここまで ------------------------------------------


テキスト形式を解析する機能の実装はもう少し時間がかかるので、先にバイナリ形式ファイルを読み込むところを作っておこうと思います。

起動時に特定のフォルダに存在する .lngx ファイルをすべてチェックして、選択可能なキーボードタイプのリストを構成し、「サーバに接続」ダイアログで選択可能とする、という流れですね。

現在ソースコード中にハードコーディングしている言語依存情報をファイルに出力させるコードを暫定で入れて、手動でテスト用のバイナリファイル(Japanese,lngxとUS.lngx)を作成しました。

これを使って実装を進めようと思います。

私の環境で Japanese.lngx は3160バイト、US.lngx は3124バイトです。

Ws000000

(追記)

手動で作ったテスト用バイナリが間違えていました。

文字列データを保存していた Qstring (のポインタ) をそのまま保存していたので、文字列データをちゃんと保存するように変更し、作り直しました。少しサイズが増えて、それぞれ3964バイト/3928バイトとなりました。

2017年3月19日 (日)

言語依存データの外部ファイル化について考える その2


とりあえず字句解析します。

ダブルクオート(")の中では'\'をエスケープ文字としますが'\'の次の文字列そのものを有効にする機能以外はサポートしません、例えば"\n"とか"\t"とか"\045"や"\u2191"とかです。あと文字列長チェックが必要ですが、とりあえずテストなのでチェックしていません。

昔の記憶を思い出しながら、langfile.lex を書いてみました。

/* -*- mode: c; coding: utf-8-unix -*- */
/*
// -*- mode: c; coding: utf-8-unix -*-
// Copyright (c) 2017 FunFun < fu.aba.dc5@gmail.com>
//
// for c   : flex -o langfile.c langfile.lex ; gcc -o langfile langfile.c
// for c++ : flex -+ -o langfile.cpp langfile.lex ; g++ -o langfile -I. langfile.cpp
*/

%{
#ifdef __FLEX_LEXER_H
#include <cstdio>
#else // __FLEX_LEXER_H
#include <stdio.h>
#endif // __FLEX_LEXER_H
%}

ws			[ \t]+
comment		#.*
nl			\n
section		\[[a-zA-Z]+\]
key_id		Key_[a-zA-Z0-9_]+
vk_id		VK_[a-zA-Z0-9_]+
shiftkey	SHIFTKEY_NEED|SHIFTKEY_NONEED|SHIFTKEY_THROUGH
platform	Windows|macOS|Linux
string		[a-zA-Z_]+
number		[0-9]+
comma		,
equal		=
%x qstring

%%

  char string_buf[1024];
  char *string_buf_ptr;

\"	{
  string_buf_ptr = string_buf;
  BEGIN(qstring);
 }

<qstring>\"	{
  BEGIN(INITIAL);
  *string_buf_ptr = '\0';
  printf("qstring  = \"%s\"\n", string_buf);
 }

<qstring>\\(.|\n) {
  *string_buf_ptr++ = yytext[1];
 }

<qstring>[^\\\n\"]+ {
  char *yptr = yytext;

  while (*yptr){
	*string_buf_ptr++ = *yptr++;
  }
 }

{ws}		;
{comment}	{
  printf("comment  = %s\n", yytext);
}
{nl}		;
{comma}		;
{equal}		;
{section}	{
  printf("section  = %s\n", yytext);
}
{key_id}	{
  printf("key_id   = %s\n", yytext);
}
{vk_id}		{
  printf("vk_id    = %s\n", yytext);
}
{shiftkey}	{
  printf("shiftkey = %s\n", yytext);
}
{platform}	{
  printf("platform = %s\n", yytext);
}
{string}	{
  printf("string   = %s\n", yytext);
}
{number}	{
  printf("number   = %s\n", yytext);
}

%%

/* for TEST */
#ifdef __FLEX_LEXER_H
/* for C++ */
int yyFlexLexer::yywrap()
{
  return 1;
}

int main(int argc, char *argv[])
{
  yyFlexLexer lexer;
  lexer.yylex();
}
#else // __FLEX_LEXER_H
/* for C */
int yywrap()
{
  return 1;
}

int main(int argc, char *argv[])
{
  yylex();
}
#endif // __FLEX_LEXER_H



標準入力から Japanese.lng を読み込ませるとこんな出力になります。


comment  = # japanese keyboard layout
comment  = # Copyright (c) 2017 FunFun 
comment  = # spec version 1
section  = [General]
string   = Name
qstring  = "Japanese"
string   = Author
qstring  = "FunFun <fu.aba.dc5@gmail.com>"
string   = SpecVersion
number   = 1
section  = [Keys]
key_id   = Key_Escape
vk_id    = VK_ESCAPE
shiftkey = SHIFTKEY_THROUGH
key_id   = Key_Tab
vk_id    = VK_TAB
shiftkey = SHIFTKEY_THROUGH
key_id   = Key_Backspace
vk_id    = VK_BACK
shiftkey = SHIFTKEY_THROUGH
key_id   = Key_Return
vk_id    = VK_RETURN
shiftkey = SHIFTKEY_THROUGH
key_id   = Key_Enter
vk_id    = VK_RETURN
shiftkey = SHIFTKEY_THROUGH
key_id   = Key_Insert
vk_id    = VK_INSERT
shiftkey = SHIFTKEY_THROUGH

               :
            後略

なんとなく字句解析は出来ていそうです。

"SHIFTKEY_NEED", "SHIFTKEY_NONEED", "SHIFTKEY_THROUGH", "Windows", "macOS", "Linux" は予約語扱いになります。 "VK_" や "Key_" で始まるものは仮想キーコード、Qtのキー定数とみなしてチェックしますので、不正なものはエラーとする必要があります。

flex は C と C++ のコードを生成できるので、上記 lex コードの実行はどちらでも可能です。出来れば C++ コードで生成して利用したいのですが、macOS 上の clang だとなんかコンパイルエラーになるんですよね…なんででしょう?

(追記)

初回起動時に .lng を解析してバイナリファイルを作成し、実際はこのバイナリファイルを読み込もうかと思います。その場合、.lng が更新されていたら、再解析してバイナリファイルを作成し直す必要がありますねぇ。オプションにしましょうかね…

2017年3月18日 (土)

Android APK の準備 その2

Qt の機能でフルスクリーンに出来るのですが、バッテリー残量などが表示されている上部のステータスバーとナビゲーションバーは非表示にならないようです。

これらを非表示するに AndroidManifest.xml に設定を追加して、Anrdroid OS から Qt アプリケーションへの橋渡しのための java のコードに処理を追加する方法などが紹介されていますね。

いろいろ調べると橋渡しのための java コードへの処理追加で実現できそうな感じなので、まずは java コードに手を加える方向で試してみようと思います。

AndroidManifest.xml は標準のビルド時に作成されるものをコピ-して登録したのでこれに沿って java のソースコードも登録することにしました。将来的にはディレクトリ構成も要検討ですけど。

qtbrynhildr.pro の Android 向けの設定に以下を追加しました。


---- ここから ----

DISTFILES += \
$$PWD/../dist/android/src/org/qtproject/qt5/android/bindings/QtActivity.java \
$$PWD/../dist/android/src/org/qtproject/qt5/android/bindings/QtActivityLoader.java \
$$PWD/../dist/android/src/org/qtproject/qt5/android/bindings/QtApplication.java \
$$PWD/../dist/android/src/org/qtproject/qt5/android/bindings/QtLoader.java \
$$PWD/../dist/android/src/org/qtproject/qt5/android/bindings/QtService.java \
$$PWD/../dist/android/src/org/qtproject/qt5/android/bindings/QtServiceLoader.java

---- ここまで ----

次に、上記の6つのソースコードをコピーして、上記ディレクトリに配置してソースコード登録しました。

これで Qt Creator でのビルド時に上記のファイルをコピーしてビルドしてくれるようになるので、今後は上記のソースコードに処理を追加していくことにします。

2017年3月13日 (月)

Ver.1.6.7 リリース

シフトキーの状態の管理に不具合がありました。特定の条件で、シフトキーが押されたままの状態となることがあります。

例えば、日本語キーボードを使っているマシン上でQt Brynhildrを起動し、「英語キーボード」タイプを指定してサーバに接続した上で、`@`を入力した場合です。

日本語キーボードでは`@`はシフトキーを必要としませんが、英語キーボードではSHIFTキー + "2"キーなのでQtBrynhildrはシフトキーの押した/離したの情報を前後に挿入してサーバに送ってやる必要があります。挿入したシフトキーの情報の整合性が取れなくなった(シフトキーを押したあと、離したという情報が送られなかった)ため、結果シフトキーが押しっぱなしになったというのが不具合の内容です。

通常の使い方と思われる、サーバとクライアントで同じタイプのキーボードを使っている場合は通常発生しませんが、上記のように異なるタイプのキーボードを指定した場合や特殊なキーボードを使っている場合に発生する可能性があります。

以下からダウンロードできます。(Windows/Linux/Mac版)

https://github.com/funfun-dc5/qtbrynhildr/releases

主な変更は以下です。

[不具合修正]
・一部の特殊なキーボードでシフトキーが押されたままの状態となる不具合修正
通常のキーボード操作でシフトキーの押下が必要な文字(例えば英語キーボードの'@')を
入力する場合に、シフトキーの押下を伴わない特殊なキーボードではシフトキーが
押されたままの状態となる。(シフトキーを一度叩くと解除できる)

[その他変更]
・MacOS版のアプリケーションメニューの多言語対応(日本語対応)

-----------------------------------------------------------------------------------
[SHA256SUM]
-----------------------------------------------------------------------------------
5793a346a1cc194fe083c9bf515c98045f89edc5fade48db5f4c702fd03e9c84 *QtBrynhildr-documents-20170312.zip

f8fb72a16ce0f92325e8607962620bb5ddfe30f2ccdc6b75e65b344d0608854a *QtBrynhildr-linux_x64-v167.run

37323390d722020795c99612643819b6e0cceaed4a4de5674d4932dc97aefde9 *QtBrynhildr-linux_x86-v167.run

4ab5d82f8b7518bd2c24b5fd7aa0b519b8667838938ce81a9bc1c111ce3948b4 *QtBrynhildr-macosx_x64-v167.dmg

97c1261220a4db144f5ab9357a3818b0645e01f713f649b7c1a4fd06498a8ec1 *QtBrynhildr-windows-v167.exe

2017年3月10日 (金)

言語依存データの外部ファイル化について考える その1

現在、物理キーボードとソフトウェア・キーボードの英語/日本語対応機能はソースコード(クラス内部)に 決め打ち(ハードコーディング)した情報を切り替えることで実現しています。

もともとソースコードレベルで日本語/英語を用意していたので、他の言語に対応しようとするとその言語用に 修正したソースコードを提供してもらい、ビルドし直す必要がありました。

この場合ソースコードの中身を理解しないと新しい言語に対応できませんし、気軽にテストも出来ません。 これを改善するため、現在決め打ちしている情報を外部テキストファイルとして用意し、特定のディレクトリに 配置すれば起動時に読み込むという感じにしようと思います。

#といっても日本語/英語以外が今必要なのか否か謎ですけど。

力技で外部ファイル解析出来ないことはないでしょうけど、後々のためflexとbisonで字句解析/構文解析 すればいいかなと思います。

(追記)

今の所flexでの字句解析までテスト用コードで確認しました。

==========================================================================================
[概要]
==========================================================================================

言語情報ファイルは以下の3つのフェーズからなる。

1. 言語情報フェーズ

 Qt Brynhildrが言語情報として識別するための情報群

2. 物理キーボード定義フェーズ

 Qt::Key_* と VK_* の対応情報、SHIFTキーの要/不要/関係なし, プラットフォーム指定 の情報

3. ソフトウェア・キーボード定義フェーズ

 ソフトウェアのキーとキートップ文字列の対応情報(通常時、SHIFTキー押下時、Fnキー押下時)

==========================================================================================
[詳細]
==========================================================================================

------------------------------------------------------------------------------------------
0. 全体について
------------------------------------------------------------------------------------------

 (1) '#'以降は改行までコメントとみなす。

 (2) 空白、タブは無視する。

 (3) 各情報はフェーズ名([General]/[Keys]/[SoftKeys])で区切る。

 (4) 文字コードはUTF-8Nを想定

 (5) 不明なKey_名, VK_名はエラーとする。ただしVK_NONE_00は0とみなす。

------------------------------------------------------------------------------------------
1. 言語情報 (内容は要検討)
------------------------------------------------------------------------------------------

言語名 :

作成者名 :

------------------------------------------------------------------------------------------
2. 物理キーボード定義フェーズ
------------------------------------------------------------------------------------------

一行に以下の3つの情報を','で区切って記述する。ここで定義されないQt::Key_*キーは無視される。
プラットフォーム指定が必要な場合は','で区切ってプラットフォーム名を追加する。

Qt::Key_名 : Qt namespace に示されている定数Key_*の文字列、Qt::は不要

VK_名      : windowsの仮想キーコード文字列

SHIFTKEY_INFO : "SHIFTKEY_NEED"    : SHIFTキーが押されている必要がある
                "SHIFTKEY_NONEED"  : SHIFTキーが押されていない必要がある
                "SHIFTKEY_THROUGHT": SHIFTキーの状態は関係しない

プラットフォーム指定 : 指定されたプラットフォーム上の時だけ指定が有効となる。
                       同じKeyに関する指定があった場合はより下の行の設定が優先となる。
                       Windows/macOS/Linux が指定可能

                       なし -> すべてのプラットフォームで有効
                       macOS -> macOSのみで有効

Key_Control,            VK_CONTROL,     SHIFTKEY_THROUGH
Key_Control,            VK_LWIN,        SHIFTKEY_THROUGH, macOS # override on macOS

コントロールキーに関する指定である上記の場合、macOS以外の場合はVK_CONTROLが送出されるが
macOSの時はVK_LWINが送出される。

ex.)

[Keys]
Key_Escape,     VK_ESCAPE,  SHIFTKEY_THROUGH
Key_Tab,        VK_TAB,     SHIFTKEY_THROUGH
Key_Backspace,  VK_BACK,    SHIFTKEY_THROUGH
Key_QuoteDbl,   VK_2,       SHIFTKEY_NEED # for JP keyboard

------------------------------------------------------------------------------------------
3. ソフトウェア・キーボード定義フェーズ
------------------------------------------------------------------------------------------

一行に以下の6つの情報を','で区切って記述する。


1,  キーID
2., "キートップ文字列(通常)"
3,  "キートップ文字列(シフトキー押下時)"
4, 仮想キーコード名、
5, "キートップ文字列(Fn押下時)"
6,  Fnキー押下時に送る仮想キーコード名

キーID                              : SoftwareKeyboardクラスで定義されるキーID

キートップ文字列(通常)              : 通常時に表示する文字列
キートップ文字列(シフトキー押下時)  : シフトキー押下時に表示する文字列
仮想キーコード名                    : 送出する仮想キーコード名

キートップ文字列(Fn押下時)          : Fn押下時に表示する文字列
Fn押下時に送る仮想キーコード名      : Fn押下時に送出する仮想キーコード名

すべてのソフトウェア・キーについて定義しなければならない。足りない場合はエラーとする。

ex.)

[SoftKeys]
1, "Esc",  "Esc",  VK_ESCAPE,      "Esc",  VK_ESCAPE
2, "1",    "!",    VK_1,           "F1",   VK_F1
3, "2",    "\"",   VK_2,           "F2",   VK_F2

日本語キーボードのサンプルを作ってみました。

============================ ここから ================================================
# japanese keyboard layout sample file
# Copyright (c) 2017 FunFun 
# spec version 0.0.1

[General]

[Keys]
Key_Escape,             VK_ESCAPE,      SHIFTKEY_THROUGH
Key_Tab,                VK_TAB,         SHIFTKEY_THROUGH
Key_Backspace,          VK_BACK,        SHIFTKEY_THROUGH
Key_Return,             VK_RETURN,      SHIFTKEY_THROUGH
Key_Enter,              VK_RETURN,      SHIFTKEY_THROUGH
Key_Insert,             VK_INSERT,      SHIFTKEY_THROUGH
Key_Delete,             VK_DELETE,      SHIFTKEY_THROUGH
Key_Pause,              VK_PAUSE,       SHIFTKEY_THROUGH
Key_Print,              VK_SNAPSHOT,    SHIFTKEY_THROUGH
Key_SysReq,             VK_SNAPSHOT,    SHIFTKEY_THROUGH
Key_Clear,              VK_CLEAR,       SHIFTKEY_THROUGH
Key_Home,               VK_HOME,        SHIFTKEY_THROUGH
Key_End,                VK_END,         SHIFTKEY_THROUGH
Key_Left,               VK_LEFT,        SHIFTKEY_THROUGH
Key_Up,                 VK_UP,          SHIFTKEY_THROUGH
Key_Right,              VK_RIGHT,       SHIFTKEY_THROUGH
Key_Down,               VK_DOWN,        SHIFTKEY_THROUGH
Key_PageUp,             VK_PRIOR,       SHIFTKEY_THROUGH
Key_PageDown,           VK_NEXT,        SHIFTKEY_THROUGH
Key_Shift,              VK_SHIFT,       SHIFTKEY_THROUGH
Key_Meta,               VK_LWIN,        SHIFTKEY_THROUGH
Key_Meta,               VK_CONTROL,     SHIFTKEY_THROUGH, macOS # override on macOS
Key_Control,            VK_CONTROL,     SHIFTKEY_THROUGH
Key_Control,            VK_LWIN,        SHIFTKEY_THROUGH, macOS # override on macOS
Key_Alt,                VK_MENU,        SHIFTKEY_THROUGH
Key_CapsLock,           VK_CAPITAL,     SHIFTKEY_THROUGH
Key_NumLock,            VK_NUMLOCK,     SHIFTKEY_THROUGH
Key_ScrollLock,         VK_SCROLL,      SHIFTKEY_THROUGH

Key_F1,                 VK_F1,          SHIFTKEY_THROUGH
Key_F2,                 VK_F2,          SHIFTKEY_THROUGH
Key_F3,                 VK_F3,          SHIFTKEY_THROUGH
Key_F4,                 VK_F4,          SHIFTKEY_THROUGH
Key_F5,                 VK_F5,          SHIFTKEY_THROUGH
Key_F6,                 VK_F6,          SHIFTKEY_THROUGH
Key_F7,                 VK_F7,          SHIFTKEY_THROUGH
Key_F8,                 VK_F8,          SHIFTKEY_THROUGH
Key_F9,                 VK_F9,          SHIFTKEY_THROUGH
Key_F10,                VK_F10,         SHIFTKEY_THROUGH
Key_F11,                VK_F11,         SHIFTKEY_THROUGH
Key_F12,                VK_F12,         SHIFTKEY_THROUGH
Key_F13,                VK_F13,         SHIFTKEY_THROUGH
Key_F14,                VK_F14,         SHIFTKEY_THROUGH
Key_F15,                VK_F15,         SHIFTKEY_THROUGH
Key_F16,                VK_F16,         SHIFTKEY_THROUGH
Key_F17,                VK_F17,         SHIFTKEY_THROUGH
Key_F18,                VK_F18,         SHIFTKEY_THROUGH
Key_F19,                VK_F19,         SHIFTKEY_THROUGH
Key_F20,                VK_F20,         SHIFTKEY_THROUGH
Key_F21,                VK_F21,         SHIFTKEY_THROUGH
Key_F22,                VK_F22,         SHIFTKEY_THROUGH
Key_F23,                VK_F23,         SHIFTKEY_THROUGH
Key_F24,                VK_F24,         SHIFTKEY_THROUGH

Key_0,                  VK_0,           SHIFTKEY_NONEED
Key_1,                  VK_1,           SHIFTKEY_NONEED
Key_2,                  VK_2,           SHIFTKEY_NONEED
Key_3,                  VK_3,           SHIFTKEY_NONEED
Key_4,                  VK_4,           SHIFTKEY_NONEED
Key_5,                  VK_5,           SHIFTKEY_NONEED
Key_6,                  VK_6,           SHIFTKEY_NONEED
Key_7,                  VK_7,           SHIFTKEY_NONEED
Key_8,                  VK_8,           SHIFTKEY_NONEED
Key_9,                  VK_9,           SHIFTKEY_NONEED

Key_A,                  VK_A,           SHIFTKEY_THROUGH
Key_B,                  VK_B,           SHIFTKEY_THROUGH
Key_C,                  VK_C,           SHIFTKEY_THROUGH
Key_D,                  VK_D,           SHIFTKEY_THROUGH
Key_E,                  VK_E,           SHIFTKEY_THROUGH
Key_F,                  VK_F,           SHIFTKEY_THROUGH
Key_G,                  VK_G,           SHIFTKEY_THROUGH
Key_H,                  VK_H,           SHIFTKEY_THROUGH
Key_I,                  VK_I,           SHIFTKEY_THROUGH
Key_J,                  VK_J,           SHIFTKEY_THROUGH
Key_K,                  VK_K,           SHIFTKEY_THROUGH
Key_L,                  VK_L,           SHIFTKEY_THROUGH
Key_M,                  VK_M,           SHIFTKEY_THROUGH
Key_N,                  VK_N,           SHIFTKEY_THROUGH
Key_O,                  VK_O,           SHIFTKEY_THROUGH
Key_P,                  VK_P,           SHIFTKEY_THROUGH
Key_Q,                  VK_Q,           SHIFTKEY_THROUGH
Key_R,                  VK_R,           SHIFTKEY_THROUGH
Key_S,                  VK_S,           SHIFTKEY_THROUGH
Key_T,                  VK_T,           SHIFTKEY_THROUGH
Key_U,                  VK_U,           SHIFTKEY_THROUGH
Key_V,                  VK_V,           SHIFTKEY_THROUGH
Key_W,                  VK_W,           SHIFTKEY_THROUGH
Key_X,                  VK_X,           SHIFTKEY_THROUGH
Key_Y,                  VK_Y,           SHIFTKEY_THROUGH
Key_Z,                  VK_Z,           SHIFTKEY_THROUGH

Key_Space,              VK_SPACE,       SHIFTKEY_THROUGH

Key_Exclam,             VK_1,           SHIFTKEY_NEED   # '!'
Key_QuoteDbl,           VK_2,           SHIFTKEY_NEED   # '"'
Key_NumberSign,         VK_3,           SHIFTKEY_NEED   # '#'
Key_Dollar,             VK_4,           SHIFTKEY_NEED   # '$'
Key_Percent,            VK_5,           SHIFTKEY_NEED   # '%'
Key_Ampersand,          VK_6,           SHIFTKEY_NEED   # '&'
Key_Apostrophe,         VK_7,           SHIFTKEY_NEED   # '''
Key_ParenLeft,          VK_8,           SHIFTKEY_NEED   # '('
Key_ParenRight,         VK_9,           SHIFTKEY_NEED   # ')'

Key_Asterisk,           VK_OEM_1,       SHIFTKEY_NEED   # '*'
Key_Plus,               VK_OEM_PLUS,    SHIFTKEY_NEED   # '+'
Key_Comma,              VK_OEM_COMMA,   SHIFTKEY_NONEED # ','
Key_Minus,              VK_OEM_MINUS,   SHIFTKEY_NONEED # '-'
Key_Period,             VK_OEM_PERIOD,  SHIFTKEY_NONEED # '.'
Key_Slash,              VK_OEM_2,       SHIFTKEY_NONEED # '/'

Key_Colon,              VK_OEM_1,       SHIFTKEY_NONEED # ':'
Key_Semicolon,          VK_OEM_PLUS,    SHIFTKEY_NONEED # ';'
Key_Less,               VK_OEM_COMMA,   SHIFTKEY_NEED   # '<'
Key_Equal,              VK_OEM_MINUS,   SHIFTKEY_NEED   # '='
Key_Greater,            VK_OEM_PERIOD,  SHIFTKEY_NEED   # '>'
Key_Question,           VK_OEM_2,       SHIFTKEY_NEED   # '?'
Key_At,                 VK_OEM_3,       SHIFTKEY_NONEED # '@'
Key_QuoteLeft,          VK_OEM_3,       SHIFTKEY_NEED   # '`'

Key_BracketLeft,        VK_OEM_4,       SHIFTKEY_NONEED # '['
Key_BraceLeft,          VK_OEM_4,       SHIFTKEY_NEED   # '{'
Key_Backslash,          VK_OEM_5,       SHIFTKEY_NONEED # '\'
Key_yen,                VK_OEM_5,       SHIFTKEY_NONEED # '\'
Key_Bar,                VK_OEM_5,       SHIFTKEY_NEED   # '|'
Key_Underscore,         VK_OEM_102,     SHIFTKEY_NEED   # '_'
Key_BracketRight,       VK_OEM_6,       SHIFTKEY_NONEED # ']'
Key_BraceRight,         VK_OEM_6,       SHIFTKEY_NEED   # '}'
Key_AsciiTilde,         VK_OEM_7,       SHIFTKEY_NEED   # '~'
Key_AsciiCircum,        VK_OEM_7,       SHIFTKEY_NONEED # '^'

Key_Henkan,             VK_CONVERT,     SHIFTKEY_THROUGH    # Convert
Key_Muhenkan,           VK_NONCONVERT,  SHIFTKEY_THROUGH    # NonConvert
Key_Zenkaku_Hankaku,    VK_KANJI,       SHIFTKEY_THROUGH    # Zenkaku_Hankaku

Key_Back,               VK_BROWSER_BACK,        SHIFTKEY_THROUGH
Key_Forward,            VK_BROWSER_FORWARD,     SHIFTKEY_THROUGH
Key_Refresh,            VK_BROWSER_REFRESH,     SHIFTKEY_THROUGH
Key_Stop,               VK_BROWSER_STOP,        SHIFTKEY_THROUGH
Key_Search,             VK_BROWSER_SEARCH,      SHIFTKEY_THROUGH
Key_Favorites,          VK_BROWSER_FAVORITES,   SHIFTKEY_THROUGH
Key_HomePage,           VK_BROWSER_HOME,        SHIFTKEY_THROUGH
Key_Forward,            VK_BROWSER_FORWARD,     SHIFTKEY_THROUGH
Key_VolumeMute,         VK_VOLUME_MUTE,         SHIFTKEY_THROUGH
Key_VolumeDown,         VK_VOLUME_DOWN,         SHIFTKEY_THROUGH
Key_VolumeUp,           VK_VOLUME_UP,           SHIFTKEY_THROUGH
Key_MediaNext,          VK_MEDIA_NEXT_TRACK,    SHIFTKEY_THROUGH
Key_MediaPrevious,      VK_MEDIA_PREV_TRACK,    SHIFTKEY_THROUGH
Key_MediaStop,          VK_MEDIA_STOP,          SHIFTKEY_THROUGH
Key_MediaTogglePlayPause,   VK_MEDIA_PLAY_PAUSE,    SHIFTKEY_THROUGH
Key_LaunchMail,         VK_LAUNCH_MAIL,         SHIFTKEY_THROUGH

[SoftKeys]
# 1st row
 1, "Esc",  "Esc",  VK_ESCAPE,      "Esc",  VK_ESCAPE
 2, "1",    "!",    VK_1,           "F1",   VK_F1
 3, "2",    "\"",   VK_2,           "F2",   VK_F2
 4, "3",    "#",    VK_3,           "F3",   VK_F3
 5, "4",    "$",    VK_4,           "F4",   VK_F4
 6, "5",    "%",    VK_5,           "F5",   VK_F5
 7, "6",    "&",    VK_6,           "F6",   VK_F6
 8, "7",    "'",    VK_7,           "F7",   VK_F7
 9, "8",    "(",    VK_8,           "F8",   VK_F8
10, "9",    ")",    VK_9,           "F9",   VK_F9
11, "0",    "",     VK_0,           "F10",  VK_F10
12, "-",    "=",    VK_OEM_MINUS,   "F11",  VK_F11
13, "^",    "~",    VK_OEM_7,       "F12",  VK_F12
14, "¥",    "|",   VK_OEM_5,       "Ins",  VK_INSERT
15, "BS",   "BS",   VK_BACK,        "Del",  VK_DELETE

# 2nd row
16, "Tab",  "Tab",  VK_TAB,         "Tab",  VK_TAB
17, "Q",    "Q",    VK_Q,           "Q",    VK_Q
18, "W",    "W",    VK_W,           "W",    VK_W
19, "E",    "E",    VK_E,           "E",    VK_E
20, "R",    "R",    VK_R,           "R",    VK_R
21, "T",    "T",    VK_T,           "T",    VK_T
22, "Y",    "Y",    VK_Y,           "Y",    VK_Y
23, "U",    "U",    VK_U,           "U",    VK_U
24, "I",    "I",    VK_I,           "I",    VK_I
25, "O",    "O",    VK_O,           "O",    VK_O
26, "P",    "P",    VK_P,           "P",    VK_P
27, "@",    "`",    VK_OEM_3,       "",     VK_NONE_00
28, "[",    "{",    VK_OEM_4,       "",     VK_NONE_00
29, "RET",  "RET",  VK_RETURN,      "RET",  VK_RETURN

# 3rd row
30, "Ctrl", "Ctrl", VK_LCONTROL,    "Ctrl", VK_LCONTROL
31, "A",    "A",    VK_A,           "A",    VK_A
32, "S",    "S",    VK_S,           "S",    VK_S
33, "D",    "D",    VK_D,           "D",    VK_D
34, "F",    "F",    VK_F,           "F",    VK_F
35, "G",    "G",    VK_G,           "G",    VK_G
36, "H",    "H",    VK_H,           "H",    VK_H
37, "J",    "J",    VK_J,           "J",    VK_J
38, "K",    "K",    VK_K,           "K",    VK_K
39, "L",    "L",    VK_L,           "L",    VK_L
40, ";",    "+",    VK_OEM_PLUS,    "",     VK_NONE_00
41, ":",    "*",    VK_OEM_1,       "Pause",VK_PAUSE
42, "]",    "}",    VK_OEM_6,       "PrtS", VK_SNAPSHOT

# 4th row
43, "Shift","Shift",VK_LSHIFT,      "Shift",VK_LSHIFT
44, "Z",    "Z",    VK_Z,           "Z",    VK_A
45, "X",    "X",    VK_X,           "X",    VK_Z
46, "C",    "C",    VK_C,           "C",    VK_C
47, "V",    "V",    VK_V,           "V",    VK_V
48, "B",    "B",    VK_B,           "B",    VK_B
49, "N",    "N",    VK_N,           "N",    VK_N
50, "M",    "M",    VK_M,           "M",    VK_M
51, ",",    "<",    VK_OEM_COMMA,   "",     VK_NONE_00
52, ".",    ">",    VK_OEM_PERIOD,  "",     VK_NONE_00
53, "/",    "?",    VK_OEM_2,       "",     VK_NONE_00
54, "¥",   "_",    VK_OEM_102,     "",     VK_NONE_00
55, "↑",   "↑",   VK_UP,          "PgU",  VK_PRIOR
56, "Shift","Shift",VK_RSHIFT,      "Shift",VK_RSHIFT

# 5th row
57, "Fn",   "Fn",   VK_NONE_00,     "Fn",   VK_NONE_00
58, "Alt",  "Alt",  VK_LMENU,       "Alt",  VK_LMENU
59, "Win",  "Win",  VK_LWIN,        "Win",  VK_LWIN
60, "JP",   "JP",   VK_KANJI,       "JP",   VK_KANJI
61, "Space","Space",VK_SPACE,       "Space",VK_SPACE
62, "Ctrl", "Ctrl", VK_RCONTROL,    "Ctrl", VK_RCONTROL
63, "Alt",  "Alt",  VK_RMENU,       "Alt",  VK_RMENU
64, "Fn",   "Fn",   VK_NONE_00,     "Fn",   VK_NONE_00
65, "←",   "←",   VK_LEFT,        "Home", VK_HOME
66, "↓",   "↓",   VK_DOWN,        "PgD",  VK_NEXT
67, "→",   "→",   VK_RIGHT,       "End",  VK_END


============================ ここまで ================================================

2017年3月 8日 (水)

macOS 版のアプリケーションメニューの日本語化

Qt BrynhildrのmacOS版ではアプリケーションメニューの項目だけが英語のままなので、カッコ悪いなぁと思っていたのでちょっと調べました。

Qt Assistant で検索してみると "locversion.plist" とかいうファイルをAppleが決めた所定の位置に置けと書いてあるのですが、よく分かりません。

さらに google先生にお尋ねすると Qt のパッケージに入っている qt_ja.qm を使えばいいと書いているページが ありました。

例えばMinGW版だとこんなところにありました。

Qt5.8.0/5.8/mingw53_32/translations/qt_ja.qm

早速このファイルをローカルにコピーして、追加する処理をmain関数に追加しました。

QTranslator appTranslator2;
appTranslator2.load(QTB_TRANSLATION_FILE_PATH "qt_" + QLocale::system().name(),  qApp->applicationDirPath());
app.installTranslator(&appTranslator2);
installTranslator() は翻訳情報を"追加で"インストールしてくれるそうなので、こうすれば元々ある Qt Brynhildrの翻訳情報に追加されるようです。

早速macOS上でリビルドして実行してみました。

「全然変わらない…」、英語のままでした。

仕方がないので、qt_ja.qm のサイズを調べてみると165バイトしかありません。

"なんかおかしいなぁ"と思い、lconvert というコマンドで .ts に変換すると

lconvert -i qt_ja.qm -o qt_ja.ts -if qm -of ts














うーん、依存関係を書いてあるだけなので上記の5つのファイルもコピーしてこないとだめなのですかねぇ…
全然関係ないファイルのような気がしますし。

まず、それっぽい qt_base_ja.qm だけコピーしてきました。

lconvertでこれを qtbase_ja.ts に変換してそれらしい情報がないか調べてみました。

どうやら、この記述みたいですね。



    MAC_APPLICATION_MENU
    
        Hide Others
        ほかを隠す
    
    
        Quit %1
        %1 を終了
    
    
        About %1
        %1 について
    
    
        Preferences...
        設定...
    
    
        Services
        サービス
    
    
        Hide %1
        %1 を隠す
    
    
        Show All
        すべて表示
    



とりあえず、この記述を qtbrynhildr_ja_JP.ts の最後に追加して lrelease を実行して qtbrynhildr_ja_JP.qm を更新してみました。

とりあえず日本語になったようです。
Menu

2017年3月 6日 (月)

Ver.1.6.6 リリース

タッチパネル向けにコンテキスト・メニューの実装をしようとして確認していたらメニュー・キーが
無視されていることに気づきました。

以下からダウンロードできます。(Windows/Linux/Mac版)

https://github.com/funfun-dc5/qtbrynhildr/releases

主な変更は以下です。

[新規機能]
・「ログ表示」ダイアログにResetボタンを追加
(*)ログファイル自体を削除するわけではなく、すでに表示したログ内容を隠す機能であり、
新しく出力されたログ出力を見たい時に使うためのもの。
・メニュー・キー対応(マウスの右ボタンクリック相当)

[その他変更]
・Cygwin(Qt5.6.2相当)版ビルドに関する簡易ドキュメント追加


(追記)

Brynhildrパブリックモード互換のサーバー機能の実現についてちょっとだけ調査してみました。

Qt5で提供されているgrabWindow()を使ってデスクトップ画像をキャプチャしてみましたがWindows上だと
1回50ms程度(20FPSに相当)かかるようですね。

プラットフォームに最適化したキャプチャを行うようにすればさらに向上できるかもしれません。
Windowsの場合は最近用意された新しいAPIを直に呼び出すことになるでしょうかね。

LinuxやMacをWindows上のBrynhildrからリモート操作できるとなにかできますかねぇ…

-----------------------------------------------------------------------------------
[SHA256SUM]
-----------------------------------------------------------------------------------
43e330bda00a28664cc839dffb0241aafb5b42ea6312913113184dc9858836a4 *QtBrynhildr-documents-20170305.zip

aecb94198ef42b01a45dfc545dd5ecdfb1ce27ed621c6f9ca4f770b0dab59754 *QtBrynhildr-linux_x64-v166.run

5d909fa5070bdace58bfc24e6200d0b0badce0416f3d9abdb64941a095047f7e *QtBrynhildr-linux_x86-v166.run

2e74899a7641672ccf4532cb28c096e9942549ae9c7950d033d710dd74c14e89 *QtBrynhildr-macosx_x64-v166.dmg

714057fa665406ebb54b8e3755f043815bb5da5fa75190f22fbf24352c74353b *QtBrynhildr-windows-v166.exe

2017年3月 1日 (水)

進捗記録 2017.3.1

もう少し調整が必要ですが、基本動作は確認しました。

署名なし、Nexus 7 (Android 6.0)依存な野良APKパッケージが出来上がってますが、ちょっとまだ試用版配布は無理そうですね…

画像の遅延が少し気になるので調査しないと。

Screenshot_20170301230807

上記スクリーンショットはテスト用のためフルスクリーンではありませんが、正式版ではフルスクリーンにする予定です。

普段フレームレートは12 FPSほど出ているのですが、スクリーンショット撮影時はキャプチャ処理の関係で一瞬このくらいまで落ちるようです。

« 2017年2月 | トップページ | 2017年4月 »