Subversion Repositories Kolibri OS

Rev

Rev 105 | Rev 114 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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