Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1362 mikedld 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
5363 yogev_ezra 3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
1362 mikedld 4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
 
9
$Revision: 5870 $
10
 
11
;==============================================================================
12
;///// public functions ///////////////////////////////////////////////////////
13
;==============================================================================
14
 
1391 mikedld 15
window.BORDER_SIZE = 5
16
 
17
macro FuncTable name, table_name, [label]
1362 mikedld 18
{
19
  common
20
    align 4
1391 mikedld 21
    \label name#.#table_name dword
1362 mikedld 22
  forward
23
    dd name#.#label
24
  common
1391 mikedld 25
    name#.sizeof.#table_name = $ - name#.#table_name
1362 mikedld 26
}
27
 
28
uglobal
4778 Akyltist 29
  common_colours rd 48
1391 mikedld 30
  draw_limits    RECT
1362 mikedld 31
endg
32
 
33
;------------------------------------------------------------------------------
1391 mikedld 34
syscall_draw_window: ;///// system function 0 /////////////////////////////////
35
;------------------------------------------------------------------------------
36
        mov     eax, edx
37
        shr     eax, 24
38
        and     al, 0x0f
39
        cmp     al, 5
40
        jae     .exit
41
 
42
        push    eax
43
        call    window._.sys_set_window
44
        pop     eax
45
 
46
        or      al, al
47
        jnz     @f
48
 
5847 pathoswith 49
; type I - original style
1391 mikedld 50
        call    drawwindow_I
51
        jmp     window._.draw_window_caption.2
2436 mario79 52
;--------------------------------------
53
@@:
2288 clevermous 54
        dec     al
1391 mikedld 55
        jnz     @f
56
 
5847 pathoswith 57
; type II - only reserve area, no draw
2453 mario79 58
        call    __sys_draw_pointer
1391 mikedld 59
        jmp     .exit
2436 mario79 60
;--------------------------------------
61
@@:
2288 clevermous 62
        dec     al
1391 mikedld 63
        jnz     @f
64
 
5847 pathoswith 65
; type III  - new style
1391 mikedld 66
        call    drawwindow_III
67
        jmp     window._.draw_window_caption.2
2436 mario79 68
;--------------------------------------
69
@@:
5847 pathoswith 70
; type IV & V - skinned window (resizable & not)
2288 clevermous 71
        mov     eax, [TASK_COUNT]
1391 mikedld 72
        movzx   eax, word[WIN_POS + eax * 2]
73
        cmp     eax, [CURRENT_TASK]
74
        setz    al
75
        movzx   eax, al
76
        push    eax
77
        call    drawwindow_IV
78
        jmp     window._.draw_window_caption.2
2436 mario79 79
;--------------------------------------
80
.exit:
1391 mikedld 81
        ret
2436 mario79 82
;------------------------------------------------------------------------------
1362 mikedld 83
syscall_display_settings: ;///// system function 48 ///////////////////////////
84
;------------------------------------------------------------------------------
85
;; Redraw screen:
86
;< ebx = 0
87
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
88
;; Set button style:
89
;< ebx = 1
90
;< ecx = 0 (flat) or 1 (with gradient)
91
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
92
;; Set system color palette:
93
;< ebx = 2
94
;< ecx = pointer to color table
95
;< edx = size of color table
96
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
97
;; Get system color palette:
98
;< ebx = 3
99
;< ecx = pointer to color table buffer
100
;< edx = size of color table buffer
101
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
102
;; Get skinned caption height:
103
;< ebx = 4
104
;> eax = height in pixels
105
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
106
;; Get screen working area:
107
;< ebx = 5
108
;> eax = pack[16(left), 16(right)]
109
;> ebx = pack[16(top), 16(bottom)]
110
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
111
;; Set screen working area:
112
;< ebx = 6
113
;< ecx = pack[16(left), 16(right)]
114
;< edx = pack[16(top), 16(bottom)]
115
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
116
;; Get skin margins:
117
;< ebx = 7
118
;> eax = pack[16(left), 16(right)]
119
;> ebx = pack[16(top), 16(bottom)]
120
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
121
;; Set skin:
122
;< ebx = 8
123
;< ecx = pointer to FileInfoBlock struct
124
;> eax = FS error code
5665 Pathoswith 125
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5847 pathoswith 126
;; Get font smoothing:
127
;< ebx = 9
128
;> eax = 0 — off, 1 — on, 2 — subpixel
129
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5665 Pathoswith 130
;; Set font smoothing:
5847 pathoswith 131
;< ebx = 10
132
;< ecx = 0 — off, 1 — on, 2 — subpixel
5867 pathoswith 133
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
134
;; Get font size:
135
;< ebx = 11
136
;> eax = height in pixels
137
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
138
;; Set font size:
139
;< ebx = 12
140
;< ecx = height in pixels
1362 mikedld 141
;------------------------------------------------------------------------------
142
        cmp     ebx, .sizeof.ftable / 4
143
        ja      @f
144
        jmp     [.ftable + ebx * 4]
2436 mario79 145
;------------------------------------------------------------------------------
1362 mikedld 146
syscall_display_settings.00:
147
        xor     eax, eax
148
        inc     ebx
149
        cmp     [windowtypechanged], ebx
5847 pathoswith 150
        jne     @f
1362 mikedld 151
        mov     [windowtypechanged], eax
152
        jmp     syscall_display_settings._.redraw_whole_screen
2436 mario79 153
;------------------------------------------------------------------------------
1362 mikedld 154
syscall_display_settings.01:
155
        and     ecx, 1
156
        cmp     ecx, [buttontype]
5847 pathoswith 157
        je      @f
1362 mikedld 158
        mov     [buttontype], ecx
159
        mov     [windowtypechanged], ebx
5847 pathoswith 160
@@:
1362 mikedld 161
        ret
2436 mario79 162
;------------------------------------------------------------------------------
1362 mikedld 163
syscall_display_settings.02:
164
        dec     ebx
165
        mov     esi, ecx
4796 Akyltist 166
        cmp     edx, 192
167
        jnae    @f
168
        mov     edx, 192 ; max size
5847 pathoswith 169
@@:
1362 mikedld 170
        mov     edi, common_colours
171
        mov     ecx, edx
2288 clevermous 172
        rep movsb
1362 mikedld 173
        mov     [windowtypechanged], ebx
174
        ret
2436 mario79 175
;------------------------------------------------------------------------------
1362 mikedld 176
syscall_display_settings.03:
177
        mov     edi, ecx
4796 Akyltist 178
        cmp     edx, 192
179
        jnae    @f
180
        mov     edx, 192 ; max size
5847 pathoswith 181
@@:
1362 mikedld 182
        mov     esi, common_colours
183
        mov     ecx, edx
2288 clevermous 184
        rep movsb
1362 mikedld 185
        ret
2436 mario79 186
;------------------------------------------------------------------------------
1362 mikedld 187
syscall_display_settings.04:
188
        mov     eax, [_skinh]
189
        mov     [esp + 32], eax
190
        ret
2436 mario79 191
;------------------------------------------------------------------------------
1362 mikedld 192
syscall_display_settings.05:
193
        mov     eax, [screen_workarea.left - 2]
194
        mov     ax, word[screen_workarea.right]
195
        mov     [esp + 32], eax
196
        mov     eax, [screen_workarea.top - 2]
197
        mov     ax, word[screen_workarea.bottom]
198
        mov     [esp + 20], eax
199
        ret
2436 mario79 200
;------------------------------------------------------------------------------
1362 mikedld 201
syscall_display_settings.06:
202
        xor     esi, esi
5350 serge 203
        mov     edi, [_display.width]
204
        dec     edi
1362 mikedld 205
        mov     eax, ecx
206
        movsx   ebx, ax
207
        sar     eax, 16
208
        cmp     eax, ebx
209
        jge     .check_horizontal
210
        inc     esi
211
        or      eax, eax
212
        jge     @f
213
        xor     eax, eax
2436 mario79 214
@@:
2288 clevermous 215
        mov     [screen_workarea.left], eax
1362 mikedld 216
        cmp     ebx, edi
217
        jle     @f
218
        mov     ebx, edi
2436 mario79 219
@@:
2288 clevermous 220
        mov     [screen_workarea.right], ebx
2436 mario79 221
.check_horizontal:
5350 serge 222
        mov     edi, [_display.height]
223
        dec     edi
1362 mikedld 224
        mov     eax, edx
225
        movsx   ebx, ax
226
        sar     eax, 16
227
        cmp     eax, ebx
228
        jge     .check_if_redraw_needed
229
        inc     esi
230
        or      eax, eax
231
        jge     @f
232
        xor     eax, eax
2436 mario79 233
@@:
2288 clevermous 234
        mov     [screen_workarea.top], eax
1362 mikedld 235
        cmp     ebx, edi
236
        jle     @f
237
        mov     ebx, edi
2436 mario79 238
@@:
2288 clevermous 239
        mov     [screen_workarea.bottom], ebx
2436 mario79 240
.check_if_redraw_needed:
1362 mikedld 241
        or      esi, esi
5847 pathoswith 242
        jz      @f
1362 mikedld 243
 
244
        call    repos_windows
245
        jmp     syscall_display_settings._.calculate_whole_screen
2436 mario79 246
;------------------------------------------------------------------------------
1362 mikedld 247
syscall_display_settings.07:
248
        mov     eax, [_skinmargins + 0]
249
        mov     [esp + 32], eax
250
        mov     eax, [_skinmargins + 4]
251
        mov     [esp + 20], eax
5847 pathoswith 252
@@:
1362 mikedld 253
        ret
2436 mario79 254
;------------------------------------------------------------------------------
1362 mikedld 255
syscall_display_settings.08:
256
        mov     ebx, ecx
257
        call    read_skin_file
258
        mov     [esp + 32], eax
259
        test    eax, eax
5847 pathoswith 260
        jnz     @b
1362 mikedld 261
 
262
        call    syscall_display_settings._.calculate_whole_screen
263
        jmp     syscall_display_settings._.redraw_whole_screen
5847 pathoswith 264
;------------------------------------------------------------------------------
265
syscall_display_settings.09:
266
        xor     eax, eax
267
        mov     al, [fontSmoothing]
268
        mov     [esp + 32], eax
1362 mikedld 269
        ret
2436 mario79 270
;------------------------------------------------------------------------------
5847 pathoswith 271
syscall_display_settings.10:
5665 Pathoswith 272
        mov     [fontSmoothing], cl
273
        ret
274
;------------------------------------------------------------------------------
5867 pathoswith 275
syscall_display_settings.11:
276
        xor     eax, eax
277
        mov     al, [fontSize]
278
        mov     [esp + 32], eax
279
        ret
280
;------------------------------------------------------------------------------
281
syscall_display_settings.12:
282
        mov     [fontSize], cl
283
        ret
284
;------------------------------------------------------------------------------
1362 mikedld 285
syscall_display_settings._.calculate_whole_screen:
286
        xor     eax, eax
287
        xor     ebx, ebx
5350 serge 288
        mov     ecx, [_display.width]
289
        mov     edx, [_display.height]
290
        dec     ecx
291
        dec     edx
1362 mikedld 292
        jmp     calculatescreen
2436 mario79 293
;------------------------------------------------------------------------------
1362 mikedld 294
syscall_display_settings._.redraw_whole_screen:
295
        xor     eax, eax
296
        mov     [draw_limits.left], eax
297
        mov     [draw_limits.top], eax
5350 serge 298
        mov     eax, [_display.width]
299
        dec     eax
1362 mikedld 300
        mov     [draw_limits.right], eax
5350 serge 301
        mov     eax, [_display.height]
302
        dec     eax
1362 mikedld 303
        mov     [draw_limits.bottom], eax
304
        mov     eax, window_data
305
        jmp     redrawscreen
2436 mario79 306
;------------------------------------------------------------------------------
1362 mikedld 307
syscall_set_window_shape: ;///// system function 50 ///////////////////////////
308
;------------------------------------------------------------------------------
309
;; Set window shape address:
1369 Lrz 310
;> ebx = 0
311
;> ecx = shape data address
1362 mikedld 312
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
313
;; Set window shape scale:
1369 Lrz 314
;> ebx = 1
315
;> ecx = scale power (resulting scale is 2^ebx)
1362 mikedld 316
;------------------------------------------------------------------------------
317
        mov     edi, [current_slot]
318
 
1369 Lrz 319
        test    ebx, ebx
1362 mikedld 320
        jne     .shape_scale
1369 Lrz 321
        mov     [edi + APPDATA.wnd_shape], ecx
2436 mario79 322
;--------------------------------------
323
align 4
324
.shape_scale:
1369 Lrz 325
        dec     ebx
1362 mikedld 326
        jnz     .exit
1369 Lrz 327
        mov     [edi + APPDATA.wnd_shape_scale], ecx
2436 mario79 328
;--------------------------------------
329
align 4
330
.exit:
1362 mikedld 331
        ret
2436 mario79 332
;------------------------------------------------------------------------------
1362 mikedld 333
align 4
334
;------------------------------------------------------------------------------
1391 mikedld 335
syscall_move_window: ;///// system function 67 ////////////////////////////////
336
;------------------------------------------------------------------------------
337
;? 
338
;------------------------------------------------------------------------------
339
        mov     edi, [CURRENT_TASK]
