Source
...
Target
Commits (2)
  • Robert Sprowson's avatar
    Function returns no longer use stack structures. · 44aae368
    Robert Sprowson authored
    Previously, a number of errors were contructed as automatic variables then returned to the caller - potentially accessing stale stack area. All error blocks are now held in ROM and cast from there.
    Error numbers are now not &00000000 or &20202020, using the allocated base - requires 'Common-0_15'.
    Trimmed some unused debugging code out, saves about 3k.
    Renamed C++ clashing variables to stop the compiler moaning.
    Implemented feature request to accept the empty string "" as no font handle in _SetFont calls.
    At some point, this module needs internationalising.
    
    Version 0.31. Tagged as 'Gadgets-0_31'
    44aae368
  • Jeffrey Lee's avatar
    TextGadgets module fixes & improvements · 62cdc19f
    Jeffrey Lee authored
    Detail:
      c/ScrollList, c/TextArea - ScrollList_SetFont and TextArea_SetFont now accept font handles instead of just font names. The handles are handled in the same way as the Window module, i.e. the handle will be managed and freed by the TextGadgets modules. Fixes bug #212.
      c/ScrollList, c/Scrollbar, c/TextArea - Fix handling of Toolbox_ObjectDeleted events. Original code would corrupt the object lists when deleting items, and reallocate much more memory than was actually needed. Fixes bug #214
      c/MemMan - Fix grow_handlers to not leave handle_list as NULL if the realloc fails. Fixes bug #216.
      c/MemMan, c/TextArea, c/TextMan, h/MemMan, h/TextMan - Changed how the 'Handle' type is handled. Instead of MemMan giving out direct pointers to Handle instances, it now gives out identifiers (HandleId). These identifiers are then converted to Handle pointers via get_handle whenever the contents need to be accessed. This allows the handle_list to be safely realloc'd without breaking all the existing Handle pointers. Fixes bug #217
      c/MemMan - Reduced HDNLE_GRW_BY from 1000 to 128 to save a bit of memory
    Admin:
      Module compiles and runs, but actual functionality is untested.
      Fixes bugs 212, 214, 216, 217.
    
    
    Version 0.32. Tagged as 'Gadgets-0_32'
    62cdc19f
