Subversion Repositories Kolibri OS

Rev

Rev 142 | Rev 163 | 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
708
 
115 poddubny 709
        mov   esi,[edx+WDATA.cl_frames]   ; rectangle
710
        mov   eax,[edx+WDATA.box.left]
114 mikedld 711
        shl   eax,16
115 poddubny 712
        add   eax,[edx+WDATA.box.left]
713
        add   eax,[edx+WDATA.box.width]
714
        mov   ebx,[edx+WDATA.box.top]
114 mikedld 715
        shl   ebx,16
115 poddubny 716
        add   ebx,[edx+WDATA.box.top]
717
        add   ebx,[edx+WDATA.box.height]
114 mikedld 718
        call  draw_rectangle
719
 
720
        call    drawwindow_I_caption
721
 
115 poddubny 722
        mov   edx,[esi+WDATA.box.top]      ; inside work area
1 ha 723
        add   edx,21+5
115 poddubny 724
        mov   ebx,[esi+WDATA.box.top]
725
        add   ebx,[esi+WDATA.box.height]
1 ha 726
        cmp   edx,ebx
727
        jg    noinside
728
        mov   eax,1
729
        mov   ebx,21
115 poddubny 730
        mov   ecx,[esi+WDATA.box.width]
731
        mov   edx,[esi+WDATA.box.height]
732
        mov   edi,[esi+WDATA.cl_workarea]
1 ha 733
        call  [drawbar]
734
      noinside:
735
 
736
        popad
737
 
738
        ret
739
 
740
 
741
draw_rectangle:
742
 
743
r_eax equ [esp+28]   ; x start
744
r_ax  equ [esp+30]   ; x end
745
r_ebx equ [esp+16]   ; y start
746
r_bx  equ [esp+18]   ; y end
747
;esi                 ; color
748
 
749
        pushad
750
 
751
        mov   ecx,esi          ; yb,xb -> yb,xe
752
        mov   eax, r_eax
753
        rol   eax, 16
754
        mov   ebx,r_ebx
755
        shl   ebx,16
756
        mov   bx,r_ebx
757
        xor   edi, edi
758
        call  [draw_line]
759
 
760
        mov   ebx,r_bx         ; ye,xb -> ye,xe
761
        shl   ebx,16
762
        mov   bx,r_bx
763
        call  [draw_line]
764
 
765
        mov   ecx,esi          ; ya,xa -> ye,xa
766
        mov   eax,r_eax
767
        shl   eax,16
768
        mov   ax,r_eax
769
        mov   ebx,r_ebx
770
        shl   ebx,16
771
        mov   bx,r_bx
772
        mov   edi,0
773
        call  [draw_line]
774
 
775
        mov   eax,r_ax       ; ya,xe -> ye,xe
776
        shl   eax,16
777
        mov   ax,r_ax
778
        call  [draw_line]
779
 
780
        popad
781
        ret
782
 
783
 
114 mikedld 784
drawwindow_III_caption:
1 ha 785
 
115 poddubny 786
        mov   ecx,[edx+WDATA.cl_titlebar]                       ; GRAB BAR
1 ha 787
        push  ecx
788
        mov   esi,edx
115 poddubny 789
        mov   edx,[esi+WDATA.box.top]
1 ha 790
        add   edx,4
115 poddubny 791
        mov   ebx,[esi+WDATA.box.top]
1 ha 792
        add   ebx,20
115 poddubny 793
        mov   eax,[esi+WDATA.box.top]
794
        add   eax,[esi+WDATA.box.height]
1 ha 795
        cmp   ebx,eax
114 mikedld 796
        jb    .wdsizeok
1 ha 797
        mov   ebx,eax
114 mikedld 798
  .wdsizeok:
1 ha 799
        push  ebx
114 mikedld 800
  .drwi:
1 ha 801
        mov   ebx,edx
802
        shl   ebx,16
803
        add   ebx,edx
115 poddubny 804
        mov   eax,[esi+WDATA.box.left]
1 ha 805
        shl   eax,16
115 poddubny 806
        add   eax,[esi+WDATA.box.left]
807
        add   eax,[esi+WDATA.box.width]
1 ha 808
        add   eax,4*65536-4
115 poddubny 809
        mov   ecx,[esi+WDATA.cl_titlebar]
1 ha 810
        test  ecx,0x40000000
114 mikedld 811
        jz    .nofa
1 ha 812
        add   ecx,0x040404
114 mikedld 813
  .nofa:
1 ha 814
        test  ecx,0x80000000
114 mikedld 815
        jz    .nofa2
1 ha 816
        sub   ecx,0x040404
114 mikedld 817
  .nofa2:
115 poddubny 818
        mov   [esi+WDATA.cl_titlebar],ecx
1 ha 819
        and   ecx,0xffffff
820
        xor   edi, edi
821
        call  [draw_line]
822
        inc   edx
823
        cmp   edx,[esp]
114 mikedld 824
        jb    .drwi
1 ha 825
        add   esp,4
826
        pop   ecx
115 poddubny 827
        mov   [esi+WDATA.cl_titlebar],ecx
1 ha 828
 
114 mikedld 829
        ret
830
 
831
 
832
drawwindow_III:
833
 
