Listing 9-6

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

Alle Listings können heruntergeladen werden.

Listing 9-6: Pollmaske


/* 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;
}