luarocks(lua5.2 DLL) on VS2015(windows)

前に失敗したのでリベンジ。
VC(VS2013)にluasocketの.makeみながら全ソースぶっ込んで作ったことはあったのですが、monnscript使おうと思ったらモジュールの依存関係があってこれは辛いなぁ…ってことでluarocksさん。

luarocksと言われても…

lua用モジュール管理ツールです。と言われてもちょっとピンときませんよね。
luaが必要最小限の機能しか有していないので、拡張はlua言語ではなくDLLに頼ることになります。となるとコンパイルが必要。その環境依存性の高いコンパイルを吸収してくれる筈のツールになります。筈。
目的のモジュール名をお願いすると、ダウンロードしてきてコンパイルしてへいおまち!してくれる筈の夢のツールです。ありがたい!

とってもかんたんだよ(windows除く)

linuxなどでは特に問題なくluarocksがapt-getやyumなんかで出来ちゃうのですが、windowsだとそうもいきません。具体的にはコンパイルluaのライブラリ「lua.lib」が必要なのですが、これは自力で作る必要があります。
コンパイルが成功するとluaのあるところに「share」と「lib」というフォルダを作ってluaソースと作ったDLLをそれぞれ別々に出力します。
って説明が無いので、最初迷いますよねこれ…。

まずはlua.lib

いきなりですがluaそのものをコンパイルする環境構築が必要です。自分はとりあえずVC2015で試してみます。
説明は省きますが、luaの公式ページからソースを一式ダウンロードして、空のライブラリプロジェクトに全ソースファイル突っ込んでエラーを見てちょっと抜いて、コンパイルして終わりです。詳しくは長くなるので割愛。
必要最低限な設定では以下のような感じ。

構成の種類:スタティック ライブラリ (.lib)
マルチ バイト文字セットを使用する:マルチ バイト文字セットを使用する(luaはこれ重要)
ターゲットの拡張子:.lib
プリプロセッサ:LUA_BUILD_AS_DLL;_CRT_SECURE_NO_WARNINGS
SDLチェック:いいえ
すべての既定ライブラリの無視:はい (/NODEFAULTLIB)

それほど難しくありませんが、後記のエラーのためもうちょっと細かい設定が必要になりますが、今のところはパスします。

ほんとにこのライブラリ大丈夫?

これはやらなくて大丈夫です。
exeでもいいのですが、自分はDLLを使うプログラムがあったのでそれで整合性をチェックしました。新しく空のプロジェクトを作ってDLLに設定、「LUALIB_API,LUA_API」があるソースをぶち込んでコンパイル。アプリに組み込み後、相当でかいlauコードが動いたので大丈夫でしょう。

luarocksダウンロードしてインストール!と思ったら5.1入ってるんですけど…

最初のインストールに使うインストーラー的なものなので問題ありません。が、そのままインストールすると5.1になっちゃうので、別途lua5.2が必要です。上の工程でexeも作っていればそれを、無ければ公式からバイナリが取得できます。
以下のフォルダ構成フォーマットに従ってファイルをコピーして、大元「c:\lua52\bin\」をwindows環境変数「path」に登録します。

c:\lua52\bin\lua52.exe
c:\lua52\bin\lua52.lib
c:\lua52\bin\lua52.dll
c:\lua52\include\*.h    //ソースファイルのヘッダだけ抜き出したもの(本当はもうちょっと絞り込むんですが)

落としたluarocksのinstall.batでインストール。「linstall /?」と打ち込むと設定が出てくるので以下のようなかんじで指定の場所にインストールします。(programfilesは権限が必要になるので今回は回避しておきます)

install /LV 5.2 /LUA c:\lua52\ /P c:\LuaRocks52

/LV:luaバージョン
/LUA:luaのあるところ
/P:luarocksのインストール先

ベコベコベコとファイルのサーチが始まります。この時にベースのluaのバージョンが決定します。なので5.3を用意してこのインストーラでまたインストールすれば5.3のluarocksが共存できます。
途中で止まった場合はそのパスを確認してください。現段階ではファイルコピーと設定ファイルのパス訂正ぐらいしかしてませんので、パスが合っていれば概ね大丈夫です。