340
        shl     edi, 5
341
        add     edi, window_data
342
 
1563 diamond 343
        test    [edi + WDATA.fl_wdrawn], 1
344
        jz      .exit
345
 
1391 mikedld 346
        test    [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED
347
        jnz     .exit
348
 
349
        cmp     ebx, -1
350
        jne     @f
351
        mov     ebx, [edi + WDATA.box.left]
2436 mario79 352
;--------------------------------------
353
align 4
354
@@:
2288 clevermous 355
        cmp     ecx, -1
1391 mikedld 356
        jne     @f
357
        mov     ecx, [edi + WDATA.box.top]
2436 mario79 358
;--------------------------------------
359
align 4
360
@@:
2288 clevermous 361
        cmp     edx, -1
1391 mikedld 362
        jne     @f
363
        mov     edx, [edi + WDATA.box.width]
2436 mario79 364
;--------------------------------------
365
align 4
366
@@:
2288 clevermous 367
        cmp     esi, -1
1391 mikedld 368
        jne     @f
369
        mov     esi, [edi + WDATA.box.height]
2436 mario79 370
;--------------------------------------
371
align 4
372
@@:
2288 clevermous 373
        push    esi edx ecx ebx
1391 mikedld 374
        mov     eax, esp
375
        mov     bl, [edi + WDATA.fl_wstate]
3452 mario79 376
;--------------------------------------
377
align 4
378
@@:
379
        cmp     [REDRAW_BACKGROUND], byte 0
380
        jz      @f
381
        call    change_task
382
        jmp     @b
383
;--------------------------------------
384
align 4
385
@@:
1391 mikedld 386
        call    window._.set_window_box
2381 hidnplayr 387
        add     esp, sizeof.BOX
1391 mikedld 388
 
389
        ; NOTE: do we really need this? to be reworked
390
;       mov     byte[DONT_DRAW_MOUSE], 0 ; mouse pointer
391
;       mov     byte[MOUSE_BACKGROUND], 0 ; no mouse under
392
;       mov     byte[MOUSE_DOWN], 0 ; react to mouse up/down
393
 
394
        ; NOTE: do we really need this? to be reworked
395
;       call    [draw_pointer]
2436 mario79 396
;--------------------------------------
397
align 4
398
.exit:
1391 mikedld 399
        ret
2436 mario79 400
;------------------------------------------------------------------------------
1391 mikedld 401
align 4
402
;------------------------------------------------------------------------------
403
syscall_window_settings: ;///// system function 71 /////////////////////////////
404
;------------------------------------------------------------------------------
405
;? 
406
;------------------------------------------------------------------------------
407
        dec     ebx     ; subfunction #1 - set window caption
408
        jnz     .exit_fail
409
 
410
        ; NOTE: only window owner thread can set its caption,
411
        ;       so there's no parameter for PID/TID
412
 
413
        mov     edi, [CURRENT_TASK]
414
        shl     edi, 5
415
 
416
        mov     [edi * 8 + SLOT_BASE + APPDATA.wnd_caption], ecx
417
        or      [edi + window_data + WDATA.fl_wstyle], WSTYLE_HASCAPTION
418
 
419
        call    window._.draw_window_caption
420
 
421
        xor     eax, eax ; eax = 0 (success)
422
        ret
423
 
424
;  .get_window_caption:
425
;        dec     eax     ; subfunction #2 - get window caption
426
;        jnz     .exit_fail
427
 
428
        ; not implemented yet
2436 mario79 429
;--------------------------------------
430
align 4
431
.exit_fail:
1391 mikedld 432
        xor     eax, eax
433
        inc     eax     ; eax = 1 (fail)
434
        ret
2436 mario79 435
;------------------------------------------------------------------------------
1391 mikedld 436
align 4
437
;------------------------------------------------------------------------------
1362 mikedld 438
set_window_defaults: ;/////////////////////////////////////////////////////////
439
;------------------------------------------------------------------------------
440
;? 
441
;------------------------------------------------------------------------------
1540 diamond 442
        mov     byte [window_data + 0x20 + WDATA.cl_titlebar + 3], 1 ; desktop is not movable
1362 mikedld 443
        push    eax ecx
444
        xor     eax, eax
445
        mov     ecx, WIN_STACK
2436 mario79 446
;--------------------------------------
447
align 4
448
@@:
2288 clevermous 449
        inc     eax
1362 mikedld 450
        add     ecx, 2
451
        ; process no
452
        mov     [ecx + 0x000], ax
453
        ; positions in stack
454
        mov     [ecx + 0x400], ax
455
        cmp     ecx, WIN_POS - 2
456
        jne     @b
457
        pop     ecx eax
458
        ret
2436 mario79 459
;------------------------------------------------------------------------------
5865 GerdtR 460
 
1362 mikedld 461
align 4
462
;------------------------------------------------------------------------------
463
calculatescreen: ;/////////////////////////////////////////////////////////////
464
;------------------------------------------------------------------------------
465
;? Scan all windows from bottom to top, calling `setscreen` for each one
466
;? intersecting given screen area
467
;------------------------------------------------------------------------------
468
;> eax = left
469
;> ebx = top
470
;> ecx = right
471
;> edx = bottom
472
;------------------------------------------------------------------------------
473
        push    esi
474
        pushfd
475
        cli
476
 
477
        mov     esi, 1
478
        call    window._.set_screen
479
 
480
        push    ebp
481
 
482
        mov     ebp, [TASK_COUNT]
483
        cmp     ebp, 1
484
        jbe     .exit
485
 
5836 GerdtR 486
        push    eax ;for num layout
487
 
1362 mikedld 488
        push    edx ecx ebx eax
5836 GerdtR 489
 
5865 GerdtR 490
        mov     dword[esp+10h], ZPOS_DESKTOP
2436 mario79 491
;--------------------------------------
492
align 4
5836 GerdtR 493
.layout:
494
        mov     esi, 1          ; = num in window stack
495
        mov     ebp, [TASK_COUNT]
496
;--------------------------------------
497
align 4
2436 mario79 498
.next_window:
1362 mikedld 499
        movzx   edi, word[WIN_POS + esi * 2]
5836 GerdtR 500
        shl     edi, 5                  ;size of TASKDATA and WDATA = 32 bytes
1362 mikedld 501
 
502
        cmp     [CURRENT_TASK + edi + TASKDATA.state], TSTATE_FREE
503
        je      .skip_window
504
 
505
        add     edi, window_data
506
        test    [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
507
        jnz     .skip_window
508
 
5865 GerdtR 509
        mov     eax, [esp+10h]
5836 GerdtR 510
        cmp     [edi + WDATA.z_modif], al
511
        jne     .skip_window
512
 
1362 mikedld 513
        mov     eax, [edi + WDATA.box.left]
514
        cmp     eax, [esp + RECT.right]
1368 mikedld 515
        jg      .skip_window
1362 mikedld 516
        mov     ebx, [edi + WDATA.box.top]
517
        cmp     ebx, [esp + RECT.bottom]
1368 mikedld 518
        jg      .skip_window
1362 mikedld 519
        mov     ecx, [edi + WDATA.box.width]
520
        add     ecx, eax
521
        cmp     ecx, [esp + RECT.left]
1368 mikedld 522
        jl      .skip_window
1362 mikedld 523
        mov     edx, [edi + WDATA.box.height]
524
        add     edx, ebx
525
        cmp     edx, [esp + RECT.top]
1368 mikedld 526
        jl      .skip_window
1362 mikedld 527
 
528
        cmp     eax, [esp + RECT.left]
529
        jae     @f
530
        mov     eax, [esp + RECT.left]
2436 mario79 531
;--------------------------------------
532
align 4
533
@@:
2288 clevermous 534
        cmp     ebx, [esp + RECT.top]
1362 mikedld 535
        jae     @f
536
        mov     ebx, [esp + RECT.top]
2436 mario79 537
;--------------------------------------
538
align 4
539
@@:
2288 clevermous 540
        cmp     ecx, [esp + RECT.right]
1362 mikedld 541
        jbe     @f
542
        mov     ecx, [esp + RECT.right]
2436 mario79 543
;--------------------------------------
544
align 4
545
@@:
2288 clevermous 546
        cmp     edx, [esp + RECT.bottom]
1362 mikedld 547
        jbe     @f
548
        mov     edx, [esp + RECT.bottom]
2436 mario79 549
;--------------------------------------
550
align 4
551
@@:
2288 clevermous 552
        push    esi
1362 mikedld 553
        movzx   esi, word[WIN_POS + esi * 2]
554
        call    window._.set_screen
555
        pop     esi
2436 mario79 556
;--------------------------------------
557
align 4
558
.skip_window:
1362 mikedld 559
        inc     esi
560
        dec     ebp
561
        jnz     .next_window
5836 GerdtR 562
;---------------------------------------------
5865 GerdtR 563
        inc     dword[esp+10h]
564
        cmp     dword[esp+10h], ZPOS_ALWAYS_TOP
565
        jle     .layout
5836 GerdtR 566
;---------------------------------------------
567
        mov     esi, [TASK_COUNT]
568
        movzx   edi, word[WIN_POS + esi * 2]
569
        shl     edi, 5
570
        add     edi, window_data
1362 mikedld 571
 
572
        pop     eax ebx ecx edx
5836 GerdtR 573
        pop     ebp     ;del num layout
2436 mario79 574
;--------------------------------------
575
align 4
576
.exit:
1362 mikedld 577
        pop     ebp
2443 Serge 578
        inc     [_display.mask_seqno]
1362 mikedld 579
        popfd
580
        pop     esi
581
        ret
2436 mario79 582
;------------------------------------------------------------------------------
1362 mikedld 583
align 4
584
;------------------------------------------------------------------------------
585
repos_windows: ;///////////////////////////////////////////////////////////////
586
;------------------------------------------------------------------------------
587
;? 
588
;------------------------------------------------------------------------------
589
        mov     ecx, [TASK_COUNT]
2381 hidnplayr 590
        mov     edi, window_data + sizeof.WDATA * 2
1362 mikedld 591
        call    force_redraw_background
592
        dec     ecx
593
        jle     .exit
2436 mario79 594
;--------------------------------------
595
align 4
596
.next_window:
1362 mikedld 597
        mov     [edi + WDATA.fl_redraw], 1
598
        test    [edi + WDATA.fl_wstate], WSTATE_MAXIMIZED
599
        jnz     .fix_maximized
600
 
601
        mov     eax, [edi + WDATA.box.left]
602
        add     eax, [edi + WDATA.box.width]
5350 serge 603
        mov     ebx, [_display.width]
1362 mikedld 604
        cmp     eax, ebx
5350 serge 605
        jl      .fix_vertical
1362 mikedld 606
        mov     eax, [edi + WDATA.box.width]
607
        sub     eax, ebx
5350 serge 608
        jl      @f
1362 mikedld 609
        mov     [edi + WDATA.box.width], ebx
2436 mario79 610
;--------------------------------------
611
align 4
612
@@:
2288 clevermous 613
        sub     ebx, [edi + WDATA.box.width]
1362 mikedld 614
        mov     [edi + WDATA.box.left], ebx
2436 mario79 615
;--------------------------------------
616
align 4
617
.fix_vertical:
1362 mikedld 618
        mov     eax, [edi + WDATA.box.top]
619
        add     eax, [edi + WDATA.box.height]
5350 serge 620
        mov     ebx, [_display.height]
1362 mikedld 621
        cmp     eax, ebx
5350 serge 622
        jl      .fix_client_box
1362 mikedld 623
        mov     eax, [edi + WDATA.box.height]
624
        sub     eax, ebx
5350 serge 625
        jl      @f
1362 mikedld 626
        mov     [edi + WDATA.box.height], ebx
2436 mario79 627
;--------------------------------------
628
align 4
629
@@:
2288 clevermous 630
        sub     ebx, [edi + WDATA.box.height]
1362 mikedld 631
        mov     [edi + WDATA.box.top], ebx
2436 mario79 632
;--------------------------------------
633
align 4
634
.fix_client_box:
635
        call    window._.set_window_clientbox
636
        add     edi, sizeof.WDATA
637
        loop    .next_window
638
;--------------------------------------
639
align 4
640
.exit:
641
        ret
642
;--------------------------------------
643
align 4
644
.fix_maximized:
1362 mikedld 645
        mov     eax, [screen_workarea.left]
646
        mov     [edi + WDATA.box.left], eax
647
        sub     eax, [screen_workarea.right]
648
        neg     eax
649
        mov     [edi + WDATA.box.width], eax
650
        mov     eax, [screen_workarea.top]
651
        mov     [edi + WDATA.box.top], eax
652
        test    [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP
653
        jnz     .fix_client_box
654
        sub     eax, [screen_workarea.bottom]
655
        neg     eax
656
        mov     [edi + WDATA.box.height], eax
2436 mario79 657
        jmp     .fix_client_box
1362 mikedld 658
;------------------------------------------------------------------------------
2436 mario79 659
;align 4
1362 mikedld 660
;------------------------------------------------------------------------------
2436 mario79 661
;sys_window_mouse: ;////////////////////////////////////////////////////////////
662
;------------------------------------------------------------------------------
1362 mikedld 663
;? 
664
;------------------------------------------------------------------------------
1391 mikedld 665
        ; NOTE: commented out since doesn't provide necessary functionality
666
        ;       anyway, to be reworked
667
;       push    eax
668
;
669
;       mov     eax, [timer_ticks]
670
;       cmp     [new_window_starting], eax
671
;       jb      .exit
672
;
673
;       mov     byte[MOUSE_BACKGROUND], 0
674
;       mov     byte[DONT_DRAW_MOUSE], 0
675
;
676
;       mov     [new_window_starting], eax
677
;
678
; .exit:
679
;       pop     eax
2436 mario79 680
;        ret
681
;------------------------------------------------------------------------------
1362 mikedld 682
align 4
683
;------------------------------------------------------------------------------
684
draw_rectangle: ;//////////////////////////////////////////////////////////////
685
;------------------------------------------------------------------------------
686
;> eax = pack[16(left), 16(right)]
687
;> ebx = pack[16(top), 16(bottom)]
688
;> esi = color
2423 mario79 689
;       ?? RR GG BB    ; 0x01000000 negation
690
;                      ; 0x02000000 used for draw_rectangle without top line
691
;                      ;           for example drawwindow_III and drawwindow_IV
1362 mikedld 692
;------------------------------------------------------------------------------
693
        push    eax ebx ecx edi
694
 
695
        xor     edi, edi
2436 mario79 696
;--------------------------------------
697
align 4
698
.flags_set:
1362 mikedld 699
        push    ebx
700
 
701
        ; set line color
702
        mov     ecx, esi
703
        ; draw top border
704
        rol     ebx, 16
705
        push    ebx
706
        rol     ebx, 16
707
        pop     bx
2423 mario79 708
        test    ecx, 1 shl 25
709
        jnz     @f
710
        sub     ecx, 1 shl 25
2453 mario79 711
;        call    [draw_line]
712
        call    __sys_draw_line
2436 mario79 713
;--------------------------------------
714
align 4
2423 mario79 715
@@:
1362 mikedld 716
        ; draw bottom border
717
        mov     ebx, [esp - 2]
718
        pop     bx
2453 mario79 719
;        call    [draw_line]
720
        call    __sys_draw_line
1362 mikedld 721
 
722
        pop     ebx
723
        add     ebx, 1 * 65536 - 1
724
 
725
        ; draw left border
726
        rol     eax, 16
727
        push    eax
728
        rol     eax, 16
729
        pop     ax
2453 mario79 730
;        call    [draw_line]
731
        call    __sys_draw_line
1362 mikedld 732
 
733
        ; draw right border
734
        mov     eax, [esp - 2]
735
        pop     ax
2453 mario79 736
;        call    [draw_line]
737
        call    __sys_draw_line
1362 mikedld 738
 
739
        pop     edi ecx ebx eax
740
        ret
2436 mario79 741
;--------------------------------------
742
align 4
743
.forced:
1362 mikedld 744
        push    eax ebx ecx edi
745
        xor     edi, edi
746
        inc     edi
747
        jmp     .flags_set
2436 mario79 748
;------------------------------------------------------------------------------
1362 mikedld 749
align 4
750
;------------------------------------------------------------------------------
751
drawwindow_I_caption: ;////////////////////////////////////////////////////////
752
;------------------------------------------------------------------------------
753
;? 
754
;------------------------------------------------------------------------------
755
        push    [edx + WDATA.cl_titlebar]
756
        mov     esi, edx
757
 
758
        mov     edx, [esi + WDATA.box.top]
759
        mov     eax, edx
760
        lea     ebx, [edx + 21]
761
        inc     edx
762
        add     eax, [esi + WDATA.box.height]
763
 
764
        cmp     ebx, eax
765
        jbe     @f
766
        mov     ebx, eax
2436 mario79 767
;--------------------------------------
768
align 4
769
@@:
2288 clevermous 770
        push    ebx
1362 mikedld 771
 
772
        xor     edi, edi
2436 mario79 773
;--------------------------------------
774
align 4
775
.next_line:
1362 mikedld 776
        mov     ebx, edx
777
        shl     ebx, 16
778
        add     ebx, edx
779
        mov     eax, [esi + WDATA.box.left]
780
        inc     eax
781
        shl     eax, 16
782
        add     eax, [esi + WDATA.box.left]
783
        add     eax, [esi + WDATA.box.width]
784
        dec     eax
785
        mov     ecx, [esi + WDATA.cl_titlebar]
786
        test    ecx, 0x80000000
787
        jz      @f
788
        sub     ecx, 0x00040404
789
        mov     [esi + WDATA.cl_titlebar], ecx
2436 mario79 790
;--------------------------------------
791
align 4
792
@@:
2288 clevermous 793
        and     ecx, 0x00ffffff
2453 mario79 794
;        call    [draw_line]
795
        call    __sys_draw_line
1362 mikedld 796
        inc     edx
797
        cmp     edx, [esp]
798
        jb      .next_line
799
 
800
        add     esp, 4
801
        pop     [esi + WDATA.cl_titlebar]
802
        ret
2436 mario79 803
;------------------------------------------------------------------------------
1362 mikedld 804
align 4
805
;------------------------------------------------------------------------------
806
drawwindow_I: ;////////////////////////////////////////////////////////////////
807
;------------------------------------------------------------------------------
808
;? 
809
;------------------------------------------------------------------------------
810
        pushad
811
 
812
        ; window border
813
 
814
        mov     eax, [edx + WDATA.box.left - 2]
815
        mov     ax, word[edx + WDATA.box.left]
816
        add     ax, word[edx + WDATA.box.width]
817
        mov     ebx, [edx + WDATA.box.top - 2]
818
        mov     bx, word[edx + WDATA.box.top]
819
        add     bx, word[edx + WDATA.box.height]
820
 
821
        mov     esi, [edx + WDATA.cl_frames]
822
        call    draw_rectangle
823
 
824
        ; window caption
825
 
826
        call    drawwindow_I_caption
827
 
828
        ; window client area
829
 
830
        ; do we need to draw it?
831
        mov     edi, [esi + WDATA.cl_workarea]
832
        test    edi, 0x40000000
833
        jnz     .exit
834
 
835
        ; does client area have a positive size on screen?
4572 clevermous 836
        cmp     [esi + WDATA.box.height], 21
837
        jle     .exit
1362 mikedld 838
 
839
        ; okay, let's draw it
840
        mov     eax, 1
841
        mov     ebx, 21
842
        mov     ecx, [esi + WDATA.box.width]
843
        mov     edx, [esi + WDATA.box.height]
2453 mario79 844
;        call    [drawbar]
845
        call    vesa20_drawbar
2436 mario79 846
;--------------------------------------
847
align 4
848
.exit:
1362 mikedld 849
        popad
850
        ret
2436 mario79 851
;------------------------------------------------------------------------------
1362 mikedld 852
align 4
853
;------------------------------------------------------------------------------
854
drawwindow_III_caption: ;/////////////////////////////////////////////////////
855
;------------------------------------------------------------------------------
856
;? 
857
;------------------------------------------------------------------------------
858
        mov     ecx, [edx + WDATA.cl_titlebar]
859
        push    ecx
860
        mov     esi, edx
861
        mov     edx, [esi + WDATA.box.top]
862
        add     edx, 4
863
        mov     ebx, [esi + WDATA.box.top]
864
        add     ebx, 20
865
        mov     eax, [esi + WDATA.box.top]
866
        add     eax, [esi + WDATA.box.height]
867
 
868
        cmp     ebx, eax
869
        jb      @f
870
        mov     ebx, eax
2436 mario79 871
;--------------------------------------
872
align 4
873
@@:
2288 clevermous 874
        push    ebx
1362 mikedld 875
 
876
        xor     edi, edi
2436 mario79 877
;--------------------------------------
878
align 4
879
.next_line:
1362 mikedld 880
        mov     ebx, edx
881
        shl     ebx, 16
882
        add     ebx, edx
883
        mov     eax, [esi + WDATA.box.left]
884
        shl     eax, 16
885
        add     eax, [esi + WDATA.box.left]
886
        add     eax, [esi + WDATA.box.width]
887
        add     eax, 4 * 65536 - 4
888
        mov     ecx, [esi + WDATA.cl_titlebar]
889
        test    ecx, 0x40000000
890
        jz      @f
891
        add     ecx, 0x00040404
2436 mario79 892
;--------------------------------------
893
align 4
894
@@:
2288 clevermous 895
        test    ecx, 0x80000000
1362 mikedld 896
        jz      @f
897
        sub     ecx, 0x00040404
2436 mario79 898
;--------------------------------------
899
align 4
900
@@:
2288 clevermous 901
        mov     [esi + WDATA.cl_titlebar], ecx
1362 mikedld 902
        and     ecx, 0x00ffffff
2453 mario79 903
;        call    [draw_line]
904
        call    __sys_draw_line
1362 mikedld 905
        inc     edx
906
        cmp     edx, [esp]
907
        jb      .next_line
908
 
909
        add     esp, 4
910
        pop     [esi + WDATA.cl_titlebar]
911
        ret
2436 mario79 912
;------------------------------------------------------------------------------
1362 mikedld 913
align 4
914
;------------------------------------------------------------------------------
915
drawwindow_III: ;//////////////////////////////////////////////////////////////
916
;------------------------------------------------------------------------------
917
;? 
918
;------------------------------------------------------------------------------
919
        pushad
920
 
921
        ; window border
922
 
923
        mov     eax, [edx + WDATA.box.left - 2]
924
        mov     ax, word[edx + WDATA.box.left]
925
        add     ax, word[edx + WDATA.box.width]
926
        mov     ebx, [edx + WDATA.box.top - 2]
927
        mov     bx, word[edx + WDATA.box.top]
928
        add     bx, word[edx + WDATA.box.height]
929
 
930
        mov     esi, [edx + WDATA.cl_frames]
931
        shr     esi, 1
932
        and     esi, 0x007f7f7f
933
        call    draw_rectangle
934
 
935
        push    esi
936
        mov     ecx, 3
937
        mov     esi, [edx + WDATA.cl_frames]
2436 mario79 938
;--------------------------------------
939
align 4
940
.next_frame:
1362 mikedld 941
        add     eax, 1 * 65536 - 1
2458 mario79 942
        add     ebx, 1 * 65536 - 1
1362 mikedld 943
        call    draw_rectangle
944
        dec     ecx
945
        jnz     .next_frame
946
 
947
        pop     esi
948
        add     eax, 1 * 65536 - 1
2458 mario79 949
        add     ebx, 1 * 65536 - 1
1362 mikedld 950
        call    draw_rectangle
951
 
952
        ; window caption
953
 
954
        call    drawwindow_III_caption
955
 
956
        ; window client area
957
 
958
        ; do we need to draw it?
959
        mov     edi, [esi + WDATA.cl_workarea]
960
        test    edi, 0x40000000
961
        jnz     .exit
962
 
963
        ; does client area have a positive size on screen?
964
        mov     edx, [esi + WDATA.box.top]
965
        add     edx, 21 + 5
966
        mov     ebx, [esi + WDATA.box.top]
967
        add     ebx, [esi + WDATA.box.height]
968
        cmp     edx, ebx
969
        jg      .exit
970
 
971
        ; okay, let's draw it
972
        mov     eax, 5
973
        mov     ebx, 20
974
        mov     ecx, [esi + WDATA.box.width]
975
        mov     edx, [esi + WDATA.box.height]
976
        sub     ecx, 4
977
        sub     edx, 4
2453 mario79 978
;        call    [drawbar]
979
        call    vesa20_drawbar
2436 mario79 980
;--------------------------------------
981
align 4
982
.exit:
1362 mikedld 983
        popad
984
        ret
2436 mario79 985
;------------------------------------------------------------------------------
1362 mikedld 986
align 4
987
;------------------------------------------------------------------------------
988
waredraw: ;////////////////////////////////////////////////////////////////////
989
;------------------------------------------------------------------------------
990
;? Activate window, redrawing if necessary
991
;------------------------------------------------------------------------------
1465 mario79 992
        push    -1
1391 mikedld 993
        mov     eax, [TASK_COUNT]
994
        lea     eax, [WIN_POS + eax * 2]
995
        cmp     eax, esi
1465 mario79 996
        pop     eax
1391 mikedld 997
        je      .exit
998
 
1362 mikedld 999
        ; is it overlapped by another window now?
1000
        push    ecx
1001
        call    window._.check_window_draw
1002
        test    ecx, ecx
1003
        pop     ecx
1004
        jz      .do_not_draw
1005
 
1006
        ; yes it is, activate and update screen buffer
1007
        call    window._.window_activate
1008
 
1009
        pushad
1010
        mov     edi, [TASK_COUNT]
1011
        movzx   esi, word[WIN_POS + edi * 2]
1012
        shl     esi, 5
1013
        add     esi, window_data
1014
 
1015
        mov     eax, [esi + WDATA.box.left]
1016
        mov     ebx, [esi + WDATA.box.top]
1017
        mov     ecx, [esi + WDATA.box.width]
1018
        mov     edx, [esi + WDATA.box.height]
1019
 
1020
        add     ecx, eax
1021
        add     edx, ebx
1022
 
1023
        mov     edi, [TASK_COUNT]
1024
        movzx   esi, word[WIN_POS + edi * 2]
1025
        call    window._.set_screen
5836 GerdtR 1026
 
5865 GerdtR 1027
        call    window._.set_top_wnd
5836 GerdtR 1028
 
2443 Serge 1029
        inc     [_display.mask_seqno]
1362 mikedld 1030
        popad
1031
 
1032
        ; tell application to redraw itself
1033
        mov     [edi + WDATA.fl_redraw], 1
1391 mikedld 1034
        xor     eax, eax
1035
        jmp     .exit
2436 mario79 1036
;--------------------------------------
1037
align 4
1038
.do_not_draw:
1362 mikedld 1039
        ; no it's not, just activate the window
1040
        call    window._.window_activate
1391 mikedld 1041
        xor     eax, eax
3576 Serge 1042
        ret
1043
 
2436 mario79 1044
;--------------------------------------
1045
align 4
1046
.exit:
1391 mikedld 1047
        inc     eax
1362 mikedld 1048
        ret
2436 mario79 1049
;------------------------------------------------------------------------------
1362 mikedld 1050
align 4
1051
;------------------------------------------------------------------------------
2648 mario79 1052
minimize_all_window:
1053
        push    ebx ecx edx esi edi
1054
        pushfd
1055
        cli
1056
        xor     edx, edx
1057
        mov     eax, 2  ; we do not minimize the kernel thread N1
1058
        mov     ebx, [TASK_COUNT]
1059
;--------------------------------------
1060
align 4
1061
.loop:
1062
        movzx   edi, word[WIN_POS + eax * 2]
1063
        shl     edi, 5
1064
; it is a unused slot?
1065
        cmp     dword [edi+CURRENT_TASK+TASKDATA.state], 9
1066
        je      @f
1067
; it is a hidden thread?
1068
        lea     esi, [edi*8+SLOT_BASE+APPDATA.app_name]
1069
        cmp     [esi], byte '@'
1070
        je      @f
1071
; is it already minimized?
1072
        test    [edi + window_data+WDATA.fl_wstate], WSTATE_MINIMIZED
1073
        jnz     @f
1074
; no it's not, let's do that
1075
        or      [edi + window_data+WDATA.fl_wstate], WSTATE_MINIMIZED
1076
        inc     edx
1077
;--------------------------------------
1078
align 4
1079
@@:
1080
        inc     eax
1081
        cmp     eax, ebx
1082
        jbe     .loop
1083
; If nothing has changed
1084
        test    edx, edx
1085
        jz      @f
1086
 
1087
        push    edx
1088
        call    syscall_display_settings._.calculate_whole_screen
1089
        call    syscall_display_settings._.redraw_whole_screen
1090
        pop     edx
1091
;--------------------------------------
1092
align 4
1093
@@:
1094
        mov     eax, edx
1095
        popfd
1096
        pop     edi esi edx ecx ebx
1097
        ret
1098
;------------------------------------------------------------------------------
1099
align 4
1100
;------------------------------------------------------------------------------
1362 mikedld 1101
minimize_window: ;/////////////////////////////////////////////////////////////
1102
;------------------------------------------------------------------------------
1103
;> eax = window number on screen
1104
;------------------------------------------------------------------------------
1105
;# corrupts [dl*]
1106
;------------------------------------------------------------------------------
1107
        push    edi
1108
        pushfd
1109
        cli
1110
 
1111
        ; is it already minimized?
1112
        movzx   edi, word[WIN_POS + eax * 2]
1113
        shl     edi, 5
1114
        add     edi, window_data
1115
        test    [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
1116
        jnz     .exit
1117
 
1118
        push    eax ebx ecx edx esi
1119
 
1120
        ; no it's not, let's do that
1121
        or      [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
2620 mario79 1122
; If the window width is 0, then the action is not needed.
1123
        cmp     [edi + WDATA.box.width], dword 0
1124
        je      @f
1125
; If the window height is 0, then the action is not needed.
1126
        cmp     [edi + WDATA.box.height], dword 0
1127
        je      @f
1128
 
1362 mikedld 1129
        mov     eax, [edi + WDATA.box.left]
1130
        mov     [draw_limits.left], eax
1131
        mov     ecx, eax
1132
        add     ecx, [edi + WDATA.box.width]
1133
        mov     [draw_limits.right], ecx
1134
        mov     ebx, [edi + WDATA.box.top]
1135
        mov     [draw_limits.top], ebx
1136
        mov     edx, ebx
1137
        add     edx, [edi + WDATA.box.height]
1138
        mov     [draw_limits.bottom], edx
2620 mario79 1139
 
1140
;        DEBUGF  1, "K : minimize_window\n"
1141
;        DEBUGF  1, "K : dl_left %x\n",[draw_limits.left]
1142
;        DEBUGF  1, "K : dl_right %x\n",[draw_limits.right]
1143
;        DEBUGF  1, "K : dl_top %x\n",[draw_limits.top]
1144
;        DEBUGF  1, "K : dl_bottom %x\n",[draw_limits.bottom]
1362 mikedld 1145
        call    calculatescreen
2620 mario79 1146
;        xor     esi, esi
1147
;        xor     eax, eax
1148
        mov     eax, edi
1362 mikedld 1149
        call    redrawscreen
2620 mario79 1150
;--------------------------------------
1151
align 4
1152
@@:
1362 mikedld 1153
        pop     esi edx ecx ebx eax
2436 mario79 1154
;--------------------------------------
1155
align 4
1156
.exit:
1362 mikedld 1157
        popfd
1158
        pop     edi
1159
        ret
2436 mario79 1160
;------------------------------------------------------------------------------
1362 mikedld 1161
align 4
1162
;------------------------------------------------------------------------------
1163
restore_minimized_window: ;////////////////////////////////////////////////////
1164
;------------------------------------------------------------------------------
1165
;> eax = window number on screen
1166
;------------------------------------------------------------------------------
1167
;# corrupts [dl*]
1168
;------------------------------------------------------------------------------
1169
        pushad
1170
        pushfd
1171
        cli
1172
 
1173
        ; is it already restored?
1174
        movzx   esi, word[WIN_POS + eax * 2]
1175
        mov     edi, esi
1176
        shl     edi, 5
1177
        add     edi, window_data
1178
        test    [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
1179
        jz      .exit
1180
 
1181
        ; no it's not, let's do that
1182
        mov     [edi + WDATA.fl_redraw], 1
1183
        and     [edi + WDATA.fl_wstate], not WSTATE_MINIMIZED
1184
        mov     ebp, window._.set_screen
1185
        cmp     eax, [TASK_COUNT]
1186
        jz      @f
1187
        mov     ebp, calculatescreen
2436 mario79 1188
;--------------------------------------
1189
align 4
1190
@@:
2288 clevermous 1191
        mov     eax, [edi + WDATA.box.left]
1362 mikedld 1192
        mov     ebx, [edi + WDATA.box.top]
1193
        mov     ecx, [edi + WDATA.box.width]
1194
        mov     edx, [edi + WDATA.box.height]
1195
        add     ecx, eax
1196
        add     edx, ebx
1197
        call    ebp
5836 GerdtR 1198
 
1199
        cmp     ebp, window._.set_screen
1200
        jne     @f
1201
        call    window._.set_top_wnd
1202
    @@:
2443 Serge 1203
        inc     [_display.mask_seqno]
2436 mario79 1204
;--------------------------------------
1205
align 4
1206
.exit:
1362 mikedld 1207
        popfd
1208
        popad
1209
        ret
2436 mario79 1210
;------------------------------------------------------------------------------
1362 mikedld 1211
align 4
1391 mikedld 1212
; TODO: remove this proc
1362 mikedld 1213
;------------------------------------------------------------------------------
1391 mikedld 1214
window_check_events: ;/////////////////////////////////////////////////////////
1362 mikedld 1215
;------------------------------------------------------------------------------
1391 mikedld 1216
;? 
1362 mikedld 1217
;------------------------------------------------------------------------------
1218
        ; do we have window minimize/restore request?
1219
        cmp     [window_minimize], 0
1391 mikedld 1220
        je      .exit
1362 mikedld 1221
 
1222
        ; okay, minimize or restore top-most window and exit
1223
        mov     eax, [TASK_COUNT]
1224
        mov     bl, 0
1225
        xchg    [window_minimize], bl
1226
        dec     bl
1227
        jnz     @f
1228
        call    minimize_window
1391 mikedld 1229
        jmp     .exit
2436 mario79 1230
;--------------------------------------
1231
align 4
1232
@@:
2288 clevermous 1233
        call    restore_minimized_window
2436 mario79 1234
;--------------------------------------
1235
align 4
1236
.exit:
1391 mikedld 1237
        ret
2436 mario79 1238
;------------------------------------------------------------------------------
1391 mikedld 1239
align 4
1240
;------------------------------------------------------------------------------
1241
sys_window_maximize_handler: ;/////////////////////////////////////////////////
1242
;------------------------------------------------------------------------------
1243
;? 
1244
;------------------------------------------------------------------------------
1245
;> esi = process slot
1246
;------------------------------------------------------------------------------
1247
        mov     edi, esi
1248
        shl     edi, 5
1249
        add     edi, window_data
1362 mikedld 1250
 
1391 mikedld 1251
        ; can window change its height?
1526 diamond 1252
        ; only types 2 and 3 can be resized
1391 mikedld 1253
        mov     dl, [edi + WDATA.fl_wstyle]
1526 diamond 1254
        test    dl, 2
1255
        jz      .exit
1362 mikedld 1256
 
1391 mikedld 1257
        ; toggle normal/maximized window state
1258
        mov     bl, [edi + WDATA.fl_wstate]
1259
        xor     bl, WSTATE_MAXIMIZED
1362 mikedld 1260
 
1391 mikedld 1261
        ; calculate and set appropriate window bounds
1262
        test    bl, WSTATE_MAXIMIZED
1263
        jz      .restore_size
1362 mikedld 1264
 
1391 mikedld 1265
        mov     eax, [screen_workarea.left]
1266
        mov     ecx, [screen_workarea.top]
1267
        push    [screen_workarea.bottom] \
1268
                [screen_workarea.right] \
1269
                ecx \
1270
                eax
1271
        sub     [esp + BOX.width], eax
1272
        sub     [esp + BOX.height], ecx
1273
        mov     eax, esp
1274
        jmp     .set_box
2436 mario79 1275
;--------------------------------------
1276
align 4
1277
.restore_size:
1391 mikedld 1278
        mov     eax, esi
1279
        shl     eax, 8
1280
        add     eax, SLOT_BASE + APPDATA.saved_box
1281
        push    [eax + BOX.height] \
1282
                [eax + BOX.width] \
1283
                [eax + BOX.top] \
1284
                [eax + BOX.left]
1285
        mov     eax, esp
2436 mario79 1286
;--------------------------------------
1287
align 4
1288
.set_box:
1391 mikedld 1289
        test    bl, WSTATE_ROLLEDUP
1290
        jz      @f
1362 mikedld 1291
 
1391 mikedld 1292
        xchg    eax, ecx
1293
        call    window._.get_rolledup_height
1294
        mov     [ecx + BOX.height], eax
1295
        xchg    eax, ecx
2436 mario79 1296
;--------------------------------------
1297
align 4
1298
@@:
2288 clevermous 1299
        call    window._.set_window_box
2381 hidnplayr 1300
        add     esp, sizeof.BOX
2436 mario79 1301
;--------------------------------------
1302
align 4
1303
.exit:
2443 Serge 1304
        inc     [_display.mask_seqno]
1391 mikedld 1305
        ret
2436 mario79 1306
;------------------------------------------------------------------------------
1391 mikedld 1307
align 4
1308
;------------------------------------------------------------------------------
1309
sys_window_rollup_handler: ;///////////////////////////////////////////////////
1310
;------------------------------------------------------------------------------
1311
;? 
1312
;------------------------------------------------------------------------------
1313
;> esi = process slot
1314
;------------------------------------------------------------------------------
1315
        mov     edx, esi
1316
        shl     edx, 8
1317
        add     edx, SLOT_BASE
1362 mikedld 1318
 
1391 mikedld 1319
        ; toggle normal/rolled up window state
1320
        mov     bl, [edi + WDATA.fl_wstate]
1321
        xor     bl, WSTATE_ROLLEDUP
1362 mikedld 1322
 
1391 mikedld 1323
        ; calculate and set appropriate window bounds
1324
        test    bl, WSTATE_ROLLEDUP
1325
        jz      .restore_size
1362 mikedld 1326
 
1391 mikedld 1327
        call    window._.get_rolledup_height
1328
        push    eax \
1329
                [edi + WDATA.box.width] \
1330
                [edi + WDATA.box.top] \
1331
                [edi + WDATA.box.left]
1332
        mov     eax, esp
1333
        jmp     .set_box
2436 mario79 1334
;--------------------------------------
1335
align 4
1336
.restore_size:
1391 mikedld 1337
        test    bl, WSTATE_MAXIMIZED
1338
        jnz     @f
2381 hidnplayr 1339
        add     esp, -sizeof.BOX
1391 mikedld 1340
        lea     eax, [edx + APPDATA.saved_box]
1341
        jmp     .set_box
2436 mario79 1342
;--------------------------------------
1343
align 4
1344
@@:
2288 clevermous 1345
        mov     eax, [screen_workarea.top]
1391 mikedld 1346
        push    [screen_workarea.bottom] \
1347
                [edi + WDATA.box.width] \
1348
                eax \
1349
                [edi + WDATA.box.left]
1350
        sub     [esp + BOX.height], eax
1351
        mov     eax, esp
2436 mario79 1352
;--------------------------------------
1353
align 4
1354
.set_box:
1391 mikedld 1355
        call    window._.set_window_box
2381 hidnplayr 1356
        add     esp, sizeof.BOX
1391 mikedld 1357
        ret
2436 mario79 1358
;------------------------------------------------------------------------------
1391 mikedld 1359
align 4
1360
;------------------------------------------------------------------------------
2669 mario79 1361
;sys_window_start_moving_handler: ;/////////////////////////////////////////////
1391 mikedld 1362
;------------------------------------------------------------------------------
1363
;? 
1364
;------------------------------------------------------------------------------
1365
;> eax = old (original) window box
1366
;> esi = process slot
1367
;------------------------------------------------------------------------------
2669 mario79 1368
;        mov     edi, eax
1369
;        call    window._.draw_negative_box
1370
;        ret
2436 mario79 1371
;------------------------------------------------------------------------------
1391 mikedld 1372
align 4
1373
;------------------------------------------------------------------------------
1374
sys_window_end_moving_handler: ;///////////////////////////////////////////////
1375
;------------------------------------------------------------------------------
1376
;? 
1377
;------------------------------------------------------------------------------
1378
;> eax = old (original) window box
1379
;> ebx = new (final) window box
1380
;> esi = process slot
1381
;------------------------------------------------------------------------------
2669 mario79 1382
;        mov     edi, ebx
1383
;        call    window._.end_moving__box
1362 mikedld 1384
 
1391 mikedld 1385
        mov     edi, esi
1386
        shl     edi, 5
1387
        add     edi, window_data
1362 mikedld 1388
 
5870 GerdtR 1389
        test    [fl_moving], 1
1390
        jz      @f
1391
 
1392
        push    edi
1393
        mov     edi, ebx
1394
        call    window._.draw_negative_box
1395
        pop     edi
1396
    @@:
1397
 
1391 mikedld 1398
        mov     eax, ebx
1399
        mov     bl, [edi + WDATA.fl_wstate]
1400
        call    window._.set_window_box
1401
        ret
2436 mario79 1402
;------------------------------------------------------------------------------
1391 mikedld 1403
align 4
1404
;------------------------------------------------------------------------------
1405
sys_window_moving_handler: ;///////////////////////////////////////////////////
1406
;------------------------------------------------------------------------------
1407
;? 
1408
;------------------------------------------------------------------------------
1409
;> eax = old (from previous call) window box
1410
;> ebx = new (current) window box
1411
;> esi = process_slot
1412
;------------------------------------------------------------------------------
1413
        mov     edi, eax
1414
        call    window._.draw_negative_box
1415
        mov     edi, ebx
1416
        call    window._.draw_negative_box
1417
        ret
1418
;==============================================================================
1419
;///// private functions //////////////////////////////////////////////////////
1420
;==============================================================================
1362 mikedld 1421
 
1391 mikedld 1422
iglobal
1423
  FuncTable syscall_display_settings, ftable, \
5867 pathoswith 1424
    00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12
1362 mikedld 1425
 
1391 mikedld 1426
  align 4
1427
  window_topleft dd \
1428
    1, 21, \ ;type 0
1429
    0,  0, \ ;type 1
1430
    5, 20, \ ;type 2
1431
    5,  ?, \ ;type 3 {set by skin}
1432
    5,  ?    ;type 4 {set by skin}
1433
endg
1362 mikedld 1434
 
1391 mikedld 1435
;uglobal
1436
  ; NOTE: commented out since doesn't provide necessary functionality anyway,
1437
  ;       to be reworked
1438
; new_window_starting       dd ?
1439
;endg
2436 mario79 1440
;------------------------------------------------------------------------------
1391 mikedld 1441
align 4
1442
;------------------------------------------------------------------------------
1443
window._.invalidate_screen: ;//////////////////////////////////////////////////
1444
;------------------------------------------------------------------------------
1445
;? 
1446
;------------------------------------------------------------------------------
1447
;> eax = old (original) window box
1448
;> ebx = new (final) window box
1449
;> edi = pointer to WDATA struct
1450
;------------------------------------------------------------------------------
1362 mikedld 1451
        push    eax ebx
1452
 
1391 mikedld 1453
        ; TODO: do we really need `draw_limits`?
1550 diamond 1454
        ; Yes, they are used by background drawing code.
2514 mario79 1455
 
1456
; we need only to restore the background windows at the old place!
1457
        mov     ecx, [ebx + BOX.left]
2288 clevermous 1458
        mov     [draw_limits.left], ecx
2514 mario79 1459
        add     ecx, [ebx + BOX.width]
2288 clevermous 1460
        mov     [draw_limits.right], ecx
2514 mario79 1461
        mov     ecx, [ebx + BOX.top]
2288 clevermous 1462
        mov     [draw_limits.top], ecx
2514 mario79 1463
        add     ecx, [ebx + BOX.height]
2288 clevermous 1464
        mov     [draw_limits.bottom], ecx
2514 mario79 1465
; recalculate screen buffer at old position
1391 mikedld 1466
        push    ebx
1467
        mov     edx, [eax + BOX.height]
1468
        mov     ecx, [eax + BOX.width]
1469
        mov     ebx, [eax + BOX.top]
1470
        mov     eax, [eax + BOX.left]
1471
        add     ecx, eax
1472
        add     edx, ebx
1473
        call    calculatescreen
1474
        pop     eax
2514 mario79 1475
; recalculate screen buffer at new position
1391 mikedld 1476
        mov     edx, [eax + BOX.height]
1477
        mov     ecx, [eax + BOX.width]
1478
        mov     ebx, [eax + BOX.top]
1479
        mov     eax, [eax + BOX.left]
1480
        add     ecx, eax
1481
        add     edx, ebx
1482
        call    calculatescreen
1362 mikedld 1483
 
1391 mikedld 1484
        mov     eax, edi
1485
        call    redrawscreen
1362 mikedld 1486
 
1391 mikedld 1487
        ; tell window to redraw itself
1488
        mov     [edi + WDATA.fl_redraw], 1
1362 mikedld 1489
 
1391 mikedld 1490
        pop     ebx eax
1491
        ret
2436 mario79 1492
;------------------------------------------------------------------------------
1391 mikedld 1493
align 4
1494
;------------------------------------------------------------------------------
1495
window._.set_window_box: ;/////////////////////////////////////////////////////
1496
;------------------------------------------------------------------------------
1497
;? 
1498
;------------------------------------------------------------------------------
1499
;> eax = pointer to BOX struct
1500
;> bl = new window state flags
1501
;> edi = pointer to WDATA struct
1502
;------------------------------------------------------------------------------
1503
        push    eax ebx esi
1362 mikedld 1504
 
1474 diamond 1505
; don't do anything if the new box is identical to the old
2288 clevermous 1506
        cmp     bl, [edi + WDATA.fl_wstate]
1507
        jnz     @f
1508
        mov     esi, eax
1509
        push    edi
1474 diamond 1510
if WDATA.box
2288 clevermous 1511
        add     edi, WDATA.box
1474 diamond 1512
end if
2288 clevermous 1513
        mov     ecx, 4
1514
        repz cmpsd
1515
        pop     edi
1516
        jz      .exit
2436 mario79 1517
;--------------------------------------
1518
align 4
1474 diamond 1519
@@:
2381 hidnplayr 1520
        add     esp, -sizeof.BOX
1391 mikedld 1521
        mov     ebx, esp
1424 diamond 1522
if WDATA.box
1391 mikedld 1523
        lea     esi, [edi + WDATA.box]
1424 diamond 1524
else
2288 clevermous 1525
        mov     esi, edi ; optimization for WDATA.box = 0
1424 diamond 1526
end if
1391 mikedld 1527
        xchg    eax, esi
2381 hidnplayr 1528
        mov     ecx, sizeof.BOX
1391 mikedld 1529
        call    memmove
1530
        xchg    eax, esi
1531
        xchg    ebx, esi
1532
        call    memmove
1424 diamond 1533
        mov     eax, ebx
1534
        mov     ebx, esi
1391 mikedld 1535
        call    window._.check_window_position
1536
        call    window._.set_window_clientbox
1537
        call    window._.invalidate_screen
1362 mikedld 1538
 
2381 hidnplayr 1539
        add     esp, sizeof.BOX
1362 mikedld 1540
 
1391 mikedld 1541
        mov     cl, [esp + 4]
1542
        mov     ch, cl
1543
        xchg    cl, [edi + WDATA.fl_wstate]
1362 mikedld 1544
 
1391 mikedld 1545
        or      cl, ch
1546
        test    cl, WSTATE_MAXIMIZED
1547
        jnz     .exit
1362 mikedld 1548
 
1391 mikedld 1549
        mov     eax, edi
1550
        sub     eax, window_data
1551
        shl     eax, 3
1552
        add     eax, SLOT_BASE
1362 mikedld 1553
 
1391 mikedld 1554
        lea     ebx, [edi + WDATA.box]
1555
        xchg    esp, ebx
1362 mikedld 1556
 
1391 mikedld 1557
        pop     [eax + APPDATA.saved_box.left] \
1558
                [eax + APPDATA.saved_box.top] \
1559
                [eax + APPDATA.saved_box.width] \
1560
                edx
1362 mikedld 1561
 
1391 mikedld 1562
        xchg    esp, ebx
1362 mikedld 1563
 
1391 mikedld 1564
        test    ch, WSTATE_ROLLEDUP
1565
        jnz     .exit
1362 mikedld 1566
 
1391 mikedld 1567
        mov     [eax + APPDATA.saved_box.height], edx
2436 mario79 1568
;--------------------------------------
1569
align 4
1570
.exit:
1391 mikedld 1571
        pop     esi ebx eax
1572
        ret
2436 mario79 1573
;------------------------------------------------------------------------------
1391 mikedld 1574
align 4
1575
;------------------------------------------------------------------------------
1576
window._.set_window_clientbox: ;///////////////////////////////////////////////
1577
;------------------------------------------------------------------------------
1578
;? 
1579
;------------------------------------------------------------------------------
1580
;> edi = pointer to WDATA struct
1581
;------------------------------------------------------------------------------
1582
        push    eax ecx edi
1362 mikedld 1583
 
1391 mikedld 1584
        mov     eax, [_skinh]
1585
        mov     [window_topleft + 8 * 3 + 4], eax
1586
        mov     [window_topleft + 8 * 4 + 4], eax
1362 mikedld 1587
 
1391 mikedld 1588
        mov     ecx, edi
1589
        sub     edi, window_data
1590
        shl     edi, 3
1591
        test    [ecx + WDATA.fl_wstyle], WSTYLE_CLIENTRELATIVE
1592
        jz      .whole_window
1362 mikedld 1593
 
1391 mikedld 1594
        movzx   eax, [ecx + WDATA.fl_wstyle]
1595
        and     eax, 0x0F
1596
        mov     eax, [eax * 8 + window_topleft + 0]
1597
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.left], eax
1598
        shl     eax, 1
1599
        neg     eax
1600
        add     eax, [ecx + WDATA.box.width]
1601
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.width], eax
1362 mikedld 1602
 
1391 mikedld 1603
        movzx   eax, [ecx + WDATA.fl_wstyle]
1604
        and     eax, 0x0F
1605
        push    [eax * 8 + window_topleft + 0]
1606
        mov     eax, [eax * 8 + window_topleft + 4]
1607
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.top], eax
1608
        neg     eax
1609
        sub     eax, [esp]
1610
        add     eax, [ecx + WDATA.box.height]
1611
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.height], eax
1612
        add     esp, 4
1613
        jmp     .exit
2436 mario79 1614
;--------------------------------------
1615
align 4
1616
.whole_window:
1391 mikedld 1617
        xor     eax, eax
1618
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.left], eax
1619
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.top], eax
1620
        mov     eax, [ecx + WDATA.box.width]
