Subversion Repositories Kolibri OS

Rev

Rev 9941 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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