Subversion Repositories Kolibri OS

Rev

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