Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2382 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2540 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
2382 hidnplayr 4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
 
2540 hidnplayr 9
$Revision $
2382 hidnplayr 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
2540 hidnplayr 55
;--------------------------------------
56
align 4
57
@@:
2382 hidnplayr 58
        dec     al
59
        jnz     @f
60
 
61
        ; type II - only reserve area, no draw
2540 hidnplayr 62
;        call    sys_window_mouse
63
;        call    [draw_pointer]
64
        call    __sys_draw_pointer
2382 hidnplayr 65
        jmp     .exit
2540 hidnplayr 66
;--------------------------------------
67
align 4
68
@@:
2382 hidnplayr 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)
2540 hidnplayr 77
;--------------------------------------
78
align 4
79
@@:
2382 hidnplayr 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
2540 hidnplayr 88
;--------------------------------------
89
align 4
90
.exit:
2382 hidnplayr 91
        ret
2540 hidnplayr 92
;------------------------------------------------------------------------------
2382 hidnplayr 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]
2540 hidnplayr 141
;--------------------------------------
142
align 4
143
@@:
2382 hidnplayr 144
        ret
2540 hidnplayr 145
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 155
;--------------------------------------
156
align 4
157
.exit:
2382 hidnplayr 158
        ret
2540 hidnplayr 159
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 167
;--------------------------------------
168
align 4
2382 hidnplayr 169
  .exit:
170
        ret
2540 hidnplayr 171
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 182
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 191
;------------------------------------------------------------------------------
2382 hidnplayr 192
align 4
193
syscall_display_settings.04:
194
        mov     eax, [_skinh]
195
        mov     [esp + 32], eax
196
        ret
2540 hidnplayr 197
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 207
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 222
;--------------------------------------
223
align 4
224
@@:
2382 hidnplayr 225
        mov     [screen_workarea.left], eax
226
        cmp     ebx, edi
227
        jle     @f
228
        mov     ebx, edi
2540 hidnplayr 229
;--------------------------------------
230
align 4
231
@@:
2382 hidnplayr 232
        mov     [screen_workarea.right], ebx
2540 hidnplayr 233
;--------------------------------------
234
align 4
235
.check_horizontal:
2382 hidnplayr 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
2540 hidnplayr 246
;--------------------------------------
247
align 4
248
@@:
2382 hidnplayr 249
        mov     [screen_workarea.top], eax
250
        cmp     ebx, edi
251
        jle     @f
252
        mov     ebx, edi
2540 hidnplayr 253
;--------------------------------------
254
align 4
255
@@:
2382 hidnplayr 256
        mov     [screen_workarea.bottom], ebx
2540 hidnplayr 257
;--------------------------------------
258
align 4
259
.check_if_redraw_needed:
2382 hidnplayr 260
        or      esi, esi
261
        jz      .exit
262
 
263
        call    repos_windows
264
        jmp     syscall_display_settings._.calculate_whole_screen
2540 hidnplayr 265
;--------------------------------------
266
align 4
267
.exit:
2382 hidnplayr 268
        ret
2540 hidnplayr 269
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 277
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 288
;--------------------------------------
289
align 4
290
.exit:
2382 hidnplayr 291
        ret
2540 hidnplayr 292
;------------------------------------------------------------------------------
293
align 4
2382 hidnplayr 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
2540 hidnplayr 300
;------------------------------------------------------------------------------
301
align 4
2382 hidnplayr 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
2540 hidnplayr 312
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 330
;--------------------------------------
331
align 4
332
.shape_scale:
2382 hidnplayr 333
        dec     ebx
334
        jnz     .exit
335
        mov     [edi + APPDATA.wnd_shape_scale], ecx
2540 hidnplayr 336
;--------------------------------------
337
align 4
338
.exit:
2382 hidnplayr 339
        ret
2540 hidnplayr 340
;------------------------------------------------------------------------------
2382 hidnplayr 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]
2540 hidnplayr 360
;--------------------------------------
361
align 4
362
@@:
2382 hidnplayr 363
        cmp     ecx, -1
364
        jne     @f
365
        mov     ecx, [edi + WDATA.box.top]
2540 hidnplayr 366
;--------------------------------------
367
align 4
368
@@:
2382 hidnplayr 369
        cmp     edx, -1
370
        jne     @f
371
        mov     edx, [edi + WDATA.box.width]
2540 hidnplayr 372
;--------------------------------------
373
align 4
374
@@:
2382 hidnplayr 375
        cmp     esi, -1
376
        jne     @f
377
        mov     esi, [edi + WDATA.box.height]
2540 hidnplayr 378
;--------------------------------------
379
align 4
380
@@:
2382 hidnplayr 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]
2540 hidnplayr 394
;--------------------------------------
395
align 4
396
.exit:
2382 hidnplayr 397
        ret
2540 hidnplayr 398
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 427
;--------------------------------------
428
align 4
429
.exit_fail:
2382 hidnplayr 430
        xor     eax, eax
431
        inc     eax     ; eax = 1 (fail)
432
        ret
2540 hidnplayr 433
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 444
;--------------------------------------
445
align 4
446
@@:
2382 hidnplayr 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
2540 hidnplayr 457
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 484
;--------------------------------------
485
align 4
486
.next_window:
2382 hidnplayr 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]
2540 hidnplayr 515
;--------------------------------------
516
align 4
517
@@:
2382 hidnplayr 518
        cmp     ebx, [esp + RECT.top]
519
        jae     @f
520
        mov     ebx, [esp + RECT.top]
2540 hidnplayr 521
;--------------------------------------
522
align 4
523
@@:
2382 hidnplayr 524
        cmp     ecx, [esp + RECT.right]
525
        jbe     @f
526
        mov     ecx, [esp + RECT.right]
2540 hidnplayr 527
;--------------------------------------
528
align 4
529
@@:
2382 hidnplayr 530
        cmp     edx, [esp + RECT.bottom]
531
        jbe     @f
532
        mov     edx, [esp + RECT.bottom]
2540 hidnplayr 533
;--------------------------------------
534
align 4
535
@@:
2382 hidnplayr 536
        push    esi
537
        movzx   esi, word[WIN_POS + esi * 2]
538
        call    window._.set_screen
539
        pop     esi
2540 hidnplayr 540
;--------------------------------------
541
align 4
542
.skip_window:
2382 hidnplayr 543
        inc     esi
544
        dec     ebp
545
        jnz     .next_window
546
 
547
        pop     eax ebx ecx edx
2540 hidnplayr 548
;--------------------------------------
549
align 4
550
.exit:
2382 hidnplayr 551
        pop     ebp
2540 hidnplayr 552
        inc     [_display.mask_seqno]
2382 hidnplayr 553
        popfd
554
        pop     esi
555
        ret
2540 hidnplayr 556
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 568
;--------------------------------------
569
align 4
570
.next_window:
2382 hidnplayr 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
2540 hidnplayr 584
;--------------------------------------
585
align 4
586
@@:
2382 hidnplayr 587
        sub     ebx, [edi + WDATA.box.width]
588
        mov     [edi + WDATA.box.left], ebx
2540 hidnplayr 589
;--------------------------------------
590
align 4
591
.fix_vertical:
2382 hidnplayr 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
2540 hidnplayr 601
;--------------------------------------
602
align 4
603
@@:
2382 hidnplayr 604
        sub     ebx, [edi + WDATA.box.height]
605
        mov     [edi + WDATA.box.top], ebx
2540 hidnplayr 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:
2382 hidnplayr 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
2540 hidnplayr 631
        jmp     .fix_client_box
2382 hidnplayr 632
;------------------------------------------------------------------------------
2540 hidnplayr 633
;align 4
2382 hidnplayr 634
;------------------------------------------------------------------------------
2540 hidnplayr 635
;sys_window_mouse: ;////////////////////////////////////////////////////////////
636
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 654
;        ret
655
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 663
;       ?? RR GG BB    ; 0x01000000 negation
664
;                      ; 0x02000000 used for draw_rectangle without top line
665
;                      ;           for example drawwindow_III and drawwindow_IV
2382 hidnplayr 666
;------------------------------------------------------------------------------
667
        push    eax ebx ecx edi
668
 
669
        xor     edi, edi
2540 hidnplayr 670
;--------------------------------------
671
align 4
672
.flags_set:
2382 hidnplayr 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
2540 hidnplayr 682
        test    ecx, 1 shl 25
