2.4.3 Η ΜΟΡΦΟΠΟΙΗΣΗ (CUSTOMIZATION) TOY ΤWΜ
Η μορφοποίηση (customization) του twm γίνεται μέσα από τα αρχεία .twmrc.
Κατά την εκκίνησή του ο twm αναζητεί τα συγκεκριμένα αρχεία και αντλεί από
αυτά τα διάφορα στοιχεία που χρειάζεται. Το αρχείο .twmrc ακολουθεί
διαφορετική σύνταξη από τα άλλα αρχεία που περιέχουν resources εξαιτίας και
της ιδιομορφίας του twm. Χωρίζεται σε τρείς ιδιαίτερες ενότητες, οι οποίες
είναι με την σειρά που εμφανίζονται στο αρχείο : η ενότητα των μεταβλητών
(variables), η ενότητα των δεσμεύσεων (bindings) και η ενότητα των μενού
(menus). Στην ενότητα των μεταβλητών προσδιορίζονται διάφορα χαρακτηριστικά
του twm όπως οι γραμματοσειρές, τα χρώματα, τα είδη των δεικτών του
ποντικιού, η θέση και η συμπεριφορά των παραθύρων και των εικονιδίων, ο
διαχειριστής των εικονιδίων. Στην ενότητα των δεσμεύσεων (bindings)
ορίζονται οι λειτουργίες που θα κάνει ο twm με το πάτημα πλήκτρων του
πληκτρολογίου ή του ποντικιού σε διάφορα μέρη των παραθύρων όπως η μπάρα των
τίτλων, το πλαίσιο, το εσωτερικό των παραθύρων ή η ρίζα. Τέλος στη τρίτη
ενότητα, αυτή των menu, ορίζονται οι δομές των menu που θέλει ο χρήστης να
εμφανίζονται στα X Windows.
Στο αρχείο .twmrc όπως και στο UNIX οι διάφορες δεσμευμένες λέξεις και τα
ορίσματα που χρησιμοποιούνται είναι "case-sensitive" δηλαδή έχει σημασία η
χρήση κεφαλαίων ή πεζών χαρακτήρων. Επίσης όπου χρησιμοποιούνται
συμβολοσειρές (strings) για ορίσματα θα πρέπει να μπαίνουν μέσα σε διπλά
εισαγωγικά ", ενώ η χρήση του χαρακτήρα # στην αρχή μίας γραμμής υποδηλώνει
σχόλιο και δεν λαμβάνεται υπόψην.
Στη συνέχεια αναλύονται ξεχωριστά οι τρεις ενότητες:
Α. Ενότητα Μεταβλητών (Variables Section)
Οι μεταβλητές προσδιορίζουν τα διάφορα "στατικά" χαρακτηριστικά του
διαχειριστή των παραθύρων. Μπορούν να παίρνουν διάφορες τιμές όπως αριθμούς,
συμβολοσειρές ή ακόμη και λίστες των παραπάνω. Οι λίστες συντάσσονται ως
ακολουθίες στοιχείων που διαχωρίζονται με κενούς χαρακτήρες (spaces) και
κλείνονται μέσα σε άγκιστρα ( "{" και "}"). Για παράδειγμα:
NoTitle
{
"xclock"
"xload"
"xbiff"
}
Οι συμβολοσειρές χρησιμοποιούνται ως ορίσματα για να δηλώσουν πελάτες των X
Windows, ονόματα αρχείων εικονιδίων, χρώματα ή άλλα. Στην περίπτωση που
αναφέρονται σε πελάτες των X Windows ο χρήστης μπορεί να χρησιμοποιεί είτε
το όνομα του πελάτη (π.χ. "xclock"), είτε το όνομα της κλάσης στην οποία
ανήκει ο πελάτης (π.χ. "Xterm") με τα ανάλογα αποτελέσματα όπως αναφέρθηκε
στην παράγραφο για την εμβέλεια των resources. Οταν οι συμβολοσειρές αφορούν
ονόματα αρχείων εικονιδίων τότε η χρήση του χαρακτήρα "~" μπροστά από το
όνομα υποδηλώνει ότι ο twm θα πρέπει να αναζητήσει το αρχείο στο home
directory του χρήστη (π.χ. "~funnyicon"). Η χρήση αντιστοίχως του χαρακτήρα
":" ορίζει στον twm ότι θα πρέπει να χρησιμοποιήσει ένα από τα εσωτερικά του
εικονίδια. Αυτά είναι τρία, το ":xlogo" ή ":iconify" που χρησιμοποιείται στο
αριστερό titlebutton, το ":resize" που χρησιμοποιείται στο δεξιό
titlebutton
και το ":question" που χρησιμοποιείται όταν ο twm δεν μπορέσει να βρεί
κάποιο εικονίδιο. Αν δώσουμε απλώς το όνομα του εικονιδίου ο twm θα το
αναζητήσει στο directory που του έχει ορίζει ο χρήστης με την μεταβλητή
IconDirectory. Αν η συμβολοσειρά ορίζει χρώμα τότε θα πρέπει να αντιστοιχεί
σε ένα από τα ονόματα χρωμάτων που ορίζονται στο αρχείο
/usr/lib/X11/rgb.txt. Τέλος μία μεταβλητή μπορεί να μην λαμβάνει κανένα
όρισμα. Στην περίπτωση αυτή θεωρείται ότι η μεταβλητή παίρνει την λογική
τιμή TRUE με αποτέλεσμα να ενεργοποιείται η ιδιότητα του διαχειριστή που
περιγράφεται από αυτήν.
Οι σημαντικότερες μεταβλητές που υποστηρίζει ο twm είναι οι:
(border) του
κάθε παραθύρου. Εξ' ορισμού έχει τιμή 2.
BorderWidth.
twm εάν χρησιμοποιείται έγχρωμη οθόνη. Περιλαμβάνει μία λίστα από μεταβλητές
που ορίζουν τα χρώματα ιδιαίτερων στοιχείων των παραθύρων. Αυτές είναι οι:
Παράδειγμα:
Color
{
DefaultBackground "SkyBlue"
DefaultForeground "white"
IconBorderColor "gray80" {"Xterm" "green" "xfig" "red" }
IconManagerBackground "gray50"
MenuBackground "yellow"
MenuForeground "black"
}
Color αλλά για μονόχρωμη οθόνη.
(pointer image) και μία δέυτερη που χρησιμοποιείται ως "μάσκα"
(pointer mask). Υπάρχουν δύο τρόποι να καθορίσουμε την εικόνα του δείκτη. Ο
πρώτος είναι να χρησιμοποιήσουμε την γραμματοσειρά cursor (cursor font), η
οποία περιέχει αντί για τους συνηθισμένους χαρακτήρες ζευγάρια εικόνων και
μασκών και τον δείκτη του ποντικιού. Στην περίπτωση αυτή η σύνταξη ενός
στοιχείου της λίστας είναι:
cursorname "string"όπου cursorname είναι ένα από τα έγκυρα ονόματα του δείκτη (δίνονται στο παράδειγμα) και
"string" είναι το όνομα της επιθυμητής εικόνας από την
γραμματοσειρά cursor. Τα ονόματα αυτά ο χρήστης μπορεί να τα βρει στο αρχείο
/usr/include/X11/cursorfont.h. Ο δεύτερος τρόπος ορισμού της εικόνας του
δείκτη είναι μέσω ξεχωριστών αρχείων bitmap που δημιουργήσει ο χρήστης. Ενας
απλός τρόπος για την κατασκευή τέτοιων εικόνων είναι μέσω του συνονόματου
προγράμματος bitmap. Στην περίπτωση αυτή η σύνταξη είναι:
cursorname "image" "mask"όπου
"image" το όνομα του αρχείου που περιέχει την εικόνα του δείκτη και
"mask" το αρχείο που περιέχει τη μάσκα της. Τα δύο παραπάνω αρχεία
υποκύπτουν στους ίδιους κανόνες με τα αρχεία που περιέχουν εικονίδια, δηλαδή
ισχύουν τα σύμβολο "~" και οι κανόνες για το μονοπάτι αναζήτησης τους.
Οι εξ' ορισμού τιμές για για τις όλες τις έγκυρες μορφές του δείκτη του ποντικιού είναι οι:
Cursors
{
Frame "topleftarrow"
Title "topleftarrow"
Icon "topleftarrow"
IconMgr "topleftarrow"
Move "fleur"
Resize "fleur"
Menu "sbleftarrow"
Button "hand2"
Wait "watch"
Select "dot"
Destroy "pirate"
}
TwmWindows menu ή η συνάρτηση
f.warpto που θα αναλυθεί παρακάτω. Αν παραλειφθεί το όρισμα της μεταβλητής,
τότε η IconifyByUnmapping θα ισχύει για κάθε πελάτη των X Windows.
IconifyByUnmapping. Ορίζει δηλαδή, τα παράθυρα που όταν εικονιδιοποιούνται
θα σχηματίζουν εικονίδια. Υπερισχύει τυχόντος γενικού ορισμού της
IconifyByUnmapping. Χρησιμοποιείται συνήθως για να καθορίσουμε τα παράθυρα
που θέλουμε να χρησιμοποιούν εικονίδια σε αντίθεση με την πλειοψηφία που
θέλουμε να χρησιμοποιεί τον διαχειριστή των εικονιδίων. Για παράδειγμα:
# όχι εικονίδια (γενικός ορισμός)
IconifyByUnmapping
# εκτός από τα παράθυρα των ακόλουθων:
DontIconifyByUnmapping { "xclock" "xload" "xbiff" }
string μπορεί να είναι είτε σε XLFD μορφή, είτε
ψευδόνυμο (alias) που υπάρχει σε κάποιο από τα αρχεία fonts.alias του
συστήματος. Παράδειγμα:
IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*"ή
IconFont "helv10.75"
twm να
αναζητήσει τα αρχεία που περιέχουν τα bitmaps των εικονιδίων των διαφόρων
προγραμμάτων. Το directory αυτό είναι συνήθως το /usr/include/X11/bitmaps,
δηλαδή δίνουμε:
IconDirectory "/usr/include/X11/bitmaps"
bitmaps για εικονίδια.
Icons
{
"Xterm" "terminal"
"xfd" "xfd_icon"
"xclock" "~my_own_icon"
}
twm θα πρέπει να χρησιμοποιήσει τα bitmaps που
έχουν οριστεί με την μεταβλητή Icons αντί για αυτά που θα χρησιμοποιούσαν
εξ' ορισμού οι συγκεκριμένοι πελάτες των X Windows.
bitmap αρχείου το οποίο θα
χρησιμοποιεί ο twm στην περίπτωση που κάποιος πελάτης δεν έχει δικό του
εικονίδιο και δεν ορίζεται κάποιο στην μεταβλητή Icons.
StartIconified δεν συνοδεύεται από λίστα τότε θεωρείται ότι όλα τα
προγράμματα θα πρέπει να ξεκινούν σε κατάσταση εικονιδίου.
twm θα βάζει όλα τα εικονίδια. Η συμβολοσειρά geomstring έχει την
μορφή geometry resource (βλ. αντίστοιχη παράγραφο). Η συμβολοσειρά vgrav
μπορεί να πάρει τις τιμές North και South καθορίζοντας αν η περιοχή θα
γεμίζει από πάνω προς τα κάτω ή αντιστρόφως. Ομοίως η συμβολοσειρά hgrav
μπορεί να πάρει τις τιμές East και West. Τα gridwidth και gridheight είναι
αριθμητικές τιμές και καθορίζουν ένα πλέγμα (grid) μέσα στην ευρύτερη
περιοχή έτσι ώστε το κάθε εικονίδιο να μπαίνει σε μία κυψέλη πλάτους
gridwidth pixel και ύψους gridheight pixel. Για παράδειγμα δίνοντας:
IconRegion "500x200-20-20" South East 50 50ορίζουμε μία περιοχή
500 επί 200 pixel στην κάτω δεξιά γωνία της οθόνης. Ο
χρήστης μπορεί να ορίσει διαδοχικά με τη μεταβλητή IconRegion όσες περιοχές
επιθυμεί. Στην περίπτωση αυτή ο twm θα χρησιμοποιεί τις επόμενες όταν
γεμίζουν οι προηγούμενες.
geometry resource και ορίζει το μέγεθος και
την θέση του διαχειριστή. Το δεύτερο (προαιρετικό) όρισμα είναι ο αριθμός
των στηλών του διαχειριστή. Εξ' ορισμού έχει μία μόνο στήλη.
twm. Το κάθε στοιχείο της λίστας έχει την
μορφή:
"winname" ["iconname"] "geometry" columnsόπου
winname το όνομα των παραθύρων που θα πρέπει να συμπεριλαμβάνονται στον
συγκεκριμένο διαχειριστή, iconname (προαιρετικό) το όνομα του αρχείου του
εικονιδίου του διαχειριστή ενώ τα geomstring, columns ορίζονται όπως και
στην μεταβλητή IconManagerGeometry. Για παράδειγμα δίνοντας:
IconManagers
{
"XTerm" "=180x10+600+5" 1
"rem_logins" "=180x10+800+5" 1
}
δημιουργούμε δύο διαχειριστές εικονιδίων. Ο πρώτος αναλαμβάνει τα εικονίδια
των παραθύρων της κλάσης XTerm, ενώ ο δεύτερος τα παράθυρα των πελατών με το
όνομα rem_logins.
twm δεν θα πρέπει να χρησιμοποιήσει
διαχειριστές εικονιδίων.
IconManagerDontShow
{
"xclock"
"xload"
"xcalc"
"xbiff"
}
Αν δεν δώσουμε όρισμα στην μεταβλητή IconManagerDontShow τότε αποκλείουμε
όλα τα προγράμματα από τον διαχειριστή εικονιδίων.
IconManagerDontShow. με κατάλληλο χειρισμό των
μεταβλητών IconManagerDontShow, IconManagerShow, IconifyByUnmapping και
DontIconifyByUnmapping μπουρούμε να καθορίσουμε ποιά προγράμματα θα
χρησιμοποιούν το διαχειριστή εικονιδίων και ποιά θα χρησιμοποιούν εικονίδια.
twm θα πρέπει να εμφανίσει το διαχειριστή των
εικονιδίων μόλις ξεκινήσει.
NoTitle θα έχει γενική ισχύ.
NoTitle.
string είναι της μορφής geometry resource
και καθορίζει μέγιστο πλάτος και ύψος του παραθύρου. Εξ' ορισμού έχει τιμή
"30000x30000". Η μεταβλητή MaxWindowSize χρησιμοποιείται για να περιορίζουμε
τα παράθυρα σε μέγεθος ίσο ή μικρότερο από αυτό που υποστηρίζει η οθόνη. Με
τον τρόπο αυτό αποφεύγονται τυχόν προβλήματα που θα προέκυπταν από
υπερβολικά μεγάλα παράθυρα.
twm ότι δεν θα πρέπει να επιτρέπει την μετακίνηση
των παραθύρων εκτός των ορίων της οθόνης. Εξ' ορισμού τα X Windows
επιτρέπουν την τοποθέτηση των παραθύρων με τέτοιο τρόπο ώστε μέρος τους να
βρίσκεται εκτός οθόνης. Με τον τρόπο αυτό μπορούμε να αποσυμφορίσουμε την
οθόνη οταν δουλεύουμε με πολλά ανοικτά παράθυρα.
twm
μετακινούμε μόνο το περίγραμμά του και όταν διαλέξουμε τη νέα θέση ο twm
ξαναζωγραφίσει το παράθυρο στη νέα θέση. Αν θέσουμε την μεταβλητή OpaqueMove
τότε μετακινούμε κατευθείαν ολόκληρο το παράθυρο. Η μεταβλητή αυτή ορίζεται
κυρίως σε γρήγορα συστήματα καθώς η μετακίνηση ολοκληρου του παραθύρου
απαιτεί περισσότερους υπολογισμούς και μνήμη.
twm δεν θα πρέπει να
χρησιμοποιήσει κανέναν από τους εσωτερικούς του ορισμούς για τα titlebuttons
και τις δεσμεύσεις πλήκτρων. Η μεταβλητή NoDefaults θα πρέπει να
χρησιμοποιείται μόνο όταν στο αρχείο .twmrc υπάρχει πλήρες καινούργιο σύνολο
ορισμών για τα παραπάνω στοιχεία.
WarpCursor θα ισχύει για όλα τα παράθυρα.
f.move του twm (βλ.
συνάρτηση f.deltastop). Εξ' ορισμού παίρνει την τιμή μηδεν.
(bindings). Ο twm
χρησιμοποιεί τον όρο των δεσμεύσεων για να περιγράψει την απόδοση κάποιων
λειτουργιών σε συγκεκριμένους συνδυασμούς πλήκτρων του ποντικιού και του
πληκτρολογίου ακόμη και σε νέα "κουμπία" της μπάρας του τίτλου
(titlebuttons). Οι διάφορες λειτουργίες πραγματοποιούνται από ένα ευρύ
σύνολο εσωτερικών συναρτήσεων του twm οι σημαντικότερες των οποίων είναι οι:
f.fullzoom αλλάζει το μέγεθος
του επιλεγμένου παραθύρου και το κάνει το μέγιστο που υποστηρίζει η οθόνη.
Αν εφαρμόσουμε ξανά την f.fullzoom στο ίδιο παράθυρο αυτό θα λάβει τις
αρχικές του διαστάσεις. Εκτός από την f.fullzoom υπάρχουν και αρκετές
παρόμοιες συναρτήσεις που είτε μεγιστοποιούν το επιλεγμένο παράθυρο ως προς
μία διάσταση (f.zoom, f.horizoom), είτε το μεγαλώνουν ώστε να καλύψει ένα
μέρος της οθόνης, την μισή για παράδειγμα (f.bottomzoom, f.topzoom,
f.leftzoom, f.rightzoom). Ολες όταν εφαρμόζονται ξανά σε ένα παράθυρο το
επαναφέρουν στις παλιές του διαστάσεις.
AutoRaise.
titlebutton κάθε παραθύρου είναι δεσμευμένο
εξ' ορισμού με την συνάρτηση αυτή.
DontMoveOff.
f.focus.
f.iconify.
/bin/sh για
εκτέλεση. Με την συνάρτηση μπορούμε να εκτελούμε προγράμματα μέσα
από τα X Windows. Αντί της f.exec ο χρήστης μπορεί να
χρησιμοποιήσει την συντομογραφία της:
! stringΠαράδειγμα:
f.exec "xterm -name MyTerm &"
MoveDelta (βλ. επόμενα παραδείγματα).
string. Οι οριζόμενες από τον χρήστη συναρτήσεις του twm είναι λίστες
από το σύνολο των ήδη υπάρχοντων συναρτήσεων. Ο ορισμός τους γινεται ως
εξής:
Function "function-name" { function-list }
όπου "function-name" το όνομα της νέας συνάρτησης και function-list η λίστα
των συναρτήσεων που την αποτελούν. Για παράδειγμα:
Function "move-or-lower" { f.move f.deltastop f.lower }
Function "move-or-raise" { f.move f.deltastop f.raise }
Function "move-or-iconify" { f.move f.deltastop f.iconify }
Η συνάρτηση "move-or-lower" μετακινεί το επιλεγμένο παράθυρο αν ο δείκτης
του ποντικιού περισσότερα από MoveDelta pixel αλλιώς χαμηλώνει το παράθυρο.
Ομοίως και οι υπόλοιπες.
twm να σταματήσει τη λειτουργία
του.
twm να σταματήσει και να ξεκινήσει
εξ'αρχής. Η συνάρτηση αυτή είναι χρήσιμη στην περίπτωση που έχουμε κάνει
αλλαγές στο αρχείο .twmrc ενώ αυτός τρέχει και θέλουμε να τις περάσουμε σε
αυτόν. Προφανώς η επιλογή αυτή δεν έχει νόημα στην περίπτωση που
χρησιμοποιούμε τον twm στο αρχείο .xinitrc ως μέσο τερματισμού των X
Windows.
twm να κλείσει το διαχειριστή των
εικονιδίων.
twm να ταξινομήσει το διαχειριστή των
εικονιδίων.
twm να εμφανίσει το menu με το όνομα της
συμβολοσειράς string.
twm να μην κάνει τίποτα (No OPeration). Χρήσιμο
κυρίως για κενές γραμμές στα menu.
ButtonCode = modlist : context : functionκαι
"KeyCode" = modlist : context : functionόπου
ButtonCode είναι ο κωδικός του πλήκτρου του ποντικιού, ο οποίος μπορεί
να πάρει τις τιμές Button1, Button2 εώς Button5. Ο twm δηλαδή, υποστηρίζει
υποστηρίζει εώς και πέντε πλήκτρα στο ποντίκι. Η αρίθμηση αρχίσει από το
αριστερότερο πλήκτρο (Button1). KeyCode είναι το ανάλογο όνομα για κάθε
πλήκτρο του πληκτρολογίου, όπως αυτά ορίζονται στο αρχείο
/usr/include/X11/keysymdef.h (χωρίς το πρόθεμα XK_). Μετά το "=" ο χρήστης
μπορεί να δώσει μία λίστα (modlist : modifiers list) από τα ειδικά πλήκτρα
shift, control και meta (συντομογραφίες : s,c και m) που θα πρέπει να
πατηθούν μαζί με το βασικό πλήκτρο για να επιτευχθεί το αποτέλεσμα. Τα
στοιχεία της λίστας διαχωρίζονται με τον χαρακτήρα "|". Ακολουθεί μία
παρόμοια λίστα που ορίζει σε ποιά θέση θα πρέπει να είναι ο δείκτης του
ποντικιού για να εκτελεστεί η συνάρτηση. Τα στοιχεία της λίστας μπορούν να
πάρουν τις τιμές window (εσωτερικό παραθύρου), title (μπάρα τίτλου), icon
(εικονίδιο), root (κεντρικό παραθυρο - ρίζα), frame (πλαίσιο παραθύρου),
iconmgr (διαχειριστής εικονιδίων) ή all για όλα μαζί (ισχύουν επίσης οι
συντομογραφίες w, t, i, r, f και m για το iconmgr). Τέλος δίνεται η
συνάρτηση που θα εκτελείται με το πάτημα του συγκεκριμένου συνδυασμού
πλήκτρων. Η συνάρτηση αυτή μπορεί να είναι μία από τις εσωτερικές
συναρτήσεις του twm ή να είναι ορισμένη από τον χρήστη.
Οι δεσμεύσεις των πλήκτρων του ποντικιού που γίνονται στο αρχείο
system.twmrc ειναι οι ακόλουθες:
# BUTTONS = MODS : CONTEXT : FUNCTION
Button1 = : root : f.menu "defops"
Button1 = m : window|icon : f.function "move-or-lower"
Button2 = m : window|icon : f.iconify
Button3 = m : window|icon : f.function "move-or-raise"
Button1 = : title : f.function "move-or-raise"
Button2 = : title : f.raiselower
Button1 = : icon : f.function "move-or-iconify"
Button2 = : icon : f.iconify
Button1 = : iconmgr : f.iconify
Button2 = : iconmgr : f.iconify
Ενα παράδειγμα και για δέσμευση πλήκτρων του πληκτρολογίου είναι:
## KEYS = MODS : CONTEXT : FUNCTION
"L1" = s : window : f.destroy
"L2" = : root : f.refresh
"L2" = : window : f.winrefresh
"L3" = : window : f.zoom
"L4" = : window : f.fullzoom
"L5" = s : root : !"xlock -mode life -info \"Back soon..\" &"
"F1" = : all : f.identify
Ο twm επιτρέπει και τον ορισμό επιπλέον "κουμπιών" (titlebuttons) στην μπάρα
του τίτλου των παραθύρων. Με το όνομα LeftTitleButton μπορούμε αν
προσθέσουμε κουμπιά δίπλα στο αριστερό titlebutton, ενώ με το όνομα
RightTitleButton προστίθονται δίπλα από το δεξί. Ορίζονται ως εξής:
LeftTitleButton "bitmapname" = functionή
RightTitleButton "bitmapname" = functionόπου
bitmapname είναι το όνομα του αρχείου που περιέχει την εικόνα (bitmap)
που θα χρησιμοποιηθεί για το κουμπί και function η συνάρτηση που θα
εκτελείτε με το πάτημα του. Για παράδειγμα ο ορισμός:
LeftTitleButton "menu8" = f.menu "Winmenu"δημιουργεί ένα νέο κουμπί, δεξιά του αριστερού
titlebutton, που πατώντας το
εμφανίσει το menu "Winmenu".
Γ. Ενότητα Menu (Menus Section)
Στην ενότητα των Menu ορίζονται οι δομές των menu που αναφέρθηκαν στις
εντολές f.menu της ενότητας των δεσμεύσεων. Η σύνταξη της δομής menu είναι η
ακόλουθη:
menu "menuname" [ ("deffore":"defback") ]
{
string1 [ ("fore1":"back1")] function1
string2 [ ("fore2":"back2")] function2
. . .
. . .
. . .
stringN [ ("foreN":"backN")] functionN
}
όπου menuname το όνομα του menu, όπως αναφέρεται και στην αντίστοιχη εντολή
f.menu και deffore, defback, fore1 εώς foreN και back1 εώς
backN τα χρώματα
που θα χρησιμοποιηθούν στο menu (foregroundcolor : backgroundcolor). Τα
string1 εώς stringN είναι οι συμβολοσειρές που θα εμφανιστούν στις επιλογές
του menu και function1 εώς functionN είναι οι συναρτήσεις που αντιστοιχούν
σε αυτές τις επιλογές. Σημειώνεται ότι επιτρέπεται η ύπαρξη υπο-mεnu μέσα σε
menu (submenus). Τα υπο-menu μπορούν να δημιουργηθούν αν κάποιες από τις
function1..functionN είναι της μορφής f.menu "menuname". Τέλος όταν κάποια
από τις επιλογές του menu σχετίζεται με παράθυρα (π.χ. f.move) τότε επειδή
δεν υπάρχει ήδη επιλεγμένο παράθυρο ο δείκτης του ποντικιού μετατρέπεται σε
δείκτη επιλογής και ο χρήστης καλείται να επιλέξει ένα παράθυρο πατώντας
μέσα σε αυτό.
Ο ορισμός του menu υπάρχει συνήθως στο αρχείο system.twmrc είναι ο εξής:
menu "defops"
{
"Twm" f.title
"Iconify" f.iconify
"Resize" f.resize
"Move" f.move
"Raise" f.raise
"Lower" f.lower
"" f.nop
"Focus" f.focus
"Unfocus" f.unfocus
"Show Iconmgr" f.showiconmgr
"Hide Iconmgr" f.hideiconmgr
"" f.nop
"Kill" f.destroy
"Delete" f.delete
"" f.nop
"Restart" f.restart
"Exit" f.quit
}
Ενώ το menu Winmenu που ορίστηκε για το νέο titlebutton μπορεί να έχει την
μορφή:
menu "Winmenu"
{
"My Menu" f.title
"Iconify" f.iconify
"Refresh" f.winrefresh
"Raise" f.raise
"Lower" f.lower
"Focus" f.focus
"UnFocus" f.unfocus
"" f.nop
"About" f.identify
"Quit Client" f.destroy
}