Software > Coding

Wie kann ich alle geöffneten Accessories schließen?

<< < (2/2)

Thorsten Otto:

--- Zitat von: mfro am Mo 30.07.2018, 22:21:47 ---GEMINI macht sich's da einfach (aber da muss man auch erst mal drauf kommen): es startet nicht direkt die auszuführende Applikation, sondern ruft zunächst shel_write() für RUNNER2.APP (eine Mini-Applikation, die nur genau das kann) aus und beendet sich dann.
--- Ende Zitat ---

Aber nur um Speicher  zu sparen, und auch nur wenn du es explizit gesagt hast (ging glaub ich durch irgendeine Einstellung in $GEMDEFAULT). Bei mir wird runner2.app jedenfalls nicht gestartet ;)

1ST1:
Ist die Funktionsweise von Runner2.app irgendwo genau dokumentiert, um das für Zwecke außerhalb von Gemini zu missbrauchen? Vielleicht könnte ich das für meinemn "progman" brauchen, der eine Erweiterung des Atari-Desktops darstellt, und dem eine Art Verknüpfung von Programmen nachrüstet. Dort habe ich nämlich das Problem, dass weder über pexec() noch über shel_write() gestartete Programme ihre Dateien (RSC usw.) finden. Bei manchen Programmen klappt es, das aktuelle Verzeichnis ist aber nicht das Programmverzeichnis, bei anderen aber nicht. Dabei habe ich damals auch versucht, den aktuellen Pfad auf den Pfad des aufgerufenen Programms zu verbiegen.

KarlMüller:

--- Zitat von: 1ST1 am Di 31.07.2018, 08:17:00 ---Ist die Funktionsweise von Runner2.app irgendwo genau dokumentiert

--- Ende Zitat ---
Musst Du in der Doku zu Gemini schauen. Ansonsten gibt es bei Thing etwas ähnliches nennt sich ThingRun. Falls es nicht so funktioniert wie gewünscht, kannst es ja umbauen, da der Quelltext vorhanden ist.

Aber zum Thema zurück:
Ich nehme an ein wind_new() ist zu brutal oder?

Count:
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.


--- Code: ---
...

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);
    }
}


--- Ende Code ---

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln