Listing 9-7

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

Alle Listings können heruntergeladen werden.

Listing 9-7: Webradio


/* Analyse von Radioschaltern
   program analyses which radio channel is choised
   Alexander Ausserstorfer, 13.01.2017 */

#include "oslib/wimp.h"
#include "oslib/wimpspriteop.h"   /* wimpsprite_AREA */
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>                /* snprintf(...) */

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, "Webradio", NULL, &version_out);

 /* Anzahl der Symbole
    number of icons */
 int anzahl_symbole = 5;

 /* Lege Datenblock für Fenster + Symbole an
    install data block for window and icons */
 wimp_window *window;
 window = malloc(sizeof(wimp_window) + anzahl_symbole*sizeof(wimp_icon));
 window->visible.x0 = 0;
 window->visible.y0 = 200;
 window->visible.x1 = 600;
 window->visible.y1 = 500;
 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_TOGGLE_ICON | wimp_WINDOW_VSCROLL | wimp_WINDOW_SIZE_ICON | wimp_WINDOW_HSCROLL | 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 = -600;
 window->extent.x1 = 1000;
 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 = wimpspriteop_AREA;
 strncpy (window->title_data.text, "Webradio", 12);
 window->icon_count = anzahl_symbole;
 window->xmin = 0;
 window->ymin = 0;

 /* Symbol 0 erzeugt 3D-Rahmen ohne Inhalt
    icon 0 creates border without any contents */
 window->icons[0].extent.x0 = 80;
 window->icons[0].extent.y0 = -250;
 window->icons[0].extent.x1 = 520;
 window->icons[0].extent.y1 = -60;
 window->icons[0].flags = wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED;
 char text_border[] = "";
 char valid_border[] = "R4";
 window->icons[0].data.indirected_text.text = text_border;
 window->icons[0].data.indirected_text.validation = valid_border;
 window->icons[0].data.indirected_text.size = strlen(valid_border);

 window->icons[1].extent.x0 =  100;
 window->icons[1].extent.y0 = -130;
 window->icons[1].extent.x1 =  500;
 window->icons[1].extent.y1 =  -80;
 window->icons[1].flags = wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_INDIRECTED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT | wimp_BUTTON_RADIO << wimp_ICON_BUTTON_TYPE_SHIFT | wimp_ICON_SELECTED | 31 << wimp_ICON_ESG_SHIFT;
 char text_radiobutton_1[] = "Radio Tirol";
 char valid_radiobutton_1[] = "Sradiooff,radioon";
 window->icons[1].data.indirected_text_and_sprite.text = text_radiobutton_1;
 window->icons[1].data.indirected_text_and_sprite.validation = valid_radiobutton_1;
 window->icons[1].data.indirected_text_and_sprite.size = strlen(text_radiobutton_1);

 window->icons[2].extent.x0 =  100;
 window->icons[2].extent.y0 = -180;
 window->icons[2].extent.x1 =  500;
 window->icons[2].extent.y1 = -130;
 window->icons[2].flags = wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_INDIRECTED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT | wimp_BUTTON_RADIO << wimp_ICON_BUTTON_TYPE_SHIFT | 31 << wimp_ICON_ESG_SHIFT;
 char text_radiobutton_2[] = "Antenne Salzburg";
 char valid_radiobutton_2[] = "Sradiooff,radioon";
 window->icons[2].data.indirected_text_and_sprite.text = text_radiobutton_2;
 window->icons[2].data.indirected_text_and_sprite.validation = valid_radiobutton_2;
 window->icons[2].data.indirected_text_and_sprite.size = strlen(valid_radiobutton_2);

 window->icons[3].extent.x0 =  100;
 window->icons[3].extent.y0 = -230;
 window->icons[3].extent.x1 =  500;
 window->icons[3].extent.y1 =  -180;
 window->icons[3].flags = wimp_ICON_TEXT | wimp_ICON_SPRITE | wimp_ICON_INDIRECTED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT | wimp_BUTTON_RADIO << wimp_ICON_BUTTON_TYPE_SHIFT | wimp_ICON_ESG;
 char text_radiobutton_3[] = "Welle: Erdball";
 char valid_radiobutton_3[] = "Sradiooff,radioon";
 window->icons[3].data.indirected_text_and_sprite.text = text_radiobutton_3;
 window->icons[3].data.indirected_text_and_sprite.validation = valid_radiobutton_3;
 window->icons[3].data.indirected_text_and_sprite.size = strlen(text_radiobutton_3);

 window->icons[4].extent.x0 =  90;
 window->icons[4].extent.y0 =  -55;
 window->icons[4].extent.x1 =  600;
 window->icons[4].extent.y1 =   -5;
 window->icons[4].flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT;
 char sender[40] = "Sie hören jetzt Radio Tirol.";
 window->icons[4].data.indirected_text.text = sender;
 window->icons[4].data.indirected_text.validation = NULL;
 window->icons[4].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=1;
 osbool quit_pending = FALSE;
 wimp_block block2;
 int i = 1;
 int i2 = -1;
 wimp_icon_state icon_state;
 icon_state.w = block.open.w;

 /* Hauptschleife
    mein loop */
 while (!quit_pending)
    {
      /* Ereignisbehandler
         event handler */
      event = wimp_poll(mask, &block2, NULL);
      switch (event)
      {
       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_MOUSE_CLICK:
                i2 = -1;
                for ( i = 1; i < 4; i++)
                {
                   icon_state.i = i;
                   wimp_get_icon_state(&icon_state);
                   if (icon_state.icon.flags & wimp_ICON_SELECTED) i2 = i;
                }
                if (i2 == -1) snprintf(window->icons[4].data.indirected_text.text, (size_t)40, "Kein Sender gewählt.");
                if (i2 == 1) snprintf(window->icons[4].data.indirected_text.text, (size_t)40, "Sie hören jetzt Radio Tirol.");
                if (i2 == 2) snprintf(window->icons[4].data.indirected_text.text, (size_t)40, "Sie hören jetzt Antenne Salzburg.");
                if (i2 == 3) snprintf(window->icons[4].data.indirected_text.text, (size_t)40, "Sie hören jetzt Welle: Erdball.");
                wimp_set_icon_state(block.open.w, 4, 0, 0);
                break;

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

    }
 /* beende Aufgabe
    quit task */
 wimp_close_down(task_handle);
 return 0;
}