Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
XDOTOOL(1)							      XDOTOOL(1)

NAME
     xdotool - command-line X11 automation tool

SYNOPSIS
     xdotool cmd args...

     Notation: Some documentation uses [window] to denote an optional window ar-
     gument. This case means that the argument, if not present, will default to
     "%1". See "WINDOW STACK" for what "%1" means.

DESCRIPTION
     xdotool lets you programmatically (or manually) simulate keyboard input and
     mouse activity, move and resize windows, etc. It does this using X11's
     XTEST extension and other Xlib functions.

     There is some support for Extended Window Manager Hints (aka EWMH or
     NetWM).  See the "EXTENDED WINDOW MANAGER HINTS" section for more informa-
     tion.

KEYBOARD COMMANDS
     key [options] keystroke [keystroke ...]
	 Options:

	 --window window
	     Send keystrokes to a specific window id. You can use "WINDOW STACK"
	     references like "%1" and "%@" here. If there is a window stack,
	     then "%1" is the default, otherwise the current window is used.

	     See also: "SENDEVENT NOTES" and "WINDOW STACK"

	 --clearmodifiers
	     Clear modifiers before sending keystrokes. See CLEARMODIFIERS be-
	     low.

	 --delay milliseconds
	     Delay between keystrokes. Default is 12ms.

	 Type a given keystroke. Examples being "alt+r", "Control_L+J",
	 "ctrl+alt+n", "BackSpace".

	 Generally, any valid X Keysym string will work. Multiple keys are sepa-
	 rated by '+'. Aliases exist for "alt", "ctrl", "shift", "super", and
	 "meta" which all map to Foo_L, such as Alt_L and Control_L, etc.

	 In cases where your keyboard doesn't actually have the key you want to
	 type, xdotool will automatically find an unused keycode and use that to
	 type the key.

	 With respect to "COMMAND CHAINING", this command consumes the remainder
	 of the arguments or until a new xdotool command is seen, because no
	 xdotool commands are valid keystrokes.

	 Example: Send the keystroke "F2"
	  xdotool key F2

	 Example: Send 'a' with an accent over it (not on English keyboards, but
	 still works with xdotool)
	  xdotool key Aacute

	 Example: Send ctrl+l and then BackSpace as separate keystrokes:
	  xdotool key ctrl+l BackSpace

	 Example: Send ctrl+c to all windows matching title 'gdb' (See "COMMAND
	 CHAINING")
	  xdotool search --name gdb key ctrl+c

     keydown [options] keystroke
	 Same as above, except only keydown (press) events are sent.

     keyup keystroke
	 Same as above, except only keyup (release) events are sent.

     type [options] something to type
	 Options:

	 --window windowid
	     Send keystrokes to a specific window id. See "SENDEVENT NOTES" be-
	     low. The default, if no window is given, depends on the window
	     stack. If the window stack is empty the current window is typed at
	     using XTEST. Otherwise, the default is "%1" (see "WINDOW STACK").

	 --delay milliseconds
	     Delay between keystrokes. Default is 12ms.

	 --clearmodifiers
	     Clear modifiers before sending keystrokes. See CLEARMODIFIERS be-
	     low.

	 Types as if you had typed it. Supports newlines and tabs (ASCII newline
	 and tab). Each keystroke is separated by a delay given by the --delay
	 option.

	 With respect to "COMMAND CHAINING", this command consumes the remainder
	 of the arguments and types them. That is, no commands can chain after
	 'type'.

	 Example: to type 'Hello world!' you would do:
	  xdotool type 'Hello world!'

MOUSE COMMANDS
     mousemove [options] x y OR 'restore'
	 Move the mouse to the specific X and Y coordinates on the screen.

	 You can move the mouse to the previous location if you specify 're-
	 store' instead of an X and Y coordinate. Restoring only works if you
	 have moved previously in this same command invocation. Further, it does
	 not work with the --window option.

	 For example, to click the top-left corner of the screen and move the
	 mouse to the original position before you moved it, use this:
	  xdotool mousemove 0 0 click 1 mousemove restore

	 --window WINDOW
	     Specify a window to move relative to. Coordinates 0,0 are at the
	     top left of the window you choose.

	     "WINDOW STACK" references are valid here, such as %1 and %@.
	     Though, using %@ probably doesn't make sense.

	 --screen SCREEN
	     Move the mouse to the specified screen to move to. This is only
	     useful if you have multiple screens and ARE NOT using Xinerama.

	     The default is the current screen. If you specify --window, the
	     --screen flag is ignored.

	 --polar
	     Use polar coordinates. This makes 'x' an angle (in degrees, 0-360,
	     etc) and 'y' the distance.

	     Rotation starts at 'up' (0 degrees) and rotates clockwise: 90 =
	     right, 180 = down, 270 = left.

	     The origin defaults to the center of the current screen. If you
	     specify a --window, then the origin is the center of that window.

	 --clearmodifiers
	     See CLEARMODIFIERS

	 --sync
	     After sending the mouse move request, wait until the mouse is actu-
	     ally moved. If no movement is necessary, we will not wait. This is
	     useful for scripts that depend on actions being completed before
	     moving on.

	     Note: We wait until the mouse moves at all, not necessarily that it
	     actually reaches your intended destination. Some applications lock
	     the mouse cursor to certain regions of the screen, so waiting for
	     any movement is better in the general case than waiting for a spe-
	     cific target.

     mousemove_relative [options] x y
	 Move the mouse x,y pixels relative to the current position of the mouse
	 cursor.

	 --polar
	     Use polar coordinates. This makes 'x' an angle (in degrees, 0-360,
	     etc) and 'y' the distance.

	     Rotation starts at 'up' (0 degrees) and rotates clockwise: 90 =
	     right, 180 = down, 270 = left.

	 --sync
	     After sending the mouse move request, wait until the mouse is actu-
	     ally moved. If no movement is necessary, we will not wait. This is
	     useful for scripts that depend on actions being completed before
	     moving on.

	     Note that we wait until the mouse moves at all, not necessarily
	     that it actually reaches your intended destination. Some applica-
	     tions lock the mouse cursor to certain regions of the screen, so
	     waiting for any movement is better in the general case than waiting
	     for a specific target.

	 --clearmodifiers
	     See CLEARMODIFIERS

     click [options] button
	 Send a click, that is, a mousedown followed by mouseup for the given
	 button with a short delay between the two (currently 12ms).

	 Buttons generally map this way: Left mouse is 1, middle is 2, right is
	 3, wheel up is 4, wheel down is 5.

	 --clearmodifiers
	     Clear modifiers before clicking. See CLEARMODIFIERS below.

	 --repeat REPEAT
	     Specify how many times to click. Default is 1. For a double-click,
	     use '--repeat 2'

	 --delay MILLISECONDS
	     Specify how long, in milliseconds, to delay between clicks. This
	     option is not used if the --repeat flag is set to 1 (default).

	 --window WINDOW
	     Specify a window to send a click to. See "SENDEVENT NOTES" below
	     for caveats. Uses the current mouse position when generating the
	     event.

	     The default, if no window is given, depends on the window stack. If
	     the window stack is empty the current window is typed at using
	     XTEST. Otherwise, the default is "%1" (see "WINDOW STACK").

     mousedown [options] button
	 Same as click, except only a mouse down is sent.

     mouseup [options] button
	 Same as click, except only a mouse up is sent.

     getmouselocation [--shell]
	 Outputs the x, y, screen, and window id of the mouse cursor. Screen
	 numbers will be nonzero if you have multiple monitors and are not using
	 Xinerama.

	 This command updates the window stack with the window id of the window
	 directly underneath the mouse.

	 --shell
	     This makes getmouselocation output shell data you can eval. Exam-
	     ple:

	      % xdotool getmouselocation --shell
	      X=880
	      Y=443
	      SCREEN=0
	      WINDOW=16777250

	      % eval $(xdotool getmouselocation --shell)
	      % echo $X,$Y
	      714,324

     behave_screen_edge [options] where command ...
	 Bind an action to events when the mouse hits the screen edge or corner.

	 Options are:

	 --delay MILLISECONDS
	     Delay in milliseconds before running the command. This allows you
	     to require a given edge or corner to be held for a short period be-
	     fore your command will run. If you leave the edge or corner before
	     the delay expires then the time will reset.

	 --quiesce MILLISECONDS
	     Delay in milliseconds before the next command will run. This helps
	     prevent accidentally running your command extra times; especially
	     useful if you have a very short --delay (like the default of 0).

	 Event timeline

	  * Mouse hits an edge or corner.
	  * If delay is nonzero, the mouse must stay in this edge or corner until delay time expires.
	  * If still in the edge/corner, trigger.
	  * If quiesce is nonzero, then there is a cool-down period where the next
	    trigger cannot occur

	 Valid 'where' values are:

	 left
	 top-left
	 top
	 top-right
	 right
	 bottom-left
	 bottom
	 bottom-right

	 Examples:
	  # Activate google-chrome when you move the mouse to the bottom-left
	 corner:
	  xdotool behave_screen_edge bottom-left \
	    search --class google-chrome windowactivate

	  # Go to the next workspace (right). Known to work in GNOME (metacity and compiz)
	  xdotool behave_screen_edge --delay 500 bottom-right key XF86Forward

	  # Activate firefox and do a web search in a new tab for text in your clipboard
	  xdotool behave_screen_edge --delay 1000 top-left \
	      search --classname Navigator \
	      windowactivate --sync key --delay 250 ctrl+t ctrl+k ctrl+v Return

WINDOW COMMANDS
     search [options] pattern
	 Search for windows with titles, names, or classes with a regular ex-
	 pression pattern. The output is line-delimited list of X window identi-
	 fiers. If you are using "COMMAND CHAINING", the search command will
	 only write window ids to stdout if it is the last (or only) command in
	 the chain; otherwise, it is silent.

	 The result is saved to the window stack for future chained commands.
	 See "WINDOW STACK" and "COMMAND CHAINING" for details.

	 Patterns are POSIX extended regular expressions (ERE), e. g.
	 "Chrom(e|ium)$" for windows ending in "Chrome" or "Chromium". See
	 regex(7) for syntax details.  Matches are case-insensitive.

	 The default options are "--name --class --classname --role" (unless you
	 specify one or more of --name, --class, --classname, or --role).

	 The options available are:

	 --class
	     Match against the window class.

	 --classname
	     Match against the window classname.

	 --role
	     Match against the window role.

	 --maxdepth N
	     Set recursion/child search depth. Default is -1, meaning infinite.
	     0 means no depth, only root windows will be searched. If you only
	     want toplevel windows, set maxdepth of 1 (or 2, depending on how
	     your window manager does decorations).

	 --name
	     Match against the window name. This is the same string that is dis-
	     played in the window titlebar.

	 --onlyvisible
	     Show only visible windows in the results. This means ones with map
	     state IsViewable.

	 --pid PID
	     Match windows that belong to a specific process id. This may not
	     work for some X applications that do not set this metadata on its
	     windows.

	 --screen N
	     Select windows only on a specific screen. Default is to search all
	     screens. Only meaningful if you have multiple displays and are not
	     using Xinerama.

	 --desktop N
	     Only match windows on a certain desktop. 'N' is a number. The de-
	     fault is to search all desktops.

	 --limit N
	     Stop searching after finding N matching windows. Specifying a limit
	     will help speed up your search if you only want a few results.

	     The default is no search limit (which is equivalent to '--limit 0')

	 --title
	     DEPRECATED. See --name.

	 --all
	     Require that all conditions be met. For example:

	      xdotool search --all --pid 1424 --name "Hello World"

	     This will match only windows that have "Hello World" as a name and
	     are owned by pid 1424.

	 --any
	     Match windows that match any condition (logically, 'or'). This is
	     on by default. For example:

	      xdotool search --any --pid 1424 --name "Hello World"

	     This will match any windows owned by pid 1424 or windows with name
	     "Hello World"

	 --sync
	     Block until there are results. This is useful when you are launch-
	     ing an application and want to wait until the application window is
	     visible.  For example:

	      google-chrome &
	      xdotool search --sync --onlyvisible --class "google-chrome"

     selectwindow
	 Get the window id (for a client) by clicking on it. Useful for having
	 scripts query you humans for what window to act on. For example,
	 killing a window by clicking on it:

	  xdotool selectwindow windowkill

     behave window action command ...
	 Bind an action to an event on a window. This lets you run additional
	 xdotool commands whenever a matched event occurs.

	 The command run as a result of the behavior is run with %1 being the
	 window that was acted upon. Examples follow after the event list.

	 The following are valid events:

	 mouse-enter
	     Fires when the mouse enters a window. This is similar to 'mouse
	     over' events in javascript, if that helps.

	 mouse-leave
	     Fires when the mouse leaves a window. This is the opposite of
	     'mouse-enter'

	 mouse-click
	     Fires when the mouse is clicked. Specifically, when the mouse but-
	     ton is released.

	 focus
	     Fires when the window gets input focus.

	 blurFires when the window loses focus.

	 Examples:

	  # Print the cursor location whenever the mouse enters a currently-visible
	  # window:
	  xdotool search --onlyvisible . behave %@ mouse-enter getmouselocation

	  # Print the window title and pid whenever an xterm gets focus
	  xdotool search --class xterm behave %@ focus getwindowname getwindowpid

	  # Emulate focus-follows-mouse
	  xdotool search . behave %@ mouse-enter windowfocus

     getwindowpid [window]
	 Output the PID owning a given window. This requires effort from the ap-
	 plication owning a window and may not work for all windows. This uses
	 _NET_WM_PID property of the window. See "EXTENDED WINDOW MANAGER HINTS"
	 below for more information.

	 If no window is given, the default is '%1'. If no windows are on the
	 stack, then this is an error. See "WINDOW STACK" for more details.

	 Example: Find the PID for all xterms:
	  xdotool search --class xterm getwindowpid %@

     getwindowname [window]
	 Output the name of a given window, also known as the title. This is the
	 text displayed in the window's titlebar by your window manager.

	 If no window is given, the default is '%1'. If no windows are on the
	 stack, then this is an error. See "WINDOW STACK" for more details.

     getwindowgeometry [options] [window]
	 Output the geometry (location and position) of a window. The values in-
	 clude: x, y, width, height, and screen number.

	 --shell
	     Output values suitable for 'eval' in a shell.

     getwindowfocus [-f]
	 Prints the window id of the currently focused window. Saves the result
	 to the window stack. See "WINDOW STACK" for more details.

	 If the current window has no WM_CLASS property, we assume it is not a
	 normal top-level window and traverse up the parents until we find a
	 window with a WM_CLASS set and return that window id.

	 If you really want the window currently having focus and don't care if
	 it has a WM_CLASS setting, then use 'getwindowfocus -f'

     windowsize [options] [window] width height
	 Set the window size of the given window. If no window is given, %1 is
	 the default.  See "WINDOW STACK" and "COMMAND CHAINING" for more de-
	 tails.

	 Percentages are valid for width and height. They are relative to the
	 geometry of the screen the window is on. For example, to make a window
	 the full width of the screen, but half height:

	  xdotool windowsize <window> 100% 50%

	 Percentages are valid with --usehints and still mean pixel-width rela-
	 tive to the screen size.

	 The options available are:

	 --usehints
	     Use window sizing hints (when available) to set width and height.
	     This is useful on terminals for setting the size based on row/col-
	     umn of text rather than pixels.

	 --sync
	     After sending the window size request, wait until the window is ac-
	     tually resized. If no change is necessary, we will not wait. This
	     is useful for scripts that depend on actions being completed before
	     moving on.

	     Note: Because many window managers may ignore or alter the original
	     resize request, we will wait until the size changes from its origi-
	     nal size, not necessary to the requested size.

	 Example: To set a terminal to be 80x24 characters, you would use:
	  xdotool windowsize --usehints <some_windowid> 80 24

     windowmove [options] [window] x y
	 Move the window to the given position. If no window is given, %1 is the
	 default. See "WINDOW STACK" and "COMMAND CHAINING" for more details.

	 If the given x coordinate is literally 'x', then the window's current x
	 position will be unchanged. The same applies for 'y'.

	 Examples:

	  xdotool getactivewindow windowmove 100 100	# Moves to 100,100
	  xdotool getactivewindow windowmove x 100	# Moves to x,100
	  xdotool getactivewindow windowmove 100 y	# Moves to 100,y
	  xdotool getactivewindow windowmove 100 y	# Moves to 100,y

	 Percentages are valid for width and height. They are relative to the
	 geometry of the screen the window is on. For example, to make a window
	 the full width of the screen, but half height:

	  xdotool windowmove <window> 100% 50%

	 --sync
	     After sending the window move request, wait until the window is ac-
	     tually moved. If no movement is necessary, we will not wait. This
	     is useful for scripts that depend on actions being completed before
	     moving on.

	 --relative
	     Make movement relative to the current window position.

     windowfocus [options] [window]
	 Focus a window. If no window is given, %1 is the default. See "WINDOW
	 STACK" and "COMMAND CHAINING" for more details.

	 Uses XSetInputFocus which may be ignored by some window managers or
	 programs.

	 --sync
	     After sending the window focus request, wait until the window is
	     actually focused. This is useful for scripts that depend on actions
	     being completed before moving on.

     windowmap [options] [window]
	 Map a window. In X11 terminology, mapping a window means making it vis-
	 ible on the screen. If no window is given, %1 is the default. See "WIN-
	 DOW STACK" and "COMMAND CHAINING" for more details.

	 --sync
	     After requesting the window map, wait until the window is actually
	     mapped (visible). This is useful for scripts that depend on actions
	     being completed before moving on.

     windowminimize [options] [window]
	 Minimize a window. In X11 terminology, this is called 'iconify.' If no
	 window is given, %1 is the default. See "WINDOW STACK" and "COMMAND
	 CHAINING" for more details.

	 --sync
	     After requesting the window minimize, wait until the window is ac-
	     tually minimized. This is useful for scripts that depend on actions
	     being completed before moving on.

     windowraise [window_id=%1]
	 Raise the window to the top of the stack. This may not work on all win-
	 dow managers. If no window is given, %1 is the default. See "WINDOW
	 STACK" and "COMMAND CHAINING" for more details.

     windowlower [window_id=%1]
	 Lower the window to the bottom of the stack. This may not work on all
	 window managers. If no window is given, %1 is the default. See "WINDOW
	 STACK" and "COMMAND CHAINING" for more details.

     windowreparent [source_window] destination_window
	 Reparent a window. This moves the source_window to be a child window of
	 destination_window. If no source is given, %1 is the default.	"WINDOW
	 STACK" window references (like %1) are valid for both source_window and
	 destination_window See "WINDOW STACK" and "COMMAND CHAINING" for more
	 details.

     windowclose [window]
	 Close a window. This action will destroy the window, but will not try
	 to kill the client controlling it. If no window is given, %1 is the de-
	 fault. See "WINDOW STACK" and "COMMAND CHAINING" for more details.

     windowquit [window]
	 Close a window gracefully. This action sends a request, allowing the
	 application to apply close confirmation mechanics. If no window is
	 given, %1 is the default. See "WINDOW STACK" and "COMMAND CHAINING" for
	 more details.

     windowkill [window]
	 Kill a window. This action will destroy the window and kill the client
	 controlling it. If no window is given, %1 is the default. See WINDOW
	 STACK and "COMMAND CHAINING" for more details.

     windowunmap [options] [window_id=%1]
	 Unmap a window, making it no longer appear on your screen. If no window
	 is given, %1 is the default. See "WINDOW STACK" and "COMMAND CHAINING"
	 for more details.

	 --sync
	     After requesting the window unmap, wait until the window is actu-
	     ally unmapped (hidden). This is useful for scripts that depend on
	     actions being completed before moving on.

     set_window [options] [windowid=%1]
	 Set properties about a window. If no window is given, %1 is the de-
	 fault. See "WINDOW STACK" and "COMMAND CHAINING" for more details.

	 Options:

	 --name newname
	     Set window WM_NAME (the window title, usually)

	 --icon-name newiconname
	     Set window WM_ICON_NAME (the window title when minimized, usually)

	 --role newrole
	     Set window WM_WINDOW_ROLE

	 --classname newclassname
	     Set window class name (not to be confused with window class)

	 --class newclass
	     Set window class (not to be confused with window class name)

	 --urgency value
	     Set window urgency hint. If the value is 1, the window will be
	     marked urgent, and the window manager will somehow highlight it for
	     the user's attention.  If the value is 0, the window will be marked
	     non-urgent.

	 --overrideredirect value
	     Set window's override_redirect value. This value is a hint to the
	     window manager for whether or not it should be managed. If the
	     redirect value is 0, then the window manager will draw borders and
	     treat this window normally. If the value is 1, the window manager
	     will ignore this window.

	     If you change this value, your window manager may not notice the
	     change until the window is mapped again, so you may want to issue
	     'windowunmap' and 'windowmap' to make the window manager take note.

DESKTOP AND WINDOW COMMANDS
     These commands follow the EWMH standard. See the section "EXTENDED WINDOW
     MANAGER HINTS" for more information.

     windowactivate [options] [window]
	 Activate the window. This command is different from windowfocus: if the
	 window is on another desktop, we will switch to that desktop. It also
	 uses a different method for bringing the window up. I recommend trying
	 this command before using windowfocus, as it will work on more window
	 managers.

	 If no window is given, %1 is the default. See "WINDOW STACK" and "COM-
	 MAND CHAINING" for more details.

	 --sync
	     After sending the window activation, wait until the window is actu-
	     ally activated. This is useful for scripts that depend on actions
	     being completed before moving on.

     getactivewindow
	 Output the current active window. This command is often more reliable
	 than getwindowfocus. The result is saved to the window stack. See "WIN-
	 DOW STACK" for more details.

     windowstate [--add PROPERTY] [--remove PROPERTY] [--toggle PROPERTY] [win-
     dow]
	 Change a property on a window.

	 Some properties may have no effect some windows or in some window man-
	 agers.

	 Properties can be any of:

	 MODAL - makes the window into a modal
	 STICKY - makes the window appear on all workspaces
	 MAXIMIZED_VERT - sizes the window maximized vertically
	 MAXIMIZED_HORZ - sizes the window maximized horizontally
	 ABOVE - Show window above all others (always on top)
	 BELOW - Show window below all others
	 SKIP_TASKBAR - hides the window from the taskbar
	 SKIP_PAGER - hides the window from the window pager
	 FULLSCREEN - makes window fullscreen
	 HIDDEN - unmaps the window
	 SHADED - rolls the window up
	 DEMANDS_ATTENTION - marks window urgent or needing attention

	 This feature requires a window manager which supports EWMH. Most window
	 managers probably support this :)

     getwindowclassname [window]
	 Prints the class name for the window.

     set_num_desktops number
	 Changes the number of desktops or workspaces.

     get_num_desktops
	 Output the current number of desktops.

     get_desktop_viewport [--shell]
	 Report the current viewport's position. If --shell is given, the output
	 is friendly to shell eval.

	 Viewports are sometimes used instead of 'virtual desktops' on some win-
	 dow managers. A viewport is simply a view on a very large desktop area.

     set_desktop_viewport x y
	 Move the viewport to the given position. Not all requests will be
	 obeyed - some windowmangers only obey requests that align to workspace
	 boundaries, such as the screen size.

	 For example, if your screen is 1280x800, you can move to the 2nd work-
	 space by doing:
	  xdotool set_desktop_viewport 1280 0

     set_desktop [options] desktop_number
	 Change the current view to the specified desktop.

	 --relative
	     Use relative movements instead of absolute. This lets you move rel-
	     ative to the current desktop.

	 Examples:
	  # Change to desktop #5
	  xdotool set_desktop 5

	  # Change to the previous desktop. (Note the use of "--")
	  xdotool set_desktop --relative -- -1

     get_desktop
	 Output the current desktop in view.

     set_desktop_for_window [window] desktop_number
	 Move a window to a different desktop. If no window is given, %1 is the
	 default. See "WINDOW STACK" and "COMMAND CHAINING" for more details.

     get_desktop_for_window [window]
	 Output the desktop currently containing the given window. Move a window
	 to a different desktop. If no window is given, %1 is the default. See
	 WINDOW STACK and "COMMAND CHAINING" for more details.

