web-dev-qa-db-ja.com

文字を食べるxdotool typeコマンド

単純なキーコンボを押すたびに、xmonadに共通の文字シーケンスを入力させようとしています。この問題の1つの例は、単にメールアドレスを入力することです。

これは、xmonadの構成ファイルが私にとってどのように見えるかです:

import XMonad
import XMonad.Config.Gnome (gnomeConfig)
import XMonad.Util.CustomKeys (customKeys)
import XMonad.Util.EZConfig

main = xmonad $ gnomeConfig {
  keys = customKeys delKeys insKeys,
  logHook = return ()
  }
  where
    -- Remap mod-p to dmenu and mod-[sd] to swapping xinerama screens.
    delKeys :: XConfig l -> [(KeyMask, KeySym)]
    delKeys XConfig { modMask = modMask } =
      [ (modMask, xK_p), (modMask, xK_w), (modMask, xK_e) ]

    insertEmailAddress :: KeyMask -> [((KeyMask, KeySym), X())]
    insertEmailAddress modMask = [ ((noModMask, xK_Menu), spawn "xdotool type [email protected]") ]

    insKeys :: XConfig l -> [((KeyMask, KeySym), X())]
    insKeys XConfig { modMask = modMask } = insertEmailAddress modMask

ただし、メニューキーを押すと(キーボードの右下にあります)、最後の半分しか取得できません。いいね:[email protected]または[email protected]。どこから印刷を開始するかはまったく予測できません。

xdotoolコマンドをxdotool sleep 0.1 type [email protected]に変更することで回避策を見つけました。これは必ず機能するように見えますが、その理由はわかりません。何かご意見は?

xmonad 0.11およびxdotoolバージョン3.20140217.1を使用

3
wafflecat

--syncオプションはまさに私が探していたものでした!

ただし、--syncオプションは、getコマンドまたはsearchコマンドの特定のセットにのみ存在します。

ソリューションは次のようになりました:xdotool getwindowfocus windowfocus --sync type [email protected]

ここで何が起こっているかは、最初にgetwindowfocusを介してフォーカスされたウィンドウを取得することです(他が機能しない場合は、getactivewindowが代替です)。

私たちがやっていることは、アクティブなウィンドウを取得して同じものに設定することだけです。主な違いは、前のコマンドが適用されるまでxdotoolを強制する--syncオプションの存在です。

そのため、特定のウィンドウにフォーカスし、コマンドを入力できるようになります。

3
wafflecat

--delay(デフォルトは12ms)を使用して、キーストローク間の遅延を増やす必要がある場合があります。

xdotool type --delay 100 [email protected]
1
Sylvain Pineau