834
        pushad
835
 
836
        mov   edi,edx                              ; RECTANGLE
115 poddubny 837
        mov   eax,[edi+WDATA.box.left]
114 mikedld 838
        shl   eax,16
117 mario79 839
    mov   ax, word [edi+WDATA.box.left]
840
    add   ax, word [edi+WDATA.box.width]
115 poddubny 841
        mov   ebx,[edi+WDATA.box.top]
114 mikedld 842
        shl   ebx,16
117 mario79 843
    mov   bx, word [edi+WDATA.box.top]
844
    add   bx, word [edi+WDATA.box.height]
115 poddubny 845
        mov   esi,[edi+WDATA.cl_frames]
114 mikedld 846
        shr   esi,1
847
        and   esi,0x007f7f7f
848
        push  esi
849
        call  draw_rectangle
850
        mov   ecx,3
851
      dw3l:
852
        add   eax,1*65536-1
853
        add   ebx,1*65536-1
115 poddubny 854
        mov   esi,[edi+WDATA.cl_frames]
114 mikedld 855
        call  draw_rectangle
856
        dec   ecx
857
        jnz   dw3l
858
        pop   esi
859
        add   eax,1*65536-1
860
        add   ebx,1*65536-1
861
        call  draw_rectangle
862
 
863
        call    drawwindow_III_caption
864
 
115 poddubny 865
        mov   edx,[esi+WDATA.box.top]                       ; WORK AREA
1 ha 866
        add   edx,21+5
115 poddubny 867
        mov   ebx,[esi+WDATA.box.top]
868
        add   ebx,[esi+WDATA.box.height]
1 ha 869
        cmp   edx,ebx
870
        jg    noinside2
871
        mov   eax,5
872
        mov   ebx,20
115 poddubny 873
        mov   ecx,[esi+WDATA.box.width]
874
        mov   edx,[esi+WDATA.box.height]
1 ha 875
        sub   ecx,4
876
        sub   edx,4
115 poddubny 877
        mov   edi,[esi+WDATA.cl_workarea]
1 ha 878
        call  [drawbar]
879
      noinside2:
880
 
881
        popad
882
 
883
        ret
884
 
885
 
886
 
887
; activate window
888
align 4
889
windowactivate:
890
 
891
        ; esi = abs mem position in stack 0xC400+
892
 
893
        pushad
102 poddubny 894
 
895
     ; if type of current active window is 3,
896
     ; it must be redrawn
897
        mov   eax, [0x3004]
898
        movzx eax, word [0xC400 + eax*2]
899
        shl   eax, 5
900
        add   eax, window_data
901
        mov   ebx, [eax + WDATA.cl_workarea]
902
        and   ebx, 0x0f000000
903
        cmp   ebx, 0x03000000
904
        jne   @f
905
        mov   [eax + WDATA.fl_redraw], byte 1
906
     @@:
907
 
33 mario79 908
        push   esi
1 ha 909
      movzx   eax, word [esi] ; ax <- process no
910
      movzx   eax, word [0xC000+eax*2] ; ax <- position in window stack
911
 
912
        xor   esi, esi        ; drop others
913
      waloop:
914
        cmp   esi, dword [0x3004]
915
        jae   wacont
916
        inc   esi
917
        lea   edi, [0xC000 + esi*2]
918
        mov   bx, [edi] ; position of the current process
919
        cmp   bx, ax
920
        jbe   @f
921
        dec   bx       ; upper? => drop!
922
        mov   [edi], bx
923
      @@:
924
        jmp   waloop
925
      wacont:
926
                            ; set to no 1
927
        pop   esi           ;   esi = pointer at 0xC400
928
 
929
      movzx   eax, word [esi]
930
        mov   bx, [0x3004]  ; number of processes
931
        mov   [0xC000+eax*2], bx     ; this is the last (and the upper)
932
 
933
        ; update on screen -window stack
934
        xor   esi, esi
935
      waloop2:
936
        mov   edi, [0x3004]
937
        cmp   esi, edi
938
        jae   wacont2
939
        inc   esi
940
        movzx ebx, word [esi*2 + 0xC000]
941
        mov   [ebx*2 + 0xC400], si
942
        jmp   waloop2
943
      wacont2:
944
        mov   [0xf400], byte 0           ; empty keyboard buffer
945
        mov   [0xf500], byte 0           ; empty button buffer
946
        popad
947
        ret
948
 
949
 
950
; check if window is necessary to draw
951
 
952
checkwindowdraw:
953
 
954
        ; edi = position in window_data+
955
 
102 poddubny 956
        mov   eax, [edi + WDATA.cl_workarea]
957
        and   eax, 0x0f000000
958
        cmp   eax, 0x03000000
959
        je    .return_yes      ; window type 3
960
 
1 ha 961
        mov   esi, edi
962
        sub   esi, window_data
963
        shr   esi, 5
964
 
965
        ; esi = process number
966
 
967
        movzx eax, word [0xC000 + esi * 2] ; get value of the curr process
968
        lea   esi, [0xC400 + eax * 2]      ; get address of this process at 0xC400
969
 
970
        push  esi
971
 
972
      .new_check:
973
 
974
        pop   esi
