[archimedes] RISC OS & C - WIMP-Programmierung - Fragen zum nachträglichen Ändern von Symbolen

  • From: Alexander Ausserstorfer <bavariasound@xxxxxxxxxxxxxxx>
  • To: archimedes@xxxxxxxxxxxxx
  • Date: Sun, 17 Jul 2016 17:10:45 +0200

Hallo,

jetzt sind noch einige Fragen zur WIMP-Programmierung (RISC OS & C)
aufgekommen, die ich bisher nicht zufriedenstellend beantworten konnte.
Deshalb meine Fragen in die Runde.

Den bisherigen Stand der Arbeiten an den Templates (Vorlagen) findet ihr
hier:

http://home.chiemgau-net.de/ausserstorfer/Temp/wimp_load_template.zip
(23 kB)

Da die Datei so unglaublich groß ist, will ich sie nicht direkt dieser
E-Mail anhängen, um damit nicht eure Postfächer zuzumüllen.

Hier erstmal der Quellcode, zu dem Fragen aufgetaucht sind:

#include "oslib/wimp.h"
#include <stdbool.h>
#include "stdlib.h"

int main()
{

 // richte Aufgabe ein (Anmeldung an RISC OS)
 wimp_version_no version_out;
 wimp_t task_handle;
 task_handle=wimp_initialise(310,  "Hallo Welt!!!", NULL,
 &version_out);

 // Lade Vorlage
 wimp_open_template ("8_Vorlagen");

 // richte benötigte Variablen ein
 wimp_window *window;
 int used, data_used;
 char *data;
 char name[11]="main";
 int context;

 // hole Größe des benötigten Arbeitsspeichers für Fenster- // Vorlage
 context = wimp_load_template (wimp_GET_SIZE, NULL, NULL,
 wimp_NO_FONTS, name, 0, &used, &data_used);

 // reserviere benötigten Speicher
 window = malloc (used);
 data = malloc (data_used);

 // lade Vorlage in den Speicher
 context = wimp_load_template (window, data, (char const *) data +
 data_used, wimp_NO_FONTS, name,0, NULL, NULL);

 // Schließe Vorlage
 wimp_close_template ();

 // Erzeuge Fenster aus Arbeitsspeicher
 wimp_block block;
 block.open.w = wimp_create_window (window);
 block.open.visible.x0 = window->visible.x0;
 block.open.visible.y0 = window->visible.y0;
 block.open.visible.x0 = window->visible.x0;
 block.open.visible.y0 = window->visible.y0;
 block.open.visible.x1 = window->visible.x1;
 block.open.visible.y1 = window->visible.y1;
 block.open.xscroll = window->xscroll;
 block.open.yscroll = window->yscroll;
 block.open.next = window->next;

 // öffne Fenster
 wimp_open_window (&(block.open));

 // Datenblock für Symbol (Auslesen, Zustand)
 wimp_icon_state icon_state;
 icon_state.w = block.open.w;
 icon_state.i = 0;

 // Zustand des Symbols[0] auslesen
 wimp_get_icon_state(&icon_state);

 // Text des Symbols ändern
 strncpy(icon_state.icon.data.indirected_text.text , "Kernschleife\0",
 strlen(icon_state.icon.data.indirected_text.text));

 // Variablen für wimp_poll_Schleife (Kernschleife)
 wimp_event_no event;
 wimp_poll_flags mask = 1;
 osbool quit_pending = FALSE;

 // Kernschleife des Programms
 while (!quit_pending)
    {
      event = wimp_poll(mask, &block, NULL);
      switch (event)
      {
       case wimp_OPEN_WINDOW_REQUEST:
                wimp_open_window(&(block.open));
                break;

       case wimp_CLOSE_WINDOW_REQUEST:
                wimp_close_window(block.close.w);
                quit_pending = true;
                break;

        case wimp_USER_MESSAGE:
        case wimp_USER_MESSAGE_RECORDED:
           if (block.message.action == message_QUIT)
             {
                 quit_pending = true;
                 break;
             }
       }

    }
 wimp_close_down(task_handle);
 return 0;
}

Das zugehörige Template sowie das lauffähige ELF findet ihr im genannten
Link.

Meine Fragen:

1. Symbole nachträglich aktualisieren?

_Wie_ geschieht jetzt die Aktualisierung von indirekt adressierten
Inhalten von Symbolen / Icons? Wenn ich zum Beispiel _nachträglich_ den
indirekt adressierten Text eines Symbols / Icons ändere, so ändert sich
bei mir hier auch sofort der Text im Fenster auf dem Schirm. Nun ist es
aber so, dass ich in meinen Büchern und Unterlagen zu dieser Frage rein
gar nichts fand.

Gibt es auch Situationen, wo das nicht so ist, d. h. das Symbol oder das
Fenster nach der Änderung vom Programm neu auf den Schirm gezeichnet,
also von Hand aktualisiert werden muss?

2. Symbolinhalte nachträglich ändern?

Mittels der Funktion wimp_get_icon_state bekomme ich zwar eine Kopie vom
Datenblock eines Symboles / Icons in icon_state. Aber das Ändern der
dort enthaltenen Zeiger(werte) bringt natürlich nichts, weil es sich ja
nur um eine Kopie der originalen Zeiger handelt.

Das führt zu zwei weiteren Fragen:

Kann man irgendwie die originalen Zeiger herausfinden und abändern? Die
originalen Zeiger, welche auf die indirekten Inhalte eines Symbol /
Icons zeigen, müssten im Datenblock enthalten sein, welcher durch das
Laden der Vorlage / Templates und Erzeugen des Fensters entstanden ist.
Also entweder in windows oder block.

Die Zeiger des Symbols / Icons müssten damit z. B. unter

window.icon[0].data. zu finden sein.

Nun handelt es sich im vorangegangenen Programmcode aber nicht um die
Struktur windows, sondern um den _Zeiger_ *windows. Gibt es in C eine
Möglichkeit, von dieser Adresse wieder auf die Struktur des Datenblocks
zurück zu gehen, damit ich die Zeiger so in der Art von

window.icon[0].data.indirected_text.text

ansprechen kann? Irgendwie komme ich da momentan nicht drauf.

Wenn ich nicht die Adressen abändern kann oder möchte, auf welche die
originalen Zeiger des Symbols zeigen, so kann ich noch immer deren
Inhalte abändern oder überschreiben (also das, worauf die originalen
Zeiger zeigen).

Wie finde ich jetzt aber die Größe der reservierten oder benutzten
Speicher heraus? Ich kann zwar den dort enthaltenen Text auslesen bzw.
dessen Länge mit strlen ermitteln. Aber ich kann so nicht feststellen,
ob noch einige weitere Bytes zum indirekt adressierten Text gehören, die
sich nutzen lassen würden usw. Und in meiner vorhandenen Literatur
(PRMs, WIMP Programmers for all...) fand ich leider ebenfalls nichts
dazu.

Danke für etwaige Hilfestellungen!

A.


-- 
Verwahrlost aber frei
http://home.chiemgau-net.de/ausserstorfer/

Attachment: signature.asc
Description: PGP signature

Other related posts: