Subversion Repositories Kolibri OS

Rev

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

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