Subversion Repositories Kolibri OS

Rev

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

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