Was haben Pinephone Apps und Android Apps nicht gemeinsam? Genau, jede Pinephone aka Linuxapp macht ihr eigenes Fenster in ihrer LieblingsgröĂe auf. Das Ă€ndern wir heute.
Pinephone: wie man ohne Phosh ein Handyfeeling simuliert
Um das machen zu können, brauchen wir ein dauerhaft laufendes Programm. Idealerweise wĂŒrde so etwas der Windowmanager ĂŒbernehmen, der lĂ€uft eh, aber da es Gnome ist, naja, nicht so schnell umsetzbar. Also machen wir das mit einem Script: windowmaximixerwatch
#!/bin/bash
rm -f /tmp/liste
i="0"
while [ $i -lt 1 ];
do
windowmaximizer > /dev/null
sleep 1
RC=$(ps auxf| grep -c gnome-shell)
if [ $RC -eq 0 ]; then
i=1
fi
done
Diese Datei wird nach /home/pine/.local/bin/windowmaximizerwatch geschrieben
„Das macht ja gar nicht so viel“ Stimmt, aber das ist ja auch nur ein Teil davon. Wie man leicht erkennen kann, ist das eine Programmschleife, die nur dann abbricht, wenn kein Gnome-Shell-Prozess (mehr) vorhanden ist.
Das Programm „windowmaximizer“ ist auch nur wieder ein Shellscript, das die ganze Arbeit macht:
#!/bin/bash
#1
ISONBOARDOPEN=$(wmctrl -l | grep -c Onboard)
#2
RESOLUTION=$(xdpyinfo | grep dimens | awk '{print $2;}')
X=$( echo $RESOLUTION | awk -F "x" '{print $1;}')
Y=$( echo $RESOLUTION | awk -F "x" '{print $2;}')
#3
ORIENTATION="landscape"
if [ $Y -gt $X ]; then
ORIENTATION="portray";
fi
#4
LASTORIENTATION=$(cat /tmp/display.orientation.last);
if [ "$LASTORIENTATION" != "$ORIENTATION" ]; then
# REMOVE OLD IDs as all needs to get maxed newly, because we had a layout orientation switch
rm -f /tmp/liste
fi
echo "$ORIENTATION" > /tmp/display.orientation.last;
#5 create new /tmp/liste if missing:
touch /tmp/liste
# place Onboard window at the correct position and define variables for wmctrl cmds:
if [ "$ORIENTATION" == "portray" ]; then
wmctrl -l | grep Onboard | awk '{print "echo "$1";wmctrl -i -r "$1" -e 2,0,1170,720,270";}' | bash
TOP=41
WIDTH=720
if [ $ISONBOARDOPEN -eq 0 ]; then
HEIGHT=1440
else
HEIGHT=1130
fi
else
wmctrl -l | grep Onboard | awk '{print "echo "$1";wmctrl -i -r "$1" -e 2,0,450,1440,270";}' | bash
TOP=41
WIDTH=1440
if [ $ISONBOARDOPEN -eq 0 ]; then
HEIGHT=720
else
HEIGHT=410
fi
fi
#6 now ALL windows WITHOUT Onboard, that are still unprocessed ( not in our brain file ), get processed. This is needed as resizing causes a lot of pain to the eye, as it flickers, even if it's not needed.
LISTE=$(wmctrl -l | grep -v Onboard | awk '{print $1;}')
for id in $LISTE
do
echo "processing $id";
RC=$(grep -c $id /tmp/liste)
if [ $RC -eq 0 ]; then
echo "resizing $id"
wmctrl -i -r "$id" -e 5,0,$TOP,$WIDTH,$HEIGHT
wmctrl -i -r "$id" -b toggle,maximized_vert,maximized_horz
wmctrl -i -r "$id" -e 5,0,$TOP,$WIDTH,$HEIGHT
# wmctrl -i -r "$id" -b remove,fullscreen
echo $id >> /tmp/liste
fi
done
#7
# Now we check, if all ids in your brain file are still open windows. Thats needed, because same windows, get the same id, when they are closed and repopend.
# if they are closed we need to remove the id, because we need to reposition them again on next open.
LISTE=$(cat /tmp/liste)
for id in $LISTE
do
RC=$(wmctrl -l |grep -c $id)
if [ $RC -eq 0 ]; then
# Entferne Windows die weg sind!
echo "remove id $id";
grep -v $id /tmp/liste > /tmp/liste2;
rm -f /tmp/liste;
mv /tmp/liste2 /tmp/liste;
fi
done
Diese Datei wird nach /home/pine/.local/bin/windowmaximizer geschrieben.
- wir stellen erstmal fest, ob das Onboard OSK lĂ€uft. Das ist wichtig fĂŒr die Berechnung der FenstergröĂe, auf die die Apps gezogen werden mĂŒssen.
- xdpyinfo teilt uns die Bildschirmauflösung und jede Menge anderen Kram mit.
- Anhand der ermittelten X/Y Koordinaten legen wir fest, ob wir im Landscapemode ( 1440×720 ) oder Portraymode ( 720×1440 ) arbeiten.
- Wenn sich die Orientierung innerhalb des letzten Aufrufes geÀndert hat, löschen wir die gesicherten FensterIDs, so daà alle Fenster auf die neuen Gegebenheiten umgeÀndert werden.
- nun repositionieren wir das Onboard OSK passend zur Orientierung an die richtige Stelle und berechnen gleich noch die Variablen fĂŒr die Fensterhöhe und -breite.
- nun werden alle Fenster, deren FensterIDs wir noch nicht bearbeitet hatten, was in einer Datei gespeichert wird, auf Position gebracht. Das sind die, die in der letzten Sekunde noch nicht da waren.
- NatĂŒrlich muĂ man auch mal aufrĂ€umen, was in diesem Fall meint, daĂ alle FensterIDs aus der Speicherung entfernt werden, die nicht mehr prĂ€sent sind. Normalerweise wĂŒrde man ja annehmen, daĂ FensterIDs fortlaufend sind, aber nicht bei uns, da werden die FensterIDs wiederverwendet. Tja.
Das funktioniert ganz gut, von Gnome selbst mal abgesehen. Alles was wir jetzt noch machen mĂŒssen, ist dem ganzen ein Desktopfile zu erstellen, damit es in der AppĂŒbersicht auftaucht:
[Desktop Entry]
Version=1.0
Name=WindowMaximizer
Name[de_DE]=WindowMaximizer
Exec=windowmaximizerwatch
#Terminal=false
Type=Application
StartupNotify=true
#Icon=cs-login
Icon=/usr/share/icons/Mint-X/apps/96/cs-login.svg
MimeType=x-content/unix-software
Categories=Network;
Keywords=web;internet;
X-Desktop-File-Install-Version=0.23
Diese Datei wird nach /usr/share/applications/windowmaximizer.desktop geschrieben.
Wenn alle Shellscripte mit chmod 755 versehen wurden, kann es losgehen. Ich rate dazu ein anderes Icon zu benutzen, da mĂŒĂt Ihr allerdings selbst sehen, welches Ihr nehmen wollt.
Mit dem Gnome-Tweak-Tools ( Optimierungen ) kann man das Script als App im StartmenĂŒ platzieren und so sollte es beim nĂ€chsten Start des Desktops automatisch mitstarten. Wenn es das nicht tut, einfach von Hand selbst starten.
Ab nun werden alle-gnome Fenster maximiert und selbst bei Gnome-Fenstern klappt das gelegentlich ( die haben so eine Art Tagesform ). Wer das ganze verbessern will, kann noch eine APP Datenbank aufbauen, aus der z.b. festgelegt wird, ob eine Anwendung in Fullscreen gehen soll, oder nicht. Ist nur so ein Gedanke.. an einen weiteren Bugreport bei Gnome đ NatĂŒrlich habe ich das schon ausprobiert đ
In 3 Tagen sehen wir uns wieder. Achtet auf die tĂ€glichen kleinen Pine Updates, die kommen alle auĂer der Reihe rein. Ăfters Reinschauen oder gleich den RSS-Feed abonnieren.
Pinephone: Judgement Day!