Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2008. 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. $Revision: 986 $
  9.  
  10.  
  11. get_titlebar_height: ; edi = window draw_data pointer
  12.         mov     al,[edi+WDATA.fl_wstyle]
  13.         and     al,0x0F
  14.         cmp     al,0x03
  15.         jne     @f
  16.         mov     eax,[_skinh]
  17.         ret
  18.     @@: mov     eax,21
  19.         ret
  20.  
  21. get_rolledup_height: ; edi = window draw_data pointer
  22.         mov     al,[edi+WDATA.fl_wstyle]
  23.         and     al,0x0F
  24.         cmp     al,0x03
  25.         jb      @f
  26.         mov     eax,[_skinh]
  27.         add     eax,3
  28.         ret
  29.     @@: or      al,al
  30.         jnz     @f
  31.         mov     eax,21
  32.         ret
  33.     @@: mov     eax,21+2
  34.         ret
  35.  
  36.  
  37. setwindowdefaults:
  38.         pushad
  39.  
  40.         xor   eax,eax
  41.         mov   ecx,WIN_STACK
  42.        @@:
  43.         inc   eax
  44.         add   ecx,2
  45.         mov   [ecx+0x000],ax          ; process no
  46.         mov   [ecx+0x400],ax          ; positions in stack
  47.         cmp   ecx,WIN_POS-2            ; the more high, the more surface
  48.         jnz   @b
  49.  
  50.         popad
  51.         ret
  52.  
  53.  
  54.  
  55. ; eax = cx
  56. ; ebx = cy
  57. ; ecx = ex
  58. ; edx = ey
  59. ; èäåÿ: ïåðåáðàòü âñå îêíà, íà÷èíàÿ ñ ñàìîãî íèæíåãî,
  60. ;       è äëÿ ïîïàâøèõ â çàäàííóþ îáëàñòü
  61. ;       ÷àñòåé îêîí âûçâàòü setscreen
  62. align 4
  63. calculatescreen:
  64.         pushad
  65.         pushfd
  66.         cli
  67.  
  68.         push    edx ecx ebx eax
  69.  
  70.         mov     esi, 1
  71.         call    setscreen
  72.  
  73.         mov     ebp, [TASK_COUNT]        ; number of processes
  74.         cmp     ebp, 1
  75.         jbe     .finish
  76.         align 4
  77.       .new_wnd:
  78.         movzx   edi, word [WIN_POS + esi * 2]
  79.         shl     edi, 5
  80.  
  81.         cmp     [CURRENT_TASK+edi+TASKDATA.state], byte 9
  82.         je      .not_wnd
  83.  
  84.         add     edi, window_data
  85.         test    [edi+WDATA.fl_wstate], WSTATE_MINIMIZED
  86.         jnz     .not_wnd
  87.  
  88.         mov     eax,[edi+WDATA.box.left]
  89.         cmp     eax, [esp+RECT.right]
  90.         ja      .out_of_bounds
  91.         mov     ebx,[edi+WDATA.box.top]
  92.         cmp     ebx, [esp+RECT.bottom]
  93.         ja      .out_of_bounds
  94.         mov     ecx,[edi+WDATA.box.width]
  95.         add     ecx, eax
  96.         cmp     ecx, [esp+RECT.left]
  97.         jb      .out_of_bounds
  98.         mov     edx,[edi+WDATA.box.height]
  99.         add     edx, ebx
  100.         cmp     edx, [esp+RECT.top]
  101.         jb      .out_of_bounds
  102.  
  103.     cmp     eax, [esp+RECT.left]
  104.         jae     @f
  105.         mov     eax, [esp+RECT.left]
  106.      @@:
  107.     cmp     ebx, [esp+RECT.top]
  108.         jae     @f
  109.         mov     ebx, [esp+RECT.top]
  110.      @@:
  111.     cmp     ecx, [esp+RECT.right]
  112.         jbe     @f
  113.         mov     ecx, [esp+RECT.right]
  114.      @@:
  115.     cmp     edx, [esp+RECT.bottom]
  116.         jbe     @f
  117.         mov     edx, [esp+RECT.bottom]
  118.      @@:
  119.  
  120.         push    esi
  121.         movzx   esi, word [WIN_POS + esi * 2]
  122.         call    setscreen
  123.         pop     esi
  124.  
  125.       .not_wnd:
  126.       .out_of_bounds:
  127.         inc     esi
  128.         dec     ebp
  129.         jnz     .new_wnd
  130.       .finish:
  131.  
  132.     pop     eax ebx ecx edx
  133.  
  134.         popfd
  135.         popad
  136. ret
  137.  
  138.  
  139.  
  140. virtual at esp
  141.   ff_x     dd ?
  142.   ff_y     dd ?
  143.   ff_width dd ?
  144.   ff_xsz   dd ?
  145.   ff_ysz   dd ?
  146.   ff_scale dd ?
  147. end virtual
  148.  
  149. align 4
  150. ; ðåçåðâèðóåò ìåñòî ïîä îêíî çàäàííîãî ïðîöåññà
  151. setscreen:
  152. ;  eax  x start
  153. ;  ebx  y start
  154. ;  ecx  x end
  155. ;  edx  y end
  156. ;  esi  process number
  157. pushad
  158. ; \begin{diamond}[29.08.2006]
  159.         cmp     esi, 1
  160.         jz      @f
  161.         mov     edi, esi
  162.         shl     edi, 5
  163.         cmp     [edi+window_data+WDATA.box.width], 0
  164.         jnz     @f
  165.         cmp     [edi+window_data+WDATA.box.height], 0
  166.         jz      .ret
  167. @@:
  168. ; \end{diamond}[29.08.2006]
  169.         mov edi, esi ;;;word [esi*2+WIN_POS]
  170.         shl   edi, 8
  171.         add   edi, SLOT_BASE  ; address of random shaped window area
  172.         cmp   [edi+APPDATA.wnd_shape], dword 0
  173.         jne   .free_form
  174.  
  175.         ; get x&y size
  176.         sub   ecx, eax
  177.         sub   edx, ebx
  178.         inc   ecx
  179.         inc   edx
  180.  
  181.         ; get WinMap start
  182.         mov   edi, [Screen_Max_X] ; screen_sx
  183.         inc   edi
  184.         imul  edi, ebx
  185.         add   edi, eax
  186.         add   edi, WinMapAddress
  187.  
  188.   .new_y:
  189.         push  ecx ; sx
  190.         push  edx
  191.  
  192.         mov   edx, esi
  193.         align 4
  194.   .new_x:
  195.         mov   byte [edi], dl
  196.         inc   edi
  197.         dec   ecx
  198.         jnz   .new_x
  199.  
  200.         pop   edx
  201.         pop   ecx
  202.         add   edi, [Screen_Max_X]
  203.         inc   edi
  204.         sub   edi, ecx
  205.         dec   edx
  206.         jnz   .new_y
  207. .ret:
  208.  popad
  209.  ret
  210.   .read_byte:
  211.    ;eax - address
  212.    ;esi - slot
  213.         push  eax
  214.         push  ebx
  215.         push  ecx
  216.         push  edx
  217.         mov   edx,eax
  218.         mov   eax,esi
  219.         lea   ebx,[esp+12]
  220.         mov   ecx,1
  221.         call  read_process_memory
  222.         pop   edx
  223.         pop   ecx
  224.         pop   ebx
  225.         pop   eax
  226.         ret
  227.   .free_form:
  228.  
  229.         ;  for (y=0; y <= x_size; y++)
  230.         ;      for (x=0; x <= x_size; x++)
  231.         ;          if (shape[coord(x,y,scale)]==1)
  232.         ;             set_pixel(x, y, process_number);
  233.  
  234.         sub  ecx, eax
  235.         sub  edx, ebx
  236.         inc  ecx
  237.         inc  edx
  238.  
  239.         push  dword [edi+APPDATA.wnd_shape_scale]  ; push scale first -> for loop
  240.  
  241.         ; get WinMap start  -> ebp
  242.         push  eax
  243.         mov   eax, [Screen_Max_X] ; screen_sx
  244.         inc   eax
  245.         imul  eax, ebx
  246.         add   eax, [esp]
  247.         add   eax, WinMapAddress
  248.         mov   ebp, eax
  249.  
  250.         mov   edi, [edi+APPDATA.wnd_shape]
  251.         pop   eax
  252.  
  253.         ; eax = x_start
  254.         ; ebx = y_start
  255.         ; ecx = x_size
  256.         ; edx = y_size
  257.         ; esi = process_number
  258.         ; edi = &shape
  259.         ;       [scale]
  260.         push edx ecx ; for loop - x,y size
  261.  
  262.         mov  ecx, esi
  263.         shl  ecx, 5
  264.         mov  edx, [window_data+ecx+WDATA.box.top]
  265.         push [window_data+ecx+WDATA.box.width]      ; for loop - width
  266.         mov  ecx, [window_data+ecx+WDATA.box.left]
  267.         sub  ebx, edx
  268.         sub  eax, ecx
  269.         push ebx eax ; for loop - x,y
  270.  
  271.         add  [ff_xsz], eax
  272.         add  [ff_ysz], ebx
  273.  
  274.         mov  ebx, [ff_y]
  275.  
  276.       .ff_new_y:
  277.         mov  edx, [ff_x]
  278.  
  279.       .ff_new_x:
  280.         ; -- body --
  281.         mov  ecx, [ff_scale]
  282.         mov  eax, [ff_width]
  283.         inc  eax
  284.         shr  eax, cl
  285.         push ebx edx
  286.         shr  ebx, cl
  287.         shr  edx, cl
  288.         imul eax, ebx
  289.         add  eax, edx
  290.         pop  edx ebx
  291.         add  eax, edi
  292.         call .read_byte
  293.         test al,al
  294.         jz   @f
  295.         mov  eax, esi
  296.         mov  [ebp], al
  297.        @@:
  298.         ; -- end body --
  299.         inc  ebp
  300.         inc  edx
  301.         cmp  edx, [ff_xsz]
  302.         jb   .ff_new_x
  303.         sub  ebp, [ff_xsz]
  304.         add  ebp, [ff_x]
  305.         add  ebp, [Screen_Max_X]  ; screen.x
  306.         inc  ebp
  307.         inc  ebx
  308.         cmp  ebx, [ff_ysz]
  309.         jb   .ff_new_y
  310.  
  311.         add  esp, 24
  312. popad
  313. ret
  314.  
  315.  
  316. display_settings:
  317.  
  318. ;    eax = 0         ; DISPLAY redraw
  319. ;          ebx = 0   ; all
  320. ;
  321. ;    eax = 1         ; BUTTON type
  322. ;          ebx = 0   ; flat
  323. ;          ebx = 1   ; 3D
  324. ;    eax = 2         ; set WINDOW colours
  325. ;          ebx = pointer to table
  326. ;          ecx = number of bytes define
  327. ;    eax = 3         ; get WINDOW colours
  328. ;          ebx = pointer to table
  329. ;          ecx = number of bytes wanted
  330. ;    eax = 4         ; get skin height
  331. ;          input  : nothing
  332. ;          output : eax = skin height in pixel
  333. ;    eax = 5         ; get screen workarea
  334. ;          input  : nothing
  335. ;          output : eax = [left]*65536+[right]
  336. ;                   ebx = [top]*65536+[bottom]
  337. ;    eax = 6         ; set screen workarea
  338. ;          input  : ecx = [left]*65536+[right]
  339. ;                   edx = [top]*65536+[bottom]
  340. ;          output : nothing
  341. ;    eax = 7         ; get skin margins
  342. ;          input  : nothing
  343. ;          output : eax = [left]*65536+[right]
  344. ;                   ebx = [top]*65536+[bottom]
  345. ;    eax = 8         ; set window skin
  346. ;          input  : ecx = pointer to file info block
  347. ;          output : eax = FS error code
  348.  
  349.  
  350.      pushad
  351.  
  352.      test eax, eax      ; redraw display
  353.      jnz  dspl0
  354.      test ebx, ebx
  355.      jnz  dspl0
  356.      cmp  [windowtypechanged],dword 1
  357.      jne  dspl00
  358.      mov  [windowtypechanged],dword 0
  359.   redraw_screen_direct:
  360.      mov  [dlx],dword 0
  361.      mov  [dly],dword 0
  362.      mov  eax,[Screen_Max_X]
  363.      mov  [dlxe],eax
  364.      mov  eax,[Screen_Max_Y]
  365.      mov  [dlye],eax
  366.      mov  eax,window_data
  367.      call redrawscreen
  368.    dspl00:
  369.      popad
  370.      ret
  371.    dspl0:
  372.  
  373.      cmp  eax,1       ; button type
  374.      jne  dspl1
  375.      and  ebx,1
  376.      cmp  ebx,[buttontype]
  377.      je   dspl9
  378.      mov  [buttontype],ebx
  379.      mov  [windowtypechanged],dword 1
  380.     dspl9:
  381.      popad
  382.      ret
  383.    dspl1:
  384.  
  385.      cmp  eax,2       ; set common window colours
  386.      jne  no_com_colours
  387.      mov  [windowtypechanged],dword 1
  388.      mov  esi,[TASK_BASE]
  389.      add  esi,TASKDATA.mem_start
  390.      add  ebx,[esi]
  391.      mov  esi,ebx
  392.      mov  edi,common_colours
  393.      and  ecx,127
  394.      cld
  395.      rep  movsb
  396.      popad
  397.      ret
  398.    no_com_colours:
  399.  
  400.      cmp  eax,3       ; get common window colours
  401.      jne  no_get_com
  402.      mov  esi,[TASK_BASE]
  403.      add  esi,TASKDATA.mem_start
  404.      add  ebx,[esi]
  405.      mov  edi,ebx
  406.      mov  esi,common_colours
  407.      and  ecx,127
  408.      cld
  409.      rep  movsb
  410.      popad
  411.      ret
  412.    no_get_com:
  413.  
  414.      cmp  eax,4       ; get skin height
  415.      jne  no_skin_height
  416.      popad
  417.      mov  eax,[_skinh]
  418.      mov  [esp+36],eax
  419.      ret
  420.    no_skin_height:
  421.  
  422.         cmp     eax,5       ; get screen workarea
  423.         jne     no_get_workarea
  424.         popad
  425.         mov     eax,[screen_workarea.left-2]
  426.         mov     ax,word[screen_workarea.right]
  427.         mov     [esp+36],eax
  428.         mov     eax,[screen_workarea.top-2]
  429.         mov     ax,word[screen_workarea.bottom]
  430.         mov     [esp+24],eax
  431.         ret
  432.    no_get_workarea:
  433.  
  434.         cmp     eax,6       ; set screen workarea
  435.         jne     no_set_workarea
  436.         movsx   eax,word[esp+16+2]
  437.         movsx   ebx,word[esp+16]
  438.         cmp     eax,ebx
  439.         jge     .lp1
  440.         or      eax,eax;[Screen_Max_X]
  441.         jl      @f
  442.         mov     [screen_workarea.left],eax
  443.     @@: cmp     ebx,[Screen_Max_X]
  444.         jg      .lp1
  445.         mov     [screen_workarea.right],ebx
  446.   .lp1: movsx   eax,word[esp+24+2]
  447.         movsx   ebx,word[esp+24]
  448.         cmp     eax,ebx
  449.         jge     .lp2
  450.         or      eax,eax;[0xFE04]
  451.         jl      @f
  452.         mov     [screen_workarea.top],eax
  453.     @@: cmp     ebx,[Screen_Max_Y]
  454.         jg      .lp2
  455.         mov     [screen_workarea.bottom],ebx
  456.   .lp2: call    repos_windows
  457.         mov     eax, 0
  458.         mov     ebx, 0
  459.         mov     ecx, [Screen_Max_X]
  460.         mov     edx, [Screen_Max_Y]
  461.     call    calculatescreen
  462. ;    jmp    redraw_screen_direct
  463.     .exit:
  464.         popad
  465.         ret
  466.    no_set_workarea:
  467.  
  468.         cmp     eax,7       ; get skin margins
  469.         jne     no_get_skinmargins
  470.         popad
  471.         mov     eax,dword[_skinmargins+0]
  472.         mov     [esp+36],eax
  473.         mov     eax,dword[_skinmargins+4]
  474.         mov     [esp+24],eax
  475.         ret
  476.    no_get_skinmargins:
  477.  
  478.         cmp     eax,8       ; set window skin
  479.         jne     no_set_skin
  480.         call    read_skin_file
  481.         mov     [esp+32+36], eax
  482.         test    eax, eax
  483.         jnz     .ret
  484.         xor     eax, eax
  485.         xor     ebx, ebx
  486.         mov     ecx, [Screen_Max_X]
  487.         mov     edx, [Screen_Max_Y]
  488.         call    calculatescreen
  489.         jmp     redraw_screen_direct
  490. .ret:
  491.         popad
  492.         ret
  493.    no_set_skin:
  494.  
  495.      popad
  496.      ret
  497.  
  498.  
  499. repos_windows:
  500.         mov     ecx,[TASK_COUNT]
  501.         mov     edi, OS_BASE+0x20*2
  502.         call    force_redraw_background
  503.         dec     ecx
  504.         jge    @f
  505.         ret
  506.     @@: mov     [edi+WDATA.fl_redraw],1
  507.         test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
  508.         jz      .lp2
  509.         mov     eax,[screen_workarea.left]
  510.         mov     [edi+WDATA.box.left],eax
  511.         sub     eax,[screen_workarea.right]
  512.         neg     eax
  513.         mov     [edi+WDATA.box.width],eax
  514.         mov     eax,[screen_workarea.top]
  515.         mov     [edi+WDATA.box.top],eax
  516.         test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
  517.         jnz     .lp1
  518.         sub     eax,[screen_workarea.bottom]
  519.         neg     eax
  520.         mov     [edi+WDATA.box.height],eax
  521.   .lp1:
  522.  
  523.         call    set_window_clientbox
  524.         add     edi,0x20
  525.         loop    @b
  526.         ret
  527.   .lp2: mov     eax,[edi+WDATA.box.left]
  528.         add     eax,[edi+WDATA.box.width]
  529.     mov    ebx,[Screen_Max_X]
  530. ;    inc    ebx
  531.     cmp    eax,ebx
  532.     jle    .lp4
  533.         mov     eax,[edi+WDATA.box.width]
  534.     sub    eax,ebx
  535.     jle    .lp3
  536.         mov     [edi+WDATA.box.width],ebx
  537.   .lp3: sub     ebx,[edi+WDATA.box.width]
  538.         mov     [edi+WDATA.box.left],ebx
  539.   .lp4: mov     eax,[edi+WDATA.box.top]
  540.         add     eax,[edi+WDATA.box.height]
  541.     mov    ebx,[Screen_Max_Y]
  542. ;    inc    ebx
  543.     cmp    eax,ebx
  544.     jle    .lp6
  545.         mov     eax,[edi+WDATA.box.height]
  546.     sub    eax,ebx
  547.     jle    .lp5
  548.         mov     [edi+WDATA.box.height],ebx
  549.   .lp5: sub     ebx,[edi+WDATA.box.height]
  550.         mov     [edi+WDATA.box.top],ebx
  551.   .lp6: jmp     .lp1
  552.  
  553. uglobal
  554.   common_colours:
  555.      times 128 db 0x0
  556. endg
  557.  
  558.  
  559.  
  560.  
  561. check_window_position:
  562.  
  563.     pushad                           ; window inside screen ?
  564.  
  565.     mov   eax, [edi+WDATA.box.left]
  566.     mov   ebx, [edi+WDATA.box.top]
  567.     mov   ecx, [edi+WDATA.box.width]
  568.     mov   edx, [edi+WDATA.box.height]
  569.  
  570.     cmp   ecx,[Screen_Max_X]          ; check x size
  571.     jbe   x_size_ok
  572.     mov   ecx,[Screen_Max_X]
  573.     mov   [edi+WDATA.box.width],ecx
  574.  
  575.   x_size_ok:
  576.  
  577.     cmp   edx,[Screen_Max_Y]          ; check y size
  578.     jbe   y_size_ok
  579.     mov   edx,[Screen_Max_Y]
  580.     mov   [edi+WDATA.box.height],edx
  581.  
  582.   y_size_ok:
  583.  
  584.     cmp   eax,0       ; check x pos
  585.     jnle  @f
  586.     xor   eax,eax
  587.     mov   [edi+WDATA.box.left],eax
  588.     jmp   x_pos_ok
  589.   @@:
  590.     add   eax,ecx
  591.     cmp   eax,[Screen_Max_X]
  592.     jbe   x_pos_ok
  593.     mov   eax,[Screen_Max_X]
  594.     sub   eax,ecx
  595.     mov   [edi+WDATA.box.left],eax
  596.  
  597.   x_pos_ok:
  598.  
  599.     cmp   ebx,0       ; check x pos
  600.     jnle  @f
  601.     xor   ebx,ebx
  602.     mov   [edi+WDATA.box.top],ebx
  603.     jmp   y_pos_ok
  604.   @@:
  605.     add   ebx,edx
  606.     cmp   ebx,[Screen_Max_Y]
  607.     jbe   y_pos_ok
  608.     mov   ebx,[Screen_Max_Y]
  609.     sub   ebx,edx
  610.     mov   [edi+WDATA.box.top],ebx
  611.  
  612.   y_pos_ok:
  613.  
  614.     popad
  615.  
  616.     ret
  617.  
  618.  
  619. uglobal
  620.   new_window_starting dd 0
  621. endg
  622.  
  623.  
  624. sys_window_mouse:
  625.  
  626.     push  eax
  627.  
  628.     mov   eax,[timer_ticks]
  629.     cmp   [new_window_starting],eax
  630.     jb    swml1
  631.  
  632.     mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
  633.     mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
  634.  
  635.     mov   [new_window_starting],eax
  636.  
  637.   swml1:
  638.  
  639.     pop   eax
  640.  
  641.     ret
  642.  
  643.  
  644.  
  645.  
  646. drawwindow_I_caption:
  647.  
  648.         mov   ecx,[edx+WDATA.cl_titlebar]   ; grab bar
  649.         push  ecx
  650.         mov   esi,edx
  651.         mov   edx,[esi+WDATA.box.top]
  652.         add   edx,1
  653.         mov   ebx,[esi+WDATA.box.top]
  654.         add   ebx,21
  655.         mov   eax,[esi+WDATA.box.top]
  656.         add   eax,[esi+WDATA.box.height]
  657.         cmp   ebx,eax
  658.         jb    .wdsizeok
  659.         mov   ebx,eax
  660.   .wdsizeok:
  661.         push  ebx
  662.   .drwi:
  663.         mov   ebx,edx
  664.         shl   ebx,16
  665.         add   ebx,edx
  666.         mov   eax,[esi+WDATA.box.left]
  667.         inc   eax
  668.         shl   eax,16
  669.         add   eax,[esi+WDATA.box.left]
  670.         add   eax,[esi+WDATA.box.width]
  671.         sub   eax,1
  672.         push  edx
  673.         mov   edx,0x80000000
  674.         mov   ecx,[esi+WDATA.cl_titlebar]
  675.         and   ecx,edx
  676.         cmp   ecx,edx
  677.         jnz   .nofa
  678.         mov   ecx,[esi+WDATA.cl_titlebar]
  679.         sub   ecx,0x00040404
  680.         mov   [esi+WDATA.cl_titlebar],ecx
  681.         and   ecx,0x00ffffff
  682.         jmp   .faj
  683.   .nofa:
  684.         mov   ecx,[esi+WDATA.cl_titlebar]
  685.         and   ecx,0x00ffffff
  686.   .faj:
  687.         pop   edx
  688.         mov   edi,0
  689.         call  [draw_line]
  690.         inc   edx
  691.         cmp   edx,[esp]
  692.         jb    .drwi
  693.         add   esp,4
  694.         pop   ecx
  695.         mov   [esi+WDATA.cl_titlebar],ecx
  696.  
  697.         ret
  698.  
  699.  
  700. drawwindow_I:
  701.  
  702.         pushad
  703.         or      [edx+WDATA.fl_wdrawn], 4
  704.  
  705.         mov   esi,[edx+WDATA.cl_frames]   ; rectangle
  706.         mov   eax,[edx+WDATA.box.left]
  707.         shl   eax,16
  708.         add   eax,[edx+WDATA.box.left]
  709.         add   eax,[edx+WDATA.box.width]
  710.         mov   ebx,[edx+WDATA.box.top]
  711.         shl   ebx,16
  712.         add   ebx,[edx+WDATA.box.top]
  713.         add   ebx,[edx+WDATA.box.height]
  714.         call  draw_rectangle
  715.  
  716.         and     [edx+WDATA.fl_wdrawn], not 4
  717.         test    [edx+WDATA.fl_wdrawn], 2
  718.         jz      @f
  719.         call    drawwindowframes2
  720. @@:
  721.  
  722.         call    drawwindow_I_caption
  723.  
  724.         mov   edx,[esi+WDATA.box.top]      ; inside work area
  725.         add   edx,21+5
  726.         mov   ebx,[esi+WDATA.box.top]
  727.         add   ebx,[esi+WDATA.box.height]
  728.         cmp   edx,ebx
  729.         jg    noinside
  730.         mov   eax,1
  731.         mov   ebx,21
  732.         mov   ecx,[esi+WDATA.box.width]
  733.         mov   edx,[esi+WDATA.box.height]
  734.         mov   edi,[esi+WDATA.cl_workarea]
  735.         test  edi,0x40000000
  736.         jnz   noinside
  737.         call  [drawbar]
  738.       noinside:
  739.  
  740.         popad
  741.  
  742.         ret
  743.  
  744.  
  745. draw_rectangle:
  746.  
  747. r_eax equ [esp+28]   ; x start
  748. r_ax  equ [esp+30]   ; x end
  749. r_ebx equ [esp+16]   ; y start
  750. r_bx  equ [esp+18]   ; y end
  751. ;esi                 ; color
  752.  
  753.         pushad
  754.  
  755.         mov   ecx,esi          ; yb,xb -> yb,xe
  756.         mov   eax, r_eax
  757.         rol   eax, 16
  758.         mov   ebx,r_ebx
  759.         shl   ebx,16
  760.         mov   bx,r_ebx
  761.         xor   edi, edi
  762.         call  [draw_line]
  763.  
  764.         mov   ebx,r_bx         ; ye,xb -> ye,xe
  765.         shl   ebx,16
  766.         mov   bx,r_bx
  767.         call  [draw_line]
  768.  
  769.         mov   ecx,esi          ; ya,xa -> ye,xa
  770.         mov   eax,r_eax
  771.         shl   eax,16
  772.         mov   ax,r_eax
  773.         mov   ebx,r_ebx
  774.         shl   ebx,16
  775.         mov   bx,r_bx
  776.         mov   edi,0
  777.         call  [draw_line]
  778.  
  779.         mov   eax,r_ax       ; ya,xe -> ye,xe
  780.         shl   eax,16
  781.         mov   ax,r_ax
  782.         call  [draw_line]
  783.  
  784.         popad
  785.         ret
  786.  
  787.  
  788. drawwindow_III_caption:
  789.  
  790.         mov   ecx,[edx+WDATA.cl_titlebar]                       ; GRAB BAR
  791.         push  ecx
  792.         mov   esi,edx
  793.         mov   edx,[esi+WDATA.box.top]
  794.         add   edx,4
  795.         mov   ebx,[esi+WDATA.box.top]
  796.         add   ebx,20
  797.         mov   eax,[esi+WDATA.box.top]
  798.         add   eax,[esi+WDATA.box.height]
  799.         cmp   ebx,eax
  800.         jb    .wdsizeok
  801.         mov   ebx,eax
  802.   .wdsizeok:
  803.         push  ebx
  804.   .drwi:
  805.         mov   ebx,edx
  806.         shl   ebx,16
  807.         add   ebx,edx
  808.         mov   eax,[esi+WDATA.box.left]
  809.         shl   eax,16
  810.         add   eax,[esi+WDATA.box.left]
  811.         add   eax,[esi+WDATA.box.width]
  812.         add   eax,4*65536-4
  813.         mov   ecx,[esi+WDATA.cl_titlebar]
  814.         test  ecx,0x40000000
  815.         jz    .nofa
  816.         add   ecx,0x040404
  817.   .nofa:
  818.         test  ecx,0x80000000
  819.         jz    .nofa2
  820.         sub   ecx,0x040404
  821.   .nofa2:
  822.         mov   [esi+WDATA.cl_titlebar],ecx
  823.         and   ecx,0xffffff
  824.         xor   edi, edi
  825.         call  [draw_line]
  826.         inc   edx
  827.         cmp   edx,[esp]
  828.         jb    .drwi
  829.         add   esp,4
  830.         pop   ecx
  831.         mov   [esi+WDATA.cl_titlebar],ecx
  832.  
  833.         ret
  834.  
  835.  
  836. drawwindow_III:
  837.  
  838.         pushad
  839.  
  840.         mov   edi,edx                              ; RECTANGLE
  841.         mov   eax,[edi+WDATA.box.left]
  842.         shl   eax,16
  843.     mov   ax, word [edi+WDATA.box.left]
  844.     add   ax, word [edi+WDATA.box.width]
  845.         mov   ebx,[edi+WDATA.box.top]
  846.         shl   ebx,16
  847.     mov   bx, word [edi+WDATA.box.top]
  848.     add   bx, word [edi+WDATA.box.height]
  849.         mov   esi,[edi+WDATA.cl_frames]
  850.         shr   esi,1
  851.         and   esi,0x007f7f7f
  852.         push  esi
  853.         or      [edi+WDATA.fl_wdrawn], 4
  854.         call  draw_rectangle
  855.         and     [edi+WDATA.fl_wdrawn], not 4
  856.         test    [edi+WDATA.fl_wdrawn], 2
  857.         jz      @f
  858.         call    drawwindowframes2
  859. @@:
  860.         mov   ecx,3
  861.       dw3l:
  862.         add   eax,1*65536-1
  863.         add   ebx,1*65536-1
  864.         mov   esi,[edi+WDATA.cl_frames]
  865.         call  draw_rectangle
  866.         dec   ecx
  867.         jnz   dw3l
  868.         pop   esi
  869.         add   eax,1*65536-1
  870.         add   ebx,1*65536-1
  871.         call  draw_rectangle
  872.  
  873.         call    drawwindow_III_caption
  874.  
  875.         mov   edx,[esi+WDATA.box.top]                       ; WORK AREA
  876.         add   edx,21+5
  877.         mov   ebx,[esi+WDATA.box.top]
  878.         add   ebx,[esi+WDATA.box.height]
  879.         cmp   edx,ebx
  880.         jg    noinside2
  881.         mov   eax,5
  882.         mov   ebx,20
  883.         mov   ecx,[esi+WDATA.box.width]
  884.         mov   edx,[esi+WDATA.box.height]
  885.         sub   ecx,4
  886.         sub   edx,4
  887.         mov   edi,[esi+WDATA.cl_workarea]
  888.         test  edi,0x40000000
  889.         jnz   noinside2
  890.         call  [drawbar]
  891.       noinside2:
  892.  
  893.         popad
  894.  
  895.         ret
  896.  
  897.  
  898.  
  899. ; activate window
  900. align 4
  901. windowactivate:
  902.  
  903.         ; esi = abs mem position in stack 0xC400+
  904.  
  905.         pushad
  906.  
  907.      ; if type of current active window is 3,
  908.      ; it must be redrawn
  909.         mov   eax, [TASK_COUNT]
  910.         movzx eax, word [WIN_POS + eax*2]
  911.         shl   eax, 5
  912.         add   eax, window_data
  913.         mov   ebx, [eax + WDATA.cl_workarea]
  914.         and   ebx, 0x0f000000
  915.         cmp   ebx, 0x03000000
  916.         je   .set_WDATA_fl_redraw   ; for 3 and 4 style
  917.         cmp   ebx, 0x04000000
  918.         je   .set_WDATA_fl_redraw
  919.         jmp @f
  920.         .set_WDATA_fl_redraw:
  921.         mov   [eax + WDATA.fl_redraw], byte 1
  922.      @@:
  923.  
  924.         push   esi
  925.       movzx   eax, word [esi] ; ax <- process no
  926.       movzx   eax, word [WIN_STACK+eax*2] ; ax <- position in window stack
  927.  
  928.         xor   esi, esi        ; drop others
  929.       waloop:
  930.         cmp   esi, dword [TASK_COUNT]
  931.         jae   wacont
  932.         inc   esi
  933.         lea   edi, [WIN_STACK + esi*2]
  934.         mov   bx, [edi] ; position of the current process
  935.         cmp   bx, ax
  936.         jbe   @f
  937.         dec   bx       ; upper? => drop!
  938.         mov   [edi], bx
  939.       @@:
  940.         jmp   waloop
  941.       wacont:
  942.                             ; set to no 1
  943.         pop   esi           ;   esi = pointer at 0xC400
  944.  
  945.       movzx   eax, word [esi]
  946.         mov   bx, [TASK_COUNT]  ; number of processes
  947.         mov   [WIN_STACK+eax*2], bx     ; this is the last (and the upper)
  948.  
  949.         ; update on screen -window stack
  950.         xor   esi, esi
  951.       waloop2:
  952.         mov   edi, [TASK_COUNT]
  953.         cmp   esi, edi
  954.         jae   wacont2
  955.         inc   esi
  956.         movzx ebx, word [esi*2 + WIN_STACK]
  957.         mov   [ebx*2 + WIN_POS], si
  958.         jmp   waloop2
  959.       wacont2:
  960.         mov   [KEY_COUNT], byte 0             ; empty keyboard buffer
  961.         mov   [BTN_COUNT], byte 0             ; empty button buffer
  962.         mov   [MOUSE_SCROLL_H], word 0  ; zero mouse z-index
  963.         mov   [MOUSE_SCROLL_V], word 0  ; zero mouse z-index
  964.         popad
  965.         ret
  966.  
  967.  
  968. ; check if window is necessary to draw
  969.  
  970. checkwindowdraw:
  971.  
  972.         ; edi = position in window_data+
  973.  
  974.         mov   eax, [edi + WDATA.cl_workarea]
  975.         and   eax, 0x0f000000
  976.         cmp   eax, 0x03000000
  977.         je    .return_yes      ; window type 3
  978.         cmp   eax, 0x04000000
  979.         je    .return_yes      ; window type 4
  980.  
  981.         mov   esi, edi
  982.         sub   esi, window_data
  983.         shr   esi, 5
  984.  
  985.         ; esi = process number
  986.  
  987.         movzx eax, word [WIN_STACK + esi * 2] ; get value of the curr process
  988.         lea   esi, [WIN_POS + eax * 2]      ; get address of this process at 0xC400
  989.  
  990.         push  esi
  991.  
  992.       .new_check:
  993.  
  994.         pop   esi
  995.         add   esi, 2
  996.         push  esi
  997.  
  998.         mov   eax, [TASK_COUNT]
  999.         lea   eax, word [WIN_POS + eax * 2] ; number of the upper window
  1000.  
  1001.         cmp   esi, eax
  1002.         ja    .all_wnds_to_top
  1003.  
  1004.         movzx eax, word [esi]
  1005.         shl   eax, 5
  1006.         cmp   [CURRENT_TASK + eax + TASKDATA.state], byte 9
  1007.         je    .new_check                    ; skip dead windows
  1008.  
  1009.         lea   esi, [eax+window_data]
  1010.  
  1011.         mov   ebx, [edi+WDATA.box.top]  ; y0
  1012.         mov   edx, [edi+WDATA.box.height]
  1013.         add   edx, ebx      ; y0e
  1014.  
  1015.         mov   ecx, [esi+WDATA.box.top]  ; y  ; y check
  1016.         cmp   ecx, edx
  1017.         jae   .new_check     ; y < y0e
  1018.         mov   eax, [esi+WDATA.box.height]
  1019.         add   ecx, eax       ; ye
  1020.         cmp   ebx, ecx       ; y0 >= ye
  1021.         ja    .new_check
  1022.  
  1023.         mov   eax, [edi+WDATA.box.left]   ; x0
  1024.         mov   ecx, [edi+WDATA.box.width]
  1025.         add   ecx, eax       ; x0e
  1026.  
  1027.         mov   edx, [esi+WDATA.box.left]   ; x ; x check
  1028.         cmp   edx, ecx
  1029.         jae   .new_check     ; x < x0e
  1030.         mov   ecx, [esi+WDATA.box.width]
  1031.         add   edx, ecx
  1032.         cmp   eax, edx
  1033.         ja    .new_check
  1034.  
  1035.         pop   esi
  1036.   .return_yes:
  1037.         mov   ecx,1   ; overlap some window
  1038.         ret
  1039.  
  1040.   .all_wnds_to_top:
  1041.  
  1042.         pop   esi
  1043.  
  1044.         xor   ecx, ecx       ; passed all windows to top
  1045.         ret
  1046.  
  1047.  
  1048.  
  1049.  
  1050. waredraw:     ; if redraw necessary at activate
  1051.  
  1052.         pushad
  1053.  
  1054.         call  checkwindowdraw      ; draw window on activation ?
  1055.         test  ecx, ecx
  1056.         jz    .do_not_draw
  1057.  
  1058.         popad
  1059.         mov   [MOUSE_DOWN], byte 1     ; do draw mouse
  1060.         call  windowactivate
  1061.  
  1062.         ; update screen info
  1063.         pushad
  1064.         mov   edi, [TASK_COUNT] ; the last process (number)
  1065.         movzx esi, word [WIN_POS + edi * 2]
  1066.         shl   esi, 5
  1067.         add   esi, window_data
  1068.  
  1069.         ; coordinates of the upper window
  1070.     mov   eax, [esi + WDATA.box.left]   ; cx
  1071.     mov   ebx, [esi + WDATA.box.top]    ; cy
  1072.     mov   ecx, [esi + WDATA.box.width]  ; sx
  1073.     mov   edx, [esi + WDATA.box.height] ; sy
  1074.  
  1075.         add   ecx, eax       ; ecx = x_end
  1076.         add   edx, ebx       ; edx = y_end
  1077.  
  1078.         mov   edi, [TASK_COUNT]
  1079.         movzx esi, word [WIN_POS + edi * 2]
  1080.         call  setscreen
  1081.         popad
  1082.  
  1083.     mov   [edi + WDATA.fl_redraw], 1  ; redraw flag for app
  1084.     mov   [MOUSE_DOWN],byte 0             ; mouse down checks
  1085.  
  1086.         ret
  1087.  
  1088.      .do_not_draw:
  1089.  
  1090.         popad
  1091.  
  1092.         call  windowactivate
  1093.         mov   [MOUSE_DOWN],byte 0  ; mouse down checks
  1094.         mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
  1095.         mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
  1096.         ret
  1097.  
  1098.  
  1099. ; eax = window number on screen
  1100. ; corrupts registers and [dl*]
  1101. minimize_window:
  1102.         movzx eax, word [WIN_POS+eax*2]
  1103.         shl   eax, 5
  1104.         add   eax, window_data
  1105.         test  [eax+WDATA.fl_wstate], WSTATE_MINIMIZED
  1106.         jnz   .skip_redrawings
  1107.         pushfd
  1108.         cli
  1109.         or    [eax+WDATA.fl_wstate], WSTATE_MINIMIZED
  1110.         mov   edi, eax
  1111.         ;call  calculatescreen
  1112.         mov   eax, [edi+WDATA.box.left]
  1113.         mov   [dlx], eax
  1114.         mov   ecx, eax
  1115.         add   ecx, [edi+WDATA.box.width]
  1116.         mov   [dlxe], ecx
  1117.         mov   ebx, [edi+WDATA.box.top]
  1118.         mov   [dly], ebx
  1119.         mov   edx, ebx
  1120.         add   edx, [edi+WDATA.box.height]
  1121.         mov   [dlye], edx
  1122.         call  calculatescreen
  1123.         xor   esi, esi
  1124.         xor   eax, eax
  1125.         call  redrawscreen
  1126.         popfd
  1127. .skip_redrawings:
  1128.         ret
  1129.  
  1130. ; eax = window number on screen
  1131. ; corrupts registers and [dl*]
  1132. restore_minimized_window:
  1133.         pushfd
  1134.         cli
  1135.         movzx esi, word [WIN_POS+eax*2]
  1136.         mov   edi, esi
  1137.         shl   edi, 5
  1138.         add   edi, window_data
  1139.         test  [edi+WDATA.fl_wstate], WSTATE_MINIMIZED
  1140.         jz    .skip_redrawings
  1141.         mov   [edi+WDATA.fl_redraw], 1
  1142.         and   [edi+WDATA.fl_wstate], not WSTATE_MINIMIZED
  1143.         cmp   eax, [TASK_COUNT] ; the uppermost window
  1144.         jnz   .no_uppermost
  1145.         mov   eax, [edi+WDATA.box.left]
  1146.         mov   ebx, [edi+WDATA.box.top]
  1147.         mov   ecx, eax
  1148.         mov   edx, ebx
  1149.         add   ecx, [edi+WDATA.box.width]
  1150.         add   edx, [edi+WDATA.box.height]
  1151.         call  setscreen
  1152.         jmp   .done
  1153. .no_uppermost:
  1154.         mov   eax, [edi+WDATA.box.left]
  1155.         mov   ebx, [edi+WDATA.box.top]
  1156.         mov   ecx, eax
  1157.         mov   edx, ebx
  1158.         add   ecx, [edi+WDATA.box.width]
  1159.         add   edx, [edi+WDATA.box.height]
  1160.         call  calculatescreen
  1161. .done:
  1162.         mov   [MOUSE_BACKGROUND],byte 0 ; no mouse under
  1163. .skip_redrawings:
  1164.         popfd
  1165.         ret
  1166.  
  1167.  
  1168. iglobal
  1169.   window_moving   db 'K : Window - move/resize',13,10,0
  1170.   window_moved    db 'K : Window - done',13,10,0
  1171. endg
  1172.  
  1173. ; check window touch
  1174. align 4
  1175. checkwindows:
  1176.         pushad
  1177.  
  1178.         cmp   [window_minimize], 0
  1179.         je    .no_minimizing
  1180.         mov   eax, [TASK_COUNT]       ; the uppermost window
  1181.         mov   bl, 0
  1182.         xchg  [window_minimize], bl
  1183.         cmp   bl, 1
  1184.         jne   .restore
  1185.         call  minimize_window
  1186.         jmp   .continue
  1187.   .restore:
  1188.         call  restore_minimized_window
  1189.   .continue:
  1190.   .no_minimizing:
  1191.  
  1192.         cmp   [BTN_DOWN],byte 0    ; mouse buttons pressed ?
  1193.         jne  .mouse_buttons_pressed
  1194. ;..................................... start 1/4 : modified by vhanla .................
  1195.         mov [bPressedMouseXY_W],0
  1196. ;..................................... end 1/4 : modified by vhanla ...................
  1197.         popad
  1198.         ret
  1199.     .mouse_buttons_pressed:
  1200. ;..................................... start 2/4 : modified by vhanla .................
  1201. uglobal
  1202.         bPressedMouseXY_W db 0x0
  1203. endg
  1204. ;..................................... end 2/4 : modified by vhanla ...................
  1205.         mov   esi,[TASK_COUNT]
  1206.         inc   esi
  1207.  
  1208. ;..................................... start 3/4 : modified by vhanla .................
  1209.         cmp [bPressedMouseXY_W],1
  1210.         jb  .first
  1211.         ja  @f
  1212.         inc [bPressedMouseXY_W]
  1213.         jmp @f
  1214. .first:
  1215.         mov [bPressedMouseXY_W],1
  1216.         mov ax,[MOUSE_X]
  1217.         mov [mx],ax
  1218.         mov ax,[MOUSE_Y]
  1219.         mov [my],ax
  1220.         @@:
  1221. ;..................................... end 3/4 : modified by vhanla ...................
  1222.  
  1223.       cwloop:
  1224.         cmp   esi,2
  1225.         jb   .exit
  1226.  
  1227.         dec   esi
  1228.         movzx edi, word [WIN_POS + esi * 2] ; ebx
  1229.         shl   edi, 5
  1230.         add   edi, window_data
  1231. ;        mov   edi, ebx
  1232.     mov   ecx, [edi + WDATA.box.left]
  1233.     mov   edx, [edi + WDATA.box.top]
  1234.  
  1235.         mov   eax,ecx
  1236.         mov   ebx,edx
  1237.         test    [edi+WDATA.fl_wstate],WSTATE_MINIMIZED
  1238.         jnz     cwloop
  1239.  
  1240. ;..................................... start 4/4 : modified by vhanla .................
  1241.        movzx  eax, word [mx]; movzx eax,word[MOUSE_X]
  1242.        movzx  ebx, word [my]; movzx ebx,word[MOUSE_Y]
  1243. ;..................................... endt 4/4 : modified by vhanla ..................
  1244.         cmp   ecx, eax
  1245.         jae   cwloop
  1246.         cmp   edx, ebx
  1247.         jae   cwloop
  1248.     add   ecx, [edi + WDATA.box.width]
  1249.     add   edx, [edi + WDATA.box.height]
  1250.         cmp   eax, ecx
  1251.         jae   cwloop
  1252.         cmp   ebx, edx
  1253.         jae   cwloop
  1254.  
  1255.         pushad
  1256.         mov   eax, esi
  1257.         mov   ebx, [TASK_COUNT]
  1258.         cmp   eax, ebx      ; is this window active?
  1259.         jz    .move_resize_window
  1260.  
  1261.         cmp   [bPressedMouseXY_W], 1
  1262.         ja    .exit
  1263.  
  1264.         ; eax = position in windowing stack
  1265.         ; redraw must ?
  1266.         lea   esi, [WIN_POS + esi * 2]
  1267.         call  waredraw
  1268.         add   esp, 32
  1269.  
  1270.       .exit:
  1271.         popad
  1272.         ret
  1273.  
  1274.    .move_resize_window:    ; MOVE OR RESIZE WINDOW
  1275.         popad
  1276.  
  1277.         ; Check for user enabled fixed window
  1278.     mov   edx, [edi + WDATA.cl_titlebar]
  1279.         and   edx, 0x0f000000
  1280.         cmp   edx, 0x01000000
  1281.         jne   .window_move_enabled_for_user
  1282.         popad
  1283.         ret
  1284.       .window_move_enabled_for_user:
  1285.  
  1286.     test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
  1287.         jnz     .no_resize_2
  1288.  
  1289.         mov   [do_resize_from_corner],byte 0   ; resize for skinned window
  1290.     mov   edx, [edi + WDATA.cl_workarea]
  1291.         and   edx, 0x0f000000
  1292.         cmp   edx, 0x00000000                                           ;{test for resized}
  1293.         je    .no_resize_2
  1294.         cmp   edx, 0x01000000                                           ;{test for resized}
  1295.         je    .no_resize_2
  1296.         cmp   edx, 0x04000000                                           ;{test for resized}
  1297.         je    .no_resize_2
  1298. ;       jb    .no_resize_2 ; not type 2 wnd
  1299.  
  1300.     mov   edx, [edi + WDATA.box.top]
  1301.     add   edx, [edi + WDATA.box.height]
  1302.         sub   edx, 6       ; edx = y_end - 6
  1303.         cmp   ebx, edx     ; ebx = mouse_y
  1304.         jb    .no_resize_2
  1305.         mov   [do_resize_from_corner],byte 1
  1306.         jmp   .continue
  1307.       .no_resize_2:
  1308.  
  1309.         push    eax
  1310.         call    get_titlebar_height
  1311.     add     eax,[edi + WDATA.box.top]
  1312.         cmp     ebx,eax
  1313.         pop     eax
  1314.         jae     .exit
  1315.  
  1316.      .continue:
  1317.  
  1318.         push  esi
  1319.         mov   esi, window_moving
  1320.         call  sys_msg_board_str
  1321.         pop   esi
  1322.  
  1323.         mov   ecx, [timer_ticks]     ; double-click ?
  1324.         mov   edx, ecx
  1325.         sub   edx, [latest_window_touch]
  1326.         mov   [latest_window_touch], ecx
  1327.         mov   [latest_window_touch_delta], edx
  1328.  
  1329.         mov   cl, [BTN_DOWN]     ; save for shade check
  1330.         mov   [do_resize], cl
  1331.      no_emulation_righ_button:
  1332.     mov   ecx, [edi + WDATA.box.left]
  1333.     mov   edx, [edi + WDATA.box.top]
  1334.  
  1335.         push  eax ecx edx
  1336.         mov   [dlx], ecx      ; save for drawlimits
  1337.         mov   [dly], edx
  1338.     mov   eax, [edi + WDATA.box.width]
  1339.         add   ecx, eax
  1340.     mov   eax, [edi + WDATA.box.height]
  1341.         add   edx, eax
  1342.         mov   [dlxe], ecx
  1343.         mov   [dlye], edx
  1344.         pop   edx ecx eax
  1345.  
  1346.         sub   eax, ecx
  1347.         sub   ebx, edx
  1348.  
  1349.         mov   esi, [MOUSE_X]
  1350.         mov   [WIN_TEMP_XY], esi
  1351.  
  1352.         pushad           ; wait for putimages to finish
  1353. ;        mov   ebx,5
  1354. ;        call  delay_hs
  1355.     mov   eax,[edi + WDATA.box.left]
  1356.         mov   [npx],eax
  1357.     mov   eax,[edi + WDATA.box.top]
  1358.         mov   [npy],eax
  1359.         popad
  1360.  
  1361.         push eax                  ; save old coordinates
  1362.     mov   ax, word [edi + WDATA.box.left]
  1363.         mov   word [oldc+BOX.left],ax
  1364.     mov   ax, word [edi + WDATA.box.top]
  1365.         mov   word [oldc+BOX.top],ax
  1366.     mov   ax, word [edi + WDATA.box.width]
  1367.         mov   word [oldc+BOX.width],ax
  1368.         mov   word [npxe],ax
  1369.     mov   ax, word [edi + WDATA.box.height]
  1370.         mov   word [oldc+BOX.height],ax
  1371.         mov   word [npye],ax
  1372.         pop eax
  1373.  
  1374.         call  drawwindowframes
  1375.  
  1376.         mov   [reposition],0
  1377.         mov   [MOUSE_DOWN],byte 1   ; no reaction to mouse up/down
  1378.  
  1379.         ; move window
  1380.  
  1381.       newchm:
  1382.  
  1383.         mov   [DONT_DRAW_MOUSE],byte 1
  1384.  
  1385.         call  checkidle
  1386.  
  1387.         call  checkVga_N13
  1388.  
  1389.         mov   [MOUSE_BACKGROUND],byte 0
  1390.  
  1391.         call  [draw_pointer]
  1392.  
  1393.         pushad
  1394.         call   stack_handler
  1395.         popad
  1396.  
  1397.         mov   esi,[WIN_TEMP_XY]
  1398.         cmp   esi,[MOUSE_X]
  1399.         je    cwb
  1400.  
  1401.         mov   cx,[MOUSE_X]
  1402.         mov   dx,[MOUSE_Y]
  1403.         sub   cx,ax
  1404.         sub   dx,bx
  1405.  
  1406.         push  ax
  1407.         push  bx
  1408.  
  1409.         call  drawwindowframes
  1410.  
  1411.         mov   ax,[Screen_Max_X]
  1412.         mov   bx,[Screen_Max_Y]
  1413.  
  1414.         cmp   [do_resize_from_corner],1
  1415.         je    no_new_position
  1416.  
  1417.         mov   word [npx],word 0     ; x repos ?
  1418.         cmp   ax,cx
  1419.         jb    noreposx
  1420.         mov   [reposition],1
  1421.         sub   ax,word [npxe]
  1422.         mov   word [npx],ax
  1423.         cmp   ax,cx
  1424.         jb    noreposx
  1425.         mov   word [npx],cx
  1426.       noreposx:
  1427.  
  1428.         mov   word [npy],word 0     ; y repos ?
  1429.         cmp   bx,dx
  1430.         jb    noreposy
  1431.         mov   [reposition],1
  1432.         sub   bx,word [npye]
  1433.         mov   word [npy],bx
  1434.         cmp   bx,dx
  1435.         jb    noreposy
  1436.         mov   word [npy],dx
  1437.       noreposy:
  1438.  
  1439.       no_new_position:
  1440.  
  1441.         cmp   [do_resize_from_corner],0    ; resize from right corner
  1442.         je    norepos_size
  1443.         pushad
  1444.  
  1445.         mov   edx,edi
  1446.         sub   edx,window_data
  1447.         ;shr   edx,5
  1448.         ;shl   edx,8
  1449.         ;add   edx,0x80000                 ; process base at 0x80000+
  1450.     lea   edx, [SLOT_BASE + edx*8]
  1451.  
  1452.         movzx eax,word [MOUSE_X]
  1453.     cmp   eax,[edi + WDATA.box.left]
  1454.         jb    nnepx
  1455.     sub   eax,[edi + WDATA.box.left]
  1456.         cmp   eax,32 ; [edx+0x90+8]
  1457.         jge   nnepx2
  1458.         mov   eax,32 ; [edx+0x90+8]
  1459.       nnepx2:
  1460.         mov   [npxe],eax
  1461.       nnepx:
  1462.  
  1463.         call    get_rolledup_height
  1464.         mov     ebx,eax
  1465.         movzx eax,word [MOUSE_Y]
  1466.     cmp   eax,[edi + WDATA.box.top]
  1467.         jb    nnepy
  1468.     sub   eax,[edi + WDATA.box.top]
  1469.         cmp     eax,ebx ; [edx+0x90+12]
  1470.         jge     nnepy2
  1471.         mov     eax,ebx ; [edx+0x90+12]
  1472.       nnepy2:
  1473.         mov   [npye],eax
  1474.       nnepy:
  1475.  
  1476.         mov   [reposition],1
  1477.  
  1478.         popad
  1479.       norepos_size:
  1480.  
  1481.         pop   bx
  1482.         pop   ax
  1483.         call  drawwindowframes
  1484.  
  1485.         mov   esi,[MOUSE_X]
  1486.         mov   [WIN_TEMP_XY],esi
  1487.  
  1488.       cwb:
  1489.         cmp   [BTN_DOWN],byte 0
  1490.         jne   newchm
  1491.                                      ; new position done
  1492.         mov     [DONT_DRAW_MOUSE],byte 1
  1493.         mov     cl,0
  1494.         test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
  1495.         jnz     @f
  1496.         mov     cl,[reposition]
  1497.         call    drawwindowframes
  1498.  
  1499.         mov   eax,[npx]
  1500.     mov   [edi + WDATA.box.left],eax
  1501.         mov   eax,[npy]
  1502.     mov   [edi + WDATA.box.top],eax
  1503.         mov   eax,[npxe]
  1504.     mov   [edi + WDATA.box.width],eax
  1505.         mov   eax,[npye]
  1506.     mov   [edi + WDATA.box.height],eax
  1507.         call    set_window_clientbox
  1508.  
  1509.     @@: mov     [reposition],cl
  1510.  
  1511.         cmp   [reposition],1         ; save new position and size
  1512.         jne   no_bounds_save
  1513.         push  esi edi ecx
  1514.         mov   esi,edi
  1515.         mov   ecx,2
  1516.         test  [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP or WSTATE_MAXIMIZED
  1517.         jnz   @f
  1518.         add   ecx,2
  1519.     @@: sub   edi,window_data
  1520.         shr   edi,5
  1521.         shl   edi,8
  1522.         add   edi,SLOT_BASE+APPDATA.saved_box
  1523.         cld
  1524.         rep   movsd
  1525.         pop   ecx edi esi
  1526.       no_bounds_save:
  1527.  
  1528.         pushad                             ; WINDOW SHADE/FULLSCREEN
  1529.  
  1530.         ;{doule click not worked for 4 type window}
  1531.     mov   edx, [edi + WDATA.cl_workarea]
  1532.         and   edx, 0x0f000000
  1533.         cmp   edx, 0x00000000
  1534.         je    no_fullscreen_restore
  1535.         cmp   edx, 0x01000000
  1536.         je    no_fullscreen_restore
  1537.  
  1538.         cmp   [reposition],1
  1539.         je    no_window_sizing
  1540.         mov   edx,edi
  1541.         sub   edx,window_data
  1542.         shr   edx,5
  1543.         shl   edx,8
  1544.         add   edx,SLOT_BASE                 ; process base at 0x80000+
  1545.  
  1546.         cmp   [do_resize],2               ; window shade ?
  1547.         jne   no_window_shade
  1548.         mov   [reposition],1
  1549.  
  1550.         test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
  1551.         jnz     wnd_rolldown
  1552.   wnd_rollup:
  1553.         or      [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
  1554.         call    get_rolledup_height
  1555.         jmp     @f
  1556.   wnd_rolldown:
  1557.         and     [edi+WDATA.fl_wstate],not WSTATE_ROLLEDUP
  1558.     mov     eax,[edx + APPDATA.saved_box.height] ; 0x90+BOX.height
  1559.         test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
  1560.         jz      @f
  1561.         mov     eax,[screen_workarea.bottom]
  1562.         sub     eax,[screen_workarea.top]
  1563.     @@: mov     [edi+WDATA.box.height],eax
  1564.         add     eax, [edi+WDATA.box.top]
  1565.         cmp     eax, [Screen_Max_Y]
  1566.         jbe     @f
  1567.         mov     eax, [Screen_Max_Y]
  1568.         sub     eax, [edi+WDATA.box.height]
  1569.         mov     [edi+WDATA.box.top], eax
  1570.     @@: call    check_window_position
  1571.         call    set_window_clientbox
  1572.  
  1573.       no_window_shade:
  1574.  
  1575.         push edx
  1576.         mov   edx, [edi + WDATA.cl_workarea]
  1577.         and   edx, 0x0f000000
  1578.         cmp   edx, 0x04000000
  1579.         pop edx
  1580.         je    no_fullscreen_restore
  1581.  
  1582.         cmp   [do_resize],1               ; fullscreen/restore ?
  1583.         jne   no_fullscreen_restore
  1584.         cmp   [latest_window_touch_delta],dword 50
  1585.         jg    no_fullscreen_restore
  1586.         mov   [reposition],1
  1587.         test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
  1588.         jnz     restore_from_fullscreen
  1589.         or      [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
  1590.         mov     eax,[screen_workarea.left]
  1591.         mov     [edi+WDATA.box.left],eax
  1592.         sub     eax,[screen_workarea.right]
  1593.         neg     eax
  1594.         mov     [edi+WDATA.box.width],eax
  1595.         mov     eax,[screen_workarea.top]
  1596.         mov     [edi+WDATA.box.top],eax
  1597.         test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
  1598.         jnz     @f
  1599.         sub     eax,[screen_workarea.bottom]
  1600.         neg     eax
  1601.         mov     [edi+WDATA.box.height],eax
  1602.     @@:
  1603.         jmp     restore_from_fullscreen.clientbox
  1604.       restore_from_fullscreen:
  1605.         and     [edi+WDATA.fl_wstate],not WSTATE_MAXIMIZED
  1606.         push    [edi+WDATA.box.height]
  1607.         push  edi                         ; restore
  1608.         lea   esi, [edx + APPDATA.saved_box]
  1609.         mov   ecx,4
  1610.         cld
  1611.         rep   movsd
  1612.         pop   edi
  1613.         pop     eax
  1614.         test    [edi+WDATA.fl_wstate],WSTATE_ROLLEDUP
  1615.         jz      @f
  1616.         mov     [edi+WDATA.box.height],eax
  1617.     @@:
  1618.     .clientbox:
  1619.         call    set_window_clientbox
  1620.  
  1621.       no_fullscreen_restore:
  1622.  
  1623.         mov   eax,[edi+WDATA.box.top]                 ; check Y inside screen
  1624.         add   eax,[edi+WDATA.box.height]
  1625.         cmp   eax,[Screen_Max_Y]
  1626.         jbe   no_window_sizing
  1627.         mov   eax,[edi+WDATA.box.left]                 ; check X inside screen
  1628.         add   eax,[edi+WDATA.box.width]
  1629.         cmp   eax,[Screen_Max_X]
  1630.         jbe   no_window_sizing
  1631.         mov   eax,[Screen_Max_X]
  1632.         sub   eax,[edi+WDATA.box.width]
  1633.         mov   [edi+WDATA.box.left],eax
  1634.         mov   eax,[Screen_Max_Y]
  1635.         sub   eax,[edi+WDATA.box.height]
  1636.         mov   [edi+WDATA.box.top],eax
  1637.         call  set_window_clientbox
  1638.       no_window_sizing:
  1639.  
  1640.         popad
  1641.  
  1642.         cmp   [reposition],0
  1643.         je    retwm
  1644.  
  1645.         mov   [DONT_DRAW_MOUSE],byte 1 ; no mouse
  1646.  
  1647.  
  1648.         push  eax ebx ecx edx
  1649.         mov   eax,[edi+WDATA.box.left]
  1650.         mov   ebx,[edi+WDATA.box.top]
  1651.         mov   ecx,[edi+WDATA.box.width]
  1652.         mov   edx,[edi+WDATA.box.height]
  1653.         add   ecx,eax
  1654.         add   edx,ebx
  1655.         call  calculatescreen
  1656.  
  1657.         mov   eax,[oldc+BOX.left]
  1658.         mov   ebx,[oldc+BOX.top]
  1659.         mov   ecx,[oldc+BOX.width]
  1660.         mov   edx,[oldc+BOX.height]
  1661.         add   ecx,eax
  1662.         add   edx,ebx
  1663.         call  calculatescreen
  1664.         pop   edx ecx ebx eax
  1665.  
  1666.         mov   eax,edi
  1667.         call  redrawscreen
  1668.  
  1669.  
  1670.         mov     [edi+WDATA.fl_redraw],1
  1671.  
  1672.         mov   ecx,100         ; wait to avoid mouse residuals
  1673.       waitre2:
  1674.         mov   [DONT_DRAW_MOUSE],byte 1
  1675.         call  checkidle
  1676.         cmp     [edi+WDATA.fl_redraw],0
  1677.         jz    retwm
  1678.         loop  waitre2
  1679.  
  1680.       retwm:
  1681.  
  1682.         mov   [DONT_DRAW_MOUSE],byte 0 ; mouse pointer
  1683.         mov   [MOUSE_BACKGROUND],byte 0 ; no mouse under
  1684.         mov   [MOUSE_DOWN],byte 0 ; react to mouse up/down
  1685.  
  1686.         mov    esi,window_moved
  1687.         call   sys_msg_board_str
  1688.  
  1689.         popad
  1690.  
  1691.         ret
  1692.  
  1693.  
  1694. uglobal
  1695.   add_window_data            dd  0
  1696.   do_resize_from_corner      db  0x0
  1697.   reposition                 db  0x0
  1698.   latest_window_touch        dd  0x0
  1699.   latest_window_touch_delta  dd  0x0
  1700.  
  1701.   do_resize db 0x0
  1702.  
  1703.   oldc    dd 0x0,0x0,0x0,0x0
  1704.  
  1705.   dlx     dd 0x0
  1706.   dly     dd 0x0
  1707.   dlxe    dd 0x0
  1708.   dlye    dd 0x0
  1709.  
  1710.   npx     dd 0x0
  1711.   npy     dd 0x0
  1712.   npxe    dd 0x0
  1713.   npye    dd 0x0
  1714.  
  1715.   mpx     dd 0x0
  1716.   mpy     dd 0x0
  1717. endg
  1718.  
  1719.  
  1720. ; draw negative window frames
  1721. drawwindowframes2:
  1722.         pushad
  1723.         cli
  1724.         jmp     drawwindowframes.do
  1725. drawwindowframes:
  1726.         pushad
  1727.         cli
  1728.  
  1729.         test    [edi+WDATA.fl_wstate],WSTATE_MAXIMIZED
  1730.         jnz     .ret
  1731.         mov     eax, [npx]
  1732.         cmp     eax, [edi+WDATA.box.left]
  1733.         jnz     .nowndframe
  1734.         mov     eax, [npxe]
  1735.         cmp     eax, [edi+WDATA.box.width]
  1736.         jnz     .nowndframe
  1737.         mov     eax, [npy]
  1738.         cmp     eax, [edi+WDATA.box.top]
  1739.         jnz     .nowndframe
  1740.         mov     eax, [npye]
  1741.         cmp     eax, [edi+WDATA.box.height]
  1742.         jnz     .nowndframe
  1743.         xor     [edi+WDATA.fl_wdrawn], 2
  1744.         test    [edi+WDATA.fl_wdrawn], 4
  1745.         jnz     .ret
  1746.  
  1747. .nowndframe:
  1748. .do:
  1749.         mov     edi, 1
  1750.         mov     ecx, 0x01000000
  1751.         mov   eax,[npx]
  1752.         shl   eax,16
  1753.         add   eax,[npx]
  1754.         add   eax,[npxe]
  1755.         add   eax,65536*1-1
  1756.         mov   ebx,[npy]
  1757.         shl   ebx,16
  1758.         add   ebx,[npy]
  1759.         call  [draw_line]
  1760.  
  1761.         mov   eax,[npx]
  1762.         shl   eax,16
  1763.         add   eax,[npx]
  1764.         add   eax,[npxe]
  1765.         add   eax,65536*1-1
  1766.         mov   ebx,[npy]
  1767.         add   ebx,[npye]
  1768.         shl   ebx,16
  1769.         add   ebx,[npy]
  1770.         add   ebx,[npye]
  1771.         call  [draw_line]
  1772.  
  1773.         mov   eax,[npx]
  1774.         shl   eax,16
  1775.         add   eax,[npx]
  1776.         mov   ebx,[npy]
  1777.         shl   ebx,16
  1778.         add   ebx,[npy]
  1779.         add   ebx,[npye]
  1780.         call  [draw_line]
  1781.  
  1782.         mov   eax,[npx]
  1783.         add   eax,[npxe]
  1784.         shl   eax,16
  1785.         add   eax,[npx]
  1786.         add   eax,[npxe]
  1787.         mov   ebx,[npy]
  1788.         shl   ebx,16
  1789.         add   ebx,[npy]
  1790.         add   ebx,[npye]
  1791.         call  [draw_line]
  1792.  
  1793. .ret:
  1794.         sti
  1795.         popad
  1796.         ret
  1797.  
  1798.  
  1799.  
  1800. random_shaped_window:
  1801.  
  1802. ;
  1803. ;  eax = 0    giving address of data area
  1804. ;      ebx    address
  1805. ;  eax = 1    shape area scale
  1806. ;      ebx    2^ebx scale
  1807.  
  1808.      test eax, eax
  1809.      jne  rsw_no_address
  1810.      mov  eax,[current_slot]
  1811.      mov  [eax+APPDATA.wnd_shape],ebx
  1812. rsw_no_address:
  1813.  
  1814.      cmp  eax,1
  1815.      jne  rsw_no_scale
  1816.      mov  eax,[current_slot]
  1817.      mov  byte [eax+APPDATA.wnd_shape_scale], bl
  1818. rsw_no_scale:
  1819.  
  1820.      ret
  1821.  
  1822.  
  1823.