From cfffb7f087627081413fd8a07368e5ed2c337a69 Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Sun, 19 Jan 2014 19:24:16 +0000 Subject: [PATCH] Tinypad - support for kernel clipboard git-svn-id: svn://kolibrios.org@4487 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/tinypad/trunk/data/tp-udata.inc | 1 + programs/develop/tinypad/trunk/tinypad.asm | 3 +- .../develop/tinypad/trunk/tp-clipboard.asm | 252 ++++++++++++++++++ programs/develop/tinypad/trunk/tp-key.asm | 142 +++++----- 4 files changed, 334 insertions(+), 64 deletions(-) create mode 100644 programs/develop/tinypad/trunk/tp-clipboard.asm diff --git a/programs/develop/tinypad/trunk/data/tp-udata.inc b/programs/develop/tinypad/trunk/data/tp-udata.inc index f5f6890f23..8efe9fbf44 100644 --- a/programs/develop/tinypad/trunk/data/tp-udata.inc +++ b/programs/develop/tinypad/trunk/data/tp-udata.inc @@ -104,6 +104,7 @@ exit_tab_num dd ? temp_buf dd ? copy_buf dd ? +clipboard_buf dd ? label color_tbl dword .text dd ? diff --git a/programs/develop/tinypad/trunk/tinypad.asm b/programs/develop/tinypad/trunk/tinypad.asm index 8f0665fa12..26f17c6834 100644 --- a/programs/develop/tinypad/trunk/tinypad.asm +++ b/programs/develop/tinypad/trunk/tinypad.asm @@ -43,7 +43,7 @@ FALSE = 0 ;include 'debug.inc' ;define __DEBUG__ 1 ;define __DEBUG_LEVEL__ 1 -;include 'debug-fdo.inc' +;include '../../../debug-fdo.inc' ; compiled-in options @@ -612,6 +612,7 @@ include 'tp-tbox.asm' include 'tp-tabctl.asm' include 'tp-editor.asm' include 'tp-recode.asm' +include 'tp-clipboard.asm' include '../../../dll.inc' diff --git a/programs/develop/tinypad/trunk/tp-clipboard.asm b/programs/develop/tinypad/trunk/tp-clipboard.asm new file mode 100644 index 0000000000..4a1f7981f7 --- /dev/null +++ b/programs/develop/tinypad/trunk/tp-clipboard.asm @@ -0,0 +1,252 @@ +;----------------------------------------------------------------------------- +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 +;----------------------------------------------------------------------------- \ No newline at end of file diff --git a/programs/develop/tinypad/trunk/tp-key.asm b/programs/develop/tinypad/trunk/tp-key.asm index 9154b92d10..f3cd6bdb6b 100644 --- a/programs/develop/tinypad/trunk/tp-key.asm +++ b/programs/develop/tinypad/trunk/tp-key.asm @@ -482,72 +482,77 @@ endp ;----------------------------------------------------------------------------- proc key.ctrl_c - mov [copy_size],0 - cmp [sel.selected],0 - je .exit + mov [copy_size],0 + cmp [sel.selected],0 + je .exit - call get_selection_size - stdcall mem.ReAlloc,[copy_buf],eax - mov [copy_buf],eax + call get_selection_size + push eax + stdcall mem.ReAlloc,[copy_buf],eax + mov [copy_buf],eax + pop eax + stdcall mem.ReAlloc,[clipboard_buf],eax + mov [clipboard_buf],eax - cld - mov eax,[sel.begin.y] - cmp eax,[sel.end.y] - je .single_line - mov ecx,[sel.begin.y] - call get_line_offset - inc ecx - push ecx - mov edi,[copy_buf] - call get_real_length - sub eax,[sel.begin.x] - jge @f - xor eax,eax - @@: add esi,[sel.begin.x] - add esi,sizeof.EDITOR_LINE_DATA - mov [edi+EDITOR_LINE_DATA.Size],eax - add edi,sizeof.EDITOR_LINE_DATA - mov ecx,eax - jecxz @f - rep movsb - @@: mov ecx,[sel.end.y] - call get_line_offset - pop ecx - cmp ecx,[sel.end.y] - je @f - mov eax,esi - call get_line_offset - sub eax,esi - mov ecx,eax - rep movsb - mov ecx,[sel.end.y] - @@: call get_line_offset - mov eax,[esi+EDITOR_LINE_DATA.Size] - add esi,sizeof.EDITOR_LINE_DATA - cmp eax,[sel.end.x] - jle @f - mov eax,[sel.end.x] - @@: mov ebx,edi - mov [edi+EDITOR_LINE_DATA.Size],eax - add edi,sizeof.EDITOR_LINE_DATA - mov ecx,eax - jecxz @f - rep movsb - sub eax,[sel.end.x] - jz @f - neg eax - mov ecx,eax - add [ebx],eax - mov al,' ' - rep stosb - @@: sub edi,[copy_buf] - mov [copy_size],edi - mov eax,[sel.end.y] - sub eax,[sel.begin.y] - inc eax - mov [copy_count],eax + cld + mov eax,[sel.begin.y] + cmp eax,[sel.end.y] + je .single_line + mov ecx,[sel.begin.y] + call get_line_offset + inc ecx + push ecx + mov edi,[copy_buf] + call get_real_length + sub eax,[sel.begin.x] + jge @f + xor eax,eax + @@: add esi,[sel.begin.x] + add esi,sizeof.EDITOR_LINE_DATA + mov [edi+EDITOR_LINE_DATA.Size],eax + add edi,sizeof.EDITOR_LINE_DATA + mov ecx,eax + jecxz @f + rep movsb + @@: mov ecx,[sel.end.y] + call get_line_offset + pop ecx + cmp ecx,[sel.end.y] + je @f + mov eax,esi + call get_line_offset + sub eax,esi + mov ecx,eax + rep movsb + mov ecx,[sel.end.y] + @@: call get_line_offset + mov eax,[esi+EDITOR_LINE_DATA.Size] + add esi,sizeof.EDITOR_LINE_DATA + cmp eax,[sel.end.x] + jle @f + mov eax,[sel.end.x] + @@: mov ebx,edi + mov [edi+EDITOR_LINE_DATA.Size],eax + add edi,sizeof.EDITOR_LINE_DATA + mov ecx,eax + jecxz @f + rep movsb + sub eax,[sel.end.x] + jz @f + neg eax + mov ecx,eax + add [ebx],eax + mov al,' ' + rep stosb + @@: sub edi,[copy_buf] + mov [copy_size],edi + mov eax,[sel.end.y] + sub eax,[sel.begin.y] + inc eax + mov [copy_count],eax + call put_to_clipboard .exit: - ret + ret .single_line: mov eax,[sel.end.x] @@ -579,6 +584,8 @@ endp ;----------------------------------------------------------------------------- proc key.ctrl_v + call get_from_clipboard + cmp [copy_size],0 je .exit @@ -684,6 +691,15 @@ proc key.ctrl_v mov [cur_editor.Modified],1 .exit: + cmp [copy_size],0 + je .exit_1 +; remove unnecessary memory area + xor eax,eax + mov [copy_size],eax + mov [copy_count],eax + stdcall mem.ReAlloc,[copy_buf],eax + mov [copy_buf],eax +.exit_1: ret .check_columns: