答案1
答案2
自定义命令
如果你使用 Unity和安装了 ccsm,wjandrea 的答案当然就是您的答案。如果不或者在其他发行版上使用,轻量级的替代方案可能会有用。
使用下面的脚本,你可以设置任何命令,特定于每个热角。
作为示例,我进行了以下设置:
- 左上方 没有行动
- 右上 运行 Gedit
- 左下方 没有行动
- 右下角运行 Gnome 终端
当然您也可以让命令运行外部脚本。
此外,您还可以设置尺寸线路中的热点角:
cornersize = 10
只需更改值(像素)。脚本设置(方形)区域来触发您的命令:
剧本
#!/usr/bin/env python3
import subprocess
import time
cornersize = 20
commands = [
None,
"gedit",
None,
"gnome-terminal",
]
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
def get_pos():
return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
match1 = None
while True:
time.sleep(1)
xy = get_pos()
x = xy[0]; y = xy[1]
test = [
[x < cornersize, y < cornersize],
[x > res[0]-cornersize, y < cornersize],
[x < cornersize, y > res[1]-cornersize],
[x > res[0]-cornersize, y > res[1]-cornersize],
]
match2 = [i for i, p in enumerate(test) if all(p)]
if match2 != match1:
if match2:
cmd = commands[match2[0]]
if cmd:
subprocess.Popen(["/bin/bash", "-c", cmd])
match1 = match2
设置
脚本需要
xdotool
sudo apt install xdotool
- 将脚本复制到一个空文件中,另存为
hotcorners2.py
在脚本的头部,设置你的命令(注意引号)
commands = [ None, "gedit", None, "gnome-terminal", ]
(随后是左上/右、左下/右)
测试运行脚本:
python3 /path/to/hotcorners2.py
如果一切正常,请添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
/bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"
笔记
- 该脚本当前在(第一个)屏幕上运行。可以轻松编辑它以处理多个屏幕,甚至可以在不同的屏幕上执行不同的操作,请提及。
- 如果有少数人喜欢它,我们可以添加一个 gui 和一个 ppa,以方便使用和轻松安装。
编辑
如果我们使用更先进的计算,我们可以使用半径而不是使用方形区域来触发命令(感谢老好人@pythagoras):
差别很小,但只是为了好玩:
剧本
#!/usr/bin/env python3
import subprocess
import math
import time
# set distance (hotcorner sensitivity)
radius = 20
# top-left, top-right, bottom-left, bottom-right
commands = [
None,
"gedit",
None,
"gnome-terminal",
]
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
def get_pos():
return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]
# get the resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
# list the corners, could be more elegant no doubt
corners = [[0, 0], [res[0], 0], [0, res[1]], [res[0], res[1]]]
match1 = None
while True:
time.sleep(1)
pos = get_pos()
# get the current difference from the mousepointer to each of the corner (radius)
diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\
for c in corners]
# see if any of the corners is "approached" within the radius
match2 = [diff.index(n) for n in diff if n < radius]
# if so, and the corresponding command is not set to None, run it.
if all([match2 != match1, match2]):
cmd = commands[match2[0]]
if cmd:
subprocess.Popen(["/bin/bash", "-c", cmd])
match1 = match2
用法
基本一样。在脚本的头部设置命令和触发半径。
答案3
笔记:
wjandrea 的回答 对于使用默认 Ubuntu 或 Ubuntu Kylin(或使用 compiz 作为显示管理器)的人来说是最合适的答案,因此它得到了我的赞同和尊重。下面提供的答案也可以在 Unity 上使用,但可能稍微多余。但是,在没有 compiz 的桌面环境中,可以使用下面介绍的指示器。我在 Lubuntu 16.04 VM 中对其进行了简单测试,所以我知道它在那里可以工作,并且使它与 Kylin 14.04 兼容。对于 GNOME 和 MATE 桌面,您需要先启用对 AppIndicators 的支持才能使用任何指示器。
介绍
我实现了indicator-edger
允许根据鼠标在屏幕 4 个边缘的任意位置触发用户定义命令的功能。原始版本是在一天内完成的,大约用了 7 个小时,因此它相当简单但可以完成工作。
指示器通过~/.edger-commands.json
文件控制,显然是json
格式。它可以由用户手动写入,也可以通过指示器的DEFINE COMMANDS
选项设置。启用/禁用触发选项会被记住并自动写入文件以方便用户使用。示例配置文件如下:
{
"right": "gnome-terminal",
"top": "firefox",
"left": "",
"bottom": "gnome-screenshot",
"enabled": true
}
注意"left"
文件中的条目。该边未设置,但由于json
语法原因,它要求在那里有一个空字符串,即引号""
。
一旦指示器检测到用户将鼠标放在任意边缘(边缘约 3 像素),指示器就会发送气泡通知并运行相应的命令(如果已定义)。除非用户将鼠标移离边缘,否则触发器的激活不会重复。
从上面的截图中可以看到,该指标在命令行中也有调试输出。如果您发现任何错误,请随时从终端运行它,找出发生错误的原因,并提交相应的错误报告该项目 GitHub 的问题页面。
目前不支持角落(仅支持边缘)并且它是为单显示器设置而构建的(显然,在创建的 7 小时内无法覆盖所有基础),但这些功能最终可能会在未来提供。
安装和源代码
源代码可以在项目中找到GitHub页面或通过发射台。安装通过终端中的以下命令执行:
sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger