kolibrios/programs/develop/tinypad/trunk/tp-clipboard.asm
Marat Zakiyanov (Mario79) cfffb7f087 Tinypad - support for kernel clipboard
git-svn-id: svn://kolibrios.org@4487 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-01-19 19:24:16 +00:00

252 lines
4.5 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:
; we have allocated memory?
mov edi,[clipboard_buf]
test edi,edi
jz .end
; convert from Tinypad format to the kernel clipboard format
add edi,3*4
mov esi,[copy_buf]
mov ecx,[copy_count]
cld
;--------------------------------------
@@:
push ecx
lodsd
mov ecx,eax
lodsw
rep movsb
mov ax,0x0a0d
stosw
; mov ax,0x0d
; stosb
pop ecx
dec ecx
jnz @b
xor eax,eax
stosb
; building the clipboard slot header
mov esi,[clipboard_buf]
sub edi,esi
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
; remove unnecessary memory area
xor eax,eax
stdcall mem.ReAlloc,[clipboard_buf],eax
mov [clipboard_buf],eax
xor eax,eax
mov [copy_size],eax
mov [copy_count],eax
stdcall mem.ReAlloc,[copy_buf],eax
mov [copy_buf],eax
;--------------------------------------
.end:
ret
;-----------------------------------------------------------------------------
get_from_clipboard:
pushad
mcall 54,0
; no slots of clipboard ?
test eax,eax
jz .exit
; main list area not found ?
inc eax
test eax,eax
jz .exit
sub eax,2
mov ecx,eax
mcall 54,1
; main list area not found ?
inc eax
test eax,eax
jz .exit
; error ?
sub eax,2
test eax,eax
jz .exit
inc eax
mov [clipboard_buf],eax
; check contents of container
mov ebx,[eax+4]
; check for text
test ebx,ebx
jnz .no_valid_text
mov ebx,[eax+8]
; check for cp866
cmp bl,1
jz .yes_valid_text
.no_valid_text:
xor eax,eax
mov [copy_size],eax
jmp .remove_area
;--------------------------------------
.yes_valid_text:
call know_number_line_breaks
mov [copy_count],ebx
mov eax,[clipboard_buf]
sub esi,eax
mov [eax],esi
shl ebx,1
lea ebx,[ebx*3]
mov eax,[clipboard_buf]
mov eax,[eax]
sub eax,4*3
add eax,ebx
mov [copy_size],eax
stdcall mem.ReAlloc,[copy_buf],eax
mov [copy_buf],eax
call convert_clipboard_buf_to_copy_buf
; remove unnecessary memory area
.remove_area:
xor eax,eax
stdcall mem.ReAlloc,[clipboard_buf],eax
mov [clipboard_buf],eax
;--------------------------------------
.exit:
popad
ret
;-----------------------------------------------------------------------------
convert_clipboard_buf_to_copy_buf:
mov edi,[copy_buf]
mov ebx,edi
add edi,6
mov eax,[clipboard_buf]
mov esi,eax
add esi,4*3
mov ecx,[eax]
sub ecx,4*3
xor edx,edx
cld
;--------------------------------------
.loop:
lodsb
test al,al
jz .inc_counter ;.end_of_data
cmp al,0x0d
je .check_0x0a
cmp al,0x0a
je .inc_counter
dec ecx
jz .end_of_data
stosb
jmp .loop
;--------------------------------------
.check_0x0a:
dec ecx
jz .end_of_data
cmp [esi],byte 0x0a
jne @f
lodsb
;--------------------------------------
.inc_counter:
dec ecx
jz .end_of_data
;--------------------------------------
@@:
mov eax,edi
sub eax,ebx
sub eax,6
.@@111:
mov [ebx],eax
test edx,edx
jz @f
test eax,eax
jz @f
mov [ebx+4],word EDITOR_LINE_FLAG_MOFIFIED
@@:
mov ebx,edi
add edi,6
inc edx
jmp .loop
;--------------------------------------
.end_of_data:
sub edi,[copy_buf]
sub edi,6
mov [copy_size],edi
ret
;-----------------------------------------------------------------------------
know_number_line_breaks:
; to know the number of line breaks
mov eax,[clipboard_buf]
mov esi,eax
add esi,4*3
mov ecx,[eax]
sub ecx,4*3
xor ebx,ebx
cld
;--------------------------------------
@@:
lodsb
test al,al
jz .end_of_data_1
cmp al,0x0d
je .check_0x0a
cmp al,0x0a
je .inc_counter
dec ecx
jnz @b
jmp .end_of_data
;--------------------------------------
.check_0x0a:
inc ebx
dec ecx
jz .end_of_data
cmp [esi],byte 0x0a
jne @b
lodsb
dec ecx
jnz @b
jmp .end_of_data
;--------------------------------------
.inc_counter:
inc ebx
dec ecx
jnz @b
;--------------------------------------
.end_of_data_1:
cmp [esi-2],byte 0x0d
je .end_of_data
cmp [esi-2],byte 0x0a
je .end_of_data
inc ebx
inc esi
;--------------------------------------
.end_of_data:
ret
;-----------------------------------------------------------------------------