683
        jnz     @f
684
        sub     ecx, 1 shl 25
685
;        call    [draw_line]
686
        call    __sys_draw_line
687
;--------------------------------------
688
align 4
689
@@:
2382 hidnplayr 690
        ; draw bottom border
691
        mov     ebx, [esp - 2]
692
        pop     bx
2540 hidnplayr 693
;        call    [draw_line]
694
        call    __sys_draw_line
2382 hidnplayr 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
2540 hidnplayr 704
;        call    [draw_line]
705
        call    __sys_draw_line
2382 hidnplayr 706
 
707
        ; draw right border
708
        mov     eax, [esp - 2]
709
        pop     ax
2540 hidnplayr 710
;        call    [draw_line]
711
        call    __sys_draw_line
2382 hidnplayr 712
 
713
        pop     edi ecx ebx eax
714
        ret
2540 hidnplayr 715
;--------------------------------------
716
align 4
717
.forced:
2382 hidnplayr 718
        push    eax ebx ecx edi
719
        xor     edi, edi
720
        inc     edi
721
        jmp     .flags_set
2540 hidnplayr 722
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 741
;--------------------------------------
742
align 4
743
@@:
2382 hidnplayr 744
        push    ebx
745
 
746
        xor     edi, edi
2540 hidnplayr 747
;--------------------------------------
748
align 4
749
.next_line:
2382 hidnplayr 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
2540 hidnplayr 764
;--------------------------------------
765
align 4
766
@@:
2382 hidnplayr 767
        and     ecx, 0x00ffffff
2540 hidnplayr 768
;        call    [draw_line]
769
        call    __sys_draw_line
2382 hidnplayr 770
        inc     edx
771
        cmp     edx, [esp]
772
        jb      .next_line
773
 
774
        add     esp, 4
775
        pop     [esi + WDATA.cl_titlebar]
776
        ret
2540 hidnplayr 777
;------------------------------------------------------------------------------
2382 hidnplayr 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]
2540 hidnplayr 822
;        call    [drawbar]
823
        call    vesa20_drawbar
824
;--------------------------------------
825
align 4
826
.exit:
2382 hidnplayr 827
        popad
828
        ret
2540 hidnplayr 829
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 849
;--------------------------------------
850
align 4
851
@@:
2382 hidnplayr 852
        push    ebx
853
 
854
        xor     edi, edi
2540 hidnplayr 855
;--------------------------------------
856
align 4
857
.next_line:
2382 hidnplayr 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
2540 hidnplayr 870
;--------------------------------------
871
align 4
872
@@:
2382 hidnplayr 873
        test    ecx, 0x80000000
874
        jz      @f
875
        sub     ecx, 0x00040404
2540 hidnplayr 876
;--------------------------------------
877
align 4
878
@@:
2382 hidnplayr 879
        mov     [esi + WDATA.cl_titlebar], ecx
880
        and     ecx, 0x00ffffff
2540 hidnplayr 881
;        call    [draw_line]
882
        call    __sys_draw_line
2382 hidnplayr 883
        inc     edx
884
        cmp     edx, [esp]
885
        jb      .next_line
886
 
887
        add     esp, 4
888
        pop     [esi + WDATA.cl_titlebar]
889
        ret
2540 hidnplayr 890
;------------------------------------------------------------------------------
2382 hidnplayr 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]
2540 hidnplayr 916
;--------------------------------------
917
align 4
918
.next_frame:
2382 hidnplayr 919
        add     eax, 1 * 65536 - 1
920
        add     ebx, 1 * 65536 - 1
921
        call    draw_rectangle
922
        dec     ecx
923
        jnz     .next_frame
924
 
925
        pop     esi
926
        add     eax, 1 * 65536 - 1
927
        add     ebx, 1 * 65536 - 1
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
2540 hidnplayr 956
;        call    [drawbar]
957
        call    vesa20_drawbar
958
;--------------------------------------
959
align 4
960
.exit:
2382 hidnplayr 961
        popad
962
        ret
2540 hidnplayr 963
;------------------------------------------------------------------------------
2382 hidnplayr 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
2540 hidnplayr 1005
        inc     [_display.mask_seqno]
2382 hidnplayr 1006
        popad
1007
 
1008
        ; tell application to redraw itself
1009
        mov     [edi + WDATA.fl_redraw], 1
1010
        xor     eax, eax
1011
        jmp     .exit
2540 hidnplayr 1012
;--------------------------------------
1013
align 4
1014
.do_not_draw:
2382 hidnplayr 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
2540 hidnplayr 1020
;--------------------------------------
1021
align 4
1022
.exit:
2382 hidnplayr 1023
        mov     byte[MOUSE_DOWN], 0
1024
        inc     eax
1025
        ret
2540 hidnplayr 1026
;------------------------------------------------------------------------------
2382 hidnplayr 1027
align 4
1028
;------------------------------------------------------------------------------
1029
minimize_window: ;/////////////////////////////////////////////////////////////
1030
;------------------------------------------------------------------------------
1031
;> eax = window number on screen
1032
;------------------------------------------------------------------------------
1033
;# corrupts [dl*]
1034
;------------------------------------------------------------------------------
1035
        push    edi
1036
        pushfd
1037
        cli
1038
 
1039
        ; is it already minimized?
1040
        movzx   edi, word[WIN_POS + eax * 2]
1041
        shl     edi, 5
1042
        add     edi, window_data
