ΕΠΙΚΟΙΝΩΝΙΑ ΑΝΘΡΩΠΟΥ-ΜΗΧΑΝΗΣ Παρουσίαση της LessTif Μαραγκός ΘοδωρήςΑ.Μ. 557 Καρκάνης ΗλίαςΑ.Μ. 539
Εισαγωγή Η LessTif είναι ένα σύνολο εργαλείων ( toolkit ) για την ανάπτυξη εφαρμογών σε περιβάλλον X Windows, το οποίο εφαρμόζεται στα περισσότερα λειτουργικά συστήματα ( Windows, Unix, Macintosh κ.α. ) Είναι η open source εκδοχή της OSF / Motif. Έχει σχεδιαστεί έτσι, ώστε ο ίδιος πηγαίος κώδικας να είναι συμβατός με τα δύο σύνολα εργαλείων και να επιτελεί τις ίδιες ακριβώς λειτουργίες σε αυτά. Η ανάπτυξή της είναι εξ’ ολοκλήρου αποτέλεσμα εθελοντικής εργασίας. Χρησιμοποιείται για Graphical User Interface ( GUI ) εφαρμογές, παρέχοντας μια πολύ ευέλικτη βάση για αυτές.
Η LessTif επικεντρώνεται κυρίως στο σχεδιασμό των αντικειμένων που συνθέτουν το interface του χρήστη ( menus, buttons, dialog boxes, text entry, display areas ). Υπάρχουν κάποιοι γενικοί κανόνες, αλλά κυρίως η εγκυρότητα ενός interface εξαρτάται από τη συνεπή συμπεριφορά των αντικειμένων που το αποτελούν, παρά από την ακριβή διάταξή τους. Το αντικείμενο της LessTif αποτελείται από δύο βασικά μέρη: a)Το μοντέλο εξόδου, το οποίο περιγράφει τον τρόπο με τον οποίο τα αντικείμενα εμφανίζονται στην οθόνη (π.χ σχήμα κουμπιών, θέση παραθύρων). b)Το μοντέλο εισόδου, το οποίο καθορίζει πώς ο χρήστης αλληλεπιδρά με τα στοιχεία της οθόνης.
Βασικά στοιχεία της LessTif H Lesstif χρησιμοποιεί όπως αναφέρθηκε το Χ Window System ως περιβάλλον και το X Toolkit Intrinsics ως πλατφόρμα για τη διεπιφάνεια εφαρμογής του προγραμματιστή ( API ). Η Xt παρέχει ένα αντικειμενοστρεφές πλαίσιο εργασίας για τη δημιουργία επαναχρησιμοποιήσιμων και διαμορφώσιμων στοιχείων της διεπαφής, τα οποία ονομάζονται widgets. Ένα widget λειτουργεί ανεξάρτητα από την εφαρμογή, εκτός από προκαθορισμένες αλληλεπιδράσεις. Για παράδειγμα, ένα button widget «γνωρίζει» πώς να σχεδιάσει τον εαυτό του, καθώς και τον τρόπο με τον οποίο θα φωτίσει τον εαυτό του και θα αποκριθεί όταν ο χρήστης κάνει κλικ με το mouse σε αυτό. Η γενική συμπεριφορά ενός widget είναι μέρος των βιβλιοθηκών της Lesstif.
Υπάρχουν widgets για στοιχεία διεπαφής με το χρήστη, όπως menus, buttons, dialog boxes, text entry, display areas. Επιπρόσθετα, υπάρχουν widgets των οποίων η μοναδική λειτουργία είναι να ελέγχουν τη διάταξη άλλων widgets. Τα widgets αυτά ονομάζονται managers ή manager widgets. H Xt ορίζει κάποιες βασικές κλάσεις widgets, των οποίων η συμπεριφορά μπορεί να κληρονομηθεί και να προσαυξηθεί ή να τροποποιηθεί από άλλες κλάσεις widgets ( υπο – κλάσεις ). Ένα σύνολο widgets, όπως η βιβλιοθήκη LessTif Xm, ορίζει ένα πλήρες σύνολο widgets κλάσεων, που επαρκούν για τις βασικές ανάγκες των user – interfaces. H Xt επίσης υποστηρίζει αντικείμενα τα οποία ονομάζονται gadgets. Τα gadgets κατά μεγάλο μέρος μοιάζουν και ενεργούν σαν τα widgets, αλλά η συμπεριφορά τους ορίζεται από το manager widget που τα περιέχει. Γι’ αυτό και θεωρούνται «χαμηλότερης αξίας» αντικείμενα από τα widgets.
Για παράδειγμα, μια πλευρά ενός pulldown menu μπορεί να αποτελείται από button gadgets αντί για widgets, με την πλευρά να εκτελεί μεγάλος μέρος της λειτουργίας που κανονικά θα γινόταν από τα button widgets. Τα περισσότερα widgets και gadgets κληρονομούν χαρακτηριστικά από αντικείμενα που βρίσκονται ψηλότερα στην ιεραρχία κλάσεων. Για παράδειγμα, η κλάση LessTif PushButton κληρονομεί την ικανότητα να εμφανίζει ένα label από την κλάση widget Label, η οποία με τη σειρά της κληρονομεί ακόμη πιο βασικά χαρακτηριστικά των widgets από τις δικές της υπερκλάσεις. Ο προγραμματιστής έχει πρόσβαση σε συναρτήσεις που δημιουργούν ή καταστρέφουν widgets, καθώς και σε public μεταβλητές των widgets που ονομάζονται resources ( πόροι ).
Κατά τη δημιουργία ενός widget, στην ουσία το διαμορφώνουμε στιγμιαία, ρυθμίζοντας τα resources του. Δημιουργούμε δηλαδή ένα instance του widget. Τα widgets όμως είναι σχεδιασμένα κατά τέτοιο τρόπο, ώστε τα resources τους να μπορούν να τροποποιούνται δυναμικά κατά τη διάρκεια της εκτέλεσης ενός προγράμματος. Μια σημαντική κατηγορία resources των widgets είναι τα callback resources. Ένα widget που αναμένεται να αλληλεπιδράσει με την εφαρμογή παρέχει ένα callback resource για κάθε τύπο αλληλεπίδρασης που υποστηρίζει. Η αντιστοίχιση γεγονότων με λειτουργίες γίνεται από ρουτίνες που ονομάζονται callbacks. Μια εφαρμογή σε LessTif κατασκευάζεται με τη χρήση των βιβλιοθηκών Lesstif Xm και Intrinsics’ Χt. H Xt παρέχει συναρτήσεις για τη δημιουργία και τον προσδιορισμό των resources στα widgets, ενώ η Xm παρέχει τα widgets και επιπρόσθετα ένα σύνολο κατάλληλων συναρτήσεων για τη δημιουργία widget groups.
Ιεραρχία κλάσεων του συνόλου widgets της Lesstif
Ένα πρόγραμμα σε LessTif ακολουθεί το εξής πλάνο: 1) Αρχικοποίηση του X Toolkit Intrinsics. 2) Δημιουργία και διαχείριση widgets. 3) Κατασκευή widgets με τον καθορισμό των resources τους. 4) Καταγραφή callbacks στις λειτουργίες της εφαρμογής. 5) Υλοποίηση των widgets και μεταφορά ελέγχου στο event loop της Xt.
Προγραμματισμός Σε LessTif Ο πιο εύκολος τρόπος για να κατανοήσουμε το βασικό μοντέλο προγραμματισμού της LessTif είναι να εξετάσουμε ένα απλό παράδειγμα. /* hello.c -- initialize the toolkit using an application context ** and a toplevel shell widget, then create a pushbutton that says ** Hello using the varargs interface. */ #include main (int argc, char *argv[]) { Widget toplevel, button; XtAppContext app; void button_pushed(Widget, XtPointer, XtPointer); XmString label; Arg args[2];
XtSetLanguageProc (NULL, NULL, NULL); toplevel = XtVaOpenApplication (&app, "Hello", NULL, 0, &argc, argv, NULL,sessionShellWidgetClass, NULL); label = XmStringCreateLocalized ("Push here to say hello"); XtSetArg(args[0], XmNlabelString, label); button = XmCreatePushButton (toplevel, "pushme", args, 1); XmStringFree (label); XtAddCallback (button, XmNactivateCallback, button_pushed, NULL); XtManageChild (button); XtRealizeWidget (toplevel); XtAppMainLoop (app); } void button_pushed (Widget widget, XtPointer client_data, XtPointer call_data) { printf ("Hello Yourself!\n"); } Η έξοδος του παραπάνω προγράμματος είναι η εξής:
Παρατηρήσεις επί του προγράμματος Ένα πρόγραμμα σε Lesstif πρέπει να περιλαμβάνει ένα header αρχείο για κάθε αντίστοιχο widget που χρησιμοποιεί. Στο παράδειγμά μας χρησιμοποιούμε ένα PushButton widget, γι’ αυτό και περιλαμβάνουμε το αρχείο. Με την εντολή XtVaOpenApplication δημιουργούμε το λεγόμενο shell widget της εφαρμογής. Το widget αυτό λειτουργεί ως το top – level window της εφαρμογής και χειρίζεται τις αλληλεπιδράσεις της εφαρμογής με τον window manager. Όλα τα άλλα widgets της εφαρμογής δημιουργούνται ως απόγονοι του shell widget. Η συνάρτηση XmStringCreateLocalized ( ) δημιουργεί τις σύνθετες συμβολοσειρές των menu labels.
Η συνάρτηση XmCreatePushButton ( ) δημιουργεί το button, ως παιδί του top – level shell widget. Το πρώτο όρισμα της συνάρτησης πρέπει να είναι manager widget. Στο παράδειγμά μας, δεν υπάρχει manager widget και το ρόλο αυτό αναλαμβάνει το shell widget, το οποίο μπορεί να έχει μόνο ένα παιδί. Το δεύτερο όρισμα είναι ένα string που χρησιμοποιείται ως όνομα του widget. Το τρίτο όρισμα είναι ο πίνακας args και το τέταρτο ο αριθμός των στοιχείων του πίνακα αυτού.
Η συνάρτηση XtAddCallback ( ) συνδέει τη λειτουργία μιας εφαρμογής με ένα callback resource. To πρώτο όρισμα της συνάρτησης ορίζει το widget για το οποίο εγκαθιστάται το callback. Το δεύτερο όρισμα είναι το όνομα του callback resource. Το τρίτο όρισμα είναι ένας δείκτης στην callback συνάρτηση. Το τέταρτο όρισμα ονομάζεται client data.
Η συνάρτηση XtRealizeWidget () δημιουργεί το πραγματικό παράθυρο του widget. Όταν τη καλέσουμε με όρισμα το top-level widget τότε η Xt αναδρομικά διατρέχει την ιεραρχία των widget στην εφαρμογή και δημιουργεί ένα παράθυρο για το καθένα. Πριν κληθεί η XtRealizeWidget () τα widgets υπήρχαν μόνο ως δομές δεδομένων. Η συνάρτηση XtAppMainLoop() δίνει τον έλεγχο της εφαρμογής στο X Toolkit Intrinsics. Το Xt χειρίζεται τη μεταβίβαση των γεγονότων στο κατάλληλο widgets, τα οποία με τη σειρά τους τα περνάνε στις εφαρμογές μέσω των callbacks.
Τύποι δεδομένων και δομές που υποστηρίζει η Lesstif Στη Lesstif μπορούμε να χρησιμοποιήσουμε όλους τους τύπους δεδομένων που υποστηρίζει η C (int, char, πίνακες κτλ.). Επιπρόσθετα υποστηρίζει κάποιους ειδικούς τύπους δεδομένων τα οποία χρησιμοποιούνται σαν ορίσματα ή σαν τιμές επιστροφής στις ρουτίνες που χρησιμοποιούνται (XmString, XmTextPosition κ.α.). Η Lesstif υποστηρίζει δομές επανάληψης και επιλογής (for, while, if, switch).
Μερικά παραδείγματα widgets Scrolledwindow Το Scrolledwindow widget παρέχει τη δυνατότητα παρουσίασης δεδομένων (κείμενο, γραφικά). Αν τα δεδομένα που πρέπει να παρουσιαστούν είναι μεγαλύτερα από το Scrolledwindow, τότε οι Scrollbars παρέχουν στο χρήστη τη δυνατότητα να δει το πλήρες περιεχόμενό τους.
Mainwindow widget To Mainwindow widget καθορίζει τη διάταξη του main window της εφαρμογής. Είναι έτσι διαμορφωμένο ώστε να παρέχει Menubar, Command area, Message area, Scrollbars κ.α., αν και η ύπαρξη των συγκεκριμένων widgets είναι προερετική.
Τέλος Παρουσίασης