g_canvas.h 34.7 KB
Newer Older
Miller Puckette's avatar
Miller Puckette committed
1
2
3
4
5
6
7
8
9
/* Copyright (c) 1997-1999 Miller Puckette.
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution.  */

/* this file defines the structure for "glists" and related structures and
functions.  "Glists" and "canvases" and "graphs" used to be different
structures until being unified in version 0.35.

A glist occupies its own window if the "gl_havewindow" flag is set.  Its
10
11
appearance on its "parent", also called "owner", (if it has one) is as a graph
if "gl_isgraph" is set, and otherwise as a text box.
Miller Puckette's avatar
Miller Puckette committed
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

A glist is "root" if it has no owner, i.e., a document window.  In this
case "gl_havewindow" is always set.

We maintain a list of root windows, so that we can traverse the whole
collection of everything in a Pd process.

If a glist has a window it may still not be "mapped."  Miniaturized
windows aren't mapped, for example, but a window is also not mapped
immediately upon creation.  In either case gl_havewindow is true but
gl_mapped is false.

Closing a non-root window makes it invisible; closing a root destroys it.

A glist that's just a text object on its parent is always "toplevel."  An
embedded glist can switch back and forth to appear as a toplevel by double-
clicking on it.  Single-clicking a text box makes the toplevel become visible
and raises the window it's in.

If a glist shows up as a graph on its parent, the graph is blanked while the
glist has its own window, even if miniaturized.

*/

/* NOTE: this file describes Pd implementation details which may change
in future releases.  The public (stable) API is in m_pd.h. */  

39
40
41
#ifndef PD_G_CANVAS_H
#define PD_G_CANVAS_H

