Subversion Repositories Kolibri OS

Rev

Rev 6026 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
7300 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2018. 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
 
6023 hidnplayr 22
        push    ebx
3545 hidnplayr 23
; allocate the window data block
6023 hidnplayr 24
        mcall   68, 12, sizeof.window_data
25
        test    eax, eax
26
        pop     ebx
27
        jz      .fail
3545 hidnplayr 28
 
29
; fill it with all zeros
6023 hidnplayr 30
        push    eax
31
        mov     edi, eax
32
        mov     ecx, (sizeof.window_data+3)/4
33
        xor     eax, eax
7300 hidnplayr 34
        rep stosd
6023 hidnplayr 35
        pop     eax
3545 hidnplayr 36
 
6023 hidnplayr 37
        mov     [ebx + window.data_ptr], eax
38
        mov     [ebx + window.flags], FLAG_SCROLL_LOW
4143 hidnplayr 39
 
6023 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
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
4143 hidnplayr 49
 
3545 hidnplayr 50
  .fail:
6023 hidnplayr 51
        ret
3545 hidnplayr 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
 
6023 hidnplayr 65
        lea     edi, [ebx + window.name]
66
        mov     ecx, MAX_WINDOWNAME_LEN
3545 hidnplayr 67
  .loop:
6023 hidnplayr 68
        lodsb
69
        cmp     al, 0x21        ; name ends with 0, space or !
70
        jbe     .addzero
71
        stosb
72
        dec     ecx
73
        jnz     .loop
3545 hidnplayr 74
  .addzero:
6023 hidnplayr 75
        xor     al, al
76
        stosb
3545 hidnplayr 77
 
6023 hidnplayr 78
        push    esi ebx
6026 hidnplayr 79
        call    draw_window_tabs
6023 hidnplayr 80
        pop     ebx esi
3545 hidnplayr 81
 
6023 hidnplayr 82
        ret
3545 hidnplayr 83
 
7300 hidnplayr 84
window_close_all:
3545 hidnplayr 85
 
7300 hidnplayr 86
  .loop:
87
        call    window_close
88
 
89
        cmp     [window_print], 0
90
        jne     .loop
91
 
92
        ret
93
 
94
 
6023 hidnplayr 95
window_close:   ; closes the 'print' window
3981 hidnplayr 96
 
97
; Remove the window (overwrite current structure with trailing ones)
6023 hidnplayr 98
        mov     edi, [window_print]
99
        push    [edi + window.data_ptr]         ; remember data ptr so we can free it later
100
        lea     esi, [edi + sizeof.window]
101
        mov     ecx, windows + MAX_WINDOWS*sizeof.window
102
        sub     ecx, esi
7300 hidnplayr 103
        rep movsb
3981 hidnplayr 104
 
105
; Completely zero the trailing window block (there will always be one!)
6023 hidnplayr 106
        mov     ecx, sizeof.window
107
        xor     al, al
7300 hidnplayr 108
        rep stosb
3981 hidnplayr 109
 
7300 hidnplayr 110
; Clear the window data block to erase the chat history and nicknames
111
        mov     edi, [esp]
112
        mov     ecx, sizeof.window_data         ; TEXT_BUFFERSIZE + MAX_NICK_LEN * MAX_USERS
113
        rep stosb
114
 
115
; And now free the window data block
6023 hidnplayr 116
        pop     ecx
117
        mcall   68, 13
3981 hidnplayr 118
 
119
; We closed this window so we need to show another
7300 hidnplayr 120
        ; Is there still a window in the active position?
6023 hidnplayr 121
        mov     edi, [window_active]
122
        cmp     [edi + window.data_ptr], 0
7300 hidnplayr 123
        jne     .redraw
124
        ; Did we just close the last window?
125
        cmp     edi, windows
126
        je      .closed_last
127
        ; Nope, move one window to the left
6023 hidnplayr 128
        sub     edi, sizeof.window
129
        mov     [window_active], edi
6026 hidnplayr 130
        mov     [window_print], edi
7300 hidnplayr 131
        jmp     .redraw
3981 hidnplayr 132
 
7300 hidnplayr 133
  .closed_last:
134
        xor     edi, edi
135
        mov     [window_active], edi
