仅在需要时如何自动添加工作区?

kernel_panic

假设我正在使用4个工作空间,并且我偶然需要更多工作空间,是否有一个自动化的流程,或者,如果不可能的话,是否有一种简便的方法来偶然地添加更多工作空间(而不是安装Ubuntu tweak等)。

雅各布·弗利姆(Jacob Vlijm)

自动设置工作区数量;根据需要添加和删除列和行

在backround脚本版本的下面,如果您输入了工作区矩阵的最后一列或最后一行,它将自动添加工作区。

它是这样工作的:

  1. 如果到达最后一列或最后一行,则会添加其他视口:

    在此处输入图片说明

  2. 如果您的工作区闲置了5到10秒钟,并且上面没有窗口,则其他工作区将被再次删除。但是,您将始终在下面保留额外的一行,并在当前视口的右边保留一列:

    在此处输入图片说明

剧本:

#!/usr/bin/env python3
import subprocess
import time
import math

# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10

def set_workspaces(size, axis):
    subprocess.Popen([
        "dconf", "write", "/org/compiz/profiles/unity/plugins/core/"+axis,
                str(size)
                ])

def get_res():
    resdata = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    curr = resdata.index("current")
    return (int(resdata[curr+1]), int(resdata[curr+3].replace(",", "")))

def wspace():
    try:
        sp = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        return ([int(n) for n in sp[3].split("x")],
                [int(n) for n in sp[5].split(",")])

    except subprocess.CalledProcessError:
        pass


def clean_up(curr_col, curr_row):
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
        xpos = max([math.ceil((int(w[2])+span[1][0])/res[0]) for w in w_list])
        min_x = max(xpos, curr_col+1, hsize)
        if xpos >= hsize:
            set_workspaces(min_x, "hsize")
        else:
            set_workspaces(min_x, "hsize")
        ypos = max([math.ceil((int(w[3])+span[1][1])/res[1]) for w in w_list])
        min_y = max(ypos, curr_row+1, vsize)
        if ypos >= vsize:
            set_workspaces(min_y, "vsize")
        else:
            set_workspaces(min_y, "vsize")
    except subprocess.CalledProcessError:
        pass

res = get_res()
t = 0

while True:
    span = wspace()
    if span != None:
        cols = int(span[0][0]/res[0]); rows = int(span[0][1]/res[1])
        currcol = int((span[1][0]+res[0])/res[0])
        if all([currcol == cols, cols*rows < max_ws]):
            set_workspaces(cols+1, "hsize")
        currrow = int((span[1][1]+res[1])/res[1])
        if all([currrow == rows, cols*rows < max_ws]):
            set_workspaces(rows+1, "vsize")
        if t == 10:
            clean_up(currcol, currrow)
            t = 0
        else:
            t = t+1
        time.sleep(1)

如何使用

  1. 将下面的脚本复制到一个空文件中,另存为 add_space.py
  2. 如果您喜欢其他设置(最大工作空间数,默认矩阵,例如2x2),请在脚本的开头部分中编辑行:

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. 通过以下命令对其进行测试:

    python3 /path/to/add_space.py
    
  4. 如果一切正常,请将其添加到启动应用程序:Dash>启动应用程序>添加命令:

    /bin/bash -c "sleep 15 &&  python3 /path/to/add_space.py`
    

笔记

与往常一样,该脚本极其“耗时”,并且不会给处理器增加任何明显的负载。

解释

下面的故事有点复杂,主要是对概念过程的解释,而不是对代码的解释。仅在有兴趣时阅读。

如何计算所需的工作空间(示例列)

输出wmctrl -d如下:

0  * DG: 3360x2100  VP: 1680,1050  WA: 65,24 1615x1026  N/A

在输出中,VP: 1680,1050向我们提供有关跨越工作空间(所有视口矩阵)的位置的信息。仅当我们也具有屏幕的分辨率时,此信息才有用,因为例如1680,宽度可能是屏幕的两倍(不太可能,但仍然)或一倍。
幸运的是,我们可以从命令中解析出屏幕的分辨率xrandr

然后,如果我们知道屏幕的x尺寸为1680且当前为VP: 1680,1050,则知道我们位于工作区矩阵第二列中。由于我们还知道了总矩阵(的大小DG: 3360x2100,也来自的输出wmctrl -d),因此我们知道当前矩阵包括两列(3360/1680),位于“最后”一列上。

在此处输入图片说明

然后,脚本将发送一条指令,以通过以下命令在矩阵中添加一列:

dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>

这就是原理。

如何计算要删除的工作空间(示例列)

该脚本每10秒运行一次,使用以下命令运行命令以列出所有当前打开的窗口:

wmctrl -lG

这也为我们提供了有关窗口位置的信息,如下所示:

0x04604837  0 3425 24   1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit

在输出中,3425是窗口的x位置。但是,此图相对于当前工作空间(左侧)。为了知道窗口在工作区矩阵中的绝对位置(x方向),我们必须添加当前视口信息的第一个数字(例如VP: 1680,1050,从的输出wmctrl -d)。
但是,出于简单原因,让我们假设我们在视口1,1(左上视口)上,因此窗口的相对位置等于其绝对位置。