Miller Puckette's avatar
Miller Puckette committed
42
43
44
#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
extern "C" {
#endif
45
  
Miller Puckette's avatar
Miller Puckette committed
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* --------------------- geometry ---------------------------- */
#define IOWIDTH 7       /* width of an inlet/outlet in pixels */
#define IOMIDDLE ((IOWIDTH-1)/2)
#define GLIST_DEFGRAPHWIDTH 200
#define GLIST_DEFGRAPHHEIGHT 140
/* ----------------------- data ------------------------------- */

typedef struct _updateheader
{
    struct _updateheader *upd_next;
    unsigned int upd_array:1;       /* true if array, false if glist */
    unsigned int upd_queued:1;      /* true if we're queued */
} t_updateheader;

    /* types to support glists grabbing mouse motion or keys from parent */
typedef void (*t_glistmotionfn)(void *z, t_floatarg dx, t_floatarg dy);
typedef void (*t_glistkeyfn)(void *z, t_floatarg key);

EXTERN_STRUCT _rtext;
#define t_rtext struct _rtext

EXTERN_STRUCT _gtemplate;
#define t_gtemplate struct _gtemplate

EXTERN_STRUCT _guiconnect;
#define t_guiconnect struct _guiconnect

EXTERN_STRUCT _tscalar;
#define t_tscalar struct _tscalar

EXTERN_STRUCT _canvasenvironment;
#define t_canvasenvironment struct _canvasenvironment 

EXTERN_STRUCT _fielddesc;
#define t_fielddesc struct _fielddesc

82
83
84
85
86
// jsarlo
EXTERN_STRUCT _magicGlass;
#define t_magicGlass struct _magicGlass
// end jsarlo

87
88
89
90
91
92
93
94
// undo stuff
EXTERN_STRUCT _undo_action;
#define t_undo_action struct _undo_action

// preset hub stuff
EXTERN_STRUCT _preset_hub;
#define t_preset_hub struct _preset_hub

Miller Puckette's avatar
Miller Puckette committed
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
typedef struct _selection
{
    t_gobj *sel_what;
    struct _selection *sel_next;
} t_selection;

    /* this structure is instantiated whenever a glist becomes visible. */
typedef struct _editor
{
    t_updateheader e_upd;           /* update header structure */
    t_selection *e_updlist;         /* list of objects to update */
    t_rtext *e_rtext;               /* text responder linked list */
    t_selection *e_selection;       /* head of the selection list */
    t_rtext *e_textedfor;           /* the rtext if any that we are editing */
    t_gobj *e_grab;                 /* object being "dragged" */
    t_glistmotionfn e_motionfn;     /* ... motion callback */
    t_glistkeyfn e_keyfn;           /* ... keypress callback */
    t_binbuf *e_connectbuf;         /* connections to deleted objects */
    t_binbuf *e_deleted;            /* last stuff we deleted */
    t_guiconnect *e_guiconnect;     /* GUI connection for filtering messages */
    struct _glist *e_glist;         /* glist which owns this */
    int e_xwas;                     /* xpos on last mousedown or motion event */
    int e_ywas;                     /* ypos, similarly */
    int e_selectline_index1;        /* indices for the selected line if any */
    int e_selectline_outno;         /* (only valid if e_selectedline is set) */
    int e_selectline_index2;
    int e_selectline_inno;
    t_outconnect *e_selectline_tag;
    unsigned int e_onmotion: 3;     /* action to take on motion */
    unsigned int e_lastmoved: 1;    /* one if mouse has moved since click */
    unsigned int e_textdirty: 1;    /* one if e_textedfor has changed */
    unsigned int e_selectedline: 1; /* one if a line is selected */
127
128
129
    t_magicGlass *gl_magic_glass;   /* magic glass object */
	char canvas_cnct_inlet_tag[4096]; /* tags for currently highlighted nlets */
	char canvas_cnct_outlet_tag[4096];
130
131
132
    t_clock *e_clock;               /* clock to filter GUI move messages */
    int e_xnew;                     /* xpos for next move event */
    int e_ynew;                     /* ypos, similarly */
Miller Puckette's avatar
Miller Puckette committed
133
134
135
136
137
138
139
140
} t_editor;

#define MA_NONE    0    /* e_onmotion: do nothing on mouse motion */
#define MA_MOVE    1    /* drag the selection around */
#define MA_CONNECT 2    /* make a connection */
#define MA_REGION  3    /* selection region */
#define MA_PASSOUT 4    /* send on to e_grab */
#define MA_DRAGTEXT 5   /* drag in text editor to alter selection */
141
#define MA_RESIZE  6    /* drag to resize */
142
#define MA_SCROLL  7    /* scroll with middle click onto empty canvas */
Miller Puckette's avatar
Miller Puckette committed
143
144
145
146
147
148
149
150
151
152
153

/* editor structure for "garrays".  We don't bother to delete and regenerate
this structure when the "garray" becomes invisible or visible, although we
could do so if the structure gets big (like the "editor" above.) */
    
typedef struct _arrayvis
{
    t_updateheader av_upd;          /* update header structure */
    t_garray *av_garray;            /* owning structure */    
} t_arrayvis;

154
155
156
t_garray* array_garray;				/* used for sending bangs when
									   array is changed  via gui */

Miller Puckette's avatar
Miller Puckette committed
157
158
159
160
/* the t_tick structure describes where to draw x and y "ticks" for a glist */

typedef struct _tick    /* where to put ticks on x or y axes */
{
161
162
    t_float k_point;      /* one point to draw a big tick at */
    t_float k_inc;        /* x or y increment per little tick */
Miller Puckette's avatar
Miller Puckette committed
163
164
165
166
167
168
169
170
    int k_lperb;        /* little ticks per big; 0 if no ticks to draw */
} t_tick;

/* the t_glist structure, which describes a list of elements that live on an
area of a window.

*/

171
//#include "g_undo.h"
172

Miller Puckette's avatar
Miller Puckette committed
173
174
175
176
177
178
179
180
181
struct _glist
{  
    t_object gl_obj;            /* header in case we're a glist */
    t_gobj *gl_list;            /* the actual data */
    struct _gstub *gl_stub;     /* safe pointer handler */
    int gl_valid;               /* incremented when pointers might be stale */
    struct _glist *gl_owner;    /* parent glist, supercanvas, or 0 if none */
    int gl_pixwidth;            /* width in pixels (on parent, if a graph) */
    int gl_pixheight;
182
183
184
185
    t_float gl_x1;                /* bounding rectangle in our own coordinates */
    t_float gl_y1;
    t_float gl_x2;
    t_float gl_y2;
Miller Puckette's avatar
Miller Puckette committed
186
187
188
189
190
191
192
193
194
    int gl_screenx1;            /* screen coordinates when toplevel */
    int gl_screeny1;
    int gl_screenx2;
    int gl_screeny2;
    int gl_xmargin;                /* origin for GOP rectangle */
    int gl_ymargin;
    t_tick gl_xtick;            /* ticks marking X values */    
    int gl_nxlabels;            /* number of X coordinate labels */
    t_symbol **gl_xlabel;           /* ... an array to hold them */
195
    t_float gl_xlabely;               /* ... and their Y coordinates */
Miller Puckette's avatar
Miller Puckette committed
196
197
198
    t_tick gl_ytick;            /* same as above for Y ticks and labels */
    int gl_nylabels;
    t_symbol **gl_ylabel;
199
    t_float gl_ylabelx;
Miller Puckette's avatar
Miller Puckette committed
200
201
202
    t_editor *gl_editor;        /* editor structure when visible */
    t_symbol *gl_name;          /* symbol bound here */
    int gl_font;                /* nominal font size in points, e.g., 10 */
203
    int gl_zoom;                /* current zoom level (-7..8) */
Miller Puckette's avatar
Miller Puckette committed
204
205
206
207
208
209
210
211
212
    struct _glist *gl_next;         /* link in list of toplevels */
    t_canvasenvironment *gl_env;    /* root canvases and abstractions only */
    unsigned int gl_havewindow:1;   /* true if we own a window */
    unsigned int gl_mapped:1;       /* true if, moreover, it's "mapped" */
    unsigned int gl_dirty:1;        /* (root canvas only:) patch has changed */
    unsigned int gl_loading:1;      /* am now loading from file */
    unsigned int gl_willvis:1;      /* make me visible after loading */ 
    unsigned int gl_edit:1;         /* edit mode */
    unsigned int gl_isdeleting:1;   /* we're inside glist_delete -- hack! */
213
    unsigned int gl_unloading:1;    /* we're inside canvas_free */
Miller Puckette's avatar
Miller Puckette committed
214
215
216
    unsigned int gl_goprect:1;      /* draw rectangle for graph-on-parent */
    unsigned int gl_isgraph:1;      /* show as graph on parent */
    unsigned int gl_hidetext:1;     /* hide object-name + args when doing graph on parent */
217
218
    unsigned int gl_private:1;      /* private flag used in x_scalar.c */
    unsigned int gl_isclone:1;      /* exists as part of a clone object */
219
    unsigned int gl_gop_initialized:1;     /* used for tagged moving of gop-ed objects to avoid redundant reinit */
220
221
    unsigned int gl_noscroll:1;     /* don't show window scrollbars */
    unsigned int gl_nomenu:1;       /* don't show the window menu */
222
223
224
225
226
227
228
229
230
    //global preset array pointer
    t_preset_hub *gl_phub;
    //infinite undo goodies (have to stay here rather than the editor to prevent its obliteration when editor is deleted)
    t_undo_action *u_queue;
    t_undo_action *u_last;
    //dpsaha@vt.edu for the gop dynamic resizing & move handle (refactored by mathieu)
    struct _scalehandle *x_handle;
    struct _scalehandle *x_mhandle;
    t_pd *gl_svg;
231
    t_symbol *gl_templatesym; /* for "canvas" data type */
232
    t_word *gl_vec;            /* for "canvas" data type */
233
    t_gpointer gl_gp;            /* parent for "canvas" data type */
Miller Puckette's avatar
Miller Puckette committed
234
235
236
237
238
};

#define gl_gobj gl_obj.te_g
#define gl_pd gl_gobj.g_pd

239
240
241
242
243
244
245
246
/*-------------------universal preset stuff---------------------*/
// for the universal preset_node ability (see g_editor.c doconnect/disconnect functions)
// this is where all the classes capable of being controlled via preset should be defined

// preset objects
t_class *preset_hub_class;
t_class *preset_node_class;

247
// special case objects
248
extern t_class *print_class;
249
extern t_class *message_class;
250
251
/*-----------------end universal preset stuff-------------------*/

Miller Puckette's avatar
Miller Puckette committed
252
253
254
255
/* a data structure to describe a field in a pure datum */

#define DT_FLOAT 0
#define DT_SYMBOL 1
256
#define DT_TEXT 2
Miller Puckette's avatar
Miller Puckette committed
257
#define DT_ARRAY 3
258
#define DT_LIST 4
Miller Puckette's avatar
Miller Puckette committed
259
260
261
262
263

typedef struct _dataslot
{
    int ds_type;
    t_symbol *ds_name;
264
    t_symbol *ds_fieldtemplate;     /* filled in only for array/canvas fields */
265
    t_binbuf *ds_binbuf;            /* binbuf of an abstraction to be loaded */
Miller Puckette's avatar
Miller Puckette committed
266
267
268
269
270
271
272
} t_dataslot;

typedef struct _template
{
    t_pd t_pdobj;               /* header */
    struct _gtemplate *t_list;  /* list of "struct"/gtemplate objects */
    t_symbol *t_sym;            /* name */
Ivica Bukvic's avatar
Ivica Bukvic committed
273
274
275
276
277
    int t_transformable;        /* counts number of arrays in template
                                   drawn objects that depend on this
                                   template can only be transformed
                                   (scaled/skewed,rotated, etc.)
                                   if this var is 0 */
Miller Puckette's avatar
Miller Puckette committed
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
    int t_n;                    /* number of dataslots (fields) */
    t_dataslot *t_vec;          /* array of dataslots */
} t_template;

struct _array
{
    int a_n;            /* number of elements */
    int a_elemsize;     /* size in bytes; LATER get this from template */
    char *a_vec;        /* array of elements */
    t_symbol *a_templatesym;    /* template for elements */
    int a_valid;        /* protection against stale pointers into array */
    t_gpointer a_gp;    /* pointer to scalar or array element we're in */
    t_gstub *a_stub;    /* stub for pointing into this array */
};

    /* structure for traversing all the connections in a glist */
typedef struct _linetraverser
{
    t_canvas *tr_x;
    t_object *tr_ob;
    int tr_nout;
    int tr_outno;
    t_object *tr_ob2;
    t_outlet *tr_outlet;
    t_inlet *tr_inlet;
    int tr_nin;
    int tr_inno;
    int tr_x11, tr_y11, tr_x12, tr_y12;
    int tr_x21, tr_y21, tr_x22, tr_y22;
    int tr_lx1, tr_ly1, tr_lx2, tr_ly2;
    t_outconnect *tr_nextoc;
    int tr_nextoutno;
} t_linetraverser;

312
313
314
EXTERN int outconnect_visible(t_outconnect *oc);
EXTERN int outconnect_setvisible(t_outconnect *oc, int vis);

Miller Puckette's avatar
Miller Puckette committed
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
/* function types used to define graphical behavior for gobjs, a bit like X
widgets.  We don't use Pd methods because Pd's typechecking can't specify the
types of pointer arguments.  Also it's more convenient this way, since
every "patchable" object can just get the "text" behaviors. */

        /* Call this to get a gobj's bounding rectangle in pixels */
typedef void (*t_getrectfn)(t_gobj *x, struct _glist *glist,
    int *x1, int *y1, int *x2, int *y2);
        /* and this to displace a gobj: */
typedef void (*t_displacefn)(t_gobj *x, struct _glist *glist, int dx, int dy);
        /* change color to show selection: */
typedef void (*t_selectfn)(t_gobj *x, struct _glist *glist, int state);
        /* change appearance to show activation/deactivation: */
typedef void (*t_activatefn)(t_gobj *x, struct _glist *glist, int state);
        /* warn a gobj it's about to be deleted */
typedef void (*t_deletefn)(t_gobj *x, struct _glist *glist);
        /*  making visible or invisible */
typedef void (*t_visfn)(t_gobj *x, struct _glist *glist, int flag);
        /* field a mouse click (when not in "edit" mode) */
typedef int (*t_clickfn)(t_gobj *x, struct _glist *glist,
    int xpix, int ypix, int shift, int alt, int dbl, int doit);
336
337
        /* and this to displace a gobj using tags: */
typedef void (*t_displacefnwtag)(t_gobj *x, struct _glist *glist, int dx, int dy);
Miller Puckette's avatar
Miller Puckette committed
338
339
340
341
342
343
344
345
346
347
348
        /* ... and later, resizing; getting/setting font or color... */

struct _widgetbehavior
{
    t_getrectfn w_getrectfn;
    t_displacefn w_displacefn;
    t_selectfn w_selectfn;
    t_activatefn w_activatefn;
    t_deletefn w_deletefn;
    t_visfn w_visfn;
    t_clickfn w_clickfn;
349
    t_displacefnwtag w_displacefnwtag;
Miller Puckette's avatar
Miller Puckette committed
350
351
352
353
354
355
356
357
358
359
360
361
362
};

/* -------- behaviors for scalars defined by objects in template --------- */
/* these are set by "drawing commands" in g_template.c which add appearance to
scalars, which live in some other window.  If the scalar is just included
in a canvas the "parent" is a misnomer.  There is also a text scalar object
which really does draw the scalar on the parent window; see g_scalar.c. */

/* note how the click function wants the whole scalar, not the "data", so
doesn't work on array elements... LATER reconsider this */

        /* bounding rectangle: */
typedef void (*t_parentgetrectfn)(t_gobj *x, struct _glist *glist,
363
    t_word *data, t_template *tmpl, t_float basex, t_float basey,
Miller Puckette's avatar
Miller Puckette committed
364
365
366
    int *x1, int *y1, int *x2, int *y2);
        /* displace it */
typedef void (*t_parentdisplacefn)(t_gobj *x, struct _glist *glist, 
367
    t_word *data, t_template *tmpl, t_float basex, t_float basey,
Miller Puckette's avatar
Miller Puckette committed
368
369
370
    int dx, int dy);
        /* change color to show selection */
typedef void (*t_parentselectfn)(t_gobj *x, struct _glist *glist,
371
    t_word *data, t_template *tmpl, t_float basex, t_float basey,
Miller Puckette's avatar
Miller Puckette committed
372
373
374
    int state);
        /* change appearance to show activation/deactivation: */
typedef void (*t_parentactivatefn)(t_gobj *x, struct _glist *glist,
375
    t_word *data, t_template *tmpl, t_float basex, t_float basey,
Miller Puckette's avatar
Miller Puckette committed
376
377
    int state);
        /*  making visible or invisible */
378
379
typedef void (*t_parentvisfn)(t_gobj *x, struct _glist *glist,
    struct _glist *parentglist, t_scalar *sc, 
380
    t_word *data, t_template *tmpl, t_float basex, t_float basey,
381
    struct _array *parentarray, int flag);
Miller Puckette's avatar
Miller Puckette committed
382
383
384
        /*  field a mouse click */
typedef int (*t_parentclickfn)(t_gobj *x, struct _glist *glist,
    t_word *data, t_template *tmpl, t_scalar *sc, t_array *ap,
385
    t_float basex, t_float basey,
Miller Puckette's avatar
Miller Puckette committed
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
    int xpix, int ypix, int shift, int alt, int dbl, int doit);

struct _parentwidgetbehavior
{
    t_parentgetrectfn w_parentgetrectfn;
    t_parentdisplacefn w_parentdisplacefn;
    t_parentselectfn w_parentselectfn;
    t_parentactivatefn w_parentactivatefn;
    t_parentvisfn w_parentvisfn;
    t_parentclickfn w_parentclickfn;
};

    /* cursor definitions; used as return value for t_parentclickfn */
#define CURSOR_RUNMODE_NOTHING 0
#define CURSOR_RUNMODE_CLICKME 1
#define CURSOR_RUNMODE_THICKEN 2
#define CURSOR_RUNMODE_ADDPOINT 3
#define CURSOR_EDITMODE_NOTHING 4
#define CURSOR_EDITMODE_CONNECT 5
#define CURSOR_EDITMODE_DISCONNECT 6
406
407
#define CURSOR_EDITMODE_RESIZE_X 7
#define CURSOR_EDITMODE_RESIZE 8
408
#define CURSOR_SCROLL 9
409
#define CURSOR_EDITMODE_RESIZE_Y 10
410
#define CURSOR_EDITMODE_MOVE 11
Miller Puckette's avatar
Miller Puckette committed
411
412
413
414
415
416
417
418
419
420
421
EXTERN void canvas_setcursor(t_glist *x, unsigned int cursornum);

extern t_canvas *canvas_editing;    /* last canvas to start text edting */ 
extern t_canvas *canvas_whichfind;  /* last canvas we did a find in */ 
extern t_canvas *canvas_list;       /* list of all root canvases */
extern t_class *vinlet_class, *voutlet_class;
extern int glist_valid;         /* incremented when pointers might be stale */

#define PLOTSTYLE_POINTS 0     /* plotting styles for arrays */
#define PLOTSTYLE_POLY 1
#define PLOTSTYLE_BEZ 2
422
#define PLOTSTYLE_BARS 3
Miller Puckette's avatar
Miller Puckette committed
423
424
425
426
427
428
429
430
431
432
433
434
435
436

/* ------------------- functions on any gobj ----------------------------- */
EXTERN void gobj_getrect(t_gobj *x, t_glist *owner, int *x1, int *y1,
    int *x2, int *y2);
EXTERN void gobj_displace(t_gobj *x, t_glist *owner, int dx, int dy);
EXTERN void gobj_select(t_gobj *x, t_glist *owner, int state);
EXTERN void gobj_activate(t_gobj *x, t_glist *owner, int state);
EXTERN void gobj_delete(t_gobj *x, t_glist *owner);
EXTERN void gobj_vis(t_gobj *x, t_glist *glist, int flag);
EXTERN int gobj_click(t_gobj *x, struct _glist *glist,
    int xpix, int ypix, int shift, int alt, int dbl, int doit);
EXTERN void gobj_save(t_gobj *x, t_binbuf *b);
EXTERN void gobj_properties(t_gobj *x, struct _glist *glist);
EXTERN void gobj_save(t_gobj *x, t_binbuf *b);
437
EXTERN int gobj_shouldvis(t_gobj *x, struct _glist *glist);
Miller Puckette's avatar
Miller Puckette committed
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461

/* -------------------- functions on glists --------------------- */
EXTERN t_glist *glist_new( void);
EXTERN void glist_init(t_glist *x);
EXTERN void glist_add(t_glist *x, t_gobj *g);
EXTERN void glist_clear(t_glist *x);
EXTERN t_canvas *glist_getcanvas(t_glist *x);
EXTERN int glist_isselected(t_glist *x, t_gobj *y);
EXTERN void glist_select(t_glist *x, t_gobj *y);
EXTERN void glist_deselect(t_glist *x, t_gobj *y);
EXTERN void glist_noselect(t_glist *x);
EXTERN void glist_selectall(t_glist *x);
EXTERN void glist_delete(t_glist *x, t_gobj *y);
EXTERN void glist_retext(t_glist *x, t_text *y);
EXTERN void glist_grab(t_glist *x, t_gobj *y, t_glistmotionfn motionfn,
    t_glistkeyfn keyfn, int xpos, int ypos);
EXTERN int glist_isvisible(t_glist *x);
EXTERN int glist_istoplevel(t_glist *x);
EXTERN t_glist *glist_findgraph(t_glist *x);
EXTERN int glist_getfont(t_glist *x);
EXTERN void glist_sort(t_glist *canvas);
EXTERN void glist_read(t_glist *x, t_symbol *filename, t_symbol *format);
EXTERN void glist_mergefile(t_glist *x, t_symbol *filename, t_symbol *format);

462
463
464
465
466
467
EXTERN t_float glist_pixelstox(t_glist *x, t_float xpix);
EXTERN t_float glist_pixelstoy(t_glist *x, t_float ypix);
EXTERN t_float glist_xtopixels(t_glist *x, t_float xval);
EXTERN t_float glist_ytopixels(t_glist *x, t_float yval);
EXTERN t_float glist_dpixtodx(t_glist *x, t_float dxpix);
EXTERN t_float glist_dpixtody(t_glist *x, t_float dypix);
Miller Puckette's avatar
Miller Puckette committed
468
469
470
471

EXTERN void glist_getnextxy(t_glist *gl, int *xval, int *yval);
EXTERN void glist_glist(t_glist *g, t_symbol *s, int argc, t_atom *argv);
EXTERN t_glist *glist_addglist(t_glist *g, t_symbol *sym,
472
473
    t_float x1, t_float y1, t_float x2, t_float y2,
    t_float px1, t_float py1, t_float px2, t_float py2);
474
475
EXTERN void glist_arraydialog(t_glist *parent, t_symbol *s,
    int argc, t_atom *argv);
Miller Puckette's avatar
Miller Puckette committed
476
477
478
479
480
481
EXTERN t_binbuf *glist_writetobinbuf(t_glist *x, int wholething);
EXTERN int glist_isgraph(t_glist *x);
EXTERN void glist_redraw(t_glist *x);
EXTERN void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime,
    char *tag, int x1, int y1, int x2, int y2);
