Subversion Repositories Kolibri OS

Rev

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

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