4.6 EVENT HANDLERS


Εκτός από τις callback συναρτήσεις το Xtoolkit υποστηρίζει και ένα παραπλήσιο τύπο συναρτήσεων τις eventhandler συναρτήσεις. Οι συναρτήσεις αυτές αντί να συνδέονται σε κάποιο widget, συνδέονται απευθείας σε κάποιο γεγονός (event) όπως αυτά περιγράφηκαν στο τρίτο κεφάλαιο. Μπορούμε για παράδειγμα να ορίσουμε μια συνάρτηση η οποία να καλείται αυτόματα όταν θα πατιέται το κουμπί του ποντικιού. Για τον ορισμό των eventhandler συναρτήσεων υπάρχει η συνάρτηση XtAddEventHandler:

    XtAddEventHandler(
        Widget         widget,
        EventMask      event_mask,
        _XtBoolean     nonmaskable,
        XtEventHandler eventhandler,
        XtPointer      call_data
    );
Το πρώτο όρισμα της XtAddEventHandler είναι το widget μέσα στο οποίο λαμβάνει χώρα το γεγονός (ή αλλιώς το παράθυρο του widget). Το δεύτερο όρισμα είναι το γεγονός (ή τα γεγονότα) για το οποίο θέλουμε να καλείται η eventhandler συνάρτηση. Στο όρισμα αυτό χρησιμοποιούμε τους ίδιους συμβολισμούς με την XSelectInput της Xlib (π.χ. ButtonPressMask). Το τρίτο όρισμα έχει σχέση με τα nonmaskable events που αναλύονται εδώ, μια τιμή FALSE είναι αρκετή. Το τέταρτο όρισμα είναι η συνάρτηση που θα καλείται όταν συμβαίνει το γεγονός και τέλος το πέμπτο όρισμα είναι κάποια δεδομένα που ίσως θέλουμε να περνούν στην eventhandler συνάρτηση κατά την κλήση. Σε περίπτωση που δεν θέλουμε να περάσουμε δεδομένα βάζουμε την τιμή NULL (ισχθει και για την XtAddCallback).

Οι eventhandler συναρτήσεις, όπως και οι callback, λαμβάνουν συγκεκριμένο αριθμό και τύπο ορισμάτων:

    void eventhandler( 
             Widget   widget,
             caddr_t  client_data,
             XEvent*  event
         );
Τα ορίσματα αυτά είναι το widget που κάλεσε την eventhandler συνάρτηση, τα δεδομένα που ορίσαμε να στέλνονται στην eventhandler και τέλος η δομή XEvent του γεγονότος που προκάλεσε την κλήση. Ένα παράδειγμα ορισμού συνάρτησης ως eventhandler φαίνεται στο παρακάτω απόσπασμα κώδικα, στο οποίο κάθε φορά που πατιέται ένα κουμπί του ποντικιού μέσα στην περιοχή του widget areawidget αυξάνεται κατά ένα η τιμή της μεταβλητής counter:

    Widget  areawidget;
    int     counter = 0;
    .
    .
    .
    XtAddEventHandler( areawidget, ButtonPressMask,
                       FALSE, addone, &counter);
    .
    .
    .
    
    addone( w, number, event)
    Widget  w;
    int*    number;
    XEvent *event;
    {
        printf("Mouse Button was pressed once more. Increasing counter.\n);
        *number++;
    }

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