EXTERN void glist_eraseiofor(t_glist *glist, t_object *ob, char *tag);
Miller Puckette's avatar
test7    
Miller Puckette committed
482
483
EXTERN void canvas_create_editor(t_glist *x);
EXTERN void canvas_destroy_editor(t_glist *x);
484
EXTERN void canvas_deletelinesforio(t_canvas *x, t_text *text,
Miller Puckette's avatar
Miller Puckette committed
485
    t_inlet *inp, t_outlet *outp);
486
487
EXTERN int glist_amreloadingabstractions; /* stop GUI changes while reloading */
EXTERN int canvas_restore_original_position(t_glist *x, t_gobj *y, const char *objtag, int dir);
Miller Puckette's avatar
Miller Puckette committed
488
489

/* -------------------- functions on texts ------------------------- */
490
EXTERN void text_setto(t_text *x, t_glist *glist, char *buf, int bufsize, int pos);
Miller Puckette's avatar
Miller Puckette committed
491
492
EXTERN void text_drawborder(t_text *x, t_glist *glist, char *tag,
    int width, int height, int firsttime);
Jonathan Wilkes's avatar
Jonathan Wilkes committed
493
EXTERN void text_erase_gobj(t_text *x, t_glist *glist, char *tag);
Miller Puckette's avatar
Miller Puckette committed
494
495
496
497
498
499
500
501
502
503
504
505
EXTERN void text_eraseborder(t_text *x, t_glist *glist, char *tag);
EXTERN int text_xcoord(t_text *x, t_glist *glist);
EXTERN int text_ycoord(t_text *x, t_glist *glist);
EXTERN int text_xpix(t_text *x, t_glist *glist);
EXTERN int text_ypix(t_text *x, t_glist *glist);

