Rev 112 | Rev 115 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 112 | Rev 114 | ||
---|---|---|---|
1 | get_titlebar_height: ; edi = window draw_data pointer |
1 | get_titlebar_height: ; edi = window draw_data pointer |
2 | mov al,[edi+WDATA.fl_wstyle] |
2 | mov al,[edi+WDATA.fl_wstyle] |
3 | and al,0x0F |
3 | and al,0x0F |
4 | cmp al,0x03 |
4 | cmp al,0x03 |
5 | jne @f |
5 | jne @f |
6 | mov eax,[_skinh] |
6 | mov eax,[_skinh] |
7 | ret |
7 | ret |
8 | @@: mov eax,21 |
8 | @@: mov eax,21 |
9 | ret |
9 | ret |
10 | 10 | ||
11 | get_rolledup_height: ; edi = window draw_data pointer |
11 | get_rolledup_height: ; edi = window draw_data pointer |
12 | mov al,[edi+WDATA.fl_wstyle] |
12 | mov al,[edi+WDATA.fl_wstyle] |
13 | and al,0x0F |
13 | and al,0x0F |
14 | cmp al,0x03 |
14 | cmp al,0x03 |
15 | jne @f |
15 | jne @f |
16 | mov eax,[_skinh] |
16 | mov eax,[_skinh] |
17 | add eax,3 |
17 | add eax,3 |
18 | ret |
18 | ret |
19 | @@: or al,al |
19 | @@: or al,al |
20 | jnz @f |
20 | jnz @f |
21 | mov eax,21 |
21 | mov eax,21 |
22 | ret |
22 | ret |
23 | @@: mov eax,21+2 |
23 | @@: mov eax,21+2 |
24 | ret |
24 | ret |
25 | 25 | ||
26 | 26 | ||
27 | setwindowdefaults: |
27 | setwindowdefaults: |
28 | pushad |
28 | pushad |
29 | 29 | ||
30 | xor eax,eax |
30 | xor eax,eax |
31 | mov ecx,0xc000 |
31 | mov ecx,0xc000 |
32 | @@: |
32 | @@: |
33 | inc eax |
33 | inc eax |
34 | add ecx,2 |
34 | add ecx,2 |
35 | mov [ecx+0x000],ax ; process no |
35 | mov [ecx+0x000],ax ; process no |
36 | mov [ecx+0x400],ax ; positions in stack |
36 | mov [ecx+0x400],ax ; positions in stack |
37 | cmp ecx,0xc400-2 ; the more high, the more surface |
37 | cmp ecx,0xc400-2 ; the more high, the more surface |
38 | jnz @b |
38 | jnz @b |
39 | 39 | ||
40 | popad |
40 | popad |
41 | ret |
41 | ret |
42 | 42 | ||
43 | 43 | ||
44 | 44 | ||
45 | ; eax = cx |
45 | ; eax = cx |
46 | ; ebx = cy |
46 | ; ebx = cy |
47 | ; ecx = ex |
47 | ; ecx = ex |
48 | ; edx = ey |
48 | ; edx = ey |
49 | ; èäåÿ: ïåðåáðàòü âñå îêíà, íà÷èíàÿ ñ ñàìîãî íèæíåãî, |
49 | ; èäåÿ: ïåðåáðàòü âñå îêíà, íà÷èíàÿ ñ ñàìîãî íèæíåãî, |
50 | ; è äëÿ ïîïàâøèõ â çàäàííóþ îáëàñòü |
50 | ; è äëÿ ïîïàâøèõ â çàäàííóþ îáëàñòü |
51 | ; ÷àñòåé îêîí âûçâàòü setscreen |
51 | ; ÷àñòåé îêîí âûçâàòü setscreen |
52 | align 4 |
52 | align 4 |
53 | calculatescreen: |
53 | calculatescreen: |
54 | pushad |
54 | pushad |
55 | pushfd |
55 | pushfd |
56 | cli |
56 | cli |
57 | 57 | ||
58 | push edx ecx ebx eax |
58 | push edx ecx ebx eax |
59 | 59 | ||
60 | mov esi, 1 |
60 | mov esi, 1 |
61 | call setscreen |
61 | call setscreen |
62 | 62 | ||
63 | mov ebp, [0x3004] ; number of processes |
63 | mov ebp, [0x3004] ; number of processes |
64 | cmp ebp, 1 |
64 | cmp ebp, 1 |
65 | jbe .finish |
65 | jbe .finish |
66 | align 4 |
66 | align 4 |
67 | .new_wnd: |
67 | .new_wnd: |
68 | movzx edi, word [0xC400 + esi * 2] |
68 | movzx edi, word [0xC400 + esi * 2] |
69 | shl edi, 5 |
69 | shl edi, 5 |
70 | 70 | ||
71 | cmp [0x3000+edi+0xa], byte 9 |
71 | cmp [0x3000+edi+0xa], byte 9 |
72 | je .not_wnd |
72 | je .not_wnd |
73 | 73 | ||
74 | add edi, window_data |
74 | add edi, window_data |
75 | test [edi+WDATA.fl_wstate], WSTATE_MINIMIZED |
75 | test [edi+WDATA.fl_wstate], WSTATE_MINIMIZED |
76 | jnz .not_wnd |
76 | jnz .not_wnd |
77 | 77 | ||
78 | mov eax, [edi+WDATA.left] |
78 | mov eax,[edi+WDATA.box.left] |
79 | cmp eax, [esp+RECT.right] |
79 | cmp eax, [esp+RECT.right] |
80 | ja .out_of_bounds |
80 | ja .out_of_bounds |
81 | mov ebx, [edi+WDATA.top] |
81 | mov ebx,[edi+WDATA.box.top] |
82 | cmp ebx, [esp+RECT.bottom] |
82 | cmp ebx, [esp+RECT.bottom] |
83 | ja .out_of_bounds |
83 | ja .out_of_bounds |
84 | mov ecx, [edi+WDATA.width] |
84 | mov ecx,[edi+WDATA.box.width] |
85 | add ecx, eax |
85 | add ecx, eax |
86 | cmp ecx, [esp+RECT.left] |
86 | cmp ecx, [esp+RECT.left] |
87 | jb .out_of_bounds |
87 | jb .out_of_bounds |
88 | mov edx, [edi+WDATA.height] |
88 | mov edx,[edi+WDATA.box.height] |
89 | add edx, ebx |
89 | add edx, ebx |
90 | cmp edx, [esp+RECT.top] |
90 | cmp edx, [esp+RECT.top] |
91 | jb .out_of_bounds |
91 | jb .out_of_bounds |
92 | 92 | ||
93 | cmp eax, [esp+RECT.left] |
93 | cmp eax, [esp+RECT.left] |
94 | jae @f |
94 | jae @f |
95 | mov eax, [esp+RECT.left] |
95 | mov eax, [esp+RECT.left] |
96 | @@: |
96 | @@: |
97 | cmp ebx, [esp+RECT.top] |
97 | cmp ebx, [esp+RECT.top] |
98 | jae @f |
98 | jae @f |
99 | mov ebx, [esp+RECT.top] |
99 | mov ebx, [esp+RECT.top] |
100 | @@: |
100 | @@: |
101 | cmp ecx, [esp+RECT.right] |
101 | cmp ecx, [esp+RECT.right] |
102 | jbe @f |
102 | jbe @f |
103 | mov ecx, [esp+RECT.right] |
103 | mov ecx, [esp+RECT.right] |
104 | @@: |
104 | @@: |
105 | cmp edx, [esp+RECT.bottom] |
105 | cmp edx, [esp+RECT.bottom] |
106 | jbe @f |
106 | jbe @f |
107 | mov edx, [esp+RECT.bottom] |
107 | mov edx, [esp+RECT.bottom] |
108 | @@: |
108 | @@: |
109 | 109 | ||
110 | push esi |
110 | push esi |
111 | movzx esi, word [0xC400 + esi * 2] |
111 | movzx esi, word [0xC400 + esi * 2] |
112 | call setscreen |
112 | call setscreen |
113 | pop esi |
113 | pop esi |
114 | 114 | ||
115 | .not_wnd: |
115 | .not_wnd: |
116 | .out_of_bounds: |
116 | .out_of_bounds: |
117 | inc esi |
117 | inc esi |
118 | dec ebp |
118 | dec ebp |
119 | jnz .new_wnd |
119 | jnz .new_wnd |
120 | .finish: |
120 | .finish: |
121 | 121 | ||
122 | pop eax ebx ecx edx |
122 | pop eax ebx ecx edx |
123 | 123 | ||
124 | popfd |
124 | popfd |
125 | popad |
125 | popad |
126 | ret |
126 | ret |
127 | 127 | ||
128 | 128 | ||
129 | 129 | ||
130 | virtual at esp |
130 | virtual at esp |
131 | ff_x dd ? |
131 | ff_x dd ? |
132 | ff_y dd ? |
132 | ff_y dd ? |
133 | ff_width dd ? |
133 | ff_width dd ? |
134 | ff_xsz dd ? |
134 | ff_xsz dd ? |
135 | ff_ysz dd ? |
135 | ff_ysz dd ? |
136 | ff_scale dd ? |
136 | ff_scale dd ? |
137 | end virtual |
137 | end virtual |
138 | 138 | ||
139 | align 4 |
139 | align 4 |
140 | ; ðåçåðâèðóåò ìåñòî ïîä îêíî çàäàííîãî ïðîöåññà |
140 | ; ðåçåðâèðóåò ìåñòî ïîä îêíî çàäàííîãî ïðîöåññà |
141 | setscreen: |
141 | setscreen: |
142 | ; eax x start |
142 | ; eax x start |
143 | ; ebx y start |
143 | ; ebx y start |
144 | ; ecx x end |
144 | ; ecx x end |
145 | ; edx y end |
145 | ; edx y end |
146 | ; esi process number |
146 | ; esi process number |
147 | pushad |
147 | pushad |
148 | mov edi, esi ;;;word [esi*2+0xc400] |
148 | mov edi, esi ;;;word [esi*2+0xc400] |
149 | shl edi, 8 |
149 | shl edi, 8 |
150 | add edi, 0x80000+0x80 ; address of random shaped window area |
150 | add edi, 0x80000+0x80 ; address of random shaped window area |
151 | cmp [edi], dword 0 |
151 | cmp [edi], dword 0 |
152 | jne .free_form |
152 | jne .free_form |
153 | 153 | ||
154 | ; get x&y size |
154 | ; get x&y size |
155 | sub ecx, eax |
155 | sub ecx, eax |
156 | sub edx, ebx |
156 | sub edx, ebx |
157 | inc ecx |
157 | inc ecx |
158 | inc edx |
158 | inc edx |
159 | 159 | ||
160 | ; get WinMap start |
160 | ; get WinMap start |
161 | mov edi, [0xFE00] ; screen_sx |
161 | mov edi, [0xFE00] ; screen_sx |
162 | inc edi |
162 | inc edi |
163 | imul edi, ebx |
163 | imul edi, ebx |
164 | add edi, eax |
164 | add edi, eax |
165 | add edi, WinMapAddress |
165 | add edi, WinMapAddress |
166 | 166 | ||
167 | .new_y: |
167 | .new_y: |
168 | push ecx ; sx |
168 | push ecx ; sx |
169 | push edx |
169 | push edx |
170 | 170 | ||
171 | mov edx, esi |
171 | mov edx, esi |
172 | align 4 |
172 | align 4 |
173 | .new_x: |
173 | .new_x: |
174 | mov byte [edi], dl |
174 | mov byte [edi], dl |
175 | inc edi |
175 | inc edi |
176 | dec ecx |
176 | dec ecx |
177 | jnz .new_x |
177 | jnz .new_x |
178 | 178 | ||
179 | pop edx |
179 | pop edx |
180 | pop ecx |
180 | pop ecx |
181 | add edi, [0xFE00] |
181 | add edi, [0xFE00] |
182 | inc edi |
182 | inc edi |
183 | sub edi, ecx |
183 | sub edi, ecx |
184 | dec edx |
184 | dec edx |
185 | jnz .new_y |
185 | jnz .new_y |
186 | popad |
186 | popad |
187 | ret |
187 | ret |
188 | .read_byte: |
188 | .read_byte: |
189 | ;eax - address |
189 | ;eax - address |
190 | ;esi - slot |
190 | ;esi - slot |
191 | push eax |
191 | push eax |
192 | push ebx |
192 | push ebx |
193 | push ecx |
193 | push ecx |
194 | push edx |
194 | push edx |
195 | mov edx,eax |
195 | mov edx,eax |
196 | mov eax,esi |
196 | mov eax,esi |
197 | lea ebx,[esp+12] |
197 | lea ebx,[esp+12] |
198 | mov ecx,1 |
198 | mov ecx,1 |
199 | call read_process_memory |
199 | call read_process_memory |
200 | pop edx |
200 | pop edx |
201 | pop ecx |
201 | pop ecx |
202 | pop ebx |
202 | pop ebx |
203 | pop eax |
203 | pop eax |
204 | ret |
204 | ret |
205 | .free_form: |
205 | .free_form: |
206 | 206 | ||
207 | ; for (y=0; y <= x_size; y++) |
207 | ; for (y=0; y <= x_size; y++) |
208 | ; for (x=0; x <= x_size; x++) |
208 | ; for (x=0; x <= x_size; x++) |
209 | ; if (shape[coord(x,y,scale)]==1) |
209 | ; if (shape[coord(x,y,scale)]==1) |
210 | ; set_pixel(x, y, process_number); |
210 | ; set_pixel(x, y, process_number); |
211 | 211 | ||
212 | sub ecx, eax |
212 | sub ecx, eax |
213 | sub edx, ebx |
213 | sub edx, ebx |
214 | inc ecx |
214 | inc ecx |
215 | inc edx |
215 | inc edx |
216 | 216 | ||
217 | push dword [edi+4] ; push scale first -> for loop |
217 | push dword [edi+4] ; push scale first -> for loop |
218 | 218 | ||
219 | ; get WinMap start -> ebp |
219 | ; get WinMap start -> ebp |
220 | push eax |
220 | push eax |
221 | mov eax, [0xFE00] ; screen_sx |
221 | mov eax, [0xFE00] ; screen_sx |
222 | inc eax |
222 | inc eax |
223 | imul eax, ebx |
223 | imul eax, ebx |
224 | add eax, [esp] |
224 | add eax, [esp] |
225 | add eax, WinMapAddress |
225 | add eax, WinMapAddress |
226 | mov ebp, eax |
226 | mov ebp, eax |
227 | 227 | ||
228 | mov edi, [edi] |
228 | mov edi, [edi] |
229 | pop eax |
229 | pop eax |
230 | 230 | ||
231 | ; eax = x_start |
231 | ; eax = x_start |
232 | ; ebx = y_start |
232 | ; ebx = y_start |
233 | ; ecx = x_size |
233 | ; ecx = x_size |
234 | ; edx = y_size |
234 | ; edx = y_size |
235 | ; esi = process_number |
235 | ; esi = process_number |
236 | ; edi = &shape |
236 | ; edi = &shape |
237 | ; [scale] |
237 | ; [scale] |
238 | push edx ecx ; for loop - x,y size |
238 | push edx ecx ; for loop - x,y size |
239 | 239 | ||
240 | mov ecx, esi |
240 | mov ecx, esi |
241 | shl ecx, 5 |
241 | shl ecx, 5 |
242 | mov edx, [window_data+ecx+WDATA.top] |
242 | mov edx, [window_data+ecx+WDATA.box.top] |
243 | push [window_data+ecx+WDATA.width] ; for loop - width |
243 | push [window_data+ecx+WDATA.box.width] ; for loop - width |
244 | mov ecx, [window_data+ecx+WDATA.left] |
244 | mov ecx, [window_data+ecx+WDATA.box.left] |
245 | sub ebx, edx |
245 | sub ebx, edx |
246 | sub eax, ecx |
246 | sub eax, ecx |
247 | push ebx eax ; for loop - x,y |
247 | push ebx eax ; for loop - x,y |
248 | 248 | ||
249 | add [ff_xsz], eax |
249 | add [ff_xsz], eax |
250 | add [ff_ysz], ebx |
250 | add [ff_ysz], ebx |
251 | 251 | ||
252 | mov ebx, [ff_y] |
252 | mov ebx, [ff_y] |
253 | 253 | ||
254 | .ff_new_y: |
254 | .ff_new_y: |
255 | mov edx, [ff_x] |
255 | mov edx, [ff_x] |
256 | 256 | ||
257 | .ff_new_x: |
257 | .ff_new_x: |
258 | ; -- body -- |
258 | ; -- body -- |
259 | mov ecx, [ff_scale] |
259 | mov ecx, [ff_scale] |
260 | mov eax, [ff_width] |
260 | mov eax, [ff_width] |
261 | inc eax |
261 | inc eax |
262 | shr eax, cl |
262 | shr eax, cl |
263 | push ebx edx |
263 | push ebx edx |
264 | shr ebx, cl |
264 | shr ebx, cl |
265 | shr edx, cl |
265 | shr edx, cl |
266 | imul eax, ebx |
266 | imul eax, ebx |
267 | add eax, edx |
267 | add eax, edx |
268 | pop edx ebx |
268 | pop edx ebx |
269 | add eax, edi |
269 | add eax, edi |
270 | call .read_byte |
270 | call .read_byte |
271 | test al,al |
271 | test al,al |
272 | jz @f |
272 | jz @f |
273 | mov eax, esi |
273 | mov eax, esi |
274 | mov [ebp], al |
274 | mov [ebp], al |
275 | @@: |
275 | @@: |
276 | ; -- end body -- |
276 | ; -- end body -- |
277 | inc ebp |
277 | inc ebp |
278 | inc edx |
278 | inc edx |
279 | cmp edx, [ff_xsz] |
279 | cmp edx, [ff_xsz] |
280 | jb .ff_new_x |
280 | jb .ff_new_x |
281 | sub ebp, [ff_xsz] |
281 | sub ebp, [ff_xsz] |
282 | add ebp, [ff_x] |
282 | add ebp, [ff_x] |
283 | add ebp, [0xFE00] ; screen.x |
283 | add ebp, [0xFE00] ; screen.x |
284 | inc ebp |
284 | inc ebp |
285 | inc ebx |
285 | inc ebx |
286 | cmp ebx, [ff_ysz] |
286 | cmp ebx, [ff_ysz] |
287 | jb .ff_new_y |
287 | jb .ff_new_y |
288 | 288 | ||
289 | add esp, 24 |
289 | add esp, 24 |
290 | popad |
290 | popad |
291 | ret |
291 | ret |
292 | 292 | ||
293 | 293 | ||
294 | display_settings: |
294 | display_settings: |
295 | 295 | ||
296 | ; eax = 0 ; DISPLAY redraw |
296 | ; eax = 0 ; DISPLAY redraw |
297 | ; ebx = 0 ; all |
297 | ; ebx = 0 ; all |
298 | ; |
298 | ; |
299 | ; eax = 1 ; BUTTON type |
299 | ; eax = 1 ; BUTTON type |
300 | ; ebx = 0 ; flat |
300 | ; ebx = 0 ; flat |
301 | ; ebx = 1 ; 3D |
301 | ; ebx = 1 ; 3D |
302 | ; eax = 2 ; set WINDOW colours |
302 | ; eax = 2 ; set WINDOW colours |
303 | ; ebx = pointer to table |
303 | ; ebx = pointer to table |
304 | ; ecx = number of bytes define |
304 | ; ecx = number of bytes define |
305 | ; eax = 3 ; get WINDOW colours |
305 | ; eax = 3 ; get WINDOW colours |
306 | ; ebx = pointer to table |
306 | ; ebx = pointer to table |
307 | ; ecx = number of bytes wanted |
307 | ; ecx = number of bytes wanted |
308 | ; eax = 4 ; get skin height |
308 | ; eax = 4 ; get skin height |
309 | ; input : nothing |
309 | ; input : nothing |
310 | ; output : eax = skin height in pixel |
310 | ; output : eax = skin height in pixel |
311 | ; eax = 5 ; get screen workarea |
311 | ; eax = 5 ; get screen workarea |
312 | ; input : nothing |
312 | ; input : nothing |
313 | ; output : eax = [left]*65536+[right] |
313 | ; output : eax = [left]*65536+[right] |
314 | ; ebx = [top]*65536+[bottom] |
314 | ; ebx = [top]*65536+[bottom] |
315 | ; eax = 6 ; set screen workarea |
315 | ; eax = 6 ; set screen workarea |
316 | ; input : ecx = [left]*65536+[right] |
316 | ; input : ecx = [left]*65536+[right] |
317 | ; edx = [top]*65536+[bottom] |
317 | ; edx = [top]*65536+[bottom] |
318 | ; output : nothing |
318 | ; output : nothing |
319 | ; eax = 7 ; get skin margins |
319 | ; eax = 7 ; get skin margins |
320 | ; input : nothing |
320 | ; input : nothing |
321 | ; output : eax = [left]*65536+[right] |
321 | ; output : eax = [left]*65536+[right] |
322 | ; ebx = [top]*65536+[bottom] |
322 | ; ebx = [top]*65536+[bottom] |
323 | ; eax = 8 ; set window skin |
323 | ; eax = 8 ; set window skin |
324 | ; input : ecx = pointer to file info block |
324 | ; input : ecx = pointer to file info block |
325 | ; output : eax = FS error code |
325 | ; output : eax = FS error code |
326 | 326 | ||
327 | 327 | ||
328 | pushad |
328 | pushad |
329 | 329 | ||
330 | test eax, eax ; redraw display |
330 | test eax, eax ; redraw display |
331 | jnz dspl0 |
331 | jnz dspl0 |
332 | test ebx, ebx |
332 | test ebx, ebx |
333 | jnz dspl0 |
333 | jnz dspl0 |
334 | cmp [windowtypechanged],dword 1 |
334 | cmp [windowtypechanged],dword 1 |
335 | jne dspl00 |
335 | jne dspl00 |
336 | mov [windowtypechanged],dword 0 |
336 | mov [windowtypechanged],dword 0 |
337 | redraw_screen_direct: |
337 | redraw_screen_direct: |
338 | mov [dlx],dword 0 |
338 | mov [dlx],dword 0 |
339 | mov [dly],dword 0 |
339 | mov [dly],dword 0 |
340 | mov eax,[0xfe00] |
340 | mov eax,[0xfe00] |
341 | mov [dlxe],eax |
341 | mov [dlxe],eax |
342 | mov eax,[0xfe04] |
342 | mov eax,[0xfe04] |
343 | mov [dlye],eax |
343 | mov [dlye],eax |
344 | mov eax,window_data |
344 | mov eax,window_data |
345 | call redrawscreen |
345 | call redrawscreen |
346 | dspl00: |
346 | dspl00: |
347 | popad |
347 | popad |
348 | ret |
348 | ret |
349 | dspl0: |
349 | dspl0: |
350 | 350 | ||
351 | cmp eax,1 ; button type |
351 | cmp eax,1 ; button type |
352 | jne dspl1 |
352 | jne dspl1 |
353 | and ebx,1 |
353 | and ebx,1 |
354 | cmp ebx,[buttontype] |
354 | cmp ebx,[buttontype] |
355 | je dspl9 |
355 | je dspl9 |
356 | mov [buttontype],ebx |
356 | mov [buttontype],ebx |
357 | mov [windowtypechanged],dword 1 |
357 | mov [windowtypechanged],dword 1 |
358 | dspl9: |
358 | dspl9: |
359 | popad |
359 | popad |
360 | ret |
360 | ret |
361 | dspl1: |
361 | dspl1: |
362 | 362 | ||
363 | cmp eax,2 ; set common window colours |
363 | cmp eax,2 ; set common window colours |
364 | jne no_com_colours |
364 | jne no_com_colours |
365 | mov [windowtypechanged],dword 1 |
365 | mov [windowtypechanged],dword 1 |
366 | mov esi,[0x3010] |
366 | mov esi,[0x3010] |
367 | add esi,0x10 |
367 | add esi,0x10 |
368 | add ebx,[esi] |
368 | add ebx,[esi] |
369 | mov esi,ebx |
369 | mov esi,ebx |
370 | mov edi,common_colours |
370 | mov edi,common_colours |
371 | and ecx,127 |
371 | and ecx,127 |
372 | cld |
372 | cld |
373 | rep movsb |
373 | rep movsb |
374 | popad |
374 | popad |
375 | ret |
375 | ret |
376 | no_com_colours: |
376 | no_com_colours: |
377 | 377 | ||
378 | cmp eax,3 ; get common window colours |
378 | cmp eax,3 ; get common window colours |
379 | jne no_get_com |
379 | jne no_get_com |
380 | mov esi,[0x3010] |
380 | mov esi,[0x3010] |
381 | add esi,0x10 |
381 | add esi,0x10 |
382 | add ebx,[esi] |
382 | add ebx,[esi] |
383 | mov edi,ebx |
383 | mov edi,ebx |
384 | mov esi,common_colours |
384 | mov esi,common_colours |
385 | and ecx,127 |
385 | and ecx,127 |
386 | cld |
386 | cld |
387 | rep movsb |
387 | rep movsb |
388 | popad |
388 | popad |
389 | ret |
389 | ret |
390 | no_get_com: |
390 | no_get_com: |
391 | 391 | ||
392 | cmp eax,4 ; get skin height |
392 | cmp eax,4 ; get skin height |
393 | jne no_skin_height |
393 | jne no_skin_height |
394 | popad |
394 | popad |
395 | mov eax,[_skinh] |
395 | mov eax,[_skinh] |
396 | mov [esp+36],eax |
396 | mov [esp+36],eax |
397 | ret |
397 | ret |
398 | no_skin_height: |
398 | no_skin_height: |
399 | 399 | ||
400 | cmp eax,5 ; get screen workarea |
400 | cmp eax,5 ; get screen workarea |
401 | jne no_get_workarea |
401 | jne no_get_workarea |
402 | popad |
402 | popad |
403 | mov eax,[screen_workarea.left-2] |
403 | mov eax,[screen_workarea.left-2] |
404 | mov ax,word[screen_workarea.right] |
404 | mov ax,word[screen_workarea.right] |
405 | mov [esp+36],eax |
405 | mov [esp+36],eax |
406 | mov eax,[screen_workarea.top-2] |
406 | mov eax,[screen_workarea.top-2] |
407 | mov ax,word[screen_workarea.bottom] |
407 | mov ax,word[screen_workarea.bottom] |
408 | mov [esp+24],eax |
408 | mov [esp+24],eax |
409 | ret |
409 | ret |
410 | no_get_workarea: |
410 | no_get_workarea: |
411 | 411 | ||
412 | cmp eax,6 ; set screen workarea |
412 | cmp eax,6 ; set screen workarea |
413 | jne no_set_workarea |
413 | jne no_set_workarea |
414 | movsx eax,word[esp+16+2] |
414 | movsx eax,word[esp+16+2] |
415 | movsx ebx,word[esp+16] |
415 | movsx ebx,word[esp+16] |
416 | cmp eax,ebx |
416 | cmp eax,ebx |
417 | jge .lp1 |
417 | jge .lp1 |
418 | or eax,eax;[0xFE00] |
418 | or eax,eax;[0xFE00] |
419 | jl @f |
419 | jl @f |
420 | mov [screen_workarea.left],eax |
420 | mov [screen_workarea.left],eax |
421 | @@: cmp ebx,[0xFE00] |
421 | @@: cmp ebx,[0xFE00] |
422 | jg .lp1 |
422 | jg .lp1 |
423 | mov [screen_workarea.right],ebx |
423 | mov [screen_workarea.right],ebx |
424 | .lp1: movsx eax,word[esp+24+2] |
424 | .lp1: movsx eax,word[esp+24+2] |
425 | movsx ebx,word[esp+24] |
425 | movsx ebx,word[esp+24] |
426 | cmp eax,ebx |
426 | cmp eax,ebx |
427 | jge .lp2 |
427 | jge .lp2 |
428 | or eax,eax;[0xFE04] |
428 | or eax,eax;[0xFE04] |
429 | jl @f |
429 | jl @f |
430 | mov [screen_workarea.top],eax |
430 | mov [screen_workarea.top],eax |
431 | @@: cmp ebx,[0xFE04] |
431 | @@: cmp ebx,[0xFE04] |
432 | jg .lp2 |
432 | jg .lp2 |
433 | mov [screen_workarea.bottom],ebx |
433 | mov [screen_workarea.bottom],ebx |
434 | .lp2: call repos_windows |
434 | .lp2: call repos_windows |
435 | mov eax, 0 |
435 | mov eax, 0 |
436 | mov ebx, 0 |
436 | mov ebx, 0 |
437 | mov ecx, [0xfe00] |
437 | mov ecx, [0xfe00] |
438 | mov edx, [0xfe04] |
438 | mov edx, [0xfe04] |
439 | call calculatescreen |
439 | call calculatescreen |
440 | ; jmp redraw_screen_direct |
440 | ; jmp redraw_screen_direct |
441 | .exit: |
441 | .exit: |
442 | popad |
442 | popad |
443 | ret |
443 | ret |
444 | no_set_workarea: |
444 | no_set_workarea: |
445 | 445 | ||
446 | cmp eax,7 ; get skin margins |
446 | cmp eax,7 ; get skin margins |
447 | jne no_get_skinmargins |
447 | jne no_get_skinmargins |
448 | popad |
448 | popad |
449 | mov eax,dword[_skinmargins+0] |
449 | mov eax,dword[_skinmargins+0] |
450 | mov [esp+36],eax |
450 | mov [esp+36],eax |
451 | mov eax,dword[_skinmargins+4] |
451 | mov eax,dword[_skinmargins+4] |
452 | mov [esp+24],eax |
452 | mov [esp+24],eax |
453 | ret |
453 | ret |
454 | no_get_skinmargins: |
454 | no_get_skinmargins: |
455 | 455 | ||
456 | cmp eax,8 ; set window skin |
456 | cmp eax,8 ; set window skin |
457 | jne no_set_skin |
457 | jne no_set_skin |
458 | mov eax,ebx |
458 | mov eax,ebx |
459 | mov edi,[0x3010] |
459 | mov edi,[0x3010] |
460 | add ebx,[edi+0x10] ; abs start of info block |
460 | add ebx,[edi+0x10] ; abs start of info block |
461 | pushd [ebx+0] [ebx+4] [ebx+8] [ebx+12] |
461 | pushd [ebx+0] [ebx+4] [ebx+8] [ebx+12] |
462 | mov dword[ebx+0],0 ; read |
462 | mov dword[ebx+0],0 ; read |
463 | mov dword[ebx+4],0 ; from the beginning |
463 | mov dword[ebx+4],0 ; from the beginning |
464 | mov dword[ebx+8],64 ; 32 KBytes maximum |
464 | mov dword[ebx+8],64 ; 32 KBytes maximum |
465 | mov ecx,skin_data+64*512 |
465 | mov ecx,skin_data+64*512 |
466 | sub ecx,[edi+0x10] |
466 | sub ecx,[edi+0x10] |
467 | mov dword[ebx+12],ecx ; destination |
467 | mov dword[ebx+12],ecx ; destination |
468 | push eax |
468 | push eax |
469 | pushad |
469 | pushad |
470 | call file_system |
470 | call file_system |
471 | popad |
471 | popad |
472 | pop eax |
472 | pop eax |
473 | popd [ebx+12] [ebx+8] [ebx+4] [ebx+0] |
473 | popd [ebx+12] [ebx+8] [ebx+4] [ebx+0] |
474 | cmp eax,ERROR_SUCCESS |
474 | cmp eax,ERROR_SUCCESS |
475 | je @f |
475 | je @f |
476 | cmp eax,ERROR_END_OF_FILE |
476 | cmp eax,ERROR_END_OF_FILE |
477 | jne .exit |
477 | jne .exit |
478 | @@: cmp [skin_data+64*512+SKIN_HEADER.ident],'SKIN' |
478 | @@: cmp [skin_data+64*512+SKIN_HEADER.ident],'SKIN' |
479 | mov eax,ERROR_UNKNOWN_FS |
479 | mov eax,ERROR_UNKNOWN_FS |
480 | jne .exit |
480 | jne .exit |
481 | mov esi,skin_data+64*512 |
481 | mov esi,skin_data+64*512 |
482 | mov edi,skin_data |
482 | mov edi,skin_data |
483 | mov ecx,(64*512)/4 |
483 | mov ecx,(64*512)/4 |
484 | rep movsd |
484 | rep movsd |
485 | call parse_skin_data |
485 | call parse_skin_data |
486 | pushad |
486 | pushad |
487 | mov eax, 0 |
487 | mov eax, 0 |
488 | mov ebx, 0 |
488 | mov ebx, 0 |
489 | mov ecx, [0xfe00] |
489 | mov ecx, [0xfe00] |
490 | mov edx, [0xfe04] |
490 | mov edx, [0xfe04] |
491 | call calculatescreen |
491 | call calculatescreen |
492 | popad |
492 | popad |
493 | mov dword[esp+32+36],0 |
493 | mov dword[esp+32+36],0 |
494 | jmp redraw_screen_direct |
494 | jmp redraw_screen_direct |
495 | .exit: |
495 | .exit: |
496 | mov [esp+32+36],eax |
496 | mov [esp+32+36],eax |
497 | popad |
497 | popad |
498 | ret |
498 | ret |
499 | no_set_skin: |
499 | no_set_skin: |
500 | 500 | ||
501 | popad |
501 | popad |
502 | ret |
502 | ret |
503 | 503 | ||
504 | 504 | ||
505 | repos_windows: |
505 | repos_windows: |
506 | mov ecx,[0x3004] |
506 | mov ecx,[0x3004] |
507 | mov esi,0x20*2 |
507 | mov esi,0x20*2 |
508 | mov byte[0x0000fff0],1 |
508 | mov byte[0x0000fff0],1 |
509 | dec ecx |
509 | dec ecx |
510 | jge @f |
510 | jge @f |
511 | ret |
511 | ret |
512 | @@: mov [esi+WDATA.fl_redraw],1 |
512 | @@: mov [esi+WDATA.fl_redraw],1 |
513 | test [esi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
513 | test [esi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
514 | jz .lp2 |
514 | jz .lp2 |
515 | mov eax,[screen_workarea.left] |
515 | mov eax,[screen_workarea.left] |
516 | mov [esi+WDATA.left],eax |
516 | mov [esi+WDATA.box.left],eax |
517 | sub eax,[screen_workarea.right] |
517 | sub eax,[screen_workarea.right] |
518 | neg eax |
518 | neg eax |
519 | mov [esi+WDATA.width],eax |
519 | mov [esi+WDATA.box.width],eax |
520 | mov eax,[screen_workarea.top] |
520 | mov eax,[screen_workarea.top] |
521 | mov [esi+WDATA.top],eax |
521 | mov [esi+WDATA.box.top],eax |
522 | test [esi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
522 | test [esi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
523 | jnz .lp1 |
523 | jnz .lp1 |
524 | sub eax,[screen_workarea.bottom] |
524 | sub eax,[screen_workarea.bottom] |
525 | neg eax |
525 | neg eax |
526 | mov [esi+WDATA.height],eax |
526 | mov [esi+WDATA.box.height],eax |
527 | .lp1: add esi,0x20 |
527 | .lp1: add esi,0x20 |
528 | loop @b |
528 | loop @b |
529 | ret |
529 | ret |
530 | .lp2: mov eax,[esi+WDATA.left] |
530 | .lp2: mov eax,[esi+WDATA.box.left] |
531 | add eax,[esi+WDATA.width] |
531 | add eax,[esi+WDATA.box.width] |
532 | mov ebx,[0x0000fe00] |
532 | mov ebx,[0x0000fe00] |
533 | ; inc ebx |
533 | ; inc ebx |
534 | cmp eax,ebx |
534 | cmp eax,ebx |
535 | jle .lp4 |
535 | jle .lp4 |
536 | mov eax,[esi+WDATA.width] |
536 | mov eax,[esi+WDATA.box.width] |
537 | sub eax,ebx |
537 | sub eax,ebx |
538 | jle .lp3 |
538 | jle .lp3 |
539 | mov [esi+WDATA.width],ebx |
539 | mov [esi+WDATA.box.width],ebx |
540 | .lp3: sub ebx,[esi+WDATA.width] |
540 | .lp3: sub ebx,[esi+WDATA.box.width] |
541 | mov [esi+WDATA.left],ebx |
541 | mov [esi+WDATA.box.left],ebx |
542 | .lp4: mov eax,[esi+WDATA.top] |
542 | .lp4: mov eax,[esi+WDATA.box.top] |
543 | add eax,[esi+WDATA.height] |
543 | add eax,[esi+WDATA.box.height] |
544 | mov ebx,[0x0000fe04] |
544 | mov ebx,[0x0000fe04] |
545 | ; inc ebx |
545 | ; inc ebx |
546 | cmp eax,ebx |
546 | cmp eax,ebx |
547 | jle .lp6 |
547 | jle .lp6 |
548 | mov eax,[esi+WDATA.height] |
548 | mov eax,[esi+WDATA.box.height] |
549 | sub eax,ebx |
549 | sub eax,ebx |
550 | jle .lp5 |
550 | jle .lp5 |
551 | mov [esi+WDATA.height],ebx |
551 | mov [esi+WDATA.box.height],ebx |
552 | .lp5: sub ebx,[esi+WDATA.height] |
552 | .lp5: sub ebx,[esi+WDATA.box.height] |
553 | mov [esi+WDATA.top],ebx |
553 | mov [esi+WDATA.box.top],ebx |
554 | .lp6: add esi,0x20 |
554 | .lp6: add esi,0x20 |
555 | loop @b |
555 | loop @b |
556 | ret |
556 | ret |
557 | 557 | ||
558 | uglobal |
558 | uglobal |
559 | common_colours: |
559 | common_colours: |
560 | times 128 db 0x0 |
560 | times 128 db 0x0 |
561 | endg |
561 | endg |
562 | 562 | ||
563 | 563 | ||
564 | 564 | ||
565 | 565 | ||
566 | check_window_position: |
566 | check_window_position: |
567 | 567 | ||
568 | pushad ; window inside screen ? |
568 | pushad ; window inside screen ? |
569 | 569 | ||
570 | movzx eax,word [edi+0] |
570 | movzx eax,word [edi+0] |
571 | movzx ebx,word [edi+4] |
571 | movzx ebx,word [edi+4] |
572 | movzx ecx,word [edi+8] |
572 | movzx ecx,word [edi+8] |
573 | movzx edx,word [edi+12] |
573 | movzx edx,word [edi+12] |
574 | 574 | ||
575 | mov esi,ecx ; check x pos |
575 | mov esi,ecx ; check x pos |
576 | add esi,eax |
576 | add esi,eax |
577 | cmp esi,[0xfe00] |
577 | cmp esi,[0xfe00] |
578 | jbe x_pos_ok |
578 | jbe x_pos_ok |
579 | mov [edi+0],dword 0 |
579 | mov [edi+0],dword 0 |
580 | xor eax, eax |
580 | xor eax, eax |
581 | x_pos_ok: |
581 | x_pos_ok: |
582 | 582 | ||
583 | mov esi,edx ; check y pos |
583 | mov esi,edx ; check y pos |
584 | add esi,ebx |
584 | add esi,ebx |
585 | cmp esi,[0xfe04] |
585 | cmp esi,[0xfe04] |
586 | jbe y_pos_ok |
586 | jbe y_pos_ok |
587 | mov [edi+4],dword 0 |
587 | mov [edi+4],dword 0 |
588 | mov ebx,0 |
588 | mov ebx,0 |
589 | y_pos_ok: |
589 | y_pos_ok: |
590 | 590 | ||
591 | mov esi,ecx ; check x size |
591 | mov esi,ecx ; check x size |
592 | add esi,eax |
592 | add esi,eax |
593 | cmp esi,[0xfe00] |
593 | cmp esi,[0xfe00] |
594 | jbe x_size_ok |
594 | jbe x_size_ok |
595 | mov ecx,[0xfe00] |
595 | mov ecx,[0xfe00] |
596 | mov [edi+8],ecx |
596 | mov [edi+8],ecx |
597 | x_size_ok: |
597 | x_size_ok: |
598 | 598 | ||
599 | mov esi,edx ; check y size |
599 | mov esi,edx ; check y size |
600 | add esi,ebx |
600 | add esi,ebx |
601 | cmp esi,[0xfe04] |
601 | cmp esi,[0xfe04] |
602 | jbe y_size_ok |
602 | jbe y_size_ok |
603 | mov edx,[0xfe04] |
603 | mov edx,[0xfe04] |
604 | mov [edi+12],edx |
604 | mov [edi+12],edx |
605 | y_size_ok: |
605 | y_size_ok: |
606 | 606 | ||
607 | popad |
607 | popad |
608 | 608 | ||
609 | ret |
609 | ret |
610 | 610 | ||
611 | 611 | ||
612 | uglobal |
612 | uglobal |
613 | new_window_starting dd 0 |
613 | new_window_starting dd 0 |
614 | endg |
614 | endg |
615 | 615 | ||
616 | 616 | ||
617 | sys_window_mouse: |
617 | sys_window_mouse: |
618 | 618 | ||
619 | push eax |
619 | push eax |
620 | 620 | ||
621 | mov eax,[timer_ticks] ;[0xfdf0] |
621 | mov eax,[timer_ticks] ;[0xfdf0] |
622 | cmp [new_window_starting],eax |
622 | cmp [new_window_starting],eax |
623 | jb swml1 |
623 | jb swml1 |
624 | 624 | ||
625 | mov [0xfff4],byte 0 ; no mouse background |
625 | mov [0xfff4],byte 0 ; no mouse background |
626 | mov [0xfff5],byte 0 ; draw mouse |
626 | mov [0xfff5],byte 0 ; draw mouse |
627 | 627 | ||
628 | mov [new_window_starting],eax |
628 | mov [new_window_starting],eax |
629 | 629 | ||
630 | swml1: |
630 | swml1: |
631 | 631 | ||
632 | pop eax |
632 | pop eax |
633 | 633 | ||
634 | ret |
634 | ret |
635 | - | ||
636 | drawwindow_I: |
- | |
637 | - | ||
638 | pushad |
- | |
639 | - | ||
640 | mov esi,[edx+24] ; rectangle |
- | |
641 | mov eax,[edx+0] |
- | |
642 | shl eax,16 |
- | |
643 | add eax,[edx+0] |
- | |
644 | add eax,[edx+8] |
- | |
645 | mov ebx,[edx+04] |
- | |
- | 635 | ||
646 | shl ebx,16 |
636 | |
647 | add ebx,[edx+4] |
637 | |
648 | add ebx,[edx+12] |
638 | |
649 | call draw_rectangle |
639 | drawwindow_I_caption: |
650 | 640 | ||
651 | mov ecx,[edx+20] ; grab bar |
641 | mov ecx,[edx+20] ; grab bar |
652 | push ecx |
642 | push ecx |
653 | mov esi,edx |
643 | mov esi,edx |
654 | mov edx,[esi+04] |
644 | mov edx,[esi+04] |
655 | add edx,1 |
645 | add edx,1 |
656 | mov ebx,[esi+04] |
646 | mov ebx,[esi+04] |
657 | add ebx,25 |
647 | add ebx,21 |
658 | mov eax,[esi+04] |
648 | mov eax,[esi+04] |
659 | add eax,[esi+12] |
649 | add eax,[esi+12] |
660 | cmp ebx,eax |
650 | cmp ebx,eax |
661 | jb wdsizeok |
651 | jb .wdsizeok |
662 | mov ebx,eax |
652 | mov ebx,eax |
663 | wdsizeok: |
653 | .wdsizeok: |
664 | push ebx |
654 | push ebx |
665 | drwi: |
655 | .drwi: |
666 | mov ebx,edx |
656 | mov ebx,edx |
667 | shl ebx,16 |
657 | shl ebx,16 |
668 | add ebx,edx |
658 | add ebx,edx |
669 | mov eax,[esi+00] |
659 | mov eax,[esi+00] |
670 | inc eax |
660 | inc eax |
671 | shl eax,16 |
661 | shl eax,16 |
672 | add eax,[esi+00] |
662 | add eax,[esi+00] |
673 | add eax,[esi+8] |
663 | add eax,[esi+8] |
674 | sub eax,1 |
664 | sub eax,1 |
675 | push edx |
665 | push edx |
676 | mov edx,0x80000000 |
666 | mov edx,0x80000000 |
677 | mov ecx,[esi+20] |
667 | mov ecx,[esi+20] |
678 | and ecx,edx |
668 | and ecx,edx |
679 | cmp ecx,edx |
669 | cmp ecx,edx |
680 | jnz nofa |
670 | jnz .nofa |
681 | mov ecx,[esi+20] |
671 | mov ecx,[esi+20] |
682 | sub ecx,0x00040404 |
672 | sub ecx,0x00040404 |
683 | mov [esi+20],ecx |
673 | mov [esi+20],ecx |
684 | and ecx,0x00ffffff |
674 | and ecx,0x00ffffff |
685 | jmp faj |
675 | jmp .faj |
686 | nofa: |
676 | .nofa: |
687 | mov ecx,[esi+20] |
677 | mov ecx,[esi+20] |
688 | and ecx,0x00ffffff |
678 | and ecx,0x00ffffff |
689 | faj: |
679 | .faj: |
690 | pop edx |
680 | pop edx |
691 | mov edi,0 |
681 | mov edi,0 |
692 | call [draw_line] |
682 | call [draw_line] |
693 | inc edx |
683 | inc edx |
694 | cmp edx,[esp] |
684 | cmp edx,[esp] |
695 | jb drwi |
685 | jb .drwi |
696 | add esp,4 |
686 | add esp,4 |
697 | pop ecx |
687 | pop ecx |
698 | mov [esi+20],ecx |
688 | mov [esi+20],ecx |
- | 689 | ||
- | 690 | ret |
|
- | 691 | ||
- | 692 | ||
- | 693 | drawwindow_I: |
|
- | 694 | ||
- | 695 | pushad |
|
- | 696 | ||
- | 697 | mov esi,[edx+24] ; rectangle |
|
- | 698 | mov eax,[edx+0] |
|
- | 699 | shl eax,16 |
|
- | 700 | add eax,[edx+0] |
|
- | 701 | add eax,[edx+8] |
|
- | 702 | mov ebx,[edx+04] |
|
- | 703 | shl ebx,16 |
|
- | 704 | add ebx,[edx+4] |
|
- | 705 | add ebx,[edx+12] |
|
- | 706 | call draw_rectangle |
|
- | 707 | ||
- | 708 | call drawwindow_I_caption |
|
699 | 709 | ||
700 | mov edx,[esi+04] ; inside work area |
710 | mov edx,[esi+04] ; inside work area |
701 | add edx,21+5 |
711 | add edx,21+5 |
702 | mov ebx,[esi+04] |
712 | mov ebx,[esi+04] |
703 | add ebx,[esi+12] |
713 | add ebx,[esi+12] |
704 | cmp edx,ebx |
714 | cmp edx,ebx |
705 | jg noinside |
715 | jg noinside |
706 | mov eax,1 |
716 | mov eax,1 |
707 | mov ebx,21 |
717 | mov ebx,21 |
708 | mov ecx,[esi+8] |
718 | mov ecx,[esi+8] |
709 | mov edx,[esi+12] |
719 | mov edx,[esi+12] |
710 | mov edi,[esi+16] |
720 | mov edi,[esi+16] |
711 | call [drawbar] |
721 | call [drawbar] |
712 | noinside: |
722 | noinside: |
713 | 723 | ||
714 | popad |
724 | popad |
715 | 725 | ||
716 | ret |
726 | ret |
717 | 727 | ||
718 | 728 | ||
719 | draw_rectangle: |
729 | draw_rectangle: |
720 | 730 | ||
721 | r_eax equ [esp+28] ; x start |
731 | r_eax equ [esp+28] ; x start |
722 | r_ax equ [esp+30] ; x end |
732 | r_ax equ [esp+30] ; x end |
723 | r_ebx equ [esp+16] ; y start |
733 | r_ebx equ [esp+16] ; y start |
724 | r_bx equ [esp+18] ; y end |
734 | r_bx equ [esp+18] ; y end |
725 | ;esi ; color |
735 | ;esi ; color |
726 | 736 | ||
727 | pushad |
737 | pushad |
728 | 738 | ||
729 | mov ecx,esi ; yb,xb -> yb,xe |
739 | mov ecx,esi ; yb,xb -> yb,xe |
730 | mov eax, r_eax |
740 | mov eax, r_eax |
731 | rol eax, 16 |
741 | rol eax, 16 |
732 | mov ebx,r_ebx |
742 | mov ebx,r_ebx |
733 | shl ebx,16 |
743 | shl ebx,16 |
734 | mov bx,r_ebx |
744 | mov bx,r_ebx |
735 | xor edi, edi |
745 | xor edi, edi |
736 | call [draw_line] |
746 | call [draw_line] |
737 | 747 | ||
738 | mov ebx,r_bx ; ye,xb -> ye,xe |
748 | mov ebx,r_bx ; ye,xb -> ye,xe |
739 | shl ebx,16 |
749 | shl ebx,16 |
740 | mov bx,r_bx |
750 | mov bx,r_bx |
741 | call [draw_line] |
751 | call [draw_line] |
742 | 752 | ||
743 | mov ecx,esi ; ya,xa -> ye,xa |
753 | mov ecx,esi ; ya,xa -> ye,xa |
744 | mov eax,r_eax |
754 | mov eax,r_eax |
745 | shl eax,16 |
755 | shl eax,16 |
746 | mov ax,r_eax |
756 | mov ax,r_eax |
747 | mov ebx,r_ebx |
757 | mov ebx,r_ebx |
748 | shl ebx,16 |
758 | shl ebx,16 |
749 | mov bx,r_bx |
759 | mov bx,r_bx |
750 | mov edi,0 |
760 | mov edi,0 |
751 | call [draw_line] |
761 | call [draw_line] |
752 | 762 | ||
753 | mov eax,r_ax ; ya,xe -> ye,xe |
763 | mov eax,r_ax ; ya,xe -> ye,xe |
754 | shl eax,16 |
764 | shl eax,16 |
755 | mov ax,r_ax |
765 | mov ax,r_ax |
756 | call [draw_line] |
766 | call [draw_line] |
757 | 767 | ||
758 | popad |
768 | popad |
759 | ret |
769 | ret |
760 | 770 | ||
761 | 771 | ||
762 | drawwindow_III: |
- | |
763 | - | ||
764 | pushad |
- | |
765 | - | ||
766 | mov edi,edx ; RECTANGLE |
- | |
767 | mov eax,[edi+0] |
- | |
768 | shl eax,16 |
- | |
769 | mov ax,[edi+0] |
- | |
770 | add ax,[edi+8] |
- | |
771 | mov ebx,[edi+4] |
- | |
772 | shl ebx,16 |
- | |
773 | mov bx,[edi+4] |
- | |
774 | add bx,[edi+12] |
- | |
775 | mov esi,[edi+24] |
- | |
776 | shr esi,1 |
- | |
777 | and esi,0x007f7f7f |
- | |
778 | push esi |
- | |
779 | call draw_rectangle |
- | |
780 | mov ecx,3 |
- | |
781 | dw3l: |
- | |
782 | add eax,1*65536-1 |
- | |
783 | add ebx,1*65536-1 |
- | |
784 | mov esi,[edi+24] |
- | |
785 | call draw_rectangle |
- | |
786 | dec ecx |
- | |
787 | jnz dw3l |
- | |
788 | pop esi |
- | |
789 | add eax,1*65536-1 |
- | |
790 | add ebx,1*65536-1 |
- | |
791 | call draw_rectangle |
772 | drawwindow_III_caption: |
792 | 773 | ||
793 | mov ecx,[edx+20] ; GRAB BAR |
774 | mov ecx,[edx+20] ; GRAB BAR |
794 | push ecx |
775 | push ecx |
795 | mov esi,edx |
776 | mov esi,edx |
796 | mov edx,[esi+04] |
777 | mov edx,[esi+04] |
797 | add edx,4 |
778 | add edx,4 |
798 | mov ebx,[esi+04] |
779 | mov ebx,[esi+04] |
799 | add ebx,20 |
780 | add ebx,20 |
800 | mov eax,[esi+04] |
781 | mov eax,[esi+04] |
801 | add eax,[esi+12] |
782 | add eax,[esi+12] |
802 | cmp ebx,eax |
783 | cmp ebx,eax |
803 | jb wdsizeok2 |
784 | jb .wdsizeok |
804 | mov ebx,eax |
785 | mov ebx,eax |
805 | wdsizeok2: |
786 | .wdsizeok: |
806 | push ebx |
787 | push ebx |
807 | drwi2: |
788 | .drwi: |
808 | mov ebx,edx |
789 | mov ebx,edx |
809 | shl ebx,16 |
790 | shl ebx,16 |
810 | add ebx,edx |
791 | add ebx,edx |
811 | mov eax,[esi+00] |
792 | mov eax,[esi+00] |
812 | shl eax,16 |
793 | shl eax,16 |
813 | add eax,[esi+00] |
794 | add eax,[esi+00] |
814 | add eax,[esi+8] |
795 | add eax,[esi+8] |
815 | add eax,4*65536-4 |
796 | add eax,4*65536-4 |
816 | mov ecx,[esi+20] |
797 | mov ecx,[esi+20] |
817 | test ecx,0x40000000 |
798 | test ecx,0x40000000 |
818 | jz nofa3 |
799 | jz .nofa |
819 | add ecx,0x040404 |
800 | add ecx,0x040404 |
820 | nofa3: |
801 | .nofa: |
821 | test ecx,0x80000000 |
802 | test ecx,0x80000000 |
822 | jz nofa2 |
803 | jz .nofa2 |
823 | sub ecx,0x040404 |
804 | sub ecx,0x040404 |
824 | nofa2: |
805 | .nofa2: |
825 | mov [esi+20],ecx |
806 | mov [esi+20],ecx |
826 | and ecx,0xffffff |
807 | and ecx,0xffffff |
827 | xor edi, edi |
808 | xor edi, edi |
828 | call [draw_line] |
809 | call [draw_line] |
829 | inc edx |
810 | inc edx |
830 | cmp edx,[esp] |
811 | cmp edx,[esp] |
831 | jb drwi2 |
812 | jb .drwi |
832 | add esp,4 |
813 | add esp,4 |
833 | pop ecx |
814 | pop ecx |
834 | mov [esi+20],ecx |
815 | mov [esi+20],ecx |
- | 816 | ||
- | 817 | ret |
|
- | 818 | ||
- | 819 | ||
- | 820 | drawwindow_III: |
|
- | 821 | ||
- | 822 | pushad |
|
- | 823 | ||
- | 824 | mov edi,edx ; RECTANGLE |
|
- | 825 | mov eax,[edi+0] |
|
- | 826 | shl eax,16 |
|
- | 827 | mov ax,[edi+0] |
|
- | 828 | add ax,[edi+8] |
|
- | 829 | mov ebx,[edi+4] |
|
- | 830 | shl ebx,16 |
|
- | 831 | mov bx,[edi+4] |
|
- | 832 | add bx,[edi+12] |
|
- | 833 | mov esi,[edi+24] |
|
- | 834 | shr esi,1 |
|
- | 835 | and esi,0x007f7f7f |
|
- | 836 | push esi |
|
- | 837 | call draw_rectangle |
|
- | 838 | mov ecx,3 |
|
- | 839 | dw3l: |
|
- | 840 | add eax,1*65536-1 |
|
- | 841 | add ebx,1*65536-1 |
|
- | 842 | mov esi,[edi+24] |
|
- | 843 | call draw_rectangle |
|
- | 844 | dec ecx |
|
- | 845 | jnz dw3l |
|
- | 846 | pop esi |
|
- | 847 | add eax,1*65536-1 |
|
- | 848 | add ebx,1*65536-1 |
|
- | 849 | call draw_rectangle |
|
- | 850 | ||
- | 851 | call drawwindow_III_caption |
|
835 | 852 | ||
836 | mov edx,[esi+04] ; WORK AREA |
853 | mov edx,[esi+04] ; WORK AREA |
837 | add edx,21+5 |
854 | add edx,21+5 |
838 | mov ebx,[esi+04] |
855 | mov ebx,[esi+04] |
839 | add ebx,[esi+12] |
856 | add ebx,[esi+12] |
840 | cmp edx,ebx |
857 | cmp edx,ebx |
841 | jg noinside2 |
858 | jg noinside2 |
842 | mov eax,5 |
859 | mov eax,5 |
843 | mov ebx,20 |
860 | mov ebx,20 |
844 | mov ecx,[esi+8] |
861 | mov ecx,[esi+8] |
845 | mov edx,[esi+12] |
862 | mov edx,[esi+12] |
846 | sub ecx,4 |
863 | sub ecx,4 |
847 | sub edx,4 |
864 | sub edx,4 |
848 | mov edi,[esi+16] |
865 | mov edi,[esi+16] |
849 | call [drawbar] |
866 | call [drawbar] |
850 | noinside2: |
867 | noinside2: |
851 | 868 | ||
852 | popad |
869 | popad |
853 | 870 | ||
854 | ret |
871 | ret |
855 | 872 | ||
856 | 873 | ||
857 | 874 | ||
858 | ; activate window |
875 | ; activate window |
859 | align 4 |
876 | align 4 |
860 | windowactivate: |
877 | windowactivate: |
861 | 878 | ||
862 | ; esi = abs mem position in stack 0xC400+ |
879 | ; esi = abs mem position in stack 0xC400+ |
863 | 880 | ||
864 | pushad |
881 | pushad |
865 | 882 | ||
866 | ; if type of current active window is 3, |
883 | ; if type of current active window is 3, |
867 | ; it must be redrawn |
884 | ; it must be redrawn |
868 | mov eax, [0x3004] |
885 | mov eax, [0x3004] |
869 | movzx eax, word [0xC400 + eax*2] |
886 | movzx eax, word [0xC400 + eax*2] |
870 | shl eax, 5 |
887 | shl eax, 5 |
871 | add eax, window_data |
888 | add eax, window_data |
872 | mov ebx, [eax + WDATA.cl_workarea] |
889 | mov ebx, [eax + WDATA.cl_workarea] |
873 | and ebx, 0x0f000000 |
890 | and ebx, 0x0f000000 |
874 | cmp ebx, 0x03000000 |
891 | cmp ebx, 0x03000000 |
875 | jne @f |
892 | jne @f |
876 | mov [eax + WDATA.fl_redraw], byte 1 |
893 | mov [eax + WDATA.fl_redraw], byte 1 |
877 | @@: |
894 | @@: |
878 | 895 | ||
879 | push esi |
896 | push esi |
880 | movzx eax, word [esi] ; ax <- process no |
897 | movzx eax, word [esi] ; ax <- process no |
881 | movzx eax, word [0xC000+eax*2] ; ax <- position in window stack |
898 | movzx eax, word [0xC000+eax*2] ; ax <- position in window stack |
882 | 899 | ||
883 | xor esi, esi ; drop others |
900 | xor esi, esi ; drop others |
884 | waloop: |
901 | waloop: |
885 | cmp esi, dword [0x3004] |
902 | cmp esi, dword [0x3004] |
886 | jae wacont |
903 | jae wacont |
887 | inc esi |
904 | inc esi |
888 | lea edi, [0xC000 + esi*2] |
905 | lea edi, [0xC000 + esi*2] |
889 | mov bx, [edi] ; position of the current process |
906 | mov bx, [edi] ; position of the current process |
890 | cmp bx, ax |
907 | cmp bx, ax |
891 | jbe @f |
908 | jbe @f |
892 | dec bx ; upper? => drop! |
909 | dec bx ; upper? => drop! |
893 | mov [edi], bx |
910 | mov [edi], bx |
894 | @@: |
911 | @@: |
895 | jmp waloop |
912 | jmp waloop |
896 | wacont: |
913 | wacont: |
897 | ; set to no 1 |
914 | ; set to no 1 |
898 | pop esi ; esi = pointer at 0xC400 |
915 | pop esi ; esi = pointer at 0xC400 |
899 | 916 | ||
900 | movzx eax, word [esi] |
917 | movzx eax, word [esi] |
901 | mov bx, [0x3004] ; number of processes |
918 | mov bx, [0x3004] ; number of processes |
902 | mov [0xC000+eax*2], bx ; this is the last (and the upper) |
919 | mov [0xC000+eax*2], bx ; this is the last (and the upper) |
903 | 920 | ||
904 | ; update on screen -window stack |
921 | ; update on screen -window stack |
905 | xor esi, esi |
922 | xor esi, esi |
906 | waloop2: |
923 | waloop2: |
907 | mov edi, [0x3004] |
924 | mov edi, [0x3004] |
908 | cmp esi, edi |
925 | cmp esi, edi |
909 | jae wacont2 |
926 | jae wacont2 |
910 | inc esi |
927 | inc esi |
911 | movzx ebx, word [esi*2 + 0xC000] |
928 | movzx ebx, word [esi*2 + 0xC000] |
912 | mov [ebx*2 + 0xC400], si |
929 | mov [ebx*2 + 0xC400], si |
913 | jmp waloop2 |
930 | jmp waloop2 |
914 | wacont2: |
931 | wacont2: |
915 | mov [0xf400], byte 0 ; empty keyboard buffer |
932 | mov [0xf400], byte 0 ; empty keyboard buffer |
916 | mov [0xf500], byte 0 ; empty button buffer |
933 | mov [0xf500], byte 0 ; empty button buffer |
917 | popad |
934 | popad |
918 | ret |
935 | ret |
919 | 936 | ||
920 | 937 | ||
921 | ; check if window is necessary to draw |
938 | ; check if window is necessary to draw |
922 | 939 | ||
923 | checkwindowdraw: |
940 | checkwindowdraw: |
924 | 941 | ||
925 | ; edi = position in window_data+ |
942 | ; edi = position in window_data+ |
926 | 943 | ||
927 | mov eax, [edi + WDATA.cl_workarea] |
944 | mov eax, [edi + WDATA.cl_workarea] |
928 | and eax, 0x0f000000 |
945 | and eax, 0x0f000000 |
929 | cmp eax, 0x03000000 |
946 | cmp eax, 0x03000000 |
930 | je .return_yes ; window type 3 |
947 | je .return_yes ; window type 3 |
931 | 948 | ||
932 | mov esi, edi |
949 | mov esi, edi |
933 | sub esi, window_data |
950 | sub esi, window_data |
934 | shr esi, 5 |
951 | shr esi, 5 |
935 | 952 | ||
936 | ; esi = process number |
953 | ; esi = process number |
937 | 954 | ||
938 | movzx eax, word [0xC000 + esi * 2] ; get value of the curr process |
955 | movzx eax, word [0xC000 + esi * 2] ; get value of the curr process |
939 | lea esi, [0xC400 + eax * 2] ; get address of this process at 0xC400 |
956 | lea esi, [0xC400 + eax * 2] ; get address of this process at 0xC400 |
940 | 957 | ||
941 | push esi |
958 | push esi |
942 | 959 | ||
943 | .new_check: |
960 | .new_check: |
944 | 961 | ||
945 | pop esi |
962 | pop esi |
946 | add esi, 2 |
963 | add esi, 2 |
947 | push esi |
964 | push esi |
948 | 965 | ||
949 | mov eax, [0x3004] |
966 | mov eax, [0x3004] |
950 | lea eax, word [0xC400 + eax * 2] ; number of the upper window |
967 | lea eax, word [0xC400 + eax * 2] ; number of the upper window |
951 | 968 | ||
952 | cmp esi, eax |
969 | cmp esi, eax |
953 | ja .all_wnds_to_top |
970 | ja .all_wnds_to_top |
954 | 971 | ||
955 | movzx eax, word [esi] |
972 | movzx eax, word [esi] |
956 | shl eax, 5 |
973 | shl eax, 5 |
957 | cmp [0x3000 + eax + 0xa], byte 9 |
974 | cmp [0x3000 + eax + 0xa], byte 9 |
958 | je .new_check ; skip dead windows |
975 | je .new_check ; skip dead windows |
959 | 976 | ||
960 | lea esi, [eax+window_data] |
977 | lea esi, [eax+window_data] |
961 | 978 | ||
962 | mov ebx, [edi+4] ; y0 |
979 | mov ebx, [edi+4] ; y0 |
963 | mov edx, [edi+12] |
980 | mov edx, [edi+12] |
964 | add edx, ebx ; y0e |
981 | add edx, ebx ; y0e |
965 | 982 | ||
966 | mov ecx, [esi+4] ; y ; y check |
983 | mov ecx, [esi+4] ; y ; y check |
967 | cmp ecx, edx |
984 | cmp ecx, edx |
968 | jae .new_check ; y < y0e |
985 | jae .new_check ; y < y0e |
969 | mov eax, [esi+12] |
986 | mov eax, [esi+12] |
970 | add ecx, eax ; ye |
987 | add ecx, eax ; ye |
971 | cmp ebx, ecx ; y0 >= ye |
988 | cmp ebx, ecx ; y0 >= ye |
972 | ja .new_check |
989 | ja .new_check |
973 | 990 | ||
974 | mov eax, [edi+0] ; x0 |
991 | mov eax, [edi+0] ; x0 |
975 | mov ecx, [edi+8] |
992 | mov ecx, [edi+8] |
976 | add ecx, eax ; x0e |
993 | add ecx, eax ; x0e |
977 | 994 | ||
978 | mov edx, [esi+0] ; x ; x check |
995 | mov edx, [esi+0] ; x ; x check |
979 | cmp edx, ecx |
996 | cmp edx, ecx |
980 | jae .new_check ; x < x0e |
997 | jae .new_check ; x < x0e |
981 | mov ecx, [esi+8] |
998 | mov ecx, [esi+8] |
982 | add edx, ecx |
999 | add edx, ecx |
983 | cmp eax, edx |
1000 | cmp eax, edx |
984 | ja .new_check |
1001 | ja .new_check |
985 | 1002 | ||
986 | pop esi |
1003 | pop esi |
987 | .return_yes: |
1004 | .return_yes: |
988 | mov ecx,1 ; overlap some window |
1005 | mov ecx,1 ; overlap some window |
989 | ret |
1006 | ret |
990 | 1007 | ||
991 | .all_wnds_to_top: |
1008 | .all_wnds_to_top: |
992 | 1009 | ||
993 | pop esi |
1010 | pop esi |
994 | 1011 | ||
995 | xor ecx, ecx ; passed all windows to top |
1012 | xor ecx, ecx ; passed all windows to top |
996 | ret |
1013 | ret |
997 | 1014 | ||
998 | 1015 | ||
999 | 1016 | ||
1000 | 1017 | ||
1001 | waredraw: ; if redraw necessary at activate |
1018 | waredraw: ; if redraw necessary at activate |
1002 | 1019 | ||
1003 | pushad |
1020 | pushad |
1004 | 1021 | ||
1005 | call checkwindowdraw ; draw window on activation ? |
1022 | call checkwindowdraw ; draw window on activation ? |
1006 | test ecx, ecx |
1023 | test ecx, ecx |
1007 | jz .do_not_draw |
1024 | jz .do_not_draw |
1008 | 1025 | ||
1009 | popad |
1026 | popad |
1010 | mov [0xfb44], byte 1 ; do draw mouse |
1027 | mov [0xfb44], byte 1 ; do draw mouse |
1011 | call windowactivate |
1028 | call windowactivate |
1012 | 1029 | ||
1013 | ; update screen info |
1030 | ; update screen info |
1014 | pushad |
1031 | pushad |
1015 | mov edi, [0x3004] ; the last process (number) |
1032 | mov edi, [0x3004] ; the last process (number) |
1016 | movzx esi, word [0xC400 + edi * 2] |
1033 | movzx esi, word [0xC400 + edi * 2] |
1017 | shl esi, 5 |
1034 | shl esi, 5 |
1018 | add esi, window_data |
1035 | add esi, window_data |
1019 | 1036 | ||
1020 | ; coordinates of the upper window |
1037 | ; coordinates of the upper window |
1021 | mov eax, [esi+00] ; cx |
1038 | mov eax, [esi+00] ; cx |
1022 | mov ebx, [esi+04] ; cy |
1039 | mov ebx, [esi+04] ; cy |
1023 | mov ecx, [esi+08] ; sx |
1040 | mov ecx, [esi+08] ; sx |
1024 | mov edx, [esi+12] ; sy |
1041 | mov edx, [esi+12] ; sy |
1025 | 1042 | ||
1026 | add ecx, eax ; ecx = x_end |
1043 | add ecx, eax ; ecx = x_end |
1027 | add edx, ebx ; edx = y_end |
1044 | add edx, ebx ; edx = y_end |
1028 | 1045 | ||
1029 | mov edi, [0x3004] |
1046 | mov edi, [0x3004] |
1030 | movzx esi, word [0xC400 + edi * 2] |
1047 | movzx esi, word [0xC400 + edi * 2] |
1031 | call setscreen |
1048 | call setscreen |
1032 | popad |
1049 | popad |
1033 | 1050 | ||
1034 | mov [edi+31],byte 1 ; redraw flag for app |
1051 | mov [edi+31],byte 1 ; redraw flag for app |
1035 | mov [0xfb44],byte 0 ; mouse down checks |
1052 | mov [0xfb44],byte 0 ; mouse down checks |
1036 | 1053 | ||
1037 | ret |
1054 | ret |
1038 | 1055 | ||
1039 | .do_not_draw: |
1056 | .do_not_draw: |
1040 | 1057 | ||
1041 | popad |
1058 | popad |
1042 | 1059 | ||
1043 | call windowactivate |
1060 | call windowactivate |
1044 | mov [0xfb44],byte 0 ; mouse down checks |
1061 | mov [0xfb44],byte 0 ; mouse down checks |
1045 | mov [0xfff4],byte 0 ; no mouse background |
1062 | mov [0xfff4],byte 0 ; no mouse background |
1046 | mov [0xfff5],byte 0 ; draw mouse |
1063 | mov [0xfff5],byte 0 ; draw mouse |
1047 | ret |
1064 | ret |
1048 | 1065 | ||
1049 | 1066 | ||
1050 | ; eax = window number on screen |
1067 | ; eax = window number on screen |
1051 | ; corrupts registers and [dl*] |
1068 | ; corrupts registers and [dl*] |
1052 | minimize_window: |
1069 | minimize_window: |
1053 | movzx eax, word [0xC400+eax*2] |
1070 | movzx eax, word [0xC400+eax*2] |
1054 | shl eax, 5 |
1071 | shl eax, 5 |
1055 | add eax, window_data |
1072 | add eax, window_data |
1056 | test [eax+WDATA.fl_wstate], WSTATE_MINIMIZED |
1073 | test [eax+WDATA.fl_wstate], WSTATE_MINIMIZED |
1057 | jnz .skip_redrawings |
1074 | jnz .skip_redrawings |
1058 | pushfd |
1075 | pushfd |
1059 | cli |
1076 | cli |
1060 | or [eax+WDATA.fl_wstate], WSTATE_MINIMIZED |
1077 | or [eax+WDATA.fl_wstate], WSTATE_MINIMIZED |
1061 | mov edi, eax |
1078 | mov edi, eax |
1062 | ;call calculatescreen |
1079 | ;call calculatescreen |
1063 | mov eax, [edi+WDATA.left] |
1080 | mov eax, [edi+WDATA.box.left] |
1064 | mov [dlx], eax |
1081 | mov [dlx], eax |
1065 | mov ecx, eax |
1082 | mov ecx, eax |
1066 | add ecx, [edi+WDATA.width] |
1083 | add ecx, [edi+WDATA.box.width] |
1067 | mov [dlxe], ecx |
1084 | mov [dlxe], ecx |
1068 | mov ebx, [edi+WDATA.top] |
1085 | mov ebx, [edi+WDATA.box.top] |
1069 | mov [dly], ebx |
1086 | mov [dly], ebx |
1070 | mov edx, ebx |
1087 | mov edx, ebx |
1071 | add edx, [edi+WDATA.height] |
1088 | add edx, [edi+WDATA.box.height] |
1072 | mov [dlye], edx |
1089 | mov [dlye], edx |
1073 | call calculatescreen |
1090 | call calculatescreen |
1074 | xor esi, esi |
1091 | xor esi, esi |
1075 | xor eax, eax |
1092 | xor eax, eax |
1076 | call redrawscreen |
1093 | call redrawscreen |
1077 | popfd |
1094 | popfd |
1078 | .skip_redrawings: |
1095 | .skip_redrawings: |
1079 | ret |
1096 | ret |
1080 | 1097 | ||
1081 | ; eax = window number on screen |
1098 | ; eax = window number on screen |
1082 | ; corrupts registers and [dl*] |
1099 | ; corrupts registers and [dl*] |
1083 | restore_minimized_window: |
1100 | restore_minimized_window: |
1084 | pushfd |
1101 | pushfd |
1085 | cli |
1102 | cli |
1086 | movzx esi, word [0xC400+eax*2] |
1103 | movzx esi, word [0xC400+eax*2] |
1087 | mov edi, esi |
1104 | mov edi, esi |
1088 | shl edi, 5 |
1105 | shl edi, 5 |
1089 | add edi, window_data |
1106 | add edi, window_data |
1090 | test [edi+WDATA.fl_wstate], WSTATE_MINIMIZED |
1107 | test [edi+WDATA.fl_wstate], WSTATE_MINIMIZED |
1091 | jz .skip_redrawings |
1108 | jz .skip_redrawings |
1092 | mov [edi+WDATA.fl_redraw], 1 |
1109 | mov [edi+WDATA.fl_redraw], 1 |
1093 | and [edi+WDATA.fl_wstate], not WSTATE_MINIMIZED |
1110 | and [edi+WDATA.fl_wstate], not WSTATE_MINIMIZED |
1094 | cmp eax, [0x3004] ; the uppermost window |
1111 | cmp eax, [0x3004] ; the uppermost window |
1095 | jnz .no_uppermost |
1112 | jnz .no_uppermost |
1096 | mov eax, [edi+WDATA.left] |
1113 | mov eax, [edi+WDATA.box.left] |
1097 | mov ebx, [edi+WDATA.top] |
1114 | mov ebx, [edi+WDATA.box.top] |
1098 | mov ecx, eax |
1115 | mov ecx, eax |
1099 | mov edx, ebx |
1116 | mov edx, ebx |
1100 | add ecx, [edi+WDATA.width] |
1117 | add ecx, [edi+WDATA.box.width] |
1101 | add edx, [edi+WDATA.height] |
1118 | add edx, [edi+WDATA.box.height] |
1102 | call setscreen |
1119 | call setscreen |
1103 | jmp .done |
1120 | jmp .done |
1104 | .no_uppermost: |
1121 | .no_uppermost: |
1105 | mov eax, [edi+WDATA.left] |
1122 | mov eax, [edi+WDATA.box.left] |
1106 | mov ebx, [edi+WDATA.top] |
1123 | mov ebx, [edi+WDATA.box.top] |
1107 | mov ecx, eax |
1124 | mov ecx, eax |
1108 | mov edx, ebx |
1125 | mov edx, ebx |
1109 | add ecx, [edi+WDATA.width] |
1126 | add ecx, [edi+WDATA.box.width] |
1110 | add edx, [edi+WDATA.height] |
1127 | add edx, [edi+WDATA.box.height] |
1111 | call calculatescreen |
1128 | call calculatescreen |
1112 | .done: |
1129 | .done: |
1113 | mov [0xfff4],byte 0 ; no mouse under |
1130 | mov [0xfff4],byte 0 ; no mouse under |
1114 | .skip_redrawings: |
1131 | .skip_redrawings: |
1115 | popfd |
1132 | popfd |
1116 | ret |
1133 | ret |
1117 | 1134 | ||
1118 | 1135 | ||
1119 | iglobal |
1136 | iglobal |
1120 | window_moving db 'K : Window - move/resize',13,10,0 |
1137 | window_moving db 'K : Window - move/resize',13,10,0 |
1121 | window_moved db 'K : Window - done',13,10,0 |
1138 | window_moved db 'K : Window - done',13,10,0 |
1122 | endg |
1139 | endg |
1123 | 1140 | ||
1124 | ; check window touch |
1141 | ; check window touch |
1125 | align 4 |
1142 | align 4 |
1126 | checkwindows: |
1143 | checkwindows: |
1127 | pushad |
1144 | pushad |
1128 | 1145 | ||
1129 | cmp [window_minimize], 0 |
1146 | cmp [window_minimize], 0 |
1130 | je .no_minimizing |
1147 | je .no_minimizing |
1131 | mov eax, [0x3004] ; the uppermost window |
1148 | mov eax, [0x3004] ; the uppermost window |
1132 | mov bl, 0 |
1149 | mov bl, 0 |
1133 | xchg [window_minimize], bl |
1150 | xchg [window_minimize], bl |
1134 | cmp bl, 1 |
1151 | cmp bl, 1 |
1135 | jne .restore |
1152 | jne .restore |
1136 | call minimize_window |
1153 | call minimize_window |
1137 | jmp .continue |
1154 | jmp .continue |
1138 | .restore: |
1155 | .restore: |
1139 | call restore_minimized_window |
1156 | call restore_minimized_window |
1140 | .continue: |
1157 | .continue: |
1141 | .no_minimizing: |
1158 | .no_minimizing: |
1142 | 1159 | ||
1143 | cmp [0xfb40],byte 0 ; mouse buttons pressed ? |
1160 | cmp [0xfb40],byte 0 ; mouse buttons pressed ? |
1144 | jne .mouse_buttons_pressed |
1161 | jne .mouse_buttons_pressed |
1145 | popad |
1162 | popad |
1146 | ret |
1163 | ret |
1147 | .mouse_buttons_pressed: |
1164 | .mouse_buttons_pressed: |
1148 | 1165 | ||
1149 | mov esi,[0x3004] |
1166 | mov esi,[0x3004] |
1150 | inc esi |
1167 | inc esi |
1151 | 1168 | ||
1152 | cwloop: |
1169 | cwloop: |
1153 | cmp esi,2 |
1170 | cmp esi,2 |
1154 | jb .exit |
1171 | jb .exit |
1155 | 1172 | ||
1156 | dec esi |
1173 | dec esi |
1157 | movzx edi, word [0xC400 + esi * 2] ; ebx |
1174 | movzx edi, word [0xC400 + esi * 2] ; ebx |
1158 | shl edi, 5 |
1175 | shl edi, 5 |
1159 | add edi, window_data |
1176 | add edi, window_data |
1160 | ; mov edi, ebx |
1177 | ; mov edi, ebx |
1161 | mov ecx, [edi+0] |
1178 | mov ecx, [edi+0] |
1162 | mov edx, [edi+4] |
1179 | mov edx, [edi+4] |
1163 | 1180 | ||
1164 | mov eax,ecx |
1181 | mov eax,ecx |
1165 | mov ebx,edx |
1182 | mov ebx,edx |
1166 | test [edi+WDATA.fl_wstate],WSTATE_MINIMIZED |
1183 | test [edi+WDATA.fl_wstate],WSTATE_MINIMIZED |
1167 | jnz cwloop |
1184 | jnz cwloop |
1168 | 1185 | ||
1169 | movzx eax, word [0xfb0a] |
1186 | movzx eax, word [0xfb0a] |
1170 | movzx ebx, word [0xfb0c] |
1187 | movzx ebx, word [0xfb0c] |
1171 | 1188 | ||
1172 | cmp ecx, eax |
1189 | cmp ecx, eax |
1173 | jae cwloop |
1190 | jae cwloop |
1174 | cmp edx, ebx |
1191 | cmp edx, ebx |
1175 | jae cwloop |
1192 | jae cwloop |
1176 | add ecx, [edi+8] |
1193 | add ecx, [edi+8] |
1177 | add edx, [edi+12] |
1194 | add edx, [edi+12] |
1178 | cmp eax, ecx |
1195 | cmp eax, ecx |
1179 | jae cwloop |
1196 | jae cwloop |
1180 | cmp ebx, edx |
1197 | cmp ebx, edx |
1181 | jae cwloop |
1198 | jae cwloop |
1182 | 1199 | ||
1183 | pushad |
1200 | pushad |
1184 | mov eax, esi |
1201 | mov eax, esi |
1185 | mov ebx, [0x3004] |
1202 | mov ebx, [0x3004] |
1186 | cmp eax, ebx ; is this window active? |
1203 | cmp eax, ebx ; is this window active? |
1187 | jz .move_resize_window |
1204 | jz .move_resize_window |
1188 | 1205 | ||
1189 | ; eax = position in windowing stack |
1206 | ; eax = position in windowing stack |
1190 | ; redraw must ? |
1207 | ; redraw must ? |
1191 | lea esi, [0xC400 + esi * 2] |
1208 | lea esi, [0xC400 + esi * 2] |
1192 | call waredraw |
1209 | call waredraw |
1193 | add esp, 32 |
1210 | add esp, 32 |
1194 | 1211 | ||
1195 | .exit: |
1212 | .exit: |
1196 | popad |
1213 | popad |
1197 | ret |
1214 | ret |
1198 | 1215 | ||
1199 | .move_resize_window: ; MOVE OR RESIZE WINDOW |
1216 | .move_resize_window: ; MOVE OR RESIZE WINDOW |
1200 | 1217 | ||
1201 | popad |
1218 | popad |
1202 | 1219 | ||
1203 | ; Check for user enabled fixed window |
1220 | ; Check for user enabled fixed window |
1204 | mov edx, [edi+0x14] |
1221 | mov edx, [edi+0x14] |
1205 | and edx, 0x0f000000 |
1222 | and edx, 0x0f000000 |
1206 | cmp edx, 0x01000000 |
1223 | cmp edx, 0x01000000 |
1207 | jne .window_move_enabled_for_user |
1224 | jne .window_move_enabled_for_user |
1208 | popad |
1225 | popad |
1209 | ret |
1226 | ret |
1210 | .window_move_enabled_for_user: |
1227 | .window_move_enabled_for_user: |
1211 | 1228 | ||
1212 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1229 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1213 | jnz .no_resize_2 |
1230 | jnz .no_resize_2 |
1214 | 1231 | ||
1215 | mov [do_resize_from_corner],byte 0 ; resize for skinned window |
1232 | mov [do_resize_from_corner],byte 0 ; resize for skinned window |
1216 | mov edx, [edi+0x10] |
1233 | mov edx, [edi+0x10] |
1217 | and edx, 0x0f000000 |
1234 | and edx, 0x0f000000 |
1218 | cmp edx, 0x02000000 |
1235 | cmp edx, 0x02000000 |
1219 | jb .no_resize_2 ; not type 2 wnd |
1236 | jb .no_resize_2 ; not type 2 wnd |
1220 | 1237 | ||
1221 | mov edx, [edi+4] |
1238 | mov edx, [edi+4] |
1222 | add edx, [edi+12] |
1239 | add edx, [edi+12] |
1223 | sub edx, 6 ; edx = y_end - 6 |
1240 | sub edx, 6 ; edx = y_end - 6 |
1224 | cmp ebx, edx ; ebx = mouse_y |
1241 | cmp ebx, edx ; ebx = mouse_y |
1225 | jb .no_resize_2 |
1242 | jb .no_resize_2 |
1226 | mov [do_resize_from_corner],byte 1 |
1243 | mov [do_resize_from_corner],byte 1 |
1227 | jmp .continue |
1244 | jmp .continue |
1228 | .no_resize_2: |
1245 | .no_resize_2: |
1229 | 1246 | ||
1230 | push eax |
1247 | push eax |
1231 | call get_titlebar_height |
1248 | call get_titlebar_height |
1232 | add eax,[edi+4] |
1249 | add eax,[edi+4] |
1233 | cmp ebx,eax |
1250 | cmp ebx,eax |
1234 | pop eax |
1251 | pop eax |
1235 | jae .exit |
1252 | jae .exit |
1236 | 1253 | ||
1237 | .continue: |
1254 | .continue: |
1238 | 1255 | ||
1239 | push esi |
1256 | push esi |
1240 | mov esi, window_moving |
1257 | mov esi, window_moving |
1241 | call sys_msg_board_str |
1258 | call sys_msg_board_str |
1242 | pop esi |
1259 | pop esi |
1243 | 1260 | ||
1244 | mov ecx, [timer_ticks] ; double-click ? |
1261 | mov ecx, [timer_ticks] ; double-click ? |
1245 | mov edx, ecx |
1262 | mov edx, ecx |
1246 | sub edx, [latest_window_touch] |
1263 | sub edx, [latest_window_touch] |
1247 | mov [latest_window_touch], ecx |
1264 | mov [latest_window_touch], ecx |
1248 | mov [latest_window_touch_delta], edx |
1265 | mov [latest_window_touch_delta], edx |
1249 | 1266 | ||
1250 | mov cl, [0xfb40] ; save for shade check |
1267 | mov cl, [0xfb40] ; save for shade check |
1251 | mov [do_resize], cl |
1268 | mov [do_resize], cl |
1252 | no_emulation_righ_button: |
1269 | no_emulation_righ_button: |
1253 | mov ecx, [edi+0] |
1270 | mov ecx, [edi+0] |
1254 | mov edx, [edi+4] |
1271 | mov edx, [edi+4] |
1255 | 1272 | ||
1256 | push eax ecx edx |
1273 | push eax ecx edx |
1257 | mov [dlx], ecx ; save for drawlimits |
1274 | mov [dlx], ecx ; save for drawlimits |
1258 | mov [dly], edx |
1275 | mov [dly], edx |
1259 | mov eax, [edi+8] |
1276 | mov eax, [edi+8] |
1260 | add ecx, eax |
1277 | add ecx, eax |
1261 | mov eax, [edi+12] |
1278 | mov eax, [edi+12] |
1262 | add edx, eax |
1279 | add edx, eax |
1263 | mov [dlxe], ecx |
1280 | mov [dlxe], ecx |
1264 | mov [dlye], edx |
1281 | mov [dlye], edx |
1265 | pop edx ecx eax |
1282 | pop edx ecx eax |
1266 | 1283 | ||
1267 | sub eax, ecx |
1284 | sub eax, ecx |
1268 | sub ebx, edx |
1285 | sub ebx, edx |
1269 | 1286 | ||
1270 | mov esi, [0xfb0a] |
1287 | mov esi, [0xfb0a] |
1271 | mov [0xf300], esi |
1288 | mov [0xf300], esi |
1272 | 1289 | ||
1273 | pushad ; wait for putimages to finish |
1290 | pushad ; wait for putimages to finish |
1274 | ; mov eax,5 |
1291 | ; mov eax,5 |
1275 | ; call delay_hs |
1292 | ; call delay_hs |
1276 | mov eax,[edi+0] |
1293 | mov eax,[edi+0] |
1277 | mov [npx],eax |
1294 | mov [npx],eax |
1278 | mov eax,[edi+4] |
1295 | mov eax,[edi+4] |
1279 | mov [npy],eax |
1296 | mov [npy],eax |
1280 | popad |
1297 | popad |
1281 | 1298 | ||
1282 | push eax ; save old coordinates |
1299 | push eax ; save old coordinates |
1283 | mov ax,[edi+00] |
1300 | mov ax,[edi+00] |
1284 | mov word [oldc+00],ax |
1301 | mov word [oldc+00],ax |
1285 | mov ax,[edi+04] |
1302 | mov ax,[edi+04] |
1286 | mov word [oldc+04],ax |
1303 | mov word [oldc+04],ax |
1287 | mov ax,[edi+8] |
1304 | mov ax,[edi+8] |
1288 | mov word [oldc+8],ax |
1305 | mov word [oldc+8],ax |
1289 | mov word [npxe],ax |
1306 | mov word [npxe],ax |
1290 | mov ax,[edi+12] |
1307 | mov ax,[edi+12] |
1291 | mov word [oldc+12],ax |
1308 | mov word [oldc+12],ax |
1292 | mov word [npye],ax |
1309 | mov word [npye],ax |
1293 | pop eax |
1310 | pop eax |
1294 | 1311 | ||
1295 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1312 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1296 | jnz @f |
1313 | jnz @f |
1297 | call drawwindowframes |
1314 | call drawwindowframes |
1298 | @@: |
1315 | @@: |
1299 | 1316 | ||
1300 | mov [reposition],0 |
1317 | mov [reposition],0 |
1301 | mov [0xfb44],byte 1 ; no reaction to mouse up/down |
1318 | mov [0xfb44],byte 1 ; no reaction to mouse up/down |
1302 | 1319 | ||
1303 | ; move window |
1320 | ; move window |
1304 | 1321 | ||
1305 | newchm: |
1322 | newchm: |
1306 | 1323 | ||
1307 | mov [0xfff5],byte 1 |
1324 | mov [0xfff5],byte 1 |
1308 | 1325 | ||
1309 | call checkidle |
1326 | call checkidle |
1310 | 1327 | ||
1311 | call checkEgaCga |
1328 | call checkEgaCga |
1312 | 1329 | ||
1313 | mov [0xfff4],byte 0 |
1330 | mov [0xfff4],byte 0 |
1314 | 1331 | ||
1315 | call [draw_pointer] |
1332 | call [draw_pointer] |
1316 | 1333 | ||
1317 | pushad |
1334 | pushad |
1318 | call stack_handler |
1335 | call stack_handler |
1319 | popad |
1336 | popad |
1320 | 1337 | ||
1321 | mov esi,[0xf300] |
1338 | mov esi,[0xf300] |
1322 | cmp esi,[0xfb0a] |
1339 | cmp esi,[0xfb0a] |
1323 | je cwb |
1340 | je cwb |
1324 | 1341 | ||
1325 | mov cx,[0xfb0a] |
1342 | mov cx,[0xfb0a] |
1326 | mov dx,[0xfb0c] |
1343 | mov dx,[0xfb0c] |
1327 | sub cx,ax |
1344 | sub cx,ax |
1328 | sub dx,bx |
1345 | sub dx,bx |
1329 | 1346 | ||
1330 | push ax |
1347 | push ax |
1331 | push bx |
1348 | push bx |
1332 | 1349 | ||
1333 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1350 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1334 | jnz @f |
1351 | jnz @f |
1335 | call drawwindowframes |
1352 | call drawwindowframes |
1336 | @@: |
1353 | @@: |
1337 | 1354 | ||
1338 | mov ax,[0xfe00] |
1355 | mov ax,[0xfe00] |
1339 | mov bx,[0xfe04] |
1356 | mov bx,[0xfe04] |
1340 | 1357 | ||
1341 | cmp [do_resize_from_corner],1 |
1358 | cmp [do_resize_from_corner],1 |
1342 | je no_new_position |
1359 | je no_new_position |
1343 | 1360 | ||
1344 | mov word [npx],word 0 ; x repos ? |
1361 | mov word [npx],word 0 ; x repos ? |
1345 | cmp ax,cx |
1362 | cmp ax,cx |
1346 | jb noreposx |
1363 | jb noreposx |
1347 | mov [reposition],1 |
1364 | mov [reposition],1 |
1348 | sub ax,word [npxe] |
1365 | sub ax,word [npxe] |
1349 | mov word [npx],ax |
1366 | mov word [npx],ax |
1350 | cmp ax,cx |
1367 | cmp ax,cx |
1351 | jb noreposx |
1368 | jb noreposx |
1352 | mov word [npx],cx |
1369 | mov word [npx],cx |
1353 | noreposx: |
1370 | noreposx: |
1354 | 1371 | ||
1355 | mov word [npy],word 0 ; y repos ? |
1372 | mov word [npy],word 0 ; y repos ? |
1356 | cmp bx,dx |
1373 | cmp bx,dx |
1357 | jb noreposy |
1374 | jb noreposy |
1358 | mov [reposition],1 |
1375 | mov [reposition],1 |
1359 | sub bx,word [npye] |
1376 | sub bx,word [npye] |
1360 | mov word [npy],bx |
1377 | mov word [npy],bx |
1361 | cmp bx,dx |
1378 | cmp bx,dx |
1362 | jb noreposy |
1379 | jb noreposy |
1363 | mov word [npy],dx |
1380 | mov word [npy],dx |
1364 | noreposy: |
1381 | noreposy: |
1365 | 1382 | ||
1366 | no_new_position: |
1383 | no_new_position: |
1367 | 1384 | ||
1368 | cmp [do_resize_from_corner],0 ; resize from right corner |
1385 | cmp [do_resize_from_corner],0 ; resize from right corner |
1369 | je norepos_size |
1386 | je norepos_size |
1370 | pushad |
1387 | pushad |
1371 | 1388 | ||
1372 | mov edx,edi |
1389 | mov edx,edi |
1373 | sub edx,window_data |
1390 | sub edx,window_data |
1374 | shr edx,5 |
1391 | shr edx,5 |
1375 | shl edx,8 |
1392 | shl edx,8 |
1376 | add edx,0x80000 ; process base at 0x80000+ |
1393 | add edx,0x80000 ; process base at 0x80000+ |
1377 | 1394 | ||
1378 | movzx eax,word [0xfb0a] |
1395 | movzx eax,word [0xfb0a] |
1379 | cmp eax,[edi+0] |
1396 | cmp eax,[edi+0] |
1380 | jb nnepx |
1397 | jb nnepx |
1381 | sub eax,[edi+0] |
1398 | sub eax,[edi+0] |
1382 | cmp eax,32 ; [edx+0x90+8] |
1399 | cmp eax,32 ; [edx+0x90+8] |
1383 | jge nnepx2 |
1400 | jge nnepx2 |
1384 | mov eax,32 ; [edx+0x90+8] |
1401 | mov eax,32 ; [edx+0x90+8] |
1385 | nnepx2: |
1402 | nnepx2: |
1386 | mov [npxe],eax |
1403 | mov [npxe],eax |
1387 | nnepx: |
1404 | nnepx: |
1388 | 1405 | ||
1389 | call get_rolledup_height |
1406 | call get_rolledup_height |
1390 | mov ebx,eax |
1407 | mov ebx,eax |
1391 | movzx eax,word [0xfb0c] |
1408 | movzx eax,word [0xfb0c] |
1392 | cmp eax,[edi+4] |
1409 | cmp eax,[edi+4] |
1393 | jb nnepy |
1410 | jb nnepy |
1394 | sub eax,[edi+4] |
1411 | sub eax,[edi+4] |
1395 | cmp eax,ebx ; [edx+0x90+12] |
1412 | cmp eax,ebx ; [edx+0x90+12] |
1396 | jge nnepy2 |
1413 | jge nnepy2 |
1397 | mov eax,ebx ; [edx+0x90+12] |
1414 | mov eax,ebx ; [edx+0x90+12] |
1398 | nnepy2: |
1415 | nnepy2: |
1399 | mov [npye],eax |
1416 | mov [npye],eax |
1400 | nnepy: |
1417 | nnepy: |
1401 | 1418 | ||
1402 | mov [reposition],1 |
1419 | mov [reposition],1 |
1403 | 1420 | ||
1404 | popad |
1421 | popad |
1405 | norepos_size: |
1422 | norepos_size: |
1406 | 1423 | ||
1407 | pop bx |
1424 | pop bx |
1408 | pop ax |
1425 | pop ax |
1409 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1426 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1410 | jnz @f |
1427 | jnz @f |
1411 | call drawwindowframes |
1428 | call drawwindowframes |
1412 | @@: |
1429 | @@: |
1413 | 1430 | ||
1414 | mov esi,[0xfb0a] |
1431 | mov esi,[0xfb0a] |
1415 | mov [0xf300],esi |
1432 | mov [0xf300],esi |
1416 | 1433 | ||
1417 | cwb: |
1434 | cwb: |
1418 | cmp [0xfb40],byte 0 |
1435 | cmp [0xfb40],byte 0 |
1419 | jne newchm |
1436 | jne newchm |
1420 | ; new position done |
1437 | ; new position done |
1421 | mov [0xfff5],byte 1 |
1438 | mov [0xfff5],byte 1 |
1422 | mov cl,0 |
1439 | mov cl,0 |
1423 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1440 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1424 | jnz @f |
1441 | jnz @f |
1425 | mov cl,[reposition] |
1442 | mov cl,[reposition] |
1426 | call drawwindowframes |
1443 | call drawwindowframes |
1427 | 1444 | ||
1428 | mov eax,[npx] |
1445 | mov eax,[npx] |
1429 | mov [edi+0],eax |
1446 | mov [edi+0],eax |
1430 | mov eax,[npy] |
1447 | mov eax,[npy] |
1431 | mov [edi+4],eax |
1448 | mov [edi+4],eax |
1432 | mov eax,[npxe] |
1449 | mov eax,[npxe] |
1433 | mov [edi+8],eax |
1450 | mov [edi+8],eax |
1434 | mov eax,[npye] |
1451 | mov eax,[npye] |
1435 | mov [edi+12],eax |
1452 | mov [edi+12],eax |
1436 | 1453 | ||
1437 | @@: mov [reposition],cl |
1454 | @@: mov [reposition],cl |
1438 | 1455 | ||
1439 | cmp [reposition],1 ; save new position and size |
1456 | cmp [reposition],1 ; save new position and size |
1440 | jne no_bounds_save |
1457 | jne no_bounds_save |
1441 | push esi edi ecx |
1458 | push esi edi ecx |
1442 | mov esi,edi |
1459 | mov esi,edi |
1443 | mov ecx,2 |
1460 | mov ecx,2 |
1444 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP or WSTATE_MAXIMIZED |
1461 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP or WSTATE_MAXIMIZED |
1445 | jnz @f |
1462 | jnz @f |
1446 | add ecx,2 |
1463 | add ecx,2 |
1447 | @@: sub edi,window_data |
1464 | @@: sub edi,window_data |
1448 | shr edi,5 |
1465 | shr edi,5 |
1449 | shl edi,8 |
1466 | shl edi,8 |
1450 | add edi,0x80000+0x90 |
1467 | add edi,0x80000+0x90 |
1451 | cld |
1468 | cld |
1452 | rep movsd |
1469 | rep movsd |
1453 | pop ecx edi esi |
1470 | pop ecx edi esi |
1454 | no_bounds_save: |
1471 | no_bounds_save: |
1455 | 1472 | ||
1456 | pushad ; WINDOW SHADE/FULLSCREEN |
1473 | pushad ; WINDOW SHADE/FULLSCREEN |
1457 | 1474 | ||
1458 | cmp [reposition],1 |
1475 | cmp [reposition],1 |
1459 | je no_window_sizing |
1476 | je no_window_sizing |
1460 | mov edx,edi |
1477 | mov edx,edi |
1461 | sub edx,window_data |
1478 | sub edx,window_data |
1462 | shr edx,5 |
1479 | shr edx,5 |
1463 | shl edx,8 |
1480 | shl edx,8 |
1464 | add edx,0x80000 ; process base at 0x80000+ |
1481 | add edx,0x80000 ; process base at 0x80000+ |
1465 | 1482 | ||
1466 | cmp [do_resize],2 ; window shade ? |
1483 | cmp [do_resize],2 ; window shade ? |
1467 | jne no_window_shade |
1484 | jne no_window_shade |
1468 | mov [reposition],1 |
1485 | mov [reposition],1 |
1469 | 1486 | ||
1470 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1487 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1471 | jnz wnd_rolldown |
1488 | jnz wnd_rolldown |
1472 | wnd_rollup: |
1489 | wnd_rollup: |
1473 | or [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1490 | or [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1474 | call get_rolledup_height |
1491 | call get_rolledup_height |
1475 | jmp @f |
1492 | jmp @f |
1476 | wnd_rolldown: |
1493 | wnd_rolldown: |
1477 | and [edi+WDATA.fl_wstate],not WSTATE_ROLLEDUP |
1494 | and [edi+WDATA.fl_wstate],not WSTATE_ROLLEDUP |
1478 | mov eax,[edx+0x90+BOX.height] |
1495 | mov eax,[edx+0x90+BOX.height] |
1479 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1496 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1480 | jz @f |
1497 | jz @f |
1481 | mov eax,[screen_workarea.bottom] |
1498 | mov eax,[screen_workarea.bottom] |
1482 | sub eax,[screen_workarea.top] |
1499 | sub eax,[screen_workarea.top] |
1483 | @@: mov [edi+WDATA.height],eax |
1500 | @@: mov [edi+WDATA.box.height],eax |
1484 | 1501 | ||
1485 | no_window_shade: |
1502 | no_window_shade: |
1486 | 1503 | ||
1487 | cmp [do_resize],1 ; fullscreen/restore ? |
1504 | cmp [do_resize],1 ; fullscreen/restore ? |
1488 | jne no_fullscreen_restore |
1505 | jne no_fullscreen_restore |
1489 | cmp [latest_window_touch_delta],dword 50 |
1506 | cmp [latest_window_touch_delta],dword 50 |
1490 | jg no_fullscreen_restore |
1507 | jg no_fullscreen_restore |
1491 | mov [reposition],1 |
1508 | mov [reposition],1 |
1492 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1509 | test [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1493 | jnz restore_from_fullscreen |
1510 | jnz restore_from_fullscreen |
1494 | or [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1511 | or [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED |
1495 | mov eax,[screen_workarea.left] |
1512 | mov eax,[screen_workarea.left] |
1496 | mov [edi+WDATA.left],eax |
1513 | mov [edi+WDATA.box.left],eax |
1497 | sub eax,[screen_workarea.right] |
1514 | sub eax,[screen_workarea.right] |
1498 | neg eax |
1515 | neg eax |
1499 | mov [edi+WDATA.width],eax |
1516 | mov [edi+WDATA.box.width],eax |
1500 | mov eax,[screen_workarea.top] |
1517 | mov eax,[screen_workarea.top] |
1501 | mov [edi+WDATA.top],eax |
1518 | mov [edi+WDATA.box.top],eax |
1502 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1519 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1503 | jnz @f |
1520 | jnz @f |
1504 | sub eax,[screen_workarea.bottom] |
1521 | sub eax,[screen_workarea.bottom] |
1505 | neg eax |
1522 | neg eax |
1506 | mov [edi+WDATA.height],eax |
1523 | mov [edi+WDATA.box.height],eax |
1507 | @@: |
1524 | @@: |
1508 | jmp no_fullscreen_restore |
1525 | jmp no_fullscreen_restore |
1509 | restore_from_fullscreen: |
1526 | restore_from_fullscreen: |
1510 | and [edi+WDATA.fl_wstate],not WSTATE_MAXIMIZED |
1527 | and [edi+WDATA.fl_wstate],not WSTATE_MAXIMIZED |
1511 | push [edi+WDATA.height] |
1528 | push [edi+WDATA.box.height] |
1512 | push edi ; restore |
1529 | push edi ; restore |
1513 | lea esi, [edx + 0x90] |
1530 | lea esi, [edx + 0x90] |
1514 | mov ecx,4 |
1531 | mov ecx,4 |
1515 | cld |
1532 | cld |
1516 | rep movsd |
1533 | rep movsd |
1517 | pop edi |
1534 | pop edi |
1518 | pop eax |
1535 | pop eax |
1519 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1536 | test [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP |
1520 | jz @f |
1537 | jz @f |
1521 | mov [edi+WDATA.height],eax |
1538 | mov [edi+WDATA.box.height],eax |
1522 | @@: |
1539 | @@: |
1523 | 1540 | ||
1524 | no_fullscreen_restore: |
1541 | no_fullscreen_restore: |
1525 | 1542 | ||
1526 | mov eax,[edi+4] ; check Y inside screen |
1543 | mov eax,[edi+4] ; check Y inside screen |
1527 | add eax,[edi+12] |
1544 | add eax,[edi+12] |
1528 | cmp eax,[0xfe04] |
1545 | cmp eax,[0xfe04] |
1529 | jbe no_window_sizing |
1546 | jbe no_window_sizing |
1530 | mov eax,[edi+0] ; check X inside screen |
1547 | mov eax,[edi+0] ; check X inside screen |
1531 | add eax,[edi+8] |
1548 | add eax,[edi+8] |
1532 | cmp eax,[0xfe00] |
1549 | cmp eax,[0xfe00] |
1533 | jbe no_window_sizing |
1550 | jbe no_window_sizing |
1534 | mov eax,[0xfe00] |
1551 | mov eax,[0xfe00] |
1535 | sub eax,[edi+8] |
1552 | sub eax,[edi+8] |
1536 | mov [edi+0],eax |
1553 | mov [edi+0],eax |
1537 | mov eax,[0xfe04] |
1554 | mov eax,[0xfe04] |
1538 | sub eax,[edi+12] |
1555 | sub eax,[edi+12] |
1539 | mov [edi+4],eax |
1556 | mov [edi+4],eax |
1540 | no_window_sizing: |
1557 | no_window_sizing: |
1541 | 1558 | ||
1542 | popad |
1559 | popad |
1543 | 1560 | ||
1544 | cmp [reposition],0 |
1561 | cmp [reposition],0 |
1545 | je retwm |
1562 | je retwm |
1546 | 1563 | ||
1547 | mov [0xfff5],byte 1 ; no mouse |
1564 | mov [0xfff5],byte 1 ; no mouse |
1548 | 1565 | ||
1549 | 1566 | ||
1550 | push eax ebx ecx edx |
1567 | push eax ebx ecx edx |
1551 | mov eax,[edi+00] |
1568 | mov eax,[edi+00] |
1552 | mov ebx,[edi+04] |
1569 | mov ebx,[edi+04] |
1553 | mov ecx,[edi+8] |
1570 | mov ecx,[edi+8] |
1554 | mov edx,[edi+12] |
1571 | mov edx,[edi+12] |
1555 | add ecx,eax |
1572 | add ecx,eax |
1556 | add edx,ebx |
1573 | add edx,ebx |
1557 | call calculatescreen |
1574 | call calculatescreen |
1558 | 1575 | ||
1559 | mov eax,[oldc+00] |
1576 | mov eax,[oldc+00] |
1560 | mov ebx,[oldc+04] |
1577 | mov ebx,[oldc+04] |
1561 | mov ecx,[oldc+8] |
1578 | mov ecx,[oldc+8] |
1562 | mov edx,[oldc+12] |
1579 | mov edx,[oldc+12] |
1563 | add ecx,eax |
1580 | add ecx,eax |
1564 | add edx,ebx |
1581 | add edx,ebx |
1565 | call calculatescreen |
1582 | call calculatescreen |
1566 | pop edx ecx ebx eax |
1583 | pop edx ecx ebx eax |
1567 | 1584 | ||
1568 | mov eax,edi |
1585 | mov eax,edi |
1569 | call redrawscreen |
1586 | call redrawscreen |
1570 | 1587 | ||
1571 | 1588 | ||
1572 | mov [edi+WDATA.fl_redraw],1 |
1589 | mov [edi+WDATA.fl_redraw],1 |
1573 | 1590 | ||
1574 | mov ecx,100 ; wait to avoid mouse residuals |
1591 | mov ecx,100 ; wait to avoid mouse residuals |
1575 | waitre2: |
1592 | waitre2: |
1576 | mov [0xfff5],byte 1 |
1593 | mov [0xfff5],byte 1 |
1577 | call checkidle |
1594 | call checkidle |
1578 | cmp [edi+WDATA.fl_redraw],0 |
1595 | cmp [edi+WDATA.fl_redraw],0 |
1579 | jz retwm |
1596 | jz retwm |
1580 | loop waitre2 |
1597 | loop waitre2 |
1581 | 1598 | ||
1582 | retwm: |
1599 | retwm: |
1583 | 1600 | ||
1584 | mov [0xfff5],byte 0 ; mouse pointer |
1601 | mov [0xfff5],byte 0 ; mouse pointer |
1585 | mov [0xfff4],byte 0 ; no mouse under |
1602 | mov [0xfff4],byte 0 ; no mouse under |
1586 | mov [0xfb44],byte 0 ; react to mouse up/down |
1603 | mov [0xfb44],byte 0 ; react to mouse up/down |
1587 | 1604 | ||
1588 | mov esi,window_moved |
1605 | mov esi,window_moved |
1589 | call sys_msg_board_str |
1606 | call sys_msg_board_str |
1590 | 1607 | ||
1591 | popad |
1608 | popad |
1592 | 1609 | ||
1593 | ret |
1610 | ret |
1594 | 1611 | ||
1595 | 1612 | ||
1596 | uglobal |
1613 | uglobal |
1597 | add_window_data dd 0 |
1614 | add_window_data dd 0 |
1598 | do_resize_from_corner db 0x0 |
1615 | do_resize_from_corner db 0x0 |
1599 | reposition db 0x0 |
1616 | reposition db 0x0 |
1600 | latest_window_touch dd 0x0 |
1617 | latest_window_touch dd 0x0 |
1601 | latest_window_touch_delta dd 0x0 |
1618 | latest_window_touch_delta dd 0x0 |
1602 | 1619 | ||
1603 | do_resize db 0x0 |
1620 | do_resize db 0x0 |
1604 | 1621 | ||
1605 | oldc dd 0x0,0x0,0x0,0x0 |
1622 | oldc dd 0x0,0x0,0x0,0x0 |
1606 | 1623 | ||
1607 | dlx dd 0x0 |
1624 | dlx dd 0x0 |
1608 | dly dd 0x0 |
1625 | dly dd 0x0 |
1609 | dlxe dd 0x0 |
1626 | dlxe dd 0x0 |
1610 | dlye dd 0x0 |
1627 | dlye dd 0x0 |
1611 | 1628 | ||
1612 | npx dd 0x0 |
1629 | npx dd 0x0 |
1613 | npy dd 0x0 |
1630 | npy dd 0x0 |
1614 | npxe dd 0x0 |
1631 | npxe dd 0x0 |
1615 | npye dd 0x0 |
1632 | npye dd 0x0 |
1616 | 1633 | ||
1617 | mpx dd 0x0 |
1634 | mpx dd 0x0 |
1618 | mpy dd 0x0 |
1635 | mpy dd 0x0 |
1619 | endg |
1636 | endg |
1620 | 1637 | ||
1621 | 1638 | ||
1622 | ; draw negative window frames |
1639 | ; draw negative window frames |
1623 | 1640 | ||
1624 | drawwindowframes: |
1641 | drawwindowframes: |
1625 | 1642 | ||
1626 | pushad |
1643 | pushad |
1627 | 1644 | ||
1628 | mov eax,[npx] |
1645 | mov eax,[npx] |
1629 | shl eax,16 |
1646 | shl eax,16 |
1630 | add eax,[npx] |
1647 | add eax,[npx] |
1631 | add eax,[npxe] |
1648 | add eax,[npxe] |
1632 | add eax,65536*1-1 |
1649 | add eax,65536*1-1 |
1633 | mov ebx,[npy] |
1650 | mov ebx,[npy] |
1634 | shl ebx,16 |
1651 | shl ebx,16 |
1635 | add ebx,[npy] |
1652 | add ebx,[npy] |
1636 | mov ecx,0x01000000 |
1653 | mov ecx,0x01000000 |
1637 | push edi |
1654 | push edi |
1638 | mov edi,1 |
1655 | mov edi,1 |
1639 | call [draw_line] |
1656 | call [draw_line] |
1640 | pop edi |
1657 | pop edi |
1641 | 1658 | ||
1642 | mov eax,[npx] |
1659 | mov eax,[npx] |
1643 | shl eax,16 |
1660 | shl eax,16 |
1644 | add eax,[npx] |
1661 | add eax,[npx] |
1645 | add eax,[npxe] |
1662 | add eax,[npxe] |
1646 | add eax,65536*1-1 |
1663 | add eax,65536*1-1 |
1647 | mov ebx,[npy] |
1664 | mov ebx,[npy] |
1648 | add ebx,[npye] |
1665 | add ebx,[npye] |
1649 | shl ebx,16 |
1666 | shl ebx,16 |
1650 | add ebx,[npy] |
1667 | add ebx,[npy] |
1651 | add ebx,[npye] |
1668 | add ebx,[npye] |
1652 | mov ecx,0x01000000 |
1669 | mov ecx,0x01000000 |
1653 | push edi |
1670 | push edi |
1654 | mov edi,1 |
1671 | mov edi,1 |
1655 | call [draw_line] |
1672 | call [draw_line] |
1656 | pop edi |
1673 | pop edi |
1657 | 1674 | ||
1658 | mov eax,[npx] |
1675 | mov eax,[npx] |
1659 | shl eax,16 |
1676 | shl eax,16 |
1660 | add eax,[npx] |
1677 | add eax,[npx] |
1661 | mov ebx,[npy] |
1678 | mov ebx,[npy] |
1662 | shl ebx,16 |
1679 | shl ebx,16 |
1663 | add ebx,[npy] |
1680 | add ebx,[npy] |
1664 | add ebx,[npye] |
1681 | add ebx,[npye] |
1665 | mov ecx,0x01000000 |
1682 | mov ecx,0x01000000 |
1666 | push edi |
1683 | push edi |
1667 | mov edi,1 |
1684 | mov edi,1 |
1668 | call [draw_line] |
1685 | call [draw_line] |
1669 | pop edi |
1686 | pop edi |
1670 | 1687 | ||
1671 | mov eax,[npx] |
1688 | mov eax,[npx] |
1672 | add eax,[npxe] |
1689 | add eax,[npxe] |
1673 | shl eax,16 |
1690 | shl eax,16 |
1674 | add eax,[npx] |
1691 | add eax,[npx] |
1675 | add eax,[npxe] |
1692 | add eax,[npxe] |
1676 | mov ebx,[npy] |
1693 | mov ebx,[npy] |
1677 | shl ebx,16 |
1694 | shl ebx,16 |
1678 | add ebx,[npy] |
1695 | add ebx,[npy] |
1679 | add ebx,[npye] |
1696 | add ebx,[npye] |
1680 | mov ecx,0x01000000 |
1697 | mov ecx,0x01000000 |
1681 | push edi |
1698 | push edi |
1682 | mov edi,1 |
1699 | mov edi,1 |
1683 | call [draw_line] |
1700 | call [draw_line] |
1684 | mov edi,[0x3000] |
1701 | mov edi,[0x3000] |
1685 | shl edi,5 |
1702 | shl edi,5 |
1686 | add edi,window_data |
1703 | add edi,window_data |
1687 | mov [edi+30],byte 1 |
1704 | mov [edi+30],byte 1 |
1688 | pop edi |
1705 | pop edi |
1689 | 1706 | ||
1690 | popad |
1707 | popad |
1691 | 1708 | ||
1692 | ret |
1709 | ret |
1693 | 1710 | ||
1694 | 1711 | ||
1695 | 1712 | ||
1696 | random_shaped_window: |
1713 | random_shaped_window: |
1697 | 1714 | ||
1698 | ; |
1715 | ; |
1699 | ; eax = 0 giving address of data area |
1716 | ; eax = 0 giving address of data area |
1700 | ; ebx address |
1717 | ; ebx address |
1701 | ; ebx = 1 shape area scale |
1718 | ; ebx = 1 shape area scale |
1702 | ; ebx 2^ebx scale |
1719 | ; ebx 2^ebx scale |
1703 | 1720 | ||
1704 | test eax, eax |
1721 | test eax, eax |
1705 | jne rsw_no_address |
1722 | jne rsw_no_address |
1706 | mov eax,[0x3000] |
1723 | mov eax,[0x3000] |
1707 | shl eax,8 |
1724 | shl eax,8 |
1708 | 1725 | ||
1709 | mov [eax+0x80000+0x80],ebx |
1726 | mov [eax+0x80000+0x80],ebx |
1710 | rsw_no_address: |
1727 | rsw_no_address: |
1711 | 1728 | ||
1712 | cmp eax,1 |
1729 | cmp eax,1 |
1713 | jne rsw_no_scale |
1730 | jne rsw_no_scale |
1714 | mov eax,[0x3000] |
1731 | mov eax,[0x3000] |
1715 | shl eax,8 |
1732 | shl eax,8 |
1716 | mov [eax+0x80000+0x84],bl |
1733 | mov [eax+0x80000+0x84],bl |
1717 | rsw_no_scale: |
1734 | rsw_no_scale: |
1718 | 1735 | ||
1719 | ret>>->->=>=> |
1736 | ret>>->->=>=> |