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.
-
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#RxxKap14015040004C31F020100Korrekt 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 werdenUnd dann wie folgt übersetzen:
gcc x11test.c -o x11test.c -lXt -lXawAusgabe nach click auf einen der Buttons:
$ ./x11test
Hello World 0x556b1496e040
tt: bla