Subversion Repositories Kolibri OS

Rev

Rev 4489 | Rev 4552 | 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. check_clipboard_for_popup:
  127.         pushad
  128.         mov     [popup_valid_text],0
  129.         mcall   54,0
  130. ; no slots of clipboard ?
  131.         test    eax,eax
  132.         jz      .exit
  133. ; main list area not found ?   
  134.         inc     eax
  135.         test    eax,eax
  136.         jz      .exit
  137.  
  138.         sub     eax,2
  139.         mov     ecx,eax
  140.         mcall   54,1
  141. ; main list area not found ?
  142.         inc     eax
  143.         test    eax,eax
  144.         jz      .exit
  145. ; error ?
  146.         sub     eax,2
  147.         test    eax,eax
  148.         jz      .exit
  149.        
  150.         inc     eax
  151.         mov     [clipboard_buf],eax
  152. ; check contents of container
  153.         mov     ebx,[eax+4]
  154. ; check for text
  155.         test    ebx,ebx
  156.         jnz     .remove_area
  157.        
  158.         mov     ebx,[eax+8]
  159. ; check for cp866
  160.         cmp     bl,1
  161.         jnz     .remove_area
  162.  
  163. .yes_valid_text:
  164.         mov     [popup_valid_text],1
  165. ; remove unnecessary memory area
  166. .remove_area:
  167.         xor     eax,eax
  168.         stdcall mem.ReAlloc,[clipboard_buf],eax
  169.         mov     [clipboard_buf],eax
  170. ;--------------------------------------
  171. .exit:
  172.         popad
  173.         ret
  174. ;-----------------------------------------------------------------------------
  175. convert_clipboard_buf_to_copy_buf:
  176.         mov     edi,[copy_buf]
  177.         mov     ebx,edi
  178.         add     edi,6
  179.         mov     eax,[clipboard_buf]
  180.         mov     esi,eax
  181.         add     esi,4*3
  182.         mov     ecx,[eax]
  183.         sub     ecx,4*3
  184.         xor     edx,edx
  185.         cld
  186. ;--------------------------------------
  187. .loop:
  188.         lodsb
  189.        
  190.         test    al,al
  191.         jz      .inc_counter    ;.end_of_data
  192.        
  193.         cmp     al,0x0d
  194.         je      .check_0x0a
  195.        
  196.         cmp     al,0x0a
  197.         je      .inc_counter
  198.        
  199.         dec     ecx
  200.         jz      .end_of_data
  201.        
  202.         stosb
  203.         jmp     .loop
  204. ;--------------------------------------
  205. .check_0x0a:
  206.         dec     ecx
  207.         jz      .end_of_data
  208.        
  209.         cmp     [esi],byte 0x0a
  210.         jne     @f
  211.        
  212.         lodsb
  213. ;--------------------------------------
  214. .inc_counter:
  215.         dec     ecx
  216.         jz      .end_of_data
  217. ;--------------------------------------
  218. @@:
  219.         mov     eax,edi
  220.         sub     eax,ebx
  221.         sub     eax,6
  222.         mov     [ebx],eax ; size of current string
  223.  
  224.         mov     ebx,edi
  225.         add     edi,6
  226.         inc     edx
  227.         jmp     .loop
  228. ;--------------------------------------
  229. .end_of_data:
  230.         sub     edi,[copy_buf]
  231.         sub     edi,6
  232.         mov     [copy_size],edi
  233.         ret
  234. ;-----------------------------------------------------------------------------
  235. know_number_line_breaks:
  236. ; to know the number of line breaks
  237.         mov     eax,[clipboard_buf]
  238.         mov     esi,eax
  239.         add     esi,4*3
  240.         mov     ecx,[eax]
  241.         sub     ecx,4*3
  242.         xor     ebx,ebx
  243.         cld
  244. ;--------------------------------------
  245. @@:
  246.         lodsb
  247.        
  248.         test    al,al
  249.         jz      .end_of_data_1
  250.        
  251.         cmp     al,0x0d
  252.         je      .check_0x0a
  253.        
  254.         cmp     al,0x0a
  255.         je      .inc_counter
  256.        
  257.         dec     ecx
  258.         jnz     @b
  259.        
  260.         jmp     .end_of_data
  261. ;--------------------------------------
  262. .check_0x0a:
  263.         inc     ebx
  264.         dec     ecx
  265.         jz      .end_of_data
  266.        
  267.         cmp     [esi],byte 0x0a
  268.         jne     @b
  269.        
  270.         lodsb
  271.         dec     ecx
  272.         jnz     @b
  273.        
  274.         jmp     .end_of_data
  275. ;--------------------------------------
  276. .inc_counter:
  277.         inc     ebx
  278.         dec     ecx
  279.         jnz     @b
  280. ;--------------------------------------
  281. .end_of_data_1:
  282.         cmp     [esi-2],byte 0x0d
  283.         je      .end_of_data
  284.  
  285.         cmp     [esi-2],byte 0x0a
  286.         je      .end_of_data
  287.  
  288.         inc     ebx
  289.         inc     esi
  290. ;--------------------------------------
  291. .end_of_data:
  292.         ret
  293. ;-----------------------------------------------------------------------------