/* -------------------- functions on rtexts ------------------------- */
#define RTEXT_DOWN 1
#define RTEXT_DRAG 2
#define RTEXT_DBL 3
#define RTEXT_SHIFT 4

506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
// number in comment is the number in grep -w|wc
EXTERN t_rtext *rtext_new(t_glist *glist, t_text *who); //5
EXTERN t_rtext *glist_findrtext(t_glist *gl, t_text *who); //53
EXTERN void rtext_draw(t_rtext *x); //4
EXTERN void rtext_erase(t_rtext *x); //4
EXTERN int rtext_width(t_rtext *x); //9
EXTERN int rtext_height(t_rtext *x); //9
EXTERN void rtext_displace(t_rtext *x, int dx, int dy); //3
EXTERN void rtext_select(t_rtext *x, int state); //4
EXTERN void rtext_activate(t_rtext *x, int state); //3
EXTERN void rtext_free(t_rtext *x); //4
EXTERN void rtext_key(t_rtext *x, int n, t_symbol *s); //6
EXTERN void rtext_mouse(t_rtext *x, int xval, int yval, int flag); //5
EXTERN void rtext_retext(t_rtext *x); //5
EXTERN char *rtext_gettag(t_rtext *x); //47
EXTERN void rtext_gettext(t_rtext *x, char **buf, int *bufsize); //9
522
EXTERN void rtext_settext(t_rtext *x, char *buf, int bufsize); //1
523
EXTERN void rtext_getseltext(t_rtext *x, char **buf, int *bufsize); //4
Miller Puckette's avatar
Miller Puckette committed
524
525
526
527
528
529
530
531
532

