Diese Anpassung hatte ich in einer vorherigen Version des Scripts auch verwendet. Allerdings erschien mir das überflüssig, weil die Konfigurationsdatei zum größten Teil von Hand gefüllt werden muss. Aber ausgehend von deinem Beitrag habe ich mir nochmal Gedanken gemacht, wie man die Konfiguration automatisieren könnte. Dabei bin ich auf einige mögliche Lösungsansätze gestoßen und auf diverse Probleme...
LÖSUNGSANSÄTZE: (ich halte mich beim Beispielcode vorwiegen an Xfce, weil meine Desktopumgebung)
"Fenstermanager für Setup festlegen"
Option A: Man übergibt den Fenstermanager beim Aufruf des Setups an $2
.
| win-fu -s xfwm4
--
if [ "$2" = "xfwm4"]; then
# do things according to this WM
else
echo "Option unknown or no window manager specified."
echo "Please setup configuration file manually."
fi
|
Option B: Man lässt diese Information mit wmctrl ausgeben (ist noch unklar wie verlässich das für die verschiedenen WMs funktioniert).
| wm_active=$(wmctrl -m | awk '/Class:/ {print $2}')
if [ "$wm_active" = "xfwm4" ]; then
# do things according to this WM
else
# see above
fi
|
"Verwendetes Theme für Setup festlegen"
Das sollte mit Metacity unter Gnome kein Problem mit gconftool sein, für Xfwm4 unter Xfce gibt es dafür xfconf-query. Letzten Endes dienen beide Tools für das Auslesen/Ändern von XML-Dateien. Voraussichtlich werden auch alle anderen WMs diese Information in irgendeiner Konfigurationsdatei ablegen, die man auslesen kann. Anschließend muss man nur noch klären, ob es sich um ein lokal im Homeverzeichnis oder systemweit installiertes Theme handelt, damit das Script weiß in welchem Pfad nach den entsprechenden Dateien zu suchen ist.
1
2
3
4
5
6
7
8
9
10
11
12 | wm_active=$(wmctrl -m | awk '/Class:/ {print $2}')
theme_active=$(xfconf-query -c xfwm4 -p /general/theme)
if [ "$wm_active" = "xfwm4" ]; then
if [ -d $HOME/.themes/$theme_active/$wm_active ]; then
# query file(s) in local path
else
# query file(s) in global path
fi
else
# see above
fi
|
"Größe der Fensterrahmen für Setup festlegen"
Metacity Themes werden alle in einer XML-Datei definiert. Dürften sich also recht einfach auslesen lassen. Xfwm4, OpenBox usw. verwenden allerdings keine Konfigurationsdatei für die Definition der Fensterrahmen, sondern XPM-Bilddateien. Um die Bildgröße solcher Dateien zu ermitteln, fallen mir spontan drei Werkzeuge ein - 1. identify
(ImageMagick, wäre aber eine weitere Abhängigkeit), 2. file
(leider keine Größenangaben für XPMs), 3. head
(Bildgröße in Zeile 3 - Bingo!).
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | wm_active=$(wmctrl -m | awk '/Class:/ {print $2}')
theme_active=$(xfconf-query -c xfwm4 -p /general/theme)
local_path="$HOME/.themes/$theme_active/$wm_active"
global_path="/usr/share/themes/$theme_active/$wm_active"
if [ "$wm_active" = "xfwm4" ]; then
if [ -d $local_path ]; then
title_bar=$(head -3 $local_path/title-1-active.xpm | awk '/\"/ {print $2}') # title bar height
else
title_bar=$(head -3 $global_path/title-1-active.xpm | awk '/\"/ {print $2}') # title bar height
fi
else
# see above
fi
|
"Panels oben, unten, links, rechts ?!"
Wie Linux Und Ich in seinem Beitrag schon festgestellt hat, sollte das mit gconftool unter Gnome recht einfach zu machen sein die Größe der jeweiligen Panels für jede Position auf dem Bildschirm auszulesen.
LXDEs Lxpanel speichert die Informationen in jeweils einer einfachen Textdatei pro Panel ohne Große Syntax. Allerdings stellt sich das Panel noch nicht besonders clever an, was die Bezeichnung seiner Konfigurationsdateien betrifft. So wird für das erste Panel als "panel" gespeichert, aber beim zweiten wird als Dateiname dann das genommen, was im Einstellungsdialog unter "Position: Edge" steht - unabhängig davon wo das Panel sich letzen Endes auf dem Bildschirm befinden wird. Müssen also alle Dateien im Verzeichnis nach dem Suchmuster durchforstet werden.
Und beim Xfce-Panel wird es dann richtig unterhaltsam. Die Konfiguration aller Panels wird in einer einzelnen XML-Datei abgelegt und die Position des Panels dort lediglich durch einen Zahlenwert für screen-position bezeichnet - untere Bildschirmkante mitte wäre demnach dann <property name="screen-position" value="11"/>. Sortiert sind diese Werte nach Bildschirmkante oben, links, rechts, unten und Ausrichtung link, mitte, rechts bzw. oben, mitte, unten - also oben 1-3, links 4-6, rechts 7-9 und unten 10-12. Bei mir ist das noch ein hässliches Entlein.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | # Get all sticky windows, non-panel windows will be ignored later
panels_active=( $(wmctrl -l | awk '/-1/ {print $4}') )
# Paths of panel configurations
lxpanel_path="$HOME/.config/lxpanel/default/panels/"
xfce4-panel_path="$HOME/.config/xfce4/panel/"
for panel in ${panels_active[@]}; do
if [ "$panel" == "lxpanel" ], then
bottom_panel=$(awk -F \= '/edge=bottom/,/height/ {print $2}' $(find $lxpanel_path -type f -iname '*') | tail -1)
top_panel=$(awk -F \= '/edge=top/,/height/ {print $2}' $(find $lxpanel_path -type f -iname '*') | tail -1)
left_panel=$(awk -F \= '/edge=left/,/height/ {print $2}' $(find $lxpanel_path -type f -iname '*') | tail -1)
right_panel=$(awk -F \= '/edge=right/,/height/ {print $2}' $(find $lxpanel_path -type f -iname '*') | tail -1)
elif [ "$panel" == "xfce4-panel" ]; then
# tail -1 is used here because it's possible to have up to three panels on one screen edge and only one value is required
bottom_panel=$(grep -B 2 -e '<property name="screen-position" value="10"/>' -e '<property name="screen-position" value="11"/>' -e '<property name="screen-position" value="12"/>' $xfce4-panel_path/panels.xml | awk -F \" '/size/,/value/ {print $4}') | tail -1
top_panel=$(grep -B 2 -e '<property name="screen-position" value="1"/>' -e '<property name="screen-position" value="2"/>' -e '<property name="screen-position" value="3"/>' $xfce4-panel_path/panels.xml | awk -F \" '/size/,/value/ {print $4}') | tail -1
left_panel=$(grep -B 2 -e '<property name="screen-position" value="4"/>' -e '<property name="screen-position" value="5"/>' -e '<property name="screen-position" value="6"/>' $xfce4-panel_path/panels.xml | awk -F \" '/size/,/value/ {print $4}') | tail -1
right_panel=$(grep -B 2 -e '<property name="screen-position" value="7"/>' -e '<property name="screen-position" value="8"/>' -e '<property name="screen-position" value="9"/>' $xfce4-panel_path/panels.xml | awk -F \" '/size/,/value/ {print $4}') | tail -1
fi
done
|
Update: Die Ausrichtung von Lxpanel funktioniert genauso wie für das Xfce-Panel. Also müsste man auch dafür sichergehen, dass man für die jeweilige Bildschirmkante jeweils das höchste bzw. breiteste der drei möglichen Panels in die Konfiguration schreiben lässt. Außerdem basiert das Lxpanel von LXDE auf dem fbpanel und verwendet das gleiche System für die Konfiguration. Die Variante ist also auch gültig für das fbpanel.
"Seitenränder der Fenster"
Da der Wert für die Variable $window_margin
im Script nicht automatisch generiert werden kann, endet es dafür wahrscheinlich in einem weiteren Parameter.
"Nicht unterstütze/erkannte Fenstermanager und Panels"
Dabei kann man wieder auf die manuelle Konfiguration zurückgreifen.
"Fazit"
Nachdem ich jetzt Stunden, die ich besser hätte schlafen sollen, damit verbracht habe die tatsächlichen Möglichkeiten auszuloten, komme ich zu dem Schluss, dass eine nahezu vollkommen automatisierte Erstellung der Konfigurationsdatei im Bereich des Möglichen liegt. Ich muss dann jetzt "nur noch" jede Menge Grundlagenforschung zum Thema "Konfigurationsdateien von Window Managern und Panels, Bars und Docks" betreiben. 👍