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 είναι οι:

AutoRaise { win-list } :
Ορίζει μία λίστα πελατών τα παράθυρα των οποίων θα πρέπει να υψώνονται αυτομάτως με την είσοδο του δείκτη του ποντικιού σε αυτά.

BorderWidth pixels :
Ορίζει το πλάτος σε pixels του περιθωρίου (border) του κάθε παραθύρου. Εξ' ορισμού έχει τιμή 2.

IconBorderWidth pixels :
Ομοίως με την BorderWidth αλλά για τα εικονίδια.

ClientBorderWidth :
Ορίζει ότι το περιθώριο του παραθύρου ενός πελάτη θα πρέπει να είναι όσο ορίζει το αντίστοιχο resource του πελάτη. Αναιρεί την τιμή της μεταβλητής BorderWidth.

Color { colors-list } :
Ορίζει τα χρώματα που θα πρέπει να χρησιμοποιήσει ο twm εάν χρησιμοποιείται έγχρωμη οθόνη. Περιλαμβάνει μία λίστα από μεταβλητές που ορίζουν τα χρώματα ιδιαίτερων στοιχείων των παραθύρων. Αυτές είναι οι: Η κάθε μία από αυτές παίρνει ως όρισμα το επιθυμητό χρώμα. Η Color μπορεί να συμπεριλάβει και τις μεταβλητές : Αυτές δέχονται δύο ορίσματα, το πρώτο είναι το χρώμα και το δεύτερο (προαιρετικό) είναι μία λίστα με ζευγάρια πελάτη - χρώματος για την περίπτωση που θέλουμε να χρησιμοποιήσουμε ιδιαίτερο χρώμα γαι κάποιο πελάτη.

Παράδειγμα:

	Color
	{
		DefaultBackground "SkyBlue"
		DefaultForeground "white"
		IconBorderColor "gray80" {"Xterm" "green" "xfig" "red" }
		IconManagerBackground "gray50"
		MenuBackground "yellow"
		MenuForeground "black"
	}
Monochrome { colors-list } :
Ομοίως με την Color αλλά για μονόχρωμη οθόνη.

Cursors { cursor-list } :
Ορίζει το σχήμα που πρέπει να έχει ο δείκτης του ποντικιού όταν εκτελεί τις διάφορες εργασίες του. Το σχήμα του δείκτη, η εικόνα του, είναι της ίδιας μορφής με τις εικόνες των εικονιδίων, δηλαδή bitmaps. Ειδικότερα για τον δείκτη του ποντικιού χρειάζονται δύο εικόνες, η κανονική (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"
	}
IconifyByUnmapping [{ win-list }] :
Δηλώνει ότι τα παράθυρα των πελατών που αναφέρονται στη λίστα όταν εικονιδιοποιούνται δεν θα πρέπει να δημιουργούν εικονίδια. Στην περίπτωση αυτή θα πρέπει θα πρέπει να έχει προνοηθεί η ύπαρξη κάποιου άλλου μέσου για την επαναφορά των παραθύρων. Τέτοια μέσα είναι ο διαχειριστής των εικονιδίων, το TwmWindows menu ή η συνάρτηση f.warpto που θα αναλυθεί παρακάτω. Αν παραλειφθεί το όρισμα της μεταβλητής, τότε η IconifyByUnmapping θα ισχύει για κάθε πελάτη των X Windows.

DontIconifyByUnmapping { win-list } :
Είναι η αντίθετη της IconifyByUnmapping. Ορίζει δηλαδή, τα παράθυρα που όταν εικονιδιοποιούνται θα σχηματίζουν εικονίδια. Υπερισχύει τυχόντος γενικού ορισμού της IconifyByUnmapping. Χρησιμοποιείται συνήθως για να καθορίσουμε τα παράθυρα που θέλουμε να χρησιμοποιούν εικονίδια σε αντίθεση με την πλειοψηφία που θέλουμε να χρησιμοποιεί τον διαχειριστή των εικονιδίων. Για παράδειγμα:

	# όχι εικονίδια (γενικός ορισμός)
	IconifyByUnmapping
	# εκτός από τα παράθυρα των ακόλουθων:
	DontIconifyByUnmapping { "xclock" "xload" "xbiff" }
IconFont string :
Ορίζει την γραμματοσειρά που θα χρησιμοποιούν τα εικονίδια. Το όρισμα string μπορεί να είναι είτε σε XLFD μορφή, είτε ψευδόνυμο (alias) που υπάρχει σε κάποιο από τα αρχεία fonts.alias του συστήματος. Παράδειγμα:

	IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*"
ή

	IconFont "helv10.75"
IconManagerFont string :
Ορίζει την γραμματοσειρά που θα χρησιμοποιεί ο διαχειριστής των εικονιδίων.

MenuFont string :
Ορίζει την γραμματοσειρά που θα χρησιμοποιούνται στα menus.

TitleFont string :
Ορίζει την γραμματοσειρά που θα χρησιμοποιείται στην μπάρα του τίτλου των παραθύρων.

IconDirectory string :
Ορίζει το directory στο οποίο θα πρέπει ο twm να αναζητήσει τα αρχεία που περιέχουν τα bitmaps των εικονιδίων των διαφόρων προγραμμάτων. Το directory αυτό είναι συνήθως το /usr/include/X11/bitmaps, δηλαδή δίνουμε:

	IconDirectory "/usr/include/X11/bitmaps"
Icons { win-list } :
Ορίζει τα εικονίδια που θα χρησιμοποιούν οι πελάτες των X Windows. Δέχεται ως όρισμα μία λίστα από ζευγάρια πελατών των X Windows και αρχείων που περιέχουν bitmaps για εικονίδια.

	Icons
	{
		"Xterm"		"terminal"
		"xfd"		"xfd_icon"
		"xclock"	"~my_own_icon"
	}
ForceIcons :
Δηλώνει ότι ο twm θα πρέπει να χρησιμοποιήσει τα bitmaps που έχουν οριστεί με την μεταβλητή Icons αντί για αυτά που θα χρησιμοποιούσαν εξ' ορισμού οι συγκεκριμένοι πελάτες των X Windows.

UnknownIcon string :
Ορίζει το όνομα ενός bitmap αρχείου το οποίο θα χρησιμοποιεί ο twm στην περίπτωση που κάποιος πελάτης δεν έχει δικό του εικονίδιο και δεν ορίζεται κάποιο στην μεταβλητή Icons.

StartIconified [{ win-list }] :
Ορίζει μία λίστα πελατών των X Windows οι οποίοι θα πρέπει να ξεκινούν σε κατάσταση εικονιδίου. Αν η μεταβλητή StartIconified δεν συνοδεύεται από λίστα τότε θεωρείται ότι όλα τα προγράμματα θα πρέπει να ξεκινούν σε κατάσταση εικονιδίου.

IconRegion geomstring vgrav hgrav gridwidth gridheight :
Ορίζει τον τρόπο με τον οποίο θα πρέπει να παρατάσσονται τα εικονίδια στην οθόνη. Συγκεκριμένα, ορίζει μία περιοχή της οθόνης μέσω της συμβολοσειράς geomstring μέσα στην οποία ο 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 θα χρησιμοποιεί τις επόμενες όταν γεμίζουν οι προηγούμενες.

IconManagerGeometry geomstring [ columns ] :
Ορίζει τις γεωμετρικές διαστάσεις του διαχειριστή των εικονιδίων. Το πρώτο όρισμα είναι μία συμβολοσειρά που έχει την μορφή geometry resource και ορίζει το μέγεθος και την θέση του διαχειριστή. Το δεύτερο (προαιρετικό) όρισμα είναι ο αριθμός των στηλών του διαχειριστή. Εξ' ορισμού έχει μία μόνο στήλη.

IconManagers { iconmgr-list } :
Ορίζει μία λίστα από διαχειριστές εικονιδίων που θα πρέπει να δημιουργήσει ο 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.

NoIconManagers :
Δηλώνει ότι ο twm δεν θα πρέπει να χρησιμοποιήσει διαχειριστές εικονιδίων.

IconManagerDontShow [{ win-list }] :
Ορίζει μία λίστα πελατών των X Windows τα παράθυρα των οποίων δεν θα πρέπει να εμφανίζονται στον διαχειριστή εικονιδίων είτε αυτά είναι σε μορφή εικονιδίων είτε όχι. Με τον τρόπο αυτό μπορούμε να κρατήσουμε έξω από τον διαχειριστή εικονιδίων διάφορους πελάτες που δεν μας ενδιαφέρει ο χειρισμός μέσω του διαχειριστή, μειώνοντας έτσι και τον όγκο του. Για παράδειγμα:

	IconManagerDontShow
	{
		"xclock"
		"xload"
		"xcalc"
		"xbiff"
	}
