forked from KolibriOS/kolibrios
a bit improve ctrl+C\ctrl+V
git-svn-id: svn://kolibrios.org@6965 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
9b6d3da1cf
commit
85f4e052f7
@ -358,7 +358,65 @@ edit_box_key.end:
|
|||||||
call edit_box.draw_shift
|
call edit_box.draw_shift
|
||||||
call edit_box_key.sh_home_end
|
call edit_box_key.sh_home_end
|
||||||
jmp edit_box.draw_cursor_text
|
jmp edit_box.draw_cursor_text
|
||||||
|
;----------------------------------------
|
||||||
|
StrInsert:
|
||||||
|
; SizeOf(TmpBuf) >= StrLen(Src) + StrLen(Dst) + 1
|
||||||
|
Dst equ [esp + 20] ; - destination buffer
|
||||||
|
Src equ [esp + 16] ; - source to insert from
|
||||||
|
Pos equ [esp + 12] ; - position for insert
|
||||||
|
DstMax equ [esp + 8] ; - maximum Dst length(exclude terminating null)
|
||||||
|
TmpBuf equ [esp + 4] ; - temporary buffer
|
||||||
|
xor edx, edx
|
||||||
|
mov esi, Dst
|
||||||
|
mov edi, TmpBuf
|
||||||
|
mov ecx, Pos
|
||||||
|
add edx, ecx
|
||||||
|
rep movsb
|
||||||
|
mov edi, Src
|
||||||
|
mov ecx, -1
|
||||||
|
xor eax, eax
|
||||||
|
repne scasb
|
||||||
|
mov eax, -2
|
||||||
|
sub eax, ecx
|
||||||
|
add edx, eax
|
||||||
|
mov esi, Src
|
||||||
|
mov edi, TmpBuf
|
||||||
|
add edi, Pos
|
||||||
|
mov ecx, eax
|
||||||
|
rep movsb
|
||||||
|
mov ebx, edi
|
||||||
|
mov edi, Dst
|
||||||
|
add edi, Pos
|
||||||
|
mov ecx, -1
|
||||||
|
xor eax, eax
|
||||||
|
repne scasb
|
||||||
|
mov eax, -2
|
||||||
|
sub eax, ecx
|
||||||
|
inc eax
|
||||||
|
add edx, eax
|
||||||
|
mov edi, ebx
|
||||||
|
mov esi, Pos
|
||||||
|
add esi, Dst
|
||||||
|
mov ecx, eax
|
||||||
|
rep movsb
|
||||||
|
mov esi, TmpBuf
|
||||||
|
mov edi, Dst
|
||||||
|
; ecx = MIN(edx, DstSize)
|
||||||
|
cmp edx, DstMax
|
||||||
|
sbb ecx, ecx
|
||||||
|
and edx, ecx
|
||||||
|
not ecx
|
||||||
|
and ecx, DstMax
|
||||||
|
add ecx, edx
|
||||||
|
mov eax, ecx ; return total length
|
||||||
|
rep movsb
|
||||||
|
ret 20
|
||||||
|
restore Dst
|
||||||
|
restore Src
|
||||||
|
restore Pos
|
||||||
|
restore DstSize
|
||||||
|
restore TmpBuf
|
||||||
|
;----------------------------------------
|
||||||
edit_box_key.ctrl_c:
|
edit_box_key.ctrl_c:
|
||||||
; add memory area
|
; add memory area
|
||||||
mov ecx,ed_size
|
mov ecx,ed_size
|
||||||
@ -369,12 +427,24 @@ edit_box_key.ctrl_c:
|
|||||||
mov [eax+4],ecx ; type 'text'
|
mov [eax+4],ecx ; type 'text'
|
||||||
inc ecx
|
inc ecx
|
||||||
mov [eax+8],ecx ; cp866 text encoding
|
mov [eax+8],ecx ; cp866 text encoding
|
||||||
mov ecx,ed_size
|
mov ecx,ed_pos
|
||||||
|
movzx ebx,word ed_shift_pos
|
||||||
|
sub ecx,ebx
|
||||||
|
.abs: ; make ecx = abs(ecx)
|
||||||
|
neg ecx
|
||||||
|
jl .abs
|
||||||
add ecx,3*4
|
add ecx,3*4
|
||||||
mov [eax],ecx
|
mov [eax],ecx
|
||||||
sub ecx,3*4
|
sub ecx,3*4
|
||||||
|
mov edx,ed_pos
|
||||||
|
movzx ebx,word ed_shift_pos
|
||||||
|
cmp edx,ebx
|
||||||
|
jle @f
|
||||||
|
mov edx,ebx
|
||||||
|
@@:
|
||||||
; copy data
|
; copy data
|
||||||
mov esi,ed_text
|
mov esi,ed_text
|
||||||
|
add esi,edx
|
||||||
push edi
|
push edi
|
||||||
mov edi,eax
|
mov edi,eax
|
||||||
add edi,3*4
|
add edi,3*4
|
||||||
@ -424,29 +494,50 @@ edit_box_key.ctrl_v:
|
|||||||
jnz .no_valid_text
|
jnz .no_valid_text
|
||||||
mov ecx,[eax]
|
mov ecx,[eax]
|
||||||
sub ecx,3*4
|
sub ecx,3*4
|
||||||
cmp ecx,ed_max
|
; in ecx size of string to insert
|
||||||
|
add ecx,ed_size
|
||||||
|
mov edx,ed_max
|
||||||
|
sub edx,2 ; 2 reserved for edit_box
|
||||||
|
cmp ecx,edx
|
||||||
jb @f
|
jb @f
|
||||||
mov ecx,ed_max
|
mov ecx,edx
|
||||||
@@:
|
@@:
|
||||||
mov esi,eax
|
mov esi,eax
|
||||||
add esi,3*4
|
add esi,3*4
|
||||||
mov ed_size,ecx
|
|
||||||
mov ed_pos,ecx
|
|
||||||
push eax edi
|
push eax edi
|
||||||
mov edi,ed_text
|
;---------------------------------------;
|
||||||
cld
|
mov ed_size,ecx
|
||||||
@@:
|
inc ecx
|
||||||
lodsb
|
mcall SF_SYS_MISC,SSF_MEM_ALLOC
|
||||||
cmp al,0x0d ; EOS (end of string)
|
push eax ; save mem pointer
|
||||||
je .replace
|
|
||||||
cmp al,0x0a ; EOS (end of string)
|
mov edx, ed_max
|
||||||
jne .continue
|
sub edx, 3 ; +1 for StrInsert, +2 as reserved for edit_box
|
||||||
.replace:
|
|
||||||
mov al,0x20 ; space
|
push dword ed_text ; Dst
|
||||||
.continue:
|
push esi ; Src
|
||||||
stosb
|
push dword ed_pos ; Pos in Dst
|
||||||
dec ecx
|
push edx ; DstMax
|
||||||
jnz @b
|
push eax ; TmpBuf
|
||||||
|
call StrInsert
|
||||||
|
|
||||||
|
pop eax ; restore mem pointer
|
||||||
|
mcall SF_SYS_MISC,SSF_MEM_FREE
|
||||||
|
;---------------------------------------;
|
||||||
|
; mov edi,ed_text
|
||||||
|
; cld
|
||||||
|
;@@:
|
||||||
|
; lodsb
|
||||||
|
; cmp al,0x0d ; EOS (end of string)
|
||||||
|
; je .replace
|
||||||
|
; cmp al,0x0a ; EOS (end of string)
|
||||||
|
; jne .continue
|
||||||
|
;.replace:
|
||||||
|
; mov al,0x20 ; space
|
||||||
|
;.continue:
|
||||||
|
; stosb
|
||||||
|
; dec ecx
|
||||||
|
; jnz @b
|
||||||
pop edi eax
|
pop edi eax
|
||||||
.no_valid_text:
|
.no_valid_text:
|
||||||
; remove unnecessary memory area
|
; remove unnecessary memory area
|
||||||
|
Loading…
Reference in New Issue
Block a user