2005年05月09日

買ったので

WACOM SmartScroll SS-200買いました。
コーディングなどのキーボード入力が主体の作業にはまったく使えませんが、マウス主体の作業ではかなり威力を発揮します。
惚れました。
買いです。
もう手放せません!! 「ワコム Smart Scroll」で詳しく解説されています。
Amazonのレビューの評価も高いです。

WACOMのダウンロードページからプラグイン開発用のSDKもダウンロード出来ます。
標準機能でも良いのですが、他にもいろいろと出来そうです。
同時押し系など欲しい機能がいろいろあります。

ボタン8個あるけど、指を置いておく関係上、4個以上は使いづらい。
そこで、ホイールによってボタンの機能がスライドするようになっていれば、使いやすいのではないかと思った。
プラグインをVectorで探してみるが、よさげなのは見つからず。
いろいろと作っていくかな。

投稿者 Takenori : 22:28 | トラックバック

2005年05月11日

スクリプト

プラグインSDKのサンプルソースとマニュアルを見た感じでは、基本的に各入力に対する応答を記述すれば良いだけのよう。
そして、サンプルソースでは対象となるウィンドウにメッセージを送るか、キーボードかマウスの入力イベントを送っている。
なら、単純にメッセージを送れるようにだけすればOK?
でもそれなら、スクリプトで処理できるようにした方がより汎用的になりそうだ。

スクリプトで出来るようにした方が良いこと
・各ボタンへのプロシージャ割り当て
・メッセージ送信
・各ボタンの押下状態取得

各ボタンの押下状態を取得できるすると、受け側で処理を振り分けることになる。
つまり、押されたボタンによってホイールの動作が変わるようにするには、ホイール側のプロシージャで処理を切り替えるようになってしまう。これは直感的ではないな。
押下側で、押下時にプロシージャを切り替え、離された時に元の戻した方が、直感的… だけど、3つ以上同時押しの時はどうする?
各ボタンの状態に応じたプロシージャを設定できるようにすればいいかな。
8ボタンだと255パターンになってしまうけど、未設定の場合は何も押されていない状態の時の処理にすればそれほど問題にはならないかな。
この辺りはもうちょっと考えるか。

メモ
Windows NT 4.0 SP3、Windows 98 以降の場合、SendInput でキーボードとマウスのイベントを発生されられる。
その時、windows.h をインクルードするよりも前に_WIN32_WINNTへ0x0400より大きい値を定義しておく必要がある。
それ以前の環境の場合は、mouse_eventとkeybd_eventを使って同様の処理が出来る。

投稿者 Takenori : 17:10 | トラックバック

サンプルをいじってみる

サンプルをいじって、スクロールボールの操作をトラックボールで出来るようにしてみた。
マウスの場合は、左手で操作するのにかなり慣れがいるけど、トラックボールの場合はそうでもないかも ( 左手でのマウス操作に慣れているから、そう感じたのかもしれないが ) 。
右手疲れたら、左手で操作って出来るかも。
ボタン押しながらか、機能切り替えでスクロールになるようにすれば、スクロールもカーソル操作も出来るようになっていい感じ。

スクリプト言語は何積もう?
Pythonかな?
それともTJSとか。
SpiderMonkeyにも結構興味がある。
と言っても、TJSとJavaScriptは書く方からしたら大差ないかも。
組み込みと拡張のしやすさはどうだろう?
SpiderMonkeyは全然使ったことないけど。
SpiderMonkeyで遊んでみるかな。

投稿者 Takenori : 18:00 | トラックバック

SpiderMonkeyのビルド

SpiderMonkey を VC6 でビルドするにはを参考にしたら、さくっとビルドできた。

気になるライセンスはMPL/GPL/LGPLのトリプルライセンスになっているよう。
なら、DLLを使うのは問題なさそう。

投稿者 Takenori : 20:42 | トラックバック

SpiderMonkeyのサンプル

サンプルソース。
jsshellとjs/src/README.htmlAPI リファレンスを参考に作ってみた。
単に動かすだけなら、かなり簡単かも。
※動くことと、実行結果が正しいことは確認したけど、下記のソースコードで問題ないかどうかは知りません。ま、今日触り始めたばかりですから。