Αν δεν δώσουμε όρισμα στην μεταβλητή IconManagerDontShow τότε αποκλείουμε όλα τα προγράμματα από τον διαχειριστή εικονιδίων.

IconManagerShow { win-list } :
Ορίζει τα παράθυρα των προγραμμάτων που θα πρέπει να εμφανίζονται στον διαχειριστή των εικονιδίων. Χρησιμοποιείται σε συνδυασμό με την μεταβλητή IconManagerDontShow. με κατάλληλο χειρισμό των μεταβλητών IconManagerDontShow, IconManagerShow, IconifyByUnmapping και DontIconifyByUnmapping μπουρούμε να καθορίσουμε ποιά προγράμματα θα χρησιμοποιούν το διαχειριστή εικονιδίων και ποιά θα χρησιμοποιούν εικονίδια.

ShowIconManager :
Ορίζει ότι ο twm θα πρέπει να εμφανίσει το διαχειριστή των εικονιδίων μόλις ξεκινήσει.

SortIconManager :
Ορίζει ότι οι εγγραφές στο διαχειριστή εικονιδίων θα πρέπει να είναι ταξινομημένες αλφαβητικά.

NoTitle [{ win-list }] :
Ορίζει μία λίστα πελατών των X Windows τα παράθυρα των οποίων δεν θα πρέπει να έχουν την μπάρα του τίτλου που προσθέτει ο twm. Αν δεν δώσουμε λίστα πελατών η NoTitle θα έχει γενική ισχύ.

MakeTitle { win-list } :
Ορίζει μία λίστα πελατών των X Windows τα παράθυρα των οποίων δεν θα πρέπει να έχουν την μπάρα του τίτλου. Χρησιμοποιείται σε συνδυασμό με την μεταβλητή NoTitle.

MaxWindowSize string :
Ορίζει το μέγιστο επιτρεπτό μέγεθος των παραθύρων των πελατών των X Windows. Το όρισμα string είναι της μορφής geometry resource και καθορίζει μέγιστο πλάτος και ύψος του παραθύρου. Εξ' ορισμού έχει τιμή "30000x30000". Η μεταβλητή MaxWindowSize χρησιμοποιείται για να περιορίζουμε τα παράθυρα σε μέγεθος ίσο ή μικρότερο από αυτό που υποστηρίζει η οθόνη. Με τον τρόπο αυτό αποφεύγονται τυχόν προβλήματα που θα προέκυπταν από υπερβολικά μεγάλα παράθυρα.

DontMoveOff :
Δηλώνει στο twm ότι δεν θα πρέπει να επιτρέπει την μετακίνηση των παραθύρων εκτός των ορίων της οθόνης. Εξ' ορισμού τα X Windows επιτρέπουν την τοποθέτηση των παραθύρων με τέτοιο τρόπο ώστε μέρος τους να βρίσκεται εκτός οθόνης. Με τον τρόπο αυτό μπορούμε να αποσυμφορίσουμε την οθόνη οταν δουλεύουμε με πολλά ανοικτά παράθυρα.

OpaqueMove :
Εξ' ορισμού όταν μετακινούμε ένα παράθυρο μέσω του twm μετακινούμε μόνο το περίγραμμά του και όταν διαλέξουμε τη νέα θέση ο twm ξαναζωγραφίσει το παράθυρο στη νέα θέση. Αν θέσουμε την μεταβλητή OpaqueMove τότε μετακινούμε κατευθείαν ολόκληρο το παράθυρο. Η μεταβλητή αυτή ορίζεται κυρίως σε γρήγορα συστήματα καθώς η μετακίνηση ολοκληρου του παραθύρου απαιτεί περισσότερους υπολογισμούς και μνήμη.

NoDefaults :
Η μεταβλητή αυτή ορίζει πως ο twm δεν θα πρέπει να χρησιμοποιήσει κανέναν από τους εσωτερικούς του ορισμούς για τα titlebuttons και τις δεσμεύσεις πλήκτρων. Η μεταβλητή NoDefaults θα πρέπει να χρησιμοποιείται μόνο όταν στο αρχείο .twmrc υπάρχει πλήρες καινούργιο σύνολο ορισμών για τα παραπάνω στοιχεία.

WarpCursor [{ win-list }] :
Ορίζει μία λίστα πελατών των X Windows για τους οποίους θα ισχύει ότι όταν τα παράθυρα επαναφέρονται στην κανονική τους μορφή από εικονίδια ο δείκτης του ποντικιού θα μεταφέρεται αυτομάτως μέσα σε αυτά. Αυτό σημαίνει ότι τα παράθυρα θα ενεργοποιούνται αυτομάτως. Αν δεν δοθεί όρισμα τότε η WarpCursor θα ισχύει για όλα τα παράθυρα.

