Subversion Repositories Kolibri OS

Rev

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

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