Example #1
0
    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]
Example #3
0
    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()