在 14.04 版的 Gnome-Classic (metacity) 中,
- 是否有一个键可以调用应用程序菜单?
- 是否有一个键可以在顶部面板上的项目之间切换,例如应用程序菜单、位置、无线图标、电池、时间、关机/暂停/注销/锁定菜单等?
如果可能的话,我该如何添加应用程序菜单的键?
要添加一个用于调出应用程序菜单的键,执行该操作的命令是什么?
不同于https://askubuntu.com/a/133915/1471,就我的情况而言,没有应用程序菜单的键。
我的 14.04 附带 compiz+unity,然后我安装了 metacity+gnomeclassic。它们是否共享相同的键盘设置?这就是我没有应用程序菜单键的原因吗?
谢谢!
答案1
使用一个粗略的解决方法,它可以做得很好。使用xdotool
,您可以让它将鼠标移动到应用程序菜单的位置,打开它并自动移回其原始位置。
由于一切都发生得非常快和鼠标移回原来的位置,你不会注意到它。
脚本假设您的应用程序菜单位于左上角,如上图所示。如果不是这样,则cmd1
必须更改坐标。
#!/usr/bin/env python3
import subprocess
import time
cursordata = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8").split()
loc = [d.split(":")[1] for d in cursordata[:2]]
cmd1 = "xdotool mousemove 10 5"; cmd2 = "xdotool click 1"; cmd3 = "xdotool mousemove "+(" ").join(loc)
for cmd in [cmd1, cmd2, cmd3]:
subprocess.Popen(["/bin/bash", "-c", cmd])
time.sleep(0.05)
详细地:
获取当前鼠标位置:
cursordata = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8").split()
将输出 (x/y) 解析为坐标:
loc = [d.split(":")[1] for d in cursordata[:2]]
[cmd1, cmd2, cmd3]
随后运行命令:
- 将鼠标移到应用程序菜单
- 点击
- 将鼠标移回原来的位置
for cmd in [cmd1, cmd2, cmd3]:
subprocess.Popen(["/bin/bash", "-c", cmd])
time.sleep(0.05)
如何使用脚本
安装
xdotool
:sudo apt-get install xdotool
将脚本粘贴到空文件中,另存为
open_appmenu.py
使用以下命令进行测试运行:
python3 /path/to/open_appmenu.py
如果一切正常,将其添加到快捷键:选择:系统设置>“键盘”>“快捷键”>“自定义快捷键”。单击“+”并添加命令:
python3 /path/to/open_appmenu.py
移至其他项目
打开应用程序菜单后,您只需使用箭头键切换到下一个项目。
编辑:通用版本
下面是一个可以灵活使用的脚本版本,点击屏幕上任何位置,可以轻松更改。该脚本可以使用两个选项运行:
到放(记住)当前鼠标的位置:
run_click -set
点击最后记住的位置:
run_click -run
如果未设置位置,则会出现 zenity 消息,邀请设置位置:
该脚本创建一个隐藏文件;~/.run_click
其中存储最新记住的坐标。
作为测试,我将两个命令都放在组合键下:Ctrl+ Alt+R和Ctrl+ Alt+ A,这样可以轻松地当场更改点击位置。
如何设置
像第一个脚本一样,安装
xdotool
:sudo apt-get install xdotool
将下面的脚本复制到一个空文件中,将其保存为
run_click
(无扩展名)~/bin
(如有必要,请创建目录)并使脚本可执行。- 如果您刚刚创建
~/bin
,请运行source ~/.profile
。 - 首先测试两个命令,
run_click -set
然后run_click -run
查看是否一切按预期工作。 - 将两个命令添加到两个不同的组合键中:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加命令。
剧本
#!/usr/bin/env python3
import subprocess
import time
import sys
import os
option = sys.argv[1]
datafile = os.path.join(os.environ["HOME"], ".run_click")
def get_mousepos():
cursordata = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8").split()
return [d.split(":")[1] for d in cursordata[:2]]
if option == "-run":
try:
data = open(datafile).read()
coords = (" ").join([l for l in data.splitlines()])
except FileNotFoundError:
message = "Please run the command: 'run_click -set' first, to set the click position"
subprocess.Popen(["zenity", "--info", "--text", message])
else:
cmd1 = "xdotool mousemove "+coords; cmd2 = "xdotool click 1"; cmd3 = "xdotool mousemove "+(" ").join(get_mousepos())
for cmd in [cmd1, cmd2, cmd3]:
subprocess.Popen(["/bin/bash", "-c", cmd])
time.sleep(0.05)
elif option == "-set":
open(datafile, "wt").write(("\n").join(get_mousepos()))