Update of /cvsroot/pure-data/externals/hcs In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25215
Modified Files: cursor.c cursor-help.pd Log Message: first working sketch of the cursor object getting data from the system mouse pointer; It works, but it only reports for the current canvas, not all teh time. I need to dive in deeper to Krzysztof's tricks
Index: cursor-help.pd =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/cursor-help.pd,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** cursor-help.pd 17 Mar 2006 04:49:48 -0000 1.1 --- cursor-help.pd 31 Oct 2007 07:12:11 -0000 1.2 *************** *** 1,17 **** ! #N canvas 0 22 454 304 10; ! #X msg 178 124 start; ! #X msg 227 124 stop; ! #X obj 142 123 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 ! 1; ! #X obj 157 151 cursor 80 80; ! #X floatatom 99 242 5 0 0 0 - - -; ! #X floatatom 239 242 5 0 0 0 - - -; ! #X obj 131 258 print LEFT; #X obj 226 265 print RIGHT; ! #X connect 0 0 3 0; ! #X connect 1 0 3 0; ! #X connect 2 0 3 0; ! #X connect 3 0 4 0; ! #X connect 3 0 6 0; ! #X connect 3 1 5 0; ! #X connect 3 1 7 0; --- 1,39 ---- ! #N canvas 446 305 462 312 10; ! #X obj 105 271 print LEFT; #X obj 226 265 print RIGHT; ! #X obj 151 96 symbol; ! #X msg 149 61 boat; ! #X msg 109 61 clock; ! #X msg 245 61 dot; ! #X msg 275 61 dotbox; ! #X msg 322 61 gumby; ! #X msg 365 61 gobbler; ! #X msg 366 130 pirate; ! #X msg 366 87 mouse; ! #X msg 366 109 target; ! #X msg 366 151 pencil; ! #X msg 184 61 coffee_mug; ! #X msg 151 121 cursor $1; ! #X obj 49 230 pddp/print; ! #X obj 186 205 pddp/print; ! #X obj 55 132 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0 ! 1; ! #X obj 124 174 cursor; ! #X connect 2 0 14 0; ! #X connect 3 0 2 0; ! #X connect 4 0 2 0; ! #X connect 5 0 2 0; ! #X connect 6 0 2 0; ! #X connect 7 0 2 0; ! #X connect 8 0 2 0; ! #X connect 9 0 2 0; ! #X connect 10 0 2 0; ! #X connect 11 0 2 0; ! #X connect 12 0 2 0; ! #X connect 13 0 2 0; ! #X connect 14 0 18 0; ! #X connect 17 0 18 0; ! #X connect 18 0 0 0; ! #X connect 18 0 15 0; ! #X connect 18 1 1 0; ! #X connect 18 1 16 0;
Index: cursor.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/cursor.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** cursor.c 29 Oct 2007 18:58:42 -0000 1.2 --- cursor.c 31 Oct 2007 07:12:11 -0000 1.3 *************** *** 1,63 ****
! /* 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.*/ ! ! // list of Tk cursors: http://www.die.net/doc/linux/man/mann/cursors.n.html
! #include "m_pd.h" ! #include "g_canvas.h"
! typedef struct _cursor { ! t_object x_obj; ! t_outlet *x_data_outlet; ! t_outlet *x_status_outlet; } t_cursor;
! t_widgetbehavior cursor_widgetbehavior; ! static t_class *cursor_class; ! ! static void cursor_motion(t_cursor *x, t_floatarg dx, t_floatarg dy) {
}
! static void cursor_bang(t_cursor *x) {
}
! static void cursor_float(t_cursor *x, t_floatarg f) {
}
static void *cursor_new(t_symbol *s, int argc, t_atom *argv) { t_cursor *x = (t_cursor *)pd_new(cursor_class);
! return (x); ! } ! ! static void cursor_free(t_cursor *x) ! {
}
void cursor_setup(void) { ! 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);
! 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); } --- 1,120 ---- + #include <stdio.h> + #include <stdlib.h> + #include <string.h> + #include <m_pd.h> + #include <g_canvas.h>
! static t_symbol *button_symbol; ! static t_symbol *motion_symbol; ! static t_symbol *wheel_symbol;
! static t_class *cursor_class;
! typedef struct _cursor ! { ! t_object x_obj; ! t_symbol *receive_symbol; ! t_symbol *current_cursor; ! t_canvas *parent_canvas; ! t_outlet *data_outlet; ! t_outlet *status_outlet; ! t_int optionc; ! char *optionv[]; } t_cursor;
! static void cursor_float(t_cursor *x, t_float f) { + if(f > 0) + { + sys_vgui("bind all <ButtonPress> {+pd [concat %s button %%b 1 \;]}\n", + x->receive_symbol->s_name); + sys_vgui("bind all <ButtonRelease> {+pd [concat %s button %%b 0 \;]}\n", + x->receive_symbol->s_name); + sys_vgui("bind all <Motion> {+pd [concat %s motion %%x %%y \;]}\n", + x->receive_symbol->s_name); + sys_vgui("bind all <MouseWheel> {+pd [concat %s wheel %%D \;]}\n", + x->receive_symbol->s_name); + } + else + { + } + }
+ static void cursor_cursor(t_cursor *x, t_symbol *s) + { + post("setting cursor: %s", s->s_name); + x->current_cursor = s; + post("set parent%lx [winfo parent .x%lx.c]; $parent%lx configure -cursor %s \n", + x, x->parent_canvas, x, s->s_name); + sys_vgui("set parent%lx [winfo parent .x%lx.c]; $parent%lx configure -cursor %s \n", + x, x->parent_canvas, x, s->s_name); }
! static void cursor_button_callback(t_cursor *x, t_float button, t_float state) { + t_atom output_atoms[2]; + + SETFLOAT(output_atoms, button); + SETFLOAT(output_atoms + 1, state); + outlet_anything(x->data_outlet, button_symbol, 2, output_atoms); + }
+ static void cursor_motion_callback(t_cursor *x, t_float x_position, t_float y_position) + { + t_atom output_atoms[2]; + + SETFLOAT(output_atoms, x_position); + SETFLOAT(output_atoms + 1, y_position); + outlet_anything(x->data_outlet, motion_symbol, 2, output_atoms); }
! static void cursor_wheel_callback(t_cursor *x, t_float f) { + t_atom output_atom; + + SETFLOAT(&output_atom, f); + outlet_anything(x->data_outlet, wheel_symbol, 1, &output_atom); + }
+ static void cursor_free(t_cursor *x) + { + pd_unbind(&x->x_obj.ob_pd, x->receive_symbol); }
static void *cursor_new(t_symbol *s, int argc, t_atom *argv) { + char buf[MAXPDSTRING]; t_cursor *x = (t_cursor *)pd_new(cursor_class);
+ x->parent_canvas = canvas_getcurrent();
! sprintf(buf, "#%lx", (t_int)x); ! x->receive_symbol = gensym(buf); ! pd_bind(&x->x_obj.ob_pd, x->receive_symbol); ! x->data_outlet = outlet_new(&x->x_obj, 0); ! x->status_outlet = outlet_new(&x->x_obj, 0);
+ return(x); }
void cursor_setup(void) { ! cursor_class = class_new(gensym("cursor"), ! (t_newmethod)cursor_new, (t_method)cursor_free, ! sizeof(t_cursor), 0, 0);
! class_addfloat(cursor_class, (t_method)cursor_float); ! ! class_addmethod(cursor_class, (t_method)cursor_cursor, ! gensym("cursor"), A_DEFSYMBOL, 0); ! class_addmethod(cursor_class, (t_method)cursor_button_callback, ! gensym("button"), A_DEFFLOAT, A_DEFFLOAT, 0); ! class_addmethod(cursor_class, (t_method)cursor_motion_callback, ! gensym("motion"), A_DEFFLOAT, A_DEFFLOAT, 0); ! class_addmethod(cursor_class, (t_method)cursor_wheel_callback, ! gensym("wheel"), A_DEFFLOAT, 0); ! ! button_symbol = gensym("button"); ! motion_symbol = gensym("motion"); ! wheel_symbol = gensym("wheel"); }