Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;   Written by hidnplayr@kolibrios.org                            ;;
  7. ;;                                                                 ;;
  8. ;;         GNU GENERAL PUBLIC LICENSE                              ;;
  9. ;;          Version 2, June 1991                                   ;;
  10. ;;                                                                 ;;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13. ; window_create_textbox
  14. ; Initialises the data structure for our multiline textbox
  15. ;
  16. ; in:   window ptr in ebx
  17. ; out:  eax = 0 on error
  18. ;       ecx, edi = destroyed
  19.  
  20. window_create_textbox:
  21.  
  22.         push    ebx
  23. ; allocate the window data block
  24.         mcall   68, 12, sizeof.window_data
  25.         test    eax, eax
  26.         pop     ebx
  27.         jz      .fail
  28.  
  29. ; fill it with all zeros
  30.         push    eax
  31.         mov     edi, eax
  32.         mov     ecx, (sizeof.window_data+3)/4
  33.         xor     eax, eax
  34.         rep     stosd
  35.         pop     eax
  36.  
  37.         mov     [ebx + window.data_ptr], eax
  38.         mov     [ebx + window.flags], 0
  39.  
  40.         add     eax, window_data.text+2         ; let text begin at offset 2, this way the text will be prepended with two null bytes
  41.         mov     [ebx + window.text_start], eax
  42.         mov     [ebx + window.text_print], eax
  43.         mov     [ebx + window.text_write], eax
  44.         mov     [ebx + window.text_scanned], eax
  45.         mov     [ebx + window.text_lines], 0
  46.         mov     [ebx + window.text_line_print], 0
  47.         add     eax, TEXT_BUFFERSIZE-1
  48.         mov     [ebx + window.text_end], eax
  49.  
  50.   .fail:
  51.         ret
  52.  
  53.  
  54. ; window_set_name
  55. ; Fills in the window name in window structure
  56. ;
  57. ; IN:   esi = ptr to name
  58. ;       ebx = window ptr
  59. ; OUT:  esi = ptr to next parameter
  60. ;       ebx = window ptr
  61. ;       eax, ecx, edx, edi = destroyed
  62.  
  63. window_set_name:
  64.  
  65.         lea     edi, [ebx + window.name]
  66.         mov     ecx, MAX_WINDOWNAME_LEN
  67.   .loop:
  68.         lodsb
  69.         cmp     al, 0x21        ; name ends with 0, space or !
  70.         jbe     .addzero
  71.         stosb
  72.         dec     ecx
  73.         jnz     .loop
  74.   .addzero:
  75.         xor     al, al
  76.         stosb
  77.  
  78.         push    esi ebx
  79.         call    draw_windowtabs
  80.         pop     ebx esi
  81.  
  82.         ret
  83.  
  84.  
  85.  
  86. window_is_updated:
  87.  
  88.         mov     edi, [window_print]
  89.         cmp     edi, [window_active]
  90.         je      .skip
  91.         test    [edi + window.flags], FLAG_UPDATED
  92.         jnz     .skip
  93.         or      [edi + window.flags], FLAG_UPDATED
  94.  
  95. ; TODO: make some noise
  96.  
  97.         call    draw_windowtabs         ; highlight updated tabs
  98.   .skip:
  99.  
  100.         ret
  101.  
  102.  
  103.  
  104. window_close:   ; closes the 'print' window
  105.  
  106. ; Remove the window (overwrite current structure with trailing ones)
  107.         mov     edi, [window_print]
  108.         push    [edi + window.data_ptr]         ; remember data ptr so we can free it later
  109.         lea     esi, [edi + sizeof.window]
  110.         mov     ecx, windows + MAX_WINDOWS*sizeof.window
  111.         sub     ecx, esi
  112.         rep     movsb
  113.  
  114. ; Completely zero the trailing window block (there will always be one!)
  115.         mov     ecx, sizeof.window
  116.         xor     al, al
  117.         rep     stosb
  118.  
  119. ; free the window data block
  120.         pop     ecx
  121.         mcall   68, 13
  122.  
  123. ; We closed this window so we need to show another
  124.         mov     edi, [window_active]
  125.         cmp     [edi + window.data_ptr], 0
  126.         jne     @f
  127.         sub     edi, sizeof.window
  128.         mov     [window_active], edi
  129.         mov     [window_print], edi  ;;;;;;;;
  130.   @@:
  131.  
  132. ; At last, redraw everything
  133.         call    draw_window
  134.  
  135.         ret
  136.  
  137.  
  138. ; window_find:
  139. ; search for a window with given name in the window list
  140. ;
  141. ; IN:   esi = ptr to start of window name
  142. ; OUT:  ebx = window ptr, or 0 if none found
  143. ;       esi = ptr to end of window name, if window was found
  144.  
  145. window_find:
  146.  
  147.         mov     ebx, windows
  148.         mov     eax, MAX_WINDOWS
  149.   .scanloop:
  150.         push    esi
  151.         cmp     [ebx + window.type], WINDOWTYPE_NONE
  152.         je      .try_next
  153.         lea     edi, [ebx + window.name]
  154.         mov     ecx, MAX_WINDOWNAME_LEN
  155.         repe    cmpsb
  156.         cmp     byte[edi-1], 0          ; last equall character was null? yes, the strings match!
  157.         je      .got_it
  158.         cmp     byte[edi], 0            ; we're at the end of string1.. ?
  159.         jne     .try_next
  160.         cmp     byte[esi], 0x21         ; and the end of string2? yes!
  161.         jbe     .got_it
  162.   .try_next:
  163.         pop     esi
  164.         add     ebx, sizeof.window
  165.         dec     eax
  166.         jnz     .scanloop
  167.  
  168.         xor     ebx, ebx
  169.         ret
  170.  
  171.   .got_it:
  172.         add     esp, 4
  173.         ret
  174.  
  175.  
  176.  
  177. ; window_open:
  178. ; open a window with a given name, if it does not exist, create it
  179. ; This procedure only affects window_print ptr, not window_active!
  180. ;
  181. ; IN:   esi = ptr to ASCIIZ windowname
  182. ; OUT:  esi = ptr to next parameter
  183.  
  184. window_open:
  185.  
  186. ; Skip heading spaces
  187.         lodsb
  188.         cmp     al, ' '
  189.         je      window_open
  190.         cmp     al, ':'
  191.         je      window_open
  192.         dec     esi
  193.  
  194.         call    window_find
  195.         test    ebx, ebx
  196.         jnz     .got_it
  197.  
  198. ; create channel window - search for empty slot
  199.   .create_it:
  200.         mov     ebx, windows
  201.         mov     ecx, MAX_WINDOWS
  202.   .scanloop2:
  203.         cmp     [ebx + window.type], WINDOWTYPE_NONE
  204.         je      .free_found
  205.         add     ebx, sizeof.window
  206.         dec     ecx
  207.         jnz     .scanloop2
  208.         jmp     .error
  209.  
  210.   .free_found:
  211.         call    window_create_textbox
  212.         test    eax, eax
  213.         jz      .error
  214.         mov     [ebx + window.type], WINDOWTYPE_CHAT    ; FIXME: let caller handle this ?
  215.  
  216.         call    window_set_name
  217.  
  218.   .got_it:
  219.         lodsb
  220.         cmp     al, ' '
  221.         je      .got_it
  222.         cmp     al, ':'
  223.         je      .got_it
  224.         dec     esi
  225.  
  226.         mov     [window_print], ebx
  227.         ret
  228.  
  229.   .error:                                               ; TODO: return error?
  230.         ret