IMEを制御したい

IME の 制御方法が分からなかったので、
flash 経由で制御する 拡張 を 作ってみた。

当初は、データスキームで埋めこもうとしたのですが、flashが再生されなかったのです。
(やりかたがまずい か セキュリティ周りの制限か わかりません)


ime.xpi(バイナリをハテナに置く方法がわからなかったので外部です。)


多分macでも動くはずですが、試したわけではありません。
linuxは そもそも flexのdocumentに 載ってませんでした(;´д`)

拡張のid の 命名規則がよくわからなかったので、@以降は、localhostにしてます。

gIMEController

enabled(getter,setter)

IME の ON/OFFの状態 取得・設定

conversion(getter,setter)

IME 変換モードの取得・設定

mode(Object)

conversion に 代入可能な 文字列一覧
参考

removeTrustFile

組み込んだswfを FlashPlayerTrust にするためのファイルを削除
(拡張を削除したときに自動消すようになってはいます。)

以下ショートカット

setHanKana()

半カナモードに変更

setZenKana()

全カナモードに変更

setKorean()

多分韓国語モードに変更

setAscii()

ascii モードに変更(IMEは ON)

setChinese()

多分中国語モードに変更

setAsciiFull()

全角アスキーモードに変更

setZenHira()

全角ひらがなモードに変更


flex3 を触ってみて思ったのは、「型付Javascript めんどくさい」でした…
せめて、Pascalっぽい宣言じゃなくて Cっぽい宣言にして欲しかったです。
あと、セキュリティ周りがさっぱりで IME and DiMENSiONを参考にしました。


以下、gIMEController を 使った IME 制御プラグインです。

liberator.globalVariables.ime = "vimpoff"でコマンドラインに focusすると ime off に して、 抜ける時に 元に戻します。

liberator.globalVariables.ime = "skkime" で入力ボックスに focusすると asciiモード に 変更します。
また、これがないと「;」が上手く動作しません。



(function(self){
if(!("gIMEController" in window)) return;

const mode = liberator.globalVariables.ime || "skkime";
let attr = "@"+self.NAME;

let(obj=userContext[attr]){
obj && obj.uninstall && obj.uninstall();
}

let Types = {
skkime:{
install:function(){
function focus(event){
let e=event.target;
let tag = e.tagName.toLowerCase();
if((tag === "input" && e.type === "text")
|| (tag === "textbox")
|| (tag === "textarea")
){
gIMEController.setAscii();
}
}
window.addEventListener("focus", focus, true);
this.uninstall = function(){
window.removeEventListener("focus", focus, true);
};
},
},
vimpoff:{
install:function(){
var elm = document.getElementById("liberator-commandline-command");
var ime;
function focus(event){
ime = gIMEController.enabled;
gIMEController.enabled = false;
}
function blur(){
gIMEController.enabled = ime;
}

elm.addEventListener("focus" , focus , false);
elm.addEventListener("blur" , blur , false);

this.uninstall = function(){
elm.removeEventListener("focus" , focus , false);
elm.removeEventListener("blur" , blur , false);
};
}
}
};
let obj=Types[mode];

userContext[attr]= obj;
obj && obj.install && obj.install();
})(this)
;