Custom hotkey/shortcut to open/bring to front an app
Solution 1:
The wmctrl
program is just what you're looking for (sudo apt-get install wmctrl
). You can use the wmctrl -a "AppTitle"
command to bring the app to the front. wmctrl -l
will list all available windows, so it should be easy to write a shell script that checks if your program is running and either launches it or brings it to the front. Then you can just bind that to a keyboard shortcut.
First save the following script somewhere, I'll use /home/jtb/code/bringToFront
. It takes two arguments, the first is what you would type at the terminal to launch the program, the second is a substring of the program window's title. If there is no constant unique string in the title then you'll need to do a bit more work to find the program's window.
#!/bin/bash
if [ `wmctrl -l | grep -c "$2"` != 0 ]
then
wmctrl -a "$2"
else
$1 &
fi
With the script in your current directory, run
chmod +x bringToFront
to make the script executable. Then make sure it works; to launch/focus firefox you could run./bringToFront firefox "Mozilla Firefox"
.Now we need to bind a shortcut key. Run
gconf-editor
and navigate the folder structure to the left to/apps/metacity/keybinding_commands
.Double click on the first
command
with a blank value, probablycommand_1
. Type the full path to the script and provide the two parameters, e.g./home/jtb/code/bringToFront firefox Firefox
.From the panel on the left, select
global_keybindings
, the next folder up. Find therun
entry matching the command you just defined, probablyrun_command_1
. Double click it and type the keyboard shortcut you want to use. Put the modifiers in angle brackets, e.g.<Ctrl><Alt>F
.
Now Control + Alt + F will bring your firefox window to the front, or launch it if it's not already running.
Solution 2:
Here's another way to do it with xdotools
. The process to pop-up is recognized by the command line issued to run it (no pid file or unique window title needed).
#!/bin/bash
cmd="$@"
# command line to be run. Note that the resulting
# process will hold this in /proc/PID/cmdline
pid=`pgrep -nf "^$cmd$"`
# most recent process having "$cmd" in /proc/PID/cmdline
if [ -z "$pid" ]; then # no pid
exec $cmd
# run command
else
winid=`xdotool search --all --pid $pid --onlyvisible | head -1`
# first visible window owned by pid
xdotool windowactivate $winid
# give window focus
fi