我可以使用键盘一次一个像素地移动/调整窗口大小吗?

在Windows中(至少XP,可能在之前),如果你使用键盘移动或调整窗口大小,你可以通过使用Ctrl键和箭头来获得非常精确的位置和大小 – 甚至比鼠标更多 – 键(在从窗口菜单[Alt + Space]调用MoveResizefunction之后)一次移动窗口边框一个像素。

有没有办法在Ubuntu中做同样的事情(或类似的事情)?

移动/调整窗口大小为1px

假设您正在使用Unity,下面的脚本将窗口移动或resize1 px。 该脚本可以使用8个不同的参数运行。 根据要使用的移动/重新resize选项,可以将命令添加到快捷键组合中。 以下是选项和相应命令的概述:

在此处输入图像描述

例外/限制

有一些限制:

  • gnome-terminal windows只能按步骤重新resize。 因此,将窗口大小增加/减少1px对gnome-terminal不起作用。
  • 要移动/重新resize的窗口需要至少距离Unity启动器和顶部面板几px。

如何使用

  • 首先安装wmctrl,这是获取窗口几何和移动窗口所必需的。

     sudo apt-get install wmctrl 
  • 创建一个目录~/bin (在你的主目录中)

  • 将下面的脚本复制到一个空文件中,将其另存为move_window (无扩展名)
  • 使其可执行(右键单击文件>属性>权限(选项卡),勾选“允许执行”)

    要进行测试,请打开终端窗口并随后运行:

     move_window l move_window r move_window u move_window d 

    由于终端窗口是最前面的,它应该向左/向右/向上/向下移动1px。

    (如上所述, resize不适用于gnome-terminal

  • 如果它正常工作,请将命令添加到快捷键;
    选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。 单击“+”并将命令添加到四个不同的快捷键组合。 这可能很棘手,因为你提到的命令可能已被占用。 什么在我的系统上有效:

    • 按住Shift + Ctrl + 箭头键
    • 按住Shift + Ctrl + 箭头键
    • Shift + Ctrl + 箭头键向上
    • 按住Shift + Ctrl + 箭头键

    对于移动动作。
    对于resize操作,您必须尝试其他组合。

剧本

 #!/usr/bin/env python3 import subprocess import sys # calibration cal = 4 # direction, as argument from user input (l, r, u, d / h+, h-, v+, v-) direction = sys.argv[1] # move step size mv = -1 if direction in ["l", "d", "h-", "v-"] else 1 def get(command): return subprocess.check_output(["/bin/bash", "-c", command])\ .decode("utf-8") def execute(command): subprocess.call(["/bin/bash", "-c", command]) # find the top shift (height of the panel = resolution - working area) res_output = get("xrandr").split(); idf = res_output.index("current") res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))[-1] topshift = int(res) - int(get("wmctrl -d").split()[8].split("x")[-1])+cal # find frontmost window def get_windowid(): cmd = "xprop -root" frontmost = [l for l in get(cmd).splitlines() if\ "ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1] return frontmost[:2]+"0"+frontmost[2:] # get window geometry, create move command set_w = [w.split()[0:6] for w in get("wmctrl -lG").splitlines()\ if get_windowid() in w][0] set_w[0] = "wmctrl -ir "+set_w[0]+" -e 0" set_w.pop(1) if direction in ["l", "r"]: set_w[1] = str(int(set_w[1])+mv); set_w[2] = str(int(set_w[2])-topshift) elif direction in ["u", "d"]: set_w[2] = str(int(set_w[2])-topshift-mv) elif direction in ["v-", "v+"]: set_w[2] = str(int(set_w[2])-topshift); set_w[4] = str(int(set_w[4])+mv) elif direction in ["h-", "h+"]: set_w[2] = str(int(set_w[2])-topshift); set_w[3] = str(int(set_w[3])+mv) execute((",").join(set_w)) 

注意

wmctrl 报告窗口几何的方式和wmctrl 设置窗口几何的方式wmctrl 。 在第一种情况下,它从全屏(分辨率)计算,在第二种情况下仅从工作区域(??)计算。 即使这样,剧本也必须垂直“校准”4像素,为此我没有找到令人满意的解释。 好消息是,在不同的计算机上,我看到偏差没有区别。

如果在您的情况下窗口发生意外跳跃,请发表评论。


说明

这个怎么运作

  1. xprop的帮助下查找最前面的窗口:

     xprop -root 

    在(扩展)输出中的某处,有一行如下:

     _NET_ACTIVE_WINDOW(WINDOW): window id # 0x4600a8d 

    从中可以解析我们的window-id: 0x4600a8d 。 由于格式与wmctrl不同,我们需要在第三个位置添加零: 0x04200085

  2. 窗口id用于在wmctrl -lG的输出中wmctrl -lG窗口及其当前几何数据。 一旦我们有了正确的行,我们在窗口上的数据就像:

     0x04200085 0 322 52 823 998   

    第2,3,4,5列随后是:

    • 窗口左上角的x坐标
    • y坐标
    • 窗口的宽度
    • 窗户的高度
  3. 通过操作这些数字,我们可以使用以下命令移动/调整窗口大小:
    (示例将窗口向右移动1 px,将“322”更改为“323”)

     wmctrl -ir 0x04200085 -e 0,323,52,823,998 

有一些复杂的问题需要处理,但这基本上就是它的工作原理。

显然,这在XFCE中也不起作用。 我有一个间接的想法可能会工作…

我建议尝试使用键盘控制鼠标的辅助function选项,将其设置为非常缓慢地移动,并使用它来让窗口一次移动一点点。

每个桌面似乎都将可访问性选项放在不同的位置,在XFCE中它位于常规设置管理器下,但在Unity和其他人中应该不难找到…