/* Copyright 1996 Acorn Computers Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /************************************************************************/ /* © Acorn Computers Ltd, 1992. */ /* */ /* This file forms part of an unsupported source release of RISC_OSLib. */ /* */ /* It may be freely used to create executable images for saleable */ /* products but cannot be sold in source form or as an object library */ /* without the prior written consent of Acorn Computers Ltd. */ /* */ /* If this file is re-distributed (even if modified) it should retain */ /* this copyright notice. */ /* */ /************************************************************************/ /* Title: c.wimp * Purpose: C interface to RISC OS Wimp routines * History: IDJ: 07-Feb-92: prepared for source release */ #define BOOL int #define TRUE 1 #define FALSE 0 #include #include #include #include "os.h" #include "trace.h" #ifndef __wimp_h #define __WIMP_COMPILE #include "wimp.h" #endif /* W I M P S W I 's */ #define Initialise 0x000400C0 #define CreateWindow 0x000400C1 #define CreateIcon 0x000400C2 #define DeleteWindow 0x000400C3 #define DeleteIcon 0x000400C4 #define OpenWindow 0x000400C5 #define CloseWindow 0x000400C6 #define Poll 0x000400C7 #define RedrawWindow 0x000400C8 #define UpdateWindow 0x000400C9 #define GetRectangle 0x000400CA #define GetWindowState 0x000400CB #define GetWindowInfo 0x000400CC #define SetIconState 0x000400CD #define GetIconState 0x000400CE #define GetPointerInfo 0x000400CF #define DragBox 0x000400D0 #define ForceRedraw 0x000400D1 #define SetCaretPosition 0x000400D2 #define GetCaretPosition 0x000400D3 #define CreateMenu 0x000400D4 #define DecodeMenu 0x000400D5 #define WhichIcon 0x000400D6 #define SetExtent 0x000400D7 #define SetPointerShape 0x000400D8 #define OpenTemplate 0x000400D9 #define CloseTemplate 0x000400DA #define LoadTemplate 0x000400DB #define ProcessKey 0x000400DC #define CloseDown 0x000400DD #define StartTask 0x000400DE #define ReportError 0x000400DF #define AutoScroll 0x000400FD #define GetWindowOutline (0x000400c0+32) #define PollIdle (0x000400c0+33) #define PlotIcon (0x000400c0+34) #define SetMode (0x000400c0+35) #define SetPalette (0x000400c0+36) #define ReadPalette (0x000400c0+37) #define SetColour (0x000400c0+38) #define SendMessage (0x000400c0+39) #define CreateSubMenu (0x000400c0+40) #define SpriteOp (0x000400c0+41) #define BaseOfSprites (0x000400c0+42) #define BlockCopy (0x000400c0+43) #define SlotSize (0x000400c0+44) #define ReadPixTrans (0x000400c0+45) #define ClaimFreeMemory (0x000400c0+46) #define CommandWindow (0x000400c0+47) #define TextColour (0x000400c0+48) #define TransferBlock (0x000400c0+49) #define ReadSysInfo (0x000400c0+50) #define SetFontColours (0x000400c0+51) #pragma -s1 #ifndef UROM os_error *wimp_initialise (int *v) { os_regset r; os_error *e; r.r[0] = 120; e = os_swix(Initialise, &r); *v = r.r[0]; return e; } #endif #pragma -s0 #ifndef UROM os_error *wimp_taskinit (char *name, int *version, wimp_t *t, wimp_msgaction *messages) { os_regset r; os_error *e; r.r [0] = *version; r.r [1] = *(int *) "TASK"; r.r [2] = (int) name; r.r [3] = (int) messages; e = os_swix (Initialise, &r); if (*version >= 300) free (messages); if (e == NULL) { *version = r.r [0]; *t = r.r [1]; } return e; } #endif #pragma -s1 os_error * wimp_create_wind(wimp_wind * w, wimp_w * result) { os_regset r; os_error *e; r.r[1] = (int)w; e = os_swix(CreateWindow, &r); *result = r.r[0]; return(e); } os_error * wimp_create_icon(wimp_icreate * i, wimp_i * result) { os_regset r; os_error *e; r.r[1] = (int)i; e = os_swix(CreateIcon, &r); *result = r.r[0]; return(e); } os_error * wimp_delete_wind(wimp_w w) { os_regset r; os_error *e; r.r[1] = (int)&w; e = os_swix(DeleteWindow, &r); return(e); } os_error * wimp_delete_icon(wimp_w w, wimp_i i) { os_regset r; os_error *e; int j[2]; j[0] = (int)w; j[1] = (int)i; r.r[1] = (int) j; e = os_swix(DeleteIcon, &r); return(e); } os_error * wimp_open_wind(wimp_openstr * o) { os_regset r; os_error *e; r.r[1] = (int)o; e = os_swix(OpenWindow, &r); return(e); } os_error * wimp_close_wind(wimp_w w) { os_regset r; os_error *e; r.r[1] = (int)&w; e = os_swix(CloseWindow, &r); return(e); } os_error * wimp_redraw_wind(wimp_redrawstr * wr, int * result) { os_regset r; os_error *e; r.r[1] = (int)wr; e = os_swix(RedrawWindow, &r); *result = r.r[0]; return(e); } os_error * wimp_update_wind(wimp_redrawstr * wr, int * result) { os_regset r; os_error *e; r.r[1] = (int)wr; e = os_swix(UpdateWindow, &r); *result = r.r[0]; return(e); } os_error * wimp_get_rectangle(wimp_redrawstr * wr, int * result) { os_regset r; os_error *e; r.r[1] = (int)wr; e = os_swix(GetRectangle, &r); *result = r.r[0]; return(e); } os_error * wimp_get_wind_state(wimp_w w, wimp_wstate * result) { os_regset r; os_error *e; result->o.w = w; r.r[1] = (int)result; e = os_swix(GetWindowState, &r); return(e); } os_error * wimp_get_wind_info(wimp_winfo * result) { os_regset r; os_error *e; r.r[1] = (int)result; e = os_swix(GetWindowInfo, &r); return(e); } typedef struct { wimp_w wind_h; wimp_i icon_h; wimp_iconflags flags_v; wimp_iconflags flags_m; } wimp_handles_and_flags; os_error * wimp_set_icon_state(wimp_w w, wimp_i i, wimp_iconflags value, wimp_iconflags mask) { os_regset r; os_error *e; wimp_handles_and_flags b; b.wind_h = w; b.icon_h = i; b.flags_v = value; b.flags_m = mask; r.r[1] = (int)&b; e = os_swix(SetIconState, &r); return(e); } typedef struct { wimp_w wind_h; wimp_i icon_h; wimp_icon icon_s; } wimp_icon_and_handles; os_error * wimp_get_icon_info(wimp_w w, wimp_i i, wimp_icon * result) { os_regset r; os_error *e; wimp_icon_and_handles b; b.wind_h = w; b.icon_h = i; r.r[1] = (int)&b; e = os_swix(GetIconState, &r); *result = b.icon_s; return(e); } typedef struct { wimp_mousestr m; int dud; } mstr; os_error * wimp_get_point_info(wimp_mousestr * result) { os_regset r; os_error *e; mstr m; r.r[1] = (int)&m; e = os_swix(GetPointerInfo, &r); *result = m.m; return(e); } os_error * wimp_drag_box(wimp_dragstr * d) { os_regset r; os_error *e; r.r[1] = (int)d; e = os_swix(DragBox, &r); return(e); } os_error * wimp_force_redraw(wimp_redrawstr * r) { os_error *e; e = os_swix(ForceRedraw, (os_regset *)r); return(e); } os_error * wimp_set_caret_pos(wimp_caretstr * c) { os_error *e; e = os_swix(SetCaretPosition, (os_regset *)c); return(e); } os_error * wimp_get_caret_pos(wimp_caretstr * c) { os_regset r; os_error *e; r.r[1] = (int)c; e = os_swix(GetCaretPosition, &r); return(e); } os_error * wimp_create_menu(wimp_menustr * m, int x, int y) { os_regset r; os_error *e; r.r[1] = (int)m; r.r[2] = x; r.r[3] = y; e = os_swix(CreateMenu, &r); return(e); } #ifndef UROM os_error * wimp_decode_menu(wimp_menustr * m, void * p1, void * p2) { os_regset r; os_error *e; r.r[1] = (int)m; r.r[2] = (int)p1; r.r[3] = (int)p2; e = os_swix(DecodeMenu, &r); return(e); } #endif os_error * wimp_which_icon(wimp_which_block * w, wimp_i * results) { os_regset r; os_error *e; r.r[0] = w->window; r.r[2] = w->bit_mask; r.r[3] = w->bit_set; r.r[1] = (int)results; e = os_swix(WhichIcon, &r); return(e); } os_error * wimp_set_extent(wimp_redrawstr * wr) { os_regset r; os_error *e; r.r[0] = wr->w; r.r[1] = (int)wr + 4; e = os_swix(SetExtent, &r); return(e); } #ifndef UROM os_error * wimp_set_point_shape(wimp_pshapestr * p) { os_error *e; e = os_swix(SetPointerShape, (os_regset *)p); return(e); } #endif os_error * wimp_open_template(char * name) { os_regset r; os_error *e; r.r[1] = (int)name; e = os_swix(OpenTemplate, &r); return(e); } os_error * wimp_close_template(void) { os_regset r; os_error *e; e = os_swix(CloseTemplate, &r); return(e); } os_error * wimp_load_template(wimp_template * t) { os_error *e; e = os_swix(LoadTemplate, (os_regset *)t); return(e); } os_error *wimp_processkey(int chcode) { return os_swi1(ProcessKey, chcode); } #ifndef UROM os_error * wimp_closedown(void) { os_regset r; os_error *e; e = os_swix(CloseDown, &r); return(e); } #endif os_error * wimp_taskclose(wimp_t t) { os_regset r; os_error *e; r.r[0] = t; r.r[1] = 'T' + ('A' << 8) + ('S' << 16) + ('K' << 24); e = os_swix(CloseDown, &r); return e; } os_error *wimp_starttask(char *clicmd) { os_regset r; os_error *e; r.r[0] = (int) clicmd; e = os_swix(StartTask, &r); return e; } os_error *wimp_getwindowoutline(wimp_redrawstr *re) { os_regset r; os_error *e; r.r[1] = (int) re; e = os_swix(GetWindowOutline, &r); return e; } os_error *wimp_ploticon(wimp_icon* i) { os_regset r; os_error *e; r.r[1] = (int) i; e = os_swix(PlotIcon, &r); return e; } #ifndef UROM os_error *wimp_setmode(int mode) { os_regset r; os_error *e; r.r[0] = mode; e = os_swix(SetMode, &r); return e; } #endif os_error *wimp_readpalette(wimp_palettestr* p) { os_regset r; os_error *e; r.r[1] = (int) p; r.r[2] = *(int *) "TRUE"; e = os_swix(ReadPalette, &r); return e; } #ifndef UROM os_error *wimp_setpalette(wimp_palettestr* p) { os_regset r; os_error *e; r.r[1] = (int) p; e = os_swix(SetPalette, &r); return e; } #endif os_error *wimp_setcolour(int colour) { os_regset r; os_error *e; r.r[0] = colour; e = os_swix(SetColour, &r); return e; } #ifndef UROM sprite_area *wimp_baseofsprites(void) { os_regset r; os_error *e; e = os_swix(BaseOfSprites, &r); return (sprite_area *) r.r[1]; } #endif #ifndef UROM sprite_area *wimp_baseofromsprites(void) { os_regset r; os_error *e; e = os_swix(BaseOfSprites, &r); return (sprite_area *) r.r[0]; } #endif os_error *wimp_blockcopy(wimp_w w, wimp_box *source, int x, int y) { os_regset r; r.r[0] = w; r.r[1] = source->x0; r.r[2] = source->y0; r.r[3] = source->x1; r.r[4] = source->y1; r.r[5] = x; r.r[6] = y; return os_swix(BlockCopy, &r); } os_error *wimp_autoscroll(int flags, wimp_autoscrollblk *block, int *status) { os_regset r; os_error *e; r.r[0] = flags; r.r[1] = (int) block; e = os_swix(AutoScroll, &r); if (status && e == NULL) { *status = r.r[0]; } return(e); } os_error *wimp_reporterror(os_error* er, wimp_errflags flags, char *name) { return os_swi3(os_X | ReportError, (int) er, flags, (int) name); } os_error *wimp_sendmessage(wimp_etype code, wimp_msgstr* m, wimp_t dest) { return os_swi3(os_X | SendMessage, code, (int) m, dest); } os_error *wimp_sendwmessage( wimp_etype code, wimp_msgstr* m, wimp_w w, wimp_i i) { return os_swi4(os_X | SendMessage, code, (int) m, w, i); } os_error *wimp_create_submenu(wimp_menustr *sub, int x, int y) { os_regset r; os_error *e; r.r[1] = (int) sub; r.r[2] = x; r.r[3] = y; e = os_swix(CreateSubMenu, &r); return e; } os_error *wimp_slotsize(int *currentslot /*inout*/, int *nextslot /*inout*/, int *freepool /*out*/) { os_error *e; e = os_swi3r(SlotSize, *currentslot, *nextslot, 0, currentslot, nextslot, freepool); return e; } os_error *wimp_transferblock( wimp_t sourcetask, char *sourcebuf, wimp_t desttask, char *destbuf, int buflen) { os_regset regs ; regs.r[0] = sourcetask ; regs.r[1] = (int) sourcebuf ; regs.r[2] = desttask ; regs.r[3] = (int) destbuf ; regs.r[4] = buflen ; regs.r[5] = 0 ; return os_swix(TransferBlock, ®s) ; } os_error *wimp_spriteop(int reason_code, char *name) { os_regset r ; r.r[0] = reason_code ; r.r[2] = (int) name ; return os_swix(SpriteOp, &r) ; } os_error *wimp_spriteop_full(os_regset *r) { return os_swix(SpriteOp, r) ; } os_error *wimp_setfontcolours(int foreground, int background) { return os_swi3(os_X | SetFontColours, 0, background, foreground); } os_error *wimp_readpixtrans(sprite_area *area, sprite_id *id, sprite_factors *factors, sprite_pixtrans *pixtrans) { os_regset r; os_error *e; if ((area == sprite_mainarea) || (area == wimp_spritearea)) { r.r[0] = 0x0000; r.r[2] = (int) id->s.name; } else if ((id->tag) == sprite_id_name) { r.r[0] = 0x0100; r.r[2] = (int) id->s.name; } else if ((id->tag) == sprite_id_addr) { r.r[0] = 0x0200; r.r[2] = (int) id->s.addr; } r.r[1] = (int) area; r.r[6] = (int) factors; r.r[7] = (int) pixtrans; e = os_swix(ReadPixTrans, &r); return(e); } #ifndef UROM os_error *wimp_commandwindow(wimp_commandwind commandwindow) { os_regset r; os_error *e; switch (commandwindow.tag) { case wimp_command_TITLE: r.r[0] = (int) commandwindow.title; break; case wimp_command_ACTIVE: r.r[0] = 1; break; case wimp_command_CLOSE_PROMPT: r.r[0] = 0; break; case wimp_command_CLOSE_NOPROMPT: r.r[0] = -1; break; } e = os_swix(CommandWindow, &r); return(e); } #endif #pragma -s0 /* end */