Bash wmctrl xdotools - selbstgeschriebener Programm Starter

PvcZ

Cadet 4th Year
Registriert
März 2020
Beiträge
88
Hallo ich bin gerade dabei mir ein Skript zu erstellen mit dem ich folgendes realisieren möchte:

Taste "X" steuert folgenden Prozess:
Wenn das zu startente Programm nicht bereits läuft - starte es
Wenn das Programm bereits läuft aber nicht fokusiert ist - fokusiere es
Wenn das Programm fokusiert ist (und läuft) - minimiere es.

Ich habe das ganze schon beinahe beisammen:

Bash:
!/bin/bash
#Get focused window
focused_wid=$(xdotool getactivewindow)
# Get list of windows with the name which we want to launch or minimize
xdotool search --name "$1" > /tmp/widids

# Check if the window is in the list (returns nothing if it's not)
focused_wid=$(awk -v var="$focused_wid" '$0 ~ var' /tmp/widids)

# Check if awk returned something
case "$focused_wid" in
    # If it didn't launch the program
    "") wmctrl -xa "$1" || "$2" & disown ;;
    # If did minimize the window
    *) xdotool windowminimize "$focused_wid" ;;
esac

Das ganze funktioniert solange das Programm seinen Namen im "Window Name" hat z.B: Ein Firefox Prozess hat immer den Namen Firefox enthalten aber z.B. der File Manager Nemo hat im Prozess nicht "Nemo" stehen - das heißt im Umkehrschluss für mich, dass Ich Nemo mit meinem obigen Skript nicht minimieren kann...

Ein Ansatz war bis jetzt, dass ich nicht über den Namen gehe sondern über die PID. Problem hierbei ist, dass xdotools mit ganzen Zahlen arbeitet und wmctrl mit Hexadezimal.

Bash:
/bin/bash
# Get focused window PID
focused_wid=$(xprop -root | awk '/_NET_ACTIVE_WINDOW(WINDOW)/{print $NF}')
# LIST all windows PIDs
wmctrl -l | awk '{print $1}' > /tmp/widids


# AB hier ist der Code falsch bzw. nicht kombatibel. Ich verstehe die awk Zeile auch nicht ganz...
# Check if the window is in the list (returns nothing if it's not)
focused_wid=$(awk -v var="$focused_wid" '$0 ~ var' /tmp/widids)
# Check if awk returned something
case "$focused_wid" in
    # If it didn't launch the program
    "") wmctrl -xa "$1" || "$1" & disown ;;
    # If did minimize the window; Hier entsteht ein Problem weil xdotool die Hexadezimal nicht lesen kann
    *) xdotool windowminimize "$focused_wid" ;;
esac


Würde mich sehr freuen wenn mir jemand hier weiterhelfen könnte :)

LG
 
  • Gefällt mir
Reaktionen: xCtrl
Spannendes Thema wo ich mich mit einklinke.

Habe die ersten Versuche mit wmctrl gestartet. Quasi eine dauerschleife als Script was mir im Autostart liegt und die Programme auf die passenden workspaces schiebt beim Start (Ablauf jede Sekunde).

Ich hänge auch noch bei dem Problem mit den Window Titel bzw. dass ich nur ein Fenster verschieben kann. Wird eine neue Instanz gestartet, greift das Script nicht. Bin gespannt was hier raus komme :)
 
Funktioniert wmctrl -lp bei dir? Habe es gerade mit Kwin getestet – damit geht es. Mit dem Befehl bekommst du zusätzlich zur WindowID auch die ProcessID angezeigt. Mithilfe der PID bekommst du dann den Pfad des Programms (/proc/$PID/exe). Du solltest dann eine Tabelle bauen können mit den Spalten |WID|PID|Pfad|. Ist der Pfad deines zu kontrollierenden Programms in der Tabelle enthalten läuft es und du kannst es mithilfe der WindowID steuern, wenn nicht kannst du es starten.
 
Hallo an Alle.

Mein Skript ist zu finden von Hayda verlinkten Beitrags von Ubuntuuseres.

Das Skript ist aber nicht mehr notwendig, weil es schon etwas fertig gibt und zwar:

https://github.com/mkropat/jumpapp

mit der Option:
Code:
-m -- if a single window is already open and in focus - minimize it
 
Zurück
Oben