Subversion Repositories Kolibri OS

Rev

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