aboutsummaryrefslogtreecommitdiff
path: root/desiredata/src/TODO
blob: d20bb7be40943c6c79d464bab4bcb7902d01894d (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
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
82
83
84
85
86
87
88
89
90
91
92
93
94
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
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
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
DesireData's TODO list, $Id: TODO,v 1.1.2.28.2.63 2007/09/09 17:45:45 matju Exp $

LEGEND:
  [c] client
  [s] server
  [b] both
  [x] done

[ ] update translation credits

------------------8<--------cut-here--------8<------------------

[s] encapsulate wires list
[s] observable boxes list
[s] observable wires list
[s] gop filter
[s] triad

------------------8<--------cut-here--------8<------------------

[ ] do not install .svn folders
[s] class_setreinit(t_pd *, t_symbol *s, int argc, t_atom *argv)
[s] fix canvas_merge, canvas_remove_nth, canvas_sort
[s] recreate abstr instances after abstr save
[s] [bng] messages get duplicated upon entering a subpatch???
[s] rewrite [any]
[s] counter-test.pd shows [nbx] jamming the update queue if too many updates at once...?
[s] queue priorities cause double call to changed() to change the expected order of updates (dangling pointer in client)
[c] Ctrl+e doesn't change Edit menu entry; likewise for visual_diff
[c] Save Changes? Save Changes? Save Changes? Save Changes? Save Changes? Save Changes? Save Changes? Save Changes? Save Changes?
[s] canvas_resortinlets confuses wire upload
[s] should do canvas_resortinlets after moving objects
[c] split View into several classes
[s] extraneous space at end of binbuf_gettext
[s] make t_hash thread-safe (use external iterator)
[s] take advantage of the support for zero-size arrays in gcc.
[s] writesf_free has deadlock.
[b] look into race conditions and locking
[c] figure out what to do about the existence of [$self look] vs ordinary attributes (pointer_sense= and such)
[s] [error]
[s] [netsend] is unreliable: buffer too full drops chunks of messages, not at message boundaries
[b] localise error messages
[b] colorised console with hyperlinked error messages
[c] atomic undo
[c] undo subpatch
[c] numbox: is_log
[c] change the order of the fields in Properties if it makes things more logical than the order of fields of savefn
[c] [hradio] : chg -> is_log
[c] [vu] props : scale should appear instead of is_log
[s] figure out how to keep [pd] subscribed even when closed.
[s] new parser for nested lists and extended symbols
[s] update s_audio.c to support any number of devices (not just max 4)
[s] look for new bugs involving %*s added around 2007.06.28
[c] new way to do View get_canvas
[b] too much duplication of inlets vs outlets
[s] too much duplication of adc vs dac (see s_audio.c)
[c] implement multiple cascaded languages (use listbox+up+down)
[c] def Menuable raise {} {wm withdraw $w; wm deiconify $w
[s] what to do with post() in case of -listdev, etc.?
[s] turn old [dropper] code into a feature of SymbolBox
[s] inheritance: [super] "instantiates" other abstraction with same $0; [self] allows sending messages to self; [declare super ...] makes the tree.
[b] pd-dev message to Ed Kelly, October 5.
[b] GOP problems are back due to recent changes in canvas_map and canvas_vis.
    now that abstractions don't get loaded into the client anymore, GOP can't always be drawn anymore too.
     i mean, because the content of GOP is not uploaded to the client, so the client can't draw anything about it..
     unless def View outside_of_the_box are moved to the server side and the server only uploads what needs to be drawn
     for gop

     another side effect of not uploading the content of [pd]/abs that i just found out is that, when deleting such object,
     1. the client won't be able to perform things like $wire deconstruct in def Canvas del,
        as the object don't exists in the client side
     2. even if client don't call things like that, the server would still send -> delete message to the client,
        which causes the same error because the object don't exists...

[s] it might make sense to always upload subpatches but upload instances only when needed
[s] server don't send delete message back after client sending "object_delete" (http://pastebin.ca/318343)
[s] serial got sent too early when creating [pd] with push & #N canvas (http://pastebin.ca/318318)
[s] GOP problems are back due to recent changes in canvas_map and canvas_vis
[s] [route] should be reconfigurable and accept pointer
[s] [select] should accept pointer
[s] [moses] should be multi-arg (and be aliased to [range] ?)
[s] get rid of stderr in server
[s] prevent hidden subpatches/abstraction-instances from being loaded in the client all of the time.
[s] -lib in .pdrc crashes server: http://pastebin.ca/286300
[s] server don't pick up changes via NumBox reload, ie the width:
    <- .x8068058 reload 2 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 256;
    -> change x8068058 x8067c50 {#X obj 335 166 nbx 8 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 256;}
[b] fix gop
    [c] reimplement View get_canvas so that it does not rely on [focus]
    [s] gop contains can be drawn if not uploaded to client
[ ] fix deleteing/closing Canvas
    [ ] server sends -> x806a3b8 delete twice
    [ ] fix deletion order
[ ] graphical array rendering optimization
[ ] fix double delete of [pd].
[s] added "version 2" syntax parser (optional), which has nested lists,
    extended quoting, extended float syntax
    (some ex-symbols now parsed as floats: +1 +1.0 +1e8 0x10 and so on.)
[ ] note that Marius Schebella is interested in benchmarks
[ ] atomically with multiple level
[ ] tidy_up/snap to grid
[ ] cleaner parsing of [expr]... remove int type because it causes e.g. [expr 8.0 / 10.0] = 0 but [expr 8.0/10.0] = 0.8
[ ] how does [declare -stdpath] work? this is a mystery. can't get it to work in pd 0.40.

[ ] PureUnity
    [ ] benchmark
    [ ] signals
    [ ] grids
    [ ] transitive, antisymmetric, predicate
    [ ] contracts : *-rule.pd
    [ ] tests for the frameworks' own components?
 * not finished:
   [glue-test]
   [comparators-test] [arith-test]
   [operator1-rule] [operator1-test]
   [operator2-rule] [operator2-test]

[s] those are the externs that have to be recompiled if I want to trap calls to return values of getfn.
  ./externals/olafmatt/clone/clone.c:544:    mess1(&cv->gl_pd, gensym("dsp"), sp);
  ./externals/grill/dynext/src/main.cpp:952: mess1((t_pd *)canvas,const_cast<t_symbol *>(sym_dsp),NULL);

<shift8> matju: another big bug for me - v/h sliders in existing patches bounce
 repeatedly back to bottom when some kind of event occurs.  you have to move the
 mouse very gently back and forth until the slider stays at the location you want,
 then without moving the mouse, release the mouse button :(

[s] allow helpfiles to load without having to "make install".
[s] switch iemguis to using only t_atoms
[s] MIDI loopback pseudo-device (inside pd)
[s] audio loopback pseudo-device (inside pd)
[s] use vector doubling in binbuf_add,binbuf_addv...
[c] opening an already-open subpatch should just raise that subpatch
[c] bug: you can move parts of gop subpatches, from the parent patch!
[c] pixel offsets are not correct in [hsl] [vsl]:
    distinguish between $@w or $@h and actual size. there should be 4 extra pixels.
[c] hide inlets/outlets of IEMGUI when they have receive-symbols/send-symbols
[c] rightclick help doesn't work on [cnv]: tries to find help for "cnv.pd" ???
[s] creating a graph causes crash.
[b] fix NumBox's width and height (or remove those settings)
[x] Implement (or fix) Find, Find Again in class Client
    [x] with ability to search substrings
    [ ] with ability to search across canvases
	[ ] all canvases
	[x] all subcanvases
	[x] only the current one
    [ ] with regexps
    [ ] with replace
[ ] in hsl-help.pd, [hsl] shouldn't appear as a Radio.
[ ] canvas dialog:
    [ ] add option for old-style GOP
    [ ] make hidetext work
    [ ] add units/pixel
[c] array button doesn't work (menuarray)
[c] implement timeout in def Manager call
[s] finish merging 0.40 (wasn't it finished?)
[s] merge 0.41 (no?)
[s] proper symbol quoting
[s] refcounted symbols
[c] patching-in-tongues follow-up
[c] def def
[c] take care of needless "save changes?"
[c] make List objects, to manage children, visible_children, wires, selection, selection_wires.
[c] skip unneeded motion events inside client (do we need this?)
[b] rename pd to pd-server, desire.tk to pd-client, add new program "pd" which would launch both (will we really do this?)
[b] #V test with bg color
[c] kill global tooltip variable ?
[c] iemprops: min,max labels broken
[b] fix the [key] and [keyup] and [mouse] (?) classes
[s] fix all issues with backslashes and braces.
[-] write an installer in Tcl/Tk.
[s] canvas_object_insert()
[c] simplify def Dialog add
[c] devlist isn't supposed to be like a choice, rather like several choices.
[c] implement def Canvas tidy
[c] set tk::mac::useCGDrawing 1
[s] differential upload
[c] differential redraw
[b] improved dirty_lists including proper array support
[b] bang counter (instead of sending every bang message to client)
[b] implement garray
[c] implement a mark-and-sweep in order to find leaks... (?)
[b] rewrite [image], [display], [knob], [grid], [popup], ...
[ ] this seems fishy but might have good ideas -> http://www.rebelscience.org/Cosas/Reliability.htm
[c] make a statistical profiler for Tcl, if possible
[c] try to use profiler.tcl (tcllib) in a sensible way
[s] try C-oriented tools:
    [ ] oprofile (with GUI)
    [ ] memprof
    [ ] sysprof
    [ ] kprof
    [ ] gprof
    [ ] prospect

[s] iirc, bang~ registers a timer callback. the problem is that the timer callbacks are only executed every dac block,
    which is 64 samples. so running bang~ in subpatch with less than 64 samples, bang~ sets the same timer several times,
    but it's only executed once.

[b] think about this «if you are reconsidering properties panels, I strongly encourage all y'all to make them Pd patches.
    This is how Max/MSP does it and I think it would work very well for Pd as well.  Sounds like this is a good opportunity
    to make the switch.» -- hcs

<chun> 1. a keyboard operated cursor, a bit like Active, but one can use it like the mouse pointer
<chun> 2. snap to grid feature, or similiar 
<chun> 3. prefix keybindings, like M-x in emacs

Iohannes said about redirecting stdout/stderr:
  pd -verbose -stderr 2>&1 | while read line; do echo "${line};" | pdsend 6666 localhost udp; done

[b] [struct], scalar, DS-array, [plot], [drawpolygon], [drawnumber], ...
[c] desire.tk can be *really* loaded without Tk
[c] ReadLine or NCurses interface
[c] make commandline options reloadable at runtime
[x] canvas scrollbars auto-disappear when not needed.
[b] implement dirty flag
[s] use gensym2() in builtin classes and stuff.
[s] fix 64-bit arrays so that carmen gets a use for DD.
[s] carmen also needs strings (no symbol leakage)
[c] right-click on labels for translations.
[b] http://www.w3.org/DesignIssues/Diff
[c] solve printing problems with GDB. use a pty (pseudo-teletype) ---> http://wiki.tcl.tk/3916
[c] try TkZinc
[c] try Tcl/Gtk (Gnocl) with emulation layer
[?] http://www.comparisonics.com/gallery.html
[c] obiwannabe writes:
    it would be good to have the choice as a comandline arg of the first one launched with a way
    to accept patches to open in the same instance from, say a web browser. Like also when you are
    in a file manager and browsing some .pd files you really want them to open in the same running instance.
[s] must work with ALL gridflow samples
[b] objectbox argument completion
[b] messagebox completion
[c] tooltips on arguments/inlets/outlets
[c] option to make non-gui objects appear on a GOP (?)
[b] multilingual labels in objects
[b] multilingual comments
[b] what would be needed to be able to use gdb --pid=... ?
[ ] set tk::mac::CGAntialiasLimit 2
[ ] try Doxygen's callgraphs
[ ] try splint (http://www.splint.org/)
[ ] try uno
[ ] try CCCC
[ ] try OSX Shark
[ ] try http://www.drugphish.ch/~jonny/cca.html
[-] do we move the trac to artengine or not?
[c] remember that it's possible to use break in a bind-handler, to completely override system's behaviour.
[c] try: itcl itk iwidgets (itk implements megawidgets)
[c] try tkgate, a hardware sim program
[ ] try libentity
[c] try vtk-tcl
[s] make sure $0 actually works (see canvas_realizedollar)
[c] test rcv_able, snd_able
[?] iem: snd/rcv problem(s) ? (what was that?)
[c] [vu] have fcol in props !
[c] [vu] has snd in props !
[b] Duplicate wires?
[c] Can connect object to an object that is inside a GOP (!!!!)
[c] weird offset stuff when there are negative canvas coords sometimes.
[s] Bug: bad quoting in sys_mgui()
[b] Bug: spaces in name of vslider cause corruption of properties (devel_0_37)
[b] classlist: add method signatures
[c] bang flash delays should be reimplemented
[c] pdrc_options radio don't load/save
[c] patch window may open off-screen (all branches)
[c] patch window may open too big (all branches, osx)
[b] properties on objectboxes (generic dialogs tapping into method signatures) (?)
    [s] hooks for outsourcing the preceding stuff to a plugin (eg: GridFlow, PyExt)
[b] VT100 colours in console
[b] [graph] is too slow (gui) for real big arrays
[b] freeform comments (no atom parsing)
[b] preserve whitespace in textboxes?
[b] inlet inspector to show what are the message types expected by an inlet
    that could read like "int: set left operand; bang: do it"
[c] custom buttonbars (including premade objects with args like a [t b f] and such)
    [c] with configurable hotkeys
[b] colored wires
[b] insert_object makes error with multiple selection.
[c] popup_properties on multiple selection.
[b] segmented patchcords:
    [c] a hotkey to click on the cord, and add a new segment
    [c] a hotkey to drag the "points" (where two lines meet)
    [c] a modifier key to delete a segment (actually the others should be that way too)
    [c] you should be able to right click on a regular wire, and press "segment" or do a hotkey with it
        and it automatically turns it into an straight-elbow multisegmented wire
[b] [t a] could be a very small GUI object (called "null object")
[b] all the [t] could be GUI objects
[b] GUI objects for [inlet] and [outlet] and [pd] ([page])
[-] make a sort of pd-extended, call it DesireData Express or (gasp) Extraordinaire.

[s] symbol vs strings: Ruby is right: the Symbol vs String distinction is annoying and possibly obsolete.
    according to me, symbols exist mostly because LISP had them before they had strings, and because most
    Strings implementations aren't powerful enough to be as fast (or almost as fast) as Symbols.
    (well, for compatibility reasons, just like in Ruby, we can't remove symbol support completely, but
    at least we can reduce the difference between strings and symbols to a minimum.)

[b] server-side IEMGUI could be turned into Tcl-based externs OR EVEN become abstractions.
    it's possible to make a DesireData GUI for any Pd class, including abstractions.
    to turn IEMGUI into an abstraction, what's missing is the savefn/saveargs/scanargs business.

[s] I would like to know how much it is feasible to compress the t_atom
    structure so that even with 64-bit pointers the t_atom still stays 8 bytes
    instead of 16. I think it's possible, but not necessarily in a
    backwards-compatible way, and not necessarily in a portable way. also maybe it's not that useful.

[c] splashscreen: we could make it different than other programs by inserting the splashscreen
    inside the main window or we could make it a separate window but no timer, just an [OK] button,
    so actually, this would be exactly the same as the "About" dialog.

[s] turn [makefilename] into something that doesn't suck. (alias it to [sprintf] or [format])

[s] merge martin peach's tcp externs into the core
[b] data inspector: when this tool is enabled, it prints on the console any data coming through whatever cable you
    currently have selected. if you select multiple wires, it reports whats going through multiple wires.
[b] you need a way to see cpu usage on individual objects or on patchers or on groups of selected objects
[c] objectbox history: see whether ddrc should have a history count entry;
    think about saving history; matju thought that it could be turned into a dynamic button bar that you can drag from.
[?] send to front, send to back
[c] make windows not get auto-resized to the width of the toolbar, so that people can have tiny windows.
[c] <Dossy> fconfigure -encoding binary ...
[s] implement the stuff that is in iostreams.txt

[c] Luke Iannini suggests some OSX bindings:
    Command-` to switch between different windows within the application.
    Command-, to bring up preferences (though this one is more difficult since there are multiple preference windows...)
    Command-m to minimize the window (this currently brings up the "send message" dialogue box)

[s] Claude:
    Sending a message to vline~ creates a t_vseg, which are stored in a
    sorted linear linked list, which means the time taken to add each new
    line segment would be O(n), where n is the number of existing line segments.

[-] look at some object sync protocols that we can think of: NFS for folders, palm sync for calendars, rsync for file contents

Marius Schebella:
I have a small keyboard shortcut wish: change between "entering mode" and "selected mode" with boxes.
when I create a new object/message... then it would be nice to have a
shortcut that switches from the mode, where the cursor is in the box to the
mode, where the object is selected. I think the tab-key could be used for
that. As it is now, I type something in, then I have to grab the mouse, then
klick, then select, then I can adjust it (which I also do with the keyboard,
because it is more precise).
I know the toggeling will not be possible when more objects are selected,
but maybe someone has an idea for that.

[c] command for unpatcherizing a subpatch or abstraction (useful for making variants)
    or for turning an abstraction into a subpatch.

[s] I fixed it now, but I don't know if this is not a bug in pd 0.40:

"The problem is, that canvas-local search path really tread each path as local to the canvas-path ( see line 1561 in g_canvas.c).
So if you add e.g. /usr/local/lib/pd/extra/iemmatrix, it will search for this path, but local to the canvas path - so if I started
Pd from /home/me it will search in /home/me//usr/local/lib/pd/extra/iemmatrix ! Is this a feature or a bug of Pd ?" -- Holzi

[s] "I don't quite understand how this explains why wrap~ of -1 returns 1." -- steffen

[s] there's a [wrap~] but no [wrap]. there's a [>] but no [>~] (without externals). -- matju

dmotd about converting patches to postscript:
"the internal pd postscript printer grabs the viewable canvas size,
this would need to change to encompass the virtual limits of the patch.
tcl/tk's 'canvas postscript' command takes the -width -height flags,
so making it the virtual bounds is trivial. this works for snapshotting
canvas bounds:  sys_vgui("set cnv_bbox [.x%x.c bbox all] \n  .x%x.c
postscript -file /tmp/canvas.ps -width [lindex $cnv_bbox 2] -height
[lindex $cnv_bbox 3]  \n ", canvas, canvas);

------------------8<--------cut-here--------8<------------------

Patching-in-tongues Project

[ ] make entries counter and matcher.

               entries
en: english    [    ]
es: español    [    ] Mario Mora & Ramiro Cosentino
de: deutsch    [    ] M Neupert, G Holzmann, T Grill
nb: bokmål     [    ] Gisle Frøysland
it: italiano   [    ] Davide Morelli + Federico Ferri
pt: português  [    ] Nuno Godinho
fr: français   [    ] Patrice Colet
ca: català     [    ] Nùria Verges
pl: polski     [    ] Michal Seta
eu: euskara    [    ] Ibon Rodriguez Garcia (Enrike Hurtado)
cn: chinese    [    ] Chun Lee
jp: nihongo    [    ] Kentaro Fukuchi
tu: türkçe     [    ] ... Koray Tahiroglu
sv: svenska    [    ] ... Daniel Skoglund (NOT FOUND)
br: brasiliano [    ] ... Gabriel Menotti
dk: dansk      [    ] ... Steffen Leve Poulsen

------------------8<--------cut-here--------8<------------------
Dec 18 2006

1. there's no way to limit the size of the output buffer. If the other
side of the connection doesn't respond, the sending buffer just
inflates quickly. I've seen it happen that a bug in the sender causes
it to try to send so fast that it ate memory like an infinite recursion
or a forkbomb.

2. That operation is not realtime-safe (but still it's much closer to
being so than just blocking...)

3. It's only usable by the GUI socket and never by [netsend].

4. While that buffer together with t_guiqueue allow GUI updates to be
delayed for as long as necessary, it doesn't solve the problem that it can
send information that is already outdated and redundant. This can be
important in preventing problem #1 for a very heavy GUI. DesireData has
had this problem essentially dealt with since a long time, but it lacks
some fine tuning to get more robust.

------------------8<--------cut-here--------8<------------------

<arjen> matju, you may be interested in "Jim" - that does have closures and on the Wiki you can find several attempts and
        experiments regarding closures: http://wiki.tcl.tk/closures

<matju> is there something like listbox but which works as a popup menu ?
<tclguy> tk_optionMenu is an old-school version
<tclguy> or get a combobox from BWidget or tile

1. wish8.5 desire.tk city.pd &> err
2. ctrl+e, ctrl+a, shift+right*3 (or just once if profiling)
3. times (tclx)

<matju> is there a wrapper for libagg for tcl? AGG of antigrain.com
<ijchain> <kbk> don't know of one, but SWIG, Critcl, or ffidl might plug the gap

[initbang] & [closebang]: https://sourceforge.net/tracker/?func=detail&atid=478072&aid=1544041&group_id=55736

[s] Ed Kelly <morph_2016@yahoo.co.uk> reports that ALSA 24-bit output does not work?

to dave griffiths: I think that this is three feature requests:
1. performing replacement of wire-object-wire by a single wire, as a
single operation in the GUI
2. make that operation atomic in terms of DSP recompilation.
3. break down DSP recompilation in pieces so that it is more "incremental"
for large patches.
In the case of object insertion, (2) and (3) are not implemented either,
but step (1) already has most of the desired effect; for the message
system, step (1) is all that is needed. DSP is more work and I know less
about DSP. It'll take me a while to get there; but (2) doesn't seem so
hard.

http://www.tomsawyer.com/gallery/index.php

[b] matju to atwood:
  If I had automatic positioning in DesireData, it would be as an option: e.g. objects could default to "floating around"
  (that is, automatic positioning), but be pinned down into specific positions. In that case, an exception has to be done
  for [inlet] and [outlet] objects mostly. (the DS subsystem should be skipped over as well...) I could also have a use
  for some semi-automatic repositionings: for example, there could be a keyboard shortcut to reposition a non-"floating"
  object wherever it would go if it were floating, and if the user doesn't want it s/he can Ctrl+z it.

http://www.graphdrawing.org/

<mamalala> you select a bunch of objects and group them together .... then you can select all the objects in that group
later, if needed, by its name like, you start to build some mixer patch .. and then you add a chain for an external fx,
so you can put all associated objects in the "ext.fx" group ... whenever it gets so messed up that you forgot what is
what, you can just select the groupt you want, and see/move/whatever the involved objects the group name could also act
as a template for the name of a subpatch, if one decides to finally put them into one ....