Weirds -ゴーストUI拡張SAORI-

目次

説明

とりあえずメニューを表示できたりするもの。

ダウンロード

SAORI引数解説

SetHwnd
Argument0"set_hwnd"
Argument1DirectSSTPサーバのHWND
典型的にはSHIORI/3.0のhwndイベントで渡されるもの
Result/Value0以降なし

各種DirectSSTPの送信先HWNDを設定。

SetOwnerID
Argument0"owner_id"
Argument1owner id
典型的にはSHIORI/3.0のuniqueidイベントで渡される値
Result/Value0以降なし

DirectSSTP時に使用するOwnerIDを設定。

Show
Argument0"show"
Argument1メニュー定義文字列
省略可
Argument2スタイル定義文字列
省略可
Result/Value0以降なし

メニューを表示する。

Argument1のメニュー定義文字列を省略した場合、前回表示時のメニューが表示される。当然、SAORIロード後一度もメニュー定義文字列を渡していない場合には何も表示されない。

同時にArgument2によって、SetStyle相当の処理を行うことも可能。

メニュー表示位置はShow実行時のマウスカーソルの位置によって自動的に決定される。

SetStyle
Argument0"set_style"
Argument1スタイル定義文字列
Result/Value0以降なし

スタイルをセットする。初期化時に一度だけセットするような使い方や、毎分1度だけ切り替える、といった使い方を想定。画像のキャッシング等は行われない。スタイル定義文字列の詳細は後述。

新しいスタイルが適用されるのは次にメニュー定義文字列が渡されメニューが更新されたタイミングである。

Notifykeypress
Argument0"notify_keypress"
Argument1OnKeyPressイベントのReference0
Result/Value0以降なし

ベースウェアによってはキーボードでの操作をサポートするために、OnKeyPressのReference0を通知する必要がある。処理の必要の有無はSAORI内で判断されるため、無条件で呼びだして構わない。

MenuClose
Argument0"menu_close"
Result/Value0以降なし

メニューを閉じる。全てのOnMouseClickでMenuCloseを呼ぶことを強く推奨する。

ユーザの操作中にメニューを閉じてしまうことを防ぐために、それ以外のタイミングでは呼ばないことも強く推奨する。

メニュー定義文字列

メニュー定義文字列はバイト値[1]とバイト値[2]によって区切られた、ベースウェアによって提供されるおすすめ/ポータルに似たフォーマットの文字列である。

バイト値[2]によって区切られた各部分文字列を行、行のなかでバイト値[1]によって区切られた部分文字列を列と呼んで説明を行う。

各行は

[フォルダ][1][オプション][1][ラベル][1][タイプ]([1][引数1][1][引数2][1] ...[引数N])[2]

という形式を取る。

解釈は行単位で行われ、フォーマットに合致しない行があった場合は、その行のみが無視される。

フォルダ

第1列はフォルダである。

フォルダは、サブメニューを指定するための文字列であり、'\'によって区切られたWindowsのファイルパスに似た形式である。サブメニューの名前に'\'を使用する場合"\\"とエスケープする。

フォルダが空文字列、もしくは'\'のみの場合、メニューのルートを示す。

例:

