Subversion Repositories Kolibri OS

Rev

Rev 4487 | 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. .@@111:
  223.         mov     [ebx],eax
  224.         test    edx,edx
  225.         jz      @f
  226.  
  227.         test    eax,eax
  228.         jz      @f
  229.  
  230.         mov     [ebx+4],word EDITOR_LINE_FLAG_MOFIFIED
  231. @@:
  232.         mov     ebx,edi
  233.         add     edi,6
  234.         inc     edx
  235.         jmp     .loop
  236. ;--------------------------------------
  237. .end_of_data:
  238.         sub     edi,[copy_buf]
  239.         sub     edi,6
  240.         mov     [copy_size],edi
  241.         ret
  242. ;-----------------------------------------------------------------------------
  243. know_number_line_breaks:
  244. ; to know the number of line breaks
  245.         mov     eax,[clipboard_buf]
  246.         mov     esi,eax
  247.         add     esi,4*3
  248.         mov     ecx,[eax]
  249.         sub     ecx,4*3
  250.         xor     ebx,ebx
  251.         cld
  252. ;--------------------------------------
  253. @@:
  254.         lodsb
  255.        
  256.         test    al,al
  257.         jz      .end_of_data_1
  258.        
  259.         cmp     al,0x0d
  260.         je      .check_0x0a
  261.        
  262.         cmp     al,0x0a
  263.         je      .inc_counter
  264.        
  265.         dec     ecx
  266.         jnz     @b
  267.        
  268.         jmp     .end_of_data
  269. ;--------------------------------------
  270. .check_0x0a:
  271.         inc     ebx
  272.         dec     ecx
  273.         jz      .end_of_data
  274.        
  275.         cmp     [esi],byte 0x0a
  276.         jne     @b
  277.        
  278.         lodsb
  279.         dec     ecx
  280.         jnz     @b
  281.        
  282.         jmp     .end_of_data
  283. ;--------------------------------------
  284. .inc_counter:
  285.         inc     ebx
  286.         dec     ecx
  287.         jnz     @b
  288. ;--------------------------------------
  289. .end_of_data_1:
  290.         cmp     [esi-2],byte 0x0d
  291.         je      .end_of_data
  292.  
  293.         cmp     [esi-2],byte 0x0a
  294.         je      .end_of_data
  295.  
  296.         inc     ebx
  297.         inc     esi
  298. ;--------------------------------------
  299. .end_of_data:
  300.         ret
  301. ;-----------------------------------------------------------------------------