Entry | |
---|---|
R0 | Flags |
R1 | renderer called to render the object (SWI number or pointer to C/assembler function) |
R2 | Pointer to block holding registers for SWI / function parameters |
R3 | Pointer to 16-byte block containing drag box |
R4 | Pointer to optional block containing bounding box |
Exit | |
---|---|
R0 | Preserved |
R1 | Preserved |
R2 | Preserved |
R3 | Preserved |
R4 | Preserved |
The purpose of this call is to start dragging an object.
As per the DragASprite_Start, this SWI starts the dragging process (calling DragASprite_Start and in turn Wimp_DragBox on the clients behalf), usually in response to a Drag (Mouse_Click) Event.
The renderer can be a C (or assembler) function or a SWI (determined by setting bits 16 and 17 in the flags word).
e.g.
SWI renderer:void start_drag(…)
render.r1 = (int) &icon; /* oh dear, bug in the wimp */ render.r4 =0; render.r5 =0; regs.r0 = some flags; regs.r1 = Wimp_PlotIcon; regs.r2 = (int) &render; regs.r3 = (int) &bbox; kernel_swi(DragAnObjectStart,®s,®s);
{
_kernel_swi_regs regs, render;}
Code renderer:
void _my_render(data)
{
/* do the render */}
void start_drag(…)
/* render0 … render3 will be passed to the function as parameters */ render0 = (int) data required by renderer; /* tell it we’re a function and a module */ regs.r0 = some flags + (1<<16) + (1<<17); regs.r1 = (int) _my_render; regs.r2 = (int) &render; regs.r3 = (int) &bbox; kernel_swi(DragAnObjectStart,®s,®s);
{
_kernel_swi_regs regs;
int render4;}