975
        add   esi, 2
976
        push  esi
977
 
978
        mov   eax, [0x3004]
979
        lea   eax, word [0xC400 + eax * 2] ; number of the upper window
980
 
981
        cmp   esi, eax
982
        ja    .all_wnds_to_top
983
 
984
        movzx eax, word [esi]
985
        shl   eax, 5
115 poddubny 986
        cmp   [0x3000 + eax + TASKDATA.state], byte 9
102 poddubny 987
        je    .new_check                    ; skip dead windows
1 ha 988
 
102 poddubny 989
        lea   esi, [eax+window_data]
990
 
115 poddubny 991
        mov   ebx, [edi+WDATA.box.top]  ; y0
992
        mov   edx, [edi+WDATA.box.height]
102 poddubny 993
        add   edx, ebx      ; y0e
1 ha 994
 
115 poddubny 995
        mov   ecx, [esi+WDATA.box.top]  ; y  ; y check
102 poddubny 996
        cmp   ecx, edx
997
        jae   .new_check     ; y < y0e
115 poddubny 998
        mov   eax, [esi+WDATA.box.height]
102 poddubny 999
        add   ecx, eax       ; ye
1000
        cmp   ebx, ecx       ; y0 >= ye
1 ha 1001
        ja    .new_check
1002
 
115 poddubny 1003
        mov   eax, [edi+WDATA.box.left]   ; x0
1004
        mov   ecx, [edi+WDATA.box.width]
102 poddubny 1005
        add   ecx, eax       ; x0e
1 ha 1006
 
115 poddubny 1007
        mov   edx, [esi+WDATA.box.left]   ; x ; x check
1 ha 1008
        cmp   edx, ecx
102 poddubny 1009
        jae   .new_check     ; x < x0e
115 poddubny 1010
        mov   ecx, [esi+WDATA.box.width]
1 ha 1011
        add   edx, ecx
1012
        cmp   eax, edx
1013
        ja    .new_check
1014
 
1015
        pop   esi
102 poddubny 1016
  .return_yes:
1 ha 1017
        mov   ecx,1   ; overlap some window
1018
        ret
1019
 
1020
  .all_wnds_to_top:
1021
 
1022
        pop   esi
1023
 
1024
        xor   ecx, ecx       ; passed all windows to top
1025
        ret
1026
 
1027
 
1028
 
1029
 
1030
waredraw:     ; if redraw necessary at activate
1031
 
1032
        pushad
1033
 
1034
        call  checkwindowdraw      ; draw window on activation ?
1035
        test  ecx, ecx
1036
        jz    .do_not_draw
1037
 
1038
        popad
1039
        mov   [0xfb44], byte 1     ; do draw mouse
1040
        call  windowactivate
1041
 
1042
        ; update screen info
1043
        pushad
1044
        mov   edi, [0x3004] ; the last process (number)
1045
        movzx esi, word [0xC400 + edi * 2]
1046
        shl   esi, 5
1047
        add   esi, window_data
1048
 
1049
        ; coordinates of the upper window
117 mario79 1050
    mov   eax, [esi + WDATA.box.left]   ; cx
1051
    mov   ebx, [esi + WDATA.box.top]    ; cy
1052
    mov   ecx, [esi + WDATA.box.width]  ; sx
1053
    mov   edx, [esi + WDATA.box.height] ; sy
1 ha 1054
 
1055
        add   ecx, eax       ; ecx = x_end
1056
        add   edx, ebx       ; edx = y_end
1057
 
1058
        mov   edi, [0x3004]
1059
        movzx esi, word [0xC400 + edi * 2]
102 poddubny 1060
        call  setscreen
1 ha 1061
        popad
1062
 
117 mario79 1063
    mov   [edi + WDATA.fl_redraw], 1  ; redraw flag for app
1064
    mov   [0xfb44],byte 0             ; mouse down checks
1 ha 1065
 
1066
        ret
1067
 
1068
     .do_not_draw:
1069
 
1070
        popad
1071
 
1072
        call  windowactivate
1073
        mov   [0xfb44],byte 0  ; mouse down checks
1074
        mov   [0xfff4],byte 0  ; no mouse background
1075
        mov   [0xfff5],byte 0  ; draw mouse
1076
        ret
1077
 
1078
 
105 poddubny 1079
; eax = window number on screen
1080
; corrupts registers and [dl*]
1081
minimize_window:
1082
        movzx eax, word [0xC400+eax*2]
1083
        shl   eax, 5
1084
        add   eax, window_data
1085
        test  [eax+WDATA.fl_wstate], WSTATE_MINIMIZED
1086
        jnz   .skip_redrawings
1087
        pushfd
1088
        cli
1089
        or    [eax+WDATA.fl_wstate], WSTATE_MINIMIZED
1090
        mov   edi, eax
112 poddubny 1091
        ;call  calculatescreen
114 mikedld 1092
        mov   eax, [edi+WDATA.box.left]
105 poddubny 1093
        mov   [dlx], eax
112 poddubny 1094
        mov   ecx, eax
114 mikedld 1095
        add   ecx, [edi+WDATA.box.width]
112 poddubny 1096
        mov   [dlxe], ecx
