當前位置: 首頁>>技術教程>>正文


unity – 設置為僅在啟動器中顯示當前工作區的應用程序?

, ,

問題描述

是否可以在啟動器中打開當前工作區的應用程序,而不是來自其他工作區的應用程序?

最佳方案

對於 Ubuntu 17.10 及更高版本(使用 GNOME)附帶的 Ubuntu Dock

好吧,其他答案已經很老了,所以我認為值得添加 up-to-date 答案。現在就可以這樣做而且不太難(使用 Ubuntu 17.10 並且它具有 Gnome)。

隻需使用 dconf-editor:

sudo apt install dconf-editor

導航到組織 >侏儒>殼>擴展 > dash-to-dock 並檢查 isolate-workspaces

次佳方案

如何使應用程序在(其他)工作空間上無法追蹤

使用 xdotoolwindowunmap ,可以完全隱藏窗口。該窗口及其應用程序不再出現在啟動器圖標中,甚至不再在 wmctrl 的輸出中列出。

從理論上講,這可以連接到在 thisthis 答案中使用的 “workspace-engine”。那將是最優雅的解決方案。

但是,僅在其他工作空間上隱藏窗口並在當前工作空間上自動提升窗口的過程對於在正在進行的後台腳本中使用(目前)要求太高,而且也不太可能“感冒”。由於一旦出現錯誤,窗口就會永遠丟失,因此我決定不將該過程作為自動(後台)過程提供。

這個答案是否仍然對您有用取決於情況,以及您想要隱藏在其他工作區上運行的應用程序圖標的原因;決定權在你。

解決方案;它是什麽以及它在實踐中是如何工作的

  • 一個腳本,在快捷鍵下可用,似乎使當前工作區(以及應用程序)上的所有窗口完全消失。這意味著 Unity 啟動器中的應用程序圖標顯示該應用程序沒有任何活動: 三個正在運行的應用程序: 按下快捷鍵後:

  • 再次按下快捷鍵組合,窗口及其應用程序將 re-appear。

  • 由於組合鍵隻會隱藏當前工作區中的窗口和應用程序,因此您可以隨後切換到另一個工作區,而不會顯示當前工作區中(隱藏)的內容。

  • 也(僅)在當前工作空間上完成取消隱藏,因此簡而言之,隱藏和取消隱藏的過程是完全獨立於每個工作空間進行的。

劇本

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

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

def get_wlist(res):
    res = get_res()
    try:
        wlist = [l.split() for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
        return [w for w in wlist if all([
            0 < int(w[2]) < res[0],
            0 < int(w[3]) < res[1],
            "_NET_WM_WINDOW_TYPE_NORMAL" in subprocess.check_output(["xprop", "-id", w[0]]).decode("utf-8"),
            ])]
    except subprocess.CalledProcessError:
        pass

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(res):
    # get the current viewport
    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)

res = get_res()

try:
    f = workspace_data+current(res)
    wlist = eval(open(f).read().strip())
    for w in wlist:
        subprocess.Popen(["xdotool", "windowmap", w[0]])
    os.remove(f)
except FileNotFoundError:
    current_windows = get_wlist(res)
    open(f, "wt").write(str(current_windows))
    for w in current_windows:
        subprocess.Popen(["xdotool", "windowunmap", w[0]])

如何使用

  1. 該腳本需要 wmctrlxdotool

    sudo apt-get install wmctrl xdotool
    
  2. 將腳本複製到一個空文件中,保存為toggle_visibility.py

  3. 測試-運行腳本:在終端窗口中,運行命令:

    python3 /path/to/toggle_visibility.py
    

    現在打開一個新的終端窗口(因為第一個似乎從地球表麵消失了)並再次運行相同的命令。所有窗口應為 re-appear。

    注意:確保您在測試時沒有打開 “valuable” 窗口

  4. 如果一切正常,請將命令添加到快捷鍵組合中:選擇:係統設置 > “Keyboard” > “Shortcuts” > “Custom Shortcuts”。單擊 “+” 並添加命令:

    python3 /path/to/toggle_visibility.py
    

Explanation

如前所述,該腳本使用 xdotoolwindowunmap 來(完全)隱藏窗口及其所屬的應用程序。劇本:

  • 讀取當前工作區是什麽

  • 讀取當前工作區中存在的窗口(僅)

  • 將窗口列表寫入以當前工作區命名的文件

  • 隱藏窗戶

在下一次運行時,腳本:

  • 檢查當前工作空間對應的文件是否存在

  • 如果是,則讀取窗口列表並取消隱藏窗口。

從而切換當前工作空間上的窗口和應用程序的可見性。

第三種方案

不幸的是,這是不可能的。

Unity 總是顯示來自任何地方的所有應用程序,並且沒有辦法改變這一點。有一個錯誤報告 – https://bugs.launchpad.net/ayatana-design/+bug/683170 但似乎開發人員不會做任何事情。可能如果您在頁麵頂部標記此錯誤會影響您,它將幫助開發人員了解此類選項的重要性。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/12676.html,未經允許,請勿轉載。