空。このメニュー項目はルートに表示される。
\ルート。このメニュー項目はルートに表示される。
ヘッドラインこの項目はサブメニュー"ヘッドライン"に表示される。
ゴースト\さくらこの項目はサブメニュー"ゴースト"の更にサブメニュー"さくら"に表示される。
[商品\\\1000以下この項目はサブメニュー"商品"の更にサブメニュー"\1000以下"に表示される。

オプション

第2列はオプション文字列である。

オプションはメニュー項目個別の装飾を指定する文字列である。 定義済みの文字を文字列に含めることによってオプションを指定する。 オプションとして未定義の文字があった場合、単純に無視される。 現時点で定義されているのは以下のものである。

Cチェックマークを表示
S塗りつぶされた星印(★)を表示
D無効化。ラベルはmenu.disable.font.colorで描画され、選択時のアクションは実行されない。

例:

空。特にスタイルは指定されない。
Cチェックマークが表示される。
S星印が表示される。
Dメニュー項目が灰色で表示されアクションが実行されない。
CS'C'と'S'の同時指定。この場合、同じ場所に描画されるので余り意味はない。
SD星印が表示され、項目は無効化される。

ラベル

第3列はラベルである。

ラベルはメニュー項目に表示される文字列である。特に説明は必要ないだろう。ただし、タイプが"Separator"の場合はラベルは無視される。

表示可能な文字はUCS-2に存在し、且つスタイル定義文字列で指定された(もしくはデフォルトの)フォントに存在する文字、ということになる。

タイプ・引数

第4列はタイプ文字列であり、タイプによっては第5列以降に引数を取るものがある。

 タイプはメニュー項目の種別・動作を指定する最も重要な項目である。タイプによっては指定数の引数を取る。

識別子引数説明アクション
Dummy 0 ダミー。メニュー上に情報を表示したい場合に。
Separator 0 セパレータ
Link 1 URL 既定のブラウザでURLを開く。
Folder 1 フォルダへの絶対パス 指定されたフォルダをExplorerで開く。フォルダパスが絶対パスでない場合の動作は未定義。
SHExecute 4 ShellExecuteの第2-5引数
詳細はWin32APIリファレンスの"ShellExecute"の項目を参照。ShellExecuteの第一引数はSAORI内部のウィンドウが指定されている。
SHExecuteの第4引数とShellExecuteの第5引数の対応は以下の通り。

SHExecuteShellExecute
HIDESW_HIDE
MAXIMIZESW_MAXIMIZE
MINIMIZESW_MINIMIZE
RESTORESW_RESTORE
SHOWSW_SHOW
DEFAULTSW_SHOWDEFAULT
MAXIMIZEDSW_SHOWMAXIMIZED
MINIMIZEDSW_SHOWMINIMIZED
MINNOACTIVESW_SHOWMINNOACTIVE
NASW_SHOWNA
NOACTIVATESW_SHOWNOACTIVATE
NORMALSW_SHOWNORMAL
Script 1以上 Sakuraスクリプト
追加ヘッダ
引数で指定されたSakuraスクリプトをSetHwndで指定されたDirectSSTPサーバにSendする。
第二引数以降は"Header-Name: Header-Value"の形で記述することで、DirectSSTP送信時にそのままリクエストに付与される。 これによってIf-Ghost等の任意のヘッダ情報を付加することが可能。
Event 1以上 イベント名
イベント引数(r0,r1 ...)
引数によって指定されたイベントをDirectSSTPによってNotifyする。イベントのReference0以降を引数によって指定することが可能。Sakuraスクリプトの\![raise]に相当。
RawSSTP 1以上 SSTPを構成する全ヘッダ行 文字通り一行目の"SEND SSTP/1.1"等から全てを指定するモード。最終的に"Charset: Shift_JIS\r\n\r\n"が付与されたヘッダをDirectSSTPとして送信する。
Charsetに関しては固定である。

スタイル定義文字列

スタイル定義文字列はメニュー全体の背景、文字色等を指定する。ベースウェアによるオーナードローのスタイルを定義する"menu.background.bitmap.filename"等をひとまとめにしたものといえる。

各行はバイト値[2]で区切られ、項目名と値はバイト値[1]で区切られる。一つでもフォーマットに反した行が存在した場合、スタイル全体が無効になる。

凡例

RGB "255,63,0"といった10進形式でのRGB値指定
ピクセル ピクセル数
画像 PNG/JPEG形式の画像の絶対パス
top|bottom "top"もしくは"bottom"
left|right "left"もしくは"right"

スタイル

項目名種別説明
foreground.image 画像 アクティブ時の背景画像。
foreground.font.color RGB アクティブ時の文字色。
foreground.base.color RGB アクティブ時の背景のうち、画像が表示されていない部分の色。
background.image 画像 通常時の背景画像。
background.font.color RGB 通常時の文字色。
background.base.color RGB 通常時の背景のうち、画像が表示されていない部分の色。
sidebar.image 画像 サイドバーに表示する画像。
sidebar.base.color RGB サイドバー領域中、画像が表示されていない部分の色。
sidebar.align.y top|bottom サイドバー画像の表示位置。
background.align.x left|right 背景画像の横位置指定。
background.align.y top|bottom 背景画像の立位置指定。
menu.item.width ピクセル メニュー項目の幅。サイドバーが存在する場合はサイドバーの幅+この値が全体の幅となる。この幅でメニューのラベルが表示しきれない場合には表示しきれない部分は省略され、"..."が表示される。
sidebar.width ピクセル サイドバー画像が指定されていない場合のサイドバーの幅。画像が指定されている場合は無視される。

デフォルト値

 SAORIロード後に一度も有効なスタイルが指定されていない場合のデフォルトスタイル、及びスタイル定義文字列に該当する項目が含まれていない場合のデフォルト値は以下のとおりである。

foreground.image[1][2]
foreground.font.color[1]255,255,255[2]
foreground.base.color[1]0,0,0[2]
background.image[1][2]
background.font.color[1]0,0,0[2]
background.base.color[1]255,255,255[2]
sidebar.image[1][2]
sidebar.base.color[1]200,0,0[2]
sidebar.align.y[1]top[2]
background.align.x[1]bottom[2]
background.align.y[1]right[2]
menu.item.width[1]180[2]
sidebar.width[1]18[2]
menu.item.fontname[1]MS UI Gothic[2]
menu.disable.font.color[1]126,126,128$[2]

使用方法

推奨呼出し手順

  1. DLLロード後、SetHwnd、及び必要であればSetOwnerIDを呼びだしてそれぞれの値をセットする。
  2. SetStyleは、Show呼び出しより前に呼び出し、その後は、スタイルを変更するたびに呼び出す。
  3. NotifyKeyPressはOnKeyDownイベント発生時に常に呼び出す。処理の必要の有無はSAORI側で自動的に判断される。
  4. OnMouseClickイベント発生時にはまずMenuCloseを常に呼び出す。
  5. OnMouseClickでReference5が"1"のときなどにShowを呼び出す。
    補足

    SSP-2.01.80以降はベースウェア側のポップアップメニューの表示タイミングがOnMouseUpに変更された模様。このためOnMouseClickのタイミングでWeirdsを呼び出すと正常に動作しない。

制限事項・既知の問題点

  • Scriptでの"\-"の送信、Event通知の結果"\-"が返されるもの(OnClose等)、若しくはRawSSTPでそれに相当するものを実行するとプロセスが異常終了する。
  • \_u[]や数値参照のようにコードを直接指定する手段は提供されていないので、CP-932等に含まれていない文字を使用する場合にはSAORI呼び出し自体をUTF-8で行う必要がある。
  • 検証環境が存在しないためWindows98/Meでの動作は確認できてない。(Windows95/WindowsNT4.0以前は明示的に非サポート)

付録

Midzkiによる宣言例。

[saori: Weirds : "Weirds.dll"]
{
  scalar SetHwnd("set_hwnd", $hwnd);
  scalar SetOwnerID("owner_id", $id);
  scalar Show("show");
  scalar ShowMenu("show", $menu);
  scalar SetStyle("set_style", $style);
  scalar NotifyKeyPress("notify_keypress", $keyid);
  scalar MenuClose("menu_close");
}

履歴

  • '09/07/01 SSP-2.01.80以降のマウスジェスチャ対応に起因する諸問題に対する対応等。
  • '04/05/17 公開。

リンク

放置物
デモゴースト。ある程度このSAORIで何ができるかとか。