Subversion Repositories Kolibri OS

Rev

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

  1. $Revision: 431 $
  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_TASK]
  176.         shl     edi,8
  177.         rol     eax,16
  178.         add     ax,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.left]
  179.         rol     eax,16
  180.         rol     ebx,16
  181.         add     bx,word[edi+SLOT_BASE+APPDATA.wnd_clientbox.top]
  182.         rol     ebx,16
  183.         pop     edi
  184.   .forced:
  185.  
  186.         test  ecx,0x80000000
  187.         jnz   remove_button
  188.  
  189.         push  esi
  190.         push  edi
  191.         push  eax ; <x,xs>
  192.         push  ebx ; <y,ys>
  193.         push  ecx ; <id>
  194.         push  edx
  195.  
  196.         or    ax,ax
  197.         jle   noaddbutt
  198.         or    bx,bx
  199.         jle   noaddbutt
  200.  
  201.         test  ecx,0x40000000
  202.         jnz   button_no_draw
  203.  
  204.         pushad                       ; button body
  205.         push  ebx
  206.         shr   eax,16
  207.         shr   ebx,16
  208.         mov   edx,[TASK_BASE]
  209.         mov   esi,[edx-twdw + WDATA.box.left]
  210.         mov   edi,[edx-twdw + WDATA.box.top]
  211.         add   eax,esi
  212.         add   ebx,edi
  213.         mov   cx,ax
  214.         mov   dx,bx
  215.         shl   eax,16
  216.         shl   ebx,16
  217.         mov   ax,cx
  218.         mov   bx,dx
  219.         movzx ecx,word [4+32+esp+12]
  220.         add   eax,ecx
  221.         mov   ecx,[4+32+esp+0]
  222.         cmp   [buttontype],dword 0
  223.         je    @f
  224.         call  incecx2
  225.        @@:
  226.         movzx edi,word [esp]
  227.  
  228.         pop   edx
  229.         and   edx, 0xFFFF
  230.  
  231.      .newline:
  232.         call  button_dececx
  233.         push  edi
  234.         xor   edi, edi
  235.         call  [draw_line]
  236.         pop   edi
  237.         add   ebx,1*65536+1   ; [ y start | y end ]
  238.         dec   edx
  239.         jnz   .newline
  240.         popad
  241.  
  242.         call  drawbuttonframes
  243.  
  244.       button_no_draw:
  245.  
  246.         and   ecx,0xffff
  247.  
  248.         mov   edi,[BTN_ADDR]
  249.         movzx eax,word [edi]
  250.         cmp   eax,max_buttons
  251.         jge   noaddbutt
  252.         inc   eax
  253.         mov   [edi],ax
  254.  
  255.         shl   eax,4
  256.         add   eax,edi
  257.  
  258.         mov   bx,[CURRENT_TASK]
  259.         mov   [eax],bx
  260.  
  261.         add   eax,2         ; save button id number
  262.         mov   ebx,[esp+4]
  263.         mov   [eax],bx      ; bits 0-15
  264.         shr   ebx,16
  265.         mov   [eax-2+0xc],bx; bits 16-31
  266.         add   eax,2         ; x start
  267.         mov   bx,[esp+12+2]
  268.         mov   [eax],bx
  269.         add   eax,2         ; x size
  270.         mov   bx,[esp+12+0]
  271.         mov   [eax],bx
  272.         add   eax,2         ; y start
  273.         mov   bx,[esp+8+2]
  274.         mov   [eax],bx
  275.         add   eax,2         ; y size
  276.         mov   bx,[esp+8+0]
  277.         mov   [eax],bx
  278.  
  279.      noaddbutt:
  280.  
  281.         pop   edx
  282.         pop   ecx
  283.         pop   ebx
  284.         pop   eax
  285.         pop   edi
  286.         pop   esi
  287.  
  288.         ret
  289.  
  290.  
  291. remove_button:
  292.  
  293.     and  ecx,0x7fffffff
  294.  
  295.   rnewba2:
  296.  
  297.     mov   edi,[BTN_ADDR]
  298.     mov   eax,edi
  299.     movzx ebx,word [edi]
  300.     inc   bx
  301.  
  302.   rnewba:
  303.  
  304.     dec   bx
  305.     jz    rnmba
  306.  
  307.     add   eax,0x10
  308.  
  309.     mov   dx,[CURRENT_TASK]
  310.     cmp   dx,[eax]
  311.     jnz   rnewba
  312.  
  313.     cmp   cx,[eax+2]
  314.     jnz   rnewba
  315.  
  316.     pushad
  317.     mov   ecx,ebx
  318.     inc   ecx
  319.     shl   ecx,4
  320.     mov   ebx,eax
  321.     add   eax,0x10
  322.     call  memmove
  323.     dec   dword [edi]
  324.     popad
  325.  
  326.     jmp   rnewba2
  327.  
  328.   rnmba:
  329.  
  330.     ret
  331.  
  332. find_pressed_button_frames:
  333.  
  334.         pushad
  335.  
  336.         movzx ebx,word [eax+0]
  337.         shl   ebx,5
  338.         add   ebx,window_data
  339.                 mov   ecx, [ebx+ WDATA.box.left]     ; window x start
  340.         movzx edx,word [eax+4]     ; button x start
  341.         add   ecx,edx
  342.         push  ecx
  343.  
  344.                 mov   dx,[eax+6]                 ; button x size
  345.         add   cx,dx
  346.         mov   esi,ecx
  347.         inc   esi
  348.                 mov   ecx, [ebx+WDATA.box.top]   ; window y start
  349.                 mov   dx,[eax+8]                 ; button y start
  350.         add   ecx,edx
  351.         mov   ebx,ecx
  352.                 mov   dx,[eax+10]                ; button y size
  353.         add   dx,cx
  354.         inc   dx
  355.  
  356.         pop   eax
  357.  
  358.         ; eax x beginning
  359.         ; ebx y beginning
  360.         ; esi x end
  361.         ; edx y end
  362.         ; ecx color
  363.  
  364.         mov   [pressed_button_eax],eax
  365.         mov   [pressed_button_ebx],ebx
  366.         mov   [pressed_button_ecx],ecx
  367.         mov   [pressed_button_edx],edx
  368.         mov   [pressed_button_esi],esi
  369.  
  370.         popad
  371.         ret
  372.  
  373. uglobal
  374.   pressed_button_eax  dd  0
  375.   pressed_button_ebx  dd  0
  376.   pressed_button_ecx  dd  0
  377.   pressed_button_edx  dd  0
  378.   pressed_button_esi  dd  0
  379. endg
  380.  
  381. ; negative button image
  382.  
  383. negativebutton:
  384.         ; If requested, do not display button
  385.         ; boarder on press.
  386.         test  ebx,0x20000000
  387.         jz    draw_negative_button
  388.         ret
  389.       draw_negative_button:
  390.  
  391.         pushad
  392.  
  393.         mov   eax,[pressed_button_eax]
  394.         mov   ebx,[pressed_button_ebx]
  395.         mov   ecx,[pressed_button_ecx]
  396.         mov   edx,[pressed_button_edx]
  397.         mov   esi,[pressed_button_esi]
  398.         mov   ecx,0x01000000
  399.  
  400.         dec   edx
  401.         push  edx
  402.         inc   edx
  403.         dec   esi
  404.         push  esi
  405.         inc   esi
  406.  
  407.         push  eax
  408.         push  ebx
  409.         push  ecx
  410.         push  edx
  411.         push  edi
  412.  
  413.         call  [disable_mouse]
  414.  
  415.       bdbnewline:
  416.         mov   edi,1    ; force
  417.         cmp   eax,[esp+16]
  418.         jz    bneg
  419.         cmp   eax,[esp+20]
  420.         jz    bneg
  421.         cmp   ebx,[esp+12]
  422.         jz    bneg
  423.         cmp   ebx,[esp+24]
  424.         jnz   nbneg
  425. ;        jz    bneg
  426. ;        jmp   nbneg
  427.  
  428.       bneg:
  429.  
  430.         ;;;call  [disable_mouse]
  431.         call  [putpixel]
  432.  
  433.       nbneg:
  434.  
  435.         inc   eax
  436.         cmp   eax,esi
  437.         jnz   bdbnewline
  438.         mov   eax,[esp+16]
  439.         inc   ebx
  440.         cmp   ebx,edx
  441.         jnz   bdbnewline
  442.  
  443.         add   esp,28
  444.  
  445.         popad
  446.  
  447.         ret
  448.  
  449. ; check buttons
  450.  
  451.  
  452. ; 0000 word process number
  453. ; 0002 word button id number : bits 0-15
  454. ; 0004 word x start
  455. ; 0006 word x size
  456. ; 0008 word y start
  457. ; 000A word y size
  458. ; 000C word button id number : bits 16-31
  459. ;
  460. ; button table in 0x10 increments
  461. ;
  462. ; first at 0x10
  463.  
  464.  
  465. checkbuttons:
  466.  
  467.     cmp   [BTN_DOWN],byte 0    ; mouse buttons pressed
  468.     jnz   @f
  469. ;..................................... start 1/5 : modified by vhanla .............................
  470.     mov [bPressedMouseXY_B],0
  471. ;..................................... end 1/5 : modified by vhanla .............................
  472.     ret
  473.   @@:
  474.     pushad
  475.  
  476.     xor    esi, esi
  477.     mov    edi, [BTN_ADDR]
  478.     movzx  edx, word [edi]
  479.     test   edx, edx
  480.     jne    @f
  481.     popad
  482.     ret
  483.  
  484.   @@:
  485. ;..................................... start 2/5 : modified by vhanla .............................
  486.   ;here i catch the coordinates when the mouse's button is clicked
  487.    push ax
  488.    cmp [bPressedMouseXY_B],0;FALSE
  489.    jnz @f
  490.    mov [bPressedMouseXY_B],1;TRUE - it was already clicked
  491.    mov ax,[MOUSE_X]
  492.    mov [mx],ax
  493.    mov ax,[MOUSE_Y]
  494.    mov [my],ax
  495.    @@:
  496.    pop  ax
  497.    ;and it is only refreshed after the mouse's button release
  498. ;..................................... end 2/5 : modified by vhanla .............................
  499.  
  500.     push  esi
  501.     inc   edx
  502.     push  edx
  503.  
  504.   buttonnewcheck:
  505.  
  506.     pop   edx
  507.     pop   esi
  508.     inc   esi
  509.     cmp   edx,esi
  510.     jge   bch
  511.  
  512.     popad                 ; no button pressed
  513.     ret
  514.  
  515.   bch:
  516.  
  517.     push  esi
  518.     push  edx
  519.     mov   eax,esi
  520.     shl   eax,4
  521.     add   eax,edi
  522.  
  523.     ; check that button is at top of windowing stack
  524.  
  525.     movzx ebx,word [eax]
  526.     movzx ecx,word [WIN_STACK + ebx * 2]
  527.     cmp   ecx,[TASK_COUNT]
  528.     jne   buttonnewcheck
  529.  
  530.     ; check that button start is inside window x/y end
  531.  
  532.     movzx ebx,word [eax+0]
  533.     shl   ebx,5
  534.  
  535.         test    [ebx+window_data+WDATA.fl_wstate],WSTATE_MINIMIZED
  536.         jnz     buttonnewcheck
  537.  
  538. ;    add   ebx,window_data
  539. ;    mov   ecx,[window_data+ebx+8]          ; window end X
  540.     movzx edx,word [eax+4]     ; button start X
  541.     cmp   edx, [window_data+ebx+WDATA.box.width] ;ecx
  542.     jge   buttonnewcheck
  543.  
  544. ;    mov   ecx,[window_data+ebx+12]         ; window end Y
  545.     movzx edx, word [eax+8]    ; button start Y
  546.     cmp   edx, [window_data+ebx+WDATA.box.height] ;ecx
  547.     jge   buttonnewcheck
  548.  
  549.     ; check coordinates
  550.                                ; mouse x >= button x ?
  551.     movzx ebx,word [eax+0]
  552.     shl   ebx,5
  553.     add   ebx,window_data
  554.         mov   ecx, [ebx+WDATA.box.left]     ; window x start
  555.     movzx edx,word [eax+4]     ; button x start
  556.     add   edx,ecx
  557. ;..................................... start 3/5 : modified by vhanla .............................
  558.     mov   cx,[mx]   ;mov cx,[MOUSE_X]
  559. ;..................................... end 3/5 : modified by vhanla .............................
  560.     cmp   edx,ecx
  561.     jg    buttonnewcheck
  562.  
  563.     movzx ebx,word [eax+6]     ; button x size
  564.     add   edx,ebx
  565.     cmp   ecx,edx
  566.     jg    buttonnewcheck
  567.  
  568.                                ; mouse y >= button y ?
  569.     movzx ebx,word [eax+0]
  570.     shl   ebx,5
  571.     add   ebx,window_data
  572.         mov   ecx, [ebx+WDATA.box.top]     ; window y start
  573.     movzx edx,word [eax+8]     ; button y start
  574.     add   edx,ecx
  575. ;..................................... start 4/5 : modified by vhanla .............................
  576.     mov   cx,[my]  ;mov cx,[MOUSE_Y]
  577. ;..................................... start 4/5 : modified by vhanla .............................
  578.     cmp   edx,ecx
  579.     jg    buttonnewcheck
  580.  
  581.     movzx ebx,word [eax+10]    ; button y size
  582.     add   edx,ebx
  583.     cmp   ecx,edx
  584.     jg    buttonnewcheck
  585.  
  586.     ; mouse on button
  587.  
  588.     pop   edx
  589.     pop   esi
  590.  
  591.     mov   bx,[eax+0xc]     ; button id : bits 16-31
  592.     shl   ebx,16
  593.     mov   bx,[eax+2]       ; button id : bits 00-16
  594.     push  ebx
  595.  
  596.     mov   [MOUSE_DOWN],byte 1  ; no mouse down checks
  597.     call find_pressed_button_frames
  598.     call negativebutton
  599.  
  600.     pushad
  601.   cbwaitmouseup:
  602.  
  603.     call  checkidle
  604.  
  605.     call  [draw_pointer]
  606.  
  607.     pushad
  608.     call  stack_handler
  609.     popad
  610.  
  611.     cmp   [BTN_DOWN],byte 0  ; mouse buttons pressed ?
  612.     jnz   cbwaitmouseup
  613.     popad
  614.  
  615.     call  negativebutton
  616.     mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
  617.     mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
  618. ;..................................... start 5/5 : modified by vhanla .............................
  619.     ; check coordinates
  620.     jmp @f
  621.     mx dw 0x0 ; keeps the x mouse's position when it was clicked
  622.     my dw 0x0 ; keeps the y mouse's position when it was clicked
  623.     bPressedMouseXY_B db 0x0
  624.     @@:
  625.  
  626.    pusha
  627.   ; mouse x >= button x ?
  628.    movzx ebx,word [eax+0]
  629.    shl   ebx,5
  630.    add   ebx,window_data
  631.    mov   ecx, [ebx+WDATA.box.left]    ; window x start
  632.    movzx edx,word [eax+4]    ; button x start
  633.    add   edx,ecx
  634.    mov   cx,[MOUSE_X]
  635.    cmp   edx,ecx
  636.    jg   no_on_button ;if we release the pointer out of the button area
  637.  
  638.    movzx ebx,word [eax+6]    ; button x size
  639.    add   edx,ebx
  640.    cmp   ecx,edx
  641.    jg   no_on_button
  642.  
  643.         ; mouse y >= button y ?
  644.    movzx ebx,word [eax+0]
  645.    shl   ebx,5
  646.    add   ebx,window_data
  647.    mov   ecx, [ebx+WDATA.box.top]    ; window y start
  648.    movzx edx,word [eax+8]    ; button y start
  649.    add   edx,ecx
  650.    mov   cx,[MOUSE_Y]
  651.    cmp   edx,ecx
  652.    jg   no_on_button
  653.  
  654.    movzx ebx,word [eax+10]   ; button y size
  655.    add   edx,ebx
  656.    cmp   ecx,edx
  657.    jg   no_on_button
  658.    popa
  659.    mov   [BTN_COUNT],byte 1 ; no of buttons in buffer
  660.    pop   ebx
  661.    mov   [BTN_BUFF],ebx   ; lets put the button id in buffer
  662.    push  ebx
  663.    pusha
  664.    jmp yes_on_button
  665. no_on_button:
  666.    mov   [BTN_COUNT],byte 0 ; no of buttons in buffer
  667. yes_on_button:
  668.    mov   [MOUSE_DOWN],byte 0 ; mouse down -> do not draw
  669.    popa
  670.    pop ebx
  671.    popa
  672.    ret
  673.  
  674. ;..................................... end 5/5 : modified by vhanla ................................
  675.