Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
4477 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
3545 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
4143 hidnplayr 6
;;   Written by hidnplayr@kolibrios.org                            ;;
3545 hidnplayr 7
;;                                                                 ;;
8
;;         GNU GENERAL PUBLIC LICENSE                              ;;
9
;;          Version 2, June 1991                                   ;;
10
;;                                                                 ;;
11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
 
4477 hidnplayr 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
3545 hidnplayr 19
 
4477 hidnplayr 20
window_create_textbox:
3545 hidnplayr 21
 
4143 hidnplayr 22
        push    ebx
3545 hidnplayr 23
; allocate the window data block
24
        mcall   68, 12, sizeof.window_data
25
        test    eax, eax
4143 hidnplayr 26
        pop     ebx
3545 hidnplayr 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
 
4143 hidnplayr 37
        mov     [ebx + window.data_ptr], eax
38
        mov     [ebx + window.flags], 0
39
 
4621 hidnplayr 40
        add     eax, window_data.text+2         ; let text begin at offset 2, this way the text will be prepended with two null bytes
4143 hidnplayr 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
 
3545 hidnplayr 50
  .fail:
51
        ret
52
 
53
 
4477 hidnplayr 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
3545 hidnplayr 62
 
4477 hidnplayr 63
window_set_name:
3545 hidnplayr 64
 
65
        lea     edi, [ebx + window.name]
66
        mov     ecx, MAX_WINDOWNAME_LEN
67
  .loop:
68
        lodsb
4477 hidnplayr 69
        cmp     al, 0x21        ; name ends with 0, space or !
3545 hidnplayr 70
        jbe     .addzero
71
        stosb
72
        dec     ecx
73
        jnz     .loop
74
  .addzero:
75
        xor     al, al
76
        stosb
77
 
4477 hidnplayr 78
        push    esi ebx
79
        call    draw_windowtabs
80
        pop     ebx esi
3545 hidnplayr 81
 
82
        ret
83
 
84
 
85
 
3981 hidnplayr 86
window_is_updated:
87
 
3545 hidnplayr 88
        mov     edi, [window_print]
4143 hidnplayr 89
        cmp     edi, [window_active]
90
        je      .skip
3545 hidnplayr 91
        test    [edi + window.flags], FLAG_UPDATED
92
        jnz     .skip
93
        or      [edi + window.flags], FLAG_UPDATED
94
 
4143 hidnplayr 95
; TODO: make some noise
3545 hidnplayr 96
 
3981 hidnplayr 97
        call    draw_windowtabs         ; highlight updated tabs
3545 hidnplayr 98
  .skip:
99
 
100
        ret
101
 
102
 
3981 hidnplayr 103
 
4143 hidnplayr 104
window_close:   ; closes the 'print' window
3981 hidnplayr 105
 
106
; Remove the window (overwrite current structure with trailing ones)
4143 hidnplayr 107
        mov     edi, [window_print]
3981 hidnplayr 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
4143 hidnplayr 129
        mov     [window_print], edi  ;;;;;;;;
3981 hidnplayr 130
  @@:
131
 
132
; At last, redraw everything
133
        call    draw_window
134
 
135
        ret
136
 
137
 
4477 hidnplayr 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
3981 hidnplayr 144
 
4477 hidnplayr 145
window_find:
146
 
4143 hidnplayr 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
4477 hidnplayr 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.. ?
4143 hidnplayr 159
        jne     .try_next
4477 hidnplayr 160
        cmp     byte[esi], 0x21         ; and the end of string2? yes!
161
        jbe     .got_it
4143 hidnplayr 162
  .try_next:
163
        pop     esi
164
        add     ebx, sizeof.window
165
        dec     eax
166
        jnz     .scanloop
3981 hidnplayr 167
 
4143 hidnplayr 168
        xor     ebx, ebx
169
        ret
170
 
171
  .got_it:
4477 hidnplayr 172
        add     esp, 4
4143 hidnplayr 173
        ret
174
 
175
 
176
 
4477 hidnplayr 177
; window_open:
3981 hidnplayr 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
;
4477 hidnplayr 181
; IN:   esi = ptr to ASCIIZ windowname
182
; OUT:  esi = ptr to next parameter
183
 
3981 hidnplayr 184
window_open:
185
 
4477 hidnplayr 186
; Skip heading spaces
187
        lodsb
188
        cmp     al, ' '
189
        je      window_open
190
        cmp     al, ':'
191
        je      window_open
192
        dec     esi
3981 hidnplayr 193
 
4143 hidnplayr 194
        call    window_find
195
        test    ebx, ebx
4477 hidnplayr 196
        jnz     .got_it
3981 hidnplayr 197
 
198
; create channel window - search for empty slot
199
  .create_it:
200
        mov     ebx, windows
201
        mov     ecx, MAX_WINDOWS
202
  .scanloop2:
4477 hidnplayr 203
        cmp     [ebx + window.type], WINDOWTYPE_NONE
3981 hidnplayr 204
        je      .free_found
205
        add     ebx, sizeof.window
206
        dec     ecx
207
        jnz     .scanloop2
4477 hidnplayr 208
        jmp     .error
3981 hidnplayr 209
 
210
  .free_found:
4477 hidnplayr 211
        call    window_create_textbox
3981 hidnplayr 212
        test    eax, eax
4477 hidnplayr 213
        jz      .error
4143 hidnplayr 214
        mov     [ebx + window.type], WINDOWTYPE_CHAT    ; FIXME: let caller handle this ?
3981 hidnplayr 215
 
216
        call    window_set_name
217
 
218
  .got_it:
219
        lodsb
220
        cmp     al, ' '
4477 hidnplayr 221
        je      .got_it
3981 hidnplayr 222
        cmp     al, ':'
4477 hidnplayr 223
        je      .got_it
3981 hidnplayr 224
        dec     esi
225
 
4477 hidnplayr 226
        mov     [window_print], ebx
227
        ret
228
 
229
  .error:                                               ; TODO: return error?
4143 hidnplayr 230
        ret