由于屏幕的分辨率为1680,因此我们知道窗口在column上是3425/1680向上舍入的,因为之间的所有内容都在3360 and 5040矩阵的同一列上(分辨率在3到4倍之间)。为了进行正确的计算,我们使用math.ceil()python

由于脚本遵循该规则,因此始终在右/下具有一个额外的工作区,因此我们需要将列数设置为以下最高值:

  • 当前工作空间柱+ 1
  • 最后与它的窗口列
  • 默认的列数,如脚本开头所设置

脚本也是如此:)

这些行以完全相同的过程进行管理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在工作簿的最后一页之后添加工作表?

来自分类Dev

仅在iOS 7上将子视图添加到UITableView时出现“仍需要自动布局”错误

来自分类Dev

Birt报告,如何在母版页脚上添加工作单(WONUM)?

来自分类Dev

如何在Visual Studio 2013 IDE中添加工作项标签?

来自分类Dev

工作日功能添加工作日

来自分类Dev

仅在构建失败时如何清理Jenkins工作区

来自分类Dev

如何在C#中的Google Sheets API v4中添加工作表?

来自分类Dev

如何使用VBA在Excel中禁用添加工作表按钮?

来自分类Dev

在Google Sheets Apps脚本中,如何检查工作表是否存在以及是否不添加工作表

来自分类Dev

启动时自动加载Sublime工作区

来自分类Dev

在python中添加工作日

来自分类Dev

删除/添加工作表事件-VBA

来自分类Dev

Web提取代码需要更新,试图从工作表单元格中添加工作表

来自分类Dev

使用gnome classic和ubuntu 14.04添加工作区

来自分类Dev

添加工作表时出现自动化错误

来自分类Dev

如何自动配置Eclipse工作区

来自分类Dev

如何在Alfresco中手动添加工作流程?

来自分类Dev

如何仅在需要时重用UITableViewCell?

来自分类Dev

删除或添加工作日时,请确保始终按顺序排列工作日的数组

来自分类Dev

Swift如何添加工作时钟?

来自分类Dev

仅在Rails 3.2中需要时才自动加载gem?

来自分类Dev

添加工作表时自动展开用户表单复选框

来自分类Dev

如何添加工作表\将工作表删除到共享的Excel文件中?

来自分类Dev

开发新的vscode扩展时如何将新文件添加到工作区?

来自分类Dev

控制添加工作表的位置

来自分类Dev

Powershell Excel 自动添加工作表

来自分类Dev

如何在python中添加工作日至今?

来自分类Dev

当点击活动工作区上的 URL 时,如何防止 Firefox 从一个工作区自动移动到活动工作区

来自分类Dev

如何在最后一个活动工作表之后使用 InputBox 添加工作表?

Related 相关文章

  1. 1

    如何在工作簿的最后一页之后添加工作表?

  2. 2

    仅在iOS 7上将子视图添加到UITableView时出现“仍需要自动布局”错误

  3. 3

    Birt报告,如何在母版页脚上添加工作单(WONUM)?

  4. 4

    如何在Visual Studio 2013 IDE中添加工作项标签?

  5. 5

    工作日功能添加工作日

  6. 6

    仅在构建失败时如何清理Jenkins工作区

  7. 7

    如何在C#中的Google Sheets API v4中添加工作表?

  8. 8

    如何使用VBA在Excel中禁用添加工作表按钮?

  9. 9

    在Google Sheets Apps脚本中,如何检查工作表是否存在以及是否不添加工作表

  10. 10

    启动时自动加载Sublime工作区

  11. 11

    在python中添加工作日

  12. 12

    删除/添加工作表事件-VBA

  13. 13

    Web提取代码需要更新,试图从工作表单元格中添加工作表

  14. 14

    使用gnome classic和ubuntu 14.04添加工作区

  15. 15

    添加工作表时出现自动化错误

  16. 16

    如何自动配置Eclipse工作区

  17. 17

    如何在Alfresco中手动添加工作流程?

  18. 18

    如何仅在需要时重用UITableViewCell?

  19. 19

    删除或添加工作日时,请确保始终按顺序排列工作日的数组

  20. 20

    Swift如何添加工作时钟?

  21. 21

    仅在Rails 3.2中需要时才自动加载gem?

  22. 22

    添加工作表时自动展开用户表单复选框

  23. 23

    如何添加工作表\将工作表删除到共享的Excel文件中?

  24. 24

    开发新的vscode扩展时如何将新文件添加到工作区?

  25. 25

    控制添加工作表的位置

  26. 26

    Powershell Excel 自动添加工作表

  27. 27

    如何在python中添加工作日至今?

  28. 28

    当点击活动工作区上的 URL 时,如何防止 Firefox 从一个工作区自动移动到活动工作区

  29. 29

    如何在最后一个活动工作表之后使用 InputBox 添加工作表?

热门标签

归档