MoveDelta pixels :
Ορίζει τον αριθμό των pixel που θα πρέπει να μετακινηθεί ο δείκτης του ποντικιού για να ενεργοποιηθεί η συνάρτηση f.move του twm (βλ. συνάρτηση f.deltastop). Εξ' ορισμού παίρνει την τιμή μηδεν.

NoRaiseOnDeiconify :
Αναιρεί την αυτόματη ύψωση κατά την επαναφορά παραθύρου στην κανονική του μορφή.

NoRaiseOnMove :
Αναιρεί την αυτόματη ύψωση κατά την μετακίνηση παραθύρου.

NoRaiseOnResize :
Αναιρεί την αυτόματη ύψωση κατά την αλλαγή μεγέθους παραθύρου.

NoRaiseOnWarp :
Αναιρεί την αυτόματη ύψωση κατά την μετακίνηση του δείκτη του ποντικιού εντός του παραθύρου (ενεργοποίηση του παραθύρου).

Β. Ενότητα Δεσμεύσεων (Bindings Section) Ο Twm προσφέρει στο χρήστη ένα πλήρη μηχανισμό για το χειρισμό των X Windows αξιοποιώντας πλήρως τα πλήκτρα του ποντικιού και του πληκτρολογίου. Ο μηχανισμός αυτός υλοποιείται μέσω των "δεσμεύσεων" (bindings). Ο twm χρησιμοποιεί τον όρο των δεσμεύσεων για να περιγράψει την απόδοση κάποιων λειτουργιών σε συγκεκριμένους συνδυασμούς πλήκτρων του ποντικιού και του πληκτρολογίου ακόμη και σε νέα "κουμπία" της μπάρας του τίτλου (titlebuttons). Οι διάφορες λειτουργίες πραγματοποιούνται από ένα ευρύ σύνολο εσωτερικών συναρτήσεων του twm οι σημαντικότερες των οποίων είναι οι:

f.fullzoom :
Με τον όρο "zoom" ορίζονται στον twm ορισμένες προκαθορισμένες μεταβολές στο μέγεθος των παραθύρων που υποστηρίζονται απευθείας από το διαχειριστή των παραθύρων. Ετσι η συνάρτηση f.fullzoom αλλάζει το μέγεθος του επιλεγμένου παραθύρου και το κάνει το μέγιστο που υποστηρίζει η οθόνη. Αν εφαρμόσουμε ξανά την f.fullzoom στο ίδιο παράθυρο αυτό θα λάβει τις αρχικές του διαστάσεις. Εκτός από την f.fullzoom υπάρχουν και αρκετές παρόμοιες συναρτήσεις που είτε μεγιστοποιούν το επιλεγμένο παράθυρο ως προς μία διάσταση (f.zoom, f.horizoom), είτε το μεγαλώνουν ώστε να καλύψει ένα μέρος της οθόνης, την μισή για παράδειγμα (f.bottomzoom, f.topzoom, f.leftzoom, f.rightzoom). Ολες όταν εφαρμόζονται ξανά σε ένα παράθυρο το επαναφέρουν στις παλιές του διαστάσεις.

f.lower f.raise :
Χαμηλώνουν και υψώνουν αντίστοιχα το επιλεγμένο παράθυρο.

f.autoraise :
Η συνάρτηση αυτή ορίζει αν το επιλεγμένο παράθυρο θα υψώνεται αυτόματα ή όχι με την είσοδο του δείκτη του ποντικιού σε αυτό. Είναι ανάλογη της μεταβλητής AutoRaise.

f.resize :
Δίνει την δυνατότητα στο χρήστη να αλλάξει τις διαστάσεις του επιλεγμένου παραθύρου. Το δεξί titlebutton κάθε παραθύρου είναι δεσμευμένο εξ' ορισμού με την συνάρτηση αυτή.

f.move :
Επιτρέπει στο χρήστη να μετακινήσει το επιλεγμένο παράθυρο.

f.forcemove :
Επιτρέπει στο χρήστη να μετακινήσει το επιλεγμένο παράθυρο και εκτός των ορίων της οθόνης ακόμη και αν είναι ενεργοποιημένη η μεταβλητή DontMoveOff.

