With RiscOS 3.1, you can enable the supplied applications to use solid sprite drags using the DragASprite module with:

SYS "OS_Byte",161,28 TO ,,v%
v%=v% OR 2
SYS "OS_Byte",162,28,v%

This updates a bit in CMOS RAM, so it survives across hard-reset.

It is easy to implement solid sprite drags in your own programs. I append here some BASIC code to do this, filched from !Maestro and considerably cleaned up (!). You may wish to make an extra check for RiscOS 3.1's presence below. RiscOS 3.1, of course, returns 316 in R0 from Wimp_Initialise, so you can set a global according to that.

\{

SYS "OS_Byte",161,28 TO ,,flags%
IF flags% AND 2 THEN
SYS "DragASprite_Start",197,1,sprite_name$,block%+8 ELSE
SYS "Wimp_DragBox",,block%
ENDIF

\}

When you receive a drag event back, turn off the sprite drag! This is just an SWI call, no parameters, to "DragASprite_Stop". If you just address this by number and use the X form, you don't need RiscOS 2 checks or CMOS checks:

\{

WHEN 7: SYS &62401: REM XDragASprite_Stop

        junk%=EVAL("FN"+DragHandler$)

\}

C code for this is more difficult, especially if you use RISC_OSLib and its specialised xfer_send () procedures. I don't. But this is the theory, anyway.