1043
        test    [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
1044
        jnz     .exit
1045
 
1046
        push    eax ebx ecx edx esi
1047
 
1048
        ; no it's not, let's do that
1049
        or      [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
1050
        mov     eax, [edi + WDATA.box.left]
1051
        mov     [draw_limits.left], eax
1052
        mov     ecx, eax
1053
        add     ecx, [edi + WDATA.box.width]
1054
        mov     [draw_limits.right], ecx
1055
        mov     ebx, [edi + WDATA.box.top]
1056
        mov     [draw_limits.top], ebx
1057
        mov     edx, ebx
1058
        add     edx, [edi + WDATA.box.height]
1059
        mov     [draw_limits.bottom], edx
1060
        call    calculatescreen
1061
        xor     esi, esi
1062
        xor     eax, eax
1063
        call    redrawscreen
1064
 
1065
        pop     esi edx ecx ebx eax
2540 hidnplayr 1066
;--------------------------------------
1067
align 4
1068
.exit:
2382 hidnplayr 1069
        popfd
1070
        pop     edi
1071
        ret
2540 hidnplayr 1072
;------------------------------------------------------------------------------
2382 hidnplayr 1073
align 4
1074
;------------------------------------------------------------------------------
1075
restore_minimized_window: ;////////////////////////////////////////////////////
1076
;------------------------------------------------------------------------------
1077
;> eax = window number on screen
1078
;------------------------------------------------------------------------------
1079
;# corrupts [dl*]
1080
;------------------------------------------------------------------------------
1081
        pushad
1082
        pushfd
1083
        cli
1084
 
1085
        ; is it already restored?
1086
        movzx   esi, word[WIN_POS + eax * 2]
1087
        mov     edi, esi
1088
        shl     edi, 5
1089
        add     edi, window_data
1090
        test    [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
1091
        jz      .exit
1092
 
1093
        ; no it's not, let's do that
1094
        mov     [edi + WDATA.fl_redraw], 1
1095
        and     [edi + WDATA.fl_wstate], not WSTATE_MINIMIZED
1096
        mov     ebp, window._.set_screen
1097
        cmp     eax, [TASK_COUNT]
1098
        jz      @f
1099
        mov     ebp, calculatescreen
2540 hidnplayr 1100
;--------------------------------------
1101
align 4
1102
@@:
2382 hidnplayr 1103
        mov     eax, [edi + WDATA.box.left]
1104
        mov     ebx, [edi + WDATA.box.top]
1105
        mov     ecx, [edi + WDATA.box.width]
1106
        mov     edx, [edi + WDATA.box.height]
1107
        add     ecx, eax
1108
        add     edx, ebx
1109
        call    ebp
2540 hidnplayr 1110
        inc     [_display.mask_seqno]
2382 hidnplayr 1111
        mov     byte[MOUSE_BACKGROUND], 0
2540 hidnplayr 1112
;--------------------------------------
1113
align 4
1114
.exit:
2382 hidnplayr 1115
        popfd
1116
        popad
1117
        ret
2540 hidnplayr 1118
;------------------------------------------------------------------------------
2382 hidnplayr 1119
align 4
1120
; TODO: remove this proc
1121
;------------------------------------------------------------------------------
1122
window_check_events: ;/////////////////////////////////////////////////////////
1123
;------------------------------------------------------------------------------
1124
;? 
1125
;------------------------------------------------------------------------------
1126
        ; do we have window minimize/restore request?
1127
        cmp     [window_minimize], 0
1128
        je      .exit
1129
 
1130
        ; okay, minimize or restore top-most window and exit
1131
        mov     eax, [TASK_COUNT]
1132
        mov     bl, 0
1133
        xchg    [window_minimize], bl
1134
        dec     bl
1135
        jnz     @f
1136
        call    minimize_window
1137
        jmp     .exit
2540 hidnplayr 1138
;--------------------------------------
1139
align 4
1140
@@:
2382 hidnplayr 1141
        call    restore_minimized_window
2540 hidnplayr 1142
;--------------------------------------
1143
align 4
1144
.exit:
2382 hidnplayr 1145
        ret
2540 hidnplayr 1146
;------------------------------------------------------------------------------
2382 hidnplayr 1147
align 4
1148
;------------------------------------------------------------------------------
1149
sys_window_maximize_handler: ;/////////////////////////////////////////////////
1150
;------------------------------------------------------------------------------
1151
;? 
1152
;------------------------------------------------------------------------------
1153
;> esi = process slot
1154
;------------------------------------------------------------------------------
1155
        mov     edi, esi
1156
        shl     edi, 5
1157
        add     edi, window_data
1158
 
1159
        ; can window change its height?
1160
        ; only types 2 and 3 can be resized
1161
        mov     dl, [edi + WDATA.fl_wstyle]
1162
        test    dl, 2
1163
        jz      .exit
1164
 
1165
        ; toggle normal/maximized window state
1166
        mov     bl, [edi + WDATA.fl_wstate]
1167
        xor     bl, WSTATE_MAXIMIZED
1168
 
1169
        ; calculate and set appropriate window bounds
1170
        test    bl, WSTATE_MAXIMIZED
1171
        jz      .restore_size
1172
 
1173
        mov     eax, [screen_workarea.left]
1174
        mov     ecx, [screen_workarea.top]
1175
        push    [screen_workarea.bottom] \
1176
                [screen_workarea.right] \
1177
                ecx \
1178
                eax
1179
        sub     [esp + BOX.width], eax
1180
        sub     [esp + BOX.height], ecx
1181
        mov     eax, esp
1182
        jmp     .set_box
2540 hidnplayr 1183
;--------------------------------------
1184
align 4
1185
.restore_size:
2382 hidnplayr 1186
        mov     eax, esi
1187
        shl     eax, 8
1188
        add     eax, SLOT_BASE + APPDATA.saved_box
1189
        push    [eax + BOX.height] \
1190
                [eax + BOX.width] \
1191
                [eax + BOX.top] \
1192
                [eax + BOX.left]
1193
        mov     eax, esp
2540 hidnplayr 1194
;--------------------------------------
1195
align 4
1196
.set_box:
2382 hidnplayr 1197
        test    bl, WSTATE_ROLLEDUP
1198
        jz      @f
1199
 
1200
        xchg    eax, ecx
1201
        call    window._.get_rolledup_height
1202
        mov     [ecx + BOX.height], eax
1203
        xchg    eax, ecx
2540 hidnplayr 1204
;--------------------------------------
1205
align 4
1206
@@:
2382 hidnplayr 1207
        call    window._.set_window_box
1208
        add     esp, sizeof.BOX
2540 hidnplayr 1209
;--------------------------------------
1210
align 4
1211
.exit:
1212
        inc     [_display.mask_seqno]
2382 hidnplayr 1213
        ret
2540 hidnplayr 1214
;------------------------------------------------------------------------------
2382 hidnplayr 1215
align 4
1216
;------------------------------------------------------------------------------
1217
sys_window_rollup_handler: ;///////////////////////////////////////////////////
1218
;------------------------------------------------------------------------------
1219
;? 
1220
;------------------------------------------------------------------------------
1221
;> esi = process slot
1222
;------------------------------------------------------------------------------
1223
        mov     edx, esi
1224
        shl     edx, 8
1225
        add     edx, SLOT_BASE
1226
 
1227
        ; toggle normal/rolled up window state
1228
        mov     bl, [edi + WDATA.fl_wstate]
1229
        xor     bl, WSTATE_ROLLEDUP
1230
 
1231
        ; calculate and set appropriate window bounds
1232
        test    bl, WSTATE_ROLLEDUP
1233
        jz      .restore_size
1234
 
1235
        call    window._.get_rolledup_height
1236
        push    eax \
1237
                [edi + WDATA.box.width] \
1238
                [edi + WDATA.box.top] \
1239
                [edi + WDATA.box.left]
1240
        mov     eax, esp
1241
        jmp     .set_box
2540 hidnplayr 1242
;--------------------------------------
1243
align 4
1244
.restore_size:
2382 hidnplayr 1245
        test    bl, WSTATE_MAXIMIZED
1246
        jnz     @f
1247
        add     esp, -sizeof.BOX
1248
        lea     eax, [edx + APPDATA.saved_box]
1249
        jmp     .set_box
2540 hidnplayr 1250
;--------------------------------------
1251
align 4
1252
@@:
2382 hidnplayr 1253
        mov     eax, [screen_workarea.top]
1254
        push    [screen_workarea.bottom] \
1255
                [edi + WDATA.box.width] \
1256
                eax \
1257
                [edi + WDATA.box.left]
1258
        sub     [esp + BOX.height], eax
1259
        mov     eax, esp
2540 hidnplayr 1260
;--------------------------------------
1261
align 4
1262
.set_box:
2382 hidnplayr 1263
        call    window._.set_window_box
1264
        add     esp, sizeof.BOX
1265
        ret
2540 hidnplayr 1266
;------------------------------------------------------------------------------
2382 hidnplayr 1267
align 4
1268
;------------------------------------------------------------------------------
1269
sys_window_start_moving_handler: ;/////////////////////////////////////////////
1270
;------------------------------------------------------------------------------
1271
;? 
1272
;------------------------------------------------------------------------------
1273
;> eax = old (original) window box
1274
;> esi = process slot
1275
;------------------------------------------------------------------------------
1276
        mov     edi, eax
1277
        call    window._.draw_negative_box
1278
        ret
2540 hidnplayr 1279
;------------------------------------------------------------------------------
2382 hidnplayr 1280
align 4
1281
;------------------------------------------------------------------------------
1282
sys_window_end_moving_handler: ;///////////////////////////////////////////////
1283
;------------------------------------------------------------------------------
1284
;? 
1285
;------------------------------------------------------------------------------
1286
;> eax = old (original) window box
1287
;> ebx = new (final) window box
1288
;> esi = process slot
1289
;------------------------------------------------------------------------------
1290
        mov     edi, ebx
1291
        call    window._.end_moving__box
1292
 
1293
        mov     edi, esi
1294
        shl     edi, 5
1295
        add     edi, window_data
1296
 
1297
        mov     eax, ebx
1298
        mov     bl, [edi + WDATA.fl_wstate]
1299
        call    window._.set_window_box
1300
        ret
2540 hidnplayr 1301
;------------------------------------------------------------------------------
2382 hidnplayr 1302
align 4
1303
;------------------------------------------------------------------------------
1304
sys_window_moving_handler: ;///////////////////////////////////////////////////
1305
;------------------------------------------------------------------------------
1306
;? 
1307
;------------------------------------------------------------------------------
1308
;> eax = old (from previous call) window box
1309
;> ebx = new (current) window box
1310
;> esi = process_slot
1311
;------------------------------------------------------------------------------
1312
        mov     edi, eax
1313
        call    window._.draw_negative_box
1314
        mov     edi, ebx
1315
        call    window._.draw_negative_box
1316
        ret
1317
;==============================================================================
1318
;///// private functions //////////////////////////////////////////////////////
1319
;==============================================================================
1320
 
1321
iglobal
1322
  FuncTable syscall_display_settings, ftable, \
1323
    00, 01, 02, 03, 04, 05, 06, 07, 08
1324
 
1325
  align 4
1326
  window_topleft dd \
1327
    1, 21, \ ;type 0
1328
    0,  0, \ ;type 1
1329
    5, 20, \ ;type 2
1330
    5,  ?, \ ;type 3 {set by skin}
1331
    5,  ?    ;type 4 {set by skin}
1332
endg
1333
 
1334
;uglobal
1335
  ; NOTE: commented out since doesn't provide necessary functionality anyway,
1336
  ;       to be reworked
1337
; new_window_starting       dd ?
1338
;endg
2540 hidnplayr 1339
;------------------------------------------------------------------------------
2382 hidnplayr 1340
align 4
1341
;------------------------------------------------------------------------------
1342
window._.invalidate_screen: ;//////////////////////////////////////////////////
1343
;------------------------------------------------------------------------------
1344
;? 
1345
;------------------------------------------------------------------------------
1346
;> eax = old (original) window box
1347
;> ebx = new (final) window box
1348
;> edi = pointer to WDATA struct
1349
;------------------------------------------------------------------------------
1350
        push    eax ebx
1351
 
1352
        ; TODO: do we really need `draw_limits`?
1353
        ; Yes, they are used by background drawing code.
2540 hidnplayr 1354
 
1355
; we need only to restore the background windows at the old place!
1356
        mov     ecx, [ebx + BOX.left]
2382 hidnplayr 1357
        mov     [draw_limits.left], ecx
2540 hidnplayr 1358
        add     ecx, [ebx + BOX.width]
2382 hidnplayr 1359
        mov     [draw_limits.right], ecx
2540 hidnplayr 1360
        mov     ecx, [ebx + BOX.top]
2382 hidnplayr 1361
        mov     [draw_limits.top], ecx
2540 hidnplayr 1362
        add     ecx, [ebx + BOX.height]
2382 hidnplayr 1363
        mov     [draw_limits.bottom], ecx
2540 hidnplayr 1364
; recalculate screen buffer at old position
2382 hidnplayr 1365
        push    ebx
1366
        mov     edx, [eax + BOX.height]
1367
        mov     ecx, [eax + BOX.width]
1368
        mov     ebx, [eax + BOX.top]
1369
        mov     eax, [eax + BOX.left]
1370
        add     ecx, eax
1371
        add     edx, ebx
1372
        call    calculatescreen
1373
        pop     eax
2540 hidnplayr 1374
; recalculate screen buffer at new position
2382 hidnplayr 1375
        mov     edx, [eax + BOX.height]
1376
        mov     ecx, [eax + BOX.width]
1377
        mov     ebx, [eax + BOX.top]
1378
        mov     eax, [eax + BOX.left]
1379
        add     ecx, eax
1380
        add     edx, ebx
1381
        call    calculatescreen
1382
 
1383
        mov     eax, edi
1384
        call    redrawscreen
1385
 
1386
        ; tell window to redraw itself
1387
        mov     [edi + WDATA.fl_redraw], 1
1388
 
1389
        pop     ebx eax
1390
        ret
2540 hidnplayr 1391
;------------------------------------------------------------------------------
2382 hidnplayr 1392
align 4
1393
;------------------------------------------------------------------------------
1394
window._.set_window_box: ;/////////////////////////////////////////////////////
1395
;------------------------------------------------------------------------------
1396
;? 
1397
;------------------------------------------------------------------------------
1398
;> eax = pointer to BOX struct
1399
;> bl = new window state flags
1400
;> edi = pointer to WDATA struct
1401
;------------------------------------------------------------------------------
1402
        push    eax ebx esi
1403
 
1404
; don't do anything if the new box is identical to the old
1405
        cmp     bl, [edi + WDATA.fl_wstate]
1406
        jnz     @f
1407
        mov     esi, eax
1408
        push    edi
1409
if WDATA.box
1410
        add     edi, WDATA.box
1411
end if
1412
        mov     ecx, 4
1413
        repz cmpsd
1414
        pop     edi
1415
        jz      .exit
2540 hidnplayr 1416
;--------------------------------------
1417
align 4
2382 hidnplayr 1418
@@:
1419
        add     esp, -sizeof.BOX
1420
        mov     ebx, esp
1421
if WDATA.box
1422
        lea     esi, [edi + WDATA.box]
1423
else
1424
        mov     esi, edi ; optimization for WDATA.box = 0
1425
end if
1426
        xchg    eax, esi
1427
        mov     ecx, sizeof.BOX
1428
        call    memmove
1429
        xchg    eax, esi
1430
        xchg    ebx, esi
1431
        call    memmove
1432
        mov     eax, ebx
1433
        mov     ebx, esi
1434
 
1435
        call    window._.check_window_position
1436
        call    window._.set_window_clientbox
1437
        call    window._.invalidate_screen
1438
 
1439
        add     esp, sizeof.BOX
1440
 
1441
        mov     cl, [esp + 4]
1442
        mov     ch, cl
1443
        xchg    cl, [edi + WDATA.fl_wstate]
1444
 
1445
        or      cl, ch
1446
        test    cl, WSTATE_MAXIMIZED
1447
        jnz     .exit
1448
 
1449
        mov     eax, edi
1450
        sub     eax, window_data
1451
        shl     eax, 3
1452
        add     eax, SLOT_BASE
1453
 
1454
        lea     ebx, [edi + WDATA.box]
1455
        xchg    esp, ebx
1456
 
1457
        pop     [eax + APPDATA.saved_box.left] \
1458
                [eax + APPDATA.saved_box.top] \
1459
                [eax + APPDATA.saved_box.width] \
1460
                edx
1461
 
1462
        xchg    esp, ebx
1463
 
1464
        test    ch, WSTATE_ROLLEDUP
1465
        jnz     .exit
1466
 
1467
        mov     [eax + APPDATA.saved_box.height], edx
2540 hidnplayr 1468
;--------------------------------------
1469
align 4
1470
.exit:
2382 hidnplayr 1471
        pop     esi ebx eax
1472
        ret
2540 hidnplayr 1473
;------------------------------------------------------------------------------
2382 hidnplayr 1474
align 4
1475
;------------------------------------------------------------------------------
1476
window._.set_window_clientbox: ;///////////////////////////////////////////////
1477
;------------------------------------------------------------------------------
1478
;? 
1479
;------------------------------------------------------------------------------
1480
;> edi = pointer to WDATA struct
1481
;------------------------------------------------------------------------------
1482
        push    eax ecx edi
1483
 
1484
        mov     eax, [_skinh]
1485
        mov     [window_topleft + 8 * 3 + 4], eax
1486
        mov     [window_topleft + 8 * 4 + 4], eax
1487
 
1488
        mov     ecx, edi
1489
        sub     edi, window_data
1490
        shl     edi, 3
1491
        test    [ecx + WDATA.fl_wstyle], WSTYLE_CLIENTRELATIVE
1492
        jz      .whole_window
1493
 
1494
        movzx   eax, [ecx + WDATA.fl_wstyle]
1495
        and     eax, 0x0F
1496
        mov     eax, [eax * 8 + window_topleft + 0]
1497
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.left], eax
1498
        shl     eax, 1
1499
        neg     eax
1500
        add     eax, [ecx + WDATA.box.width]
1501
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.width], eax
1502
 
1503
        movzx   eax, [ecx + WDATA.fl_wstyle]
1504
        and     eax, 0x0F
1505
        push    [eax * 8 + window_topleft + 0]
1506
        mov     eax, [eax * 8 + window_topleft + 4]
1507
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.top], eax
1508
        neg     eax
