FS#8961 - Anti-Aliased Fonts.
[kugel-rb.git] / apps / plugins / pdbox / PDa / src / g_guiconnect.c
blobf8356acfa838e496feb1ace001a7619a2ba57881
1 /* Copyright (c) 1997-2000 Miller Puckette.
2 * For information on usage and redistribution, and for a DISCLAIMER OF ALL
3 * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
5 /* a thing to forward messages from the GUI, dealing with race conditions
6 in which the "target" gets deleted while the GUI is sending it something.
7 */
9 #include "m_pd.h"
10 #include "g_canvas.h"
12 struct _guiconnect
14 t_object x_obj;
15 t_pd *x_who;
16 t_symbol *x_sym;
17 t_clock *x_clock;
20 static t_class *guiconnect_class;
22 t_guiconnect *guiconnect_new(t_pd *who, t_symbol *sym)
24 t_guiconnect *x = (t_guiconnect *)pd_new(guiconnect_class);
25 x->x_who = who;
26 x->x_sym = sym;
27 pd_bind(&x->x_obj.ob_pd, sym);
28 return (x);
31 /* cleanup routine; delete any resources we have */
32 static void guiconnect_free(t_guiconnect *x)
34 if (x->x_sym)
35 pd_unbind(&x->x_obj.ob_pd, x->x_sym);
36 if (x->x_clock)
37 clock_free(x->x_clock);
40 /* this is called when the clock times out to indicate the GUI should
41 be gone by now. */
42 static void guiconnect_tick(t_guiconnect *x)
44 pd_free(&x->x_obj.ob_pd);
47 /* the target calls this to disconnect. If the gui has "signed off"
48 we're ready to delete the object; otherwise we wait either for signoff
49 or for a timeout. */
50 void guiconnect_notarget(t_guiconnect *x, double timedelay)
52 if (!x->x_sym)
53 pd_free(&x->x_obj.ob_pd);
54 else
56 x->x_who = 0;
57 if (timedelay > 0)
59 x->x_clock = clock_new(x, (t_method)guiconnect_tick);
60 clock_delay(x->x_clock, timedelay);
65 /* the GUI calls this to send messages to the target. */
66 static void guiconnect_anything(t_guiconnect *x,
67 t_symbol *s, int ac, t_atom *av)
69 if (x->x_who)
70 typedmess(x->x_who, s, ac, av);
73 /* the GUI calls this when it disappears. (If there's any chance the
74 GUI will fail to do this, the "target", when it signs off, should specify
75 a timeout after which the guiconnect will disappear.) */
76 static void guiconnect_signoff(t_guiconnect *x)
78 if (!x->x_who)
79 pd_free(&x->x_obj.ob_pd);
80 else
82 pd_unbind(&x->x_obj.ob_pd, x->x_sym);
83 x->x_sym = 0;
87 void g_guiconnect_setup(void)
89 guiconnect_class = class_new(gensym("guiconnect"), 0,
90 (t_method)guiconnect_free, sizeof(t_guiconnect), CLASS_PD, 0);
91 class_addanything(guiconnect_class, guiconnect_anything);
92 class_addmethod(guiconnect_class, (t_method)guiconnect_signoff,
93 gensym("signoff"), 0);