......@@ -50,8 +50,8 @@ CP = copy
LD = link
RM = remove
WIPE = x wipe
CD = dir
CHMOD = access
CD = dir
CHMOD = access
#FEATURES = -zM -zps1 -g ${DFLAGS}
FEATURES = -zM -zps1 -ffah ${DFLAGS}
......@@ -64,7 +64,7 @@ CHMODFLAGS = RW/R
DFLAGS = -D${SYSTEM}_BUILD #-DUSE_TINY ${DEBUG}
INCLUDES = -IC:tboxlibint,C:tboxlibs,C:
INCLUDES = -IC:tboxlibint,tbox:,C:
# ------------------------------------------------------------------------------
......
/* (0.30)
/* (0.32)
*
* This file is automatically maintained by srccommit, do not edit manually.
* Last processed by srccommit version: 1.1.
*
*/
#define Module_MajorVersion_CMHG 0.30
#define Module_MajorVersion_CMHG 0.32
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 14 Jun 2008
#define Module_Date_CMHG 25 Jun 2011
#define Module_MajorVersion "0.30"
#define Module_Version 30
#define Module_MajorVersion "0.32"
#define Module_Version 32
#define Module_MinorVersion ""
#define Module_Date "14 Jun 2008"
#define Module_Date "25 Jun 2011"
#define Module_ApplicationDate "14-Jun-08"
#define Module_ApplicationDate "25-Jun-11"
#define Module_ComponentName "Gadgets"
#define Module_ComponentPath "castle/RiscOS/Sources/Toolbox/Gadgets"
#define Module_FullVersion "0.30"
#define Module_HelpVersion "0.30 (14 Jun 2008)"
#define Module_LibraryVersionInfo "0:30"
#define Module_FullVersion "0.32"
#define Module_HelpVersion "0.32 (25 Jun 2011)"
#define Module_LibraryVersionInfo "0:32"
......@@ -27,16 +27,22 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "swis.h"
#include "kernel.h"
#include "swis.h"
#include "toolbox.h"
#include "window.h"
#include "objects/gadgets.h"
#include "wimplib.h"
#include "TextGadget.h"
#include "MemMan.h"
#ifdef MemCheck_MEMCHECK
#include "MemCheck:MemCheck.h"
#endif
#define HNDL_GRW_BY 1000
#define HNDL_GRW_BY 128
#define INITIAL_SIZE 4096
#define MAXIMUM_SIZE (16*1024*1024)
#define BLOCK_GAP 512
......@@ -56,7 +62,7 @@ _kernel_oserror *initialise_memory(char *area_name)
_kernel_oserror *err;
if(area_no != 0)
return (_kernel_oserror *) " Attempt to re-initialise memory.";
return (_kernel_oserror *)&e_reinitmem;
/* Create the dynamic area */
......@@ -83,7 +89,7 @@ _kernel_oserror *initialise_memory(char *area_name)
_kernel_oserror *release_memory(void)
{
if(area_no == 0)
return (_kernel_oserror *)" Memory has not been initialised.";
return (_kernel_oserror *)&e_notinit;
_swix(OS_DynamicArea,_IN(0)|_IN(1), 1, area_no);
area_no = 0;
......@@ -98,9 +104,13 @@ _kernel_oserror *grow_handles(void)
{
int i;
if((handle_list = realloc(handle_list, (hndl_list_sze + HNDL_GRW_BY) *
sizeof(Handle))) == NULL)
return (_kernel_oserror *)" Out of memory.";
Handle *new_list = realloc(handle_list, (hndl_list_sze + HNDL_GRW_BY) *
sizeof(Handle));
if(new_list == NULL)
return (_kernel_oserror *)&e_outofmem;
handle_list = new_list;
for(i = hndl_list_sze; i < hndl_list_sze + HNDL_GRW_BY; i++)
handle_list[i].base = NULL;
......@@ -122,7 +132,7 @@ static void update_handles(Handle *handle, int diff)
}
_kernel_oserror *create_block(int block_size, Handle **hndl_pntr)
_kernel_oserror *create_block(int block_size, HandleId *id)
{
_kernel_oserror *err;
int i;
......@@ -156,7 +166,7 @@ _kernel_oserror *create_block(int block_size, Handle **hndl_pntr)
handle_list[i].size = block_size;
handle_list[i].free = BLOCK_GAP;
*hndl_pntr = &handle_list[i];
*id = (HandleId) i;
area_end += block_size + BLOCK_GAP;
#ifdef MemCheck_MEMCHECK
......@@ -167,14 +177,16 @@ _kernel_oserror *create_block(int block_size, Handle **hndl_pntr)
}
_kernel_oserror *delete_block(Handle *handle)
_kernel_oserror *delete_block(HandleId id)
{
_kernel_oserror *err;
char *src;
int size, change;
Handle *handle = get_handle(id);
if(handle->base == NULL)
return (_kernel_oserror *)" Block does not exist.";
return (_kernel_oserror *)&e_nosuchblk;
/* Move the blocks above the block down */
......@@ -204,15 +216,17 @@ _kernel_oserror *delete_block(Handle *handle)
}
#ifdef MemCheck_MEMCHECK
static _kernel_oserror *extend_block2(Handle *handle, int pos, int size)
static _kernel_oserror *extend_block2(HandleId id, int pos, int size)
#else
_kernel_oserror *extend_block(Handle *handle, int pos, int size)
_kernel_oserror *extend_block(HandleId id, int pos, int size)
#endif
{
_kernel_oserror *err;
Handle *handle = get_handle(id);
if(handle->base == NULL)
return (_kernel_oserror*)" Block does not exist.";
return (_kernel_oserror *)&e_nosuchblk;
handle->free -= size;
if(handle->free < 0)
......@@ -257,29 +271,32 @@ _kernel_oserror *extend_block(Handle *handle, int pos, int size)
}
#ifdef MemCheck_MEMCHECK
_kernel_oserror *extend_block(Handle *handle, int pos, int size)
_kernel_oserror *extend_block(HandleId id, int pos, int size)
{
MemCheck_checking oldchecking = MemCheck_SetChecking(0, 0);
_kernel_oserror *e = extend_block2(handle, pos, size);
_kernel_oserror *e = extend_block2(id, pos, size);
if (!e)
{
Handle *handle = get_handle(id);
MemCheck_ResizeFlexBlock((void**)&(handle->base), handle->size);
}
MemCheck_RestoreChecking(oldchecking);
return e;
}
#endif
#ifdef MemCheck_MEMCHECK
static _kernel_oserror *shrink_block2(Handle *handle, int pos, int size)
static _kernel_oserror *shrink_block2(HandleId id, int pos, int size)
#else
_kernel_oserror *shrink_block(Handle *handle, int pos, int size)
_kernel_oserror *shrink_block(HandleId id, int pos, int size)
#endif
{
_kernel_oserror *err;
int diff;
Handle *handle = get_handle(id);
if(handle->base == NULL)
return (_kernel_oserror*)" Block does not exist.";
return (_kernel_oserror *)&e_nosuchblk;
if((diff = handle->size - pos - size) > 0)
{
......@@ -321,18 +338,21 @@ _kernel_oserror *shrink_block(Handle *handle, int pos, int size)
}
#ifdef MemCheck_MEMCHECK
_kernel_oserror *shrink_block(Handle *handle, int pos, int size)
_kernel_oserror *shrink_block(HandleId id, int pos, int size)
{
MemCheck_checking oldchecking = MemCheck_SetChecking(0, 0);
_kernel_oserror *e = shrink_block2(handle, pos, size);
_kernel_oserror *e = shrink_block2(id, pos, size);
if (!e)
{
Handle *handle = get_handle(id);
MemCheck_ResizeFlexBlock((void**)&(handle->base), handle->size);
}
MemCheck_RestoreChecking(oldchecking);
return e;
}
#endif
#if 0
void print_info(FILE *out)
{
int i;
......@@ -349,5 +369,9 @@ void print_info(FILE *out)
fprintf(out, "\tfree : %d\n", handle_list[i].free);
}
}
#endif
Handle *get_handle(HandleId id)
{
return &handle_list[id];
}
......@@ -53,6 +53,7 @@
#include "toolbox.h"
#include "window.h"
#include "objects/gadgets.h"
#include "wimplib.h"
#include "glib.h"
......@@ -81,8 +82,6 @@ static unsigned int vscroll_width = SCROLLBAR_SIZE;
static PrivateScrollList **scrolllist_list = NULL;
static _kernel_oserror bad_index = {0, "Bad index"};
// Cannot be a const, 'cos of the stupid blimmin' tbox header files
static BBox redraw_box = {0, -0xffff, 0xffff, 0};
......@@ -154,11 +153,6 @@ static /* const */ ObjectTemplateHeader scroll_list_window =
static BBox redraw_all_box = {0, -0xffff, 0xffff, 0};
static _kernel_oserror *out_of_memory(void)
{
return (_kernel_oserror *) " Unable to allocate memory to store scrolllist gadget definition";
}
_kernel_oserror *scrolllist_init(void)
{
scroll_list_window.body = (void*) &window_template;
......@@ -168,12 +162,10 @@ _kernel_oserror *scrolllist_init(void)
static _kernel_oserror *add_redraw_handler(PrivateScrollList *sl)
{
_kernel_oserror no_mem = {0, "Not enough memory"};
if (scrolllist_list == NULL)
{
if ( (scrolllist_list = malloc(sizeof(PrivateScrollList*)*2)) == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outoflistmem;
scrolllist_list[0] = sl;
scrolllist_list[1] = NULL;
......@@ -190,7 +182,7 @@ static _kernel_oserror *add_redraw_handler(PrivateScrollList *sl)
sizeof(PrivateScrollList*) * (i+2));
if (new_list == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outoflistmem;
scrolllist_list = new_list;
......@@ -203,11 +195,10 @@ static _kernel_oserror *add_redraw_handler(PrivateScrollList *sl)
static _kernel_oserror *remove_redraw_handler(PrivateScrollList *sl)
{
_kernel_oserror bad_scrolllist = {0, "No such scrolling list"};
unsigned int i, j;
if (scrolllist_list == NULL)
return &bad_scrolllist;
return (_kernel_oserror *)&e_badslist;
for (i = 0;
(scrolllist_list[i] != NULL) && (scrolllist_list[i] != sl);
......@@ -215,7 +206,7 @@ static _kernel_oserror *remove_redraw_handler(PrivateScrollList *sl)
;
if (scrolllist_list[i] == NULL)
return &bad_scrolllist;
return (_kernel_oserror *)&e_badslist;
for (j = i; scrolllist_list[j] != NULL; j++)
;
......@@ -357,21 +348,21 @@ static void _get_item_size(const PrivateScrollList *sdata,
static void _set_extent(const PrivateScrollList *sdata)
{
BBox new;
BBox newbox;
int limit;
unsigned int entry_height;
_get_item_size(sdata, NULL, &entry_height, NULL);
new.xmin = 0;
new.xmax = 0xfff;
new.ymin = -sdata->no_entries * entry_height;
new.ymax = 0;
newbox.xmin = 0;
newbox.xmax = 0xfff;
newbox.ymin = -sdata->no_entries * entry_height;
newbox.ymax = 0;
limit = sdata->box.ymin - sdata->box.ymax + sizes_y_scale() * 2;
if (new.ymin > limit) new.ymin = limit;
if (newbox.ymin > limit) newbox.ymin = limit;
window_set_extent(0, sdata->object_id, &new);
window_set_extent(0, sdata->object_id, &newbox);
}
static _kernel_oserror *_show(PrivateScrollList *sdata)
......@@ -472,7 +463,7 @@ scrolllist_add(ScrollList *sdata, int wimpw, ObjectId object_id,
sl = (PrivateScrollList *) mem_allocate(sizeof(PrivateScrollList));
if (!sl)
return out_of_memory();
return (_kernel_oserror *)&e_outoflistmem;
#ifdef MemCheck_MEMCHECK
MemCheck_RegisterMiscBlock(sl, sizeof(PrivateScrollList));
......@@ -566,10 +557,9 @@ static _kernel_oserror *_set_colour(PrivateScrollList *handle,
{
// Need to translate desktop colours to real colours
Palette palette;
_kernel_oserror bad_col = {0, "Invalid desktop colour"};
if ((foreground > 15) || (background > 15))
return &bad_col;
return (_kernel_oserror *)&e_badcol;
_swix(Wimp_ReadPalette, _IN(1)|_IN(2),&palette,0x45555254/*'TRUE'*/);
foreground = palette.colours[foreground] & ~0xff;
......@@ -586,7 +576,6 @@ static _kernel_oserror *_add_item(PrivateScrollList *sdata,
int index, unsigned int flags)
{
WimpGetWindowStateBlock state;
_kernel_oserror no_mem = {0, "Not enough memory to add item"};
struct _entries *new_list;
// Alloc array of char *s
......@@ -596,7 +585,7 @@ static _kernel_oserror *_add_item(PrivateScrollList *sdata,
new_list = realloc(sdata->entries, sizeof(struct _entries) *
(sdata->no_entries + 1));
if (new_list == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outoflistmem;
sdata->entries = new_list;
......@@ -610,7 +599,7 @@ static _kernel_oserror *_add_item(PrivateScrollList *sdata,
{
// Can't be bothered to shrink sdata->entries - only one bit
// bigger, and will get realloc'd down on next call anyway
return &no_mem;
return (_kernel_oserror *)&e_outoflistmem;
}
#ifdef MemCheck_MEMCHECK
MemCheck_RegisterMiscBlock(sdata->entries[sdata->no_entries].text,
......@@ -628,7 +617,7 @@ static _kernel_oserror *_add_item(PrivateScrollList *sdata,
13);
#endif
if (sdata->entries[sdata->no_entries].sprite_name == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outoflistmem;
strncpy(sdata->entries[sdata->no_entries].sprite_name,
sprite_name, 12);
......@@ -648,7 +637,7 @@ static _kernel_oserror *_add_item(PrivateScrollList *sdata,
new_item = mem_allocate(strlen(text) + 1);
if (new_item == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outoflistmem;
#ifdef MemCheck_MEMCHECK
MemCheck_RegisterMiscBlock(new_item, strlen(text) + 1);
#endif
......@@ -658,7 +647,7 @@ static _kernel_oserror *_add_item(PrivateScrollList *sdata,
{
new_spr_name = mem_allocate(strlen(sprite_name) + 1);
if (new_spr_name == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outoflistmem;
#ifdef MemCheck_MEMCHECK
MemCheck_RegisterMiscBlock(new_spr_name, strlen(sprite_name) + 1);
#endif
......@@ -825,7 +814,7 @@ static _kernel_oserror *_select_item(const PrivateScrollList *sdata, unsigned in
int item_start, item_end;
if ((index < 0) || (index >= sdata->no_entries))
return &bad_index;
return (_kernel_oserror *)&e_badindex;
_get_item_size(sdata, NULL, &item_height, NULL);
box.xmin = 0;
......@@ -929,12 +918,18 @@ static _kernel_oserror *_set_font(PrivateScrollList *sdata,
if (sdata->font_handle != 0)
{
// Free existing font handle
// Note that we do this even for fonts that were passed in by handle,
// to match the behaviour of the Window module (see gadgets_set_font)
font_lose_font(sdata->font_handle);
sdata->font_handle = 0;
}
// Get new font handle
if (font == NULL)
if (((unsigned int)font)<256)
{
sdata->font_handle = (unsigned int) font;
}
else if (font[0] < ' ')
{
sdata->font_handle = 0;
}
......@@ -998,7 +993,7 @@ static _kernel_oserror *_get_item_text(const PrivateScrollList *sdata,
char *buffer, int buffer_size, int index, int *nbytes)
{
if (index >= sdata->no_entries)
return &bad_index;
return (_kernel_oserror *)&e_badindex;
if (buffer == NULL)
{
......@@ -1020,14 +1015,13 @@ static _kernel_oserror *_set_item_text(const PrivateScrollList *sdata,
char *new_text, int index)
{
char * new_item;
_kernel_oserror no_mem = {0, "Not enough memory"};
unsigned int item_height;
BBox box;
/* Sanity checks */
if (index < 0 || index >= sdata->no_entries)
return &bad_index;
return (_kernel_oserror *)&e_badindex;
if (!new_text) return NULL;
......@@ -1053,7 +1047,7 @@ static _kernel_oserror *_set_item_text(const PrivateScrollList *sdata,
new_item = mem_allocate(strlen(new_text) + 1);
if (new_item == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outoflistmem;
#ifdef MemCheck_MEMCHECK
MemCheck_RegisterMiscBlock(new_item, strlen(new_text) + 1);
......@@ -1526,7 +1520,7 @@ _kernel_oserror *scrolllist_filter(_kernel_swi_regs *regs)
for (j = i; scrolllist_list[j] != NULL; j++)
{
// Copy down following gadgets
scrolllist_list[j] = scrolllist_list[j+i];
scrolllist_list[j] = scrolllist_list[j+1];
}
}
else
......@@ -1542,7 +1536,7 @@ _kernel_oserror *scrolllist_filter(_kernel_swi_regs *regs)
else
{
new_list = realloc(scrolllist_list,
sizeof(PrivateScrollList) * (remaining + 1));
sizeof(PrivateScrollList*) * (remaining + 1));
if (new_list != NULL)
scrolllist_list = new_list;
}
......
......@@ -39,6 +39,7 @@
#include "toolbox.h"
#include "window.h"
#include "wimplib.h"
#include "objects/gadgets.h"
#include "glib.h"
#include "string32.h"
......@@ -71,19 +72,13 @@ static int my_icons[] = {-1};
static PrivateScrollbar **scrollbar_list = NULL;
static _kernel_oserror *out_of_memory(void)
{
return (_kernel_oserror *) " Unable to allocate memory to store scrollbar gadget definition";
}
static _kernel_oserror *add_redraw_handler(PrivateScrollbar *tb)
{
_kernel_oserror no_mem = {0, "Not enough memory"};
if (scrollbar_list == NULL)
{
if ( (scrollbar_list = malloc(sizeof(PrivateScrollbar*) * 2)) ==NULL)
return &no_mem;
return (_kernel_oserror *)&e_outofbarmem;
scrollbar_list[0] = tb;
scrollbar_list[1] = NULL;
......@@ -96,10 +91,10 @@ static _kernel_oserror *add_redraw_handler(PrivateScrollbar *tb)
for (i = 0; scrollbar_list[i] != NULL; i++)
;
new_list = realloc(scrollbar_list,sizeof(PrivateScrollbar*) * (i+2));
new_list = realloc(scrollbar_list,sizeof(PrivateScrollbar *) * (i+2));
if (new_list == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outofbarmem;
scrollbar_list = new_list;
......@@ -112,11 +107,10 @@ static _kernel_oserror *add_redraw_handler(PrivateScrollbar *tb)
static _kernel_oserror *remove_redraw_handler(const PrivateScrollbar *tb)
{
_kernel_oserror bad_scrollbar = {0, "No such scrollbar"};
unsigned int i, j;
if (scrollbar_list == NULL)
return &bad_scrollbar;
return (_kernel_oserror *)&e_badsbar;
for (i = 0;
(scrollbar_list[i] != NULL) && (scrollbar_list[i] != tb);
......@@ -124,7 +118,7 @@ static _kernel_oserror *remove_redraw_handler(const PrivateScrollbar *tb)
;
if (scrollbar_list[i] == NULL)
return &bad_scrollbar;
return (_kernel_oserror *)&e_badsbar;
for (j = i; scrollbar_list[j] != NULL; j++)
;
......@@ -145,7 +139,7 @@ static _kernel_oserror *remove_redraw_handler(const PrivateScrollbar *tb)
// No need to generate an error if the realloc fails, 'cos
// it'll just realloc next time, hopefully
new_list = realloc(scrollbar_list, sizeof(PrivateScrollbar) * (j+1));
new_list = realloc(scrollbar_list, sizeof(PrivateScrollbar *) * (j+1));
if (new_list != NULL)
scrollbar_list = new_list;
......@@ -249,7 +243,7 @@ scrollbar_add(Scrollbar *sdata, int wimpw, ObjectId object_id,
sb = (PrivateScrollbar *) mem_allocate(sizeof(PrivateScrollbar));
if (!sb)
return out_of_memory();
return (_kernel_oserror *)&e_outofbarmem;
#ifdef MemCheck_MEMCHECK
MemCheck_RegisterMiscBlock(sb, sizeof(PrivateScrollbar));
......@@ -660,7 +654,7 @@ _kernel_oserror *scrollbar_filter(_kernel_swi_regs *regs)
for (j = i; scrollbar_list[j] != NULL; j++)
{
// Copy down following gadgets
scrollbar_list[j] = scrollbar_list[j+i];
scrollbar_list[j] = scrollbar_list[j+1];
}
}
else
......@@ -676,7 +670,7 @@ _kernel_oserror *scrollbar_filter(_kernel_swi_regs *regs)
else
{
new_list = realloc(scrollbar_list,
sizeof(PrivateScrollbar) * (remaining + 1));
sizeof(PrivateScrollbar*) * (remaining + 1));
if (new_list != NULL)
scrollbar_list = new_list;
}
......
......@@ -48,6 +48,7 @@
#include "toolbox.h"
#include "window.h"
#include "objects/gadgets.h"
#include "wimplib.h"
#include "glib.h"
......@@ -160,11 +161,6 @@ static BBox redraw_all_box = {0, -0xffff, 0xffff, 0};
static void update_display(PrivateTextArea *tdata,
int first_line, int last_line, int line_delta);
static _kernel_oserror *out_of_memory(void)
{
return (_kernel_oserror *) " Unable to allocate memory to store text area gadget definition";
}
_kernel_oserror *textarea_init(void)
{
text_area_window.body = (void*) &window_template;
......@@ -189,12 +185,11 @@ _kernel_oserror *textarea_die(void)
*/
static _kernel_oserror *add_redraw_handler(PrivateTextArea *tb)
{
_kernel_oserror no_mem = {0, "Not enough memory"};
if (text_area_list == NULL)
{
if ( (text_area_list = malloc(sizeof(PrivateTextArea*) * 2)) == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outofareamem;
text_area_list[0] = tb;
text_area_list[1] = NULL;
......@@ -207,10 +202,10 @@ static _kernel_oserror *add_redraw_handler(PrivateTextArea *tb)
for (i = 0; text_area_list[i] != NULL; i++)
;
new_list = realloc(text_area_list,sizeof(PrivateTextArea*) * (i+2));
new_list = realloc(text_area_list,sizeof(PrivateTextArea *) * (i+2));
if (new_list == NULL)
return &no_mem;
return (_kernel_oserror *)&e_outofareamem;
text_area_list = new_list;
......@@ -223,11 +218,10 @@ static _kernel_oserror *add_redraw_handler(PrivateTextArea *tb)
static _kernel_oserror *remove_redraw_handler(PrivateTextArea *tb)
{
_kernel_oserror bad_area = {0, "No such text area"};
unsigned int i, j;
if (text_area_list == NULL)
return &bad_area;
return (_kernel_oserror *)&e_badarea;
for (i = 0;
(text_area_list[i] != NULL) && (text_area_list[i] != tb);
......@@ -235,7 +229,7 @@ static _kernel_oserror *remove_redraw_handler(PrivateTextArea *tb)
;
if (text_area_list[i] == NULL)
return &bad_area;
return ( _kernel_oserror *)&e_badarea;
for (j = i; text_area_list[j] != NULL; j++)
;
......@@ -256,7 +250,7 @@ static _kernel_oserror *remove_redraw_handler(PrivateTextArea *tb)
// No need to generate an error if the realloc fails, 'cos
// it'll just realloc next time, hopefully
new_list = realloc(text_area_list, sizeof(PrivateTextArea) * (j+1));
new_list = realloc(text_area_list, sizeof(PrivateTextArea *) * (j+1));
if (new_list != NULL)
text_area_list = new_list;
......@@ -392,7 +386,7 @@ static _kernel_oserror *handle_drag_stop(BBox *box)
static _kernel_oserror *_show(PrivateTextArea *tdata)
{
WindowShowObjectBlock show_block;
BBox new;
BBox newbox;
unsigned int dx = sizes_x_scale();
unsigned int dy = sizes_y_scale();
int text_xmax, text_ymax, xextent, yextent, new_y, new_x;
......@@ -446,12 +440,12 @@ static _kernel_oserror *_show(PrivateTextArea *tdata)
yextent = show_block.visible_area.ymax - show_block.visible_area.ymin;
new_y = text_ymax > yextent ? text_ymax : yextent;
new.xmin = 0;
new.xmax = new_x;
new.ymin = -new_y;
new.ymax = 0;
newbox.xmin = 0;
newbox.xmax = new_x;
newbox.ymin = -new_y;
newbox.ymax = 0;
window_set_extent(0, tdata->object_id, &new);
window_set_extent(0, tdata->object_id, &newbox);
toolbox_show_object(Toolbox_ShowObject_AsSubWindow, tdata->object_id,
Toolbox_ShowObject_FullSpec, &show_block,
......@@ -938,7 +932,7 @@ textarea_add(TextArea *tdata, int wimpw, ObjectId parent_id,
tb = (PrivateTextArea *) mem_allocate(sizeof(PrivateTextArea));
if (!tb)
return out_of_memory();
return (_kernel_oserror *)&e_outofareamem;
#ifdef MemCheck_MEMCHECK
MemCheck_RegisterMiscBlock(tb, sizeof(PrivateTextArea));
......@@ -1196,10 +1190,9 @@ static _kernel_oserror *_set_colour(PrivateTextArea *handle,
{
// Need to translate desktop colours to real colours
Palette palette;
_kernel_oserror bad_col = {0, "Invalid desktop colour"};
if ((foreground > 15) || (background > 15))
return &bad_col;
return (_kernel_oserror *)&e_badcol;
_swix(Wimp_ReadPalette, _IN(1)|_IN(2),&palette,0x45555254/*'TRUE'*/);
foreground = palette.colours[foreground] & ~0xff;
......@@ -1238,7 +1231,7 @@ static _kernel_oserror *_set_text(PrivateTextArea *handle, const char *text)
// PJG: Swapped latter two function calls and made char_pos look up the
// end of the text to position the caret at the end.
char_pos(handle->text, handle->text->text_data->size, &caret_x, &caret_y);
char_pos(handle->text, get_handle(handle->text->text_data)->size, &caret_x, &caret_y);
update_display(handle, first_line, last_line, line_delta);
set_caret(window_handle, handle->text, 0, caret_y, 0, 1);
......@@ -1389,12 +1382,18 @@ static _kernel_oserror *_set_font(PrivateTextArea *handle, const char *font,
if (handle->font_handle != 0)
{
// Free existing font handle
// Note that we do this even for fonts that were passed in by handle,
// to match the behaviour of the Window module (see gadgets_set_font)
font_lose_font(handle->font_handle);
handle->font_handle = 0;
}
// Get new font handle
if (font == NULL)
if (((unsigned int)font)<256)
{
handle->font_handle = (unsigned int) font;
}
else if (font[0] < ' ')
{
handle->font_handle = 0;
}
......@@ -1758,7 +1757,7 @@ _kernel_oserror *textarea_filter(_kernel_swi_regs *regs)
for (j = i; text_area_list[j] != NULL; j++)
{
// Copy down following gadgets
text_area_list[j] = text_area_list[j+i];
text_area_list[j] = text_area_list[j+1];
}
}
else
......@@ -1774,7 +1773,7 @@ _kernel_oserror *textarea_filter(_kernel_swi_regs *regs)
else
{
new_list = realloc(text_area_list,
sizeof(PrivateTextArea) * (remaining + 1));
sizeof(PrivateTextArea*) * (remaining + 1));
if (new_list != NULL)
text_area_list = new_list;
}
......
......@@ -25,15 +25,15 @@
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include <string.h>
#include "kernel.h"
#include "swis.h"
#include "toolbox.h"
#include "window.h"
#include "wimplib.h"
#include "objects/gadgets.h"
#include "wimplib.h"
#include "TextGadget.h"
#include "ModHdr.h"
#include "glib.h"
......@@ -204,7 +204,7 @@ _kernel_oserror *TextGadgets_final(int fatal, int podule, void *pw)
IGNORE(pw);
if(textarea_active() || scrolllist_active() || scrollbar_active())
return (_kernel_oserror *) " Gadget tasks active";
return (_kernel_oserror *)&e_active;
deregister_gadget_type(0, TextArea_Type, TextGadgets_TextArea);
deregister_gadget_type(0, ScrollList_Type, TextGadgets_ScrollList);
......@@ -261,7 +261,7 @@ _kernel_oserror *TextGadgets_SWI_handler(int swi_no, _kernel_swi_regs *r,
case GADGET_MOVE:
e = textarea_move((int) r->r[1], (PrivateTextArea *) r->r[3],
(BBox *) r->r[5]);
break;
break;
default:
break;
......
......@@ -25,14 +25,16 @@
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include "kernel.h"
#include "swis.h"
#include "TextMan.h"
#include "toolbox.h"
#include "window.h"
#include "objects/gadgets.h"
#define TRUE 1
#define FALSE 0
#include "wimplib.h"
#include "TextGadget.h"
#include "TextMan.h"
typedef struct {
int *new_lines;
......@@ -49,15 +51,14 @@ _kernel_oserror *create_insertion(Text *text, int pos);
int line_start(Text *text, int line_no);
int line_end(Text *text, int line_no);
int line_index_of_char(Text *text, int pos);
char *text_to_mem(Text *text, int pos);
char *expand_tabs(char *str, int *len);
char *expand_tabs(char *str, int *len);
_kernel_oserror *create_text(int size, int font_handle, Text **t_pntr)
{
_kernel_oserror *err;
Text *text;
Handle *handle;
HandleId handle;
/* Create the memory block to hold the text data */
......@@ -67,10 +68,10 @@ _kernel_oserror *create_text(int size, int font_handle, Text **t_pntr)
if((text = malloc(sizeof(Text))) == NULL)
{
delete_block(handle);
return (_kernel_oserror*)" Out of memory.";
return (_kernel_oserror *)&e_outofmem;
}
*(handle->base) = '\0';
*(get_handle(handle)->base) = '\0';
text->insert_line = 0;
text->insert_delta = 0;
......@@ -151,7 +152,7 @@ _kernel_oserror *move_insertion(Text *text, int pos)
return create_insertion(text, pos);
else
{
char *base = text->text_data->base;
char *base = get_handle(text->text_data)->base;
if(pos < text->insert_pos)
memmove(base + pos + diff, base + pos, text->insert_pos - pos);
......@@ -172,11 +173,12 @@ _kernel_oserror *move_insertion(Text *text, int pos)
_kernel_oserror *create_insertion(Text *text, int pos)
{
_kernel_oserror *err;
Handle *handle = get_handle(text->text_data);
if((err = extend_block(text->text_data, pos, INSERTION_GAP)) != NULL)
return err;
*(text->text_data->base + pos) = '\0';
*(handle->base + pos) = '\0';
text->insert_pos = pos;
text->insert_gap_end = pos + INSERTION_GAP;
......@@ -209,7 +211,7 @@ static int line_len(Text *text, int line_no)
int xpoints2;
if((text->insert_gap_end - text->insert_pos) > 0)
*(text->text_data->base + text->insert_pos) = '\0';
*(get_handle(text->text_data)->base + text->insert_pos) = '\0';
_swix(Font_ScanString,_INR(0,4)|_IN(7)|_OUT(3),
text->font_handle, start_pntr, 1<<7|1<<8,
......@@ -251,7 +253,7 @@ static _kernel_oserror *new_line(Scan *scan, int pos, char *end, char *start)
if((scan->new_lines = realloc(scan->new_lines,
(scan->max_line += extra) * sizeof(int))) == NULL)
return (_kernel_oserror *)" Out of memory";
return (_kernel_oserror *)&e_outofmem;
}
return NULL;
......@@ -373,7 +375,8 @@ static _kernel_oserror *scan_text(Text *text, char *start_pntr, char *end, char
_kernel_oserror *compose_text(Text *text)
{
_kernel_oserror *err;
char *end, *base = text->text_data->base;
Handle *handle = get_handle(text->text_data);
char *end, *base = handle->base;
int insert_pos = text->insert_pos;
Scan scan;
int i;
......@@ -381,7 +384,7 @@ _kernel_oserror *compose_text(Text *text)
if(text->insert_gap_end > insert_pos)
close_insertion(text);
end = base + text->text_data->size - 2;
end = base + handle->size - 2;
scan.max_line = (end - base + 1) / 20 + 5;
scan.new_lines = malloc((scan.max_line + 1) * sizeof(int));
......@@ -390,7 +393,7 @@ _kernel_oserror *compose_text(Text *text)
if (scan.new_lines == NULL)
{
/* ... return an error message */
return (_kernel_oserror*)" Out of memory.";
return (_kernel_oserror *)&e_outofmem;
}
scan.line_no = 0;
......@@ -467,6 +470,7 @@ char *expand_tabs(char *str, int *len)
_kernel_oserror *replace_text(Text *text, int from, int ex_to, const char *s,
int *first_line_p, int *last_line_p, int *line_delta_p)
{
Handle *handle = get_handle(text->text_data);
_kernel_oserror *err;
int str_size;
char *str = expand_tabs((char *)s, &str_size);
......@@ -475,12 +479,12 @@ _kernel_oserror *replace_text(Text *text, int from, int ex_to, const char *s,
int insert_pos = text->insert_pos;
int insert_line = text->insert_line;
int first_line, last_line, last_line_end, first_line_start;
char *base = text->text_data->base;
char *base = handle->base;
int line_delta;
char *end, *con;
int old_xmax;
int gap_size = text->insert_gap_end - insert_pos;
Scan scan;
Scan scan;
char *old_end;
int old_line_no;
int old_split = 0;
......@@ -493,7 +497,7 @@ _kernel_oserror *replace_text(Text *text, int from, int ex_to, const char *s,
if (str == NULL)
{
/* return an error message */
return (_kernel_oserror*)" Out of memory.";
return (_kernel_oserror *)&e_outofmem;
}
if((ex_to == -1) || (to > line_end(text, text->no_of_lines - 1)))
......@@ -583,7 +587,7 @@ _kernel_oserror *replace_text(Text *text, int from, int ex_to, const char *s,
}
/* and return an error */
return (_kernel_oserror*)" Out of memory.";
return (_kernel_oserror *)&e_outofmem;
}
scan.line_no = scan.x_pos = 0;
......@@ -765,13 +769,14 @@ _kernel_oserror *replace_text(Text *text, int from, int ex_to, const char *s,
_kernel_oserror *insert_text(Text *text, char *s,
int *first_line_p, int *last_line_p, int *line_delta)
{
Handle *handle = get_handle(text->text_data);
_kernel_oserror *err;
int left = text->insert_gap_end - text->insert_pos;
int str_size;
char *str = expand_tabs((char *) s, &str_size);
char *start, *end, *con, *char_pntr;
int i, old_xmax;
char *base = text->text_data->base;
char *base = handle->base;
int gap_size;
int ld, ln;
int first_line = text->insert_line;
......@@ -785,7 +790,7 @@ _kernel_oserror *insert_text(Text *text, char *s,
if (str == NULL)
{
/* return an error message */
return (_kernel_oserror*)" Out of memory.";
return (_kernel_oserror *)&e_outofmem;
}
scan.new_lines = malloc(10 * sizeof(int));
......@@ -794,7 +799,7 @@ _kernel_oserror *insert_text(Text *text, char *s,
if (scan.new_lines == NULL)
{
/* return an error message */
return (_kernel_oserror*)" Out of memory.";
return (_kernel_oserror *)&e_outofmem;
}
scan.max_line = 9;
......@@ -948,7 +953,7 @@ _kernel_oserror *insert_text(Text *text, char *s,
char *get_text(Text *text, int from, int ex_to, char *buff)
{
char *base = text->text_data->base;
char *base = get_handle(text->text_data)->base;
int to = ex_to - 1;
if((ex_to == -1) || (to > line_end(text, text->no_of_lines - 1)))
......@@ -1048,7 +1053,7 @@ char *text_to_mem(Text *text, int text_pos)
int pos = (text_pos < text->insert_pos ? text_pos :
text_pos + text->insert_gap_end - text->insert_pos);
return text->text_data->base + pos;
return get_handle(text->text_data)->base + pos;
}
......@@ -1069,11 +1074,11 @@ _kernel_oserror *grow_lines_by(Text *text, int by)
if((new_table = realloc(text->line_table,
new_size * sizeof(int))) == NULL)
return (_kernel_oserror*)" Out of memory.";
return (_kernel_oserror *)&e_outofmem;
if((new_xmax = realloc(text->xmax_table,
new_size * sizeof(int))) == NULL)
return (_kernel_oserror*)" Out of memory.";
return (_kernel_oserror *)&e_outofmem;
text->line_table = new_table;
text->xmax_table = new_xmax;
......@@ -1107,7 +1112,7 @@ void char_block(Text *text, int xcoord, int ycoord, int *line, int *index,
int points = xpoints;
if((text->insert_gap_end - text->insert_pos) > 0)
*(text->text_data->base + text->insert_pos) = '\0';
*(get_handle(text->text_data)->base + text->insert_pos) = '\0';
_swix(Font_ScanString,_INR(0,4)|_IN(7)|
_OUT(1)|_OUT(3)|_OUT(4), text->font_handle,
......@@ -1163,7 +1168,7 @@ void char_pos(Text *text, int index, int *xpos, int *ypos)
int xpoints2;
if((text->insert_gap_end - text->insert_pos) > 0)
*(text->text_data->base + text->insert_pos) = '\0';
*(get_handle(text->text_data)->base + text->insert_pos) = '\0';
_swix(Font_ScanString,_INR(0,4)|_IN(7)|_OUT(3),
text->font_handle, start_pntr, 1<<7|1<<8,
......@@ -1254,7 +1259,7 @@ static void draw_insert(Text *text, int line_no, int split, int base,
int split_pnt;
if((text->insert_gap_end - text->insert_pos) > 0)
*(text->text_data->base + text->insert_pos) = '\0';
*(get_handle(text->text_data)->base + text->insert_pos) = '\0';
_swix(Font_ScanString,_INR(0,4)|_IN(7)|_OUT(3),
0, start_pntr,1<<7|1<<8, 0xfffffff, 0, len, &split_pnt);
......@@ -1424,7 +1429,7 @@ void display_lines(Text *text, int ymin, int ymax, int xorg, int yorg,
}
#if 0
void dump_object(FILE *out, Text *text)
{
int i;
......@@ -1456,3 +1461,4 @@ void dump_object(FILE *out, Text *text)
fprintf(out, "\tsize : %d\n", text->text_data->size);
fprintf(out, "\tfree : %d\n", text->text_data->free);
}
#endif
......@@ -137,9 +137,3 @@ BBox *intersection(BBox *a, BBox *b)
return &intersect;
}
_kernel_oserror *glib_plot_gadget(int flags,Gadget *g)
{
return _swix(0x828bf, _INR(0,1), flags, g);
}
......@@ -30,14 +30,17 @@ typedef struct
int free;
} Handle;
typedef int HandleId;
/* Function prototypes */
_kernel_oserror *initialise_memory(char *name);
_kernel_oserror *release_memory(void);
_kernel_oserror *create_block(int block_size, Handle **pntr);
_kernel_oserror *delete_block(Handle *pntr);
_kernel_oserror *extend_block(Handle *pntr, int pos, int size);
_kernel_oserror *shrink_block(Handle *pntr, int pos, int size);
_kernel_oserror *create_block(int block_size, HandleId *handle);
_kernel_oserror *delete_block(HandleId handle);
_kernel_oserror *extend_block(HandleId handle, int pos, int size);
_kernel_oserror *shrink_block(HandleId handle, int pos, int size);
Handle *get_handle(HandleId handle); /* Note: Pointer may be invalidated by create/delete calls */
void print_info(FILE *out);
......@@ -61,7 +61,7 @@ _kernel_oserror *_scrolllist_redraw(const PrivateScrollList *sdata,
int scrolllist_active(void);
_kernel_oserror *scrolllist_init(void);
_kernel_oserror *scrolllist_die(void);
_kernel_oserror *scrolllist_add(ScrollList *template, int wimpw,
_kernel_oserror *scrolllist_add(ScrollList *, int wimpw,
ObjectId obj_id,
int **icons, int **data);
_kernel_oserror *scrolllist_method(PrivateScrollList *handle,
......@@ -69,7 +69,7 @@ _kernel_oserror *scrolllist_method(PrivateScrollList *handle,
_kernel_oserror *scrolllist_remove(PrivateScrollList *handle);
_kernel_oserror *scrolllist_fade(PrivateScrollList *handle, int fade);
_kernel_oserror *scrolllist_plot(ScrollList *template);
_kernel_oserror *scrolllist_plot(ScrollList *);
_kernel_oserror *scrolllist_move(int type, PrivateScrollList *sdata,
BBox *box);
......
......@@ -44,13 +44,13 @@ int scrollbar_active(void);
_kernel_oserror *scrollbar_die(void);
_kernel_oserror *_scrollbar_redraw(const PrivateScrollbar *sdata);
_kernel_oserror *scrollbar_add(Scrollbar *template, int wimpw, ObjectId obj_id,
_kernel_oserror *scrollbar_add(Scrollbar *, int wimpw, ObjectId obj_id,
int **icons, int **data);
_kernel_oserror *scrollbar_method(PrivateScrollbar *handle, _kernel_swi_regs *regs);
_kernel_oserror *scrollbar_remove(PrivateScrollbar *handle);
_kernel_oserror *scrollbar_fade(PrivateScrollbar *handle, int fade);
_kernel_oserror *scrollbar_plot(Scrollbar *template);
_kernel_oserror *scrollbar_plot(Scrollbar *);
_kernel_oserror *scrollbar_filter(_kernel_swi_regs *regs);
......
......@@ -51,14 +51,14 @@ typedef struct {
_kernel_oserror *textarea_init(void);
_kernel_oserror *textarea_die(void);
int textarea_active(void);
_kernel_oserror *textarea_add(TextArea *template, int wimpw, ObjectId obj_id,
_kernel_oserror *textarea_add(TextArea *, int wimpw, ObjectId obj_id,
int **icons, int **data);
_kernel_oserror *textarea_method(PrivateTextArea *handle,
_kernel_swi_regs *regs);
_kernel_oserror *textarea_remove(PrivateTextArea *handle);
_kernel_oserror *textarea_fade(PrivateTextArea *handle, int fade);
_kernel_oserror *textarea_plot(TextArea *template);
_kernel_oserror *textarea_plot(TextArea *);
_kernel_oserror *textarea_move(int type, PrivateTextArea *tdata,
BBox *box);
......
......@@ -22,8 +22,6 @@
#ifndef _TEXTGADGETS_H
#define _TEXTGADGETS_H
//#include "TextAreaP.h"
// Horrible. Need to work this out properly and change on mode changes.
#define SCROLLBAR_SIZE 44
......@@ -35,6 +33,23 @@ extern void work_to_screen(BBox *box, WimpGetWindowStateBlock *state);
extern void screen_to_work(BBox *box, WimpGetWindowStateBlock *state);
extern _kernel_oserror *redraw_gadget(int window_handle, GadgetHeader *hdr);
/* The constant error strings */
extern unsigned int e_nosuchblk;
extern unsigned int e_reinitmem;
extern unsigned int e_notinit;
extern unsigned int e_outofintmem;
extern unsigned int e_outofbarmem;
extern unsigned int e_badsbar;
extern unsigned int e_badindex;
extern unsigned int e_outoflistmem;
extern unsigned int e_badslist;
extern unsigned int e_badcol;
extern unsigned int e_outofareamem;
extern unsigned int e_badarea;
extern unsigned int e_badcol;
extern unsigned int e_active;
extern unsigned int e_outofmem;
#ifndef Service_RedrawingWindow
#define Service_RedrawingWindow 0x44ec6
#endif
......
......@@ -43,7 +43,7 @@ typedef struct
int tab_stop;
int space;
int margin;
Handle *text_data;
HandleId text_data;
} Text;
_kernel_oserror *create_text(int size, int font_handle, Text **text);
......
......@@ -26,7 +26,9 @@
#define FAILED 0
#define SUCCESS 1
#ifndef __toolbox_h
#include "toolbox.h"
#endif
/*
* This structure is used to carry information about a sprite around
......
......@@ -165,6 +165,7 @@ font_scan_string
teq r0, #0
strne r1, [r0]
movne r0, #0
teq r2, #0
strne r3, [r2]
......@@ -175,7 +176,6 @@ font_scan_string
teq r6, #0
strne r7, [r6]
mov r0, #0
Return "r4-r7"
END
......@@ -18,31 +18,13 @@
; History: 23-Dec-96: EPW: Created from NK's slider_ven.s from slider gadget
;
r0 RN 0
r1 RN 1
r2 RN 2
r3 RN 3
AREA |C$$code|, CODE, READONLY
r4 RN 4
r5 RN 5
r6 RN 6
r7 RN 7
r8 RN 8
r9 RN 9
r10 RN 10
r11 RN 11
r12 RN 12
r13 RN 13
sl RN 10
fp RN 11
ip RN 12
sp RN 13
lr RN 14
pc RN 15
XWimp_SendMessage * &600e7
GET hdr:ListOpts
GET hdr:Macros
GET Hdr:System
GET hdr:Wimp
GET Hdr:APCS.<APCS>
^ 0,ip
button # 4
......
......@@ -12,58 +12,81 @@
; See the License for the specific language governing permissions and
; limitations under the License.
;
; Simple text plotting routines
; History: PW: 09-Aug-96: Created
; Strings that should be internationalised at some point
; History: PW: 09-Aug-1996: Created
; RPS: 28-Feb-2010: Dead code trimmed, messages entered
AREA |C$$code|, CODE, READONLY
GET hdr:ListOpts
GET hdr:Macros
GET Hdr:System
GET Hdr:APCS.<APCS>
Program_Error EQU &1B000000
TextGadgets_ErrorBase EQU (Program_Error | 0x0081A300)
; APCS compliant
; SVC mode compatible (a4/r3 used as link register)
^ TextGadgets_ErrorBase
TextGadgets_TasksActive # 1 ; Gadgets has tasks active
TextGadgets_DuffColour # 1 ; Invalid desktop colour
TextGadgets_AllocFailed # 1 ; Out of memory
TextGadgets_BarAllocFailed # 1 ; Out of memory for scrollbar
TextGadgets_ListAllocFailed # 1 ; Out of memory for scrolllist
TextGadgets_AreaAllocFailed # 1 ; Out of memory for textarea
TextGadgets_FontScanStrange # 1 ; Font_ScanString strange
TextGadgets_IntMallocFail # 1 ; Int err - out of memory
TextGadgets_IntNoSuchBlock # 1 ; Int err - no such block
TextGadgets_IntReinitMem # 1 ; Int err - attempt to reinit block
TextGadgets_IntNeverInit # 1 ; Int err - memory not init'd
TextGadgets_UKScrollbar # 1 ; No such scrollbar
TextGadgets_UKScrollList # 1 ; No such scrollbar
TextGadgets_UKTextArea # 1 ; No such text area
TextGadgets_BadIndex # 1 ; Bad index
; Plots a line of text in the system font at the given coordinates
; Prototype: void text_system_write0(const char *text, int x, int y);
; On entry: r0 = pointer to text to plot
; r1 = x coordinate
; r2 = y coordinate
text_system_write0
EXPORT text_system_write0
MACRO
GadgetsError $number,$string
DCD $number
DCB "$string"
DCB 0
ALIGN
MEND
mov ip, lr
mov r3, r0
mov r0, #4 ; move
swi XOS_Plot
mov r0, r3
swi XOS_Write0
Return ,LinkNotStacked,,ip
; Plots N characters in the system font at the given coordinates
; Prototype: void text_system_writeN(const char *text, int x, int y,
; unsigned int line_len);
; On entry: r0 = pointer to text to plot
; r1 = x coordinate
; r2 = y coordinate
; r3 = text length
text_system_writeN
EXPORT text_system_writeN
stmfd sp!, {r4, lr}
mov r4, r0
mov r0, #4 ;move
swi XOS_Plot
mov r0, r4
mov r1, r3
swi XOS_WriteN
Return "r4"
e_nosuchblk
EXPORT e_nosuchblk
GadgetsError TextGadgets_IntNoSuchBlock, "Block does not exist"
e_reinitmem
EXPORT e_reinitmem
GadgetsError TextGadgets_IntReinitMem, "Attempt to re-initialise memory"
e_notinit
EXPORT e_notinit
GadgetsError TextGadgets_IntNeverInit, "Memory has not been initialised"
e_outofintmem
EXPORT e_outofintmem
GadgetsError TextGadgets_IntMallocFail, "Out of memory"
e_outofbarmem
EXPORT e_outofbarmem
GadgetsError TextGadgets_BarAllocFailed, "Out of memory"
e_badsbar
EXPORT e_badsbar
GadgetsError TextGadgets_UKScrollbar, "No such scrollbar"
e_badindex
EXPORT e_badindex
GadgetsError TextGadgets_BadIndex, "Bad index"
e_outoflistmem
EXPORT e_outoflistmem
GadgetsError TextGadgets_ListAllocFailed, "Out of memory"
e_badslist
EXPORT e_badslist
GadgetsError TextGadgets_UKScrollList, "No such scrolling list"
e_badcol
EXPORT e_badcol
GadgetsError TextGadgets_DuffColour, "Invalid desktop colour"
e_outofareamem
EXPORT e_outofareamem
GadgetsError TextGadgets_AreaAllocFailed, "Out of memory"
e_badarea
EXPORT e_badarea
GadgetsError TextGadgets_UKTextArea, "No such text area"
e_active
EXPORT e_active
GadgetsError TextGadgets_TasksActive , "Gadget tasks active"
e_outofmem
EXPORT e_outofmem
GadgetsError TextGadgets_AllocFailed, "Out of memory"
END