1509
        sub     eax, [esp]
1510
        add     eax, [ecx + WDATA.box.height]
1511
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.height], eax
1512
        add     esp, 4
1513
        jmp     .exit
2540 hidnplayr 1514
;--------------------------------------
1515
align 4
1516
.whole_window:
2382 hidnplayr 1517
        xor     eax, eax
1518
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.left], eax
1519
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.top], eax
1520
        mov     eax, [ecx + WDATA.box.width]
1521
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.width], eax
1522
        mov     eax, [ecx + WDATA.box.height]
1523
        mov     [edi + SLOT_BASE + APPDATA.wnd_clientbox.height], eax
2540 hidnplayr 1524
;--------------------------------------
1525
align 4
1526
.exit:
2382 hidnplayr 1527
        pop     edi ecx eax
1528
        ret
2540 hidnplayr 1529
;------------------------------------------------------------------------------
2382 hidnplayr 1530
align 4
1531
;------------------------------------------------------------------------------
1532
window._.sys_set_window: ;/////////////////////////////////////////////////////
1533
;------------------------------------------------------------------------------
1534
;? 
1535
;------------------------------------------------------------------------------
1536
;< edx = pointer to WDATA struct
1537
;------------------------------------------------------------------------------
1538
        mov     eax, [CURRENT_TASK]
