aus dem 9. Teil in die RISC OS C-Programmierung: Symbole und Ereignisbehandlung: Fensterkoordinaten.
Alle Listings können heruntergeladen werden.
/* Programm öffnet Fenster und zeigt die aktuellen Koordinaten des Fensters an
program opens window and shows the current coordinates of the task's window
Alexander Ausserstorfer, 08.01.2017 */
#include "oslib/wimp.h"
#include "oslib/hourglass.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, "Fenster", 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) +8*sizeof(wimp_icon));
window->visible.x0 = 0;
window->visible.y0 = 200;
window->visible.x1 = 600;
window->visible.y1 = 550;
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 = 600;
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, "Fenster", 12);
window->icon_count = 8;
window->xmin = 0;
window->ymin = 0;
window->icons[0].extent.x0 = 200;
window->icons[0].extent.y0 = -150;
window->icons[0].extent.x1 = 300;
window->icons[0].extent.y1 = -98;
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 x0_koordinate[12];
window->icons[0].data.indirected_text.text = x0_koordinate;
snprintf(window->icons[0].data.indirected_text.text, (size_t)255, "%d", window->visible.x0);
window->icons[0].data.indirected_text.validation = "R2";
window->icons[0].data.indirected_text.size = 12;
window->icons[1].extent.x0 = 420;
window->icons[1].extent.y0 = -150;
window->icons[1].extent.x1 = 520;
window->icons[1].extent.y1 = -98;
window->icons[1].flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_ICON_BORDER;
char y0_koordinate[12];
window->icons[1].data.indirected_text.text = y0_koordinate;
snprintf(window->icons[1].data.indirected_text.text, (size_t)255, "%d", window->visible.y0);
window->icons[1].data.indirected_text.validation = "R2";
window->icons[1].data.indirected_text.size = 12;
window->icons[2].extent.x0 = 200;
window->icons[2].extent.y0 = -250;
window->icons[2].extent.x1 = 300;
window->icons[2].extent.y1 = -198;
window->icons[2].flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_ICON_BORDER;
char x1_koordinate[12];
window->icons[2].data.indirected_text.text = x1_koordinate;
snprintf(window->icons[2].data.indirected_text.text, (size_t)255, "%d", window->visible.x1);
window->icons[2].data.indirected_text.validation = "R2";
window->icons[2].data.indirected_text.size = 12;
window->icons[3].extent.x0 = 420;
window->icons[3].extent.y0 = -250;
window->icons[3].extent.x1 = 520;
window->icons[3].extent.y1 = -198;
window->icons[3].flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT | wimp_ICON_BORDER;
char y1_koordinate[12];
window->icons[3].data.indirected_text.text = y1_koordinate;
snprintf(window->icons[3].data.indirected_text.text, (size_t)255, "%d", window->visible.y1);
window->icons[3].data.indirected_text.validation = "R2";
window->icons[3].data.indirected_text.size = 12;
window->icons[4].extent.x0 = 100;
window->icons[4].extent.y0 = -150;
window->icons[4].extent.x1 = 200;
window->icons[4].extent.y1 = -98;
window->icons[4].flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT;
strcpy (window->icons[4].data.text, "x0:");
window->icons[5].extent.x0 = 320;
window->icons[5].extent.y0 = -150;
window->icons[5].extent.x1 = 420;
window->icons[5].extent.y1 = -98;
window->icons[5].flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT;
strcpy (window->icons[5].data.text, "y0:");
window->icons[6].extent.x0 = 100;
window->icons[6].extent.y0 = -250;
window->icons[6].extent.x1 = 200;
window->icons[6].extent.y1 = -198;
window->icons[6].flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT;
strcpy (window->icons[6].data.text, "x1:");
window->icons[7].extent.x0 = 320;
window->icons[7].extent.y0 = -250;
window->icons[7].extent.x1 = 420;
window->icons[7].extent.y1 = -198;
window->icons[7].flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT;
strcpy (window->icons[7].data.text, "y1:");
/* 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 to screen */
wimp_open_window (&(block.open));
/* Datenblock zum Rücklegen von Informationen über den Mauszeiger
data block für mouse values*/
wimp_pointer pointer;
/* Variablen für's Pollen
variables for polling */
wimp_event_no event;
wimp_poll_flags mask = wimp_MASK_NULL | wimp_QUEUE_REDRAW | wimp_MASK_LEAVING | wimp_MASK_ENTERING | wimp_QUEUE_MOUSE | 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_block block2;
/* Hauptschleife
main loop */
while (!quit_pending)
{
/* Ereignisbehandler
event handler */
event = wimp_poll(mask, &block2, NULL);
switch (event)
{
case wimp_OPEN_WINDOW_REQUEST:
/* Wandle Fenster-Koordinaten in Text und schreibe diese into die Symbole
converts position values of window to text and write these to the icons */
snprintf(window->icons[0].data.indirected_text.text, (size_t)255, "%d", block2.open.visible.x0);
wimp_set_icon_state(block.open.w, 0, 0, 0);
snprintf(window->icons[1].data.indirected_text.text, (size_t)255, "%d", block2.open.visible.y0);
wimp_set_icon_state(block.open.w, 1, 0, 0);
snprintf(window->icons[2].data.indirected_text.text, (size_t)255, "%d", block2.open.visible.x1);
wimp_set_icon_state(block.open.w, 2, 0, 0);
snprintf(window->icons[3].data.indirected_text.text, (size_t)255, "%d", block2.open.visible.y1);
wimp_set_icon_state(block.open.w, 3, 0, 0);
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
stop our task */
wimp_close_down(task_handle);
return 0;
}