Subversion Repositories Kolibri OS

Rev

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

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