win32のBrowserクラスを使ってフルスクリーンモード

「組込み」でも「オープンソース」でもないような気がするが,そういう仕事もたまには入ってくる.
っていうか,ここ数ヶ月の売り上げの少なからずを占めていたりする.

class monamour555 implements 器用貧乏 {

fullscreen - お題解説

Win32でもLinuxでも動くキオスク端末を作りたくてSWTとRCPを使う,とか,救いようのないニッチな要求にはぴったりの情報.
言い方を変えると,殆どのプログラマには役に立たないネタ.

お題 : SWTを使って,キオスク端末を作りたい.


Win32でCOMプログラミングを齧った人なら常識の話.
Explorerオブジェクトは,キオスクモードとかフルスクリーンモードとかシアターモードとか言われている表示モードをコントロールできる.


Win32でSWTを使う人ならほぼ常識の話.
win32のBrowserクラスは,内部では,OLE経由でApplication.Explorerオブジェクトを使っている.
ただし,移植性を高めるというEclipse的美学のせいなのか,SWTのBrowserクラスには最小限のメソッドしかない.


これらを踏まえると,Browserクラスを使ってフルスクリーンのIEを表示させれば目的は達成できそうな気がする.

サブクラス化,失敗.

真っ先に考えたのが,継承を使う手.


検索をかけると,SWT/Browserの拡張というページがトップで出てくるが,ちょっと情報が古いらしい.

最近のSWTは,大抵のグラフィカルコンポーネントでSubclassを禁止している.Browserも例外ではない.

org.eclipse.swt.SWTException: Subclassing not allowed at 〜

なんて言われて哀しい.しかし,抜け道が無いわけでもない.

protected checkSubclass() {
  // kill subclass check.
}

とやれば回避できる.

しかし,これは今回の場合,何の解決にもならない.Browser.auto はアクセス修飾子無し.サブクラスに引きずり出せない.ダメ.

Browser.execute(String)

次善の策.というか,自前でBrowserを作らないならこの手しか考えられない(はず).

browser.execute("window.open('http://example.com/','target','fullscreen=yes,scrollbars'");

XP SP2以降は,「インターネットオプション」の 「詳細設定」の「マイコンピュータのファイルでのアクティブ コンテンツの実行を許可する」がオフになっているが,これをいじらなくても動作するっぽい.


Mozillaを使うらしいLinux版やSafariを使うOSX版では,同じスクリプトは使えないはず.でも類似の方法でなんとかなる…よね?
*1

Browser.execute(String)の注意点.

こいつは,メソッド内部でdocumentオブジェクトを探すので,呼び出しに先駆けて何らかのドキュメントを読んでおかねばならない.
SWTがサポートする全ての実行環境でそうなのかまでは調べていないが,少なくともwin32.win32.x86では間違いなくそうなっている.

browser.setUrl("about:blank");
browser.execute("window.open('http://example.com/','target','fullscreen=yes,scrollbars'");

こんなので十分みたい.
でも,念を入れて,LocationListener.changed(LocationEvent) などの中で execute すべきなのかもしれない.

setUrl を入れ忘れるとウインドウは開かず,execute メソッドには false が返る.

*1:コンテンツ屋ではない私は,具体的に何をするのかまでは,判らない.退却.