1539
        shl     eax, 5
1540
        add     eax, window_data
1541
 
1542
        ; save window colors
1543
        mov     [eax + WDATA.cl_workarea], edx
1544
        mov     [eax + WDATA.cl_titlebar], esi
1545
        mov     [eax + WDATA.cl_frames], edi
1546
 
1547
        mov     edi, eax
1548
 
1549
        ; was it already defined before?
1550
        test    [edi + WDATA.fl_wdrawn], 1
1551
        jnz     .set_client_box
1552
        or      [edi + WDATA.fl_wdrawn], 1
2540 hidnplayr 1553
; After first draw_window we need redraw mouse necessarily!
1554
; Otherwise the user can see cursor specified by f.37.5 from another window.
1555
; He will be really unhappy! He is terrible in rage - usually he throws stones!
1556
        mov     [redrawmouse_unconditional], 1
2382 hidnplayr 1557
        ; NOTE: commented out since doesn't provide necessary functionality
1558
        ;       anyway, to be reworked
1559
;       mov     eax, [timer_ticks] ; [0xfdf0]
1560
;       add     eax, 100
1561
;       mov     [new_window_starting], eax
1562
 
1563
        ; no it wasn't, performing initial window definition
1564
        movzx   eax, bx
1565
        mov     [edi + WDATA.box.width], eax
1566
        movzx   eax, cx
1567
        mov     [edi + WDATA.box.height], eax
1568
        sar     ebx, 16
1569
        sar     ecx, 16
1570
        mov     [edi + WDATA.box.left], ebx
1571
        mov     [edi + WDATA.box.top], ecx
1572
 
1573
        call    window._.check_window_position
1574
 
1575
        push    ecx edi
1576
 
1577
        mov     cl, [edi + WDATA.fl_wstyle]
1578
        mov     eax, [edi + WDATA.cl_frames]
1579
 
1580
        sub     edi, window_data
1581
        shl     edi, 3
1582
        add     edi, SLOT_BASE
1583
 
1584
        and     cl, 0x0F
1585
        cmp     cl, 3
1586
        je      @f
1587
        cmp     cl, 4
1588
        je      @f
1589
 
1590
        xor     eax, eax
2540 hidnplayr 1591
;--------------------------------------
1592
align 4
1593
@@:
2382 hidnplayr 1594
        mov     [edi + APPDATA.wnd_caption], eax
1595
 
1596
        mov     esi, [esp]
1597
        add     edi, APPDATA.saved_box
1598
        movsd
1599
        movsd
1600
        movsd
1601
        movsd
1602
 
1603
        pop     edi ecx
1604
 
1605
        mov     esi, [CURRENT_TASK]
1606
        movzx   esi, word[WIN_STACK + esi * 2]
1607
        lea     esi, [WIN_POS + esi * 2]
1608
        call    waredraw
1609
 
1610
        mov     eax, [edi + WDATA.box.left]
1611
        mov     ebx, [edi + WDATA.box.top]
1612
        mov     ecx, [edi + WDATA.box.width]
1613
        mov     edx, [edi + WDATA.box.height]
1614
        add     ecx, eax
1615
        add     edx, ebx
1616
        call    calculatescreen
1617
 
1618
        mov     byte[KEY_COUNT], 0           ; empty keyboard buffer
1619
        mov     byte[BTN_COUNT], 0           ; empty button buffer
2540 hidnplayr 1620
;--------------------------------------
1621
align 4
1622
.set_client_box:
2382 hidnplayr 1623
        ; update window client box coordinates
1624
        call    window._.set_window_clientbox
1625
 
1626
        ; reset window redraw flag and exit
1627
        mov     [edi + WDATA.fl_redraw], 0
1628
        mov     edx, edi
1629
        ret
2540 hidnplayr 1630
;------------------------------------------------------------------------------
2382 hidnplayr 1631
align 4
1632
;------------------------------------------------------------------------------
1633
window._.check_window_position: ;//////////////////////////////////////////////
1634
;------------------------------------------------------------------------------
1635
;? Check if window is inside screen area
1636
;------------------------------------------------------------------------------
1637
;> edi = pointer to WDATA
1638
;------------------------------------------------------------------------------
1639
        push    eax ebx ecx edx esi
1640
 
1641
        mov     eax, [edi + WDATA.box.left]
1642
        mov     ebx, [edi + WDATA.box.top]
1643
        mov     ecx, [edi + WDATA.box.width]
1644
        mov     edx, [edi + WDATA.box.height]
1645
 
1646
        mov     esi, [Screen_Max_X]
1647
        cmp     ecx, esi
1648
        ja      .fix_width_high
2540 hidnplayr 1649
;--------------------------------------
1650
align 4
1651
.check_left:
2382 hidnplayr 1652
        or      eax, eax
1653
        jl      .fix_left_low
1654
        add     eax, ecx
1655
        cmp     eax, esi
1656
        jg      .fix_left_high
2540 hidnplayr 1657
;--------------------------------------
1658
align 4
1659
.check_height:
2382 hidnplayr 1660
        mov     esi, [Screen_Max_Y]
1661
        cmp     edx, esi
1662
        ja      .fix_height_high
2540 hidnplayr 1663
;--------------------------------------
1664
align 4
1665
.check_top:
2382 hidnplayr 1666
        or      ebx, ebx
1667
        jl      .fix_top_low
1668
        add     ebx, edx
1669
        cmp     ebx, esi
1670
        jg      .fix_top_high
2540 hidnplayr 1671
;--------------------------------------
1672
align 4
1673
.exit:
2382 hidnplayr 1674
        pop     esi edx ecx ebx eax
1675
        ret
2540 hidnplayr 1676
;--------------------------------------
1677
align 4
1678
.fix_width_high:
2382 hidnplayr 1679
        mov     ecx, esi
1680
        mov     [edi + WDATA.box.width], esi
1681
        jmp     .check_left
2540 hidnplayr 1682
;--------------------------------------
1683
align 4
1684
.fix_left_low:
2382 hidnplayr 1685
        xor     eax, eax
1686
        mov     [edi + WDATA.box.left], eax
1687
        jmp     .check_height
2540 hidnplayr 1688
;--------------------------------------
1689
align 4
1690
.fix_left_high:
2382 hidnplayr 1691
        mov     eax, esi
1692
        sub     eax, ecx
1693
        mov     [edi + WDATA.box.left], eax
1694
        jmp     .check_height
2540 hidnplayr 1695
;--------------------------------------
1696
align 4
1697
.fix_height_high:
2382 hidnplayr 1698
        mov     edx, esi
1699
        mov     [edi + WDATA.box.height], esi
1700
        jmp     .check_top
2540 hidnplayr 1701
;--------------------------------------
1702
align 4
1703
.fix_top_low:
2382 hidnplayr 1704
        xor     ebx, ebx
1705
        mov     [edi + WDATA.box.top], ebx
1706
        jmp     .exit
2540 hidnplayr 1707
;--------------------------------------
1708
align 4
1709
.fix_top_high:
2382 hidnplayr 1710
        mov     ebx, esi
1711
        sub     ebx, edx
1712
        mov     [edi + WDATA.box.top], ebx
1713
        jmp     .exit
2540 hidnplayr 1714
;------------------------------------------------------------------------------
2382 hidnplayr 1715
align 4
1716
;------------------------------------------------------------------------------
1717
window._.get_titlebar_height: ;////////////////////////////////////////////////
1718
;------------------------------------------------------------------------------
1719
;? 
1720
;------------------------------------------------------------------------------
1721
;> edi = pointer to WDATA
1722
;------------------------------------------------------------------------------
1723
        mov     al, [edi + WDATA.fl_wstyle]
1724
        and     al, 0x0f
1725
        cmp     al, 0x03
1726
        jne     @f
1727
        mov     eax, [_skinh]
1728
        ret
2540 hidnplayr 1729
;--------------------------------------
1730
align 4
1731
@@:
2382 hidnplayr 1732
        mov     eax, 21
1733
        ret
