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

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

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

是否有可能以某种方式在热点角运行自定义命令,如下所示?

在此处输入图片描述

答案1

加拿大华人商会

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

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

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

    CCSM 屏幕截图-命令

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

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

    CCSM 截图-热点

  7. 将鼠标移到角落

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

    CCSM 屏幕截图-命令运行

确认于 14.04 工作。

答案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

设置

  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

用法

基本一样。在脚本的头部设置命令和触发半径。

答案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

相关内容