home *** CD-ROM | disk | FTP | other *** search
- Information about DragASprite gleaned from disassembling it!
-
- Can now drag an icon about the desktop rather than the dash lines.
- This is determined by bit 1 of byte 28 in the CMOS RAM. The direct
- method is to use the following SWI's:
-
- .DragASprite_Start &42400
- ;
- ; In R0 = flags
- ; &03 x alignment of sprite in icon bbox:
- ; 00 => left
- ; 01 => middle
- ; 10 => right
- ; 11 => right (not faulted)
- ; &0C y alignment of sprite in icon bbox (values as x alignment)
- ; &30 parent drag bbox set from:
- ; 00 => screen
- ; 01 => window under pointer
- ; 10 => R4 points to user
- ; 11 => illegal (faulted)
- ; &40 0 => normal parent drag bbox
- ; 1 => center parent drag bbox around pointer!
- ; &80 1 => add an 8 OS unit shadow to the sprite
- ; 0 => no shadow
- ; R1 = pointer to sprite area (zero if system)
- ; R2 = pointer to sprite (name only, not pointer)
- ; R3 = pointer to icon bbox (sprite placed "in" this)
- ; R4 = pointer to drag bbox (if flags in R0)
- ; Out -
-
- .DragASprite_Stop &42401
- ; In -
- ; Out -
-
- Here's how I've implemented it over the normal "drag" method
-
-
- : REM Called when noticed a mouse click of a "drag" type over a valid
- : REM icon, this will then cause "FN_Dragged_"+routine$ to be called
- : REM when user stops the drag
- :
- DEF PROC_Initiate_Drag(window%, icon%, button%, routine$)
- LOCAL p%, q%, sx%, sy%
- LOCAL f%, area%, name%
- p% = FN_Claim_Stack(64) :REM external
- q% = FN_Claim_Stack(256) :REM external
- p%!0 = window%
- p%!4 = icon%
- SYS "Wimp_GetIconState",, p%
- q%!0 = window%
- SYS "Wimp_GetWindowState",, q%
- sx% = q%!20
- sy% = q%!24
- p%!0 = window%
- p%!4 = 5
- p%!8 += q%!4 - sx% :REM Min screen X
- p%!12 += q%!16 - sy% :REM Min screen Y
- p%!16 += q%!4 - sx% :REM Max X
- p%!20 += q%!16 - sy% :REM Max Y
- IF DragASprite% THEN
- SYS "OS_Byte", 161, 28 TO ,,f%
- dragged_sprite% = ((f% AND 2) = 2)
- ELSE
- dragged_sprite% = FALSE
- ENDIF
- IF dragged_sprite% THEN
- f% = p%!24
- IF (f% AND 2)=0 THEN ERROR 1, "Not a sprite icon to Drag"
- IF f% AND &80 THEN
- name% = p%!28
- area% = p%!32
- IF f%!36 THEN ERROR 1, "Sprite icon name, not pointer to Drag"
- ELSE
- name% = p%+28
- area% = 1 :REM Wimp pool
- ENDIF
- SYS "DragASprite_Start", %10000101, area%, name%, p%+8
- ELSE
- p%!24 = 0
- p%!28 = 0
- p%!32 = logmaxx% :REM external
- p%!36 = logmaxy%
- SYS "Wimp_DragBox",, p%
- ENDIF
- PROC_Release_Stack(q%, 256) :REM external
- PROC_Release_Stack(p%, 64) :REM external
- dragged$ = routine$
- dragged_button% = button%
- ENDPROC
- :
- DEF PROC_User_Drag_Box
- LOCAL x%
- x% = FNeval("FN_Dragged_"+ dragged$)
- IF dragged_button%<>(1*16) THEN
- PROC_Close_All_Menus
- ENDIF
- IF dragged_sprite% THEN
- SYS "DragASprite_Stop"
- ELSE
- SYS "Wimp_DragBox",, -1
- ENDIF
- dragged$ = ""
- ENDPROC
- :
-
- by Cy Booker, 08.10.1992