/* -------------------- functions on canvases ------------------------ */
EXTERN t_class *canvas_class;

EXTERN t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv);
EXTERN t_symbol *canvas_makebindsym(t_symbol *s);
EXTERN void canvas_vistext(t_canvas *x, t_text *y);
EXTERN void canvas_fixlinesfor(t_canvas *x, t_text *text);
EXTERN void canvas_deletelinesfor(t_canvas *x, t_text *text);
533
EXTERN void canvas_eraselinesfor(t_canvas *x, t_text *text);
Miller Puckette's avatar
Miller Puckette committed
534
535
536
EXTERN void canvas_stowconnections(t_canvas *x);
EXTERN void canvas_restoreconnections(t_canvas *x);
EXTERN void canvas_redraw(t_canvas *x);
Jonathan Wilkes's avatar
Jonathan Wilkes committed
537
538
EXTERN void canvas_closebang(t_canvas *x);
EXTERN void canvas_initbang(t_canvas *x);
Miller Puckette's avatar
Miller Puckette committed
539
540
541
542
543
544
545
546
547
548
549
550
551
552

EXTERN t_inlet *canvas_addinlet(t_canvas *x, t_pd *who, t_symbol *sym);
EXTERN void canvas_rminlet(t_canvas *x, t_inlet *ip);
EXTERN t_outlet *canvas_addoutlet(t_canvas *x, t_pd *who, t_symbol *sym);
EXTERN void canvas_rmoutlet(t_canvas *x, t_outlet *op);
EXTERN void canvas_redrawallfortemplate(t_template *tmpl, int action);
EXTERN void canvas_redrawallfortemplatecanvas(t_canvas *x, int action);
EXTERN void canvas_zapallfortemplate(t_canvas *tmpl);
EXTERN void canvas_setusedastemplate(t_canvas *x);
EXTERN t_canvas *canvas_getcurrent(void);
EXTERN void canvas_setcurrent(t_canvas *x);
EXTERN void canvas_unsetcurrent(t_canvas *x);
EXTERN t_symbol *canvas_realizedollar(t_canvas *x, t_symbol *s);
EXTERN t_canvas *canvas_getrootfor(t_canvas *x);
Miller Puckette's avatar
Miller Puckette committed
553
EXTERN void canvas_dirty(t_canvas *x, t_floatarg n);
Miller Puckette's avatar
Miller Puckette committed
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
EXTERN int canvas_getfont(t_canvas *x);
typedef int (*t_canvasapply)(t_canvas *x, t_int x1, t_int x2, t_int x3);