1621
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.width], eax
1622
        mov     eax, [ecx + WDATA.box.height]
1623
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.height], eax
2436 mario79 1624
;--------------------------------------
1625
align 4
1626
.exit:
1391 mikedld 1627
        pop     edi ecx eax
1628
        ret
2436 mario79 1629
;------------------------------------------------------------------------------
1391 mikedld 1630
align 4
1631
;------------------------------------------------------------------------------
1632
window._.sys_set_window: ;/////////////////////////////////////////////////////
1633
;------------------------------------------------------------------------------
1634
;? 
1635
;------------------------------------------------------------------------------
1636
;< edx = pointer to WDATA struct
1637
;------------------------------------------------------------------------------
1638
        mov     eax, [CURRENT_TASK]
1639
        shl     eax, 5
1640
        add     eax, window_data
1362 mikedld 1641
 
1391 mikedld 1642
        ; save window colors
1643
        mov     [eax + WDATA.cl_workarea], edx
1644
        mov     [eax + WDATA.cl_titlebar], esi
1645
        mov     [eax + WDATA.cl_frames], edi
1362 mikedld 1646
 
1391 mikedld 1647
        mov     edi, eax
1362 mikedld 1648
 
1391 mikedld 1649
        ; was it already defined before?
1650
        test    [edi + WDATA.fl_wdrawn], 1