#define XP_WIN
#define JSFILE

#include "jsstddef.h"
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "jstypes.h"
#include "jsarena.h"
#include "jsutil.h"
#include "jsprf.h"
#include "jsapi.h"
#include "jsatom.h"
#include "jscntxt.h"
#include "jsdbgapi.h"
#include "jsemit.h"
#include "jsfun.h"
#include "jsgc.h"
#include "jslock.h"
#include "jsobj.h"
#include "jsparse.h"
#include "jsscope.h"
#include "jsscript.h"

global_class = { "global", 0, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub };

int main(int argc, char* argv[])
{
  JSRuntime *rt;
  JSContext *cx;
  JSObject *globalObj;
  jsval rval;
  char *source = "5.0 * 3";
  rt = JS_NewRuntime(64L * 1024L * 1024L);
  if( rt == NULL )
    return 1;
  cx = JS_NewContext(rt, 8192);
  if( cx == NULL )
    return 1;
  globalObj = JS_NewObject(cx, &global_class, 0, 0);
  JS_SetGlobalObject(cx, globalObj);
  if( JS_EvaluateScript(cx, globalObj, source, strlen(source), "sample.js", 0, &rval) )
  {
    jsdouble d;
    if( JS_ValueToNumber(cx, rval, &d) )
      printf( "%lf\n", d );
  }
  JS_DestroyContext(cx);
  JS_DestroyRuntime(rt);
  JS_ShutDown();
  return 0;
}

投稿者 Takenori : 22:25 | トラックバック

SpiderMonkeyでJavaScriptの関数をコンパイル

予定している機能を実現するには、JavaScript側にいくつかのクラスと関数を提供し、JavaScriptで書かれた関数を実行できればO.K.
と言うことで、JavaScriptの関数を実行してみた。
以下は、必要な部分のみ抜粋。
これも意外と簡単。

char *func_source = "return 10.0;";
JSFunction *jsfunc = JS_CompileFunction( cx, globalObj, "foo", 0, NULL, func_source, strlen(func_source), "sample.js", 0 );
if( jsfunc )
{
  if( JS_CallFunction( cx, globalObj, jsfunc, 0, NULL, &rval) )
  {
    jsdouble d;
    if( JS_ValueToNumber(cx, rval, &d) )
        printf( "%lf\n", d );
    }
}

投稿者 Takenori : 23:01 | トラックバック

2005年05月12日

Cで書いた関数をJavaScriptからコール

今日はつい本屋に寄って、ついJavaScript辞典 第2版を買ってしまった。
昨日からなんとなく触り始めただけなのに…
まあ、それはともかく、Cで書いた関数をJavaScriptからコールしてみた。
まずは実際に呼ばれる関数と登録用の変数を定義

static JSBool console_print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
  JSString *str;
  str = JS_ValueToString( cx, argv[0]);
  wprintf( JS_GetStringChars(str) );
  return JS_TRUE;
}
static JSFunctionSpec my_functions[] = { {"console_print", console_print, 1}, {0} };

次に、グローバルオブジェクトの登録が終わった後に関数を登録し、JavaScriptからその関数をコールする。

JS_DefineFunctions(cx, globalObj, my_functions);
char *call_func_source="console_print(\"SpiderMonkey!!\\n\");";
JS_EvaluateScript(cx, globalObj, call_func_source, strlen(call_func_source), "sample.js", 0, &rval);

これも簡単に出来た。
後はクラスの登録が出来ればOK?
実際にはクラスのインスタンスをJavaScriptで書いた関数へ渡すことになるんだけど。

JavaScript側から関数をネイティブの関数経由で登録。
ネイティブ側からプロシージャ呼び出しがあった時に登録された関数をコール。
と言う処理は出来るのかな?
ま、順番に試していこう。

投稿者 Takenori : 22:33 | トラックバック

2005年05月13日

よくわからないクラスの追加