114 mikedld 1097
        mov   ebx, [edi+WDATA.box.top]
112 poddubny 1098
        mov   [dly], ebx
1099
        mov   edx, ebx
114 mikedld 1100
        add   edx, [edi+WDATA.box.height]
112 poddubny 1101
        mov   [dlye], edx
1102
        call  calculatescreen
105 poddubny 1103
        xor   esi, esi
1104
        xor   eax, eax
1105
        call  redrawscreen
1106
        popfd
1107
.skip_redrawings:
1108
        ret
1109
 
1110
; eax = window number on screen
1111
; corrupts registers and [dl*]
1112
restore_minimized_window:
1113
        pushfd
1114
        cli
1115
        movzx esi, word [0xC400+eax*2]
1116
        mov   edi, esi
1117
        shl   edi, 5
1118
        add   edi, window_data
1119
        test  [edi+WDATA.fl_wstate], WSTATE_MINIMIZED
1120
        jz    .skip_redrawings
1121
        mov   [edi+WDATA.fl_redraw], 1
1122
        and   [edi+WDATA.fl_wstate], not WSTATE_MINIMIZED
1123
        cmp   eax, [0x3004] ; the uppermost window
1124
        jnz   .no_uppermost
114 mikedld 1125
        mov   eax, [edi+WDATA.box.left]
1126
        mov   ebx, [edi+WDATA.box.top]
105 poddubny 1127
        mov   ecx, eax
1128
        mov   edx, ebx
114 mikedld 1129
        add   ecx, [edi+WDATA.box.width]
1130
        add   edx, [edi+WDATA.box.height]
105 poddubny 1131
        call  setscreen
1132
        jmp   .done
1133
.no_uppermost:
114 mikedld 1134
        mov   eax, [edi+WDATA.box.left]
1135
        mov   ebx, [edi+WDATA.box.top]
112 poddubny 1136
        mov   ecx, eax
1137
        mov   edx, ebx
114 mikedld 1138
        add   ecx, [edi+WDATA.box.width]
1139
        add   edx, [edi+WDATA.box.height]
105 poddubny 1140
        call  calculatescreen
1141
.done:
1142
        mov   [0xfff4],byte 0 ; no mouse under
1143
.skip_redrawings:
1144
        popfd
1145
        ret
1146
 
1147
 
1 ha 1148
iglobal
1149
  window_moving   db 'K : Window - move/resize',13,10,0
1150
  window_moved    db 'K : Window - done',13,10,0
1151
endg
1152
 
1153
; check window touch
1154
align 4
1155
checkwindows:
1156
        pushad
1157
 
105 poddubny 1158
        cmp   [window_minimize], 0
1159
        je    .no_minimizing
1160
        mov   eax, [0x3004]       ; the uppermost window
1161
        mov   bl, 0
1162
        xchg  [window_minimize], bl
1163
        cmp   bl, 1
1164
        jne   .restore
1165
        call  minimize_window
1166
        jmp   .continue
1167
  .restore:
1168
        call  restore_minimized_window
1169
  .continue:
1170
  .no_minimizing:
1 ha 1171
 
1172
        cmp   [0xfb40],byte 0    ; mouse buttons pressed ?
1173
        jne   .mouse_buttons_pressed
1174
        popad
1175
        ret
1176
    .mouse_buttons_pressed:
1177
 
1178
        mov   esi,[0x3004]
1179
        inc   esi
1180
 
1181
      cwloop:
1182
        cmp   esi,2
1183
        jb   .exit
105 poddubny 1184
 
1 ha 1185
        dec   esi
1186
        movzx edi, word [0xC400 + esi * 2] ; ebx
1187
        shl   edi, 5
1188
        add   edi, window_data
1189
;        mov   edi, ebx
117 mario79 1190
    mov   ecx, [edi + WDATA.box.left]
1191
    mov   edx, [edi + WDATA.box.top]
1 ha 1192
 
1193
        mov   eax,ecx
1194
        mov   ebx,edx
