4.4.1 Η ΔΗΜΙΟΥΡΓΙΑ ΤΩΝ WIDGETS


Όπως περιγράφηκε παραπάνω το πρώτο widget του κάθε προγράμματος δημιουργείται από την XtInitialize. Το widget αυτό ανήκει στην κλάση TopLevelShell. Τα TopLevelShell widgets χρησιμοποιούνται για την δημιουργία των βασικών παραθύρων των προγραμμάτων, δηλαδή παραθύρων που θα εμφανιστούν στην οθόνη σαν παιδιά του root window και θα πρέπει να συνεργαστούν με το window manager. Διαθέτουν όλους μηχανισμούς εκείνους που χρειάζονται για την λειτουργία τέτοιων παραθύρων. Επιπλέον τα widgets αυτά επιτρέπεται να έχουν μόνο ένα παιδί. Για το λόγο αυτό δημιουργούμε πάντοτε κάποιο widget παιδί του που να ανήκει στην κατηγορία των widgets που μπορούν να έχουν περισσότερα από ένα παιδιά (container widget). Έτσι στη συνέχεια μπορούμε να προσθέσουμε όσα άλλα widgets επιθυμούμε.

Για τη δημιουργία νέων widgets υπάρχει η συνάρτηση XtCreateWidget:

    Widget XtCreateWidget(
               String      name,
               WidgetClass widget_class,
               Widget      parent,
               ArgList     args,
               Cardinal    num_args
           );
Η XtCreateWidget επιστρέφει την δομή Widget του widget που δημιουργείται. Την δομή αυτή χρησιμοποιούμε στη συνέχεια για να απευθυνθούμε στο widget. Η συνάρτηση παίρνει πέντε ορίσματα. Μια συμβολοσειρά με το όνομα του widget. Το όνομα του φυλάσσεται στη resource database του εξυπηρετητή των X Windows. Από εκεί έχουμε την δυνατοτητα να αλλάξουμε τα resources - χαρακτηριστικά του widget, χρησιμοποιώντας το αρχείο .Xdefaults ή απεύθείας το πρόγραμμα xrdb. Για παράδειγμα, αν το πρόγραμμα λέγεται myprog και το widget λέγεται mywidget, με την παρακάτων γραμμή μπορούμε να αλλάξουμε το χρώμα του widget:

     myprog.mywidget.background : green
Το δεύτερο όρισμα καθορίζει την κλάση του widget, δηλαδή με άλλα λόγια καθορίζει τι widget επιθυμούμε να δημιουργήσουμε. Οι τιμές του ορίσματος είναι προκαθορισμένες και ορίζονται στα αντίστοιχα include files στο directory του Widget Set. Στην περίπτωσή μας (Motif) είναι το /usr/include/Xm. Εξυπακούεται ότι είναι απαραίτητο όταν θέλουμε να δημιουργήσουμε ένα τύπο widget στο πρόγραμμα να συμπεριλαμβάνουμε και το include file του. Στον πίνακα που ακολουθεί αναγράφονται τα σημαντικότερα widgets του Motif, η κλάση του καθενός (όπως πρέπει να συμπληρωθεί στο δεύτερο όρισμα της XtCreateWidget) και το include file του στο directory /usr/include/Xm:


    Widget              Widget Class                   Include File
 ________________________________________________________________________

Το τρίτο όρισμα είναι το widget γονέας του widget που δημιοργούμε. Εδώ υπάρχει αντιστοιχία με τα παράθυρα στην Xlib. Το τέταρτο όρισμα είναι κάποιες επιπλέον παράμετροι (resources) που δίνουμε σε κάθε widget ξεχωριστά. Το τελευταίο όρισμα είναι το πλήθος των προηγουμένων παραμέτρων. Οι παράμετροι αυτές δίνονται σε μία συγκεκριμένη μορφή χρησιμοποιώντας τη δομή Arg (argument), η οποία ορίζεται ως εξής (στο include file Intrinsic.h):

    typedef char *String;
    typedef long  XtArgVal;
    
    typedef struct {
               String    name;
               XtArgVal  value;
            } Arg, *ArgList;

[prev] [up] [next] [contents] [index]