aboutsummaryrefslogtreecommitdiff
path: root/cursor.c
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2007-10-29 18:58:45 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2007-10-29 18:58:45 +0000
commit0acd47db406f08229b38481f80958972de2bbef2 (patch)
treecbffc8b4122db217a5a1c28ef4f32a779f3699d6 /cursor.c
parent79ef1d23718aec51d59bb49078a58bb0fabfda2a (diff)
Following this thread:
http://lists.puredata.info/pipermail/pd-dev/2007-10/009797.html I have changed the save functions so that they will save the name of the object that it was actually instantiated with. This allows objects with savefns to work properly with namespaces. This is a fix for this bug: http://sourceforge.net/tracker/index.php?&aid=1818219&group_id=55736&atid=478070 svn path=/trunk/externals/hcs/; revision=8902
Diffstat (limited to 'cursor.c')
-rw-r--r--cursor.c283
1 files changed, 30 insertions, 253 deletions
diff --git a/cursor.c b/cursor.c
index f75d0eb..1a934a0 100644
--- a/cursor.c
+++ b/cursor.c
@@ -1,286 +1,63 @@
-/* (C) Guenter Geiger <geiger@xdv.org> */
+/* this object should probably register a e_motionfn callback with the root
+ * canvas so that it is guaranteed to get the mouse motion data regardless of
+ * whether the current canvas is visible. Check g_canvas.h for info.*/
-#include <m_pd.h>
-#include "g_canvas.h"
-
-/* ------------------------ cursor ----------------------------- */
-
-
-#define BACKGROUNDCOLOR "grey"
-
-#define DEFAULTSIZE 80
+// list of Tk cursors: http://www.die.net/doc/linux/man/mann/cursors.n.html
-static t_class *cursor_class;
+#include "m_pd.h"
+#include "g_canvas.h"
-typedef struct _cursor
-{
- t_object x_obj;
- t_glist * x_glist;
- t_outlet* out2;
- int x_width;
- int x_height;
- int x;
- int y;
+typedef struct _cursor {
+ t_object x_obj;
+ t_outlet *x_data_outlet;
+ t_outlet *x_status_outlet;
} t_cursor;
-/* widget helper functions */
-
-void cursor_drawme(t_cursor *x, t_glist *glist, int firsttime)
-{
- if (firsttime) {
- sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xS -fill %s\n",
- glist_getcanvas(glist),
- x->x_obj.te_xpix, x->x_obj.te_ypix,
- x->x_obj.te_xpix + x->x_width, x->x_obj.te_ypix + x->x_height,
- x,BACKGROUNDCOLOR);
- }
- else {
- sys_vgui(".x%x.c coords %xS \
-%d %d %d %d\n",
- glist_getcanvas(glist), x,
- x->x_obj.te_xpix, x->x_obj.te_ypix,
- x->x_obj.te_xpix + x->x_width, x->x_obj.te_ypix + x->x_height);
- }
-
- {
- /* outlets */
- int n = 2;
- int nplus, i;
- nplus = (n == 1 ? 1 : n-1);
- for (i = 0; i < n; i++)
- {
- int onset = x->x_obj.te_xpix + (x->x_width - IOWIDTH) * i / nplus;
- if (firsttime)
- sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xo%d\n",
- glist_getcanvas(glist),
- onset, x->x_obj.te_ypix + x->x_height - 1,
- onset + IOWIDTH, x->x_obj.te_ypix + x->x_height,
- x, i);
- else
- sys_vgui(".x%x.c coords %xo%d %d %d %d %d\n",
- glist_getcanvas(glist), x, i,
- onset, x->x_obj.te_ypix + x->x_height - 1,
- onset + IOWIDTH, x->x_obj.te_ypix + x->x_height);
- }
- /* inlets */
- n = 0;
- nplus = (n == 1 ? 1 : n-1);
- for (i = 0; i < n; i++)
- {
- int onset = x->x_obj.te_xpix + (x->x_width - IOWIDTH) * i / nplus;
- if (firsttime)
- sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xi%d\n",
- glist_getcanvas(glist),
- onset, x->x_obj.te_ypix,
- onset + IOWIDTH, x->x_obj.te_ypix + 1,
- x, i);
- else
- sys_vgui(".x%x.c coords %xi%d %d %d %d %d\n",
- glist_getcanvas(glist), x, i,
- onset, x->x_obj.te_ypix,
- onset + IOWIDTH, x->x_obj.te_ypix + 1);
-
- }
- }
-
-}
-
-
-
-
-void cursor_erase(t_cursor* x,t_glist* glist)
-{
- int n;
- sys_vgui(".x%x.c delete %xS\n",
- glist_getcanvas(glist), x);
- n = 2;
- while (n--) {
- sys_vgui(".x%x.c delete %xo%d\n",glist_getcanvas(glist),x,n);
- }
-}
-
-
-
-/* ------------------------ cursor widgetbehaviour----------------------------- */
-
-
-static void cursor_getrect(t_gobj *z, t_glist *owner,
- int *xp1, int *yp1, int *xp2, int *yp2)
-{
- int width, height;
- t_cursor* s = (t_cursor*)z;
-
-
- width = s->x_width;
- height = s->x_height;
- *xp1 = s->x_obj.te_xpix;
- *yp1 = s->x_obj.te_ypix;
- *xp2 = s->x_obj.te_xpix + width;
- *yp2 = s->x_obj.te_ypix + height;
-}
-
-static void cursor_displace(t_gobj *z, t_glist *glist,
- int dx, int dy)
-{
- t_cursor *x = (t_cursor *)z;
- x->x_obj.te_xpix += dx;
- x->x_obj.te_ypix += dy;
- cursor_drawme(x, glist, 0);
- canvas_fixlinesfor(glist_getcanvas(glist),(t_text*) x);
-}
-
-static void cursor_select(t_gobj *z, t_glist *glist, int state)
-{
- t_cursor *x = (t_cursor *)z;
- sys_vgui(".x%x.c itemconfigure %xS -fill %s\n", glist,
- x, (state? "blue" : BACKGROUNDCOLOR));
-}
+t_widgetbehavior cursor_widgetbehavior;
+static t_class *cursor_class;
static void cursor_motion(t_cursor *x, t_floatarg dx, t_floatarg dy)
{
- x->x += dx;
- x->y += dy;
- outlet_float(x->out2,x->y);
- outlet_float(x->x_obj.ob_outlet,x->x);
-}
-static void cursor_start(t_cursor *x)
-{
- glist_grab(x->x_glist, &x->x_obj.te_g, (t_glistmotionfn) cursor_motion,
- (t_glistkeyfn) NULL, NULL, NULL);
-
-/* x->x = xpos - x->x_obj.te_xpix; */
-/* x->y = ypos - x->x_obj.te_ypix; */
-/* outlet_float(x->out2,x->y); */
-/* outlet_float(x->x_obj.ob_outlet,x->x); */
}
-static void cursor_activate(t_gobj *z, t_glist *glist, int state)
+static void cursor_bang(t_cursor *x)
{
-/* t_text *x = (t_text *)z;
- t_rtext *y = glist_findrtext(glist, x);
- if (z->g_pd != gatom_class) rtext_activate(y, state);*/
- t_cursor *x = (t_cursor *) z;
- cursor_start(x);
-}
-static void cursor_delete(t_gobj *z, t_glist *glist)
-{
- t_text *x = (t_text *)z;
- canvas_deletelinesfor(glist_getcanvas(glist), x);
}
-
-static void cursor_vis(t_gobj *z, t_glist *glist, int vis)
+static void cursor_float(t_cursor *x, t_floatarg f)
{
- t_cursor* s = (t_cursor*)z;
- if (vis)
- cursor_drawme(s, glist, 1);
- else
- cursor_erase(s,glist);
-}
-/* can we use the normal text save function ?? */
-
-static void cursor_save(t_gobj *z, t_binbuf *b)
-{
- t_cursor *x = (t_cursor *)z;
- binbuf_addv(b, "ssiisii", gensym("#X"),gensym("obj"),
- (t_int)x->x_obj.te_xpix, (t_int)x->x_obj.te_ypix,
- gensym("cursor"),x->x_width,x->x_height);
- binbuf_addv(b, ";");
}
-
-t_widgetbehavior cursor_widgetbehavior;
-
-void cursor_key(t_cursor *x, t_floatarg f)
+static void *cursor_new(t_symbol *s, int argc, t_atom *argv)
{
- post("key");
-}
-
-
-
-static void cursor_click(t_cursor *x,
- t_floatarg xpos, t_floatarg ypos, t_floatarg shift, t_floatarg ctrl,
- t_floatarg alt)
-{
- glist_grab(x->x_glist, &x->x_obj.te_g, (t_glistmotionfn) cursor_motion,
- (t_glistkeyfn) NULL, xpos, ypos);
-
- x->x = xpos - x->x_obj.te_xpix;
- x->y = ypos - x->x_obj.te_ypix;
- outlet_float(x->out2,x->y);
- outlet_float(x->x_obj.ob_outlet,x->x);
-}
-
-static int cursor_newclick(t_gobj *z, struct _glist *glist,
- int xpix, int ypix, int shift, int alt, int dbl, int doit)
-{
- if (doit)
- cursor_click((t_cursor *)z, (t_floatarg)xpix, (t_floatarg)ypix,
- (t_floatarg)shift, 0, (t_floatarg)alt);
- return (1);
-}
+ t_cursor *x = (t_cursor *)pd_new(cursor_class);
-void cursor_size(t_cursor* x,t_floatarg w,t_floatarg h) {
- x->x_width = w;
- x->x_height = h;
- cursor_drawme(x, x->x_glist, 0);
-}
-static void cursor_setwidget(void)
-{
- cursor_widgetbehavior.w_getrectfn = cursor_getrect;
- cursor_widgetbehavior.w_displacefn = cursor_displace;
- cursor_widgetbehavior.w_selectfn = cursor_select;
- cursor_widgetbehavior.w_activatefn = cursor_activate;
- cursor_widgetbehavior.w_deletefn = cursor_delete;
- cursor_widgetbehavior.w_visfn = cursor_vis;
- cursor_widgetbehavior.w_clickfn = cursor_newclick;
+ return (x);
}
-
-static void *cursor_new(t_floatarg h,t_floatarg o)
+static void cursor_free(t_cursor *x)
{
- t_cursor *x = (t_cursor *)pd_new(cursor_class);
- x->x_glist = (t_glist*) canvas_getcurrent();
- if (h) x->x_width = h;
- else
- x->x_width = DEFAULTSIZE;
-
- if (o) x->x_height = o;
- else
- x->x_height = DEFAULTSIZE;
-
- outlet_new(&x->x_obj, &s_float);
- x->out2 = outlet_new(&x->x_obj, &s_float);
-
- return (x);
}
void cursor_setup(void)
{
- cursor_class = class_new(gensym("cursor"), (t_newmethod)cursor_new, 0,
- sizeof(t_cursor),0, A_DEFFLOAT,A_DEFFLOAT,0);
-
- class_addcreator((t_newmethod)cursor_new,gensym("bng"),A_DEFSYM,A_DEFFLOAT,A_DEFFLOAT,A_GIMME,0);
+ cursor_class = class_new(gensym("cursor"), (t_newmethod)cursor_new,
+ (t_method)cursor_free, sizeof(t_cursor), 0, A_GIMME, 0);
+ class_addbang(cursor_class, cursor_bang);
+ class_addfloat(cursor_class, cursor_float);
- class_addmethod(cursor_class, (t_method)cursor_click, gensym("click"),
- A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
- class_addmethod(cursor_class, (t_method)cursor_size, gensym("size"),
- A_FLOAT, A_FLOAT, 0);
-
- class_addmethod(cursor_class,(t_method) cursor_start,gensym("start"),0);
-/* class_addfloat(cursor_class,(t_method) cursor_float); */
-
- cursor_setwidget();
- class_setwidget(cursor_class,&cursor_widgetbehavior);
-#if PD_MINOR_VERSION >= 37
- class_setsavefn(cursor_class,&cursor_save);
-#endif
+ cursor_widgetbehavior.w_getrectfn = NULL;
+ cursor_widgetbehavior.w_displacefn = NULL;
+ cursor_widgetbehavior.w_selectfn = NULL;
+ cursor_widgetbehavior.w_activatefn = NULL;
+ cursor_widgetbehavior.w_deletefn = NULL;
+ cursor_widgetbehavior.w_visfn = NULL;
+ cursor_widgetbehavior.w_clickfn = NULL;
+ class_setwidget(cursor_class, &cursor_widgetbehavior);
}
-
-