aboutsummaryrefslogtreecommitdiff
path: root/dynreceive.tcl
blob: 8a269f7a36278f497fe33a844d41a68de441aabc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package require Tclpd 0.2.1
package require TclpdLib 0.17

pd::class dynreceive {
    constructor {
        set @sym {}
        if {[pd::args] > 0} {
            set @sym [pd::arg 0 symbol]
            pd_bind [tclpd_get_instance_pd $self] [gensym $@sym]
        }
        pd::add_outlet $self
    }

    destructor {
        # don't forget to call pd_unbind, or sending things to a symbol
        # bound to dead object will crash pd!
        if {$@sym != {}} {
            pd_unbind [tclpd_get_instance_pd $self] [gensym $@sym]
        }
    }

    0_set {
        # send [set empty( to clear the receive symbol
        set s [pd::arg 0 symbol]
        if {$@sym != {}} {
            pd_unbind [tclpd_get_instance_pd $self] [gensym $@sym]
        }
        if {$s == {empty}} {
            set @sym {}
        } else {
            set @sym $s
            pd_bind [tclpd_get_instance_pd $self] [gensym $@sym]
        }
    }

    0_bang {
        pd::outlet $self 0 bang
    }

    0_float {
        pd::outlet $self 0 float [pd::arg 0 float]
    }

    0_symbol {
        pd::outlet $self 0 symbol [gensym [pd::arg 0 symbol]]
    }

    0_anything {
        set sel [pd::arg 0 symbol]
        set argz [lrange $args 1 end]
        pd::outlet $self 0 $sel $argz
    }
}