kolibrios/programs/develop/tinypad/trunk/tp-clipboard.asm
0CodErr 9def9b40db decrease value of clipboard area size
git-svn-id: svn://kolibrios.org@6975 a494cfbc-eb01-0410-851d-a64ba20cac60
2017-09-13 10:55:55 +00:00

186 lines
3.3 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

put_to_clipboard:
mov edi,[clipboard_buf]
test edi,edi
jz .end
add edi,12
mov esi,[copy_buf]
mov edx,[copy_count]
mov ax,0x0a0d ; End of String
cld
@@: ; convert format from Tinypad to clipboard
mov ecx,[esi]
add esi,sizeof.EDITOR_LINE_DATA
rep movsb
stosw
dec edx
jnz @b
sub edi,2 ; delete last EoS
xor eax,eax
stosb
; build the clipboard slot header
mov esi,[clipboard_buf]
sub edi,esi
dec edi
mov [esi],edi ; clipboard area size
xor eax,eax
mov [esi+4],eax ; type 'text'
inc eax
mov [esi+8],eax ; cp866 text encoding
; put slot to the kernel clipboard
mov edx,[clipboard_buf]
mov ecx,[edx]
mcall 54,2
stdcall mem.Free,[clipboard_buf]
stdcall mem.Free,[copy_buf]
xor eax,eax
mov [copy_buf],eax
mov [copy_size],eax
mov [copy_count],eax
mov [clipboard_buf],eax
.end:
ret
;---------------------------------------------------------------
get_from_clipboard:
mov [copy_size],0
pushad
mcall 54,0
test eax,eax
jz .exit ; no slots of clipboard
inc eax
jz .exit ; main list area not found
sub eax,2
mov ecx,eax
mcall 54,1
inc eax
jz .exit ; main list area not found
sub eax,2
jz .exit ; error
inc eax
mov [clipboard_buf],eax
; check contents of container
mov ebx,[eax+4]
test ebx,ebx
jnz .freeMemory ; not text
mov ebx,[eax+8]
dec ebx
jnz .freeMemory ; not cp866
mov edi,[clipboard_buf]
mov al, 10
mov ecx,[edi]
add edi,12
sub ecx,12
jbe .freeMemory
cmp byte[edi],0
jz .freeMemory
@@:
dec ecx
cmp byte[edi+ecx],0
jz @b
inc ecx
push ecx
cld
@@: ; count strings
repnz scasb
inc ebx
test ecx,ecx
jnz @b
dec edi
cmp byte[edi],10
jnz @f
inc ebx
@@:
mov [copy_count],ebx
lea eax,[ebx*4+ebx+2]
add eax,[esp]
stdcall mem.Alloc,eax
mov [copy_buf],eax
mov esi,eax
mov edi,[clipboard_buf]
add edi,12
pop ecx
mov ebx,ecx
mov al, 10
.stringSize: ; convert format from clipboard to Tinypad
repnz scasb
sub ebx,ecx
mov edx,edi
sub edi,ebx
dec ebx
test ecx,ecx
jnz .stringEnd
.lastString:
cmp byte[edi+ebx],10
jz .stringEnd
cmp byte[edi+ebx],0
jnz @f
dec ebx
jmp .lastString
.stringEnd:
dec ebx
cmp byte[edi+ebx],13
jz .copyString
@@:
inc ebx
.copyString:
mov [esi],ebx
add esi,sizeof.EDITOR_LINE_DATA
xchg ebx,ecx
xchg esi,edi
rep movsb
mov ecx,ebx
jcxz .done
mov esi,edi
mov edi,edx
jmp .stringSize
.done:
cmp esi,edx
jz @f
inc ecx
mov [edi],ecx
add edi,sizeof.EDITOR_LINE_DATA
mov byte[edi],' '
inc edi
@@:
sub edi,[copy_buf]
mov [copy_size],edi
.freeMemory:
stdcall mem.Free,[clipboard_buf]
mov [clipboard_buf],0
.exit:
popad
ret
;---------------------------------------------------------------
check_clipboard_for_popup:
pushad
mov [popup_valid_text],0
mcall 54,0
test eax,eax
jz .exit ; no slots of clipboard
inc eax
jz .exit ; main list area not found
sub eax,2
mov ecx,eax
mcall 54,1
inc eax
jz .exit ; main list area not found
sub eax,2
jz .exit ; error
inc eax
mov [clipboard_buf],eax
; check contents of container
mov ebx,[eax+4]
test ebx,ebx
jnz .freeMemory ; not text
mov ebx,[eax+8]
dec ebx
jnz .freeMemory ; not cp866
mov [popup_valid_text],1
.freeMemory:
stdcall mem.Free,[clipboard_buf]
mov [clipboard_buf],0
.exit:
popad
ret