AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 973500
Accepted
janw
janw
Asked: 2017-11-07 04:12:22 +0800 CST2017-11-07 04:12:22 +0800 CST 2017-11-07 04:12:22 +0800 CST

启动所有工作区的每个窗口,但有一些排除项

  • 772

我知道Always on visible workspace但是我希望所有窗口在打开时都将其作为默认设置,但有一些例外。

我正在寻找的工作流程几乎与它的工作方式相反。显示所有工作区上的所有内容,但有一些(手动)例外。

可能吗?如果它需要一些脚本,我可能不会介意。

我正在运行带有肉桂的 Ubuntu 17.04,但是 afaik 这个功能存在于统一和大多数桌面环境中。

scripts
  • 1 1 个回答
  • 1377 Views

1 个回答

  • Voted
  1. Best Answer
    Jacob Vlijm
    2017-11-08T00:52:22+08:002017-11-08T00:52:22+08:00

    有趣的案例。

    我们需要考虑什么

    这个概念并不复杂:只需将所有窗口设置为粘性,但是:

    • 由于您要排除某些应用程序,我们需要列出这些应用程序并检查窗口的窗口类,以确定我们是否应该将它们设置为粘性(显示在所有工作区)。
    • 作为输出的窗口列表wmctrl -l还显示了一些窗口类型,例如 DOCK 和 DESKTOP,您通常不应该编辑它们的属性。
    • 我们需要确保只设置新窗口的粘性,以防止不必要的燃料消耗。

    示例脚本 (python)

    在下面的脚本中:

    • 一个两秒的循环运行以将窗口列表与前一个进行比较,使用:

      wmctrl -l
      

      然后从每一行中提取窗口 id

    • 随后,脚本运行

      xprop -id <window_id>
      

      在其中我们可以找到关于_NET_WM_WINDOW_TYPE和的信息WM_CLASS

    • 如果新窗口“通过”这些测试,则该窗口不属于任何排除的应用程序并且不属于任何排除的类型,则将其设置为粘性。

    由于脚本只作用于新创建的窗口,它不会给您的系统增加任何明显的负担。

    剧本

    #!/usr/bin/env python3
    import subprocess
    import time
    
    # excluded applications
    apps = ["gedit", "chromium", "monkey"]
    
    
    # ignored window types
    ignore = [
        "= _NET_WM_WINDOW_TYPE_DOCK",
        "= _NET_WM_WINDOW_TYPE_DESKTOP",
    ]
    
    
    # just a helper
    def get(cmd):
    
        try:
            return subprocess.check_output(cmd).decode("utf-8").strip()
        except (subprocess.CalledProcessError, TypeError):
            pass
    
    
    # initiate windowlist
    wins1 = []
    
    
    while True:
        # cycle time
        time.sleep(2)
        # initiate new list
        new_wins = []
        # get the most recent window list
        windata = get(["wmctrl", "-l"])
        if windata:
            # extract window -ids
            wins2 = [w.split()[0] for w in windata.splitlines()]
            new = [w for w in wins2 if w not in wins1]
            # check for excluded classes and window types
            for w in new:
                testdata = get(["xprop", "-id", w])
                if all([
                    not any([ig in testdata for ig in ignore]),
                    not any([app in testdata for app in apps]),
                    ]):
                    # set the passed windows to sticky
                    subprocess.Popen(
                        ["wmctrl", "-i", "-r", w, "-b", "add,sticky"]
                        )
            # refresh the window list for next cycle
            wins1 = wins2
    

    如何设置

    1. 确保wmctrl已安装:

      sudo apt install wmctrl
      
    2. 将脚本复制到一个空文件中,另存为set_sticky.py
    3. 在脚本的头部分,将WM_CLASS-ses 设置为排除(您可能想要删除猴子,它是出于测试目的:))
    4. 测试 - 使用以下命令运行它:

      python3 /path/to/set_sticky.py
      
    5. 如果一切正常,您可以将其添加到启动应用程序,但请确保添加一个小中断以防止脚本在尚未准备好的桌面上中断:

      /bin/bash -c "sleep 10 && python3 /path/to/set_sticky.py"
      

    玩得开心 :)

    笔记

    我在 Ubuntu Budgie (mutter) 上测试了 25 分钟,没有出现任何问题。它应该在任何窗口管理器上运行良好,但如果您遇到问题,只需提及。

    • 3

相关问题

  • 如何在 Nautilus 中管理保存的完整网页及其目录(例如 n.html 和 n_files)

  • 如何每 5 秒运行一次脚本?

  • 如何将必须从其自己的目录中运行的程序添加到面板或主菜单?

  • 如何编写 shell 脚本来安装应用程序列表?

  • Mac OS X Automator 的替代品?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve