Subversion Repositories Kolibri OS

Rev

Rev 4505 | Rev 4566 | 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 ; EOS (end of string)
  20.         stosw
  21. ;       mov     ax,0x0d
  22. ;       stosb
  23.         pop     ecx
  24.         dec     ecx
  25.         jnz     @b
  26.  
  27.         sub     edi,2 ; delete last EOS (0x0a0d)
  28.         xor     eax,eax
  29.         stosb
  30. ; building the clipboard slot header
  31.         mov     esi,[clipboard_buf]
  32.         sub     edi,esi
  33.         mov     [esi],edi ; clipboard area size
  34.         xor     eax,eax
  35.         mov     [esi+4],eax ;   ; type 'text'
  36.         inc     eax
  37.         mov     [esi+8],eax     ; cp866 text encoding
  38. ; put slot to the kernel clipboard
  39.         mov     edx,[clipboard_buf]
  40.         mov     ecx,[edx]
  41.         mcall   54,2
  42. ; remove unnecessary memory area
  43.         xor     eax,eax
  44.         stdcall mem.ReAlloc,[clipboard_buf],eax
  45.         mov     [clipboard_buf],eax
  46.         xor     eax,eax
  47.         mov     [copy_size],eax
  48.         mov     [copy_count],eax
  49.         stdcall mem.ReAlloc,[copy_buf],eax
  50.         mov     [copy_buf],eax
  51. ;--------------------------------------
  52. .end:
  53.         ret
  54. ;-----------------------------------------------------------------------------
  55. get_from_clipboard:
  56.         pushad
  57.         mcall   54,0
  58. ; no slots of clipboard ?
  59.         test    eax,eax
  60.         jz      .exit
  61. ; main list area not found ?   
  62.         inc     eax
  63.         test    eax,eax
  64.         jz      .exit
  65.  
  66.         sub     eax,2
  67.         mov     ecx,eax
  68.         mcall   54,1
  69. ; main list area not found ?
  70.         inc     eax
  71.         test    eax,eax
  72.         jz      .exit
  73. ; error ?
  74.         sub     eax,2
  75.         test    eax,eax
  76.         jz      .exit
  77.        
  78.         inc     eax
  79.         mov     [clipboard_buf],eax
  80. ; check contents of container
  81.         mov     ebx,[eax+4]
  82. ; check for text
  83.         test    ebx,ebx
  84.         jnz     .no_valid_text
  85.        
  86.         mov     ebx,[eax+8]
  87. ; check for cp866
  88.         cmp     bl,1
  89.         jz      .yes_valid_text
  90.        
  91. .no_valid_text:
  92.         xor     eax,eax
  93.         mov     [copy_size],eax
  94.         jmp     .remove_area
  95. ;--------------------------------------
  96. .yes_valid_text:
  97.         call    know_number_line_breaks
  98.         mov     [copy_count],ebx
  99.        
  100.         mov     eax,[clipboard_buf]
  101.         sub     esi,eax
  102.         mov     [eax],esi
  103.  
  104.         shl     ebx,1
  105.         lea     ebx,[ebx*3]
  106.  
  107.         mov     eax,[clipboard_buf]
  108.         mov     eax,[eax]
  109.         sub     eax,4*3
  110.         add     eax,ebx
  111.         mov     [copy_size],eax
  112.  
  113.         stdcall mem.ReAlloc,[copy_buf],eax
  114.         mov     [copy_buf],eax
  115.  
  116.         call    convert_clipboard_buf_to_copy_buf
  117. ; remove unnecessary memory area
  118. .remove_area:
  119.         xor     eax,eax
  120.         stdcall mem.ReAlloc,[clipboard_buf],eax
  121.         mov     [clipboard_buf],eax
  122. ;--------------------------------------
  123. .exit:
  124.         popad
  125.         ret
  126. ;-----------------------------------------------------------------------------
  127. check_clipboard_for_popup:
  128.         pushad
  129.         mov     [popup_valid_text],0
  130.         mcall   54,0
  131. ; no slots of clipboard ?
  132.         test    eax,eax
  133.         jz      .exit
  134. ; main list area not found ?   
  135.         inc     eax
  136.         test    eax,eax
  137.         jz      .exit
  138.  
  139.         sub     eax,2
  140.         mov     ecx,eax
  141.         mcall   54,1
  142. ; main list area not found ?
  143.         inc     eax
  144.         test    eax,eax
  145.         jz      .exit
  146. ; error ?
  147.         sub     eax,2
  148.         test    eax,eax
  149.         jz      .exit
  150.        
  151.         inc     eax
  152.         mov     [clipboard_buf],eax
  153. ; check contents of container
  154.         mov     ebx,[eax+4]
  155. ; check for text
  156.         test    ebx,ebx
  157.         jnz     .remove_area
  158.        
  159.         mov     ebx,[eax+8]
  160. ; check for cp866
  161.         cmp     bl,1
  162.         jnz     .remove_area
  163.  
  164. .yes_valid_text:
  165.         mov     [popup_valid_text],1
  166. ; remove unnecessary memory area
  167. .remove_area:
  168.         xor     eax,eax
  169.         stdcall mem.ReAlloc,[clipboard_buf],eax
  170.         mov     [clipboard_buf],eax
  171. ;--------------------------------------
  172. .exit:
  173.         popad
  174.         ret
  175. ;-----------------------------------------------------------------------------
  176. convert_clipboard_buf_to_copy_buf:
  177.         mov     edi,[copy_buf]
  178.         mov     ebx,edi
  179.         add     edi,6
  180.         mov     eax,[clipboard_buf]
  181.         mov     esi,eax
  182.         add     esi,4*3
  183.         mov     ecx,[eax]
  184.         sub     ecx,4*3-1
  185.         xor     edx,edx
  186.         cld
  187. ;--------------------------------------
  188. .loop:
  189.         lodsb
  190.  
  191.         test    al,al
  192.         jz      .end_of_data
  193.        
  194.         cmp     al,0x0d
  195.         je      .check_0x0a
  196.        
  197.         cmp     al,0x0a
  198.         je      .inc_counter
  199.  
  200.         dec     ecx
  201.         jz      .end_of_data
  202.        
  203.         stosb
  204.         jmp     .loop
  205. ;--------------------------------------
  206. .check_0x0a:
  207.         dec     ecx
  208.         jz      .end_of_data
  209.        
  210.         cmp     [esi],byte 0x0a
  211.         jne     @f
  212.        
  213.         lodsb
  214. ;--------------------------------------
  215. .inc_counter:
  216.         dec     ecx
  217.         jz      .end_of_data
  218. ;--------------------------------------
  219. @@:
  220.         mov     eax,edi
  221.         sub     eax,ebx
  222.         sub     eax,6
  223.         mov     [ebx],eax ; size of current string
  224.         mov     ebx,edi
  225.         add     edi,6
  226.         inc     edx
  227.         jmp     .loop
  228. ;--------------------------------------
  229. .end_of_data:
  230.         mov     eax,edi
  231.         sub     eax,ebx
  232.         sub     eax,6
  233.         mov     [ebx],eax ; size of current string
  234.         sub     edi,[copy_buf]
  235.         mov     [copy_size],edi
  236.         ret
  237. ;-----------------------------------------------------------------------------
  238. know_number_line_breaks:
  239. ; to know the number of line breaks
  240.         mov     eax,[clipboard_buf]
  241.         mov     esi,eax
  242.         add     esi,4*3
  243.         mov     ecx,[eax]
  244.         sub     ecx,4*3
  245.         xor     ebx,ebx
  246.         cld
  247. ;--------------------------------------
  248. @@:
  249.         lodsb
  250.        
  251.         test    al,al
  252.         jz      .end_of_data_1
  253.        
  254.         cmp     al,0x0d
  255.         je      .check_0x0a
  256.        
  257.         cmp     al,0x0a
  258.         je      .inc_counter
  259.        
  260.         dec     ecx
  261.         jnz     @b
  262.        
  263.         jmp     .end_of_data
  264. ;--------------------------------------
  265. .check_0x0a:
  266.         inc     ebx
  267.         dec     ecx
  268.         jz      .end_of_data
  269.        
  270.         cmp     [esi],byte 0x0a
  271.         jne     @b
  272.        
  273.         lodsb
  274.         dec     ecx
  275.         jnz     @b
  276.        
  277.         jmp     .end_of_data
  278. ;--------------------------------------
  279. .inc_counter:
  280.         inc     ebx
  281.         dec     ecx
  282.         jnz     @b
  283. ;--------------------------------------
  284. .end_of_data_1:
  285.         cmp     [esi-2],byte 0x0d
  286.         je      .end_of_data
  287.  
  288.         cmp     [esi-2],byte 0x0a
  289.         je      .end_of_data
  290.  
  291.         inc     ebx
  292.         inc     esi
  293. ;--------------------------------------
  294. .end_of_data:
  295.         inc     ebx
  296.         ret
  297. ;-----------------------------------------------------------------------------