Subversion Repositories Kolibri OS

Rev

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

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