EXTERN t_int *canvas_recurapply(t_canvas *x, t_canvasapply *fn,
    t_int x1, t_int x2, t_int x3);

EXTERN void canvas_resortinlets(t_canvas *x);
EXTERN void canvas_resortoutlets(t_canvas *x);
EXTERN void canvas_free(t_canvas *x);
EXTERN void canvas_updatewindowlist( void);
EXTERN void canvas_editmode(t_canvas *x, t_floatarg yesplease);
EXTERN int canvas_isabstraction(t_canvas *x);
EXTERN int canvas_istable(t_canvas *x);
EXTERN int canvas_showtext(t_canvas *x);
EXTERN void canvas_vis(t_canvas *x, t_floatarg f);
EXTERN t_canvasenvironment *canvas_getenv(t_canvas *x);
EXTERN void canvas_rename(t_canvas *x, t_symbol *s, t_symbol *dir);
EXTERN void canvas_loadbang(t_canvas *x);
EXTERN int canvas_hitbox(t_canvas *x, t_gobj *y, int xpos, int ypos,
    int *x1p, int *y1p, int *x2p, int *y2p);
574
575
EXTERN t_gobj *canvas_findhitbox(t_canvas *x, int xpos, int ypos,
    int *x1p, int *y1p, int *x2p, int *y2p);
Miller Puckette's avatar
Miller Puckette committed
576
EXTERN int canvas_setdeleting(t_canvas *x, int flag);
577
EXTERN int canvas_hasarray(t_canvas *x);
Miller Puckette's avatar
Miller Puckette committed
578

579
580
581
582
#define LB_LOAD 0       /* "loadbang" actions - 0 for original meaning */
#define LB_INIT 1       /* loaded but not yet connected to parent patch */
#define LB_CLOSE 2      /* about to close */

583
584
/* ---- for parsing @pd_extra and other sys paths in filenames  --------------------- */

585
EXTERN void sys_expandpathelems(const char *name, const char *result);
586

Miller Puckette's avatar
Miller Puckette committed
587
588
589
590
591
592
593
594
595
596
597
598
599
typedef void (*t_undofn)(t_canvas *canvas, void *buf,
    int action);        /* a function that does UNDO/REDO */
#define UNDO_FREE 0                     /* free current undo/redo buffer */
#define UNDO_UNDO 1                     /* undo */
#define UNDO_REDO 2                     /* redo */
EXTERN void canvas_setundo(t_canvas *x, t_undofn undofn, void *buf,
    const char *name);
EXTERN void canvas_noundo(t_canvas *x);
EXTERN int canvas_getindex(t_canvas *x, t_gobj *y);

EXTERN void canvas_connect(t_canvas *x,
    t_floatarg fwhoout, t_floatarg foutno,t_floatarg fwhoin, t_floatarg finno);
EXTERN void canvas_disconnect(t_canvas *x,
600
    t_float index1, t_float outno, t_float index2, t_float inno);
Miller Puckette's avatar
Miller Puckette committed
601
602
603
604
EXTERN int canvas_isconnected (t_canvas *x,
    t_text *ob1, int n1, t_text *ob2, int n2);
EXTERN void canvas_selectinrect(t_canvas *x, int lox, int loy, int hix, int hiy);