2540 hidnplayr 1734
;------------------------------------------------------------------------------
2382 hidnplayr 1735
align 4
1736
;------------------------------------------------------------------------------
1737
window._.get_rolledup_height: ;////////////////////////////////////////////////
1738
;------------------------------------------------------------------------------
1739
;? 
1740
;------------------------------------------------------------------------------
1741
;> edi = pointer to WDATA
1742
;------------------------------------------------------------------------------
1743
        mov     al, [edi + WDATA.fl_wstyle]
1744
        and     al, 0x0f
1745
        cmp     al, 0x03
1746
        jb      @f
1747
        mov     eax, [_skinh]
1748
        add     eax, 3
1749
        ret
2540 hidnplayr 1750
;--------------------------------------
1751
align 4
1752
@@:
2382 hidnplayr 1753
        or      al, al
1754
        jnz     @f
1755
        mov     eax, 21
1756
        ret
2540 hidnplayr 1757
;--------------------------------------
1758
align 4
1759
@@:
2382 hidnplayr 1760
        mov     eax, 21 + 2
1761
        ret
2540 hidnplayr 1762
;------------------------------------------------------------------------------
2382 hidnplayr 1763
align 4
1764
;------------------------------------------------------------------------------
1765
window._.set_screen: ;/////////////////////////////////////////////////////////
1766
;------------------------------------------------------------------------------
1767
;? Reserve window area in screen buffer
1768
;------------------------------------------------------------------------------
1769
;> eax = left
1770
;> ebx = top
1771
;> ecx = right
1772
;> edx = bottom
1773
;> esi = process number
1774
;------------------------------------------------------------------------------
1775
virtual at esp
1776
  ff_x     dd ?
1777
  ff_y     dd ?
1778
  ff_width dd ?
1779
  ff_xsz   dd ?
1780
  ff_ysz   dd ?
1781
  ff_scale dd ?
1782
end virtual
1783
 
1784
        pushad
1785
 
1786
        cmp     esi, 1
1787
        jz      .check_for_shaped_window
1788
        mov     edi, esi
1789
        shl     edi, 5
1790
        cmp     [window_data + edi + WDATA.box.width], 0
1791
        jnz     .check_for_shaped_window
1792
        cmp     [window_data + edi + WDATA.box.height], 0
1793
        jz      .exit
2540 hidnplayr 1794
;--------------------------------------
1795
align 4
1796
.check_for_shaped_window:
2382 hidnplayr 1797
        mov     edi, esi
1798
        shl     edi, 8
1799
        add     edi, SLOT_BASE
1800
        cmp     [edi + APPDATA.wnd_shape], 0
1801
        jne     .shaped_window
1802
 
1803
        ; get x&y size
1804
        sub     ecx, eax
1805
        sub     edx, ebx
1806
        inc     ecx
1807
        inc     edx
1808
 
1809
        ; get WinMap start
1810
        push    esi
2540 hidnplayr 1811
;        mov     edi, [Screen_Max_X]
1812
;        inc     edi
1813
;        mov     esi, edi
1814
        mov     esi, [Screen_Max_X]
1815
        inc     esi
1816
;        imul    edi, ebx
1817
        mov     edi, [d_width_calc_area + ebx*4]
1818
 
2382 hidnplayr 1819
        add     edi, eax
1820
        add     edi, [_WinMapAddress]
1821
        pop     eax
1822
        mov     ah, al
1823
        push    ax
1824
        shl     eax, 16
1825
        pop     ax
2540 hidnplayr 1826
;--------------------------------------
1827
align 4
1828
.next_line:
2382 hidnplayr 1829
        push    ecx
1830
        shr     ecx, 2
1831
        rep stosd
1832
        mov     ecx, [esp]
1833
        and     ecx, 3
1834
        rep stosb
1835
        pop     ecx
1836
        add     edi, esi
1837
        sub     edi, ecx
1838
        dec     edx
1839
        jnz     .next_line
1840
 
1841
        jmp     .exit
2540 hidnplayr 1842
;--------------------------------------
1843
align 4
1844
.shaped_window:
2382 hidnplayr 1845
        ;  for (y=0; y <= x_size; y++)
1846
        ;      for (x=0; x <= x_size; x++)
1847
        ;          if (shape[coord(x,y,scale)]==1)
1848
        ;             set_pixel(x, y, process_number);
1849
 
1850
        sub     ecx, eax
1851
        sub     edx, ebx
1852
        inc     ecx
1853
        inc     edx
1854
 
1855
        push    [edi + APPDATA.wnd_shape_scale]  ; push scale first -> for loop
1856
 
1857
        ; get WinMap start  -> ebp
1858
        push    eax
2540 hidnplayr 1859
;        mov     eax, [Screen_Max_X] ; screen_sx
1860
;        inc     eax
1861
;        imul    eax, ebx
1862
        mov     eax, [d_width_calc_area + ebx*4]
1863
 
2382 hidnplayr 1864
        add     eax, [esp]
1865
        add     eax, [_WinMapAddress]
1866
        mov     ebp, eax
1867
 
1868
        mov     edi, [edi + APPDATA.wnd_shape]
1869
        pop     eax
1870
 
1871
        ; eax = x_start
1872
        ; ebx = y_start
1873
        ; ecx = x_size
1874
        ; edx = y_size
1875
        ; esi = process_number
1876
        ; edi = &shape
1877
        ;       [scale]
1878
        push    edx ecx ; for loop - x,y size
1879
 
1880
        mov     ecx, esi
1881
        shl     ecx, 5
1882
        mov     edx, [window_data + ecx + WDATA.box.top]
1883
        push    [window_data + ecx + WDATA.box.width]           ; for loop - width
1884
        mov     ecx, [window_data + ecx + WDATA.box.left]
1885
        sub     ebx, edx
1886
        sub     eax, ecx
1887
        push    ebx eax ; for loop - x,y
1888
 
1889
        add     [ff_xsz], eax
1890
        add     [ff_ysz], ebx
1891
 
1892
        mov     ebx, [ff_y]
2540 hidnplayr 1893
;--------------------------------------
1894
align 4
1895
.ff_new_y:
2382 hidnplayr 1896
        mov     edx, [ff_x]
2540 hidnplayr 1897
;--------------------------------------
1898
align 4
1899
.ff_new_x:
2382 hidnplayr 1900
        ; -- body --
1901
        mov     ecx, [ff_scale]
1902
        mov     eax, [ff_width]
1903
        inc     eax
1904
        shr     eax, cl
1905
        push    ebx edx
1906
        shr     ebx, cl
1907
        shr     edx, cl
1908
        imul    eax, ebx
1909
        add     eax, edx
1910
        pop     edx ebx
1911
        add     eax, edi
1912
        call    .read_byte
1913
        test    al, al
1914
        jz      @f
1915
        mov     eax, esi
1916
        mov     [ebp], al
1917
        ; -- end body --
2540 hidnplayr 1918
;--------------------------------------
1919
align 4
1920
@@:
2382 hidnplayr 1921
        inc     ebp
1922
        inc     edx
1923
        cmp     edx, [ff_xsz]
1924
        jb      .ff_new_x
1925
 
1926
        sub     ebp, [ff_xsz]
1927
        add     ebp, [ff_x]
1928
        add     ebp, [Screen_Max_X]  ; screen.x
1929
        inc     ebp
1930
        inc     ebx
1931
        cmp     ebx, [ff_ysz]
1932
        jb      .ff_new_y
1933
 
1934
        add     esp, 24
2540 hidnplayr 1935
;--------------------------------------
1936
align 4
1937
.exit:
2382 hidnplayr 1938
        popad
2540 hidnplayr 1939
        inc     [_display.mask_seqno]
2382 hidnplayr 1940
        ret
2540 hidnplayr 1941
;--------------------------------------
1942
align 4
1943
.read_byte:
2382 hidnplayr 1944
        ; eax - address
1945
        ; esi - slot
1946
        push    eax ecx edx esi
1947
        xchg    eax, esi
1948
        lea     ecx, [esp + 12]
1949
        mov     edx, 1
1950
        call    read_process_memory
1951
        pop     esi edx ecx eax
1952
        ret
2540 hidnplayr 1953
;------------------------------------------------------------------------------
2382 hidnplayr 1954
align 4
1955
;------------------------------------------------------------------------------
1956
window._.window_activate: ;////////////////////////////////////////////////////
1957
;------------------------------------------------------------------------------
1958
;? Activate window
1959
;------------------------------------------------------------------------------
1960
;> esi = pointer to WIN_POS+ window data
1961
;------------------------------------------------------------------------------
1962
        push    eax ebx
