Subversion Repositories Kolibri OS

Rev

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

  1. $Revision: 465 $
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;                                                              ;;
  4. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  5. ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
  6. ;; Distributed under terms of the GNU General Public License    ;;
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8.  
  9. max_buttons=4095
  10. dececx:
  11.     push edx
  12.     push ecx
  13.  
  14.     mov  edx,2
  15.   .loop:
  16.  
  17.     cmp   byte [esp+edx],0x20
  18.     jae   @f
  19.     mov   [esp+edx],byte 0x20
  20.    @@:
  21.     sub   [esp+edx],byte 0x20
  22.  
  23.     dec  edx
  24.     jns  .loop
  25.  
  26.     pop  ecx
  27.     pop  edx
  28.     ret
  29.  
  30. incecx:
  31.     push edx
  32.     push ecx
  33.  
  34.     mov  edx,2
  35.   .loop:
  36.  
  37.     cmp  byte [esp+edx],0xdf
  38.     jbe  @f
  39.     mov  [esp+edx],byte 0xdf
  40.    @@:
  41.     add  [esp+edx],byte 0x20
  42.  
  43.     dec  edx
  44.     jns  .loop
  45.     pop  ecx
  46.     pop  edx
  47.     ret
  48.  
  49. incecx2:
  50.     push edx
  51.     push ecx
  52.  
  53.     mov  edx,2
  54.   .loop:
  55.  
  56.     cmp  byte [esp+edx],0xeb
  57.     jbe  @f
  58.     mov  [esp+edx],byte 0xeb
  59.    @@:
  60.     add  [esp+edx],byte 0x14
  61.  
  62.     dec  edx
  63.     jns  .loop
  64.     pop  ecx
  65.     pop  edx
  66.     ret
  67.  
  68. drawbuttonframes:
  69.  
  70.         push  esi
  71.         push  edi
  72.         push  eax
  73.         push  ebx
  74.         push  ecx
  75.         push  edx
  76.  
  77.         shr   eax,16
  78.         shr   ebx,16
  79.         mov   edx,[TASK_BASE]
  80.  
  81.                 add   eax,[edx-twdw + WDATA.box.left]
  82.                 add   ebx,[edx-twdw + WDATA.box.top]
  83.         mov   cx,ax
  84.         mov   dx,bx
  85.         shl   eax,16
  86.         shl   ebx,16
  87.         mov   ax,cx
  88.         mov   bx,dx
  89.         add   ax,word [esp+12]
  90.         mov   esi,ebx
  91.         mov   edi,0
  92.         mov   ecx,[esp+0]
  93.         call  incecx
  94.         call  [draw_line]
  95.  
  96.         movzx edx,word [esp+8]
  97.         add   ebx,edx
  98.         shl   edx,16
  99.         add   ebx,edx
  100.         mov   ecx,[esp+0]
  101.         call  dececx
  102.         call  [draw_line]
  103.  
  104.         mov   ebx,esi
  105.         push  edx
  106.         mov   edx,eax
  107.         shr   edx,16
  108.         mov   ax,dx
  109.         mov   edx,ebx
  110.         shr   edx,16
  111.         mov   bx,dx
  112.         mov   dx,[esp+8+4]
  113.         add   bx,dx
  114.         pop   edx
  115.         mov   edi,0
  116.         mov   ecx,[esp+0]
  117.         call  incecx
  118.         call  [draw_line]
  119.  
  120.         mov   esi,edx
  121.         mov   dx,[esp+12]
  122.         add   ax,dx
  123.         shl   edx,16
  124.         add   eax,edx
  125.         add   ebx,1*65536
  126.         mov   edx,esi
  127.         mov   ecx,[esp+0]
  128.         call  dececx
  129.         call  [draw_line]
  130.  
  131.         pop   edx
  132.         pop   ecx
  133.         pop   ebx
  134.         pop   eax
  135.         pop   edi
  136.         pop   esi
  137.  
  138.         ret
  139.  
  140. button_dececx:
  141.  
  142.         cmp   [buttontype],dword 1
  143.         jne   .finish
  144. ;        je    bdece
  145. ;        ret
  146. ;      bdece:
  147.         push  eax
  148.         mov   eax,0x01
  149.         cmp   edi,20
  150.         jg    @f
  151.         mov   eax,0x02
  152.       @@:
  153.         test  ecx,0xff
  154.         jz    @f
  155.         sub   ecx,eax
  156.       @@:
  157.         shl   eax,8
  158.         test  ecx,0xff00
  159.         jz    @f
  160.         sub   ecx,eax
  161.       @@:
  162.         shl   eax,8
  163.         test  ecx,0xff0000
  164.         jz    @f
  165.         sub   ecx,eax
  166.       @@:
  167.         pop    eax
  168.       .finish:
  169.         ret
  170.  
  171.  
  172. sys_button:
  173.  
  174.         push    edi
  175.         mov     edi,[current_slot]
  176.         rol     eax,16
  177.         add     ax,word[edi+APPDATA.wnd_clientbox.left]
  178.         rol     eax,16
  179.         rol     ebx,16
  180.         add     bx,word[edi+APPDATA.wnd_clientbox.top]
  181.         rol     ebx,16
  182.         pop     edi
  183. .forced:
  184.  
  185.         test  ecx,0x80000000
  186.         jnz   remove_button
  187.  
  188.         push  esi
  189.         push  edi
  190.         push  eax ; <x,xs>
  191.         push  ebx ; <y,ys>
  192.         push  ecx ; <id>
  193.         push  edx
  194.  
  195.         or    ax,ax
  196.         jle   noaddbutt
  197.         or    bx,bx
  198.         jle   noaddbutt
  199.  
  200.         test  ecx,0x40000000
  201.         jnz   button_no_draw
  202.  
  203.         pushad                       ; button body
  204.         push  ebx
  205.         shr   eax,16
  206.         shr   ebx,16
  207.         mov   edx,[TASK_BASE]
  208.         mov   esi,[edx-twdw + WDATA.box.left]
  209.         mov   edi,[edx-twdw + WDATA.box.top]
  210.         add   eax,esi
  211.         add   ebx,edi
  212.         mov   cx,ax
  213.         mov   dx,bx
  214.         shl   eax,16
  215.         shl   ebx,16
  216.         mov   ax,cx
  217.         mov   bx,dx
  218.         movzx ecx,word [4+32+esp+12]
  219.         add   eax,ecx
  220.         mov   ecx,[4+32+esp+0]
  221.         cmp   [buttontype],dword 0
  222.         je    @f
  223.         call  incecx2
  224.        @@:
  225.         movzx edi,word [esp]
  226.  
  227.         pop   edx
  228.         and   edx, 0xFFFF
  229.  
  230. .newline:
  231.         call  button_dececx
  232.         push  edi
  233.         xor   edi, edi
  234.         call  [draw_line]
  235.         pop   edi
  236.         add   ebx,1*65536+1   ; [ y start | y end ]
  237.         dec   edx
  238.         jnz   .newline
  239.         popad
  240.  
  241.         call  drawbuttonframes
  242.  
  243. button_no_draw:
  244.  
  245.         and   ecx,0xffff
  246.  
  247.         mov   edi,[BTN_ADDR]
  248.         movzx eax,word [edi]
  249.         cmp   eax,max_buttons
  250.         jge   noaddbutt
  251.         inc   eax
  252.         mov   [edi],ax
  253.  
  254.         shl   eax,4
  255.         add   eax,edi
  256.  
  257.         mov   bx,[CURRENT_TASK]
  258.         mov   [eax],bx
  259.  
  260.         add   eax,2         ; save button id number
  261.         mov   ebx,[esp+4]
  262.         mov   [eax],bx      ; bits 0-15
  263.         shr   ebx,16
  264.         mov   [eax-2+0xc],bx; bits 16-31
  265.         add   eax,2         ; x start
  266.         mov   bx,[esp+12+2]
  267.         mov   [eax],bx
  268.         add   eax,2         ; x size
  269.         mov   bx,[esp+12+0]
  270.         mov   [eax],bx
  271.         add   eax,2         ; y start
  272.         mov   bx,[esp+8+2]
  273.         mov   [eax],bx
  274.         add   eax,2         ; y size
  275.         mov   bx,[esp+8+0]
  276.         mov   [eax],bx
  277.  
  278. noaddbutt:
  279.  
  280.         pop   edx
  281.         pop   ecx
  282.         pop   ebx
  283.         pop   eax
  284.         pop   edi
  285.         pop   esi
  286.  
  287.         ret
  288.  
  289.  
  290. remove_button:
  291.  
  292.     and  ecx,0x7fffffff
  293.  
  294. rnewba2:
  295.  
  296.     mov   edi,[BTN_ADDR]
  297.     mov   eax,edi
  298.     movzx ebx,word [edi]
  299.     inc   bx
  300.  
  301. rnewba:
  302.  
  303.     dec   bx
  304.     jz    rnmba
  305.  
  306.     add   eax,0x10
  307.  
  308.     mov   dx,[CURRENT_TASK]
  309.     cmp   dx,[eax]
  310.     jnz   rnewba
  311.  
  312.     cmp   cx,[eax+2]
  313.     jnz   rnewba
  314.  
  315.     pushad
  316.     mov   ecx,ebx
  317.     inc   ecx
  318.     shl   ecx,4
  319.     mov   ebx,eax
  320.     add   eax,0x10
  321.     call  memmove
  322.     dec   dword [edi]
  323.     popad
  324.  
  325.     jmp   rnewba2
  326.  
  327. rnmba:
  328.  
  329.     ret
  330.  
  331. find_pressed_button_frames:
  332.  
  333.         pushad
  334.  
  335.         movzx ebx,word [eax+0]
  336.         shl   ebx,5
  337.         add   ebx,window_data
  338.         mov   ecx, [ebx+ WDATA.box.left]     ; window x start
  339.         movzx edx,word [eax+4]     ; button x start
  340.         add   ecx,edx
  341.         push  ecx
  342.  
  343.         mov   dx,[eax+6]                 ; button x size
  344.         add   cx,dx
  345.         mov   esi,ecx
  346.         inc   esi
  347.         mov   ecx, [ebx+WDATA.box.top]   ; window y start
  348.         mov   dx,[eax+8]                 ; button y start
  349.         add   ecx,edx
  350.         mov   ebx,ecx
  351.                 mov   dx,[eax+10]                ; button y size
  352.         add   dx,cx
  353.         inc   dx
  354.  
  355.         pop   eax
  356.  
  357.         ; eax x beginning
  358.         ; ebx y beginning
  359.         ; esi x end
  360.         ; edx y end
  361.         ; ecx color
  362.  
  363.         mov   [pressed_button_eax],eax
  364.         mov   [pressed_button_ebx],ebx
  365.         mov   [pressed_button_ecx],ecx
  366.         mov   [pressed_button_edx],edx
  367.         mov   [pressed_button_esi],esi
  368.  
  369.         popad
  370.         ret
  371.  
  372. uglobal
  373.   pressed_button_eax  dd  0
  374.   pressed_button_ebx  dd  0
  375.   pressed_button_ecx  dd  0
  376.   pressed_button_edx  dd  0
  377.   pressed_button_esi  dd  0
  378. endg
  379.  
  380. ; negative button image
  381.  
  382. negativebutton:
  383.         ; If requested, do not display button
  384.         ; boarder on press.
  385.         test  ebx,0x20000000
  386.         jz    draw_negative_button
  387.         ret
  388.       draw_negative_button:
  389.  
  390.         pushad
  391.  
  392.         mov   eax,[pressed_button_eax]
  393.         mov   ebx,[pressed_button_ebx]
  394.         mov   ecx,[pressed_button_ecx]
  395.         mov   edx,[pressed_button_edx]
  396.         mov   esi,[pressed_button_esi]
  397.         mov   ecx,0x01000000
  398.  
  399.         dec   edx
  400.         push  edx
  401.         inc   edx
  402.         dec   esi
  403.         push  esi
  404.         inc   esi
  405.  
  406.         push  eax
  407.         push  ebx
  408.         push  ecx
  409.         push  edx
  410.         push  edi
  411.  
  412.         call  [disable_mouse]
  413.  
  414.       bdbnewline:
  415.         mov   edi,1    ; force
  416.         cmp   eax,[esp+16]
  417.         jz    bneg
  418.         cmp   eax,[esp+20]
  419.         jz    bneg
  420.         cmp   ebx,[esp+12]
  421.         jz    bneg
  422.         cmp   ebx,[esp+24]
  423.         jnz   nbneg
  424. ;        jz    bneg
  425. ;        jmp   nbneg
  426.  
  427.       bneg:
  428.  
  429.         ;;;call  [disable_mouse]
  430.         call  [putpixel]
  431.  
  432.       nbneg:
  433.  
  434.         inc   eax
  435.         cmp   eax,esi
  436.         jnz   bdbnewline
  437.         mov   eax,[esp+16]
  438.         inc   ebx
  439.         cmp   ebx,edx
  440.         jnz   bdbnewline
  441.  
  442.         add   esp,28
  443.  
  444.         popad
  445.  
  446.         ret
  447.  
  448. ; check buttons
  449.  
  450.  
  451. ; 0000 word process number
  452. ; 0002 word button id number : bits 0-15
  453. ; 0004 word x start
  454. ; 0006 word x size
  455. ; 0008 word y start
  456. ; 000A word y size
  457. ; 000C word button id number : bits 16-31
  458. ;
  459. ; button table in 0x10 increments
  460. ;
  461. ; first at 0x10
  462.  
  463.  
  464. checkbuttons:
  465.  
  466.     cmp   [BTN_DOWN],byte 0    ; mouse buttons pressed
  467.     jnz   @f
  468. ;..................................... start 1/5 : modified by vhanla .............................
  469.     mov [bPressedMouseXY_B],0
  470. ;..................................... end 1/5 : modified by vhanla .............................
  471.     ret
  472.   @@:
  473.     pushad
  474.  
  475.     xor    esi, esi
  476.     mov    edi, [BTN_ADDR]
  477.     movzx  edx, word [edi]
  478.     test   edx, edx
  479.     jne    @f
  480.     popad
  481.     ret
  482.  
  483.   @@:
  484. ;..................................... start 2/5 : modified by vhanla .............................
  485.   ;here i catch the coordinates when the mouse's button is clicked
  486.    push ax
  487.    cmp [bPressedMouseXY_B],0;FALSE
  488.    jnz @f
  489.    mov [bPressedMouseXY_B],1;TRUE - it was already clicked
  490.    mov ax,[MOUSE_X]
  491.    mov [mx],ax
  492.    mov ax,[MOUSE_Y]
  493.    mov [my],ax
  494.    @@:
  495.    pop  ax
  496.    ;and it is only refreshed after the mouse's button release
  497. ;..................................... end 2/5 : modified by vhanla .............................
  498.  
  499.     push  esi
  500.     inc   edx
  501.     push  edx
  502.  
  503.   buttonnewcheck:
  504.  
  505.     pop   edx
  506.     pop   esi
  507.     inc   esi
  508.     cmp   edx,esi
  509.     jge   bch
  510.  
  511.     popad                 ; no button pressed
  512.     ret
  513.  
  514.   bch:
  515.  
  516.     push  esi
  517.     push  edx
  518.     mov   eax,esi
  519.     shl   eax,4
  520.     add   eax,edi
  521.  
  522.     ; check that button is at top of windowing stack
  523.  
  524.     movzx ebx,word [eax]
  525.     movzx ecx,word [WIN_STACK + ebx * 2]
  526.     cmp   ecx,[TASK_COUNT]
  527.     jne   buttonnewcheck
  528.  
  529.     ; check that button start is inside window x/y end
  530.  
  531.     movzx ebx,word [eax+0]
  532.     shl   ebx,5
  533.  
  534.         test    [ebx+window_data+WDATA.fl_wstate],WSTATE_MINIMIZED
  535.         jnz     buttonnewcheck
  536.  
  537. ;    add   ebx,window_data
  538. ;    mov   ecx,[window_data+ebx+8]          ; window end X
  539.     movzx edx,word [eax+4]     ; button start X
  540.     cmp   edx, [window_data+ebx+WDATA.box.width] ;ecx
  541.     jge   buttonnewcheck
  542.  
  543. ;    mov   ecx,[window_data+ebx+12]         ; window end Y
  544.     movzx edx, word [eax+8]    ; button start Y
  545.     cmp   edx, [window_data+ebx+WDATA.box.height] ;ecx
  546.     jge   buttonnewcheck
  547.  
  548.     ; check coordinates
  549.                                ; mouse x >= button x ?
  550.     movzx ebx,word [eax+0]
  551.     shl   ebx,5
  552.     add   ebx,window_data
  553.         mov   ecx, [ebx+WDATA.box.left]     ; window x start
  554.     movzx edx,word [eax+4]     ; button x start
  555.     add   edx,ecx
  556. ;..................................... start 3/5 : modified by vhanla .............................
  557.     mov   cx,[mx]   ;mov cx,[MOUSE_X]
  558. ;..................................... end 3/5 : modified by vhanla .............................
  559.     cmp   edx,ecx
  560.     jg    buttonnewcheck
  561.  
  562.     movzx ebx,word [eax+6]     ; button x size
  563.     add   edx,ebx
  564.     cmp   ecx,edx
  565.     jg    buttonnewcheck
  566.  
  567.                                ; mouse y >= button y ?
  568.     movzx ebx,word [eax+0]
  569.     shl   ebx,5
  570.     add   ebx,window_data
  571.         mov   ecx, [ebx+WDATA.box.top]     ; window y start
  572.     movzx edx,word [eax+8]     ; button y start
  573.     add   edx,ecx
  574. ;..................................... start 4/5 : modified by vhanla .............................
  575.     mov   cx,[my]  ;mov cx,[MOUSE_Y]
  576. ;..................................... start 4/5 : modified by vhanla .............................
  577.     cmp   edx,ecx
  578.     jg    buttonnewcheck
  579.  
  580.     movzx ebx,word [eax+10]    ; button y size
  581.     add   edx,ebx
  582.     cmp   ecx,edx
  583.     jg    buttonnewcheck
  584.  
  585.     ; mouse on button
  586.  
  587.     pop   edx
  588.     pop   esi
  589.  
  590.     mov   bx,[eax+0xc]     ; button id : bits 16-31
  591.     shl   ebx,16
  592.     mov   bx,[eax+2]       ; button id : bits 00-16
  593.     push  ebx
  594.  
  595.     mov   [MOUSE_DOWN],byte 1  ; no mouse down checks
  596.     call find_pressed_button_frames
  597.     call negativebutton
  598.  
  599.     pushad
  600.   cbwaitmouseup:
  601.  
  602.     call  checkidle
  603.  
  604.     call  [draw_pointer]
  605.  
  606.     pushad
  607.     call  stack_handler
  608.     popad
  609.  
  610.     cmp   [BTN_DOWN],byte 0  ; mouse buttons pressed ?
  611.     jnz   cbwaitmouseup
  612.     popad
  613.  
  614.     call  negativebutton
  615.     mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
  616.     mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
  617. ;..................................... start 5/5 : modified by vhanla .............................
  618.     ; check coordinates
  619.     jmp @f
  620.     mx dw 0x0 ; keeps the x mouse's position when it was clicked
  621.     my dw 0x0 ; keeps the y mouse's position when it was clicked
  622.     bPressedMouseXY_B db 0x0
  623.     @@:
  624.  
  625.    pusha
  626.   ; mouse x >= button x ?
  627.    movzx ebx,word [eax+0]
  628.    shl   ebx,5
  629.    add   ebx,window_data
  630.    mov   ecx, [ebx+WDATA.box.left]    ; window x start
  631.    movzx edx,word [eax+4]    ; button x start
  632.    add   edx,ecx
  633.    mov   cx,[MOUSE_X]
  634.    cmp   edx,ecx
  635.    jg   no_on_button ;if we release the pointer out of the button area
  636.  
  637.    movzx ebx,word [eax+6]    ; button x size
  638.    add   edx,ebx
  639.    cmp   ecx,edx
  640.    jg   no_on_button
  641.  
  642.         ; mouse y >= button y ?
  643.    movzx ebx,word [eax+0]
  644.    shl   ebx,5
  645.    add   ebx,window_data
  646.    mov   ecx, [ebx+WDATA.box.top]    ; window y start
  647.    movzx edx,word [eax+8]    ; button y start
  648.    add   edx,ecx
  649.    mov   cx,[MOUSE_Y]
  650.    cmp   edx,ecx
  651.    jg   no_on_button
  652.  
  653.    movzx ebx,word [eax+10]   ; button y size
  654.    add   edx,ebx
  655.    cmp   ecx,edx
  656.    jg   no_on_button
  657.    popa
  658.    mov   [BTN_COUNT],byte 1 ; no of buttons in buffer
  659.    pop   ebx
  660.    mov   [BTN_BUFF],ebx   ; lets put the button id in buffer
  661.    push  ebx
  662.    pusha
  663.    jmp yes_on_button
  664. no_on_button:
  665.    mov   [BTN_COUNT],byte 0 ; no of buttons in buffer
  666. yes_on_button:
  667.    mov   [MOUSE_DOWN],byte 0 ; mouse down -> do not draw
  668.    popa
  669.    pop ebx
  670.    popa
  671.    ret
  672.  
  673. ;..................................... end 5/5 : modified by vhanla ................................
  674.