Xaw Dialog Auswertung mit "segmentation fault"



  • Ich habe folgendes Miniprogramm, um einen Dialog mit Athena Widgets zu testen.

    Aber sobald ich mit XawDialogGetValueString(XtParent(w)); auslesen will, schmiert er ab.
    Einer eine Idee ?

    #include  <X11/StringDefs.h>
    #include  <X11/Intrinsic.h>
    #include  <X11/Xaw/Box.h>
    #include  <X11/Xaw/Dialog.h>
    #include  <X11/Xaw/Command.h>
    #include  <stdio.h>
    
    void clickDialog(Widget w, XtPointer client, XtPointer call) {
        printf("Hello World %i\n", client); // Dies kommt noch richtig.
    //    char *pc  = XawDialogGetValueString(XtParent(w));
        XawDialogGetValueString(XtParent(w));  // Hier schmiert er ab.
    }
    
    int main(int argc, char **argv) {
        Widget toplevel, box,  dialog;
        toplevel = XtInitialize("Mein Fenster", "simple", NULL, 0, &argc, argv);
        box = XtCreateManagedWidget("Button Gruppe", boxWidgetClass, toplevel, NULL, 0);
    
        dialog = XtVaCreateManagedWidget("doalog", dialogWidgetClass, box, XtNlabel,"speichern ?", NULL);
        XawDialogAddButton(dialog,"Yes", clickDialog, NULL);
        XawDialogAddButton(dialog,"No", clickDialog, NULL);
    
        XtRealizeWidget(toplevel);
        XtMainLoop();
    }
    

    Ich habe nach mehreren Beispiel gegoogelt, zB. dieses hier: https://www.softintegration.com/chhtml/toolkit/demos/X11/xtmotif/ch13/xdialog.html
    Auch das schmiert ab.



  • @Mathuas

    Kann w null oder was Äquivalentes sein?
    Kann XtParent(...) null oder was Äquivalentes zurückgeben?



  • Kann XtParent(...) null oder was Äquivalentes zurückgeben?

    Ich habe folgendes versucht und nach meiner Meinung, kommen die Pointer richtig raus.

    void clickDialog(Widget w, XtPointer client, XtPointer call) {
        printf("Hello World %i\n", client);
    //    char *pc  = XawDialogGetValueString(XtParent(w));
        printf("widget: %i\n", w);
        printf("widget->Parent: %i\n", XtParent(w));
        //XawDialogGetValueString(XtParent(w));
    }
    ....
        dialog = XtVaCreateManagedWidget("doalog", dialogWidgetClass, box, XtNlabel,"speichern ?", NULL);
        printf("dialog: %i\n", dialog);
    

    Ausgabe:

    dialog: 2128104352
    Hello World 0
    widget: 2128134240
    widget->Parent: 2128104352
    Hello World 1
    widget: 2128135408
    widget->Parent: 2128104352
    
    


  • Problem ist dass im Dialog kein Wert als "ValueString" hinterlegt ist. Das auch in dem motif xdialg beispiel das auch crash könnte daran liegen, dass das beispiel veraltet ist. Denn laut dem code soll da der user was eingeben können nur ist da nichts sichtbar weil kein Wert gesetzt wird (nicht mal emtpy string)

    siehe auch folgendes beispiel:
    https://openbook.rheinwerk-verlag.de/linux_unix_programmierung/Kap14-015.htm#RxxKap14015040004C31F020100

    Korrekt ist es wie folgt
    x11test.c:

    #include  <X11/StringDefs.h>
    #include  <X11/Intrinsic.h>
    #include  <X11/Xaw/Box.h>
    #include  <X11/Xaw/Dialog.h>
    #include  <X11/Xaw/Command.h>
    #include  <stdio.h>
    
    void clickDialog(Widget w, XtPointer client, XtPointer call) {
    printf("Hello World %p\n", w);
            String pc  = XawDialogGetValueString(XtParent(w));
            printf("tt: %s\n", pc);
    }
    
    int main(int argc, char **argv) {
        Widget toplevel, box,  dialog;
        toplevel = XtInitialize("Mein Fenster", "simple", NULL, 0, &argc, argv);
        box = XtCreateManagedWidget("Button Gruppe", boxWidgetClass, toplevel, NULL, 0);
    
        dialog = XtVaCreateManagedWidget("doalog", dialogWidgetClass, box, XtNlabel,"speichern ?", XtNvalue, (XtArgVal) "bla",NULL);
        XawDialogAddButton(dialog,"Yes", clickDialog, NULL);
        XawDialogAddButton(dialog,"No", clickDialog, NULL);
    
        XtRealizeWidget(toplevel);
        XtMainLoop();
    }
    

    Durch XtNValue, (XtArgVal) "bla" wird dann im Dialog ein eingabefeld angezeigt und der wert, der in diesem feld steht kann dann via XawDialogGetValueString ausgelesen werden

    Und dann wie folgt übersetzen:
    gcc x11test.c -o x11test.c -lXt -lXaw

    Ausgabe nach click auf einen der Buttons:

    $ ./x11test
    Hello World 0x556b1496e040
    tt: bla


Anmelden zum Antworten