wind_new() ist zumindest seltsam.
Kurz vorab: Ich habe im Quelltext von Teradesk eine Lösung gefunden. Und da sind wir auch schon bei wind_new().
Teradesk ruft andere Programme mit shel_write() auf, beendet sich aber nicht. Stattdessen werden alle Fenster geschlossen (ab AES 1.04 mit wind_new(), bei älteren Versionen in einer Schleife jeweils das oberste, bis alle geschlossen sind). Danach wird das Programm mit Pexec() gestartet und nach der Rückkehr noch einmal shel_write() mit leerem Programmnamen und zwei Null-Bytes als Kommandozeile aufgerufen.
Das funktioniert in meinem Programm auch wie gewünscht, hat aber bei Verwendung von wind_new() zwei seltsame Macken:
1. Das aufgerufene Programm lässt zunächst keine Eingabe zu (Passwort muss eingegeben werden). Erst nach einigem Herumklicken in der Menüleiste (die bis nach der Passworteingabe deaktiviert ist), sind Tastatureingaben möglich.
2. Wenn dieses Programm beendet wird, stürzt der Rechner mit einer scheinbar willkürlichen Zahl an Bomben ab.
Schließe ich die Fenster statt mit wind_new() einzeln in einer Schleife, funktioniert alles reibungslos.
...
shel_write(1, 1, 0, program, param);
wind_set(0, WF_NEWDESK, 0, 0, 0, 0);
appl_exit();
appl_init();
destroy_windows();
ret = Pexec(0, program, param, env);
shel_write(0, 1, 0, "", "\0\0");
...
void
destroy_windows()
{
short win, dummy;
wind_get(0, WF_TOP, &win, &dummy, &dummy, &dummy);
while (win > 0) {
close_window(win);
wind_delete(win);
wind_get(0, WF_TOP, &win, &dummy, &dummy, &dummy);
}
}