aus dem 9. Teil in die RISC OS C-Programmierung: Symbole und Ereignisbehandlung: Pollmaske.
Alle Listings können heruntergeladen werden.
/* Programm berechnet den Wert der Pollmaske (dezimal) program calculates the value for the poll mask (in decimal) Alexander Ausserstorfer, 08.01.2017 */ #include "oslib/wimp.h" #include "oslib/wimpspriteop.h" /* wimpspriteop_AREA */ #include "oslib/hourglass.h" #include "oslib/os.h" /* read_monotonic_timer */ #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, "Pollmaske", NULL, &version_out); /* Lege Datenblock für Fenster + Symbol an install data block for window and icon */ wimp_window *window; window = malloc(sizeof(wimp_window) + 15*sizeof(wimp_icon)); window->visible.x0 = 500; window->visible.y0 = 200; window->visible.x1 = 1100; window->visible.y1 = 1100; 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 = -1000; window->extent.x1 = 900; 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, "Pollmaske", 12); window->icon_count = 15; window->xmin = 0; window->ymin = 0; window->icons[0].extent.x0 = 130; window->icons[0].extent.y0 = -55; window->icons[0].extent.x1 = 390; window->icons[0].extent.y1 = -5; window->icons[0].flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_ICON_BORDER; char pollspeed[12] = "0x0"; window->icons[0].data.indirected_text.text = pollspeed; window->icons[0].data.indirected_text.validation = "R2"; window->icons[0].data.indirected_text.size = 12; window->icons[1].extent.x0 = 10; window->icons[1].extent.y0 = -55; window->icons[1].extent.x1 = 120; window->icons[1].extent.y1 = -5; window->icons[1].flags = wimp_ICON_TEXT | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT; strcpy (window->icons[1].data.text, "mask = "); window->icons[2].extent.x0 = 10; window->icons[2].extent.y0 = -115; window->icons[2].extent.x1 = 500; window->icons[2].extent.y1 = -60; 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; char option_1[] = "wimp_MASK_NULL"; char valid_option_box[15] = "Soptoff,opton"; window->icons[2].data.indirected_text_and_sprite.text = option_1; window->icons[2].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[2].data.indirected_text_and_sprite.size = strlen(option_1); window->icons[3].extent.x0 = 10; window->icons[3].extent.y0 = -180; window->icons[3].extent.x1 = 500; window->icons[3].extent.y1 = -125; 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; char option_2[] = "wimp_QUEUE_REDRAW"; window->icons[3].data.indirected_text_and_sprite.text = option_2; window->icons[3].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[3].data.indirected_text_and_sprite.size = strlen(option_2); window->icons[4].extent.x0 = 10; window->icons[4].extent.y0 = -245; window->icons[4].extent.x1 = 500; window->icons[4].extent.y1 = -190; window->icons[4].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; char option_3[] = "wimp_MASK_LEAVING"; window->icons[4].data.indirected_text_and_sprite.text = option_3; window->icons[4].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[4].data.indirected_text_and_sprite.size = strlen(option_3); window->icons[5].extent.x0 = 10; window->icons[5].extent.y0 = -310; window->icons[5].extent.x1 = 500; window->icons[5].extent.y1 = -255; window->icons[5].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; char option_4[] = "wimp_MASK_ENTERING"; window->icons[5].data.indirected_text_and_sprite.text = option_4; window->icons[5].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[5].data.indirected_text_and_sprite.size = strlen(option_4); window->icons[6].extent.x0 = 10; window->icons[6].extent.y0 = -375; window->icons[6].extent.x1 = 500; window->icons[6].extent.y1 = -320; window->icons[6].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; char option_5[] = "wimp_QUEUE_MOUSE"; window->icons[6].data.indirected_text_and_sprite.text = option_5; window->icons[6].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[6].data.indirected_text_and_sprite.size = strlen(option_5); window->icons[7].extent.x0 = 10; window->icons[7].extent.y0 = -440; window->icons[7].extent.x1 = 500; window->icons[7].extent.y1 = -385; window->icons[7].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; char option_6[] = "wimp_QUEUE_KEY"; window->icons[7].data.indirected_text_and_sprite.text = option_6; window->icons[7].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[7].data.indirected_text_and_sprite.size = strlen(option_6); window->icons[8].extent.x0 = 10; window->icons[8].extent.y0 = -505; window->icons[8].extent.x1 = 500; window->icons[8].extent.y1 = -450; window->icons[8].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; char option_7[] = "wimp_MASK_LOSE"; window->icons[8].data.indirected_text_and_sprite.text = option_7; window->icons[8].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[8].data.indirected_text_and_sprite.size = strlen(option_7); window->icons[9].extent.x0 = 10; window->icons[9].extent.y0 = -570; window->icons[9].extent.x1 = 500; window->icons[9].extent.y1 = -515; window->icons[9].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; char option_8[] = "wimp_MASK_GAIN"; window->icons[9].data.indirected_text_and_sprite.text = option_8; window->icons[9].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[9].data.indirected_text_and_sprite.size = strlen(option_8); window->icons[10].extent.x0 = 10; window->icons[10].extent.y0 = -635; window->icons[10].extent.x1 = 500; window->icons[10].extent.y1 = -580; window->icons[10].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; char option_9[] = "wimp_MASK_POLLWORD"; window->icons[10].data.indirected_text_and_sprite.text = option_9; window->icons[10].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[10].data.indirected_text_and_sprite.size = strlen(option_9); window->icons[11].extent.x0 = 10; window->icons[11].extent.y0 = -700; window->icons[11].extent.x1 = 500; window->icons[11].extent.y1 = -645; window->icons[11].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; char option_10[] = "wimp_MASK_ICON_LEAVING"; window->icons[11].data.indirected_text_and_sprite.text = option_10; window->icons[11].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[11].data.indirected_text_and_sprite.size = strlen(option_10); window->icons[12].extent.x0 = 10; window->icons[12].extent.y0 = -755; window->icons[12].extent.x1 = 500; window->icons[12].extent.y1 = -700; window->icons[12].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; char option_11[] = "wimp_MASK_ICON_ENTERING"; window->icons[12].data.indirected_text_and_sprite.text = option_11; window->icons[12].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[12].data.indirected_text_and_sprite.size = strlen(option_11); window->icons[13].extent.x0 = 10; window->icons[13].extent.y0 = -820; window->icons[13].extent.x1 = 500; window->icons[13].extent.y1 = -765; window->icons[13].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; char option_12[] = "wimp_MASK_MESSAGE"; window->icons[13].data.indirected_text_and_sprite.text = option_12; window->icons[13].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[13].data.indirected_text_and_sprite.size = strlen(option_12); window->icons[14].extent.x0 = 10; window->icons[14].extent.y0 = -885; window->icons[14].extent.x1 = 500; window->icons[14].extent.y1 = -830; window->icons[14].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; char option_13[] = "wimp_MASK_RECORDED"; window->icons[14].data.indirected_text_and_sprite.text = option_13; window->icons[14].data.indirected_text_and_sprite.validation = valid_option_box; window->icons[14].data.indirected_text_and_sprite.size = strlen(option_13); /* 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 pollmask = wimp_MASK_NULL | wimp_QUEUE_REDRAW | wimp_MASK_LEAVING | wimp_MASK_ENTERING | wimp_QUEUE_KEY | wimp_QUEUE_KEY | wimp_MASK_LOSE | wimp_MASK_GAIN | wimp_MASK_POLLWORD | wimp_MASK_ICON_LEAVING | wimp_MASK_ICON_ENTERING; osbool quit_pending = FALSE; wimp_poll_flags pollmask_calc = 0; wimp_block block2; /* Hauptschleife main loop */ while (!quit_pending) { /* Ereignisbehandler event handler */ event = wimp_poll(pollmask, &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: /* im folgenden wird die mittlere Taste ausgefiltert, weil sich bei ihr das Symbol nicht ändert!! below checks for the middle mouse key because this doesn't change the icons!!! */ if (block2.pointer.buttons == wimp_CLICK_SELECT | block2.pointer.buttons == wimp_CLICK_ADJUST ) { if (block2.pointer.i == 2) pollmask_calc = pollmask_calc ^ wimp_MASK_NULL; if (block2.pointer.i == 3) pollmask_calc = pollmask_calc ^ wimp_QUEUE_REDRAW; if (block2.pointer.i == 4) pollmask_calc = pollmask_calc ^ wimp_MASK_LEAVING; if (block2.pointer.i == 5) pollmask_calc = pollmask_calc ^ wimp_MASK_ENTERING; if (block2.pointer.i == 6) pollmask_calc = pollmask_calc ^ wimp_QUEUE_MOUSE; if (block2.pointer.i == 7) pollmask_calc = pollmask_calc ^ wimp_QUEUE_KEY; if (block2.pointer.i == 8) pollmask_calc = pollmask_calc ^ wimp_MASK_LOSE; if (block2.pointer.i == 9) pollmask_calc = pollmask_calc ^ wimp_MASK_GAIN; if (block2.pointer.i == 10) pollmask_calc = pollmask_calc ^ wimp_MASK_POLLWORD; if (block2.pointer.i == 11) pollmask_calc = pollmask_calc ^ wimp_MASK_ICON_LEAVING; if (block2.pointer.i == 12) pollmask_calc = pollmask_calc ^ wimp_MASK_ICON_ENTERING; if (block2.pointer.i == 13) pollmask_calc = pollmask_calc ^ wimp_MASK_MESSAGE; if (block2.pointer.i == 14) pollmask_calc = pollmask_calc ^ wimp_MASK_RECORDED; } snprintf(window->icons[0].data.indirected_text.text, (size_t)255, "0x%x", pollmask_calc); wimp_set_icon_state(block.open.w, 0, 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; }