我可以设置Hot Corners在Unity中运行自定义命令吗?


13

我真的很喜欢Hot Corners。:-)

是否可以在热角处运行自定义命令,如下所示?

在此处输入图片说明


我不认为专门使用hotcorner(至少不是Unity使用它们的方式)是可行的,但是当将鼠标置于屏幕的特定区域时,可以触发脚本。例如,请参见askubuntu.com/a/758307/295286,将鼠标悬停在操作部分。我会更多地研究hotcorners,但是如果这些问题无法解决,那么自定义脚本还可以吗?
Sergiy Kolodyazhnyy

多显示器还是单显示器?
Jacob Vlijm '17

嗨奥西罗,发布。如果一切都清楚(或不清楚),请提及。
雅各布·弗利姆

嘿,我看到这里的热角多于我的答案。您想要几个?
雅各布·弗利姆

2
@ JacobVlijm,Serg,看我的回答。
wjandrea '17

Answers:


10

CCSM

  1. 安装CompizConfig设置管理器(CCSM)。在终端中运行:

    sudo apt-get install compizconfig-settings-manager
  2. 打开CCSM。

  3. 转到“命令”
  4. 在其中一个插槽中输入所需的命令。例如:

    CCSM屏幕截图-命令

  5. 转到“边缘绑定”选项卡

  6. 单击“无”,然后设置所需的热角(或边缘),该角对应于您刚刚设置的命令

    CCSM屏幕截图-热点

  7. 将鼠标移到角落

  8. 现在您的命令已运行!

    CCSM屏幕截图-命令运行

确认在14.04上工作。


所有提议的解决方案中最简单的。如果希望通过脚本更好地实现命令,而不仅仅是使compiz命令指向该脚本,或者如果脚本位于$ PATH中的bin文件夹中,则仅指向脚本名。唯一可能的缺点是已知unity / compiz会随机“丢失”用户设置的命令,即那些没有集成的命令。如何集成用户命令超出了此问题的范围。
doug

@wjandrea毕竟是实现的。Compiz没有抓住让我惊讶的地方。好的答案,最适合OP的需求。+1版
Sergiy Kolodyazhnyy

不幸的是,你是对的,哈哈。是的,这正是OP的要求。
雅各布•弗利姆'17

您在编辑和答案方面已经帮助了我很多次。有一个ole'Serg曾经说过的“ cookie” ...的确有六个:)
WinEunuuchs2Unix

6

自定义命令

如果您正在使用Unity 安装了ccsm,那么wjandrea的答案就是您的答案。如果不是,或者要在其他发行版上使用,则可能需要轻量级的替代方案。

使用以下脚本,您可以设置特定于每个hotcorner的任何命令。

作为示例,我进行了以下设置:

  • 左上方 无动作
  • 右上 运行Gedit的
  • 左下方 无动作
  • 底部RightRun 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

设定

  1. 脚本需要 xdotool

    sudo apt install xdotool
  2. 将脚本复制到一个空文件中,将我另存为 hotcorners2.py
  3. 在脚本的开头,设置命令(注意引号)

    commands = [
        None,
        "gedit",
        None,
        "gnome-terminal",
    ]

    (因此,左上/右下,左下/右下)

  4. 测试运行脚本:

    python3 /path/to/hotcorners2.py
  5. 如果一切正常,请添加到启动应用程序: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

用法

差不多。在脚本的头部设置命令和要触发的半径。


5

注意:

对于使用默认Ubuntu或Ubuntu Kylin(或使用compiz作为其显示管理器)的人,wjandrea的答案是最合适的答案,因此它得到了我的支持和尊重。下面提供的答案也可以在Unity上使用,但可能会有点多余。但是,在没有compiz的桌面环境中,可以使用下面显示的指示器。我已经在Lubuntu 16.04 VM中对其进行了简短的测试,所以我知道它在那里工作,并且还使其与Kylin 14.04兼容。对于GNOME和MATE桌面,您需要首先启用对AppIndicators的支持才能使用任何指示器。

介绍

我实现indicator-edger了允许基于鼠标位置(沿屏幕4个边缘的任何位置)触发用户定义的命令的功能。原始版本是在一天之内完成的,大约需要7个小时,因此虽然相当简单,但却可以完成工作。

在此处输入图片说明

指示器通过~/.edger-commands.jsonfile进行控制,json格式很明显。它可以由用户手动编写,或通过指示器的DEFINE COMMANDS选项进行设置。为了方便用户,将记住启用/禁用触发选项并自动将其写入文件。示例配置文件如下所示:

{
    "right": "gnome-terminal",
    "top": "firefox",
    "left": "",
    "bottom": "gnome-screenshot",
    "enabled": true
}

注意"left"文件中的条目。该边没有设置,但是由于json语法原因,它需要在此处有一个空字符串,即quotes ""

一旦指示器检测到用户已将鼠标置于任意边缘(边缘约3个像素),指示器将发送气泡通知并运行适当的命令(如果已定义)。除非用户将鼠标从边缘移开,否则不会重复激活触发器。

在此处输入图片说明

从上面的屏幕快照中可以看到,指示器在命令行中也有调试输出。如果发现任何错误,请随时从终端运行它,找出发生了什么错误,然后在项目GitHub的问题页面上提交适当的错误报告。

当前不支持转角(仅边缘),它是为单显示器设置而构建的(显然,创建后的7个小时内无法覆盖所有基础),但是这些功能最终可能会在将来提供。

安装和源代码

源代码可在项目GitHub页面或通过Launchpad获得。通过终端中的以下命令执行安装:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
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.