def _interpret_main(self): """ 非常駐時は即座に終了する. @exception IOError iniファイルが無いor読み込めない @note 抜ける際に実行中を解除すること! @todo 実行中の解除が manual なので RAII で何とかしよう. """ log.debug("starting interpretation...") # 同時実行されないよう排他制御. # 実行中に来た場合は即座に return させる. # # ただし time.sleep の最中にウィンドウメッセージを投げても # それは Windows 側で sleep が終わるまで滞留されてしまうため, # 自動ペースト時の待機時間中にホットキーを押した場合は # 待機時間を終えた後に再びメニューが表示されるという挙動になる. # (mainwindowではホットキー押下時にここを呼び出すための # ウィンドウメッセージを発行するような実装になっている) with lockguard.LockGuard(self._mutex): if self._is_interpreting: log.debug("under lockguarding in interpret().") return self._is_interpreting = True log.debug("exclusion passed.") log.debug("before ini2list.") if not(self._ini2list()): self._is_interpreting = False endhandler.inst.run() return log.debug("after ini2list.") # メニュー表示時に自ウィンドウがアクティブになるので # 表示後に元に戻すために, 保持しておく. previous_target_hwnd = gui_info_wrapper.get().get_foreground_hwnd() log.debug("before _interpret_menu.") selected_commanddata = self._interpret_menu() if selected_commanddata=="": self._is_interpreting = False windowutil.ActivateWindow(previous_target_hwnd) return log.debug("after _interpret_menu.") windowutil.ActivateWindow(previous_target_hwnd) log.debug("before commandinterpreter::interpret") self._cmdinterpreter.interpret(selected_commanddata) log.debug("after commandinterpreter::interpret") # 非常駐モード時は即座に終了する. if not(config.inst.get_use_resident()): log.debug("exit because transient mode.") endhandler.inst.run() # 最後に実行中を解く. self._is_interpreting = False
def get(self): """ set_hoge で特別な取得を設定した場合はそこから取得, そうでなければ通常の取得. 特別な取得は一度のみ有効. """ if self._special_get_handler: retx, rety = self._special_get_handler() self._special_get_handler = None return [retx, rety] # ターゲットウィンドウの情報を取得 guiinfo = gui_info_wrapper.get() if config.inst.get_use_menupos_mouse(): return guiinfo.get_mousepos() if config.inst.get_use_menupos_caret(): ret = guiinfo.get_caretpos() if len(ret) == 2: return ret # 正常に取得できなかった場合は # 次の設定を使用する. # 取得値が負の値でも気にしない. # どうなるかは TrackPopupMenu 次第. # ->作者環境では 0 とみなされた. # マルチディスプレイだとどうなるか等は未調査. retx = config.inst.get_menupos_x() rety = config.inst.get_menupos_y() if config.inst.get_use_menupos_absolute(): basex, basey = [0, 0] else: # ターゲットウィンドウを基点とした相対位置 basex, basey = guiinfo.get_foreground_windowpos() return [basex + retx, basey + rety]
def _interpret_menu(self): """ @retval 空文字列 メニュー表示に失敗orメニュー表示を省略 """ with menucreator.MenuCreator() as creator: empty = "" tracker = menutracker.MenuTracker(self._hwnd) macroer = macro.Macro(gui_info_wrapper.get()) # メニュー作成前に必要な設定はここで取得. maxlen_menuitem = config.inst.get_menuitem_length() if maxlen_menuitem<=1: maxlen_menuitem = config.Config.MAP["menuitem_length"] # メニュー作成前に Config を初期値に戻す. # 初期値がベースだから. config.inst.init() # 各行を解釈してメニューを作成 line_interpreter = LineInterpreter(creator, macroer, maxlen_menuitem) try: for i in range(len(self._content_of_file)): line_interpreter.interpret(self._content_of_file[i]) except config.ConfigError as e: # 下位でダイアログ表示まで行っているため, # ここでは何もせずそのまま raise raise except historymenu.HistoryError as e: # 下位でダイアログ表示まで行っているため, # ここでは何もせず中断. return empty except Exception as e: # 予期せぬエラー含め内部エラーはここで吸収. errmsg = dlgmsg.MSG_ERROR_INTERNAL_INTERPRET_LINE % dlgmsg.exception2str(e) dialog_wrapper.ok(errmsg) return empty if self._use_config_only: return empty # 完成したメニューデータを取り出す. # 作成に失敗していたら警告を出して終了する. menudata = None try: menudata = creator.get_menudata() except ValueError as e: dialog_wrapper.ok(dlgmsg.MSG_ERROR_INVALID_MENU_STRUCTURE % dlgmsg.exception2str(e)) endhandler.inst.run() # コピペコマンド側で使うため, マクロインスタンスを動的情報にセット. selfinfo_dynamic.macro_interpreter2snippet = macroer # 作成したメニューを表示し, 選択項目に対応する値を取得. retval = empty try: mx, my = trackpositioncalculator.inst.get() retval = tracker.track(menudata, mx, my) except Exception as e: # メニューキャンセル時にもここに入るのでダイアログにはしない. log.error( "interepretation error: failed to track." + str(e) ) return retval
# encoding: utf-8 import selfinfo_dynamic import command_data import config import macro import gui_info_wrapper import commander_copypaste # うざいので自動ペーストを off に config.inst.set("use_auto_paste", "False") # 必要な dynamic 情報を準備 selfinfo_dynamic.macro_interpreter2snippet = \ macro.Macro(gui_info_wrapper.get()) simplecmd = commander_copypaste.SimpleCopypasteCommander() snippetcmd = commander_copypaste.SnippetCopypasteCommander(simplecmd) def run(cmdname, snippetname=None): cmddata = command_data.CommandData(cmdname, snippetname) snippetcmd.run(cmddata) run("version") run("snippet", "cmain") run("snippet", "macrotest") run("snippet", "not_exist") run("snippet")
def get_mousepos(): guiinfo = gui_info_wrapper.get() return guiinfo.get_mousepos()