1651
        jnz     .set_client_box
1563 diamond 1652
        or      [edi + WDATA.fl_wdrawn], 1
2503 mario79 1653
; After first draw_window we need redraw mouse necessarily!
1654
; Otherwise the user can see cursor specified by f.37.5 from another window.
1655
; He will be really unhappy! He is terrible in rage - usually he throws stones!
1656
        mov     [redrawmouse_unconditional], 1
3534 clevermous 1657
        call    wakeup_osloop
1391 mikedld 1658
        ; NOTE: commented out since doesn't provide necessary functionality
1659
        ;       anyway, to be reworked
1660
;       mov     eax, [timer_ticks] ; [0xfdf0]
1661
;       add     eax, 100
1662
;       mov     [new_window_starting], eax
1663
 
1664
        ; no it wasn't, performing initial window definition
1665
        movzx   eax, bx
1362 mikedld 1666
        mov     [edi + WDATA.box.width], eax
1391 mikedld 1667
        movzx   eax, cx
1362 mikedld 1668
        mov     [edi + WDATA.box.height], eax
1391 mikedld 1669
        sar     ebx, 16
1670
        sar     ecx, 16
1671
        mov     [edi + WDATA.box.left], ebx
1672
        mov     [edi + WDATA.box.top], ecx
1362 mikedld 1673
 
