4.5 CALLBACKS


Μέχρι στιγμής στο κεφάλαιο αυτό αναφερθήκαμε στην δημιουργία των widgets. Στις επόμενες παραγράφους θα αναφερθούμε στον τρόπο με τον οποίο μπορούμε να "ζωντανέψουμε" τα widgets, έτσι ώστε να αντιδρούν στα διάφορα μηνύματα από το περιβάλλον και να υπακούουν στις προσταγές του προγραμματιστή.

Για το σκοπό αυτό κάθε 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 συναρτήσεις που καλύπτουν όλες τις λειτουργίες τους. Δεν είναι όμως αναγκαία η συμπλήρωση όλων, παρά μόνο εκείνων που επιθυμεί ο προγραμματιστής.


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