Για το σκοπό αυτό κάθε widget υποστηρίζει ένα συγκεκριμένο αριθμό callback
συναρτήσεων. Οι συναρτήσεις callback είναι συναρτήσεις που γράφονται από τον
προγραμματιστή και καλούνται αυτόματα από τα widgets όταν πληρούνται κάποιες
συνθήκες. Για παράδειγμα το push button ορίζει την callback συνάρτηση
ΧmNarmCallback
η οποία καλείται όταν όταν πατηθεί το button. Για την ορισμό
μιας συνάρτησης ως callback συνάρτησης ενός widget χρησιμοποιούμε τη
συνάρτηση ΧtAddCallback
:
XtAddCallback( Widget widget, char* callback_name, XtCallbackProc callback, XtPointer client_data );Η
XtAddCallback
λαμβάνει ως πρώτο όρισμα το widget στο οποίο συνδέουμε τη
νέα callback συνάρτηση, ως δεύτερο όρισμα τον τύπο της (για παράδειγμα
ΧmNarmCallback
), ως τρίτο όρισμα το όνομα της συνάρτησης που θα
χρησιμοποιηθεί ως callback και τέλος ως τέταρτο όρισμα κάποια δεδομένα που
επιθυμούμε να περνούν ως ορίσματα στην callback συνάρτηση.
Η callback συνάρτηση που γράφεται από τον προγραμματιστή πρέπει να έχει να λαμβάνει πάντα ένα συγκεκριμένο αριθμό και τύπο ορισμάτων:
void callback( Widget widget, caddr_t client_data, caddr_t call_data );Το πρώτο όρισμα είναι το widget που καλεί την callback, το δεύτερο όρισμα (client_data) είναι τα δεδομένα που έχουν οριστεί στην
XtAddCallback
να
περνούν ως ορίσματα στην callback και τελος το τρίτο όρισμα είναι ορισμένα
δεδομένα που περνάει το widget στην callback. Τα δεδομένα αυτά έχουν σχέση
με το γεγονός (event) που προκάλεσε την κλήση της callback από το widget.
Ανάμεσα στις άλλες πληροφορίες που περιέχουν (και οι οποίες ποικίλουν
ανάλογα με τον τύπο του widget) είναι και η δομή XEvent
του γεγονότος.
Στο παρακάτω παράδειγμα κώδικα προσθέτουμε στο pbwidget
, που θεωρούμε ότι
είναι push button, την callback συνάρτηση set2zero
, η οποία μηδενίζει την
μεταβλητή counter
, για την περίπτωση που πατηθεί το button:
Widget pbwidget; int counter; . . . XtAddCallback( pbwidget, ΧmNarmCallback, set2zero, &counter); . . . set2zero( w, number, call_data) Widget w; int* number; caddr_t call_data; { printf("Push Button Widget was pressed. Counter set to zero.\n); *number = 0; }Τα widget έχουν την δυνατότητα να αποκτήσουν αρκετές διαφορετικές callback συναρτήσεις που καλύπτουν όλες τις λειτουργίες τους. Δεν είναι όμως αναγκαία η συμπλήρωση όλων, παρά μόνο εκείνων που επιθυμεί ο προγραμματιστής.