605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
EXTERN t_glist *pd_checkglist(t_pd *x);

/* a function that gets called for each path by canvas_path_iterate
 * if the function returns 0, the iteration is terminated;
 * <path> pointer to the path
 * <data> is the pointer given to canvas_path_iterate()
 * <ce> is a pointer to the canvas-environment that provided <path> in its
 * search-path (or NULL)
 */
typedef int (*t_canvas_path_iterator)(const char *path, void *user_data);
/*
 * iterate over all search-paths for <x> calling <fun> with the user-supplied
 * <data>
 * iteration stops once all paths are exhausted or calling <fun> returned 0.
 */
EXTERN int canvas_path_iterate(t_canvas *x, t_canvas_path_iterator fun,
    void *user_data);
Miller Puckette's avatar
Miller Puckette committed
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640

/* ---- functions on canvasses as objects  --------------------- */

EXTERN void canvas_fattenforscalars(t_canvas *x,
    int *x1, int *y1, int *x2, int *y2);
EXTERN void canvas_visforscalars(t_canvas *x, t_glist *glist, int vis);
EXTERN int canvas_clicksub(t_canvas *x, int xpix, int ypix, int shift,
    int alt, int dbl, int doit);
EXTERN t_glist *canvas_getglistonsuper(void);

EXTERN void linetraverser_start(t_linetraverser *t, t_canvas *x);
EXTERN t_outconnect *linetraverser_next(t_linetraverser *t);
EXTERN void linetraverser_skipobject(t_linetraverser *t);

/* --------- functions on garrays (graphical arrays) -------------------- */

EXTERN t_template *garray_template(t_garray *x);

