goDoCommand
goDoCommandの実体を調査。
global/resources/content/globalOverlay.js
function goDoCommand(command) { try { var controller = top.document.commandDispatcher.getControllerForCommand(command); if ( controller && controller.isCommandEnabled(command)) controller.doCommand(command); } catch (e) { dump("An error occurred executing the " + command + " command\n" + e + "\n"); } }
というのがdoCommandで実行してる。
キー定義は拡張勉強会で教えてもらったとおり
www.mozilla.gr.jp/addon_study/archive/20070901/firemacs.pdf
mozilla/content/xbl/builtin/win/platformHTMLBindings.xml
<handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext"/> <handler event="keypress" keycode="VK_LEFT" modifiers="shift,control" command="cmd_selectWordPrevious"/> <handler event="keypress" keycode="VK_RIGHT" modifiers="shift,control" command="cmd_selectWordNext"/> <handler event="keypress" key="y" modifiers="accel" command="cmd_redo"/>
こんなかんじ。
何をするかは
mozilla/dom/src/base/nsGlobalWindowCommands.cpp
const char * const sSelectAllString = "cmd_selectAll"; const char * const sSelectNoneString = "cmd_selectNone"; const char * const sCopyImageLocationString = "cmd_copyImageLocation"; const char * const sCopyImageContentsString = "cmd_copyImageContents"; const char * const sCopyImageString = "cmd_copyImage"; const char * const sScrollTopString = "cmd_scrollTop"; const char * const sScrollBottomString = "cmd_scrollBottom"; const char * const sScrollPageUpString = "cmd_scrollPageUp"; const char * const sScrollPageDownString = "cmd_scrollPageDown"; const char * const sMovePageUpString = "cmd_movePageUp"; const char * const sMovePageDownString = "cmd_movePageDown"; const char * const sScrollLineUpString = "cmd_scrollLineUp"; const char * const sScrollLineDownString = "cmd_scrollLineDown"; const char * const sScrollLeftString = "cmd_scrollLeft"; const char * const sScrollRightString = "cmd_scrollRight"; // These are so the browser can use editor navigation key bindings // helps with accessibility (boolean pref accessibility.browsewithcaret) const char * const sSelectCharPreviousString = "cmd_selectCharPrevious"; const char * const sSelectCharNextString = "cmd_selectCharNext"; const char * const sWordPreviousString = "cmd_wordPrevious"; const char * const sWordNextString = "cmd_wordNext"; const char * const sSelectWordPreviousString = "cmd_selectWordPrevious"; const char * const sSelectWordNextString = "cmd_selectWordNext"; const char * const sBeginLineString = "cmd_beginLine"; const char * const sEndLineString = "cmd_endLine"; const char * const sSelectBeginLineString = "cmd_selectBeginLine"; const char * const sSelectEndLineString = "cmd_selectEndLine"; const char * const sSelectLinePreviousString = "cmd_selectLinePrevious"; const char * const sSelectLineNextString = "cmd_selectLineNext"; const char * const sSelectPagePreviousString = "cmd_selectPagePrevious"; const char * const sSelectPageNextString = "cmd_selectPageNext"; const char * const sSelectTopString = "cmd_selectTop"; const char * const sSelectBottomString = "cmd_selectBottom";
こんな感じで書いてある。そんなにないのでぜんぶはっとく。
実際処理をする部分は
else if (!nsCRT::strcmp(aCommandName, sBeginLineString)) rv = aSelectionController->IntraLineMove(PR_FALSE, PR_FALSE);
これ。
イベントキュー経由で実行してもらったりはしない。直接実行。
あー難しい。