1391 mikedld 1674
        call    window._.check_window_position
1362 mikedld 1675
 
1391 mikedld 1676
        push    ecx edi
1362 mikedld 1677
 
1391 mikedld 1678
        mov     cl, [edi + WDATA.fl_wstyle]
1679
        mov     eax, [edi + WDATA.cl_frames]
1362 mikedld 1680
 
1391 mikedld 1681
        sub     edi, window_data
1682
        shl     edi, 3
1683
        add     edi, SLOT_BASE
1362 mikedld 1684
 
1391 mikedld 1685
        and     cl, 0x0F
1686
        cmp     cl, 3
1687
        je      @f
1688
        cmp     cl, 4
1689
        je      @f
1362 mikedld 1690
 
1391 mikedld 1691
        xor     eax, eax
2436 mario79 1692
;--------------------------------------
1693
align 4
1694
@@:
2288 clevermous 1695
        mov     [edi + APPDATA.wnd_caption], eax
1362 mikedld 1696
 
1391 mikedld 1697
        mov     esi, [esp]
1698
        add     edi, APPDATA.saved_box
1699
        movsd
1700
        movsd
1701
        movsd
1702
        movsd
1362 mikedld 1703
 
1391 mikedld 1704
        pop     edi ecx
1705
 
1706
        mov     esi, [CURRENT_TASK]
