Subversion Repositories Kolibri OS

Rev

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

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