Subversion Repositories Kolibri OS

Rev

Rev 4489 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;-----------------------------------------------------------------------------
  2. put_to_clipboard:
  3. ; we have allocated memory?
  4.         mov     edi,[clipboard_buf]
  5.         test    edi,edi
  6.         jz      .end
  7. ; convert from Tinypad format to the kernel clipboard format
  8.         add     edi,3*4
  9.         mov     esi,[copy_buf]
  10.         mov     ecx,[copy_count]
  11.         cld
  12. ;--------------------------------------
  13. @@:
  14.         push    ecx
  15.         lodsd
  16.         mov     ecx,eax
  17.         lodsw
  18.         rep     movsb
  19.         mov     ax,0x0a0d
  20.         stosw
  21. ;       mov     ax,0x0d
  22. ;       stosb
  23.         pop     ecx
  24.         dec     ecx
  25.         jnz     @b
  26.  
  27.         xor     eax,eax
  28.         stosb
  29. ; building the clipboard slot header
  30.         mov     esi,[clipboard_buf]
  31.         sub     edi,esi
  32.         mov     [esi],edi ; clipboard area size
  33.         xor     eax,eax
  34.         mov     [esi+4],eax ;   ; type 'text'
  35.         inc     eax
  36.         mov     [esi+8],eax     ; cp866 text encoding
  37. ; put slot to the kernel clipboard
  38.         mov     edx,[clipboard_buf]
  39.         mov     ecx,[edx]
  40.         mcall   54,2
  41. ; remove unnecessary memory area
  42.         xor     eax,eax
  43.         stdcall mem.ReAlloc,[clipboard_buf],eax
  44.         mov     [clipboard_buf],eax
  45.         xor     eax,eax
  46.         mov     [copy_size],eax
  47.         mov     [copy_count],eax
  48.         stdcall mem.ReAlloc,[copy_buf],eax
  49.         mov     [copy_buf],eax
  50. ;--------------------------------------
  51. .end:
  52.         ret
  53. ;-----------------------------------------------------------------------------
  54. get_from_clipboard:
  55.         pushad
  56.         mcall   54,0
  57. ; no slots of clipboard ?
  58.         test    eax,eax
  59.         jz      .exit
  60. ; main list area not found ?   
  61.         inc     eax
  62.         test    eax,eax
  63.         jz      .exit
  64.  
  65.         sub     eax,2
  66.         mov     ecx,eax
  67.         mcall   54,1
  68. ; main list area not found ?
  69.         inc     eax
  70.         test    eax,eax
  71.         jz      .exit
  72. ; error ?
  73.         sub     eax,2
  74.         test    eax,eax
  75.         jz      .exit
  76.        
  77.         inc     eax
  78.         mov     [clipboard_buf],eax
  79. ; check contents of container
  80.         mov     ebx,[eax+4]
  81. ; check for text
  82.         test    ebx,ebx
  83.         jnz     .no_valid_text
  84.        
  85.         mov     ebx,[eax+8]
  86. ; check for cp866
  87.         cmp     bl,1
  88.         jz      .yes_valid_text
  89.        
  90. .no_valid_text:
  91.         xor     eax,eax
  92.         mov     [copy_size],eax
  93.         jmp     .remove_area
  94. ;--------------------------------------
  95. .yes_valid_text:
  96.         call    know_number_line_breaks
  97.         mov     [copy_count],ebx
  98.        
  99.         mov     eax,[clipboard_buf]
  100.         sub     esi,eax
  101.         mov     [eax],esi
  102.  
  103.         shl     ebx,1
  104.         lea     ebx,[ebx*3]
  105.  
  106.         mov     eax,[clipboard_buf]
  107.         mov     eax,[eax]
  108.         sub     eax,4*3
  109.         add     eax,ebx
  110.         mov     [copy_size],eax
  111.  
  112.         stdcall mem.ReAlloc,[copy_buf],eax
  113.         mov     [copy_buf],eax
  114.  
  115.         call    convert_clipboard_buf_to_copy_buf
  116. ; remove unnecessary memory area
  117. .remove_area:
  118.         xor     eax,eax
  119.         stdcall mem.ReAlloc,[clipboard_buf],eax
  120.         mov     [clipboard_buf],eax
  121. ;--------------------------------------
  122. .exit:
  123.         popad
  124.         ret
  125. ;-----------------------------------------------------------------------------
  126. convert_clipboard_buf_to_copy_buf:
  127.         mov     edi,[copy_buf]
  128.         mov     ebx,edi
  129.         add     edi,6
  130.         mov     eax,[clipboard_buf]
  131.         mov     esi,eax
  132.         add     esi,4*3
  133.         mov     ecx,[eax]
  134.         sub     ecx,4*3
  135.         xor     edx,edx
  136.         cld
  137. ;--------------------------------------
  138. .loop:
  139.         lodsb
  140.        
  141.         test    al,al
  142.         jz      .inc_counter    ;.end_of_data
  143.        
  144.         cmp     al,0x0d
  145.         je      .check_0x0a
  146.        
  147.         cmp     al,0x0a
  148.         je      .inc_counter
  149.        
  150.         dec     ecx
  151.         jz      .end_of_data
  152.        
  153.         stosb
  154.         jmp     .loop
  155. ;--------------------------------------
  156. .check_0x0a:
  157.         dec     ecx
  158.         jz      .end_of_data
  159.        
  160.         cmp     [esi],byte 0x0a
  161.         jne     @f
  162.        
  163.         lodsb
  164. ;--------------------------------------
  165. .inc_counter:
  166.         dec     ecx
  167.         jz      .end_of_data
  168. ;--------------------------------------
  169. @@:
  170.         mov     eax,edi
  171.         sub     eax,ebx
  172.         sub     eax,6
  173. .@@111:
  174.         mov     [ebx],eax
  175.         test    edx,edx
  176.         jz      @f
  177.  
  178.         test    eax,eax
  179.         jz      @f
  180.  
  181.         mov     [ebx+4],word EDITOR_LINE_FLAG_MOFIFIED
  182. @@:
  183.         mov     ebx,edi
  184.         add     edi,6
  185.         inc     edx
  186.         jmp     .loop
  187. ;--------------------------------------
  188. .end_of_data:
  189.         sub     edi,[copy_buf]
  190.         sub     edi,6
  191.         mov     [copy_size],edi
  192.         ret
  193. ;-----------------------------------------------------------------------------
  194. know_number_line_breaks:
  195. ; to know the number of line breaks
  196.         mov     eax,[clipboard_buf]
  197.         mov     esi,eax
  198.         add     esi,4*3
  199.         mov     ecx,[eax]
  200.         sub     ecx,4*3
  201.         xor     ebx,ebx
  202.         cld
  203. ;--------------------------------------
  204. @@:
  205.         lodsb
  206.        
  207.         test    al,al
  208.         jz      .end_of_data_1
  209.        
  210.         cmp     al,0x0d
  211.         je      .check_0x0a
  212.        
  213.         cmp     al,0x0a
  214.         je      .inc_counter
  215.        
  216.         dec     ecx
  217.         jnz     @b
  218.        
  219.         jmp     .end_of_data
  220. ;--------------------------------------
  221. .check_0x0a:
  222.         inc     ebx
  223.         dec     ecx
  224.         jz      .end_of_data
  225.        
  226.         cmp     [esi],byte 0x0a
  227.         jne     @b
  228.        
  229.         lodsb
  230.         dec     ecx
  231.         jnz     @b
  232.        
  233.         jmp     .end_of_data
  234. ;--------------------------------------
  235. .inc_counter:
  236.         inc     ebx
  237.         dec     ecx
  238.         jnz     @b
  239. ;--------------------------------------
  240. .end_of_data_1:
  241.         cmp     [esi-2],byte 0x0d
  242.         je      .end_of_data
  243.  
  244.         cmp     [esi-2],byte 0x0a
  245.         je      .end_of_data
  246.  
  247.         inc     ebx
  248.         inc     esi
  249. ;--------------------------------------
  250. .end_of_data:
  251.         ret
  252. ;-----------------------------------------------------------------------------