Subversion Repositories Kolibri OS

Rev

Rev 5867 | Rev 6800 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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