Subversion Repositories Kolibri OS

Rev

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