home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d9xx / d904 / cxpak.lha / CxPak / Source / WDrag.s < prev    next >
Text File  |  1993-08-26  |  8KB  |  495 lines

  1. *****
  2. *
  3. *    $VER : WDrag 1.00, Pierre-Louis MANGEARD, Feb. 1993
  4. *
  5. *****
  6.  
  7.     OPT    l-,c+,d-,w+,o1+,o2+,o3+,o4+,o5+,o6+,o7+,o10+,o11+,o12+
  8.  
  9.     INCLUDE    CxPak_Include
  10.  
  11.     SECTION        NTRYHUNK,CODE
  12.  
  13.     clr.l    d4
  14.     lea    _BSSBase,a4
  15.     lea    _DataBase,a5
  16.     
  17.     suba.l    a1,a1
  18.     EXEC        FindTask        find us
  19.     movea.l    d0,a2
  20.     move.l    d0,cxp_Task(a4)
  21.     move.b    LN_PRI(a2),Old_Pri(a4)    priorite
  22.     lea    pr_MsgPort(a2),a0
  23.     move.l    a0,cxp_Port(a5)
  24.  
  25.     tst.l    pr_CLI(a2)
  26.     bne.s    end_startup        and run the user prog
  27.  
  28. fromWorkbench
  29.  
  30. ;    move.l    cxp_Port(a5),a0        port deja en ao
  31.     CALL        WaitPort    wait for a message
  32.     move.l    cxp_Port(a5),a0
  33.     CALL        GetMsg        then get it
  34.     move.l    d0,RetMsg_    save it for later reply
  35.  
  36. end_startup
  37.  
  38.     bsr.s    _main            call our program
  39.  
  40.     tst.l    RetMsg_
  41.     beq.s    exitToDOS        if I was a CLI
  42.  
  43.     EXEC        Forbid
  44.     movea.l    RetMsg_,a1
  45.     CALL        ReplyMsg
  46.  
  47. exitToDOS
  48.  
  49.     rts
  50.  
  51. _main
  52.  
  53. *****
  54. *    debut effectif du programme.
  55. *****
  56.  
  57.     lea    cxname(a5),a1
  58.     CALL        OldOpenLibrary
  59.     move.l    d0,_CxBase(a4)
  60.     beq    cxp55
  61.  
  62.     lea    intname(a5),a1
  63.     CALL        OldOpenLibrary
  64.     move.l    d0,_IntuitionBase(a4)
  65.     beq    cxp55
  66.  
  67.     lea    layername(a5),a1
  68.     CALL        OldOpenLibrary
  69.     move.l    d0,_LayerBase(a4)
  70.     beq    cxp55
  71.  
  72.     lea    iconname(a5),a1
  73.     CALL        OldOpenLibrary
  74.     move.l    d0,_IconBase(a4)
  75.     beq    cxp55
  76.  
  77.     lea    dosname(a5),a1
  78.     CALL        OldOpenLibrary
  79.     move.l    d0,_DOSBase(a4)
  80.     beq    cxp55
  81.  
  82.  
  83.     tst.l    RetMsg_
  84.     beq    cxp020
  85.  
  86. * si on vient du workbench, recuperer ToolTypeArray :
  87.  
  88.     movea.l    RetMsg_,a2
  89.     movea.l    sm_ArgList(a2),a2    ArgList sauvegarde provisoire en a2
  90.     beq    cxp020
  91.     move.l    wa_Lock(a2),d1
  92.     DOS        CurrentDir
  93.  
  94.     movea.l    wa_Name(a2),a0        name en a0
  95.     ICON        GetDiskObject
  96.     move.l    d0,cxp_DiskObj(a4)
  97.     beq.s    cxp020
  98.     movea.l    d0,a2
  99.     movea.l    do_ToolTypes(a2),a2
  100.  
  101.  
  102. * recupere PRIORITY en tooltype :
  103.  
  104.     movea.l    a2,a0
  105.     lea    cxp_ToolType(a5),a1
  106.     CALL        FindToolType
  107.     tst.l    d0
  108.     beq.s    cxp02
  109.  
  110.     movea.l    d0,a0
  111.     clr.w    d2
  112.  
  113. * conversion ascii -> entier du tooltype CX_PRIORITY :
  114.  
  115.     cmpi.b    #'-',(a0)
  116.     bne.s    cxp06
  117.  
  118.     moveq    #1,d2
  119.     addq.l    #BYTE,a0
  120.  
  121. cxp06    moveq    #0,d0
  122.  
  123. cxp07    moveq    #0,d1
  124.     move.b    (a0)+,d1
  125.     beq.s    cxp09
  126.     subi.b    #'0',d1
  127.     add.l    d0,d0
  128.     add.l    d0,d1
  129.     lsl.l    #2,d0
  130.     add.l    d1,d0
  131.     bra.s    cxp07
  132.  
  133. cxp09    tst.w    d2
  134.     beq.s    cxp08
  135.  
  136.     neg.b    d0
  137.  
  138. cxp08    move.b    d0,cxp_Pri(a5)
  139.  
  140.  
  141. * recupere QUALIFIER en tooltype :
  142.  
  143. cxp02    movea.l    a2,a0
  144.     lea    cxp_ToolType1(a5),a1
  145.     ICON        FindToolType
  146.     tst.l    d0
  147.     beq.s    cxp04
  148.     movea.l    d0,a0
  149.     lea    IX_dumm(a4),a1
  150.     CX        ParseIX
  151.  
  152.     move.w    IX_dumm+ix_Qualifier(a4),d0
  153.     beq.s    cxp04
  154.     ori.w    #IEQUALIFIER_LEFTBUTTON,d0
  155.     move.w    d0,cxp_Qual(a5)
  156.  
  157. cxp04    movea.l    cxp_DiskObj(a4),a0
  158.     ICON        FreeDiskObject
  159.  
  160.  
  161. * definition du signal :
  162.  
  163. cxp020    clr.l    d0
  164.     movea.l    cxp_Port(a5),a1
  165.     move.b    MP_SIGBIT(a1),d0
  166.     moveq    #1,SigFlg_
  167.     lsl.l    d0,SigFlg_
  168.     ori.l    #SIGBREAKF_CTRL_C,SigFlg_
  169.  
  170. * installation du broker :
  171.  
  172.     lea    cxp_NewBroker(a5),a0
  173.     moveq    #0,d0
  174.     CX        CxBroker
  175.     move.l    d0,Broker_
  176.     beq    cxp55                si WDrag deja la
  177.  
  178. * installation du filter :
  179.  
  180.     moveq    #CX_FILTER,d0
  181.     lea    cxp_HotKey(a5),a0
  182.     suba.l    a1,a1
  183.     CALL        CreateCxObj
  184.     move.l    d0,d2
  185.     beq    cxp55
  186.     movea.l    Broker_,a0
  187.     movea.l    d0,a1
  188.     CALL        AttachCxObj
  189.  
  190.     movea.l    d2,a0
  191.     lea    IX(a5),a1
  192.     CALL        SetFilterIX
  193.  
  194. * installation du sender :
  195.  
  196.     moveq    #CX_SEND,d0
  197.     movea.l    cxp_Port(a5),a0
  198.     movea.w    #CX_MAGIC,a1
  199.     CALL        CreateCxObj
  200.     tst.l    d0
  201.     beq    cxp55
  202.     movea.l    d2,a0
  203.     movea.l    d0,a1
  204.     CALL        AttachCxObj
  205.  
  206. * definition du move gad :
  207.  
  208.     lea    cxp_DragGad(a4),a0
  209.     move.w    #GFLG_GADGHNONE,gg_Flags(a0)
  210.     move.w    #GACT_IMMEDIATE,gg_Activation(a0)
  211.  
  212. * activation du broker :
  213.  
  214.     moveq    #TRUE,d0
  215.     bsr    SwitchBroker
  216.  
  217.     movea.l    cxp_Task(a4),a1
  218.     moveq    #CXP_PRIORITY,d0
  219.     EXEC    SetTaskPri
  220.  
  221.  
  222. * recuperation du message :
  223.  
  224. cxp1    move.l    SigFlg_,d0
  225.     EXEC        Wait
  226.  
  227.     cmpi.l    #SIGBREAKF_CTRL_C,d0
  228.     bne.s    cxp3
  229.  
  230.     moveq    #CXCMD_KILL,MsgId_
  231.  
  232. cxp3    movea.l    cxp_Port(a5),a0
  233.     CALL        GetMsg
  234.     tst.l    d0
  235.     beq    cxp40
  236.     movea.l    d0,a2
  237.  
  238. * type et id du message :
  239.  
  240.     movea.l    a2,a0
  241.     CX        CxMsgType
  242.     move.w    d0,MsgType_
  243.  
  244.     movea.l    a2,a0
  245.     CALL        CxMsgID
  246.     move.w    d0,MsgId_
  247.  
  248.     movea.l    a2,a1
  249.     EXEC    ReplyMsg
  250.  
  251. * action selon le type :
  252.  
  253.     cmpi.w    #CXM_COMMAND,MsgType_
  254.     beq    cxp40
  255.  
  256.  
  257. * localisation de la fenetre :
  258.  
  259. * screen en a2 
  260.  
  261.     moveq    #0,d0
  262.     INT        LockIBase
  263.     move.l    d0,-(sp)
  264.  
  265.     movea.l    _IntuitionBase(a4),a0
  266.     movea.l    ib_FirstScreen(a0),a2
  267. cxp5    move.w    ib_MouseY(a0),d0        coord Y de la souris
  268.     cmp.w    sc_TopEdge(a2),d0        - haut de l'ecran
  269.     bge.s    cxp10
  270.     movea.l    sc_NextScreen(a2),a2
  271.     cmpa.w    #0,a2
  272.     bne.s    cxp5
  273.  
  274. cxp10    movea.l    (sp)+,a0
  275.     CALL        UnlockIBase
  276.  
  277.     movea.l    a2,a0
  278.     adda.w    #sc_LayerInfo,a0
  279.     move.l    a0,-(sp)
  280.     LAYER        LockLayerInfo
  281.  
  282.     movea.l    (sp),a0
  283.     move.w    sc_MouseX(a2),d0
  284.     move.w    sc_MouseY(a2),d1
  285.     CALL        WhichLayer
  286.     move.l    d0,d2                sauvegarde provisoire
  287.  
  288.     movea.l    (sp),a0
  289.     CALL        UnlockLayerInfo
  290.  
  291.     movea.l    (sp)+,a1            layerinfo en a1
  292.     move.l    d2,d0                restaure d0
  293.     beq    cxp1                si pas de layer, rien
  294.  
  295.     movea.l    d0,a0                layer en a0
  296.     move.l    lr_Window(a0),cxp_Window(a4)
  297.     beq    cxp1    
  298.  
  299.     movea.l    cxp_Window(a4),a0        window
  300.     lea    cxp_DragGad(a4),a1        gadget
  301.     moveq    #0,d0                en tete de liste
  302.     move.w    #GTYP_WDRAGGING,gg_GadgetType(a1)
  303.     move.l    wd_Flags(a0),d1
  304.     andi.l    #WFLG_GIMMEZEROZERO,d1
  305.     beq.s    cxp20
  306.     move.w    #GTYP_GZZGADGET+GTYP_WDRAGGING,gg_GadgetType(a1)
  307. cxp20    move.w    wd_Width(a0),gg_Width(a1)    width du gadget
  308.     move.w    wd_Height(a0),gg_Height(a1)    height du gadget
  309.     INT        AddGadget
  310.  
  311.     moveq    #1,d1
  312.     DOS        Delay
  313.  
  314.     movea.l    cxp_Window(a4),a0
  315.     lea    cxp_DragGad(a4),a1
  316.     INT        RemoveGadget
  317.  
  318.     bra    cxp1
  319.  
  320.  
  321. * on a recu un msg COMMAND :
  322.  
  323. cxp40    cmpi.w    #CXCMD_KILL,MsgId_        kill WDrag
  324.     beq.s    cxp60
  325.  
  326.     cmpi.w    #CXCMD_UNIQUE,MsgId_        toggle WDrag
  327.     beq.s    cxp60
  328.  
  329.     cmpi.w    #CXCMD_DISABLE,MsgId_        dormant WDrag
  330.     bne.s    cxp43
  331.  
  332.     moveq    #FALSE,d0
  333.     bsr.s    SwitchBroker
  334.  
  335.     bra    cxp1
  336.  
  337. cxp43    cmpi.w    #CXCMD_ENABLE,MsgId_        wake up WDrag
  338.     bne    cxp1
  339.  
  340.     moveq    #TRUE,d0
  341.     bsr.s    SwitchBroker
  342.  
  343.     bra    cxp1
  344.  
  345.  
  346. cxp55    moveq    #RETURN_ERROR,d2
  347.  
  348.     bra.s    cxp62
  349.  
  350. * Exit :
  351.  
  352. cxp60    moveq    #RETURN_OK,d2
  353.  
  354. cxp62    tst.l    Broker_
  355.     beq.s    cxp70
  356.  
  357.     movea.l    Broker_,a0
  358.     CX        DeleteCxObjAll
  359.  
  360. cxp70    movea.l    _DOSBase(a4),a1
  361.     EXEC    CloseLibrary
  362.  
  363. cxp94    movea.l    _IconBase(a4),a1
  364.     CALL        CloseLibrary
  365.  
  366. cxp93    movea.l    _LayerBase(a4),a1
  367.     CALL        CloseLibrary
  368.  
  369. cxp92    movea.l    _IntuitionBase(a4),a1
  370.     CALL        CloseLibrary
  371.  
  372. cxp91    movea.l    _CxBase(a4),a1
  373.     CALL        CloseLibrary
  374.  
  375. * restore la priorite du shell d'origine le cas echeant :
  376.  
  377. cxp90    clr.l    d0
  378.     movea.l    cxp_Task(a4),a1
  379.     move.b    Old_Pri(a4),d0
  380.     CALL    SetTaskPri
  381.  
  382.     move.l    d2,d0
  383.  
  384.     rts
  385.  
  386.  
  387. *****
  388. *    subroutines.
  389. *****
  390.  
  391. SwitchBroker:
  392.  
  393. * void SwitchBroker(BOOL)
  394. *             d0 = TRUE or FALSE
  395.  
  396.     movea.l    Broker_,a0
  397.     CX        ActivateCxObj
  398.  
  399.     rts
  400.  
  401.  
  402. *****
  403. *    version.
  404. *****
  405.  
  406.     dc.b    '$VER: WDrag 1.00 (02.93)'
  407.  
  408.     cnop    0,2
  409.  
  410.  
  411. *****
  412. *    constantes du programme.
  413. *****
  414.  
  415.     SECTION        Constantes,DATA
  416.  
  417. _DataBase:
  418.  
  419.     LAB    cxp_NewBroker:
  420.         dc.b    NB_VERSION,0
  421.         dc.l    _DataBase+cxp_BkName
  422.         dc.l    _DataBase+cxp_BkTitle
  423.         dc.l    _DataBase+cxp_BkDescr
  424.         dc.w    NBU_UNIQUE+NBU_NOTIFY
  425.         dc.w    0
  426.     DAT    cxp_Pri
  427.         dc.b    0
  428.         dc.b    0
  429.     DAT    cxp_Port
  430.         dc.l    0
  431.         dc.w    0
  432.  
  433.  
  434.     LAB    IX
  435.         dc.b    IX_VERSION
  436.         dc.b    IECLASS_RAWMOUSE
  437.         dc.w    0
  438.         dc.w    IECODE_UP_PREFIX
  439.     DAT    cxp_Qual
  440.         dc.w    IEQUALIFIER_LEFTBUTTON+IEQUALIFIER_LCOMMAND
  441.     DAT    cxp_QualMask
  442.         dc.w    CXP_QUALMASK
  443.         dc.w    0
  444.  
  445.  
  446.     CHAR    cxname
  447.         CXNAME
  448.     CHAR    dosname
  449.         DOSNAME
  450.     CHAR    intname
  451.         INTNAME
  452.     CHAR    iconname
  453.         ICONNAME
  454.     CHAR    layername
  455.         dc.b    'layers.library',0
  456.     CHAR    cxp_HotKey
  457.     CHAR    cxp_BkName
  458.         dc.b    'WDrag',0
  459.     CHAR    cxp_BkTitle
  460.         dc.b    'Drag window if possible',0
  461.     CHAR    cxp_BkDescr
  462.         dc.b    'Key+Mousebutton=drag window',0
  463.     CHAR    cxp_ToolType
  464.         dc.b    'CX_PRIORITY',0
  465.     CHAR    cxp_ToolType1
  466.         dc.b    'QUALIFIER',0
  467.  
  468.  
  469. *****
  470. *    variables du programme.
  471. *****
  472.  
  473.     SECTION        Variables,BSS
  474.  
  475.     rsreset
  476.  
  477. _CxBase        rs.l    1
  478. _IntuitionBase    rs.l    1
  479. _LayerBase    rs.l    1
  480. _IconBase    rs.l    1
  481. _DOSBase    rs.l    1
  482. cxp_Task    rs.l    1
  483. cxp_DiskObj    rs.l    1
  484. cxp_Window    rs.l    1
  485. cxp_DragGad    rs.b    gg_SIZEOF
  486. IX_dumm        rs.b    ix_SIZEOF
  487. Old_Pri        rs.b    1
  488. pad        rs.b    1
  489. Data_SizeOf    rs.l    0
  490.  
  491. _BSSBase:    ds.l    Data_SizeOf
  492.  
  493.     END
  494.  
  495.