1707
        movzx   esi, word[WIN_STACK + esi * 2]
1708
        lea     esi, [WIN_POS + esi * 2]
1709
        call    waredraw
1710
 
1362 mikedld 1711
        mov     eax, [edi + WDATA.box.left]
1712
        mov     ebx, [edi + WDATA.box.top]
1713
        mov     ecx, [edi + WDATA.box.width]
1714
        mov     edx, [edi + WDATA.box.height]
1715
        add     ecx, eax
1716
        add     edx, ebx
1717
        call    calculatescreen
1718
 
1391 mikedld 1719
        mov     byte[KEY_COUNT], 0           ; empty keyboard buffer
1720
        mov     byte[BTN_COUNT], 0           ; empty button buffer
2436 mario79 1721
;--------------------------------------
1722
align 4
1723
.set_client_box:
1391 mikedld 1724
        ; update window client box coordinates
1725
        call    window._.set_window_clientbox
1362 mikedld 1726
 
1391 mikedld 1727
        ; reset window redraw flag and exit
1728
        mov     [edi + WDATA.fl_redraw], 0
1729
        mov     edx, edi
1730
        ret
2436 mario79 1731
;------------------------------------------------------------------------------
1391 mikedld 1732
align 4
1733
;------------------------------------------------------------------------------
1734
window._.check_window_position: ;//////////////////////////////////////////////
1735
;------------------------------------------------------------------------------
1736
;? Check if window is inside screen area
1737
;------------------------------------------------------------------------------
1738
;> edi = pointer to WDATA
1739
;------------------------------------------------------------------------------
1740
        push    eax ebx ecx edx esi
1362 mikedld 1741
 
1391 mikedld 1742
        mov     eax, [edi + WDATA.box.left]
1743
        mov     ebx, [edi + WDATA.box.top]
1744
        mov     ecx, [edi + WDATA.box.width]
1745
        mov     edx, [edi + WDATA.box.height]
1362 mikedld 1746
 
5350 serge 1747
        mov     esi, [_display.width]
1391 mikedld 1748
        cmp     ecx, esi
5350 serge 1749
        jae     .fix_width_high
2436 mario79 1750
;--------------------------------------
1751
align 4
1752
.check_left:
1391 mikedld 1753
        or      eax, eax
1754
        jl      .fix_left_low
1755
        add     eax, ecx
1756
        cmp     eax, esi
5350 serge 1757
        jge     .fix_left_high
2436 mario79 1758
;--------------------------------------
1759
align 4
1760
.check_height:
5350 serge 1761
        mov     esi, [_display.height]
1391 mikedld 1762
        cmp     edx, esi
5350 serge 1763
        jae     .fix_height_high
2436 mario79 1764
;--------------------------------------
1765
align 4
1766
.check_top:
1391 mikedld 1767
        or      ebx, ebx
1768
        jl      .fix_top_low
1769
        add     ebx, edx
1770
        cmp     ebx, esi
5350 serge 1771
        jge     .fix_top_high
2436 mario79 1772
;--------------------------------------
1773
align 4
1774
.exit:
1391 mikedld 1775
        pop     esi edx ecx ebx eax
1362 mikedld 1776
        ret
2436 mario79 1777
;--------------------------------------
1778
align 4
1779
.fix_width_high:
1391 mikedld 1780
        mov     ecx, esi
1781
        mov     [edi + WDATA.box.width], esi
1782
        jmp     .check_left
2436 mario79 1783
;--------------------------------------
1784
align 4
1785
.fix_left_low:
1391 mikedld 1786
        xor     eax, eax
1787
        mov     [edi + WDATA.box.left], eax
1788
        jmp     .check_height
2436 mario79 1789
;--------------------------------------
1790
align 4
1791
.fix_left_high:
1391 mikedld 1792
        mov     eax, esi
1793
        sub     eax, ecx
1794
        mov     [edi + WDATA.box.left], eax
1795
        jmp     .check_height
2436 mario79 1796
;--------------------------------------
1797
align 4
1798
.fix_height_high:
1391 mikedld 1799
        mov     edx, esi
1800
        mov     [edi + WDATA.box.height], esi
1801
        jmp     .check_top
2436 mario79 1802
;--------------------------------------
1803
align 4
1804
.fix_top_low:
1391 mikedld 1805
        xor     ebx, ebx
1806
        mov     [edi + WDATA.box.top], ebx
1807
        jmp     .exit
2436 mario79 1808
;--------------------------------------
1809
align 4
1810
.fix_top_high:
1391 mikedld 1811
        mov     ebx, esi
1812
        sub     ebx, edx
1813
        mov     [edi + WDATA.box.top], ebx
1814
        jmp     .exit
2436 mario79 1815
;------------------------------------------------------------------------------
1362 mikedld 1816
align 4
1817
;------------------------------------------------------------------------------
1818
window._.get_titlebar_height: ;////////////////////////////////////////////////
1819
;------------------------------------------------------------------------------
1391 mikedld 1820
;? 
1821
;------------------------------------------------------------------------------
1362 mikedld 1822
;> edi = pointer to WDATA
1823
;------------------------------------------------------------------------------
1824
        mov     al, [edi + WDATA.fl_wstyle]
1825
        and     al, 0x0f
1826
        cmp     al, 0x03
1827
        jne     @f
1828
        mov     eax, [_skinh]
1829
        ret
2436 mario79 1830
;--------------------------------------
1831
align 4
1832
@@:
2288 clevermous 1833
        mov     eax, 21
1362 mikedld 1834
        ret
2436 mario79 1835
;------------------------------------------------------------------------------
1362 mikedld 1836
align 4
1837
;------------------------------------------------------------------------------
1838
window._.get_rolledup_height: ;////////////////////////////////////////////////
1839
;------------------------------------------------------------------------------
1391 mikedld 1840
;? 
1841
;------------------------------------------------------------------------------
1362 mikedld 1842
;> edi = pointer to WDATA
1843
;------------------------------------------------------------------------------
1844
        mov     al, [edi + WDATA.fl_wstyle]
1845
        and     al, 0x0f
1846
        cmp     al, 0x03
1847
        jb      @f
1848
        mov     eax, [_skinh]
1849
        add     eax, 3
1850
        ret
2436 mario79 1851
;--------------------------------------
1852
align 4
1853
@@:
2288 clevermous 1854
        or      al, al
1362 mikedld 1855
        jnz     @f
1856
        mov     eax, 21
1857
        ret
2436 mario79 1858
;--------------------------------------
1859
align 4
1860
@@:
2288 clevermous 1861
        mov     eax, 21 + 2
1362 mikedld 1862
        ret
2436 mario79 1863
;------------------------------------------------------------------------------
1362 mikedld 1864
align 4
1865
;------------------------------------------------------------------------------
1866
window._.set_screen: ;/////////////////////////////////////////////////////////
1867
;------------------------------------------------------------------------------
1868
;? Reserve window area in screen buffer
1869
;------------------------------------------------------------------------------
1870
;> eax = left
1871
;> ebx = top
1872
;> ecx = right
1873
;> edx = bottom
1874
;> esi = process number
1875
;------------------------------------------------------------------------------
1876
virtual at esp
1877
  ff_x     dd ?
1878
  ff_y     dd ?
1879
  ff_width dd ?
1880
  ff_xsz   dd ?
1881
  ff_ysz   dd ?
1882
  ff_scale dd ?
1883
end virtual
1884
 
1885
        pushad
1886
 
1887
        cmp     esi, 1
1888
        jz      .check_for_shaped_window
1889
        mov     edi, esi
1890
        shl     edi, 5
1891
        cmp     [window_data + edi + WDATA.box.width], 0
1892
        jnz     .check_for_shaped_window
1893
        cmp     [window_data + edi + WDATA.box.height], 0
1894
        jz      .exit
2436 mario79 1895
;--------------------------------------
1896
align 4
1897
.check_for_shaped_window:
1362 mikedld 1898
        mov     edi, esi
1899
        shl     edi, 8
1900
        add     edi, SLOT_BASE
1901
        cmp     [edi + APPDATA.wnd_shape], 0
1902
        jne     .shaped_window
1903
 
1904
        ; get x&y size
1905
        sub     ecx, eax
1906
        sub     edx, ebx
1907
        inc     ecx
1908
        inc     edx
1909
 
1910
        ; get WinMap start
1368 mikedld 1911
        push    esi
4424 Serge 1912
        mov     esi, [_display.width]
2446 mario79 1913
        mov     edi, [d_width_calc_area + ebx*4]
1914
 
1362 mikedld 1915
        add     edi, eax
5351 serge 1916
        add     edi, [_display.win_map]
1368 mikedld 1917
        pop     eax
1918
        mov     ah, al
1919
        push    ax
1920
        shl     eax, 16
1921
        pop     ax
2436 mario79 1922
;--------------------------------------
1923
align 4
1924
.next_line:
1362 mikedld 1925
        push    ecx
1368 mikedld 1926
        shr     ecx, 2
2288 clevermous 1927
        rep stosd
1368 mikedld 1928
        mov     ecx, [esp]
1929
        and     ecx, 3
2288 clevermous 1930
        rep stosb
1362 mikedld 1931
        pop     ecx
1368 mikedld 1932
        add     edi, esi
1362 mikedld 1933
        sub     edi, ecx
1934
        dec     edx
1935
        jnz     .next_line
1936
 
1937
        jmp     .exit
2436 mario79 1938
;--------------------------------------
1939
align 4
1940
.shaped_window:
1362 mikedld 1941
        ;  for (y=0; y <= x_size; y++)
1942
        ;      for (x=0; x <= x_size; x++)
1943
        ;          if (shape[coord(x,y,scale)]==1)
1944
        ;             set_pixel(x, y, process_number);
1945
 
1946
        sub     ecx, eax
1947
        sub     edx, ebx
1948
        inc     ecx
1949
        inc     edx
1950
 
1951
        push    [edi + APPDATA.wnd_shape_scale]  ; push scale first -> for loop
1952
 
1953
        ; get WinMap start  -> ebp
1954
        push    eax
2446 mario79 1955
        mov     eax, [d_width_calc_area + ebx*4]
1956
 
1362 mikedld 1957
        add     eax, [esp]
5351 serge 1958
        add     eax, [_display.win_map]
1362 mikedld 1959
        mov     ebp, eax
1960
 
1961
        mov     edi, [edi + APPDATA.wnd_shape]