1963
 
1964
        ; if type of current active window is 3 or 4, it must be redrawn
1965
        mov     ebx, [TASK_COUNT]
1966
 
1967
;       DEBUGF  1, "K : TASK_COUNT (0x%x)\n", ebx
1968
 
1969
        movzx   ebx, word[WIN_POS + ebx * 2]
1970
        shl     ebx, 5
1971
        add     eax, window_data
1972
        mov     al, [window_data + ebx + WDATA.fl_wstyle]
1973
        and     al, 0x0f
1974
        cmp     al, 0x03
1975
        je      .set_window_redraw_flag
1976
        cmp     al, 0x04
1977
        jne     .move_others_down
2540 hidnplayr 1978
;--------------------------------------
1979
align 4
1980
.set_window_redraw_flag:
2382 hidnplayr 1981
        mov     [window_data + ebx + WDATA.fl_redraw], 1
2540 hidnplayr 1982
;--------------------------------------
1983
align 4
1984
.move_others_down:
2382 hidnplayr 1985
        ; ax <- process no
1986
        movzx   ebx, word[esi]
1987
        ; ax <- position in window stack
1988
        movzx   ebx, word[WIN_STACK + ebx * 2]
1989
 
1990
        ; drop others
1991
        xor     eax, eax
2540 hidnplayr 1992
;--------------------------------------
1993
align 4
1994
.next_stack_window:
2382 hidnplayr 1995
        cmp     eax, [TASK_COUNT]
1996
        jae     .move_self_up
1997
        inc     eax
1998
 
1999
;       push    ebx
2000
;       xor     ebx,ebx
2001
;       mov     bx,[WIN_STACK + eax * 2]
2002
;       DEBUGF  1, "K : DEC WIN_STACK (0x%x)\n",ebx
2003
;       pop     ebx
2004
 
2005
        cmp     [WIN_STACK + eax * 2], bx
2006
        jbe     .next_stack_window
2007
        dec     word[WIN_STACK + eax * 2]
2008
        jmp     .next_stack_window
2540 hidnplayr 2009
;--------------------------------------
2010
align 4
2011
.move_self_up:
2382 hidnplayr 2012
        movzx   ebx, word[esi]
2013
        ; number of processes
2014
        mov     ax, [TASK_COUNT]
2015
        ; this is the last (and the upper)
2016
        mov     [WIN_STACK + ebx * 2], ax
2017
 
2018
        ; update on screen - window stack
2019
        xor     eax, eax
2540 hidnplayr 2020
;--------------------------------------
2021
align 4
2022
.next_window_pos:
2382 hidnplayr 2023
        cmp     eax, [TASK_COUNT]
2024
        jae     .reset_vars
2025
        inc     eax
2026
        movzx   ebx, word[WIN_STACK + eax * 2]
2027
        mov     [WIN_POS + ebx * 2], ax
2028
        jmp     .next_window_pos
2540 hidnplayr 2029
;--------------------------------------
2030
align 4
2031
.reset_vars:
2382 hidnplayr 2032
        mov     byte[KEY_COUNT], 0
2033
        mov     byte[BTN_COUNT], 0
2034
        mov     word[MOUSE_SCROLL_H], 0
2035
        mov     word[MOUSE_SCROLL_V], 0
2036
 
2037
        pop     ebx eax
2038
        ret
2039
;------------------------------------------------------------------------------
2040
window._.window_deactivate: ;////////////////////////////////////////////////////
2041
;------------------------------------------------------------------------------
2042
;? Deactivate window
2043
;------------------------------------------------------------------------------
2044
;> esi = pointer to WIN_POS+ window data
2045
;------------------------------------------------------------------------------
2046
        push    eax ebx
2540 hidnplayr 2047
;--------------------------------------
2048
align 4
2382 hidnplayr 2049
.move_others_up:
2050
        ; ax <- process no
2051
        movzx   ebx, word[esi]
2052
        ; ax <- position in window stack
2053
        movzx   ebx, word[WIN_STACK + ebx * 2]
2054
        ; up others
2055
        xor     eax, eax
2540 hidnplayr 2056
;--------------------------------------
2057
align 4
2382 hidnplayr 2058
.next_stack_window:
2059
        cmp     eax, [TASK_COUNT]
2060
        jae     .move_self_down
2061
        inc     eax
2062
        cmp     [WIN_STACK + eax * 2], bx
2063
        jae     .next_stack_window
2064
        inc     word[WIN_STACK + eax * 2]
2065
        jmp     .next_stack_window
2540 hidnplayr 2066
;--------------------------------------
2067
align 4
2382 hidnplayr 2068
.move_self_down:
2069
        movzx   ebx, word[esi]
2070
        ; this is the last (and the low)
2071
        mov     [WIN_STACK + ebx * 2], word 1
2072
        ; update on screen - window stack
2073
        xor     eax, eax
2540 hidnplayr 2074
;--------------------------------------
2075
align 4
2382 hidnplayr 2076
.next_window_pos:
2077
        cmp     eax, [TASK_COUNT]
2078
        jae     .reset_vars
2079
        inc     eax
2080
        movzx   ebx, word[WIN_STACK + eax * 2]
2081
        mov     [WIN_POS + ebx * 2], ax
2082
        jmp     .next_window_pos
2540 hidnplayr 2083
;--------------------------------------
2084
align 4
2382 hidnplayr 2085
.reset_vars:
2086
        mov     byte[KEY_COUNT], 0
2087
        mov     byte[BTN_COUNT], 0
2088
        mov     word[MOUSE_SCROLL_H], 0
2089
        mov     word[MOUSE_SCROLL_V], 0
2090
        pop     ebx eax
2091
        ret
2092
;------------------------------------------------------------------------------
2093
align 4
2094
;------------------------------------------------------------------------------
2095
window._.check_window_draw: ;//////////////////////////////////////////////////
2096
;------------------------------------------------------------------------------
2097
;? Check if window is necessary to draw
2098
;------------------------------------------------------------------------------
2099
;> edi = pointer to WDATA
2100
;------------------------------------------------------------------------------
2101
        mov     cl, [edi + WDATA.fl_wstyle]
2102
        and     cl, 0x0f
2103
        cmp     cl, 3
2104
        je      .exit.redraw      ; window type 3
2105
        cmp     cl, 4
2106
        je      .exit.redraw      ; window type 4
2107
 
2108
        push    eax ebx edx esi
2109
 
2110
        mov     eax, edi
2111
        sub     eax, window_data
2112
        shr     eax, 5
2113
 
2114
        movzx   eax, word[WIN_STACK + eax * 2]  ; get value of the curr process
2115
        lea     esi, [WIN_POS + eax * 2]        ; get address of this process at 0xC400
2540 hidnplayr 2116
;--------------------------------------
2117
align 4
2118
.next_window:
2382 hidnplayr 2119
        add     esi, 2
2120
 
2121
        mov     eax, [TASK_COUNT]
2122
        lea     eax, word[WIN_POS + eax * 2] ; number of the upper window
2123
 
2124
        cmp     esi, eax
2125
        ja      .exit.no_redraw
2126
 
2127
        movzx   edx, word[esi]
2128
        shl     edx, 5
2129
        cmp     [CURRENT_TASK + edx + TASKDATA.state], TSTATE_FREE
2130
        je      .next_window
2131
 
2132
        mov     eax, [edi + WDATA.box.top]
2133
        mov     ebx, [edi + WDATA.box.height]
2134
        add     ebx, eax
2135
 
2136
        mov     ecx, [window_data + edx + WDATA.box.top]
2137
        cmp     ecx, ebx
2138
        jge     .next_window
2139
        add     ecx, [window_data + edx + WDATA.box.height]
2140
        cmp     eax, ecx
2141
        jge     .next_window
2142
 
2143
        mov     eax, [edi + WDATA.box.left]
2144
        mov     ebx, [edi + WDATA.box.width]
2145
        add     ebx, eax
2146
 
2147
        mov     ecx, [window_data + edx + WDATA.box.left]
2148
        cmp     ecx, ebx
2149
        jge     .next_window
2150
        add     ecx, [window_data + edx + WDATA.box.width]
2151
        cmp     eax, ecx
2152
        jge     .next_window
2153
 