f.focus :
Εστιάζει την είσοδο από το πληκτρολόγιο στο επιλεγμένο παράθυρο. Εφαρμογή ξανά στο ίδιο παράθυρο το απελευθερώνει.

f.unfocus :
Η αντίστροφη συνάρτηση της f.focus.

f.iconify :
Μετατρέπει το επιλεγμένο παράθυρο σε κατάσταση εικονιδίου. Λειτουργεί αντίστροφα με επιλεγμένο εικονίδιο.

f.deiconify :
Η αντίστροφη συνάρτηση της f.iconify.

f.exec string :
Περνάει την συμβολοσειρά string ως όρισμα στο /bin/sh για εκτέλεση. Με την συνάρτηση μπορούμε να εκτελούμε προγράμματα μέσα από τα X Windows. Αντί της f.exec ο χρήστης μπορεί να χρησιμοποιήσει την συντομογραφία της:

	! string
Παράδειγμα:

	f.exec "xterm -name MyTerm &"
f.deltastop :
Η συνάρτηση αυτή χρησιμοποιείται στις συναρτήσεις που ορίζει ο χρήστης. Σκοπός της είναι να διακόπτει την συνάρτηση του χρήστη αν ο δείκτης του ποντικιού μετακινηθεί περισσότερα από όσα pixel ορίζει η μεταβλητή MoveDelta (βλ. επόμενα παραδείγματα).

f.function string :
Εκτελεί μία συνάρτηση που έχει ορίσει ο χρήστης με το όνομα 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 αλλιώς χαμηλώνει το παράθυρο. Ομοίως και οι υπόλοιπες.

f.identify :
Δίνει σε ένα ξεχωριστό παράθυρο στοιχεία για το όνομα, την κλάση και τα γεωμετρικά χαρακτηριστικά του επιλεγμένου παραθύρου.

f.destroy :
Δίνει εντολή στον εξυπηρετητή των X Windows να κλείσει την σύνδεση του με το πρόγραμμα που άνοιξε το επιλεγμένο παράθυρο. Η επιλογή αυτή πρέπει να θεωρείται η τελευταία για το σταμάτημα ενός πελάτη των X Windows.

f.quit :
Η συνάρτηση αυτή δίνει εντολή στον twm να σταματήσει τη λειτουργία του.

f.restart :
Δίνει την εντολή στον twm να σταματήσει και να ξεκινήσει εξ'αρχής. Η συνάρτηση αυτή είναι χρήσιμη στην περίπτωση που έχουμε κάνει αλλαγές στο αρχείο .twmrc ενώ αυτός τρέχει και θέλουμε να τις περάσουμε σε αυτόν. Προφανώς η επιλογή αυτή δεν έχει νόημα στην περίπτωση που χρησιμοποιούμε τον twm στο αρχείο .xinitrc ως μέσο τερματισμού των X Windows.

f.refresh :
Δίνει εντολή στον εξυπηρετητή των X Windows να ξαναζωγραφίσει όλα τα παράθυρα. Η επιλογή αυτή είναι χρήσιμη στην περίπτωση που κάποιος εξωτερικός παράγοντας (συνήθως "αδέσποτα" μηνύματα του συστήματος) χαλάσει μερικώς την όψη των παραθύρων.

f.winrefresh :
Δίνει εντολή στον εξυπηρετητή των X Windows να ξαναζωγραφίσει το επιλεγμένο παράθυρο.

f.showiconmgr :
Δίνει εντολή στον twm να εμφανίσει το διαχειριστή των εικονιδίων.

f.hideiconmgr :
Δίνει εντολή στον twm να κλείσει το διαχειριστή των εικονιδίων.

f.sorticonmgr :
Δίνει εντολή στον twm να ταξινομήσει το διαχειριστή των εικονιδίων.

f.menu string :
Δινει εντολή στον twm να εμφανίσει το menu με το όνομα της συμβολοσειράς string.

f.title :
Ορίζει ότι η συγκεκριμένη γραμμή σε ένα menu θα είναι τίτλος.

f.nop :
Δίνει εντολή στον twm να μην κάνει τίποτα (No OPeration). Χρήσιμο κυρίως για κενές γραμμές στα menu.

f.beep :
Δίνει ένα σύντομο ηχητικό σήμα.

Οι παραπάνω συναρτήσεις μπορούν να εκτελεστούν μέσω απλών πατημάτων των πλήκτρων του ποντικιού ή του πληκτρολόγιου. Η σύνταξη που ακολουθείται για τον ορισμό των δεσμεύσεων είναι:

	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
	}

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