如何使 docky 仅在一个工作区中可用?

如何使 docky 仅在一个工作区中可用?

有没有办法让 docky 仅在一个工作区中可用,而不在 Ubuntu 14.04 中的任何其他工作区中可用。

答案1

使 docky 在特定工作区上运行(或不运行)的后台脚本

基于与这个答案,位于启动/停止启动器的后台脚本下方Docky,具体取决于当前工作区。

该机制本身已经经过了充分测试。话虽如此,在链接的问题中,它通过设置进行测试不同的 Unity Launcher设置不同的壁纸每个工作区,而不是启动/停止Docky。然而,这应该没有任何区别,在我测试它的几个小时里,它运行时没有出现任何错误。

如何使用

  1. 该脚本需要wmctrl

    sudo apt-get install wmctrl
    
  2. 将以下脚本复制到一个空文件中,并将其另存为docky_perworkspace.py

  3. 测试运行脚本:

    • 开始Docky
    • 使用以下命令启动脚本:

      python3 /path/to/docky_perworkspace.py
      
    • 现在 Docky 可以在所有工作区上运行。导航到您要想要Docky出现并运行(在工作区中):

      pkill docky
      

    注意:使用时pkill docky,不要从其自己的菜单中关闭 docky!

  4. 差不多就是这样了。如果你想改变设置,只需在你想让它运行或不运行的工作区上启动或终止 docky 即可;脚本会记住你的偏好。
  5. 如果一切正常,请将其添加到您的启动应用程序中:Dash>启动应用程序>添加命令:

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

剧本

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

datadir = os.environ["HOME"]+"/.config/docky_run"
if not os.path.exists(datadir):
    os.makedirs(datadir)
workspace_data = datadir+"/docky_set_"

def get_runs():
    try:
        subprocess.check_output(["pgrep", "docky"]).decode("utf-8")
        return True
    except:
        return False

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def current():
    # get the current viewport
    res = get_res()
    vp_data = subprocess.check_output(
        ["wmctrl", "-d"]
        ).decode("utf-8").split()
    dt = [int(n) for n in vp_data[3].split("x")]
    cols = int(dt[0]/res[0])
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    curr_col = int(curr_vpdata[0]/res[0])+1
    curr_row = int(curr_vpdata[1]/res[1])
    return str(curr_col+curr_row*cols)

curr_ws1 = current()
runs1 = get_runs()

while True:
    time.sleep(1)
    runs2 = get_runs()
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if runs2 != runs1:
            open(datafile, "wt").write(str(runs2))
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(str(runs2))
        else:
            curr_set = eval(open(datafile).read())
            if all([curr_set == True, runs2 == False]):
                subprocess.Popen(["docky"])
            elif all([curr_set == False, runs2 == True]):
                subprocess.Popen(["pkill", "docky"])           
    curr_ws1 = curr_ws2
    runs1 = get_runs()

解释

该脚本会跟踪当前工作区(无论您有多少个工作区)。每个工作区都会在 中创建一个文件/.config/docky_run,其中会“写入” docky 是否应出现在引用工作区(TrueFalse)中

如果您停留在同一个工作区,但 docky 已启动或已终止(出现pid或结束),则脚本会“理解”是您在引用的工作区上进行了更改,并且文件会被更新。

如果工作区然而,如果文件发生变化,脚本将根据文件内容和当前情况查看文件是否存在,然后读取文件并启动或终止 docky(如果没有必要,则不执行任何操作)。如果文件尚不存在(因为这是自首次启动脚本以来您第一次使用工作区),则会创建文件并将其设置为当前(最后)情况。

因为每个工作区的设置都保存在文件中,所以即使重新启动后也会被记住。

相关内容