Subversion Repositories Kolibri OS

Rev

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

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