GUI-Design des PVS-Clients¶
Aufgaben:¶
- Darstellung von VNC-Datenströmen
- Schaffen eines User-Interfaces: Für Service-Discovery/Service-Zuordnung, Festlegen von Benutzerkonfigurationen, VNC-Zugriff erlaubt(RW) / teilerlaubt(nur an Dozent/RO) / nicht, Chat erlaubt/nicht
- Message/Chat-Interface
- Nutzung der VNC-Erweiterungen für Datentransfer (Bereitstellen von Dateien, die Nutzer auf ihre Maschine laden können), Chat, ...
- Flexiblere Auswahl des VNC-Servers (gibts inzwischen diverse Implementierungen, die alternativ gestartet werden könnten)
Framework und eingesetzte Tools:¶
Qt4:¶
Die komplette Benutzerschnittstelle des Clients soll mit Hilfe des von Nokia (früher Trolltech) entwickelten Frameworks Qt in der Version 4 erfolgen. Der Grund hierfür sind folgende Vorteile:- Qt wird bereits in einer Vielzahl von großen Projekten eingesetzt (KDE, Opera, Skype, Google Earth,...) und ist somit solide und erprobt.
- Das komplette Framework besteht nicht nur aus einer GUI-Bibliothek sondern beinhaltet noch viele weitere nützliche Funktionen (SQL, OpenGL, Network, D-Bus,...).
- Plattformunabhängig: Projekte können für Linux, OSX und Windows erstellt werden
- Moderne Konzepte und Werkzeuge werden bereitgestellt. So wird das Signal-Slot-Konzept durchgängig eingehalten und mit dem GUI-Builder (designer) können einfach und professionell grafische Interfaces erstellt werden.
- Duales Lizenz Modell: Qt gibt es sowohl unter einer proprietären Lizenz als auch unter der (L)GPL.
CMake:¶
Leider unterstützt das bisherigen Build System (Autotools) Qt nicht oder nur teilweise. Dies liegt daran dass Qt zur Erzeugung von Makefiles ein eigenes Tool mitbringt (qmake). Als alternative bietet sich das neue cmake an. Dies ist nicht nur flexibler als Autotools (Plattformunabhängig) sondern auch einfacher in der Einrichtung und Wartung (wird übrigens vom KDE Projekt seit der Version 4 eingesetzt). Des Weiteren ist es mit cmake möglich Qt-Anwendungen zu erstellen, wobei die komplette Qt-Toolchain (moc, uic, rcc, qdbuscpp2xml, qdbusxml2cpp, lupdate, lrelease,...) komfortabel benutzt werden kann.
Die vollständige Portierung wurde bereits durchgeführt und die hierfür notwendige Konfigurationsdatei (CMakeLists.txt) erstellt.
Userinterface:¶
Eine der Anforderungen an die Software ist, dass sie den Benutzer nicht an der Arbeit hindert und im Hintergrund laufen soll. Dies wurde mit Hilfe einer Applikation realisiert die selbst kein Hauptfenster hat und sich in den Systemabschnitt der Taskleiste (Systray) eingliedert. Auf die komplette Funktionalität kann mit Hilfe eines Kontextmenüs zugegriffen werden das sich durch einen klick auf das entsprechende Icon in der Systray entfaltet. Aus diesem Menü können diverse Dialoge aufgerufen werden (z.B. Konfiguration, Chat, ...). Um den Benutzer über neue Ereignisse zu informieren kommen die bekannten Sprechblasen aus der Systray zum Einsatz. Ebenfalls möglich ist es, diverse Ereignisse über das Systray-Icon zu visualisieren (zB. rote und blinkende Kamera falls der Dozent mit schaut). An den User gerichtete Abfragen sollen über Dialog erfolgen, die mit ja/nein beantwortet werden können. Eine weitere Anforderung ist der immer benötigte Zugriff auf die Benutzerschnittstelle damit der Benutzer zu jeder Zeit Einstellungen vornehmen kann. So werden in den Lehrveranstaltungen auch diverse Systeme in virtuellen Maschinen (VMware) im Vollbild benutzt. Hierbei besteht das Problem, dass ein Zugriff auf die Systray des Hostsystems nicht mehr möglich ist (oder es könnte auch sein dass der Windowmanager des Hosts gar keine Systray hat). Deshalb wurde zusätzlich eine kleine Toolbar entwickelt die bei einem Klick das gleiche Menü wie das Systray-Icon zur Verfügung stellt. Diese Toolbar umgeht den aktuellen Windowmanager und bekommt das Attribut „*always-on-top*“. Somit ist das Interface immer sichtbar, selbst wenn der Benutzer ein Video oder eine VM im Vollbildmodus vor sich hat (getestet mit VirtualBox und VMWare). Des Weiteren kann die Toolbar entweder am oberen oder unterem Bildschirmrand an einer variablen waagerechten Position angeordnet werden. Dies ist deshalb wichtig, da diverse Windowmanager ihre eigenen Toolbars an unterschiedlichen Orten platzieren. Um der ersten Anforderung gerecht zu werden, verschwindet diese Toolbar bei nicht Gebrauch automatisch in den Hintergrund und erscheint bei einem Mouseover wieder.
Architektur:¶
Der PVSClient ist in ein Backend (pvs) und ein Frontend (pvsgui) aufgeteilt. Ersterer läuft als Daemon im Hintergrund und kommuniziert über ein gegebenes Netzwerk mit der Steuerkonsole (pvsmgr). Die Interprozesskommunikation (inter-process communication, IPC) zwischen Backend und Frontend erfolgt über D-Bus mit Hilfe der von Qt4 bereitgestellten Bibliothek QtDBus. Um das Backend von einer GUI komplett unabhängig zu halten wurde darauf geachtet dass alle Nachrichten die an die GUI gerichtet sind vom Backend als Signale über D-Bus verteilt werden. Umgekehrt, wenn das Frontend eine Nachricht an das Backend schicken will, muss es sich der im Backend implementierten Slots bedienen. Somit ist es sogar möglich, dass mehrere GUIs gleichzeitig ein und das selbe Backend benutzen. Ein weiteres Feature ist, dass das Frontend beim Start das Backend durch einen D-Bus Aufruf automatisch startet (hierzu muss allerdings die Applikation zuvor mit „make install“ auf dem System installiert worden sein).
Kommunikationswege des gesamten Projekts.
Internationalisierung:¶
Zur Internationalisierung der Anwendung wird das von Qt4 bereitgestellte System benutzt. Sämtliche hierzu notwendigen Schritte werden automatisiert mit Hilfe von cmake durchgeführt. Einzig das Übersetzen selbst muss von Hand erledigt werden, wobei hierzu ein komfortables Werkzeug existiert (linguist).
Ressourcen:¶
Damit der Installationsaufwand und die Pflege der Software minimal gehalten werden kann, wird das Qt Resource Management eingesetzt. So werden sämtliche Grafiken, Icons und Übersetzungsdateien beim kompilieren in der eigentlichen Binary untergebracht.
Benötigte Pakete und Bibliotheken:¶
Bei der Entwicklung des Clients werden folgende Tools und Bibliotheken eingesetzt:- libvncserver0: Verbindung zu einem VNC-Server und bereitstellen des Datenstroms (Laufzeit)
- libvncserver-dev: Verbindung zu einem VNC-Server und bereitstellen des Datenstroms (Entwicklung)
- libqt4-dev: Qt4 Bibliotheken zum Zeichnen der GUI und D-Bus Anbindung
- qt4-dev-tools: Qt4 Werkzeuge zum Internationalisierung der Benutzerschnittstelle
- cmake: Eingesetztes Buildsystem (Suche nach erforderlichen Paketen und Erstellen des Makefiles)
Lösung der einzelnen Teilaufgaben:¶
Darstellung von VNC-Datenströmen (Projection-Feature):¶
Die übertragenen Bildinformationen können in einem separaten Fenster oder im Vollbildmodus dargestellt werden. Hierzu wählt der Dozent über die Steuerkonsole (pvsmgr) eine Quelle und ein oder mehrere Ziel zur Projektion aus, was zur Folge hat dass an alle gewählten Clients (pvs) eine Nachricht mit den benötigten Informationen geschickt wird. Als nächstes sendet das Backend ein Signal über D-Bus an ein Frontend das die benötigten Informationen (Host, Port, Passwort) enthält. Somit kann nun die GUI eine Verbindung zum gegebenen VNC-Server aufbauen und den Datenstrom darstellen. Weitere Parameter sind möglich. So kann die Bildqualität des Datenstroms eingestellt werden (niedriger spart Bandbreite) oder ob ein Filter beim Skalieren des Bildes im Vollbildmodus benutzt werden soll (hoche Last!).
Konfiguration über GUI:¶
Zur Konfiguration des Clients soll ein eigener Dialog bereitgestellt werden, indem sämtliche Parameter verändert werden können. Erreichen kann man dieses Dialog über das Kontextmenü. Häufig gebrauchte Einstellungen (z.B. das setzen von Rechten) können auch direkt in das Kontextmenü integriert werden (z.B. kleine Checkboxes für an/aus). Damit das Backend (pvs) weiterhin unabhängig bleibt, sollten Einstellungen die für dessen betrieb nötig sind auch nur vom Backend gelesen und geschrieben werden. Da die Konfiguration aber in der GUI durchgeführt wird kommt auch hier D-Bus ins Spiel. So muss das Backend Funktionen zum Lesen und Speichern der Konfiguration über D-Bus zugänglich machen. Einstellungen die nur von der GUI benutzt werden (zB. Fensterpositionen usw.) werden wiederum von der GUI mit Hilfe der von Qt bereitgestellten APi (QSettings) selbst gespeichert. Diese werden in $HOME/.config/uni-freiburg/pvs.conf gespeichert werden (Linux/Unix).
Chat und Datentransfer:¶
Das Chatten mit den Kursteilnehmern und die Dateiübertragung sollen ebenfalls in separaten Dialogen erfolgen. Hier kann der Benutzer über die „Sprechblasen“ informiert werden sobald eine Nachricht oder Datei verfügbar sind (ähnlich zu diversen Instant Messengern).
Die Funktionalität des Chat-Systems wird komplett im Backend implementiert, wobei das Frontend nur als Schnittstelle zur Nachrichten Ein- und Ausgabe dient.
Das Chatinterface ist in einem Tabwidget eingebettet damit eine komfortable Kommunikation mit allen oder nur zwischen zwei Teilnehmern erfolgen kann (als Vorlage dient hier der Linux IRC-Client Konversation). Zum Starten einer Privaten Unterhaltung (nur zwei Teilnehmer) genügt ein Doppelklick auf einen Nicknamen aus einer Liste. Dies fügt dem Tabwidget einen neuen Reiter hinzu indem nun ein privater Nachrichtenaustausch möglich ist.
Damit eine Liste aller Chatteilnehmer geführt werden kann, muss das Chat-System auch Kontrollnachrichten übertragen mit denen es möglich ist Beitritte neuer Teilnehmer bekannt zu machen.
Kommunikation zwischen Front- und Backend über D-Bus