Ubuntu – How to quickly minimize all windows for a single application

gnome-shellshortcut-keysshortcutswindow-manager

I know how to minimize/hide all windows in Cosmic Cuttlefish/GNOME Shell using SUPER+D, but I would like to be able to quickly minimize only all windows for a single application (say the one that currently has cursor focus). For example, I would like to minimize all LibreOffice documents, or all Terminal windows.

I am not quite seeing or recognizing a way to do this in Settings > Devices > Keyboard. Is this possible?

Best Answer

OK, just a quick one for fun :)

Minimize windows of currently active application

You could use a stripped-down/edited version of this script, which comes with a default Ubuntu Budgie install. While the original script toggles the desktop, the edited one below minimizes all windows, on current workspace, of the currently active WM_CLASS.

The script, how to use

  • Make sure you have both xdotool and wmctrl installed:

    sudo apt install wmctrl xdotool
    
  • Copy the script below into an empty file, save it as minimize_current.py
  • Create a keyboard shortcut to run the script and you're done :). Use the command:

    python3 /path/to/minimize_current.py
    

The script

#!/usr/bin/env python3
import subprocess

ignore = [
    "= _NET_WM_WINDOW_TYPE_DOCK",
    "= _NET_WM_WINDOW_TYPE_DESKTOP",
]


def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()


def get_currws():
    return [l.split()[0] for l in get(
        ["wmctrl", "-d"]).splitlines() if "*" in l][0]


def get_valid(w_id):
    # see if the window is a valid one (type)
    w_data = get(["xprop", "-id", w_id])
    if w_data:
        return True if not any([t in w_data for t in ignore]) else False
    else:
        return False

def get_wmclass(w_id):
    return get(["xprop", "-id", w_id, "WM_CLASS"])


def get_state(w_id):
    return "window state: Iconic" in get(["xprop", "-id", w_id, "WM_STATE"])


currws = get_currws()
allwinsdata = [w.split() for w in get(["wmctrl", "-l"]).splitlines()]
winsoncurr = [w[0] for w in allwinsdata if w[1] == currws]

active_w = get(["xdotool", "getactivewindow"])
activeclass = get_wmclass(active_w)   
relevant = [w for w in winsoncurr if get_valid(w)]


# windows on current workspace, normal state
tominimize = [
    w for w in relevant if all(
        [not get_state(w), get_wmclass(w) == activeclass]
    )
]

for w in tominimize:
    subprocess.Popen(["xdotool", "windowminimize", w])

Note

Note that xdotool nor wmctrl, as used in this script, will work on Wayland.

Related Question