Listing 9-8

aus dem 9. Teil in die RISC OS C-Programmierung: Symbole und Ereignisbehandlung: Scrolltext.

Alle Listings können heruntergeladen werden.

Listing 9-8: Scrolltext


/* Fenster mit Symbol und Scrolltext
   window with icon and scrolling text
   Alexander Ausserstorfer, 14.01.2017 */

#include "oslib/wimp.h"
#include "oslib/osword.h"
#include "oslib/hourglass.h"
#include "oslib/os.h"
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main()
{

 /* melde Aufgabe beim Betriebssystem an
    report our task to WIMP */
 wimp_version_no version_out;
 wimp_t task_handle;
 task_handle=wimp_initialise(310, "Scrolltext", NULL, &version_out);

 char scrolltext[] = "+++ Herzlichen Willkommen zu meinem kleinen Seitenscroller! Dieser ist sicherlich noch sehr ineffektiv und gehört verbessert. Ich arbeite daran. Herzliche Grüße an: ARMada, Jean-Luc Schouller, Julien, Meli, Julia, CMS, ArcSite, naitsabes, Raik, Markus, hubersn, TMOS, WIMPy, Gryfelhase, GAGNews, Archive, Paul Plodder ";
 int l = strlen (scrolltext);
 int i, i2 = 0;
 char s;

 /* Lege Datenblock für Fenster + Symbol an
    install data block for window and icon */
 wimp_window *window;
 window = malloc(sizeof(wimp_window) + 1*sizeof(wimp_icon));
 window->visible.x0 = 0;
 window->visible.y0 = 200;
 window->visible.x1 = 550;
 window->visible.y1 = 350;
 window->xscroll = 0;
 window->yscroll = 0;
 window->next = wimp_TOP;
 window->flags = wimp_WINDOW_MOVEABLE | wimp_WINDOW_AUTO_REDRAW | wimp_WINDOW_BACK_ICON | wimp_WINDOW_CLOSE_ICON |wimp_WINDOW_TITLE_ICON | wimp_WINDOW_NEW_FORMAT;
 window->title_fg = wimp_COLOUR_BLACK;
 window->title_bg = wimp_COLOUR_LIGHT_GREY;
 window->work_fg =  wimp_COLOUR_BLACK;
 window->work_bg = wimp_COLOUR_VERY_LIGHT_GREY;
 window->scroll_outer = wimp_COLOUR_MID_LIGHT_GREY;
 window->scroll_inner = wimp_COLOUR_VERY_LIGHT_GREY;
 window->highlight_bg = wimp_COLOUR_CREAM;
 window->extent.x0 = 0;
 window->extent.y0 = -60;
 window->extent.x1 = 410;
 window->extent.y1 = 0;
 window->extra_flags = 0;
 window->title_flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED;
 window->work_flags = wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT;
 window->sprite_area = 0;
 strncpy (window->title_data.text, "Scrolltext", 12);
 window->icon_count = 1;
 window->xmin = 0;
 window->ymin = 0;
 char symboltext[30]="\0";
 window->icons[0].extent.x0 =  5;
 window->icons[0].extent.y0 = -55;
 window->icons[0].extent.x1 =  405;
 window->icons[0].extent.y1 =  -5;
 window->icons[0].flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_ICON_BORDER;
 window->icons[0].data.indirected_text.text = symboltext;
 window->icons[0].data.indirected_text.validation = "R2";
 window->icons[0].data.indirected_text.size = 30;

/* Erzeuge Fenster
   create window */
 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.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;

 /* mache Fenster sichtbar
    opens window */
 wimp_open_window (&(block.open));

 /* Variablen für's Pollen
    variables for polling */
 wimp_event_no event;
 wimp_poll_flags mask = wimp_MASK_LEAVING | wimp_MASK_ENTERING | wimp_QUEUE_MOUSE | wimp_QUEUE_KEY | wimp_MASK_LOSE | wimp_MASK_GAIN;
 osbool quit_pending = FALSE;
 wimp_block block2;

 /* Variable für Laufzeituhr
    variable for timer */
 os_t newtime = os_read_monotonic_time();

 /* Hauptschleife
    main loop */
 while (!quit_pending)
    {

     /* Ereignisbehandler
        event handler */
      event = wimp_poll_idle(mask, &block2, newtime+8, NULL);
      switch (event)
      {

       case wimp_NULL_REASON_CODE:

                 /* kopiere Scrolltext in Symbol */
                 for ( i = 0; i < 28; i++)
                 {
                   symboltext[i] = scrolltext[i];

                 }
                 symboltext[29] = 0;

                 /* sortiere Scrolltext um */
                 s = scrolltext[0];
                 for (i2 = 1; i2 < l; i2++)
                 {
                    scrolltext[i2-1] = scrolltext[i2];
                 }
                 scrolltext[i2-1] = s;

                 /* aktualisiere Symbol
                   update icon */
                 wimp_set_icon_state(block.open.w, 0, 0, 0);

                 /* Laufzeituhr (timer) neu auslesen
                    read timer */
                 newtime = os_read_monotonic_time();
                 break;

       case wimp_OPEN_WINDOW_REQUEST:
                wimp_open_window(&(block2.open));
                break;

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

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

 /* beende unsere Aufgabe
    stops our task */
 wimp_close_down(task_handle);
 return 0;
}