aus dem 9. Teil in die RISC OS C-Programmierung: Symbole und Ereignisbehandlung: Webradio.
Alle Listings können heruntergeladen werden.
/* 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; }