今思えば N88-BASIC インタプリタ内臓のエディタ、あれってラインエディタだよな……あの行き当たりばったりなインターフェースはどうにかならなかったのだろうか。
言語自体もそうだけれど、限界なり欠点なりが解りやすいからこそ、他のまともな言語やエディタに乗り換えるためのきっかけにもなってたように思う。
Quartett!、そういえば初回特典で冊子が、メーカー通販の特典で小冊子 + CD-ROM があったのを忘れてたので中身を確認。特に可もなく不可もなく。
いや、一つアレだ。CD-ROM。内容はゲーム序盤のコンテ、ムービー (Littlewitch のサイトで公開されている三つ + C64 版 + C65 版)、「カルテット! オン ザ デスク。」、壁紙の計四種類。で、問題は壁紙。100 種類あるのですが、その 51 番目が……いや……
せめてサムネイルでは隠しておけばいいものの……思いっ切り不意打ちだったのでコーヒー吹きました。
……はっ。そういえば Finale のときのフィルが両手を挙げているカット、あれはどこかで見たことあるような気がしたけど、今思えば予備校に通うごく一般的に見えなくもない!
.rc の読み書きは適当な関数が用意されているのでそれを使えばいいです。BBApi.cpp の ReadInt や WriteString 等参照。実装の詳細は見なかったことにします。
スタイルに関する情報は GetSettingPtr で引っ張ってきます。例えば GetSettingPtr(SN_TOOLBAR) でツールバーのスタイルに関する情報を参照できます。
スタイルに応じた背景や枠線の描画は MakeStyleGradient で行います。フォントは CreateStyleFont で引っ張ってくる。
メニューに関しては MakeNamedMenu で適当な Menu を作り、そこに MakeMenuNOP や MakeMenuItem 等で作成した MenuItem を追加していきます。サブメニューを作るには親となる Menu と子となる Menu を用意し、MakeSubmenu でそれらを関連付けます。作成した Menu は ShowMenu で表示します。削除に関しては何も考えなくて構いません。(多分) 本体側で面倒を見てくれます。
なお、プラグインを sticky にするには自分で MakeSticky や RemoveSticky をしなければなりません。MakeAlwaysOnTop のようなものは存在しませんが、これは以下のコードで代用できます。
SetWindowPos( self, HWND_TOPMOST, 'J', 'u', 'n', 'i',
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE );押さえておくところはこの程度です。後はご自由に。やろうと思えばぇろげだって作れます。BB4W たんが xoblite たんにあんなことやこんなk(ザー
「Quartett!」終了。「白詰草話」と比べるとボリュームが少ない (少々物足りない) こと以外は文句なし。
いや、あれは白詰の方が長すぎるのかな。両者ともに、基本的に話の筋は変わらず、二週目以降の共通部分が多いので、あまり長すぎると途中で疲れてしまう (実際白詰は途中で止めたし)。でも、あっという間に終わってしまうのは何だか。
後、サウンドトラックが一枚付属していたのだけど、収録されているのがカルテットのものと一部のボーカル曲 + αの計30分弱。もう少し追加しても良かったんじゃないかな。
で、まあ、白詰も Quartett もぇ(ザー)シーンにかなり違和感がある。これは全編に渡ってほとんど一人称な台詞しか出てこないのに、いきなり三人称な文章が頻出するのが原因。とはいえ、それなしで済ますのは難しいし、ねえ。
現在のデスクトップ。左上にあるのは BBMouseGesture 0.1.5p のナヴィゲーションウィンドウ。
Test version. Added the navigation window which shows what gesture you input.
入力されたジェスチャーを表示してみるテスト。ウィンドウの位置が固定だとか、移動できないとか、常に always on top だとか、フォントとジェスチャーによっては何か表示がおかしいとか、その辺りは見過ごしてください。
文字は微妙なのでアイコンで表示させようかと思ったのですが、画像の表示はどうやればいいのか解らないという話。単に表示するだけではなく、特定の色を現在のスタイルに合わせた色に変更して表示させたいと思ったけれど、そもそも画像の以下略。
Only show the name of the current workspace.
現在のワークスペース名を表示するだけ。解る人は気付いていると思いますが、今まで公開しているプラグインはグラフィカルな要素は一切入ってません。というかやったことがない。なので練習。はじめてのプラグイン作成の参考程度に。アレな部分がかなりありますが、まあ、その辺りはお触り厳禁。
あー、そういえば .rc を blackbox.exe のあるディレクトリに吐いてた気がする……
Menu* menu;
menu = MakeNamedMenu("title", "id", show_or_hide);
MakeMenuNOP(menu, "nop label");
MakeMenuItem(menu, "hide plugins", "@BBHidePlugins", false);
MakeSubmenu(menu, other_menu, "submenu label");
...
ShowMenu(menu);StyleItem* toolbar_style = (StyleItem*)GetSettingPtr(SN_TOOLBAR);
I've released BBMouseGesture 0.1.4 with dirty source code.
I've released BBKontroller 0.2.1 that is compatible with BBCmd 0.1.0.
BBCmd 0.1.0 に対応。それ以外は変わりありません。
I've released BBCmd 0.1.0 with dirty source code.
Now BBCmd supports all commands which are used by both BBController and BBKontroller.
Note that this version is not compatible with any applications which are released before this.
loop とか、{ と } で括ったコマンドを一つのコマンドと見なすとか、break とか continue とか false とか true とか。既存のアプリケーションと完全に互換性がないので注意。
あー、xoblite は BBMouseGesture と結構相性悪い。モディファイヤ付きのクリックを再生しても、GetAsyncKeyState 使ってるからモディファイヤを認識してくれない。しかもツールバーにいたってはマウスで操作不能と来た。本家の方は試してないけど、ソース見る限り同様だと思う。
bbLean は問題なし。
ふと思ってよく使うコマンドを調べてみた。
$ sed -e 's/^\([^ ]*\).*$/\1/' ~/.bash_history \
> sort | uniq -c | sort -nr | head -10
3917 make
3826 ls
3131 cd
2354 vi
2118 cvs
1575 ps
979 gcc
884 ./BBKontroller
854 rm
631 python何で BBKontroller がこんなに多いんだ。
いやまあ、面白そうだけど、何故に KDE。
The workspace(dir, r, c) command which is supported by BBCmd does not work on xoblite, because xoblite does not support the API GetDesktopInfo to get the information of a workspace. But workspace(n) works well.
壁紙を萌えなものに変えたせいで無性に壁紙が見たくなる。でも大半がウィンドウで隠れてしまう。
という訳で適当に SetLayeredWindowAttributes で、
seethru 196 target_window
のようなコマンドを作って半透明にしてみた……ら……重い重い。何、このもたつくカーソルの動き (カーソルといってもエディタのカーソル)。全体を巻き込むような重さではないのだけど、レスポンスが一歩遅れるせいで見た目にも感覚的にも重く感じる。すごいストレスだ。
やめたやめた。
gesture EdgeTop = mainmenu # Invisible BB button
gesture EdgeTopLeft = mainmenu # Another invisible one
If you load BBMouseGesture with large configuration file (for example, the sample configuration file which is included in BBMouseGesture archives), the CPU usage will skyrocket to 100%.
I found that this problem will occur on only Blackbox for Windows 0.0.82, and this problem will not occur on BB4W 0.0.90 and bbLean 1.12 U1.
To avoid this problem, you have to reduce the size of your BBMouseGesture.rc by removing needless comments or etc.
I couldn't guess why this problem occurs. Humm...
本家 0.0.82 で BBMouseGesture をロードした場合、ある程度以上のサイズの設定ファイル (例えばアーカイブに同梱してるサンプル) だと CPU 使用率が 100% になります。0.0.90 や bbLean だと問題なし。コメントを削除するなどして設定ファイルのサイズを減らすと一応問題は回避できます、が、何でこんなことが起こるんだろう……
I've released BBCmd 0.0.6.
Added workspace(n) command.
workspace(dir, r, c) とすると、ワークスペースが r 行 c 列の行列のように配置されていると考え、その中の dir 方向にあるワークスペースに移動します。移動先が存在しなければ反対側にループ。
……解りにくいな。ワークスペースを 9 個にして、以下のような設定の BBMouseGesture で暫く触ってみれば解ります。
gesture R DownLeft RUp = workspace(1, 3, 3) gesture R Down RUp = workspace(2, 3, 3) gesture R DownRight RUp = workspace(3, 3, 3) gesture R Left RUp = workspace(4, 3, 3) gesture R Right RUp = workspace(6, 3, 3) gesture R UpLeft RUp = workspace(7, 3, 3) gesture R Up RUp = workspace(8, 3, 3) gesture R UpRight RUp = workspace(9, 3, 3)
うがあああああああああああああああああああああ! うがああああああああああ!
BBMouseGesture に設定ファイルの末尾に記述した設定が無視される脆弱性が発見されました。
こんなミス第 n 回。
const char* default_conf = "gesture *C-*M-*S-*W-LDown ..."; strcpy(conf, default_conf); fread(conf+strlen(default_conf), sizeof(char), file_size, file); conf[file_size] = '\0';
和訳: 設定ファイルの内容に暗黙的に存在する設定を付け足してるのはいいのだけど、末尾の NUL を付加する場所が間違ってる。
I've released BBMouseGesture 0.1.3a.
gesture *C-*M-*S-*W-LDown *C-*M-*S-*W-LUp = playback('_-RDown', '_-RUp')
gesture *C-*M-*S-*W-RDown *C-*M-*S-*W-RUp = playback('_-LDown', '_-LUp')
BBMouseGesture 0.1.3a をリリースしました。
さあアホ臭くなってきました。
モディファイヤの表記は窓使いの憂鬱をぱk(ザー)参考にしてます。さすがに NumLock 等は微妙なので無視してますが。入力されたキーと同じモディファイヤの指定は、今思えば `_' で代用せずとも同様の記法で賄えたかな。
ちなみに、モディファイヤの指定は一つのジェスチャーで統一しなくてもよいので、
gesture C-MDown S-MUp = aboutplugins
このようなアホな指定もできます (和訳: Ctrl 押しつつ中ボタンを押し、Shift を押しつつ 中ボタンを離す)。
$ wc --lines --bytes BBMouseGesture.c BBMouseGesture.rc README
2544 60244 BBMouseGesture.c
582 17963 BBMouseGesture.rc
194 4921 README
3320 83128 totalI've released BBMouseGesture 0.1.2a.
BBMouseGesture をリリースしました。変更点は [2004-04-16T18:06] 参照。
$ wc --lines --bytes BBMouseGesture.c BBMouseGesture.rc README
2216 52617 BBMouseGesture.c
524 16423 BBMouseGesture.rc
188 4698 README
2928 73738 total……これ、絶対に分割すべきだよな。
$ wc --lines --bytes BBMouseGesture.c BBMouseGesture.rc README
2126 50364 BBMouseGesture.c
508 15865 BBMouseGesture.rc
177 4164 README
2811 70393 total後、命名規則が素晴らしく統一されてない。Event_FromString とか on_state_gesturing とか混じってる。
BBMouseGesture、設定ファイルのパーサーの書き直しは終わった。面倒だったけど、後から何か追加する際に困ったことになるので。
次期バージョンでの変更点 (予定) は、
gesture LDown LUp = playback() gesture RDown RUp = playback() gesture MDown MUp = playback() gesture X1Down X1Up = playback() gesture X2Down X2Up = playback()
割り当てて何が楽しいのかと云われると困りますが。取り敢えず、以上のものが実装できたら次にモディファイヤの予定。
メールチェッカ。ようやく出ましたね。まだドキュメントは用意されていませんが、早く公開した方がいいと判断したようです。
個人的にメールチェッカの類は不要なので試してすらいませんが。Liam もありますが、これも試してすらいないので何が違うかさっぱり。
非常にお手軽にブートスクリーン (起動時に表示されるアレ) を変更できる。
できるのはいいんだけど、基本的に電源を落とさずに hibernate しているので、せっかく変更した画面が滅多に見れない (電源落としてから起動すると、起動後から実際に作業ができる状態になるまですごく時間がかかるからです。というか何であんなにかかるんだ)。
後、今一再現条件が掴めないけれど、ブートスクリーンを変更していると hibernate するときに OS が落ちる。正確には、hibernate すると途中でデフォルトのブートスクリーンと同じような画面に切り替わるのだけれど、切り替わる際、一旦ディスプレイが真っ暗になった状態のところで止まる。という訳で強制的に電源落とさないといけない羽目に。
……ああ、これはブートスクリーンを見せるための策か!
BBMouseGesture、モディファイヤの左右 (キーボードでの位置) を区別できるようにする案が出たのだけど、片手マウス片手キーボードだと向かい側にあるモディファイヤを押しにくいので却下。左 Shift と右 Ctrl を押しつつマウスを右クリックなんてできないよ! (しかもキーボードによっては右 Ctrl 等がない。また 9x 系では簡単に区別する方法はない)
それにモディファイヤの指定や比較が面倒。やっぱり却下。区別しなければ (i & (~l)) == s のような式で一発なのだけど。
そういえば xoblite は中クリックが workspace menu ではなく styles menu だったような。個人的には styles menu の方がいいので、
window BB4W /^BlackboxClass|xoblite$/ gesture MDown MUp = stylesmenu
のような定義ができるようにしたいな。現状ではシングルクリックはジェスチャーとして定義できないようにしているし、できたとしてもアプリケーションの区別をしないので困ったことになる。
I've released BBMouseGesture 0.1.1a.
そろそろやっつけな設定ファイルの読み込み部分を直さなければならないな。構文の追加などろくにできない。
$ wc --lines --bytes BBMouseGesture.c BBMouseGesture.rc README
1841 44590 BBMouseGesture.c
505 15576 BBMouseGesture.rc
168 3809 README
2514 63975 total# Pseudo-bbEdgeFlip # Disable to receive any events except EdgeLeft and EdgeRight option start_event = option end_event = option single_event = EdgeLeft EdgeRight # Bind commands to the gestures gesture EdgeLeft = deskleft gesture EdgeRight = deskright
ちなみに BBMouseGesture 0.1.0a なら、上記のようにすることで似非 bbEdgeFlip ができる。さすがにウィンドウをドラッグするとそれと共にワークスペースを移動、何て芸当は無理だけど。
ではモディファイヤと EdgeXxxYyy の判定周りの修正と playback(events) の実装でもしてきます。あああああ、その前にタイムアウトがきちんと動作するように修正しないと。
I've released BBMouseGesture 0.1.0a.
Added information in English and modified many things. But there is no big change that you have to know.
英訳追加。色々と変更。ユーザーの視点からは特に何も変わっていません。
$ wc --lines --bytes BBMouseGesture.c BBMouseGesture.rc README
1750 42570 BBMouseGesture.c
457 14303 BBMouseGesture.rc
161 3537 README
2368 60410 totalBBMouseGesture 0.0.1a をリリースしました。一箇所不具合 (それも滅多に起きないもの) を潰しただけで、以前のものと変わりありません。後は README を追加したくらいです。
アホくさいけど。style の rootoCommand を以下のようにすれば 3D Color Changer のカラースキーマを style の変更と共に適用することができます。
rootCommand: BBKontroller "exec('bsetroot', 'OPTIONS_FOR_BSETROOT')
open('PATH\TO\SCHEME.3DC')"実際には一行です。シングルクォートとダブルクォートの違いにも注意。
open() で駄目なら shellexecute('apply', 'PATH\TO\SCHEME.3DC')、exec('bsetroot', ...) で駄目なら exec('PATH\TO\bsetroot', ...) とでもしてください。
BUGS: Are you sure you want to apply the following scheme
が出る。
BBColorEx を使いましょう。
BBKontroller 0.2.0 をリリースしました。
BBCmd を利用するように変更しました。使用するには BBCmd をインストールする必要があります。
I've released BBKontroller 0.2.0.
Modified to use BBCmd. So you have to install BBCmd to use BBKontroller.
いやー、困った困った。何が困ったかというと、BBKontroller-Proxy をリコンパイルしたら gcc が黙って不適切なバイナリを吐くこと。最も過去のバージョンに戻してリコンパイルしても同じなので、インポートライブラリ (Blackbox.lib) が原因か、あるいは昨日アップデートされたと思う (Cygwin の setup.exe で適当にやってるので何が更新されるのかちゃんと確認していない) gcc が原因か。今までちゃんとコンパイルできていたし、他のインポートライブラリをリンクするとちゃんとリンクされるのだけど。
どの辺りが不適切かというと、
$ objdump -p INVALID-BBKontroller-Proxy.dll \
> | sed -e '/DLL Name: Blackbox.exe/,/^$/!d'
DLL Name: Blackbox.exe
vma: Hint/Ord Member-Name Bound-Toリンクしているバイナリの名前はあるものの、利用しているはずの API の名前がない。通常ならば、
$ objdump -p EXPECTED-BBKontroller-Proxy.dll \
> | sed -e '/DLL Name: blackbox.exe/,/^$/!d'
DLL Name: blackbox.exe
vma: Hint/Ord Member-Name Bound-To
526c 11 GetBBWndこのように名前があるはずなのに。
上記の例では、GetBBWnd の存在する場所が不明なままになっているので、適当なアドレスを GetBBWnd と見なして呼び出します。その結果、BB4W ごと巻き込んで落ちる。
で、コンパイルできない (というかまともなバイナリを吐いてくれない) のは困るので、何となく自力でインポートライブラリを作成して、それをリンクさせればちゃんとしたバイナリができました。
$ echo EXPORTS >bb4w.def $ nm /usr/local/lib/BB4W/Blackbox.lib \ > | grep ' T _' | sed -e 's/.* T _//' >>bb4w.def $ dlltool --def bb4w.def --dllname blackbox.exe --output-lib libbb4w.a
これで Ok。でも何で Blackbox.lib が駄目で、作り直したインポートライブラリだと大丈夫なのか。
Blackbox for Windows 関連の情報を別のページにまとめました。
いい加減ファイル名変えないとアレなんですが。
ほぼ最終段階に差し掛かりました。前回との変更点は:
の三つです。詳しくは同梱の設定ファイルを参照してください。
残りの作業は、
exclusions に関しては、どちらかというとアプリケーションごとにバインドを設定した方がいいような気がする。設定を継承させたりさせなかったりすればそれなりに素敵なはず。
$ wc BBMouseGesture.c 1684 4001 42783 BBMouseGesture.c