1962
        pop     eax
1963
 
1964
        ; eax = x_start
1965
        ; ebx = y_start
1966
        ; ecx = x_size
1967
        ; edx = y_size
1968
        ; esi = process_number
1969
        ; edi = &shape
1970
        ;       [scale]
1971
        push    edx ecx ; for loop - x,y size
1972
 
1973
        mov     ecx, esi
1974
        shl     ecx, 5
1975
        mov     edx, [window_data + ecx + WDATA.box.top]
1976
        push    [window_data + ecx + WDATA.box.width]           ; for loop - width
1977
        mov     ecx, [window_data + ecx + WDATA.box.left]
1978
        sub     ebx, edx
1979
        sub     eax, ecx
1980
        push    ebx eax ; for loop - x,y
1981
 
1982
        add     [ff_xsz], eax
1983
        add     [ff_ysz], ebx
1984
 
1985
        mov     ebx, [ff_y]
2436 mario79 1986
;--------------------------------------
1987
align 4
1988
.ff_new_y:
1362 mikedld 1989
        mov     edx, [ff_x]
2436 mario79 1990
;--------------------------------------
1991
align 4
1992
.ff_new_x:
1362 mikedld 1993
        ; -- body --
1994
        mov     ecx, [ff_scale]
1995
        mov     eax, [ff_width]
1996
        inc     eax
1997
        shr     eax, cl
1998
        push    ebx edx
1999
        shr     ebx, cl
2000
        shr     edx, cl
2001
        imul    eax, ebx
2002
        add     eax, edx
2003
        pop     edx ebx
2004
        add     eax, edi
2005
        call    .read_byte
2288 clevermous 2006
        test    al, al
1362 mikedld 2007
        jz      @f
2008
        mov     eax, esi
2009
        mov     [ebp], al
2010
        ; -- end body --
2436 mario79 2011
;--------------------------------------
2012
align 4
2013
@@:
2288 clevermous 2014
        inc     ebp
1362 mikedld 2015
        inc     edx
2016
        cmp     edx, [ff_xsz]
2017
        jb      .ff_new_x
2018
 
2019
        sub     ebp, [ff_xsz]
2020
        add     ebp, [ff_x]
5350 serge 2021
        add     ebp, [_display.width]  ; screen.x
1362 mikedld 2022
        inc     ebx
2023
        cmp     ebx, [ff_ysz]
2024
        jb      .ff_new_y
2025
 
2026
        add     esp, 24
2436 mario79 2027
;--------------------------------------
2028
align 4
2029
.exit:
1362 mikedld 2030
        popad
2443 Serge 2031
        inc     [_display.mask_seqno]
1362 mikedld 2032
        ret
2436 mario79 2033
;--------------------------------------
2034
align 4
2035
.read_byte:
1362 mikedld 2036
        ; eax - address
2037
        ; esi - slot
2038
        push    eax ecx edx esi
2039
        xchg    eax, esi
2040
        lea     ecx, [esp + 12]
2041
        mov     edx, 1
2042
        call    read_process_memory
2043
        pop     esi edx ecx eax
2044
        ret
2436 mario79 2045
;------------------------------------------------------------------------------
1362 mikedld 2046
align 4
2047
;------------------------------------------------------------------------------
2048
window._.window_activate: ;////////////////////////////////////////////////////
2049
;------------------------------------------------------------------------------
2050
;? Activate window
2051
;------------------------------------------------------------------------------
2052
;> esi = pointer to WIN_POS+ window data
2053
;------------------------------------------------------------------------------
2054
        push    eax ebx
2055
 
2056
        ; if type of current active window is 3 or 4, it must be redrawn
1368 mikedld 2057
        mov     ebx, [TASK_COUNT]
5350 serge 2058
 
2288 clevermous 2059
;       DEBUGF  1, "K : TASK_COUNT (0x%x)\n", ebx
5350 serge 2060
 
1368 mikedld 2061
        movzx   ebx, word[WIN_POS + ebx * 2]
2062
        shl     ebx, 5
1362 mikedld 2063
        add     eax, window_data
1368 mikedld 2064
        mov     al, [window_data + ebx + WDATA.fl_wstyle]
2065
        and     al, 0x0f
2066
        cmp     al, 0x03
1362 mikedld 2067
        je      .set_window_redraw_flag
1368 mikedld 2068
        cmp     al, 0x04
2069
        jne     .move_others_down
2436 mario79 2070
;--------------------------------------
2071
align 4
2072
.set_window_redraw_flag:
1368 mikedld 2073
        mov     [window_data + ebx + WDATA.fl_redraw], 1
2436 mario79 2074
;--------------------------------------
2075
align 4
2076
.move_others_down:
1362 mikedld 2077
        ; ax <- process no
1368 mikedld 2078
        movzx   ebx, word[esi]
1362 mikedld 2079
        ; ax <- position in window stack
1368 mikedld 2080
        movzx   ebx, word[WIN_STACK + ebx * 2]
1362 mikedld 2081
 
2082
        ; drop others
1368 mikedld 2083
        xor     eax, eax
2436 mario79 2084
;--------------------------------------
2085
align 4
2086
.next_stack_window:
1368 mikedld 2087
        cmp     eax, [TASK_COUNT]
1362 mikedld 2088
        jae     .move_self_up
1368 mikedld 2089
        inc     eax
5350 serge 2090
 
2288 clevermous 2091
;       push    ebx
2092
;       xor     ebx,ebx
2093
;       mov     bx,[WIN_STACK + eax * 2]
2094
;       DEBUGF  1, "K : DEC WIN_STACK (0x%x)\n",ebx
2095
;       pop     ebx
5350 serge 2096
 
1368 mikedld 2097
        cmp     [WIN_STACK + eax * 2], bx
1362 mikedld 2098
        jbe     .next_stack_window
1368 mikedld 2099
        dec     word[WIN_STACK + eax * 2]
1362 mikedld 2100
        jmp     .next_stack_window
2436 mario79 2101
;--------------------------------------
2102
align 4
2103
.move_self_up:
1368 mikedld 2104
        movzx   ebx, word[esi]
1362 mikedld 2105
        ; number of processes
1368 mikedld 2106
        mov     ax, [TASK_COUNT]
1362 mikedld 2107
        ; this is the last (and the upper)
1368 mikedld 2108
        mov     [WIN_STACK + ebx * 2], ax
1362 mikedld 2109
 
2110
        ; update on screen - window stack
1368 mikedld 2111
        xor     eax, eax
2436 mario79 2112
;--------------------------------------
2113
align 4
2114
.next_window_pos:
1368 mikedld 2115
        cmp     eax, [TASK_COUNT]
1362 mikedld 2116
        jae     .reset_vars
1368 mikedld 2117
        inc     eax
2118
        movzx   ebx, word[WIN_STACK + eax * 2]
2119
        mov     [WIN_POS + ebx * 2], ax
1362 mikedld 2120
        jmp     .next_window_pos
2436 mario79 2121
;--------------------------------------
2122
align 4
2123
.reset_vars:
1362 mikedld 2124
        mov     byte[KEY_COUNT], 0
2125
        mov     byte[BTN_COUNT], 0
2126
        mov     word[MOUSE_SCROLL_H], 0
2127
        mov     word[MOUSE_SCROLL_V], 0
2128
 
2129
        pop     ebx eax
2130
        ret
2244 mario79 2131
;------------------------------------------------------------------------------
2132
window._.window_deactivate: ;////////////////////////////////////////////////////
2133
;------------------------------------------------------------------------------
2134
;? Deactivate window
2135
;------------------------------------------------------------------------------
2136
;> esi = pointer to WIN_POS+ window data
2137
;------------------------------------------------------------------------------
2288 clevermous 2138
        push    eax ebx
2436 mario79 2139
;--------------------------------------
2140
align 4
2244 mario79 2141
.move_others_up:
2288 clevermous 2142
        ; ax <- process no
2143
        movzx   ebx, word[esi]
2144
        ; ax <- position in window stack
2145
        movzx   ebx, word[WIN_STACK + ebx * 2]
2146
        ; up others
2147
        xor     eax, eax
2436 mario79 2148
;--------------------------------------
2149
align 4
2244 mario79 2150
.next_stack_window:
2288 clevermous 2151
        cmp     eax, [TASK_COUNT]
2152
        jae     .move_self_down
2153
        inc     eax
2154
        cmp     [WIN_STACK + eax * 2], bx
2155
        jae     .next_stack_window
2156
        inc     word[WIN_STACK + eax * 2]
2157
        jmp     .next_stack_window
2436 mario79 2158
;--------------------------------------
2159
align 4
2244 mario79 2160
.move_self_down:
2288 clevermous 2161
        movzx   ebx, word[esi]
2162
        ; this is the last (and the low)
2163
        mov     [WIN_STACK + ebx * 2], word 1
2164
        ; update on screen - window stack
2165
        xor     eax, eax
2436 mario79 2166
;--------------------------------------
2167
align 4
2244 mario79 2168
.next_window_pos:
2288 clevermous 2169
        cmp     eax, [TASK_COUNT]
2170
        jae     .reset_vars
2171
        inc     eax
2172
        movzx   ebx, word[WIN_STACK + eax * 2]
2173
        mov     [WIN_POS + ebx * 2], ax
2174
        jmp     .next_window_pos
2436 mario79 2175
;--------------------------------------
2176
align 4
2244 mario79 2177
.reset_vars:
2288 clevermous 2178
        mov     byte[KEY_COUNT], 0
2179
        mov     byte[BTN_COUNT], 0
2180
        mov     word[MOUSE_SCROLL_H], 0
2181
        mov     word[MOUSE_SCROLL_V], 0
2182
        pop     ebx eax
2183
        ret
5350 serge 2184
;------------------------------------------------------------------------------
1362 mikedld 2185
align 4
2186
;------------------------------------------------------------------------------
2187
window._.check_window_draw: ;//////////////////////////////////////////////////
2188
;------------------------------------------------------------------------------
2189
;? Check if window is necessary to draw
2190
;------------------------------------------------------------------------------
2191
;> edi = pointer to WDATA
2192
;------------------------------------------------------------------------------
2193
        mov     cl, [edi + WDATA.fl_wstyle]
2194
        and     cl, 0x0f
1391 mikedld 2195
        cmp     cl, 3
1362 mikedld 2196
        je      .exit.redraw      ; window type 3
1391 mikedld 2197
        cmp     cl, 4
1362 mikedld 2198
        je      .exit.redraw      ; window type 4
2199
 
2200
        push    eax ebx edx esi
2201
 
2202
        mov     eax, edi
2203
        sub     eax, window_data
2204
        shr     eax, 5
2205
 
2206
        movzx   eax, word[WIN_STACK + eax * 2]  ; get value of the curr process
2207
        lea     esi, [WIN_POS + eax * 2]        ; get address of this process at 0xC400
2436 mario79 2208
;--------------------------------------
2209
align 4
2210
.next_window:
1362 mikedld 2211
        add     esi, 2
2212
 
2213
        mov     eax, [TASK_COUNT]
2214
        lea     eax, word[WIN_POS + eax * 2] ; number of the upper window
2215
 
2216
        cmp     esi, eax
2217
        ja      .exit.no_redraw
2218
 
2219
        movzx   edx, word[esi]
2220
        shl     edx, 5
2221
        cmp     [CURRENT_TASK + edx + TASKDATA.state], TSTATE_FREE
2222
        je      .next_window
2223
 
2224
        mov     eax, [edi + WDATA.box.top]
2225
        mov     ebx, [edi + WDATA.box.height]
2226
        add     ebx, eax
2227
 
2228
        mov     ecx, [window_data + edx + WDATA.box.top]
2229
        cmp     ecx, ebx
2230
        jge     .next_window
2231
        add     ecx, [window_data + edx + WDATA.box.height]
2232
        cmp     eax, ecx
2233
        jge     .next_window
2234
 
2235
        mov     eax, [edi + WDATA.box.left]
2236
        mov     ebx, [edi + WDATA.box.width]
2237
        add     ebx, eax
2238
 
2239
        mov     ecx, [window_data + edx + WDATA.box.left]
2240
        cmp     ecx, ebx
2241
        jge     .next_window
2242
        add     ecx, [window_data + edx + WDATA.box.width]
2243
        cmp     eax, ecx
2244
        jge     .next_window
2245
 
2246
        pop     esi edx ebx eax
2436 mario79 2247
;--------------------------------------
2248
align 4
2249
.exit.redraw:
1362 mikedld 2250
        xor     ecx, ecx
2251
        inc     ecx
2252
        ret
2436 mario79 2253
;--------------------------------------
2254
align 4
2255
.exit.no_redraw:
1362 mikedld 2256
        pop     esi edx ebx eax
2257
        xor     ecx, ecx
2258
        ret
2436 mario79 2259
;------------------------------------------------------------------------------
1362 mikedld 2260
align 4
2261
;------------------------------------------------------------------------------
1391 mikedld 2262
window._.draw_window_caption: ;////////////////////////////////////////////////
1362 mikedld 2263
;------------------------------------------------------------------------------
1391 mikedld 2264
;? 
1362 mikedld 2265
;------------------------------------------------------------------------------
1391 mikedld 2266
        xor     eax, eax
2267
        mov     edx, [TASK_COUNT]