MISCELLANEOUS COMMANDS
     exec [options] command [...]
	 Execute a program. This is often useful when combined with be-
	 have_screen_edge to do things like locking your screen.

	 Options:

	 --sync
	     Block until the child process exits. The child process exit status
	     is then passed to the parent process (xdotool) which copies it.

	 Examples:
	  # Lock the screen when the mouse sits in the top-right corner
	  xdotool behave_screen_edge --delay 1000 top-right \
	    exec gnome-screensaver-command --lock
	  # Substitute 'xscreensaver-command -lock' if you use that program.

	  # The following will fail to move the mouse because we use '--sync' and
	  # /bin/false exits nonzero:
	  xdotool exec --sync /bin/false mousemove 0 0

	  # This succeeds, though, since we do not use --sync on the exec command.
	  xdotool exec /bin/false mousemove 0 0

     sleep seconds
	 Sleep for a specified period. Fractions of seconds (like 1.3, or 0.4)
	 are valid, here.

SCRIPTS
     xdotool can read a list of commands via stdin or a file if you want. A
     script will fail when any command fails.

     Truthfully, 'script' mode isn't fully fleshed out and may fall below your
     expectations. If you have suggestions, please email the list or file a bug
     (See CONTACT).

     Scripts can use positional arguments (Represented by $1, $2, ...) and envi-
     ronment variables (like $HOME or $WINDOWID). Quoting arguments should work
     as expected.

     Scripts are processed for parameter and environment variable expansion and
     then run as if you had invoked xdotool with the entire script on one line
     (using COMMAND CHAINING).

     *	 Read commands from a file:

	  xdotool filename

     *	 Read commands from stdin:

	  xdotool -

     *	 Read commands from a redirected file

	  xdotool - < myfile

     You can also write scripts that only execute xdotool. Example:

      #!/usr/local/bin/xdotool
      search --onlyvisible --classname $1

      windowsize %@ $2 $3
      windowraise %@

      windowmove %1 0 0
      windowmove %2 $2 0
      windowmove %3 0 $3
      windowmove %4 $2 $3

     This script will take all windows matched by the classname query given by
     arg1 ($1) and sizes/moves them into a 2x2 grid with windows sized by the
     2nd and 3rd parameters.

     Here's an example usage:

      % ./myscript xterm 600 400

     Running it like this will take 4 visible xterms, raise them, and move them
     into a 2x2 tile grid with each window 600x400 pixels in size.