プロパティの設定などは次のようなプロトタイプを持った関数で行う。
JSBool setter(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
cxはコンテキストで、プロセス空間みたいな物だと思う。(よくわかってません)
objは、インスタンスだと思う。
idはプロパティのid。
vpは設定すべき値。
つまり、objからネイティブなインスタンスを得て、id番のプロパティにvp値を設定すれば良いと思われるのだが、ネイティブなインスタンスをいつ、どこに、どのように設定するのか、objからどうやってネイティブなインスタンスを取得するのかが、さっぱりわからない。
ドキュメントを見たり、探したりしてもよくわからない。

SpiderMonkeyの使用を諦めようかとも思ったが、SpiderMonkeyのソースをいろいろと追ったところ、JS_SetPrivateでvoidポインタをインスタンスのプライベートデータへ設定出来、逆にJS_GetPrivateでインスタンスから設定したプライベートデータを取得できるようだ。
そして、このプライベートデータへコンストラクタ関数でネイティブなインスタンスを設定すれば良いよう。また、finalize関数で忘れずに開放するようにともある。
つまり、コンストラクタ関数でnewして、プライベートデータへ格納し、必要時プライベートデータを取得&キャストして使い、finalize関数でdeleteしてやれば良さそう。
これで何とかクラスを作れるかな。

投稿者 Takenori : 21:50 | トラックバック

2005年09月15日

メタセコイア用プラグイン

スクリプト機能などは置いといてメタセコイア用プラグインを作ることにした。
SmartScrollのプラグインでは、自分自身を適用するかどうかを対象アプリのHWNDを使って判断しないといけない。
が、Metasequoiaのクラス名はユニークなものではないので、クラス名のみで判断するのはまずそうだ。
そこで、実行ファイル名で判断するようにしようとしたが、HWNDから実行ファイル名を得るAPIが見つからない。
ググってみたら、ウィンドウハンドルから .EXE 名を取得するには?と言うぴったりのページが見つかった。
見てみると面倒なことになってる。
ま、サンプルコードをもらうのでいいけど。

早速、SmartScroll プラグインSDKのサンプルプログラムを改造して作っていく。
ボールを回転させるとマウスの右ボタンか真中ボタン、左右ボタン、左ボタンを押しながらマウスの移動イベントを送る処理を書いたが、動きがおかしい。
DOWN、移動、UPのイベントを瞬時に送っているので、うまくいかないのだろうか?
そこで、移動が開始された時に、DOWNイベントを送り、移動が約200ms間ない場合にUPイベントを送るように変更。
これでうまく動くようになった。
また、どのボタンを押しながら移動させるかは、ホイールで選択できるようにした。
が、現在どのボタンを押しながら移動するようになっているのかわかりづらい。
切り替え時にToolTipで表示しようかとも思ったが、強引にウィンドウのタイトルを書き換えてしまうことにした。
"Metasequoia 開いているファイル名"と表示されているところを、とりあえず"Metasequoia 右ボタン移動"と書き換えるようにしてみた。
だいぶわかりやすくなったが、拡縮か、移動、回転と表示されたほうがわかりやすいと思い、そのようにした。(設定依存だけど、標準設定と決め付けている)
いい感じだ。
ファイル名はわからなくなったけど、そこはほとんど見ないので問題ない。
まあ、おいおいファイル名も残すようにしようとは思うが。

これで大体目的は達成した。
ショートカットキーも登録できるので、登録すればボタン一発。
で、少し触ってみる。
なんか思ったよりも使い勝手は上がっていないような……
どうもマウスカーソルが動いてしまっているのが問題のような気がする。

まだまだ改良の余地はありそうだな。

投稿者 Takenori : 20:20 | トラックバック

1.0.0以上にしないといけない

配布出来るように出来たプラグインのバージョン設定などを変更して、ビルドしたらなぜかSmartScrollでプラグインがロードされていない。
再起動などしてみるが改善されず。
なんだろうと思いつつ、いろいろと変えていたら、バージョンを1.0.0以上に設定してビルドしないといけないようだ。
最初だから、0.1.0にしようと思っていたのだが、1.0.0にしないといけないのか。
でも、なんでそんなところを見ているんだろう?
なぞだ。

投稿者 Takenori : 21:35 | トラックバック

 
Total : Today : Yesterday :