/* -------------------- arrays --------------------- */
641
EXTERN t_garray *graph_array(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
Miller Puckette's avatar
Miller Puckette committed
642
643
644
EXTERN t_array *array_new(t_symbol *templatesym, t_gpointer *parent);
EXTERN void array_resize(t_array *x, int n);
EXTERN void array_free(t_array *x);
645
646
EXTERN void array_redraw(t_array *a, t_glist *glist);
EXTERN void array_resize_and_redraw(t_array *array, t_glist *glist, int n);
647
int array_joc; /* for "jump on click" array inside a graph */
Miller Puckette's avatar
Miller Puckette committed
648
649
650
651

/* --------------------- gpointers and stubs ---------------- */
EXTERN t_gstub *gstub_new(t_glist *gl, t_array *a);
EXTERN void gstub_cutoff(t_gstub *gs);
652
EXTERN void gpointer_setglist(t_gpointer *gp, t_glist *glist, t_gobj *x);
Miller Puckette's avatar
Miller Puckette committed
653
654
655
656
657
658
659
660
661
EXTERN void gpointer_setarray(t_gpointer *gp, t_array *array, t_word *w);

/* --------------------- scalars ------------------------- */
EXTERN void word_init(t_word *wp, t_template *tmpl, t_gpointer *gp);
EXTERN void word_restore(t_word *wp, t_template *tmpl,
    int argc, t_atom *argv);
EXTERN t_scalar *scalar_new(t_glist *owner,
    t_symbol *templatesym);
EXTERN void word_free(t_word *wp, t_template *tmpl);
662
EXTERN void scalar_getbasexy(t_scalar *x, t_float *basex, t_float *basey);
Miller Puckette's avatar
Miller Puckette committed
663
EXTERN void scalar_redraw(t_scalar *x, t_glist *glist);
664
665
666
667
668
EXTERN void canvas_writescalar(t_symbol *templatesym, t_word *w, t_binbuf *b,
    int amarrayelement);
EXTERN int canvas_readscalar(t_glist *x, int natoms, t_atom *vec,
    int *p_nextmsg, int selectit);

669
EXTERN int template_has_elemtemplate(t_template *t, t_template *tmp);
Miller Puckette's avatar
Miller Puckette committed
670
671
672
673

/* ------helper routines for "garrays" and "plots" -------------- */
EXTERN int array_doclick(t_array *array, t_glist *glist, t_scalar *sc, t_array *ap,
    t_symbol *elemtemplatesym,
674
    t_float linewidth, t_float xloc, t_float xinc, t_float yloc, t_float scalarvis,
Miller Puckette's avatar
Miller Puckette committed
675
676
677
678
679
    t_fielddesc *xfield, t_fielddesc *yfield, t_fielddesc *wfield,
    int xpix, int ypix, int shift, int alt, int dbl, int doit);

EXTERN void array_getcoordinate(t_glist *glist,
    char *elem, int xonset, int yonset, int wonset, int indx,
680
    t_float basex, t_float basey, t_float xinc,
Miller Puckette's avatar
Miller Puckette committed
681
    t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc,
682
683
    t_float *xp1, t_float *xp2, t_float *yp, t_float *wp,
    int glist_topixels);
Miller Puckette's avatar
Miller Puckette committed
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707

EXTERN int array_getfields(t_symbol *elemtemplatesym,
    t_canvas **elemtemplatecanvasp,
    t_template **elemtemplatep, int *elemsizep,
    t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc, 
    int *xonsetp, int *yonsetp, int *wonsetp);

/* --------------------- templates ------------------------- */
EXTERN t_template *template_new(t_symbol *sym, int argc, t_atom *argv);
EXTERN void template_free(t_template *x);
EXTERN int template_match(t_template *x1, t_template *x2);
EXTERN int template_find_field(t_template *x, t_symbol *name, int *p_onset,
    int *p_type, t_symbol **p_arraytype);
EXTERN t_float template_getfloat(t_template *x, t_symbol *fieldname, t_word *wp,
    int loud);
EXTERN void template_setfloat(t_template *x, t_symbol *fieldname, t_word *wp,
    t_float f, int loud);
EXTERN t_symbol *template_getsymbol(t_template *x, t_symbol *fieldname,
    t_word *wp, int loud);
EXTERN void template_setsymbol(t_template *x, t_symbol *fieldname,
    t_word *wp, t_symbol *s, int loud);

EXTERN t_template *gtemplate_get(t_gtemplate *x);
EXTERN t_template *template_findbyname(t_symbol *s);
708
709
EXTERN int template_cancreate(t_template *tmp);
EXTERN int template_hasxy(t_template *tmp);
Miller Puckette's avatar
Miller Puckette committed
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
EXTERN t_canvas *template_findcanvas(t_template *tmpl);
EXTERN void template_notify(t_template *tmpl,
    t_symbol *s, int argc, t_atom *argv);

EXTERN t_float template_getfloat(t_template *x, t_symbol *fieldname,
    t_word *wp, int loud);
EXTERN void template_setfloat(t_template *x, t_symbol *fieldname,
    t_word *wp, t_float f, int loud);
EXTERN t_symbol *template_getsymbol(t_template *x, t_symbol *fieldname,
    t_word *wp, int loud);
EXTERN void template_setsymbol(t_template *x, t_symbol *fieldname,
    t_word *wp, t_symbol *s, int loud);
EXTERN t_float fielddesc_getcoord(t_fielddesc *f, t_template *tmpl,
    t_word *wp, int loud);
EXTERN void fielddesc_setcoord(t_fielddesc *f, t_template *tmpl,
725
726
727
    t_word *wp, t_float pix, int loud);
EXTERN t_float fielddesc_cvttocoord(t_fielddesc *f, t_float val);
EXTERN t_float fielddesc_cvtfromcoord(t_fielddesc *f, t_float coord);
Miller Puckette's avatar
Miller Puckette committed
728
729
730
731
732
733
734
735
736

/* ----------------------- guiconnects, g_guiconnect.c --------- */
EXTERN t_guiconnect *guiconnect_new(t_pd *who, t_symbol *sym);
EXTERN void guiconnect_notarget(t_guiconnect *x, double timedelay);

/* ------------- IEMGUI routines used in other g_ files ---------------- */
EXTERN t_symbol *iemgui_raute2dollar(t_symbol *s);
EXTERN t_symbol *iemgui_dollar2raute(t_symbol *s);

737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
/* ---------- infinite undo/redo routines found in g_undo.c ------------ */

EXTERN t_undo_action *canvas_undo_init(t_canvas *x);
EXTERN t_undo_action *canvas_undo_add(t_canvas *x,
	int type, const char *name, void *data);
EXTERN void canvas_undo_undo(t_canvas *x);
EXTERN void canvas_undo_redo(t_canvas *x);
EXTERN void canvas_undo_rebranch(t_canvas *x);
EXTERN void canvas_undo_check_canvas_pointers(t_canvas *x);
EXTERN void canvas_undo_purge_abstraction_actions(t_canvas *x);
EXTERN void canvas_undo_free(t_canvas *x);

/* --------- 1. connect ---------- */

EXTERN void *canvas_undo_set_connect(t_canvas *x,
    int index1, int outno, int index2, int inno);
EXTERN void canvas_undo_connect(t_canvas *x, void *z, int action);

/* --------- 2. disconnect ------- */

EXTERN void *canvas_undo_set_disconnect(t_canvas *x,
    int index1, int outno, int index2, int inno);
EXTERN void canvas_undo_disconnect(t_canvas *x, void *z, int action);

/* --------- 3. cut -------------- */

EXTERN void *canvas_undo_set_cut(t_canvas *x, int mode);
EXTERN void canvas_undo_cut(t_canvas *x, void *z, int action);

/* --------- 4. move ------------- */

EXTERN void *canvas_undo_set_move(t_canvas *x, int selected);
EXTERN void canvas_undo_move(t_canvas *x, void *z, int action);

/* --------- 5. paste ------------ */

773
EXTERN void *canvas_undo_set_paste(t_canvas *x, int offset, int duplicate, int d_offset);
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
EXTERN void canvas_undo_paste(t_canvas *x, void *z, int action);

/* --------- 6. apply ------------ */

EXTERN void *canvas_undo_set_apply(t_canvas *x, int n);
EXTERN void canvas_undo_apply(t_canvas *x, void *z, int action);

/* --------- 7. arrange ---------- */

EXTERN void *canvas_undo_set_arrange(t_canvas *x, t_gobj *obj, int newindex);
EXTERN void canvas_undo_arrange(t_canvas *x, void *z, int action);

/* --------- 8. canvas apply ----- */

EXTERN void *canvas_undo_set_canvas(t_canvas *x);
EXTERN void canvas_undo_canvas_apply(t_canvas *x, void *z, int action);

/* --------- 9. create ----------- */

EXTERN void canvas_undo_create(t_canvas *x, void *z, int action);
EXTERN void *canvas_undo_set_create(t_canvas *x);

/* --------- 10. recreate -------- */

EXTERN void canvas_undo_recreate(t_canvas *x, void *z, int action);
EXTERN void *canvas_undo_set_recreate(t_canvas *x, t_gobj *y, int old_pos);

/* --------- 11. font ------------ */

EXTERN void canvas_undo_font(t_canvas *x, void *z, int action);
EXTERN void *canvas_undo_set_font(t_canvas *x, int font);

/* ------------------------------- */


809
810
811
/* ---------- other things added by Mathieu (aug.2014) ----------------- */

void canvas_raise_all_cords (t_canvas *x);
812
void canvas_getscroll (t_canvas *x);
813

814
815
/* --------------------------------------------------------------------- */

816
817
818
/*-------------  g_clone.c ------------- */
extern t_class *clone_class;

Miller Puckette's avatar
Miller Puckette committed
819
820
821
#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
}
#endif
822
823

#endif // PD_G_CANVAS_H