41 mikedld 1195
        test    [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
1196
        jnz     cwloop
1 ha 1197
 
1198
       movzx  eax, word [0xfb0a]
1199
       movzx  ebx, word [0xfb0c]
1200
 
1201
        cmp   ecx, eax
1202
        jae   cwloop
1203
        cmp   edx, ebx
1204
        jae   cwloop
117 mario79 1205
    add   ecx, [edi + WDATA.box.width]
1206
    add   edx, [edi + WDATA.box.height]
1 ha 1207
        cmp   eax, ecx
1208
        jae   cwloop
1209
        cmp   ebx, edx
1210
        jae   cwloop
1211
 
1212
        pushad
1213
        mov   eax, esi
1214
        mov   ebx, [0x3004]
1215
        cmp   eax, ebx      ; is this window active?
1216
        jz    .move_resize_window
1217
 
1218
        ; eax = position in windowing stack
1219
        ; redraw must ?
1220
        lea   esi, [0xC400 + esi * 2]
1221
        call  waredraw
1222
        add   esp, 32
1223
 
1224
      .exit:
1225
        popad
1226
        ret
1227
 
1228
   .move_resize_window:    ; MOVE OR RESIZE WINDOW
1229
 
1230
        popad
1231
 
1232
        ; Check for user enabled fixed window
117 mario79 1233
    mov   edx, [edi + WDATA.cl_titlebar]
1 ha 1234
        and   edx, 0x0f000000
1235
        cmp   edx, 0x01000000
1236
        jne   .window_move_enabled_for_user
1237
        popad
1238
        ret
1239
      .window_move_enabled_for_user:
1240
 
117 mario79 1241
    test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
41 mikedld 1242
        jnz     .no_resize_2
1243
 
1 ha 1244
        mov   [do_resize_from_corner],byte 0   ; resize for skinned window
117 mario79 1245
    mov   edx, [edi + WDATA.cl_workarea]
1 ha 1246
        and   edx, 0x0f000000
1247
        cmp   edx, 0x02000000
1248
        jb    .no_resize_2 ; not type 2 wnd
1249
 
117 mario79 1250
    mov   edx, [edi + WDATA.box.top]
1251
    add   edx, [edi + WDATA.box.height]
1 ha 1252
        sub   edx, 6       ; edx = y_end - 6
1253
        cmp   ebx, edx     ; ebx = mouse_y
1254
        jb    .no_resize_2
1255
        mov   [do_resize_from_corner],byte 1
1256
        jmp   .continue
1257
      .no_resize_2:
1258
 
41 mikedld 1259
        push    eax
1260
        call    get_titlebar_height
117 mario79 1261
    add     eax,[edi + WDATA.box.top]
41 mikedld 1262
        cmp     ebx,eax
1263
        pop     eax
1264
        jae     .exit
1 ha 1265
 
1266
     .continue:
1267
 
1268
        push  esi
1269
        mov   esi, window_moving
1270
        call  sys_msg_board_str
1271
        pop   esi
1272
 
105 poddubny 1273
        mov   ecx, [timer_ticks]     ; double-click ?
1 ha 1274
        mov   edx, ecx
1275
        sub   edx, [latest_window_touch]
1276
        mov   [latest_window_touch], ecx
1277
        mov   [latest_window_touch_delta], edx
1278
 
1279
        mov   cl, [0xfb40]     ; save for shade check
1280
        mov   [do_resize], cl
1281
     no_emulation_righ_button:
117 mario79 1282
    mov   ecx, [edi + WDATA.box.left]
1283
    mov   edx, [edi + WDATA.box.top]
1 ha 1284
 
1285
        push  eax ecx edx
1286
        mov   [dlx], ecx      ; save for drawlimits
1287
        mov   [dly], edx
117 mario79 1288
    mov   eax, [edi + WDATA.box.width]
1 ha 1289
        add   ecx, eax
117 mario79 1290
    mov   eax, [edi + WDATA.box.height]
1 ha 1291
        add   edx, eax
1292
        mov   [dlxe], ecx
1293
        mov   [dlye], edx
1294
        pop   edx ecx eax
1295
 
1296
        sub   eax, ecx
1297
        sub   ebx, edx
1298
 
1299
        mov   esi, [0xfb0a]
1300
        mov   [0xf300], esi
1301
 
1302
        pushad           ; wait for putimages to finish
1303
;        mov   eax,5
1304
;        call  delay_hs
117 mario79 1305
    mov   eax,[edi + WDATA.box.left]
1 ha 1306
        mov   [npx],eax
117 mario79 1307
    mov   eax,[edi + WDATA.box.top]
1 ha 1308
        mov   [npy],eax
1309
        popad
1310
 
1311
        push eax                  ; save old coordinates
117 mario79 1312
    mov   ax, word [edi + WDATA.box.left]
115 poddubny 1313
        mov   word [oldc+BOX.left],ax
117 mario79 1314
    mov   ax, word [edi + WDATA.box.top]
115 poddubny 1315
        mov   word [oldc+BOX.top],ax
117 mario79 1316
    mov   ax, word [edi + WDATA.box.width]
115 poddubny 1317
        mov   word [oldc+BOX.width],ax
1 ha 1318
        mov   word [npxe],ax
117 mario79 1319
    mov   ax, word [edi + WDATA.box.height]
115 poddubny 1320
        mov   word [oldc+BOX.height],ax
1 ha 1321
        mov   word [npye],ax
1322
        pop eax
1323
 
41 mikedld 1324
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1325
        jnz     @f
1 ha 1326
        call  drawwindowframes
41 mikedld 1327
    @@:
1 ha 1328
 
1329
        mov   [reposition],0
1330
        mov   [0xfb44],byte 1   ; no reaction to mouse up/down
1331
 
1332
        ; move window
1333
 
1334
      newchm:
1335
 
1336
        mov   [0xfff5],byte 1
1337
 
1338
        call  checkidle
1339
 
117 mario79 1340
        call  checkVga_N13
1 ha 1341
 
1342
        mov   [0xfff4],byte 0
1343
 
1344
        call  [draw_pointer]
1345
 
1346
        pushad
1347
        call   stack_handler
1348
        popad
1349
 
1350
        mov   esi,[0xf300]
1351
        cmp   esi,[0xfb0a]
1352
        je    cwb
1353
 
1354
        mov   cx,[0xfb0a]
1355
        mov   dx,[0xfb0c]
1356
        sub   cx,ax
1357
        sub   dx,bx
1358
 
1359
        push  ax
1360
        push  bx
1361
 
41 mikedld 1362
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1363
        jnz     @f
1 ha 1364
        call  drawwindowframes
41 mikedld 1365
    @@:
1 ha 1366
 
1367
        mov   ax,[0xfe00]
1368
        mov   bx,[0xfe04]
1369
 
1370
        cmp   [do_resize_from_corner],1
1371
        je    no_new_position
1372
 
1373
        mov   word [npx],word 0     ; x repos ?
1374
        cmp   ax,cx
1375
        jb    noreposx
1376
        mov   [reposition],1
1377
        sub   ax,word [npxe]
1378
        mov   word [npx],ax
1379
        cmp   ax,cx
1380
        jb    noreposx
1381
        mov   word [npx],cx
1382
      noreposx:
1383
 
1384
        mov   word [npy],word 0     ; y repos ?
1385
        cmp   bx,dx
1386
        jb    noreposy
1387
        mov   [reposition],1
1388
        sub   bx,word [npye]
1389
        mov   word [npy],bx
1390
        cmp   bx,dx
1391
        jb    noreposy
1392
        mov   word [npy],dx
1393
      noreposy:
1394
 
1395
      no_new_position:
1396
 
1397
        cmp   [do_resize_from_corner],0    ; resize from right corner
1398
        je    norepos_size
1399
        pushad
1400
 
1401
        mov   edx,edi
1402
        sub   edx,window_data
115 poddubny 1403
        ;shr   edx,5
1404
        ;shl   edx,8
1405
        ;add   edx,0x80000                 ; process base at 0x80000+
117 mario79 1406
    lea   edx, [0x80000 + edx*8]
1 ha 1407
 
1408
        movzx eax,word [0xfb0a]
117 mario79 1409
    cmp   eax,[edi + WDATA.box.left]
1 ha 1410
        jb    nnepx
117 mario79 1411
    sub   eax,[edi + WDATA.box.left]
57 mikedld 1412
        cmp   eax,32 ; [edx+0x90+8]
1 ha 1413
        jge   nnepx2
57 mikedld 1414
        mov   eax,32 ; [edx+0x90+8]
1 ha 1415
      nnepx2:
1416
        mov   [npxe],eax
1417
      nnepx:
1418
 
57 mikedld 1419
        call    get_rolledup_height
41 mikedld 1420
        mov     ebx,eax
1 ha 1421
        movzx eax,word [0xfb0c]
117 mario79 1422
    cmp   eax,[edi + WDATA.box.top]
1 ha 1423
        jb    nnepy
117 mario79 1424
    sub   eax,[edi + WDATA.box.top]
41 mikedld 1425
        cmp     eax,ebx ; [edx+0x90+12]
1426
        jge     nnepy2
1427
        mov     eax,ebx ; [edx+0x90+12]
1 ha 1428
      nnepy2:
1429
        mov   [npye],eax
1430
      nnepy:
1431
 
1432
        mov   [reposition],1
1433
 
1434
        popad
1435
      norepos_size:
1436
 
1437
        pop   bx
1438
        pop   ax
41 mikedld 1439
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1440
        jnz     @f
1 ha 1441
        call  drawwindowframes
41 mikedld 1442
    @@:
1 ha 1443
 
1444
        mov   esi,[0xfb0a]
1445
        mov   [0xf300],esi
1446
 
1447
      cwb:
1448
        cmp   [0xfb40],byte 0
1449
        jne   newchm
1450
                                     ; new position done
41 mikedld 1451
        mov     [0xfff5],byte 1
1452
        mov     cl,0
1453
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1454
        jnz     @f
1455
        mov     cl,[reposition]
1456
        call    drawwindowframes
1 ha 1457
 
1458
        mov   eax,[npx]
117 mario79 1459
    mov   [edi + WDATA.box.left],eax
1 ha 1460
        mov   eax,[npy]
117 mario79 1461
    mov   [edi + WDATA.box.top],eax
1 ha 1462
        mov   eax,[npxe]
117 mario79 1463
    mov   [edi + WDATA.box.width],eax
1 ha 1464
        mov   eax,[npye]
117 mario79 1465
    mov   [edi + WDATA.box.height],eax
150 diamond 1466
        call    set_window_clientbox
1 ha 1467
 
41 mikedld 1468
    @@: mov     [reposition],cl
1469
 
52 mikedld 1470
        cmp   [reposition],1         ; save new position and size
1471
        jne   no_bounds_save
1 ha 1472
        push  esi edi ecx
1473
        mov   esi,edi
57 mikedld 1474
        mov   ecx,2
1475
        test  [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP or WSTATE_MAXIMIZED
1476
        jnz   @f
1477
        add   ecx,2
1478
    @@: sub   edi,window_data
1 ha 1479
        shr   edi,5
1480
        shl   edi,8
115 poddubny 1481
        add   edi,0x80000+APPDATA.saved_box
1 ha 1482
        cld
1483
        rep   movsd
1484
        pop   ecx edi esi
52 mikedld 1485
      no_bounds_save:
1 ha 1486
 
1487
        pushad                             ; WINDOW SHADE/FULLSCREEN
1488
 
1489
        cmp   [reposition],1
1490
        je    no_window_sizing
1491
        mov   edx,edi
1492
        sub   edx,window_data
1493
        shr   edx,5
1494
        shl   edx,8
1495
        add   edx,0x80000                 ; process base at 0x80000+
1496
 
1497
        cmp   [do_resize],2               ; window shade ?
41 mikedld 1498
        jne   no_window_shade
1 ha 1499
        mov   [reposition],1
1500
 
41 mikedld 1501
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1502
        jnz     wnd_rolldown
1503
  wnd_rollup:
1504
        or      [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1505
        call    get_rolledup_height
1506
        jmp     @f
1507
  wnd_rolldown:
1508
        and     [edi+WDATA.fl_wstate],not WSTATE_ROLLEDUP
117 mario79 1509
    mov     eax,[edx + APPDATA.saved_box.height] ; 0x90+BOX.height
41 mikedld 1510
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1511
        jz      @f
1512
        mov     eax,[screen_workarea.bottom]
1513
        sub     eax,[screen_workarea.top]
114 mikedld 1514
    @@: mov     [edi+WDATA.box.height],eax
150 diamond 1515
        call    set_window_clientbox
1 ha 1516
 
1517
      no_window_shade:
1518
 
1519
        cmp   [do_resize],1               ; fullscreen/restore ?
1520
        jne   no_fullscreen_restore
1521
        cmp   [latest_window_touch_delta],dword 50
1522
        jg    no_fullscreen_restore
1523
        mov   [reposition],1
41 mikedld 1524
        test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1525
        jnz     restore_from_fullscreen
1526
        or      [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
1527
        mov     eax,[screen_workarea.left]
114 mikedld 1528
        mov     [edi+WDATA.box.left],eax
41 mikedld 1529
        sub     eax,[screen_workarea.right]
1530
        neg     eax
114 mikedld 1531
        mov     [edi+WDATA.box.width],eax
41 mikedld 1532
        mov     eax,[screen_workarea.top]
114 mikedld 1533
        mov     [edi+WDATA.box.top],eax
41 mikedld 1534
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1535
        jnz     @f
1536
        sub     eax,[screen_workarea.bottom]
1537
        neg     eax
114 mikedld 1538
        mov     [edi+WDATA.box.height],eax
41 mikedld 1539
    @@:
150 diamond 1540
        jmp     restore_from_fullscreen.clientbox
1 ha 1541
      restore_from_fullscreen:
41 mikedld 1542
        and     [edi+WDATA.fl_wstate],not WSTATE_MAXIMIZED
114 mikedld 1543
        push    [edi+WDATA.box.height]
1 ha 1544
        push  edi                         ; restore
115 poddubny 1545
        lea   esi, [edx + APPDATA.saved_box]
1 ha 1546
        mov   ecx,4
1547
        cld
1548
        rep   movsd
1549
        pop   edi
41 mikedld 1550
        pop     eax
1551
        test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
1552
        jz      @f
114 mikedld 1553
        mov     [edi+WDATA.box.height],eax
41 mikedld 1554
    @@:
150 diamond 1555
    .clientbox:
1556
        call    set_window_clientbox
1 ha 1557
 
1558
      no_fullscreen_restore:
1559
 
115 poddubny 1560
        mov   eax,[edi+WDATA.box.top]                 ; check Y inside screen
1561
        add   eax,[edi+WDATA.box.height]
1 ha 1562
        cmp   eax,[0xfe04]
1563
        jbe   no_window_sizing
115 poddubny 1564
        mov   eax,[edi+WDATA.box.left]                 ; check X inside screen
1565
        add   eax,[edi+WDATA.box.width]
1 ha 1566
        cmp   eax,[0xfe00]
1567
        jbe   no_window_sizing
1568
        mov   eax,[0xfe00]
115 poddubny 1569
        sub   eax,[edi+WDATA.box.width]
1570
        mov   [edi+WDATA.box.left],eax
1 ha 1571
        mov   eax,[0xfe04]
115 poddubny 1572
        sub   eax,[edi+WDATA.box.height]
1573
        mov   [edi+WDATA.box.top],eax
150 diamond 1574
        call  set_window_clientbox
1 ha 1575
      no_window_sizing:
1576
 
1577
        popad
1578
 
1579
        cmp   [reposition],0
1580
        je    retwm
1581
 
1582
        mov   [0xfff5],byte 1 ; no mouse
1583
 
112 poddubny 1584
 
1 ha 1585
        push  eax ebx ecx edx
115 poddubny 1586
        mov   eax,[edi+WDATA.box.left]
1587
        mov   ebx,[edi+WDATA.box.top]
1588
        mov   ecx,[edi+WDATA.box.width]
1589
        mov   edx,[edi+WDATA.box.height]
112 poddubny 1590
        add   ecx,eax
1591
        add   edx,ebx
1592
        call  calculatescreen
1593
 
115 poddubny 1594
        mov   eax,[oldc+BOX.left]
1595
        mov   ebx,[oldc+BOX.top]
1596
        mov   ecx,[oldc+BOX.width]
1597
        mov   edx,[oldc+BOX.height]
1 ha 1598
        add   ecx,eax
1599
        add   edx,ebx
1600
        call  calculatescreen
1601
        pop   edx ecx ebx eax
1602
 
1603
        mov   eax,edi
1604
        call  redrawscreen
1605
 
112 poddubny 1606
 
1607
        mov     [edi+WDATA.fl_redraw],1
1608
 
1 ha 1609
        mov   ecx,100         ; wait to avoid mouse residuals
1610
      waitre2:
1611
        mov   [0xfff5],byte 1
1612
        call  checkidle
41 mikedld 1613
        cmp     [edi+WDATA.fl_redraw],0
1 ha 1614
        jz    retwm
1615
        loop  waitre2
1616
 
1617
      retwm:
1618
 
1619
        mov   [0xfff5],byte 0 ; mouse pointer
1620
        mov   [0xfff4],byte 0 ; no mouse under
1621
        mov   [0xfb44],byte 0 ; react to mouse up/down
1622
 
1623
        mov    esi,window_moved
1624
        call   sys_msg_board_str
1625
 
1626
        popad
1627
 
1628
        ret
1629
 
1630
 
1631
uglobal
1632
  add_window_data            dd  0
1633
  do_resize_from_corner      db  0x0
1634
  reposition                 db  0x0
1635
  latest_window_touch        dd  0x0
1636
  latest_window_touch_delta  dd  0x0
1637
 
1638
  do_resize db 0x0
1639
 
1640
  oldc    dd 0x0,0x0,0x0,0x0
1641
 
1642
  dlx     dd 0x0
1643
  dly     dd 0x0
1644
  dlxe    dd 0x0
1645
  dlye    dd 0x0
1646
 
1647
  npx     dd 0x0
1648
  npy     dd 0x0
1649
  npxe    dd 0x0
1650
  npye    dd 0x0
1651
 
1652
  mpx     dd 0x0
1653
  mpy     dd 0x0
1654
endg
1655
 
1656
 
1657
; draw negative window frames
1658
 
1659
drawwindowframes:
1660
 
1661
        pushad
1662
 
1663
        mov   eax,[npx]
1664
        shl   eax,16
1665
        add   eax,[npx]
1666
        add   eax,[npxe]
1667
        add   eax,65536*1-1
1668
        mov   ebx,[npy]
1669
        shl   ebx,16
1670
        add   ebx,[npy]
1671
        mov   ecx,0x01000000
1672
        push  edi
1673
        mov   edi,1
1674
        call  [draw_line]
1675
        pop   edi
1676
 
1677
        mov   eax,[npx]
1678
        shl   eax,16
1679
        add   eax,[npx]
1680
        add   eax,[npxe]
1681
        add   eax,65536*1-1
1682
        mov   ebx,[npy]
1683
        add   ebx,[npye]
1684
        shl   ebx,16
1685
        add   ebx,[npy]
1686
        add   ebx,[npye]
1687
        mov   ecx,0x01000000
1688
        push  edi
1689
        mov   edi,1
1690
        call  [draw_line]
1691
        pop   edi
1692
 
1693
        mov   eax,[npx]
1694
        shl   eax,16
1695
        add   eax,[npx]
1696
        mov   ebx,[npy]
1697
        shl   ebx,16
1698
        add   ebx,[npy]
1699
        add   ebx,[npye]
1700
        mov   ecx,0x01000000
1701
        push  edi
1702
        mov   edi,1
1703
        call  [draw_line]
1704
        pop   edi
1705
 
1706
        mov   eax,[npx]
1707
        add   eax,[npxe]
1708
        shl   eax,16
1709
        add   eax,[npx]
1710
        add   eax,[npxe]
1711
        mov   ebx,[npy]
1712
        shl   ebx,16
1713
        add   ebx,[npy]
1714
        add   ebx,[npye]
1715
        mov   ecx,0x01000000
1716
        push  edi
1717
        mov   edi,1
1718
        call  [draw_line]
1719
        mov   edi,[0x3000]
1720
        shl   edi,5
1721
        add   edi,window_data
115 poddubny 1722
        mov   [edi+WDATA.fl_wdrawn],byte 1
1 ha 1723
        pop   edi
1724
 
1725
        popad
1726
 
1727
        ret
1728
 
1729
 
1730
 
1731
random_shaped_window:
1732
 
1733
;
1734
;  eax = 0    giving address of data area
1735
;      ebx    address
115 poddubny 1736
;  eax = 1    shape area scale
1 ha 1737
;      ebx    2^ebx scale
1738
 
1739
     test eax, eax
1740
     jne  rsw_no_address
1741
     mov  eax,[0x3000]
1742
     shl  eax,8
1743
 
115 poddubny 1744
     mov  [eax+0x80000+APPDATA.wnd_shape],ebx
1 ha 1745
   rsw_no_address:
1746
 
1747
     cmp  eax,1
1748
     jne  rsw_no_scale
1749
     mov  eax,[0x3000]
1750
     shl  eax,8
115 poddubny 1751
     mov  byte [eax+0x80000+APPDATA.wnd_shape_scale], bl
1 ha 1752
   rsw_no_scale:
1753
 
1754
     ret
1755