ではさっそくモジュールげっと

最初にゲットするものといえばluasocketというのが世の習わしです。pokemonでいうところのpikachuuuuです。

c:\luarocks52\>luarocks install luasocket

わくわく感もつかの間、エラーが出ます。clってなに?
忘れてました、VCのコンパイラを使うので「デベロッパコマンドプロンプト」で開き直して再度チャレンジしましょう。
するとまたエラーが出るはずです。LINK1107!なにやらDLLを組み込んでコンパイルしようとしてます。そこはlibつかってくださいluarockさん。

config-5.2.luaの修正

「config-5.2.lua」がluaだけど設定ファイルになります。中身はテーブルです。ってluaそのものです。こんな感じにDLLになってる「LUALIB」のところを修正します。

...
variables = {
    MSVCRT = 'MSVCRT',
    LUALIB = 'lua52.lib'
}
...

これで一応コンパイルが通るとは思いますが、なにやらリンク時に「???が再読込されてる」とかなんとか言われます。
どうやらlib生成のコンパイラオプションがluarocksの時と異なるので怒られてます。なので、VCを開いてlibのプロジェクト設定を変更します。
luarocksのログを見ると

cl -nologo -MD -O2 -c ?????

となってますので、プロジェクト設定では以下に対応します。

著作権情報の非表示:はい (/nologo)
ランタイムライブラリ:マルチスレッドDLL (/MD)
最適化:実行速度の最大化 (/O2)

これでもう一回rualockさんにお願いすると〜

link -dll -def:core.def -out:socket/core.dll c:/lua5.2.4/bin/lua52.lib src/luasocket.obj src/timeout.obj src/buffer.obj src/io.obj src/auxiliar.obj src/options.obj src/inet.obj src/except.obj src/select.obj src/tcp.obj src/udp.obj src/wsocket.obj ws2_32.lib
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

   ライブラリ socket/core.lib とオブジェクト socket/core.exp を作成中
luasocket 3.0rc1-2 is now installed in c:\lua5.2.4\ (license: MIT)

わーい。エラー無く完了。お疲れ様です。
すっかり忘れている頃ですが、出力はluarocksではなくluaの方の「share」と「lib」にされています。

では使ってみよう…

出力されたファイル群をフォルダ構成を守ってluaを実行する所へコピペすれば準備完了です。
サンプルスクリプトを作って実行させましょう。luasocketのおまじないはこうです。

require("socket")

結果はこうです。

multiple vms detected.

深刻なエラーです。どうやらluaコアと読み込むDLLのlua内部情報が異なると出るそうです。
あぁー、先ほどlib更新したからDLLとEXEも更新しないとということで、この2つもプロジェクト設定を上記に従い再設定、再コンパイル、組み込みます。

multiple vms detected.

ぐえー。どうにもダメみたいです。

multiple vms detectedってなに?

疲れたのでluaの大元のソースをご開帳。

LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver) {
  const lua_Number *v = lua_version(L);
  if (v != lua_version(NULL))
    luaL_error(L, "multiple Lua VMs detected");
  else if (*v != ver)
    luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f", ver, *v);
...

versionチェックなんですが、version値の比較の他に、アドレスの比較もやってるようです。
今回はVM Errorって言ってるのでそのアドレスで引っかかってるみたいです。何のアドレスを比較してるの?

LUA_API const lua_Number *lua_version (lua_State *L) {
  static const lua_Number version = LUA_VERSION_NUM;
  if (L == NULL) return &version;
  else return G(L)->version;
}

「static const」のアドレスですか…。きっとluasocket側でcheckversionをcallされてる弾かれてるんですね。luaの大元libをDLLに使ってるので一部2重コードになってますのでアドレスも違います。
つまりlua本体DLLから全命令をcallしなければなりません。なので最初の.confの設定にDLLが指定されていたのでしょう。エラーでますけど。
なーるほーどねーそういうことだったのか…。

まずDLLをコンパイルする

libだけでいけるかなーと思ったんですが、DLL生成が絶対必要になります。
厳密にはDLLじゃなくて、DLL出力した際に吐き出されるlibが必要です。とはいえ1:1対応の存在で別々に取って来てもダメなので、結局コンパイルして両方生成します。
DLLの生成方法の詳細は他のページでご覧ください!
一番簡単なのは全ソースぶち込んでエラー出たのを抜くのがてっとり早いです。(うえでは一端全部入りlibつくってからDLL吐き出してますが、必要なソースの選定に.make見ないとイケナイので面倒です)

lua52.dll    486kb
lua52.lib    30kb

容量は目安です。全部入りlua.libに比べてきわめて小さいlibが出来ます。このlibはDLLに命令をそのままリダイレクトさせるためだけのlibです。
これ使えって事だったの……名前一緒だしわからないですよね……。
この2つを「c:\lua52\bin\」にぶちこんで、「ruarocks install luasocket」してやります。

   ライブラリ socket/core.lib とオブジェクト socket/core.exp を作成中
luasocket 3.0rc1-2 is now installed in c:\lua5.2.4\ (license: MIT)

メッセージは上記と全く同じですが、出力されるcore.dllなどの容量が若干小さくなります。
これをluaの組み込み実行環境に持って行って

require("socket")

エラー無しで通ると思います。
終わり。疲れた…。

おまけ

ほんとは「moonscript」使いたかったんです。
試しに「luarocks install moonscript」して持って行ったら「multiple vms detected.」。え?なんで?
removeしてもinstallリストから除外されないしluarocksが壊れてるのかな?このモジュールは2つのモジュールの上に成り立っているので、それらが更新されていないとかそんな感じなのかな。一応リスト見て全部叩いては見たものの…。
結局再インストールして再コンパイルしたら上手くいきました。

V8エンジン

JavaScript組み込みエンジン「V8」にちょっとだけ手を出してみました。
なぜ?lua言語にちょっとイライラしたから…つい魔が。
Chormiumeプロジェクトのアレです。ブラウザからJavaScriptエンジン部分だけをぶち抜いたもので、みんなもプログラムに組み込んでみよう!というアレです。
windowsでもほら簡単!って事だったんですけど…気軽に言ってくれるなぁ。

ビルド方法が大きく変わりました

ふふーん。なーんだgoogleからgit.cloneしておっぱいそんいれてgypするれば終わりじゃん!って思ってたんですがダメでした。
どうやらファイルが足りないみたいです。確認したところではClangあたりでしょうか。
というわけで、googleさんからではなく、Chormiumeプロジェクトさんの方から一式セットを頂くことにします。
と、数行で済ませてますがすでに1日が経過して若干やつれてます。

  • depot tools

https://www.chromium.org/developers/how-tos/install-depot-tools
(これもURL変わったりするのでだめな場合はgoogleさんに「depot tools V8 install」と聞いてみてください)
このあたりは過去と同じなので詳細は省きます。
これで揃うのは、python、git、gyp環境(ninja含む)です。
展開して、フォルダのルートで以下のバッチを実行するのですが、いくつか(DEPOT_TOOLS_WIN_TOOLCHAIN,GYP_MSVS_VERSION)windows環境変数に登録が必要なので、以下の内容なバッチファイルを作って一時的に登録させる手法を使うと楽ちんだと思います。

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set CPPFLAGS=/WX-
set GYP_MSVS_VERSION=2015
set GYP_DEFINES=component=shared_library
set GYP_GENERATORS=ninja,msvs-ninja

rem 環境変数のパスに入れるなら不要
set PATH=%PATH%;******\depot_tools
set PATH=%PATH%;******\depot_tools\python276_bin
  • depot tools update/setup

depottools展開フォルダのルートでバッチ作成後実行

gclient
  • ツールパス指定

windows環境変数(ユーザ)にbin,root,gypのパスを追加。

  • git.clone

お好きな場所にフォルダを作ってそこでバッチ作成後実行。
VSの環境に合わせて「GYP_MSVS_VERSION」は変えてください。私は2015でやりました。

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSION=2015
fetch v8

上手くいかない場合は、コマンドプロンプトを終了させたり、パスが通っているか「~> path」で確認してみてください。
というのもね、Explolerで「シフトを押しながらフォルダを右クリックでコマンドプロンプトを開く」が便利で使うんですけど、環境変数の反映は「次回”親”アプリケーション起動時」なんです。
この時、開いたコマンドプロンプトは子プロセスなので、開き直しても反映されないのをすっかり忘れて2時間時間を無駄にしました…。調べると設定するとイベントが飛んでくる筈なんですけどね…対応していないみたいで。

やったーコンパイル…できない!

コンパイルの流れは「gypさんにお願いするとsln(VSプロジェクトファイル)が貰えるのであとはVS上でやる」というのが以前までの方法でした。
これが新しくなって「gypさんにお願いするとninjaが出てきてlibまでケジメしてくれる」ということで根本的に変わってまして、slnを吐いてくれません!おのれninjaslayer!
ともあれ、とりあえずはninjaであってもコンパイルを通さないと行けませんのでそこまではやりましょう。
今回も環境変数の登録があるので以下のようなバッチをcloneした一番上(.gitignoreがあるところ)作り、念のためVisualStudioコマンドプロンプトから実行します。(風通のでも行けた気がするような)

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSION=2015
python gypfiles/gyp_v8

なんだか幾つかのファイルでエラーが出てると思います。
よくある日本語環境下でのsjis認識によるものらしいので、この際USモードでOSを再起動させます。
「コントロールパネル−言語−地域−管理−システムローケル」で「英語(米国)」にして再起動。
(これがユーザー単位に切り替えできたら良いのですが…プログラムのUnicodeチェックするときに使ってますがいつも再起動面倒です)
これで通るはずです:Q
終わったものの、特にメッセージも無いのでどこに何が生成されたのかさっぱりですが、これで「out\」というフォルダにninjaのmakeファイルが展開されました。
なのでコンパイルしないと。
ninjaと打ち込むと「build.ninja」のあるフォルダを指定してね!って言われるので以下のようにoutのなかの「任意のフォルダ」を指定してください。

ninja -C out/release

これでとりあえずはninjaコンパイルは上手くいく行ったと思います。おつかえさま:Q
ほほーlibファイル群がよゆーで10Mこえてるぜー!でけぇ!

ちげーよ!slnが欲しいんだよ!

ですよねー。

  • Cannot generate solution file of v8 with gyp for visual studio 2013

http://stackoverflow.com/questions/38015585/cannot-generate-solution-file-of-v8-with-gyp-for-visual-studio-2013
KAOMOJIまでつかって実にチャーミングです。泣いてます。かわいそう。
私なんてもう流す涙も枯れてしまったわとかそんな危険な状態です。
gypさんに以下のようにお伺いを立てればslnが出力されます。

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSION=2015
gn gen --ide=vs out/VSproject

やった!これで「out/VSproject」にslnとその部下達(プロジェクト)が吐き出されて…いました……。
現在ではいくつかDLLのコピーで引っかかります。「program files(x86)\Windows Kits\10\」に「debuggers\」が無ければ、Windows 10 SDKをもう一度インストールしましょう。

https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk
めっちゃいっぱいのDLLとともにソリューションが出来ましたが…こんなにいるのでしょうか?


とここまでやって貰って申し訳ないのですが、slnを開いてコンパイル……出来ません。
どうも最終的に外部コンパイラでninjaに投げるような設定みたいなので、結局sln出力の意味がありません。
マクロあたりを見てなんとか再構成とも思ったのですが、どのプロジェクトもほぼ初期状態に近い状態で、明らかにバグってるように思えます(外部コンパイラの項目も真っ白ですし…)。
luaのようにシンプルなら1からビルド用のプロジェクトが組めるのですがちょっと複雑すぎて……V8コアを突っ込んでobj作ってlinkとは行かないようですので。

結局使ってるの?

使ってません…。今のところ。力尽きました。
いつか使うかも知れません。

VS2015とVS2013共存時のC++エラー対策

書き直します。はっきり言うとどうにもインストールエラーっぽいです。
それでも以下の症状が出た場合の対処策として記しておきます。

直りました

あるときVSを起動すると特殊な処理(インストールのような)が走って設定が色々直りました。これは一体どういうことでしょうか?

  • 修正パッチが来た?
  • もしかして開発者登録が関係してる?

修正パッチが働いた痕跡もなさそうなので開発者登録が怪しそうです。インストール時に入力したはずなんですが、直る直前にもう一度聞かれたのでどうもにも怪しいです。
なので、現状では最新状態で且つ、開発者登録をすれば問題なく使えると思います。

症状

VS2013がある状態でVS2015をインストールします。
よくあるバージョンアップ移行組です。
以前バージョンアップに伴いパス設定をこんな感じで修正したかと思います。
http://d.hatena.ne.jp/taiyakisun/20130406/1365248215
これらの設定がどう解釈されるかというと…

Visual Studio 12.0はまえのバージョンですから違うそうじゃない。他の箇所を見ると一部は14を参照、一部は12を参照、といった感じで完全にサラダボール状態です。
こうなった場合はなんらかの原因でインストールに失敗しているようです。深く考えずに再インストールなり、以下の手段を試みましょう。

直し方

再インストールすると直るかもしれませんが、色々設定済みだとあまりしたくありませんので最後の手段としましょう。
上記の通りあるとき勝手に直りましたので、修正パッチも当てつつ、まず開発者登録の状態を勘ぐってください。現在であれば、設定の後再起動で勝手に修正されるのでは無いかと思われます。

ucrtってなに

修正されるまえはなにかにつけてucrtが無いよ!互換が無いよ!ってエラーで言われまくるので、それについて調べたことを残しておきます。
・CRT ライブラリの機能
https://msdn.microsoft.com/ja-jp/library/abx4dbyh.aspx
早速眠くなってきました。
「今度(win10)から標準ライブラリはwindowsOSの一部として管理配布します。メモリモジュールと一緒にwindowsupdaeで!」みたいなそんな感じです。
ここで重要なのは「/MT」でもこれが適用されるようなので、つまり/MTでコンパイルしてもアップデートしてランタイムじゃないけどパッチを別途ダウンロードしないと動かないので注意してください。
/MDでは解決として、同封すると良いみたいですが、ライセンスがよくわかりませ、あ、大丈夫そう。
http://dev.activebasic.com/egtra/2015/08/30/831/

過去色々なライブラリについて

もうずっと放置気味なライブラリにつきまして。
一応残しておこうとおもいます。no support , no maintenanceで。
多くはDelphiで作られていますが、pureでもなく、ユニコード対応でもなく、私自身もバージョンを追えていない非常に厳しい状態です。(もうちょっと安くなったりしないものですかね)
「.net PCL」にでも対応してくれれば…。

ノートPCのタッチパッドにおけるホイール処理

ノートPCについているキーボード下のタッチパッドにおけるマウスホイール処理についてメモしておきたいと思います。
実は難物なんですこれ・・・。

イベント内容

パッドを使ったホイールスクロールの場合は、マウスによるホイールスクロールとは異なり、特殊な数値のイベントが飛んでくるので、処理やインターフェイスの根本的な見直しが必要になります。

・マウスによるホイール
MouseWheel(WheelDelta:-120) 230ms
MouseWheel(WheelDelta:-120) 102ms
MouseWheel(WheelDelta:-120) 85ms
MouseWheel(WheelDelta:-120) 123ms

・ノートPCのパッドによるホイール
MouseWheel(WheelDelta:-14) 12ms
MouseWheel(WheelDelta:-10) 10ms
MouseWheel(WheelDelta:-8) 13ms
MouseWheel(WheelDelta:-9) 8ms
・・・

マウスのホイールでは上下に1回2回といったグリッド間隔による回数によってイベントが発生していますが、パッドの場合はもっと細かい単位(ピクセル)の連続したイベントが飛んできます。
また、デバイスの設定によって離した後のイージングも発生します。
(イージングを判定するコードは見つけられませんでした。判別出来るか不明)


と、こんな違いがありますので、対応処理が必要です。
まじめに対応すると場合は、プログラム的(イベント処理)な対応と、GUI(グラフィックインターフェイス)の両方が必要になります。

対応しないとどうなるの

対応していないからと言って、そこまで深刻なバグが発生するわけではありません。
よくある実害が、パッドでスクロールさせると超高速でスクロールするぐらいです。
上記の通り、スクロールイベントが細切れで大量に飛んでくるのが原因です。

対応 - イベント処理

パッドによるイベントは、間隔が非常に狭いため、Wheel値をポーリング処理(ゲームの1frame単位で値を取得して処理)で取得している場合はかならず抜けオチが発生します。
抜けオチが発生すると、スクロールする移動量が一定で無くなります。(早くスクロールしたのに遅かったり、逆になったり)
なので、イベントから値を取得し、WheelDelta値は加算、累積しておく必要があります。

対応 - GUI(グラフィックインターフェイス

大変なのがこれ(GUI)です。
デザインそのものから見直す場合もありますので、昔の作品をプログラムを弄って対応…と単純にはいかないでしょう。


簡潔に言ってしまえば、GUIピクセル単位のスクロールに対応させることが対応処理になります。
ということとは必然的に、「1回のスクロールでページが切り替わる」といった処理はこれに反します。
例えば、スクロールでページが1進むようなのがこれに該当します。
…厳しいですね。
「一定ピクセル数のスクロールになったらページを進ませる」というのも手ですが、引っ張り動作(スクロールさせた量だけ移動するが一定未満だと元の位置に戻る)を入れないと大変不親切なインターフェイスになってしまいます。
また、イージング処理イベントも飛んでくるので、引っ張り動作が正常に出来る保証もありません…。


というわけで、ピクセル単位のスムーズなスクロールを前提に作り直さないとどうにもならないなー、と個人的には思っています。
この方式は「見えている部分のリソースだけ処理して処理とメモリをコンパクトに」というのが大変やりにくいので、リッチな処理(重い)になる傾向が強いですし、全てを対応とかでなく、天秤にかけて取捨選択が現実ラインではないかと思います。
ページ切り替えぐらいで悩むならボタンでもいいかなってね。
かしこ

おまけ

タッチデバイス時の他のジェスチャについてのログです。
ズームなどはこのイベント情報から自前で処理する必要があります。
windowsはID番号があって、これがとても役に立って優秀なのですが、それでもジェスチャー開始と終了処理は相当気を配って処理する必要があります。

■twofingertap
・pressandhold enable
touch.down...0(130,132) 2641ms
touch.move...0(130,132) 5ms
touch.down...1(227,280) 3ms
touch.move...0(130,132) 3ms
touch.move...1(227,280) 3ms
touch.move...0(130,132) 5ms
touch.move...1(227,280) 3ms
touch.move...0(130,132) 16ms
touch.move...1(227,280) 4ms
touch.up...0(130,132) 4ms
touch.move...1(227,280) 3ms
touch.up...0(227,280) 5ms
mouse(FromTouch).move...0(130,132) 4ms
mouse(FromTouch).down...0(130,132)Left 4ms
mouse(FromTouch).up...0(130,132)Left 4ms
mouse(FromMouse).move...0(130,132) 4ms

・pressandhold disable
touch.down...0(141,176) 6649ms
touch.move...0(141,176) 6ms
touch.down...1(208,299) 3ms
touch.move...0(141,176) 3ms
touch.move...1(208,299) 3ms
mouse(FromTouch).move...0(141,176) 4ms
mouse(FromTouch).down...0(141,176)Left 3ms
touch.move...0(141,176) 3ms
touch.move...1(208,299) 3ms
touch.move...0(141,176) 9ms
touch.move...1(208,299) 4ms
touch.up...0(141,176) 3ms
touch.move...1(208,299) 4ms
touch.up...0(208,299) 5ms
mouse(FromTouch).up...0(141,176)Left 4ms
mouse(FromMouse).move...0(141,176) 4ms

■touch.zoom
touch.down...0[2276](179,160) 27957ms
touch.move...0[2276](179,160) 7ms
touch.down...1[2277](336,261) 2ms
touch.move...0[2276](179,160) 4ms
touch.move...1[2277](352,286) 5ms
touch.move...0[2276](158,148) 7ms
touch.move...1[2277](356,292) 6ms
mouse(FromTouch).move...0(179,160) 6ms
mouse(FromTouch).down...0(179,160)Left 6ms
mouse(FromTouch).move...0(154,144)Left 5ms
touch.move...0[2276](154,144) 7ms
touch.move...1[2277](366,305) 5ms
mouse(FromTouch).move...0(146,137)Left 6ms
touch.move...0[2276](146,137) 7ms
touch.move...1[2277](372,312) 5ms
mouse(FromTouch).move...0(141,132)Left 5ms
touch.move...0[2276](141,132) 7ms
touch.move...1[2277](377,316) 5ms
mouse(FromTouch).move...0(138,129)Left 6ms
touch.move...0[2276](131,123) 6ms
touch.move...1[2277](391,331) 5ms
touch.up...0[2276](131,123) 5ms
touch.move...1[2277](391,331) 5ms
touch.move...0[2277](391,331) 6ms
mouse(FromTouch).up...0(131,123)Left 5ms
touch.move...0[2277](391,331) 6ms
touch.up...0[2277](391,331) 5ms
mouse(FromMouse).move...0(131,123) 6ms

ジェスチャーデバイス

タッチ操作をOSが処理して、専用のイベントを発生させます。
このモードの特徴は、クリックとプレスアンドホールド以外は、マウスイベントが全く発生しません。
パンであってもマウスムーブ(MouseMove)が発生しません。
これはスクロールバーの操作などを行えないことを意味します。(クリックはできるけど)
また、ウインドウのタイトルバーでもイベントを吸収してしまうため、ウインドウの移動やリサイズなどの処理に特殊なコードを書く必要があります。


まさしくタッチ操作に特化したモードではあるのですが、マウスやペンと共存させる場合はいささか機能不足や痒いところに手が届かない事になるでしょう。
フルスクリーンタッチアプリを作るのであればこれほど強力な物は無いのですが。

■gestue.singletouch
・pressandhold enbale
wait		//指を一定以上動かすまで反応無し
mouse(FromTouch).move...0(186,180) 3627ms
mouse(FromTouch).down...0(186,180)Left 5ms
mouse(FromTouch).up...0(186,180)Left 7ms
mouse(FromMouse).move...0(186,180) 6ms

・pressandhold disable
※singletouch.enableに同じ

■gestue.pressandhold
・pressandhold enable
wait		//指を一定以上動かすまで反応無し
mouse(FromTouch).move...0(158,172) 8052ms
mouse(FromTouch).down...0(158,172)Right 13ms
mouse(FromTouch).up...0(158,172)Right 8ms  //singletouchと異なりmoveが来ない

・pressandhold disable
※singletouch.enableに同じ

■gestue.enable.pan
・pressandhold enable
wait		//指を一定以上動かすまで反応無し
gesture.begin...(137,129) 4220ms  //マウスイベントは発生しない
gesture.pan...length=0 vector=0,0(137,129) 9ms
gesture.pan...length=0 vector=0,0(137,155) 9ms
gesture.pan...length=0 vector=0,0(137,157) 7ms
〜〜〜
gesture.pan...length=0 vector=0,1(137,184) 9ms
gesture.pan...length=0 vector=0,1(137,184) 8ms
gesture.pan...length=0 vector=0,0(137,184) 19ms
gesture.pan...length=0 vector=0,1308104(137,184) 6ms
gesture.end...(137,184) 6ms

・pressandhold disable
※pan.enableに同じ

■gesture.zoom
・pressandhold enable
gesture.begin...(201,139) 6558ms
gesture.zoom...zoom=106 pos=0,0(214,190) 27ms
gesture.zoom...zoom=148 pos=0,0(233,206) 9ms
〜〜〜
gesture.zoom...zoom=193 pos=0,0(230,203) 10ms  //zoomには慣性は無い
gesture.zoom...zoom=193 pos=0,0(230,203) 6ms
gesture.end...(230,203) 6ms

・pressandhpld disable
※zoom.enableに同じ


■gesture.rotate
・pressandhold enable
gesture.begin...(221,312) 4195ms
gesture.rotate...rot=40807 pos=0,0(221,312) 6ms
gesture.rotate...rot=33791 pos=0,0(221,312) 7ms
〜〜〜
gesture.rotate...rot=34541 pos=0,0(225,313) 5ms	 //rotateに慣性は無い
gesture.rotate...rot=34541 pos=0,0(225,313) 5ms
gesture.end...(199,231) 49ms


・pressandhold disable
※enableに同じ