我可以设置一个键绑定来在选定的方向上将窗口大小调整为其一半吗?

我可以设置一个键绑定来在选定的方向上将窗口大小调整为其一半吗?

使用 Ubuntu 14.04,我正在寻找一款 40 英寸 4k 显示器,并找到了如何将窗口大小调整为屏幕的四分之一,但我希望能够根据需要进一步调整它们的大小。例如,我想将默认 compiz 键绑定为全屏窗口并将其放在屏幕左上角的四分之一,但如果再次按下,则将其进一步缩小到屏幕左上角的八分之一,或将窗口放在屏幕顶部四分之一的右下角四分之一(垂直和水平占据屏幕的八分之一)。此功能是否隐藏在 compiz 或我不熟悉的任何其他应用程序中?

答案1

下面的脚本可以用作 14.04 版中“resize-to-quarter”选项的附加功能。可以使用以下参数运行它:“left”、“right”、“up”、“down”,以进一步将四分之一切成八份。

它能做什么

如果您将窗口移动到屏幕的四分之一处:

在此处输入图片描述

该脚本会将窗口切成两半,左半、右半、上半或下半,具体取决于运行它时使用的参数(见下文)。

如何使用

  • 该脚本使用wmctrl,这在您的系统上不是默认的:

    sudo apt-get install wmctrl
    
  • 将下面的脚本复制到一个空文件中,将其保存为organize_w目录~/bin。使脚本可执行。可能您仍需要创建目录~/bin。它的优点是您只需通过脚本名称即可运行脚本:

  • 将四个命令添加到自定义键盘快捷键。打开系统设置 > “键盘” > “快捷键” > “自定义快捷键”。将四个命令添加到组合键。
    在我的系统上,我发现仍然有四个非常合适的快捷键可用:我建议添加这些组合键下的命令:

    organize_w left 
    

    Shift+ Ctrl+数字键盘<

    影响:

    在此处输入图片描述

    organize_w right 
    

    Shift+ Ctrl+数字键盘>

    影响:

    在此处输入图片描述

    organize_w up 
    

    Shift+ Ctrl+数字键盘^

    影响:

    在此处输入图片描述

    organize_w down 
    

    Shift+ Ctrl+数字键盘v

    影响:

    在此处输入图片描述

    这样,您只需按几个键就可以像下面这样排列窗口:

  • 在此处输入图片描述

剧本:

#!/usr/bin/env python3
import subprocess
import sys

arg = sys.argv[1]
WA_correction = 28

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def execute(command):
    subprocess.Popen(["/bin/bash", "-c", command])

xprop_data = get("xprop -root").split()
w_id = xprop_data[xprop_data.index("_NET_ACTIVE_WINDOW(WINDOW):")+4].replace(",", "")
frontmost = w_id[:2]+"0"+w_id[2:]
w_data = [l for l in get("wmctrl -lG").splitlines() if frontmost in l][0].split()
new_G = w_data[2:6]
new_G[1] = str(int(int(new_G[1])-WA_correction))
xy_corr = lambda x: -10 if int(x) < 100 else 0
if arg == "left":
    new_G[2] = str(int(int(new_G[2])/2 + xy_corr(new_G[0])))
    new_G[3] = str(int(int(new_G[3]) + xy_corr(new_G[1])))            
elif arg == "right":
    new_G[0] = str(int(int(new_G[0])+int(new_G[2])/2))    
    new_G[2] = str(int(int(new_G[2])/2))
    new_G[3] = str(int(int(new_G[3]) + xy_corr(new_G[1])))
elif arg == "up":
    new_G[2] = str(int(new_G[2]) + xy_corr(new_G[0]))
    new_G[3] = str(int(int(new_G[3])/2 + xy_corr(new_G[1])))
elif arg == "down":
    new_G[1] = str(int(int(new_G[1]) + int(new_G[3])/2))
    new_G[2] = str(int(new_G[2]) + xy_corr(new_G[0]))
    new_G[3] = str(int(int(new_G[3])/2))

execute("wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz")
execute("wmctrl -ir "+frontmost+" -e 0,"+(",").join(new_G))



编辑:

XFCE 版本

经过一些小的改动,该脚本还可用于在 XFCE 上将窗口大小调整为原来的一半 / 四分之一或八分之一(在 14.04 上测试)。

与 Unity 版本使用方式完全相同:

#!/usr/bin/env python3
import subprocess
import sys

arg = sys.argv[1]
WA_correction = 48

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def execute(command):
    subprocess.Popen(["/bin/bash", "-c", command])

xprop_data = get("xprop -root").split()
w_id = xprop_data[xprop_data.index("_NET_ACTIVE_WINDOW(WINDOW):")+4].replace(",", "")
frontmost = w_id[:2]+"0"+w_id[2:]
w_data = [l for l in get("wmctrl -lG").splitlines() if frontmost in l][0].split()
new_G = w_data[2:6]
new_G[1] = str(int(int(new_G[1])-WA_correction))
if arg == "left":
    new_G[2] = str(int(int(new_G[2])/2))      
elif arg == "right":
    new_G[0] = str(int(int(new_G[0])+int(new_G[2])/2))    
    new_G[2] = str(int(int(new_G[2])/2))
elif arg == "up":
    new_G[3] = str(int(int(new_G[3])/2))
elif arg == "down":
    new_G[1] = str(int(int(new_G[1]) + int(new_G[3])/2))
    new_G[3] = str(int(int(new_G[3])/2))

execute("wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz")
execute("wmctrl -ir "+frontmost+" -e 0,"+(",").join(new_G))

(XFCE 版本也发布在gist.gisthub

相关内容