Commit 9cc627ac authored by ROOL's avatar ROOL 🤖
Browse files

Clipboard caret/task fixes

Detail:
  In CnPCaret.s
    * Clear any invalid window handles currently stored in caret blocks on Wimp_SetCaretPosition entry
    * Clear R2 on exit if R0=-1,R2=TASK on entry to Wimp_SetCaretPosition
    * If window is not open or able to receive a focus, then return WimpFocus error rather than causing an alignment exception
  In CBTask.s
    A drag to writeable with invalid (eg.rejection due to validation string mismatch or overlong insert) caused ghost caret to be left behind and still deletes the source text.
    * Changed LDR R2,=cbtask_TASK to LDR r2,cbtask3_TASK
    * Ensure cbtask_insert_text_into_icon returns V set on error
    Drag and drop text from icon to non-d&d application, the last message was erroneously sent as DataSaveAck, not Dataload
Admin:
  Submission for Clipboard Support bounty.

Version 5.66. Tagged as 'Wimp-5_66'
parent 0fb14a00
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
GBLS Module_ApplicationDate GBLS Module_ApplicationDate
GBLS Module_HelpVersion GBLS Module_HelpVersion
GBLS Module_ComponentName GBLS Module_ComponentName
Module_MajorVersion SETS "5.65" Module_MajorVersion SETS "5.66"
Module_Version SETA 565 Module_Version SETA 566
Module_MinorVersion SETS "" Module_MinorVersion SETS ""
Module_Date SETS "14 Dec 2019" Module_Date SETS "18 Dec 2019"
Module_ApplicationDate SETS "14-Dec-19" Module_ApplicationDate SETS "18-Dec-19"
Module_ComponentName SETS "Wimp" Module_ComponentName SETS "Wimp"
Module_FullVersion SETS "5.65" Module_FullVersion SETS "5.66"
Module_HelpVersion SETS "5.65 (14 Dec 2019)" Module_HelpVersion SETS "5.66 (18 Dec 2019)"
END END
/* (5.65) /* (5.66)
* *
* This file is automatically maintained by srccommit, do not edit manually. * This file is automatically maintained by srccommit, do not edit manually.
* *
*/ */
#define Module_MajorVersion_CMHG 5.65 #define Module_MajorVersion_CMHG 5.66
#define Module_MinorVersion_CMHG #define Module_MinorVersion_CMHG
#define Module_Date_CMHG 14 Dec 2019 #define Module_Date_CMHG 18 Dec 2019
#define Module_MajorVersion "5.65" #define Module_MajorVersion "5.66"
#define Module_Version 565 #define Module_Version 566
#define Module_MinorVersion "" #define Module_MinorVersion ""
#define Module_Date "14 Dec 2019" #define Module_Date "18 Dec 2019"
#define Module_ApplicationDate "14-Dec-19" #define Module_ApplicationDate "18-Dec-19"
#define Module_ComponentName "Wimp" #define Module_ComponentName "Wimp"
#define Module_FullVersion "5.65" #define Module_FullVersion "5.66"
#define Module_HelpVersion "5.65 (14 Dec 2019)" #define Module_HelpVersion "5.66 (18 Dec 2019)"
#define Module_LibraryVersionInfo "5:65" #define Module_LibraryVersionInfo "5:66"
...@@ -390,6 +390,8 @@ cbtask_paste_filexfer ...@@ -390,6 +390,8 @@ cbtask_paste_filexfer
BVS cbtask_export_finished BVS cbtask_export_finished
; now inform recipient of what we've done ; now inform recipient of what we've done
MOV R0,#Message_DataLoad
STR R0,[R7,#ms_action]
MOV R0,#User_Message_Recorded MOV R0,#User_Message_Recorded
LDR R1,[R7,#ms_myref] LDR R1,[R7,#ms_myref]
STR R1,[R7,#ms_yourref] STR R1,[R7,#ms_yourref]
...@@ -534,6 +536,7 @@ cbtask_pastedata_perform_noxfer ...@@ -534,6 +536,7 @@ cbtask_pastedata_perform_noxfer
; r8,r9=window, icon handle to receive the data ; r8,r9=window, icon handle to receive the data
MOV R0,#clipboard_flexblock_pastedata MOV R0,#clipboard_flexblock_pastedata
BL cbtask_insert_text_into_icon BL cbtask_insert_text_into_icon
CLRV
MOV R0,#clipboard_flexblock_pastedata MOV R0,#clipboard_flexblock_pastedata
MOV R1,#0 MOV R1,#0
BL clipboard_flex_set_block_size BL clipboard_flex_set_block_size
...@@ -589,6 +592,7 @@ cbtask_insert_text_into_icon ...@@ -589,6 +592,7 @@ cbtask_insert_text_into_icon
; invalid paste ; invalid paste
SWI XOS_WriteI+7 SWI XOS_WriteI+7
SETV
B %FT89 B %FT89
71 71
MOV R0,R10 MOV R0,R10
...@@ -682,6 +686,7 @@ cbtask_insert_text_into_icon ...@@ -682,6 +686,7 @@ cbtask_insert_text_into_icon
[ UTF8 [ UTF8
Pull "R8" Pull "R8"
] ]
SETV
B %FT89 ; free up resources B %FT89 ; free up resources
88 88
; report error ; report error
...@@ -2045,7 +2050,7 @@ cbtask_dragdrop_internal_xfer ...@@ -2045,7 +2050,7 @@ cbtask_dragdrop_internal_xfer
LDR R9,ghostcaretdata+ghostcareticon ; icon LDR R9,ghostcaretdata+ghostcareticon ; icon
; remove ghost caret ; remove ghost caret
MOV R0,#-1 MOV R0,#-1
LDR R2,=cbtask_TASK3 LDR R2,cbtask_TASK3
MOV R4,#crf_ghostcaret MOV R4,#crf_ghostcaret
SWI XWimp_SetCaretPosition SWI XWimp_SetCaretPosition
...@@ -2102,7 +2107,7 @@ cbtask_dragdrop_internal_xfer ...@@ -2102,7 +2107,7 @@ cbtask_dragdrop_internal_xfer
; delete selection from source icon if necessary, tidy up ; delete selection from source icon if necessary, tidy up
MOVVC R9,#CNPTRUE MOVVC R9,#CNPTRUE
CLRV
MOV R10,#clipboard_flexblock_dragdata MOV R10,#clipboard_flexblock_dragdata
B cbtask_export_finished B cbtask_export_finished
70 70
...@@ -2262,6 +2267,7 @@ cbtask_dragdrop_internal_xfer ...@@ -2262,6 +2267,7 @@ cbtask_dragdrop_internal_xfer
BLVC cbtask_insert_text_into_icon BLVC cbtask_insert_text_into_icon
MOVVS R9,#CNPFALSE MOVVS R9,#CNPFALSE
MOVVC R9,#CNPTRUE MOVVC R9,#CNPTRUE
CLRV
B cbtask_export_finished B cbtask_export_finished
; --------------------------------------------------------------------------------------- ; ---------------------------------------------------------------------------------------
......
...@@ -29,6 +29,36 @@ ...@@ -29,6 +29,36 @@
int_set_caret_position ROUT int_set_caret_position ROUT
Push "R0-R6,R11,R14" Push "R0-R6,R11,R14"
[ CnP
; if we're called with R5=-1 then R4,R5 are calculated from R0-R3
; however, R4 is undefined on entry so could be anything.
; Internally we'd like to be able to use the call to put a ghost caret
; to a mouse click...
; we're doing the call by a SWI now, so need a way to get ghost caret calculations
; add R5=-2 for this purpose - calculate ghost caret details from x/y coords
; R4 *must* now be a valid flag set
CMP R5,#-1
BNE %FT00
CMP R1,#-1
MOVNE R4,#-1 ; R4 now is -1 (ie no flags)
00
CMP R5,#-2
MOVEQ R5,#-1
]
; validate existing caret blocks
LDR handle,caretdata
CMP handle,#nullptr
BLNE checkhandle
MOVVS handle,#nullptr
STRVS handle,caretdata
LDR handle,ghostcaretdata
CMP handle,#nullptr
BLNE checkhandle
MOVVS handle,#nullptr
STRVS handle,ghostcaretdata
LDR R14,taskhandle ; calling task LDR R14,taskhandle ; calling task
Push "R14" ; preserve for later Push "R14" ; preserve for later
...@@ -73,48 +103,57 @@ int_set_caret_position ROUT ...@@ -73,48 +103,57 @@ int_set_caret_position ROUT
MOV handle,R0 MOV handle,R0
BL checkhandle ; valid window handle? BL checkhandle ; valid window handle?
BVC %FT01 BVC %FT01
BVS wscp_remove_only ; destination isn't valid, so just remove the caret BVS %FT08 ; destination isn't valid, so just remove the caret
07 07
; if we've been called with r0=-1 then we may need to add some flags... ; if we've been called with r0=-1 then we may need to add some flags...
CMP R0,#-1
BNE wscp_remove_only
LDR R14,taskidentifier1 ; 'TASK' LDR R14,taskidentifier1 ; 'TASK'
CMP R2,R14 ; is R2 'TASK' CMP R2,R14 ; is R2 'TASK'
MOVNE R4,#0 ; if we're called with TASK then R4 has correct flags. If not, we need MOVNE R4,#0 ; if we're called with TASK then R4 has correct flags. If not, we need
; to make sure we have some valid flags ; to make sure we have some valid flags
MOVEQ R2,#0 ; if we were called with R2='TASK' then MOVEQ R2,#0 ; if we were called with R2='TASK' then
STREQ R2,[sp,#(2+1)*4] ; ensure R2=0 on return - taskhandle stacked below r2 STREQ R2,[sp,#(2+1+8)*4] ; ensure R2=0 on return - taskhandle stacked below r2
08
SavePSR R6 ; keep V flag for exiting later
Push "R6"
STR R0,[sp,#8] ; preserve error message
MOV R0,#-1 ; carry on as an invalid window handle
wscp_remove_only
BL wscp_remove_current_caret ; remove the caret, queue redraw as necessary BL wscp_remove_current_caret ; remove the caret, queue redraw as necessary
; need to clear the appropriate data blocks ; need to clear the appropriate data blocks
MOV R14,#nullptr MOV R14,#nullptr
TST R4,#crf_ghostcaret :OR: crf_selection ; normal caret? CMP R4,#-1
TSTNE R4,#crf_ghostcaret :OR: crf_selection ; normal caret?
STREQ R14,caretdata STREQ R14,caretdata
BEQ exitsetcaret BEQ exitsetcaret_abort
TST R4,#crf_ghostcaret ; ghost caret? TST R4,#crf_ghostcaret ; ghost caret?
STRNE R14,ghostcaretdata STRNE R14,ghostcaretdata
BNE exitsetcaret BNE exitsetcaret_abort
TST R4,#crf_selection ; unshaded selection? TST R4,#crf_selection ; unshaded selection?
BEQ exitsetcaret BEQ exitsetcaret_abort
LDR R11,selectionwindow LDR R11,selectionwindow
CMP R11,#nullptr CMP R11,#nullptr
BEQ exitsetcaret BEQ exitsetcaret_abort
BL clipboard_check_current_drag_op ; stop drag op if selection has been terminated BL clipboard_check_current_drag_op ; stop drag op if selection has been terminated
Abs R11,R11 Abs R11,R11
STR R14,[R11,#w_seldata] ; update if handle is valid STR R14,[R11,#w_seldata] ; update if handle is valid
STR R14,selectionwindow ; current selection window is now invalid too STR R14,selectionwindow ; current selection window is now invalid too
B exitsetcaret B exitsetcaret_abort
01 01
; continues - r0 is a confirmed valid window handle ; continues - r0 is a confirmed valid window handle
; is the window currently open and able to receive a focus?
Push "R1,R10"
MOV R1,#-1
BL setfocus
Pull "R1,R10"
BVS %BT08 ; no - abort and clear caret
02
; set up the hascaret etc. blocks for the current state of the icon before gaining caret ; set up the hascaret etc. blocks for the current state of the icon before gaining caret
LDR R14,caretdata LDR R14,caretdata
EORS R14,R14,R0 EORS R14,R14,R0
...@@ -272,6 +311,9 @@ wscp_remove_only ...@@ -272,6 +311,9 @@ wscp_remove_only
BL check_shaded_selection_window BL check_shaded_selection_window
BL send_gaincaret BL send_gaincaret
BL focuson BL focuson
MOVVS R14,#nullptr
STRVS R14,[R11]
BVS exitsetcaret
20 20
; redraw the target icon ; redraw the target icon
Push "R0-R2" Push "R0-R2"
...@@ -290,10 +332,11 @@ wscp_workarea ...@@ -290,10 +332,11 @@ wscp_workarea
; no need to calculate string offsets etc ; no need to calculate string offsets etc
; just place the caret and leave ; just place the caret and leave
BL upcaret BL upcaret
BVS %FT21 BVS %FT22
; upcaret corrupts R11 ; upcaret corrupts R11
TST R4,#crf_ghostcaret CMP R4,#-1
TSTNE R4,#crf_ghostcaret
ADREQL R11,caretdata ADREQL R11,caretdata
ADRNEL R11,ghostcaretdata ADRNEL R11,ghostcaretdata
...@@ -312,6 +355,14 @@ wscp_workarea ...@@ -312,6 +355,14 @@ wscp_workarea
MOVVS R14,#nullptr ; if not successful, clear the caret block MOVVS R14,#nullptr ; if not successful, clear the caret block
STRVS R14,[R11,#0] STRVS R14,[R11,#0]
B exitsetcaret B exitsetcaret
22
MOV R14,#nullptr
CMP R4,#-1
TSTNE R4,#crf_ghostcaret
ADREQL R11,caretdata ; upcaret may corrupt R11
ADRNEL R11,ghostcaretdata
STR R14,[R11,#0]
B exitsetcaret
40 40
; we are updating a selection caret ; we are updating a selection caret
BL wscp_remove_current_caret BL wscp_remove_current_caret
...@@ -439,6 +490,9 @@ wscp_workarea ...@@ -439,6 +490,9 @@ wscp_workarea
; fall through... ; fall through...
exitsetcaret exitsetcaret
SavePSR R6
Push "R6"
exitsetcaret_abort
CheckAllWindows "int_set_caret_position (after)" CheckAllWindows "int_set_caret_position (after)"
; do we need to recalculate the main caret? ; do we need to recalculate the main caret?
...@@ -457,14 +511,17 @@ exitsetcaret ...@@ -457,14 +511,17 @@ exitsetcaret
BLNE int_set_icon_state BLNE int_set_icon_state
; and return ; and return
Pull "R6" ; get saved PSR
Pull "R14" ; taskhandle is remembered Pull "R14" ; taskhandle is remembered
Task R14,,"Restoring after SetCaret" Task R14,,"Restoring after SetCaret"
; did we need to move input focus to match the selection? ; did we need to move input focus to match the selection?
LDR R14,refreshmaincaret LDR R14,refreshmaincaret
TEQ R14,#2 TEQ R14,#2
Pull "R0-R6,R11,PC",NE ; no, continue as normal by exiting BEQ %FT01
RestPSR R6
Pull "R0-R6,R11,PC" ; no, continue as normal by exiting
01
; yes. We've finished our things, so we can re-call set_caret_position to set the input focus. ; yes. We've finished our things, so we can re-call set_caret_position to set the input focus.
; that way losefocus/gainfocus messages etc will be sent properly and so on ; that way losefocus/gainfocus messages etc will be sent properly and so on
...@@ -476,6 +533,7 @@ exitsetcaret ...@@ -476,6 +533,7 @@ exitsetcaret
; everything else can stay the same ; everything else can stay the same
BL int_set_caret_position ; back round again for another go BL int_set_caret_position ; back round again for another go
RestPSR R6
Pull "R0-R6,R11,PC" ; finally quit Pull "R0-R6,R11,PC" ; finally quit
wscp_remove_current_caret ROUT wscp_remove_current_caret ROUT
......
...@@ -41,18 +41,6 @@ SWIWimp_SetCaretPosition ROUT ...@@ -41,18 +41,6 @@ SWIWimp_SetCaretPosition ROUT
] ]
] ]
[ CnP
; if we're called with R5=-1 then R4,R5 are calculated from R0-R3
; however, R4 is undefined on entry so could be anything.
; Internally we'd like to be able to use the call to put a ghost caret
; to a mouse click...
; we're doing the call by a SWI now, so need a way to get ghost caret calculations
; add R5=-2 for this purpose - calculate ghost caret details from x/y coords
; R4 *must* now be a valid flag set
CMP R5,#-2
MOVEQ R5,#-1
]
BL int_set_caret_position BL int_set_caret_position
B ExitWimp B ExitWimp
...@@ -557,6 +545,11 @@ getfoclp2 ...@@ -557,6 +545,11 @@ getfoclp2
MOVNE R2,R3 MOVNE R2,R3
BNE getfoclp2 BNE getfoclp2
[ CnP
CMP R1,#-1
BEQ exitsetfocus
]
; Convert to an Abs handle ; Convert to an Abs handle
SUB handle,R2,#w_active_link SUB handle,R2,#w_active_link
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment