Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 5578 → Rev 5579

/programs/develop/tinypad/trunk/tp-clipboard.asm
1,38 → 1,30
;-----------------------------------------------------------------------------
 
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
add edi,12
mov esi,[copy_buf]
mov ecx,[copy_count]
mov edx,[copy_count]
mov ax,0x0a0d ; End of String
cld
;--------------------------------------
@@:
push ecx
lodsd
mov ecx,eax
lodsw
@@: ; convert format from Tinypad to clipboard
mov ecx,[esi]
add esi,sizeof.EDITOR_LINE_DATA
rep movsb
mov ax,0x0a0d ; EOS (end of string)
stosw
; mov ax,0x0d
; stosb
pop ecx
dec ecx
dec edx
jnz @b
 
sub edi,2 ; delete last EOS (0x0a0d)
sub edi,2 ; delete last EoS
xor eax,eax
stosb
; building the clipboard slot header
; build 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'
mov [esi+4],eax ; type 'text'
inc eax
mov [esi+8],eax ; cp866 text encoding
; put slot to the kernel clipboard
39,250 → 31,154
mov edx,[clipboard_buf]
mov ecx,[edx]
mcall 54,2
; remove unnecessary memory area
stdcall mem.Free,[clipboard_buf]
stdcall mem.Free,[copy_buf]
xor eax,eax
stdcall mem.ReAlloc,[clipboard_buf],eax
mov [clipboard_buf],eax
xor eax,eax
mov [copy_buf],eax
mov [copy_size],eax
mov [copy_count],eax
stdcall mem.ReAlloc,[copy_buf],eax
mov [copy_buf],eax
;--------------------------------------
mov [clipboard_buf],eax
.end:
ret
;-----------------------------------------------------------------------------
;---------------------------------------------------------------
get_from_clipboard:
mov [copy_size],0
pushad
mcall 54,0
; no slots of clipboard ?
test eax,eax
jz .exit
; main list area not found ?
jz .exit ; no slots of clipboard
inc eax
test eax,eax
jz .exit
 
jz .exit ; main list area not found
sub eax,2
mov ecx,eax
mcall 54,1
; main list area not found ?
inc eax
test eax,eax
jz .exit
; error ?
jz .exit ; main list area not found
sub eax,2
test eax,eax
jz .exit
jz .exit ; error
inc eax
mov [clipboard_buf],eax
; check contents of container
mov ebx,[eax+4]
; check for text
test ebx,ebx
jnz .no_valid_text
jnz .freeMemory ; not 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
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
; correction of erroneous buffer size
mov eax,[clipboard_buf]
sub esi,eax
mov [eax],esi
; multiple by 6
shl ebx,1
lea ebx,[ebx*3]
; calculating a desired size
mov eax,[clipboard_buf]
mov eax,[eax]
sub eax,4*3
add eax,ebx
mov [copy_size],eax
 
stdcall mem.ReAlloc,[copy_buf],eax
lea eax,[ebx*4+ebx+2]
add eax,[esp]
stdcall mem.Alloc,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
;--------------------------------------
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
; no slots of clipboard ?
test eax,eax
jz .exit
; main list area not found ?
jz .exit ; no slots of clipboard
inc eax
test eax,eax
jz .exit
 
jz .exit ; main list area not found
sub eax,2
mov ecx,eax
mcall 54,1
; main list area not found ?
inc eax
test eax,eax
jz .exit
; error ?
jz .exit ; main list area not found
sub eax,2
test eax,eax
jz .exit
jz .exit ; error
inc eax
mov [clipboard_buf],eax
; check contents of container
mov ebx,[eax+4]
; check for text
test ebx,ebx
jnz .remove_area
jnz .freeMemory ; not text
mov ebx,[eax+8]
; check for cp866
cmp bl,1
jnz .remove_area
 
.yes_valid_text:
dec ebx
jnz .freeMemory ; not cp866
mov [popup_valid_text],1
; remove unnecessary memory area
.remove_area:
xor eax,eax
stdcall mem.ReAlloc,[clipboard_buf],eax
mov [clipboard_buf],eax
;--------------------------------------
.freeMemory:
stdcall mem.Free,[clipboard_buf]
mov [clipboard_buf],0
.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-1
xor edx,edx
cld
;--------------------------------------
.loop:
lodsb
 
test al,al
jz .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
mov [ebx],eax ; size of current string
mov ebx,edi
add edi,6
inc edx
jmp .loop
;--------------------------------------
.end_of_data:
mov eax,edi
sub eax,ebx
sub eax,6
mov [ebx],eax ; size of current string
sub edi,[copy_buf]
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
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:
add ebx,2
inc esi
ret
;-----------------------------------------------------------------------------
/programs/develop/tinypad/trunk/tp-key.asm
589,91 → 589,61
call get_from_clipboard
@@:
cmp [copy_size],0
je .exit
 
je .exit_1
call delete_selection
 
mov eax,[copy_size]
sub eax,sizeof.EDITOR_LINE_DATA
call editor_realloc_lines
 
mov ebx,[cur_editor.Lines.Size]
add ebx,[copy_size]
mov [cur_editor.Lines.Size],ebx
stdcall mem.ReAlloc,[cur_editor.Lines],ebx
mov [cur_editor.Lines],eax
 
mov ecx,[cur_editor.Caret.Y]
call get_line_offset
pushd [esi+EDITOR_LINE_DATA.Size] esi
mov ecx,[cur_editor.Caret.X]
call line_add_spaces
add [esp],eax
add esi,eax
pushd [esi+EDITOR_LINE_DATA.Size]
push esi
lea eax,[esi+ecx+sizeof.EDITOR_LINE_DATA]
mov edi,[cur_editor.Lines]
add edi,[cur_editor.Lines.Size]
dec edi
mov ecx,[copy_size]
mov edi,[copy_count]
test edi,edi
dec edi
jnz @f
sub ecx,sizeof.EDITOR_LINE_DATA
@@:
mov edi,[cur_editor.Lines]
add edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
dec edi
mov eax,esi
mov esi,edi
sub esi,ecx
lea ecx,[eax+sizeof.EDITOR_LINE_DATA]
add ecx,[cur_editor.Caret.X]
neg ecx
lea ecx,[esi+ecx+1]
mov [size_of_moving_area],ecx
neg eax
lea ecx,[esi+eax+1]
std
rep movsb
 
mov ecx,[copy_count]
dec ecx
jz .single_line
 
cld
pop edi
add edi,sizeof.EDITOR_LINE_DATA
mov esi,[copy_buf]
mov eax,[esi+EDITOR_LINE_DATA.Size]
add esi,sizeof.EDITOR_LINE_DATA
mov ecx,[copy_count]
dec ecx
jz .single_line
 
mov ebx,[cur_editor.Caret.X]
add eax,ebx
mov [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
mov [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
sub eax,ebx
add eax,[cur_editor.Caret.X]
mov [edi+EDITOR_LINE_DATA.Size],eax
mov [edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
sub eax,[cur_editor.Caret.X]
call .check_columns
add edi,ebx
@@: push ecx
add edi,[cur_editor.Caret.X]
@@:
push ecx
mov ecx,eax
add edi,sizeof.EDITOR_LINE_DATA
rep movsb
mov eax,[esi+EDITOR_LINE_DATA.Size]
add esi,sizeof.EDITOR_LINE_DATA
mov [edi+EDITOR_LINE_DATA.Size],eax
mov [edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
add edi,sizeof.EDITOR_LINE_DATA
pop ecx
loop @b
 
pop ecx
sub ecx,ebx
ja @f
 
pusha
mov esi,edi
sub edi,sizeof.EDITOR_LINE_DATA
mov ecx,[size_of_moving_area]
cld
rep movsb
popa
jmp .save_cur_editor_values
@@:
add [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],ecx
sub ecx,[cur_editor.Caret.X]
add [edi+EDITOR_LINE_DATA.Size],ecx
call .check_columns
add edi,sizeof.EDITOR_LINE_DATA
mov ecx,eax
rep movsb
.save_cur_editor_values:
684,53 → 654,40
add [cur_editor.Caret.Y],eax
add [cur_editor.SelStart.Y],eax
add [cur_editor.Lines.Count],eax
 
mov [cur_editor.Modified],1
jmp .exit
 
.single_line:
cld
pop edi
add [edi+EDITOR_LINE_DATA.Size],eax
mov [edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
call .check_columns
add edi,sizeof.EDITOR_LINE_DATA
mov esi,[copy_buf]
mov eax,[esi+EDITOR_LINE_DATA.Size]
add esi,sizeof.EDITOR_LINE_DATA
add [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
and [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
or [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
call .check_columns
add edi,[cur_editor.Caret.X]
add esp,4
pop ecx
mov ecx,eax
rep movsb
 
add [cur_editor.Caret.X],eax
add [cur_editor.SelStart.X],eax
 
mov [cur_editor.Modified],1
 
.exit:
cmp [replace_mode],0
jne .exit_1
 
cmp [copy_size],0
je .exit_1
; remove unnecessary memory area
stdcall mem.Free,[copy_buf]
xor eax,eax
mov [copy_buf],eax
mov [copy_size],eax
mov [copy_count],eax
stdcall mem.ReAlloc,[copy_buf],eax
mov [copy_buf],eax
.exit_1:
ret
 
.check_columns:
push eax
mov eax,[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
mov eax,[edi+EDITOR_LINE_DATA.Size]
cmp eax,[cur_editor.Columns.Count]
jbe @f
mov [cur_editor.Columns.Count],eax
@@: pop eax
@@:
pop eax
ret
endp
;-----------------------------------------------------------------------------
812,27 → 769,20
;-----------------------------------------------------------------------------
proc key.up ;///// GO TO PREVIOUS LINE ///////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
call key.shift_up
jmp clear_selection
;-----------------------------------------------------------------------------
key.shift_up: ;///// GO TO PREVIOUS LINE, WITH SELECTION ////////////////
;-----------------------------------------------------------------------------
mov eax,[cur_editor.Caret.Y]
dec eax
jns @f
xor eax,eax
@@: mov ecx,[cur_editor.TopLeft.Y]
cmp eax,ecx
jae @f
mov ecx,[cur_editor.Caret.Y]
dec ecx
jns @f
xor ecx,ecx
@@: test [chr],KM_SHIFT
jnz @f
mov [cur_editor.SelStart.Y],eax
@@: mov [cur_editor.Caret.Y],eax
mov [cur_editor.TopLeft.Y],ecx
 
js .exit
mov [cur_editor.Caret.Y],ecx
call get_line_offset
mov eax,[esi]
cmp eax,[cur_editor.Caret.X]
jnc .exit
mov [cur_editor.Caret.X],eax
.exit:
ret
endp
840,29 → 790,21
;-----------------------------------------------------------------------------
proc key.down ;///// GO TO NEXT LINE /////////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
call key.shift_down
jmp clear_selection
;-----------------------------------------------------------------------------
key.shift_down: ;///// GO TO NEXT LINE, WITH SELECTION //////////////////
;-----------------------------------------------------------------------------
 
mov eax,[cur_editor.Caret.Y]
inc eax
cmp eax,[cur_editor.Lines.Count]
jb @f
dec eax
@@: mov ecx,[cur_editor.TopLeft.Y]
mov edx,eax
sub edx,ecx
cmp edx,[lines.scr]
jb @f
mov ecx,[cur_editor.Caret.Y]
inc ecx
@@: test [chr],KM_SHIFT
jnz @f
mov [cur_editor.SelStart.Y],eax
@@: mov [cur_editor.Caret.Y],eax
mov [cur_editor.TopLeft.Y],ecx
 
cmp [cur_editor.Lines.Count],ecx
jz .exit
mov [cur_editor.Caret.Y],ecx
call get_line_offset
mov eax,[esi]
cmp eax,[cur_editor.Caret.X]
jnc .exit
mov [cur_editor.Caret.X],eax
.exit:
ret
endp
870,8 → 812,8
;-----------------------------------------------------------------------------
proc key.left ;///// GO TO PREVIOUS CHAR /////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
call key.shift_left
jmp clear_selection
;-----------------------------------------------------------------------------
key.shift_left: ;///// GO TO PREVIOUS CHAR, WITH SELECTION //////////////
;-----------------------------------------------------------------------------
878,12 → 820,14
mov eax,[cur_editor.Caret.X]
dec eax
jns @f
inc eax
@@: test [chr],KM_SHIFT
jnz @f
mov [cur_editor.SelStart.X],eax
@@: mov [cur_editor.Caret.X],eax
 
mov ecx,[cur_editor.Caret.Y]
dec ecx
js .exit
mov [cur_editor.Caret.Y],ecx
call get_line_offset
mov eax,[esi]
@@:
mov [cur_editor.Caret.X],eax
.exit:
ret
endp
891,21 → 835,24
;-----------------------------------------------------------------------------
proc key.right ;///// GO TO NEXT CHAR ////////////////////////////////////////
;-----------------------------------------------------------------------------
call clear_selection
 
call key.shift_right
jmp clear_selection
;-----------------------------------------------------------------------------
key.shift_right: ;///// GO TO NEXT CHAR, WITH SELECTION /////////////////
;-----------------------------------------------------------------------------
mov ecx,[cur_editor.Caret.Y]
call get_line_offset
mov eax,[cur_editor.Caret.X]
inc eax
cmp eax,[cur_editor.Columns.Count]
jbe @f
dec eax
@@: test [chr],KM_SHIFT
jnz @f
mov [cur_editor.SelStart.X],eax
@@: mov [cur_editor.Caret.X],eax
 
cmp [esi],eax
jnc @f
inc ecx
cmp [cur_editor.Lines.Count],ecx
jz .exit
xor eax,eax
mov [cur_editor.Caret.Y],ecx
@@:
mov [cur_editor.Caret.X],eax
.exit:
ret
endp
1631,17 → 1578,21
;-----------------------------------------------------------------------------
proc key.f3 ;///// FIND NEXT MATCH ///////////////////////////////////////////
;-----------------------------------------------------------------------------
call search
jc @f
@@: ret
jmp search
endp
 
;-----------------------------------------------------------------------------
proc key.ctrl_f9 ;///// COMPILE //////////////////////////////////////////////
;-----------------------------------------------------------------------------
mov bl,0
jmp start_fasm
endp
 
;-----------------------------------------------------------------------------
proc key.f9 ;///// COMPILE AND RUN ///////////////////////////////////////////
;-----------------------------------------------------------------------------
mov bl,1
call start_fasm
ret
jmp start_fasm
endp
 
;-----------------------------------------------------------------------------
1648,19 → 1599,10
proc key.f10 ;///// COMPILE AND RUN UNDER DEBUG //////////////////////////////
;-----------------------------------------------------------------------------
mov bl,2
call start_fasm
ret
jmp start_fasm
endp
 
;-----------------------------------------------------------------------------
proc key.ctrl_f9 ;///// COMPILE //////////////////////////////////////////////
;-----------------------------------------------------------------------------
mov bl,0
call start_fasm
ret
endp
 
;-----------------------------------------------------------------------------
proc key.alt_x ;///// EXIT PROGRAM ///////////////////////////////////////////
;-----------------------------------------------------------------------------
mov [main_closing],1
/programs/develop/tinypad/trunk/tp-mouse.asm
197,10 → 197,11
mov ecx,6
idiv ecx
@@: add eax,[cur_editor.TopLeft.X]
 
cmp eax,[cur_editor.Columns.Count]
mov ecx, ebx
call get_line_offset
cmp eax,[esi]
jl @f
mov eax,[cur_editor.Columns.Count]
mov eax,[esi]
@@: cmp ebx,[cur_editor.Lines.Count]
jl @f
mov ebx,[cur_editor.Lines.Count]