2268
        movzx   edx, word[WIN_POS + edx * 2]
2269
        cmp     edx, [CURRENT_TASK]
2270
        jne     @f
2271
        inc     eax
2436 mario79 2272
;--------------------------------------
2273
align 4
2274
@@:
2288 clevermous 2275
        mov     edx, [CURRENT_TASK]
1391 mikedld 2276
        shl     edx, 5
2277
        add     edx, window_data
2278
        movzx   ebx, [edx + WDATA.fl_wstyle]
2279
        and     bl, 0x0F
2280
        cmp     bl, 3
2281
        je      .draw_caption_style_3
2282
        cmp     bl, 4
2283
        je      .draw_caption_style_3
1362 mikedld 2284
 
1391 mikedld 2285
        jmp     .not_style_3
2436 mario79 2286
;--------------------------------------
2287
align 4
2288
.draw_caption_style_3:
1391 mikedld 2289
        push    edx
2290
        call    drawwindow_IV_caption
2291
        add     esp, 4
2292
        jmp     .2
2436 mario79 2293
;--------------------------------------
2294
align 4
2295
.not_style_3:
1391 mikedld 2296
        cmp     bl, 2
2297
        jne     .not_style_2
2298
 
2299
        call    drawwindow_III_caption
2300
        jmp     .2
2436 mario79 2301
;--------------------------------------
2302
align 4
2303
.not_style_2:
1391 mikedld 2304
        cmp     bl, 0
2305
        jne     .2
2306
 
2307
        call    drawwindow_I_caption
2436 mario79 2308
;--------------------------------------
2309
align 4
2310
.2:
2288 clevermous 2311
        mov     edi, [CURRENT_TASK]
1391 mikedld 2312
        shl     edi, 5
2313
        test    [edi + window_data + WDATA.fl_wstyle], WSTYLE_HASCAPTION
2314
        jz      .exit
2315
        mov     edx, [edi * 8 + SLOT_BASE + APPDATA.wnd_caption]
2316
        or      edx, edx
2317
        jz      .exit
2318
 
2319
        movzx   eax, [edi + window_data + WDATA.fl_wstyle]
2320
        and     al, 0x0F
2321
        cmp     al, 3
2322
        je      .skinned
2323
        cmp     al, 4
2324
        je      .skinned
2325
 
2326
        jmp     .not_skinned
2436 mario79 2327
;--------------------------------------
2328
align 4
2329
.skinned:
1391 mikedld 2330
        mov     ebp, [edi + window_data + WDATA.box.left - 2]
2331
        mov     bp, word[edi + window_data + WDATA.box.top]
2332
        movzx   eax, word[edi + window_data + WDATA.box.width]
2333
        sub     ax, [_skinmargins.left]
2334
        sub     ax, [_skinmargins.right]
2335
        push    edx
2336
        cwde
2337
        cdq
2338
        mov     ebx, 6
2339
        idiv    ebx
2340
        pop     edx
2341
        or      eax, eax
2342
        js      .exit
2343
 
2344
        mov     esi, eax
2345
        mov     ebx, dword[_skinmargins.left - 2]
2346
        mov     bx, word[_skinh]
2347
        sub     bx, [_skinmargins.bottom]
2348
        sub     bx, [_skinmargins.top]
2349
        sar     bx, 1
2350
        adc     bx, 0
2351
        add     bx, [_skinmargins.top]
2352
        add     bx, -3
2353
        add     ebx, ebp
2354
        jmp     .dodraw
2436 mario79 2355
;--------------------------------------
2356
align 4
2357
.not_skinned:
1391 mikedld 2358
        cmp     al, 1
2359
        je      .exit
2360
 
2361
        mov     ebp, [edi + window_data + WDATA.box.left - 2]
2362
        mov     bp, word[edi + window_data + WDATA.box.top]
2363
        movzx   eax, word[edi + window_data + WDATA.box.width]
2364
        sub     eax, 16
2365
        push    edx
2366
        cwde
2367
        cdq
2368
        mov     ebx, 6
2369
        idiv    ebx
2370
        pop     edx
2371
        or      eax, eax
2372
        js      .exit
2373
 
2374
        mov     esi, eax
2375
        mov     ebx, 0x00080007
2376
        add     ebx, ebp
2436 mario79 2377
;--------------------------------------
2378
align 4
2379
.dodraw:
1391 mikedld 2380
        mov     ecx, [common_colours + 16]
2381
        or      ecx, 0x80000000
2382
        xor     edi, edi
2383
        call    dtext_asciiz_esi
2436 mario79 2384
;--------------------------------------
2385
align 4
2386
.exit:
2453 mario79 2387
;        call    [draw_pointer]
2388
        call    __sys_draw_pointer
1362 mikedld 2389
        ret
2436 mario79 2390
;------------------------------------------------------------------------------
1391 mikedld 2391
align 4
2392
;------------------------------------------------------------------------------
2393
window._.draw_negative_box: ;//////////////////////////////////////////////////
2394
;------------------------------------------------------------------------------
2395
;? Draw negative box
2396
;------------------------------------------------------------------------------
2397
;> edi = pointer to BOX struct
2398
;------------------------------------------------------------------------------
2399
        push    eax ebx esi
2233 mario79 2400
        mov     esi, 0x01000000
2436 mario79 2401
;--------------------------------------
2402
align 4
2233 mario79 2403
.1:
1391 mikedld 2404
        mov     eax, [edi + BOX.left - 2]
2405
        mov     ax, word[edi + BOX.left]
2406
        add     ax, word[edi + BOX.width]
2407
        mov     ebx, [edi + BOX.top - 2]
2408
        mov     bx, word[edi + BOX.top]
2409
        add     bx, word[edi + BOX.height]
2410
        call    draw_rectangle.forced
2411
        pop     esi ebx eax
2412
        ret
2233 mario79 2413
;------------------------------------------------------------------------------
2669 mario79 2414
;align 4
2436 mario79 2415
;------------------------------------------------------------------------------
2669 mario79 2416
;window._.end_moving__box: ;//////////////////////////////////////////////////
2233 mario79 2417
;------------------------------------------------------------------------------
2418
;? Draw positive box
2419
;------------------------------------------------------------------------------
2420
;> edi = pointer to BOX struct
2421
;------------------------------------------------------------------------------
2669 mario79 2422
;        push    eax ebx esi
2423
;        xor     esi, esi
2424
;        jmp     window._.draw_negative_box.1
2341 Serge 2425
;------------------------------------------------------------------------------
2436 mario79 2426
align 4
2427
;------------------------------------------------------------------------------
2341 Serge 2428
window._.get_rect: ;/////////////////////////////////////////////////////
2429
;------------------------------------------------------------------------------
2430
;?   void __fastcall get_window_rect(struct RECT* rc);
2431
;------------------------------------------------------------------------------
2432
;> ecx = pointer to RECT
2433
;------------------------------------------------------------------------------
2434
        mov     eax, [TASK_BASE]
2435
 
2436
        mov     edx, [eax-twdw + WDATA.box.left]
2437
        mov     [ecx+RECT.left], edx
2438
 
2439
        add     edx, [eax-twdw + WDATA.box.width]
2440
        mov     [ecx+RECT.right], edx
2441
 
2442
        mov     edx, [eax-twdw + WDATA.box.top]
2443
        mov     [ecx+RECT.top], edx
2444
 
2445
        add     edx, [eax-twdw + WDATA.box.height]
2446
        mov     [ecx+RECT.bottom], edx
2447
        ret
2436 mario79 2448
;------------------------------------------------------------------------------
5836 GerdtR 2449
align 4
2450
;------------------------------------------------------------------------------
5865 GerdtR 2451
window._.redraw_top_wnd: ;////////////////////////////////////////////////////////
2452
;------------------------------------------------------------------------------
2453
;? redraw all windows one above the window
2454
;------------------------------------------------------------------------------
2455
;> eax = left
2456
;> ebx = top
2457
;> ecx = right
2458
;> edx = bottom
2459
;> esi = process number
2460
;! corrupted edi
2461
;------------------------------------------------------------------------------
2462
        push    0
2463
        jmp     window._.set_top_wnd.go
2464
 
2465
align 4
2466
;------------------------------------------------------------------------------
5836 GerdtR 2467
window._.set_top_wnd: ;////////////////////////////////////////////////////////
2468
;------------------------------------------------------------------------------
5865 GerdtR 2469
;? call set_screen for all windows one above the window
5836 GerdtR 2470
;------------------------------------------------------------------------------
2471
;> eax = left
2472
;> ebx = top
2473
;> ecx = right
2474
;> edx = bottom
2475
;> esi = process number
2476
;! corrupted edi
2477
;------------------------------------------------------------------------------
2478
 
5865 GerdtR 2479
        push    1
2480
.go:
5836 GerdtR 2481
        push    esi
2482
        pushfd
2483
        cli
2484
 
2485
        push    ebp
2486
        mov     ebp, [TASK_COUNT]
2487
        cmp     ebp, 1
2488
        jbe     .exit
2489
 
5865 GerdtR 2490
        shl     esi, 5
2491
        cmp     [esi + window_data + WDATA.z_modif], ZPOS_ALWAYS_TOP
2492
        je      .exit
2493
 
5836 GerdtR 2494
        push    eax ;for num layout
2495
        push    edx ecx ebx eax
2496
 
5865 GerdtR 2497
        movsx   eax, byte [esi + window_data + WDATA.z_modif]
5836 GerdtR 2498
        inc     eax
5865 GerdtR 2499
        mov     dword[esp+10h], eax
5836 GerdtR 2500
;--------------------------------------
2501
align 4
2502
.layout:
2503
        mov     esi, 1        ; = num in window stack
2504
        mov     ebp, [TASK_COUNT]
2505
;--------------------------------------
2506
align 4
2507
.next_window:
2508
        movzx   edi, word[WIN_POS + esi * 2]
2509
        shl     edi, 5                  ;size of TASKDATA and WDATA = 32 bytes
2510
 
2511
        cmp     [CURRENT_TASK + edi + TASKDATA.state], TSTATE_FREE
2512
        je      .skip_window
2513
 
2514
        add     edi, window_data
2515
        test    [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
2516
        jnz     .skip_window
2517
 
5865 GerdtR 2518
        mov     eax, [esp+10h]
5836 GerdtR 2519
        cmp     [edi + WDATA.z_modif], al
2520
        jne     .skip_window
2521
 
2522
        mov     eax, [edi + WDATA.box.left]
2523
        cmp     eax, [esp + RECT.right]
2524
        jg      .skip_window
2525
        mov     ebx, [edi + WDATA.box.top]
2526
        cmp     ebx, [esp + RECT.bottom]
2527
        jg      .skip_window
2528
        mov     ecx, [edi + WDATA.box.width]
2529
        add     ecx, eax
2530
        cmp     ecx, [esp + RECT.left]
2531
        jl      .skip_window
2532
        mov     edx, [edi + WDATA.box.height]
2533
        add     edx, ebx
2534
        cmp     edx, [esp + RECT.top]
2535
        jl      .skip_window
2536
 
2537
        cmp     eax, [esp + RECT.left]
2538
        jae     @f
2539
        mov     eax, [esp + RECT.left]
2540
;--------------------------------------
2541
align 4
2542
@@:
2543
        cmp     ebx, [esp + RECT.top]
2544
        jae     @f
2545
        mov     ebx, [esp + RECT.top]
2546
;--------------------------------------
2547
align 4
2548
@@:
2549
        cmp     ecx, [esp + RECT.right]
2550
        jbe     @f
2551
        mov     ecx, [esp + RECT.right]
2552
;--------------------------------------
2553
align 4
2554
@@:
2555
        cmp     edx, [esp + RECT.bottom]
2556
        jbe     @f
2557
        mov     edx, [esp + RECT.bottom]
2558
;--------------------------------------
2559
align 4
2560
@@:
5865 GerdtR 2561
        cmp     dword[esp+32], 0
2562
        je      .set_fl_redraw
2563
 
5836 GerdtR 2564
        push    esi
2565
        movzx   esi, word[WIN_POS + esi * 2]
2566
        call    window._.set_screen
2567
        pop     esi
5865 GerdtR 2568
        jmp     @f
2569
.set_fl_redraw:
5836 GerdtR 2570
        mov     [edi + WDATA.fl_redraw], 1      ;set redraw flag
5865 GerdtR 2571
     @@:
5836 GerdtR 2572
;--------------------------------------
2573
align 4
2574
.skip_window:
2575
        inc     esi
2576
        dec     ebp
2577
        jnz     .next_window
2578
;--------------------------------------
5865 GerdtR 2579
        inc     dword[esp+10h]
2580
        cmp     byte[esp+10h], ZPOS_ALWAYS_TOP
2581
        jle     .layout
5836 GerdtR 2582
;-------------------------------------
2583
 
2584
        pop     eax ebx ecx edx
2585
        pop     ebp     ;del num layout
2586
;-------------------------------------
2587
align 4
2588
.exit:
2589
 
2590
        pop     ebp
2591
        popfd
2592
        pop     esi
2593
 
5865 GerdtR 2594
        add     esp, 4   ;dword for 0/1 - set_screen/fl_redraw
5836 GerdtR 2595
        ret
2596