CLEARMODIFIERS
     Any command taking the --clearmodifiers flag will attempt to clear any ac-
     tive input modifiers during the command and restore them afterwards.

     For example, if you were to run this command:
      xdotool key a

     The result would be 'a' or 'A' depending on whether or not you were holding
     the shift key on your keyboard. Often it is undesirable to have any modi-
     fiers active, so you can tell xdotool to clear any active modifiers.

     The order of operations if you hold shift while running 'xdotool key
     --clearmodifiers a' is this:

     1. Query for all active modifiers (finds shift, in this case)
     2. Try to clear shift by sending 'key up' for the shift key
     3. Runs normal 'xdotool key a'
     4. Restore shift key by sending 'key down' for shift

     The --clearmodifiers flag can currently clear of the following:

     *	 any key in your active keymap that has a modifier associated with it.
	 (See xmodmap(1)'s 'xmodmap -pm' output)

     *	 mouse buttons (1, 2, 3, 4, and 5)

     *	 caps lock

SENDEVENT NOTES
     If you are trying to send key input to a specific window, and it does not
     appear to be working, then it's likely your application is ignoring the
     events xdotool is generating. This is fairly common.

     Sending keystrokes to a specific window uses a different API than simply
     typing to the active window. If you specify 'xdotool type --window 12345
     hello' xdotool will generate key events and send them directly to window
     12345.  However, X11 servers will set a special flag on all events gener-
     ated in this way (see XEvent.xany.send_event in X11's manual). Many pro-
     grams observe this flag and reject these events.

     It is important to note that for key and mouse events, we only use XSendE-
     vent when a specific window is targeted. Otherwise, we use XTEST.

     Some programs can be configured to accept events even if they are generated
     by xdotool. Seek the documentation of your application for help.

     Specific application notes (from the author's testing): * Firefox 3 seems
     to ignore all input when it does not have focus.  * xterm can be configured
     while running with ctrl+leftclick, 'Allow SendEvents' * gnome-terminal ap-
     pears to accept generated input by default.

WINDOW STACK
     Certain commands (search, getactivewindow, getwindowfocus) will find win-
     dows for you. These results generally printed to stdout, but they are also
     saved to memory for future use during the lifetime of the xdotool process.
     See "COMMAND CHAINING" for more information.

     The only modifications support for the window stack are to replace it. That
     is, two of two sequential searches, only the last one's results will be the
     window stack.

COMMAND CHAINING
     xdotool supports running multiple commands on a single invocation. Gener-
     ally, you'll start with a search command (see "WINDOW STACK") and then per-
     form a set of actions on those results.

     To query the window stack, you can use special notation "%N" where N is a
     number or the '@' symbol. If %N is given, the Nth window will be selected
     from the window stack. Generally you will only want the first window or all
     windows.  Note that the order of windows in the window stack corresponds to
     the window stacking order, i.e. the bottom-most window will be reported
     first (see XQueryTree(3)). Thus the order of the windows in the window
     stack may not be consistent across invocations.

     The notation described above is used as the "window" argument for any given
     command.

     For example, to resize all xterms to 80x24:

      xdotool search --class xterm -- windowsize --usehints %@ 80 24

     Resize move the current window:

      xdotool getactivewindow windowmove 0 0

     In all cases, the default window argument, if omitted, will default to
     "%1". It is obviously an error if you omit the window argument and the win-
     dow stack is empty. If you try to use the window stack and it is empty, it
     is also an error.

     To activate the first firefox window found:

      xdotool search --class firefox windowactivate

     These would error:

      xdotool windowactivate
      xdotool windowactivate %1
      xdotool windowactivate %@

     When xdotool exits, the current window stack is lost.

     Additionally, commands that modify the "WINDOW STACK" will not print the
     results if they are not the last command. For example:

      # Output the active window:
      % xdotool getactivewindow
      20971533

      # Output the pid of the active window, but not the active window id:
      % xdotool getactivewindow getwindowpid
      4686

EXTENDED WINDOW MANAGER HINTS
     The following pieces of the EWMH standard are supported:

     _NET_SUPPORTED
	 Asks the window manager what is supported

     _NET_CURRENT_DESKTOP
	 Query and set the current desktop. Support for this enables these com-
	 mands: "set_desktop", "get_desktop".

     _NET_WM_DESKTOP
	 Query and set what desktop a window is living in. Support for this en-
	 ables these commands: "set_desktop_for_window", "get_desktop_for_win-
	 dow".

     _NET_ACTIVE_WINDOW
	 Allows you to query and set the active window by asking the window man-
	 ager to bring it forward. Support for this enables these commands:
	 "windowactivate", "getactivewindow".

     _NET_WM_PID
	 This feature is application dependent, not window-manager dependent.
	 Query the PID owning a given window. Support for this enables these
	 commands: "getwindowpid".

SUPPORTED FEATURES
     xdotool (and libxdo) will try to function under all circumstances. However,
     there may be some cases where functionality is not provided by your X
     server or by your window manager. In these cases, xdotool will try to de-
     tect and tell you if an action requires a feature not currently supported
     by your system.

     For window-manager specific features, see "EXTENDED WINDOW MANAGER HINTS".

     XTEST
	 If your X server does not support XTEST, then some typing and mouse
	 movement features may not work. Specifically, typing and mouse actions
	 that act on the "current window" (window 0 in libxdo) are unlikely to
	 work.

	 In most cases, XTEST is a feature you can enable on your X server if it
	 is not enabled by default.

	 You can see the list of supported X extensions by typing 'xdpyinfo' and
	 looking the text 'number of extensions: ...'

BUGS
     Typing unusual symbols under non-us keybindings is known to occasionally
     send the wrong character.

SEE ALSO
     xprop(1), xwininfo(1),

     Project site: <http://www.semicomplete.com/projects/xdotool>

     Source code and Issues: <https://github.com/jordansissel/xdotool>

     EWMH specification: <http://standards.freedesk-
     top.org/wm-spec/wm-spec-1.3.html>

CONTACT
     Please send questions to xdotool-users@googlegroups.com. File bugs and fea-
     ture requests at the following URL:

     <https://github.com/jordansissel/xdotool/issues>

     Alternately, if you prefer email, feel free to file bugs by emailing the
     list.  What works for you :)

AUTHOR
     xdotool was written by Jordan Sissel.

     This manual page was written originally by Daniel Kahn Gillmor <dkg@fifth-
     horseman.net> for the Debian project (but may be used by others). It is
     maintained by Jordan Sissel.

     Patches, ideas, and other contributions by many, nice folks. See the
     CHANGELIST file for who provided what.

				   2026-03-03			      XDOTOOL(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=xdotool&sektion=1&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help