自定义热键/快捷方式以打开/显示在应用程序前面


11

我不认为这是系统内置的功能,但是有没有太多麻烦的可能呢?

假设我使用热键打开了一个特定的程序,当我再次按下该热键时,程序窗口将显示在最前面。

我想在Ubuntu 9.04上执行此操作。

也许有D-Bus?有专家吗?

更新:这是我最终得到的结果,以防对他人有所帮助:

#!/bin/bash
if [ -f "/tmp/myterm.pid" ]; then
  WID=`cat /tmp/myterm.pid`
  xdotool windowactivate $WID
  if [ "$?" != "0" ]; then
    WID=""
  fi
else
  WID=`xdotool search --title "UNIQUE TITLE" | head -1`
fi

if [ "$WID" == "" ]; then
  /usr/bin/gnome-terminal --window-with-profile=MYPROFILE "$@"
  WID=`xdotool search --title "UNIQUE TITLE" | head -1`
  echo $WID > /tmp/myterm.pid
else
  xdotool windowactivate $WID
fi

当然可以简化,但我不是小bash巫婆。另外,为了使我的示例正常工作,我在终端中创建了一个自定义配置文件,该配置文件将唯一的标题应用于窗口,以便以后可以找到它。可能性是无止境!


1
对于此简单任务,jtb的方法效果更好,因为xdotools有时会抛出X错误,而wmctrl更快。
伊万,

Answers:


10

wmctrl程序正是您要寻找的(sudo apt-get install wmctrl)。您可以使用wmctrl -a "AppTitle"命令将应用程序置于最前面。wmctrl -l将会列出所有可用的窗口,因此编写一个shell脚本应该很容易,该脚本可以检查您的程序是否正在运行,是否启动它或将其放在最前面。然后,您可以将其绑定到键盘快捷键。

首先将以下脚本保存在某个地方,我将使用/home/jtb/code/bringToFront。它有两个参数,第一个是您在终端上键入的以启动程序,第二个是程序窗口标题的子字符串。如果标题中没有恒定的唯一字符串,那么您需要做更多的工作才能找到程序的窗口。

#!/bin/bash
if [ `wmctrl -l | grep -c "$2"` != 0 ]  
then
    wmctrl -a "$2"
else
    $1 &
fi
  1. 将脚本放在当前目录中,运行chmod +x bringToFront以使脚本可执行。然后确保它有效;启动/集中火狐您可以运行./bringToFront firefox "Mozilla Firefox"

  2. 现在,我们需要绑定快捷键。运行gconf-editor并将文件夹结构导航到左侧/apps/metacity/keybinding_commands

  3. 双击第一个command,其值可能为空白command_1。输入脚本的完整路径并提供两个参数,例如/home/jtb/code/bringToFront firefox Firefox

  4. 在左侧面板中,选择global_keybindings,下一个文件夹。找到与run您刚定义的命令相匹配的条目(可能是)run_command_1。双击它,然后键入要使用的键盘快捷键。将修饰符放在尖括号中,例如<Ctrl><Alt>F

现在Control+ Alt+ F将带给你的Firefox窗口前,或启动它,如果它尚未运行。


是的,几分钟前我就知道了,但是我选择了xdotool。谢谢!
伊万,2009年

我忘了提一下,我还使用了gconf中的全局快捷方式和命令来完全实现效果(可怜的Quake控制台!)。
伊凡2009年

嗯,是的,我自己还没有使用过xdotool,但看起来它会给您带来更多的灵活性。关于gconf的要点。由于这不太明显,因此我不妨编辑答案以包含其他想要这样做的人的更多详细信息。
jtb

Poort Man's Quake控制台?你是说像蒂尔达?freshmeat.net/projects/tilda
Prestomation

是的,我也使用Tilda,但是整个星期我都在处理多个项目,对于每个项目,我总是打开三个或四个选项卡,因此快速切换到项目的控制台(“工作区”)对我来说非常有用,这对Tilda很有帮助。
伊万,

3

这是使用的另一种方法xdotools。弹出窗口可以通过运行它的命令行来识别(不需要pid文件或唯一的窗口标题)。

#!/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


0

jtb早些时候发布的答案很好,但是有时您想匹配精确的标题(例如,您想打开“ GitKraken”,但浏览器的标题“ GitKraken vs CLI”也与查询匹配)。

#!/bin/bash
if [ $1 == "-exact" ]
then
    additional_arguments="-F "
    app_launch_command=$2
    app_title=$3
else
    additional_arguments=""
    app_launch_command=$1
    app_title=$2
fi

if [ `wmctrl -l $additional_arguments| grep -c "$app_title"` != 0 ]
then
    wmctrl $additional_arguments -a "$app_title"
else
    $app_launch_command &
fi

因此,现在您可以像下面这样调用BringToFront脚本:

#exact match
./bringToFront.sh -exact "flatpak run com.axosoft.GitKraken" "GitKraken"
#or
./bringToFront.sh -exact <command_to_launch_the_app> <app_title

#partial match like the old script
./bringToFront.sh "flatpak run com.axosoft.GitKraken" "GitKraken"
#or
./bringToFront.sh <command_to_launch_the_app> <app_title>

0

此解决方案未设置参数,但是我已使用它来聚焦启动 gnome-calculator。

-R选项查找窗口或失败,如果找到该窗口,则将其移至当前桌面,并引发并指定焦点。gnome-calculator用名称Calculator来命名它的窗口,可以很容易地对其进行参数化,但是我从未发现需要这样做。我已将其映射到Ctrl-Alt-c

#!/bin/bash
# start the calculator and raise and focus (requires wmctrl)
# X Tian 06sep2017 created

wmctrl -R Calculator
if [[ $? -ne 0 ]]
  then 
    gnome-calculator &
fi

0

我遇到了同样的问题,由于找不到合适的解决方案,因此提出了一个解决方案:

https://hyperkeys.xureilab.com

https://github.com/xurei/hyperkeys

您可以使用定义的快捷方式来固定窗口。我个人使用SHIFT + ALT + [QWER]固定,ALT + [QWER]排在最前面。但是,如果应用未打开,则无法打开。

这是一个开源的,Linux优先的工具。Windows版本也可用。

希望能帮助到你 !我正在寻找反馈,因此,如果您有任何问题,请创建一个问题;-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.