2154
        pop     esi edx ebx eax
2540 hidnplayr 2155
;--------------------------------------
2156
align 4
2157
.exit.redraw:
2382 hidnplayr 2158
        xor     ecx, ecx
2159
        inc     ecx
2160
        ret
2540 hidnplayr 2161
;--------------------------------------
2162
align 4
2163
.exit.no_redraw:
2382 hidnplayr 2164
        pop     esi edx ebx eax
2165
        xor     ecx, ecx
2166
        ret
2540 hidnplayr 2167
;------------------------------------------------------------------------------
2382 hidnplayr 2168
align 4
2169
;------------------------------------------------------------------------------
2170
window._.draw_window_caption: ;////////////////////////////////////////////////
2171
;------------------------------------------------------------------------------
2172
;? 
2173
;------------------------------------------------------------------------------
2174
        xor     eax, eax
2175
        mov     edx, [TASK_COUNT]
2176
        movzx   edx, word[WIN_POS + edx * 2]
2177
        cmp     edx, [CURRENT_TASK]
2178
        jne     @f
2179
        inc     eax
2540 hidnplayr 2180
;--------------------------------------
2181
align 4
2182
@@:
2382 hidnplayr 2183
        mov     edx, [CURRENT_TASK]
2184
        shl     edx, 5
2185
        add     edx, window_data
2186
        movzx   ebx, [edx + WDATA.fl_wstyle]
2187
        and     bl, 0x0F
2188
        cmp     bl, 3
2189
        je      .draw_caption_style_3
2190
        cmp     bl, 4
2191
        je      .draw_caption_style_3
2192
 
2193
        jmp     .not_style_3
2540 hidnplayr 2194
;--------------------------------------
2195
align 4
2196
.draw_caption_style_3:
2382 hidnplayr 2197
        push    edx
2198
        call    drawwindow_IV_caption
2199
        add     esp, 4
2200
        jmp     .2
2540 hidnplayr 2201
;--------------------------------------
2202
align 4
2203
.not_style_3:
2382 hidnplayr 2204
        cmp     bl, 2
2205
        jne     .not_style_2
2206
 
2207
        call    drawwindow_III_caption
2208
        jmp     .2
2540 hidnplayr 2209
;--------------------------------------
2210
align 4
2211
.not_style_2:
2382 hidnplayr 2212
        cmp     bl, 0
2213
        jne     .2
2214
 
2215
        call    drawwindow_I_caption
2540 hidnplayr 2216
;--------------------------------------
2217
align 4
2218
.2:
2382 hidnplayr 2219
        mov     edi, [CURRENT_TASK]
2220
        shl     edi, 5
2221
        test    [edi + window_data + WDATA.fl_wstyle], WSTYLE_HASCAPTION
2222
        jz      .exit
2223
        mov     edx, [edi * 8 + SLOT_BASE + APPDATA.wnd_caption]
2224
        or      edx, edx
2225
        jz      .exit
2226
 
2227
        movzx   eax, [edi + window_data + WDATA.fl_wstyle]
2228
        and     al, 0x0F
2229
        cmp     al, 3
2230
        je      .skinned
2231
        cmp     al, 4
2232
        je      .skinned
2233
 
2234
        jmp     .not_skinned
2540 hidnplayr 2235
;--------------------------------------
2236
align 4
2237
.skinned:
2382 hidnplayr 2238
        mov     ebp, [edi + window_data + WDATA.box.left - 2]
2239
        mov     bp, word[edi + window_data + WDATA.box.top]
2240
        movzx   eax, word[edi + window_data + WDATA.box.width]
2241
        sub     ax, [_skinmargins.left]
2242
        sub     ax, [_skinmargins.right]
2243
        push    edx
2244
        cwde
2245
        cdq
2246
        mov     ebx, 6
2247
        idiv    ebx
2248
        pop     edx
2249
        or      eax, eax
2250
        js      .exit
2251
 
2252
        mov     esi, eax
2253
        mov     ebx, dword[_skinmargins.left - 2]
2254
        mov     bx, word[_skinh]
2255
        sub     bx, [_skinmargins.bottom]
2256
        sub     bx, [_skinmargins.top]
2257
        sar     bx, 1
2258
        adc     bx, 0
2259
        add     bx, [_skinmargins.top]
2260
        add     bx, -3
2261
        add     ebx, ebp
2262
        jmp     .dodraw
2540 hidnplayr 2263
;--------------------------------------
2264
align 4
2265
.not_skinned:
2382 hidnplayr 2266
        cmp     al, 1
2267
        je      .exit
2268
 
2269
        mov     ebp, [edi + window_data + WDATA.box.left - 2]
2270
        mov     bp, word[edi + window_data + WDATA.box.top]
2271
        movzx   eax, word[edi + window_data + WDATA.box.width]
2272
        sub     eax, 16
2273
        push    edx
2274
        cwde
2275
        cdq
2276
        mov     ebx, 6
2277
        idiv    ebx
2278
        pop     edx
2279
        or      eax, eax
2280
        js      .exit
2281
 
2282
        mov     esi, eax
2283
        mov     ebx, 0x00080007
2284
        add     ebx, ebp
2540 hidnplayr 2285
;--------------------------------------
2286
align 4
2287
.dodraw:
2382 hidnplayr 2288
        mov     ecx, [common_colours + 16]
2289
        or      ecx, 0x80000000
2290
        xor     edi, edi
2291
        call    dtext_asciiz_esi
2540 hidnplayr 2292
;--------------------------------------
2293
align 4
2294
.exit:
2295
;        call    [draw_pointer]
2296
        call    __sys_draw_pointer
2382 hidnplayr 2297
        ret
2540 hidnplayr 2298
;------------------------------------------------------------------------------
2382 hidnplayr 2299
align 4
2300
;------------------------------------------------------------------------------
2301
window._.draw_negative_box: ;//////////////////////////////////////////////////
2302
;------------------------------------------------------------------------------
2303
;? Draw negative box
2304
;------------------------------------------------------------------------------
2305
;> edi = pointer to BOX struct
2306
;------------------------------------------------------------------------------
2307
        push    eax ebx esi
2308
        mov     esi, 0x01000000
2540 hidnplayr 2309
;--------------------------------------
2310
align 4
2382 hidnplayr 2311
.1:
2312
        mov     eax, [edi + BOX.left - 2]
2313
        mov     ax, word[edi + BOX.left]
2314
        add     ax, word[edi + BOX.width]
2315
        mov     ebx, [edi + BOX.top - 2]
2316
        mov     bx, word[edi + BOX.top]
2317
        add     bx, word[edi + BOX.height]
2318
        call    draw_rectangle.forced
2319
        pop     esi ebx eax
2320
        ret
2321
;------------------------------------------------------------------------------
2540 hidnplayr 2322
align 4
2323
;------------------------------------------------------------------------------
2382 hidnplayr 2324
window._.end_moving__box: ;//////////////////////////////////////////////////
2325
;------------------------------------------------------------------------------
2326
;? Draw positive box
2327
;------------------------------------------------------------------------------
2328
;> edi = pointer to BOX struct
2329
;------------------------------------------------------------------------------
2330
        push    eax ebx esi
2331
        xor     esi, esi
2332
        jmp     window._.draw_negative_box.1
2333
;------------------------------------------------------------------------------
2540 hidnplayr 2334
align 4
2335
;------------------------------------------------------------------------------
2382 hidnplayr 2336
window._.get_rect: ;/////////////////////////////////////////////////////
2337
;------------------------------------------------------------------------------
2338
;?   void __fastcall get_window_rect(struct RECT* rc);
2339
;------------------------------------------------------------------------------
2340
;> ecx = pointer to RECT
2341
;------------------------------------------------------------------------------
2342
        mov     eax, [TASK_BASE]
2343
 
2344
        mov     edx, [eax-twdw + WDATA.box.left]
2345
        mov     [ecx+RECT.left], edx
2346
 
2347
        add     edx, [eax-twdw + WDATA.box.width]
2348
        mov     [ecx+RECT.right], edx
2349
 
2350
        mov     edx, [eax-twdw + WDATA.box.top]
2351
        mov     [ecx+RECT.top], edx
2352
 
2353
        add     edx, [eax-twdw + WDATA.box.height]
2354
        mov     [ecx+RECT.bottom], edx
2355
        ret
2540 hidnplayr 2356
;------------------------------------------------------------------------------