136
        mov     [window_print], edi
137
 
3981 hidnplayr 138
; At last, redraw everything
7300 hidnplayr 139
  .redraw:
6023 hidnplayr 140
        call    draw_window
3981 hidnplayr 141
 
6023 hidnplayr 142
        ret
3981 hidnplayr 143
 
144
 
4477 hidnplayr 145
; window_find:
146
; search for a window with given name in the window list
147
;
148
; IN:   esi = ptr to start of window name
149
; OUT:  ebx = window ptr, or 0 if none found
150
;       esi = ptr to end of window name, if window was found
3981 hidnplayr 151
 
4477 hidnplayr 152
window_find:
153
 
6023 hidnplayr 154
        mov     ebx, windows
155
        mov     eax, MAX_WINDOWS
4143 hidnplayr 156
  .scanloop:
6023 hidnplayr 157
        push    esi
158
        cmp     [ebx + window.type], WINDOWTYPE_NONE
159
        je      .try_next
160
        lea     edi, [ebx + window.name]
161
        mov     ecx, MAX_WINDOWNAME_LEN
162
        repe    cmpsb
163
        cmp     byte[edi-1], 0          ; last equall character was null? yes, the strings match!
164
        je      .got_it
165
        cmp     byte[edi], 0            ; we're at the end of string1.. ?
166
        jne     .try_next
167
        cmp     byte[esi], 0x21         ; and the end of string2? yes!
168
        jbe     .got_it
4143 hidnplayr 169
  .try_next:
6023 hidnplayr 170
        pop     esi
171
        add     ebx, sizeof.window
172
        dec     eax
173
        jnz     .scanloop
3981 hidnplayr 174
 
6023 hidnplayr 175
        xor     ebx, ebx
176
        ret
4143 hidnplayr 177
 
178
  .got_it:
6023 hidnplayr 179
        add     esp, 4
180
        ret
4143 hidnplayr 181
 
182
 
183
 
4477 hidnplayr 184
; window_open:
3981 hidnplayr 185
; open a window with a given name, if it does not exist, create it
186
; This procedure only affects window_print ptr, not window_active!
187
;
4477 hidnplayr 188
; IN:   esi = ptr to ASCIIZ windowname
189
; OUT:  esi = ptr to next parameter
4623 hidnplayr 190
;       ebx = window ptr/0 on error
4477 hidnplayr 191
 
3981 hidnplayr 192
window_open:
193
 
4477 hidnplayr 194
; Skip heading spaces
6023 hidnplayr 195
        lodsb
196
        cmp     al, ' '
197
        je      window_open
198
        cmp     al, ':'
199
        je      window_open
200
        dec     esi
3981 hidnplayr 201
 
6023 hidnplayr 202
        call    window_find
203
        test    ebx, ebx
204
        jnz     .got_it
3981 hidnplayr 205
 
206
; create channel window - search for empty slot
207
  .create_it:
6023 hidnplayr 208
        mov     ebx, windows
209
        mov     ecx, MAX_WINDOWS
3981 hidnplayr 210
  .scanloop2:
6023 hidnplayr 211
        cmp     [ebx + window.type], WINDOWTYPE_NONE
212
        je      .free_found
213
        add     ebx, sizeof.window
214
        dec     ecx
215
        jnz     .scanloop2
216
        jmp     .error
3981 hidnplayr 217
 
218
  .free_found:
6023 hidnplayr 219
        call    window_create_textbox
220
        test    eax, eax
221
        jz      .error
222
        mov     [ebx + window.type], WINDOWTYPE_CHAT    ; FIXME: let caller handle this ?
3981 hidnplayr 223
 
6023 hidnplayr 224
        call    window_set_name
3981 hidnplayr 225
 
226
  .got_it:
6023 hidnplayr 227
        lodsb
228
        cmp     al, ' '
229
        je      .got_it
230
        cmp     al, ':'
231
        je      .got_it
232
        dec     esi
3981 hidnplayr 233
 
6023 hidnplayr 234
        mov     [window_print], ebx
235
        ret
4477 hidnplayr 236
 
4623 hidnplayr 237
  .error:
6023 hidnplayr 238
        xor     ebx, ebx
239
        ret