Subversion Repositories Kolibri OS

Rev

Rev 427 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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