Subversion Repositories Kolibri OS

Rev

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

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