diff options
author | Hans-Christoph Steiner <eighthave@users.sourceforge.net> | 2011-10-09 16:41:04 +0000 |
---|---|---|
committer | Hans-Christoph Steiner <eighthave@users.sourceforge.net> | 2011-10-09 16:41:04 +0000 |
commit | e1fc51c3a1d944193032d8bb1d95741d090b6d3b (patch) | |
tree | 7a2121c73a5acb69a080e73ad8e3b50cc3670616 | |
parent | 21c068f1916330e90f814bed461fe0821d1665ec (diff) |
checked in pd-0.43-1test4.src.tar.gz
svn path=/trunk/; revision=15558
32 files changed, 1060 insertions, 889 deletions
diff --git a/pd/README.txt b/pd/README.txt index e509786c..7fe03012 100644 --- a/pd/README.txt +++ b/pd/README.txt @@ -10,7 +10,7 @@ locally in the file, .../pd-whatever/doc/1.manual/index.htm. To unpack Pd: LINUX (or freeBSD). Download Pd, which will be a ".tar.gz" file; to unpack it, type "zcat [name].tar.gz | tar xf -" to a shell. This creates a directory with a -name like "pd-0.35". CD to "src". ./configiure, and make. There are also +name like "pd-0.35". CD to "src". ./configure, and make. There are also compiled packages available. Microsoft Windows. Pd is distributed as a "zip" file. Unzip this, @@ -39,4 +39,4 @@ Lopez-Lezcano, Adam Lindsay, Karl MacMillan, Thomas Musil, Toshinori Ohkouchi, Winfried Ritsch, Vibeke Sorensen, Rand Steiger, Hans-Christoph Steiner, Shahrokh Yadegari, David Zicarelli, Iohannes Zmoelnig, and probably many others for contributions of code, documentation, ideas, and expertise. This work has -received generous support from the Intel Research Council. +received support from Intel, Keith Mcmillen Instruments, and UCSD. diff --git a/pd/doc/1.manual/x1.htm b/pd/doc/1.manual/x1.htm index 92585e69..6a77a925 100644 --- a/pd/doc/1.manual/x1.htm +++ b/pd/doc/1.manual/x1.htm @@ -101,18 +101,8 @@ Guenter Geiger, and now maintained by Iohannes Zmoelnig. You can get it from: <A href="http://iem.at/GEM">http://iem.kug.ac.at/GEM</A>, or by installing Pd Extended. -<P> -Here are some more Pd links (updated 2/2011): <BR> -<a href="http://obiwannabe.co.uk/tutorials/html/tutorials_main.html"> -Andy Farnell's Tutorial</A><BR> -<a href="http://sites.google.com/site/porres/TutorialPd.zip"> -Alexandre Porres's Tutorial (Portuguese)</A><BR> -<A HREF="http://www.crca.ucsd.edu/~msp/techniques.htm"> -Puckette's book, <I> Theory and Techniques of Electronic Music</A> </I> <br> -<a href="http://www.crca.ucsd.edu/~msp"> Miller Puckette's home page</a><br> -<a href="http://iem.at/~zmoelnig/index.html"> - Johannes M Zmoelnig</a><br> -<a href="http://www-ccrma.stanford.edu/planetccrma/software/soundapps.html#pd"> -Fernando Pablo Lopez's RPMs from Planet CCRMA</a><br> +<P> Here are some +<a href="http://crca.ucsd.edu/~msp/external-links.htm"> +more external links</A>. </BODY> </HTML> diff --git a/pd/doc/1.manual/x3.htm b/pd/doc/1.manual/x3.htm index 747c6548..a8916e4b 100644 --- a/pd/doc/1.manual/x3.htm +++ b/pd/doc/1.manual/x3.htm @@ -49,8 +49,8 @@ To test audio and MIDI, start Pd and select "test Audio and MIDI" from the <P> First, try to get Pd to play a sine wave over your speakers. The "TEST TONE" control at top left turns this on and off. Normally, all the output channels are turned on so that when you turn the tone on (to a soft -40 dB or a -louder -20 dB) you should get output on the first six of your output channels. -(If you have fewer than six output channnels open, the extra +louder -20 dB) you should get output on the first eight of your output channels. +(If you have fewer than 8 output channnels open, the extra channels aren't played; and if you have more, this particular patch won't use them.) @@ -112,10 +112,13 @@ start or stop Pd's audio computation. <P> If there is a choice of audio API to make, the Media menu will display them. (On Linux, they are -OSS, ALSA, and Portaudio; on Windows, you get MMIO and ASIO). More information +OSS, ALSA, and Portaudio; on Windows, you get MMIO and ASIO). On Mac the only +one is portaudio. More information about the APIs appears in the sections below. -<P> Next is the "Audio settings..." menu item, which opens a dialog like this: +<P> Selecting an API (even if it's the one already in use), or, alternatively, +selecting "Audio Settings..." from Preferences, opens +a dialog panel like this: <CENTER><P> <IMG src="fig11.2.png" ALT="audio settings dialog"> @@ -170,23 +173,8 @@ programs that make a "network link" (locally) to intercommunicate. <H4> Audio in Microsoft Windows </H4> <P> -You can ask for a list of audio and MIDI devices by typing -"pd -listdev"; you can then specify which audio and MIDI device to use. -Type "pd -help" (or make any mistake) to get the syntax for specifying -which device to use. You can modify the Pd shortcut (or batch file) to -set these, or else use the "startup" dialog (file menu) to specify -startup arguments. - -<P> -Alternatively, (and especially when just starting out) you can experiment -with different audio configurations using the "audio settings" -item in the Media menu. - -<P> -You can list and -choose MIDI devices in the same way as audio; note that, by default, MIDI -input is disabled in Windows (because it's possible to hang up some MIDI -devices if Pd exits unexpectedly). +Pd offers both the ASIO and MMIO APIs in Windows. Which of these works better +will depend on your audio hardware. <P> MIDI timing is very poor if you are using simultaneous audio input and output; @@ -205,6 +193,14 @@ from the default (256 samples) and "-audiobuf" in milliseconds. Pd will round this down to a power of two buffers, each of "-blocksize" in sample frames. +<P> TIP: Often your machine will allow you to use ASIO with built-in PC +audio hardware. Sometimes it is necessary to set a ridiculously high block size +for this to work (on my machine I have to set it to 4096 -- about 1/10 of a +second!) + +<P> Using MMIO I've been able to get very low latencies (6 msec) using M-audio +PCI converters (Delta 44). + <H3> <A name=s1.2> 3.3. Installing Pd in Linux </A> </H3> <P> What to do depends on which flavor of Linux you are running (e.g., Debian @@ -226,6 +222,12 @@ headers. It should be enough to load "tcl-devel", "tk-devel", and "alsa-devel" packages using yum or apt-get. +<P> There are two parallel compilation setups now available. The old one is +described here; as of 0.43 I still use that but I plan to discontinue this for +0.44 and start using only the new one (by Hans). The following description +applies to the old one. Look in the INSTALL.txt file to see how to use the +new one. + <P> Download Pd, perhaps from <a href="http://www.crca.ucsd.edu/~msp/software.html"> @@ -340,7 +342,7 @@ Hammerfall boards in Pd is via ALSA and jack; but you can use ALSA alone: <PRE> pd -alsa -channels 26 </PRE> -works for me. If you don't specify the number of channels correctly Pd crashes. +works for me. <H6> MIDIMAN </H6> @@ -352,18 +354,28 @@ bit cheaper than Hammerfalls. The driver name is "ice1712". <H6> USB sound devices</H6> <P> Ed Kelly reports success with the Lexicon series of USB 1.0 devices (e.g., -the Omega Studio; apparently 4 channels in and 4 out). Also known to work well is the -Edirol box (2 channels in and out). - -<P> As of Feb. 2011, USB 2.0 devices are starting to appear but the ALSA -driver support is not yet there; watch the Pd mailing list. +the Omega Studio; apparently 4 channels in and 4 out). Also known to work well +is the Edirol box (2 channels in and out). + +<P> As of Sept. 2011, the only multi-channel USB device I've been able to use +with Pd is the Native Instruments Traktor Audio series. (I have the Audio +Traktor 10 which does indeed get 10 discrete channels in and out; the box is +designed for turntables and the I/O is all RCA. I haven't yet tested whether +the inputs are RIAA equalized or flat. To run this device you'll need to +compile and install an ALSA snapshot from at least September 2011. This won't +start showing up in Linux distros for at least some months. + +<P> THe Alsa devel list is reporting progress on the M-audio Ultra series, +which goes up to 6 in and out (analog) with 2 more as SP/DIF. Things work +OK for input or output separately but "full duplex" (in and out simultaneously) +has sync problems. <H3> <A name="s1.3"> 3.4. Installing Pd in Macintosh OSX </A> </H3> <P>Pd version 0.35 and up support Macintosh OSX. You need the OSX Jaguar -distribution (10.2) or later. +distribution (10.2) or later. Recent versions of Pd require 10.4 or up. -<P> To install Pd you can always just download the sources and compile them +<P> To install Pd you can always download the sources and compile them yourself, or (easier) just download the Mac binary from the download page: <A href="http://crca.ucsd.edu/~msp/software.html"> @@ -372,6 +384,10 @@ http://crca.ucsd.edu/~msp/software.html</A>. This is in the form of a compressed Tar archive; just click on it and the Max will extract the Pd application. Open this and you should be running. +<P> You might get various warnings about Pd trying to open an internet port. +This is normal although some system administrators will prevent you from +doing this (in which case you can't run Pd on that machine). + <P> The package by Hans-Christoph Steiner, on <A href="http://at.or.at/hans/pd/installers.html"> @@ -391,7 +407,7 @@ possibly so that you can get the newest version before it shows up compiled for Mac OS X. <P> To be able to compile Pd, you must have Tcl/Tk installed in the standard -places. I think this is true fro all reasoably recent releases of OSX. +places. I think this is true for all reasoably recent releases of OSX. <P> Then, just as for linux, just unload pd-whatever.tar.gz into a directory such as ~/pd-0.36-0, cd to pd-0.36-0/src, type "./configure" diff --git a/pd/doc/1.manual/x5.htm b/pd/doc/1.manual/x5.htm index a781ae5c..a36c395c 100644 --- a/pd/doc/1.manual/x5.htm +++ b/pd/doc/1.manual/x5.htm @@ -20,6 +20,31 @@ <H3> <A name="s2"> 5.1. release notes </A> </H3> +<P> ------------------ 0.43.1 --------------------------- + +<P> bug fix: in "perf mode" (having sent pd the "perf" message to prevent +undesired patch closure) Pd crashed (oops!) when one asked for the patch to +close after all. + +<P> Improvements to Mac version of bonk~ -- "learn" parameter handled correctly and +compilation fixes. + +<P> Default font size is the same on all platforms. + +<P> Bug fixes reading and writing AIFF files, particulatly 24 bit ones + +<P> "edit mode" menu checkbox should work now. + +<P> X Pasting text into boxes now works in linux. + +<P> fixed bug that hung Pd when closing more than one pd~ subpatch out of order. + +<P> fixed segfault if DSP loop found and main patch had signal inlets/outlets + +<P> miscellaneous cleanups. + +<P> STILL BUGGY: when you change the contents of a graph-on-parent subpatch the +old stuff often doesn't get erased correctly. <P> ------------------ 0.43 --------------------------- <P> Completely new TCL front end, thanks to Hans-Christophe Steiner, diff --git a/pd/doc/2.control.examples/07.time.pd b/pd/doc/2.control.examples/07.time.pd index 69398bd9..afb94c91 100644 --- a/pd/doc/2.control.examples/07.time.pd +++ b/pd/doc/2.control.examples/07.time.pd @@ -1,39 +1,40 @@ -#N canvas 0 0 724 474 12; +#N canvas 490 83 724 474 12; #X text 34 13 Besides the metronome \, there are three objects for dealing with time:; #X obj 64 117 print; #X msg 64 59 bang; #X msg 110 61 stop; #X obj 64 89 delay 2000; -#X text 161 44 The delay objects sechedules an event for a future time -expressed in milliseconds. Unlike in Max \, time values need not be -integers. If a delay has been scheduled and you "bang" it again \, -it is rescheduled (the previously scheduled output is cancelled.); -#X msg 76 190 bang; -#X obj 76 237 timer; +#X msg 76 192 bang; +#X obj 76 239 timer; #X text 160 117 The right inlet can be used to set the time value without scheduling any output.; -#X text 35 156 The timer \, shown below \, measures the time elapsed -between its left and right inlets:; -#X obj 106 212 delay 123.45; -#X floatatom 76 262 0 0 0; -#X text 29 287 Note that all time calculations are idealized \; they +#X obj 106 214 delay 123.45; +#X floatatom 76 264 0 0 0 0 - - -; +#X text 34 288 Note that all time calculations are idealized \; they do not show the effects of computation time or OS latency. This way you can write deterministic algorithms dealing with time passage.; -#X obj 74 385 pipe 2000; -#X floatatom 74 358 0 0 0; -#X floatatom 74 411 0 0 0; -#X text 165 359 The pipe object allocates memory dynamically in order +#X obj 74 387 pipe 2000; +#X floatatom 74 360 0 0 0 0 - - -; +#X floatatom 74 413 0 0 0 0 - - -; +#X text 165 361 The pipe object allocates memory dynamically in order to schedule any number of delayed events. The events may hold any collection of data (as usual \, for more details you can consult the help window.) ; -#X text 442 440 updated for Pd version 0.34; +#X text 442 440 updated for Pd version 0.43; +#X text 35 154 The timer \, shown below \, measures the time elapsed +between the arrival of 'bang' messages to its left and right inlets: +; +#X text 159 40 The delay object schedules an event for a future time +expressed in milliseconds. Unlike in Max \, time values need not be +integers. If a delay has been scheduled and you "bang" it again \, +it is rescheduled (the previously scheduled output is cancelled.); #X connect 2 0 4 0; #X connect 3 0 4 0; #X connect 4 0 1 0; -#X connect 6 0 7 0; -#X connect 6 0 10 0; -#X connect 7 0 11 0; -#X connect 10 0 7 1; -#X connect 13 0 15 0; -#X connect 14 0 13 0; +#X connect 5 0 6 0; +#X connect 5 0 8 0; +#X connect 6 0 9 0; +#X connect 8 0 6 1; +#X connect 11 0 13 0; +#X connect 12 0 11 0; diff --git a/pd/extra/bonk~/bonk~.c b/pd/extra/bonk~/bonk~.c index 7aaf48da..f1d49c9c 100644 --- a/pd/extra/bonk~/bonk~.c +++ b/pd/extra/bonk~/bonk~.c @@ -197,6 +197,7 @@ typedef struct _bonk t_object x_obj; t_outlet *x_cookedout; t_clock *x_clock; + t_canvas *x_canvas; /* ptr to current canvas --fbar */ #endif /* PD */ #ifdef MSP t_pxobject x_obj; @@ -223,8 +224,6 @@ typedef struct _bonk double x_learndebounce; /* debounce time (in "learn" mode only) */ int x_attackbins; /* number of bins to wait for attack */ - t_canvas *x_canvas; /* ptr to current canvas --fbar */ - t_filterbank *x_filterbank; t_hist x_hist[MAXNFILTERS]; t_template *x_template; @@ -260,7 +259,12 @@ static void bonk_print(t_bonk *x, t_floatarg f); static void bonk_bang(t_bonk *x); static void bonk_write(t_bonk *x, t_symbol *s); +static void bonk_dowrite(t_bonk *x, t_symbol *s); +static void bonk_writefile(t_bonk *x, char *filename, short path); + static void bonk_read(t_bonk *x, t_symbol *s); +static void bonk_doread(t_bonk *x, t_symbol *s); +static void bonk_openfile(t_bonk *x, char *filename, short path); void bonk_minvel_set(t_bonk *x, void *attr, long ac, t_atom *av); void bonk_lothresh_set(t_bonk *x, void *attr, long ac, t_atom *av); @@ -964,6 +968,7 @@ static void bonk_bang(t_bonk *x) bonk_tick(x); } +#ifdef PD static void bonk_read(t_bonk *x, t_symbol *s) { float vec[MAXNFILTERS]; @@ -1009,7 +1014,89 @@ nomore: x->x_ntemplate = ntemplate; fclose(fd); } +#endif + +#ifdef MSP +static void bonk_read(t_bonk *x, t_symbol *s) +{ + defer(x, (method)bonk_doread, s, 0, NULL); +} +static void bonk_doread(t_bonk *x, t_symbol *s) +{ + long filetype = 'TEXT', outtype; + char filename[512]; + short path; + + if (s == gensym("")) { + if (open_dialog(filename, &path, &outtype, &filetype, 1)) + return; + } else { + strcpy(filename, s->s_name); + if (locatefile_extended(filename, &path, &outtype, &filetype, 1)) { + object_error((t_object *) x, "%s: not found", s->s_name); + return; + } + } + // we have a file + bonk_openfile(x, filename, path); +} + +static void bonk_openfile(t_bonk *x, char *filename, short path) { + float vec[MAXNFILTERS]; + int i, ntemplate = 0, remaining; + float *fp, *fp2; + + t_filehandle fh; + char **texthandle; + char *tokptr; + + if (path_opensysfile(filename, path, &fh, READ_PERM)) { + object_error((t_object *) x, "error opening %s", filename); + return; + } + + texthandle = sysmem_newhandle(0); + sysfile_readtextfile(fh, texthandle, 0, TEXT_LB_NATIVE); + sysfile_close(fh); + + x->x_template = (t_template *)t_resizebytes(x->x_template, + x->x_ntemplate * sizeof(t_template), 0); + + tokptr = strtok(*texthandle, " \n"); + + while(tokptr != NULL) + { + for (i = x->x_nfilters, fp = vec; i--; fp++) { + if (sscanf(tokptr, "%f", fp) < 1) + goto nomore; + tokptr = strtok(NULL, " \n"); + } + x->x_template = (t_template *)t_resizebytes(x->x_template, + ntemplate * sizeof(t_template), + (ntemplate + 1) * sizeof(t_template)); + for (i = x->x_nfilters, fp = vec, + fp2 = x->x_template[ntemplate].t_amp; i--;) + *fp2++ = *fp++; + ntemplate++; + } +nomore: + if (remaining = (ntemplate % x->x_ninsig)) + { + post("bonk_read: %d templates not a multiple of %d; dropping extras"); + x->x_template = (t_template *)t_resizebytes(x->x_template, + ntemplate * sizeof(t_template), + (ntemplate - remaining) * sizeof(t_template)); + ntemplate = ntemplate - remaining; + } + + sysmem_freehandle(texthandle); + post("bonk: read %d templates\n", ntemplate); + x->x_ntemplate = ntemplate; +} +#endif + +#ifdef PD static void bonk_write(t_bonk *x, t_symbol *s) { FILE *fd; @@ -1037,6 +1124,63 @@ static void bonk_write(t_bonk *x, t_symbol *s) post("bonk: wrote %d templates\n", x->x_ntemplate); fclose(fd); } +#endif + +#ifdef MSP +static void bonk_write(t_bonk *x, t_symbol *s) +{ + defer(x, (method)bonk_dowrite, s, 0, NULL); +} + +static void bonk_dowrite(t_bonk *x, t_symbol *s) +{ + long filetype = 'TEXT', outtype; + char filename[MAX_FILENAME_CHARS]; + short path; + + if (s == gensym("")) { + sprintf(filename, "bonk_template.txt"); + saveas_promptset("Save template as..."); + if (saveasdialog_extended(filename, &path, &outtype, &filetype, 0)) + return; + } else { + strcpy(filename, s->s_name); + path = path_getdefault(); + } + bonk_writefile(x, filename, path); +} + +void bonk_writefile(t_bonk *x, char *filename, short path) +{ + int i, ntemplate = x->x_ntemplate; + t_template *tp = x->x_template; + float *fp; + long err; + long buflen; + + t_filehandle fh; + + char buf[20]; + + err = path_createsysfile(filename, path, 'TEXT', &fh); + + if (err) + return; + + for (; ntemplate--; tp++) + { + for (i = x->x_nfilters, fp = tp->t_amp; i--; fp++) { + snprintf(buf, 20, "%6.2f ", *fp); + buflen = strlen(buf); + sysfile_write(fh, &buflen, buf); + } + buflen = 1; + sysfile_write(fh, &buflen, "\n"); + } + + sysfile_close(fh); +} +#endif static void bonk_free(t_bonk *x) { @@ -1195,7 +1339,7 @@ void bonk_tilde_setup(void) gensym("read"), A_SYMBOL, 0); class_addmethod(bonk_class, (t_method)bonk_write, gensym("write"), A_SYMBOL, 0); - post("bonk version 1.3"); + post("bonk version 1.5"); } #endif @@ -1284,7 +1428,7 @@ int main() class_register(CLASS_BOX, c); bonk_class = c; - post("bonk~ v1.3"); + post("bonk~ v1.5"); return (0); } @@ -1465,7 +1609,7 @@ void bonk_learn_set(t_bonk *x, void *attr, long ac, t_atom *av) x->x_ntemplate * sizeof(x->x_template[0]), 0); x->x_ntemplate = 0; } - x->x_learn = (n != 0); + x->x_learn = n; x->x_learncount = 0; } } diff --git a/pd/extra/pd~/pd~.c b/pd/extra/pd~/pd~.c index dc2eca4c..8a1f5c39 100644 --- a/pd/extra/pd~/pd~.c +++ b/pd/extra/pd~/pd~.c @@ -14,6 +14,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> +#include <fcntl.h> #ifdef _MSC_VER #pragma warning (disable: 4305 4244) @@ -252,6 +253,8 @@ static void pd_tilde_donew(t_pd_tilde *x, char *pddir, char *schedlibdir, /* OK, we're parent */ close(pipe1[0]); close(pipe2[1]); + fcntl(pipe1[1], F_SETFD, FD_CLOEXEC); + fcntl(pipe2[0], F_SETFD, FD_CLOEXEC); x->x_outfd = fdopen(pipe1[1], "w"); x->x_infd = fdopen(pipe2[0], "r"); x->x_childpid = pid; diff --git a/pd/po/Makefile.am b/pd/po/Makefile.am index 7ab45eec..da383604 100644 --- a/pd/po/Makefile.am +++ b/pd/po/Makefile.am @@ -9,9 +9,9 @@ if MACOSX PATH := /sw/lib/gettext-tools-0.17/bin:${PATH} endif -TCLFILES = apple_events.tcl dialog_canvas.tcl dialog_gatom.tcl dialog_path.tcl pd_bindings.tcl pd_menus.tcl pdwindow.tcl scrollboxwindow.tcl AppMain.tcl dialog_data.tcl dialog_iemgui.tcl dialog_startup.tcl pd_connect.tcl pdtk_array.tcl pkgIndex.tcl wheredoesthisgo.tcl dialog_array.tcl dialog_find.tcl dialog_message.tcl helpbrowser.tcl pdtk_canvas.tcl pkg_mkIndex.tcl dialog_audio.tcl dialog_font.tcl dialog_midi.tcl opt_parser.tcl pd_menucommands.tcl pdtk_text.tcl scrollbox.tcl +TCLFILES = apple_events.tcl dialog_canvas.tcl dialog_gatom.tcl dialog_path.tcl pd_bindings.tcl pd_menus.tcl pdwindow.tcl scrollboxwindow.tcl AppMain.tcl dialog_data.tcl dialog_iemgui.tcl dialog_startup.tcl pd_connect.tcl pdtk_array.tcl pkgIndex.tcl wheredoesthisgo.tcl dialog_array.tcl dialog_find.tcl dialog_message.tcl helpbrowser.tcl pdtk_canvas.tcl pkg_mkIndex.tcl dialog_audio.tcl dialog_font.tcl dialog_midi.tcl opt_parser.tcl pd_menucommands.tcl pdtk_text.tcl scrollbox.tcl pd_guiprefs.tcl -FILES=$(addprefix ../tcl/, $(TCLFILES)) +FILES = $(addprefix ../tcl/, $(TCLFILES)) iemgui_dynamic_strings.tcl pd_dynamic_strings.tcl # these are the supported languages, ALL_LINGUAS = af az be bg de el en_ca eu fr gu he hi hu it pa pt_br pt_pt sq sv vi @@ -47,10 +47,9 @@ $(TEMPLATE): $(FILES) --sort-by-file --output=$(TEMPLATE) \ --package-name="Pure Data" --package-version=0.43 \ --copyright-holder='This file is put in the public domain' \ + --foreign-user \ --msgid-bugs-address=pd-dev@iem.at \ $(FILES) -# fink's and MinGW's xgettext are too old for these flags, needs 0.17 -# --package-name="Pure Data" --package-version=0.43 # I guess officially, the .po file should depend on the template.pot, but its # mostly annoying since it wasnts to update the template.pot and .po files any diff --git a/pd/po/iemgui_dynamic_strings.tcl b/pd/po/iemgui_dynamic_strings.tcl new file mode 100644 index 00000000..8b3ac392 --- /dev/null +++ b/pd/po/iemgui_dynamic_strings.tcl @@ -0,0 +1,34 @@ +# These are strings that are passed from C to Tcl but the msgcat +# procedure call '[_ $string]' is on the Tcl side, so that the +# automatic parsing done by xgettext doesn't pick them up as strings +# to be localized. Therefore we just list them here to make xgettext +# happy. +# +# If these are changed in the src/g_*.c files, then need to be +# manually updated here. + +# these are headers for the tops of the Properties panel +puts [_ "-------dimensions(digits)(pix):-------"] +puts [_ "--------dimensions(pix)(pix):--------"] +puts [_ "----------dimensions(pix):-----------"] +puts [_ "--------flash-time(ms)(ms):---------"] +puts [_ "-----------output-range:-----------"] +puts [_ "------selectable_dimensions(pix):------"] +puts [_ "------visible_rectangle(pix)(pix):------"] + +# these are labels for elements of the Properties panel +puts [_ "bottom:"] +puts [_ "height:"] +puts [_ "hold:"] +puts [_ "intrrpt:"] +puts [_ "left:"] +puts [_ "lin"] +puts [_ "log"] +puts [_ "log-height:"] +puts [_ "max:"] +puts [_ "min:"] +puts [_ "right:"] +puts [_ "size:"] +puts [_ "top:"] +puts [_ "value:"] +puts [_ "width:"] diff --git a/pd/po/pd_dynamic_strings.tcl b/pd/po/pd_dynamic_strings.tcl new file mode 100644 index 00000000..32b14a1b --- /dev/null +++ b/pd/po/pd_dynamic_strings.tcl @@ -0,0 +1,29 @@ +# These are strings that are passed from C to Tcl but the msgcat +# procedure call '[_ $string]' is on the Tcl side, so that the +# automatic parsing done by xgettext doesn't pick them up as strings +# to be localized. Therefore we just list them here to make xgettext +# happy. +# +# If these are changed in the src/*.c files, then need to be +# manually updated here. + +puts [_ "Do you want to save the changes you made in '%s'?"] +puts [_ "Discard changes to '%s'?"] + +puts [_ "Undo clear"] +puts [_ "Undo connect"] +puts [_ "Undo cut"] +puts [_ "Undo disconnect"] +puts [_ "Undo duplicate"] +puts [_ "Undo motion"] +puts [_ "Undo paste"] +puts [_ "Undo typing"] + +puts [_ "Redo clear"] +puts [_ "Redo connect"] +puts [_ "Redo cut"] +puts [_ "Redo disconnect"] +puts [_ "Redo duplicate"] +puts [_ "Redo motion"] +puts [_ "Redo paste"] +puts [_ "Redo typing"] diff --git a/pd/po/template.pot b/pd/po/template.pot index 8ee2d377..1fda8071 100644 --- a/pd/po/template.pot +++ b/pd/po/template.pot @@ -1,5 +1,5 @@ # SOME DESCRIPTIVE TITLE. -# This file is put in the public domain +# This file is put in the public domain. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy @@ -7,1332 +7,953 @@ msgid "" msgstr "" "Project-Id-Version: Pure Data 0.43\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" -"POT-Creation-Date: 2010-01-17 19:19-0500\n" +"POT-Creation-Date: 2011-03-18 09:54-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../src/dialog_array.tcl:115 ../src/dialog_array.tcl:117 -#: ../src/pd_menus.tcl:100 ../src/pd_menus.tcl:101 ../src/pd_menus.tcl:146 -#: ../src/pd_menus.tcl:147 ../src/pd_menus.tcl:152 ../src/pd_menus.tcl:157 +#: ../tcl/dialog_array.tcl:115 ../tcl/pd_menus.tcl:147 msgid "Copy" msgstr "" -#: ../src/dialog_array.tcl:118 ../src/dialog_array.tcl:120 -#: ../src/pd_menus.tcl:102 ../src/pd_menus.tcl:103 ../src/pd_menus.tcl:148 -#: ../src/pd_menus.tcl:149 ../src/pd_menus.tcl:154 ../src/pd_menus.tcl:159 +#: ../tcl/dialog_array.tcl:118 ../tcl/pd_menus.tcl:149 msgid "Paste" msgstr "" -#: ../src/dialog_array.tcl:264 ../src/dialog_array.tcl:266 +#: ../tcl/dialog_array.tcl:263 msgid "Array Properties" msgstr "" -#: ../src/dialog_array.tcl:270 ../src/dialog_array.tcl:272 -#: ../src/dialog_array.tcl:274 +#: ../tcl/dialog_array.tcl:273 msgid "Name:" msgstr "" -#: ../src/dialog_array.tcl:276 ../src/dialog_array.tcl:278 -#: ../src/dialog_array.tcl:280 ../src/dialog_canvas.tcl:178 -#: ../src/dialog_canvas.tcl:182 ../src/dialog_canvas.tcl:193 -#: ../src/dialog_canvas.tcl:197 ../src/dialog_iemgui.tcl:617 -#: ../src/dialog_iemgui.tcl:619 ../src/dialog_iemgui.tcl:621 -#: ../src/dialog_iemgui.tcl:626 +#: ../tcl/dialog_array.tcl:279 ../tcl/dialog_canvas.tcl:181 +#: ../tcl/dialog_canvas.tcl:196 ../tcl/dialog_iemgui.tcl:630 msgid "Size:" msgstr "" -#: ../src/dialog_array.tcl:280 ../src/dialog_array.tcl:282 -#: ../src/dialog_array.tcl:284 +#: ../tcl/dialog_array.tcl:283 msgid "Save contents" msgstr "" -#: ../src/dialog_array.tcl:284 ../src/dialog_array.tcl:286 -#: ../src/dialog_array.tcl:288 +#: ../tcl/dialog_array.tcl:287 msgid "Draw as:" msgstr "" -#: ../src/dialog_array.tcl:287 ../src/dialog_array.tcl:289 -#: ../src/dialog_array.tcl:291 +#: ../tcl/dialog_array.tcl:290 msgid "Points" msgstr "" -#: ../src/dialog_array.tcl:289 ../src/dialog_array.tcl:291 -#: ../src/dialog_array.tcl:293 +#: ../tcl/dialog_array.tcl:292 msgid "Polygon" msgstr "" -#: ../src/dialog_array.tcl:291 ../src/dialog_array.tcl:293 -#: ../src/dialog_array.tcl:295 +#: ../tcl/dialog_array.tcl:294 msgid "Bezier curve" msgstr "" -#: ../src/dialog_array.tcl:297 ../src/dialog_array.tcl:299 -#: ../src/dialog_array.tcl:301 +#: ../tcl/dialog_array.tcl:300 msgid "Put array into:" msgstr "" -#: ../src/dialog_array.tcl:300 ../src/dialog_array.tcl:302 -#: ../src/dialog_array.tcl:304 +#: ../tcl/dialog_array.tcl:303 msgid "New graph" msgstr "" -#: ../src/dialog_array.tcl:302 ../src/dialog_array.tcl:304 -#: ../src/dialog_array.tcl:306 +#: ../tcl/dialog_array.tcl:305 msgid "Last graph" msgstr "" -#: ../src/dialog_array.tcl:306 ../src/dialog_array.tcl:308 -#: ../src/dialog_array.tcl:310 +#: ../tcl/dialog_array.tcl:309 msgid "Delete array" msgstr "" -#: ../src/dialog_array.tcl:312 ../src/dialog_array.tcl:314 -#: ../src/dialog_array.tcl:316 +#: ../tcl/dialog_array.tcl:315 msgid "Open List View..." msgstr "" -#: ../src/dialog_array.tcl:319 ../src/dialog_array.tcl:321 -#: ../src/dialog_array.tcl:323 ../src/dialog_audio.tcl:136 -#: ../src/dialog_audio.tcl:138 ../src/dialog_audio.tcl:144 -#: ../src/dialog_canvas.tcl:205 ../src/dialog_canvas.tcl:209 -#: ../src/dialog_find.tcl:160 ../src/dialog_font.tcl:51 -#: ../src/dialog_gatom.tcl:153 ../src/dialog_gatom.tcl:157 -#: ../src/dialog_gatom.tcl:161 ../src/dialog_iemgui.tcl:738 -#: ../src/dialog_iemgui.tcl:742 ../src/dialog_iemgui.tcl:747 -#: ../src/dialog_iemgui.tcl:748 ../src/dialog_midi.tcl:91 -#: ../src/dialog_midi.tcl:93 ../src/dialog_midi.tcl:97 -#: ../src/dialog_midi.tcl:226 ../src/dialog_midi.tcl:228 -#: ../src/dialog_midi.tcl:232 ../src/scrollboxwindow.tcl:82 +#: ../tcl/dialog_array.tcl:322 ../tcl/dialog_audio.tcl:146 +#: ../tcl/dialog_canvas.tcl:208 ../tcl/dialog_find.tcl:163 +#: ../tcl/dialog_gatom.tcl:157 ../tcl/dialog_iemgui.tcl:751 +#: ../tcl/dialog_midi.tcl:98 ../tcl/dialog_midi.tcl:233 +#: ../tcl/scrollboxwindow.tcl:82 msgid "Cancel" msgstr "" -#: ../src/dialog_array.tcl:321 ../src/dialog_array.tcl:323 -#: ../src/dialog_array.tcl:327 ../src/dialog_audio.tcl:138 -#: ../src/dialog_audio.tcl:140 ../src/dialog_audio.tcl:148 -#: ../src/dialog_canvas.tcl:207 ../src/dialog_canvas.tcl:213 -#: ../src/dialog_gatom.tcl:156 ../src/dialog_gatom.tcl:161 -#: ../src/dialog_gatom.tcl:164 ../src/dialog_iemgui.tcl:741 -#: ../src/dialog_iemgui.tcl:745 ../src/dialog_iemgui.tcl:751 -#: ../src/dialog_midi.tcl:93 ../src/dialog_midi.tcl:95 -#: ../src/dialog_midi.tcl:99 ../src/dialog_midi.tcl:228 -#: ../src/dialog_midi.tcl:230 ../src/dialog_midi.tcl:234 -#: ../src/scrollboxwindow.tcl:84 +#: ../tcl/dialog_array.tcl:326 ../tcl/dialog_audio.tcl:149 +#: ../tcl/dialog_canvas.tcl:212 ../tcl/dialog_gatom.tcl:161 +#: ../tcl/dialog_iemgui.tcl:755 ../tcl/dialog_midi.tcl:100 +#: ../tcl/dialog_midi.tcl:235 ../tcl/scrollboxwindow.tcl:84 msgid "Apply" msgstr "" -#: ../src/dialog_array.tcl:323 ../src/dialog_array.tcl:325 -#: ../src/dialog_array.tcl:331 ../src/dialog_audio.tcl:140 -#: ../src/dialog_audio.tcl:142 ../src/dialog_audio.tcl:152 -#: ../src/dialog_canvas.tcl:209 ../src/dialog_canvas.tcl:217 -#: ../src/dialog_font.tcl:53 ../src/dialog_font.tcl:92 -#: ../src/dialog_font.tcl:100 ../src/dialog_font.tcl:101 -#: ../src/dialog_font.tcl:103 ../src/dialog_gatom.tcl:159 -#: ../src/dialog_gatom.tcl:165 ../src/dialog_gatom.tcl:167 -#: ../src/dialog_iemgui.tcl:744 ../src/dialog_iemgui.tcl:748 -#: ../src/dialog_iemgui.tcl:754 ../src/dialog_iemgui.tcl:755 -#: ../src/dialog_midi.tcl:95 ../src/dialog_midi.tcl:97 -#: ../src/dialog_midi.tcl:101 ../src/dialog_midi.tcl:230 -#: ../src/dialog_midi.tcl:232 ../src/dialog_midi.tcl:236 -#: ../src/dialog_startup.tcl:29 ../src/dialog_startup.tcl:30 -#: ../src/scrollboxwindow.tcl:86 +#: ../tcl/dialog_array.tcl:330 ../tcl/dialog_audio.tcl:152 +#: ../tcl/dialog_canvas.tcl:216 ../tcl/dialog_font.tcl:103 +#: ../tcl/dialog_gatom.tcl:165 ../tcl/dialog_iemgui.tcl:759 +#: ../tcl/dialog_midi.tcl:102 ../tcl/dialog_midi.tcl:237 +#: ../tcl/dialog_startup.tcl:29 ../tcl/dialog_startup.tcl:30 +#: ../tcl/scrollboxwindow.tcl:86 msgid "OK" msgstr "" -#: ../src/dialog_audio.tcl:130 ../src/dialog_audio.tcl:132 +#: ../tcl/dialog_audio.tcl:134 msgid "Audio Settings" msgstr "" -#: ../src/dialog_audio.tcl:142 ../src/dialog_audio.tcl:144 -#: ../src/dialog_audio.tcl:156 +#: ../tcl/dialog_audio.tcl:156 msgid "Save All Settings" msgstr "" -#: ../src/dialog_audio.tcl:151 ../src/dialog_audio.tcl:153 -#: ../src/dialog_audio.tcl:164 +#: ../tcl/dialog_audio.tcl:164 msgid "Sample rate:" msgstr "" -#: ../src/dialog_audio.tcl:153 ../src/dialog_audio.tcl:155 -#: ../src/dialog_audio.tcl:166 +#: ../tcl/dialog_audio.tcl:166 msgid "Delay (msec):" msgstr "" -#: ../src/dialog_audio.tcl:158 ../src/dialog_audio.tcl:160 -#: ../src/dialog_audio.tcl:172 +#: ../tcl/dialog_audio.tcl:169 +msgid "Block size:" +msgstr "" + +#: ../tcl/dialog_audio.tcl:176 msgid "Use callbacks" msgstr "" -#: ../src/dialog_audio.tcl:166 ../src/dialog_audio.tcl:168 -#: ../src/dialog_audio.tcl:180 ../src/dialog_midi.tcl:105 -#: ../src/dialog_midi.tcl:107 ../src/dialog_midi.tcl:111 -#: ../src/dialog_midi.tcl:241 ../src/dialog_midi.tcl:243 -#: ../src/dialog_midi.tcl:247 +#: ../tcl/dialog_audio.tcl:184 ../tcl/dialog_midi.tcl:112 +#: ../tcl/dialog_midi.tcl:248 msgid "Input device 1:" msgstr "" -#: ../src/dialog_audio.tcl:169 ../src/dialog_audio.tcl:171 -#: ../src/dialog_audio.tcl:183 ../src/dialog_audio.tcl:185 -#: ../src/dialog_audio.tcl:198 ../src/dialog_audio.tcl:200 -#: ../src/dialog_audio.tcl:213 ../src/dialog_audio.tcl:214 -#: ../src/dialog_audio.tcl:215 ../src/dialog_audio.tcl:229 -#: ../src/dialog_audio.tcl:232 ../src/dialog_audio.tcl:234 -#: ../src/dialog_audio.tcl:249 ../src/dialog_audio.tcl:250 -#: ../src/dialog_audio.tcl:252 ../src/dialog_audio.tcl:265 -#: ../src/dialog_audio.tcl:267 ../src/dialog_audio.tcl:268 -#: ../src/dialog_audio.tcl:280 ../src/dialog_audio.tcl:282 -#: ../src/dialog_audio.tcl:284 ../src/dialog_audio.tcl:300 +#: ../tcl/dialog_audio.tcl:187 ../tcl/dialog_audio.tcl:202 +#: ../tcl/dialog_audio.tcl:218 ../tcl/dialog_audio.tcl:233 +#: ../tcl/dialog_audio.tcl:253 ../tcl/dialog_audio.tcl:272 +#: ../tcl/dialog_audio.tcl:288 ../tcl/dialog_audio.tcl:304 msgid "Channels:" msgstr "" -#: ../src/dialog_audio.tcl:179 ../src/dialog_audio.tcl:181 -#: ../src/dialog_audio.tcl:194 ../src/dialog_midi.tcl:115 -#: ../src/dialog_midi.tcl:117 ../src/dialog_midi.tcl:121 -#: ../src/dialog_midi.tcl:251 ../src/dialog_midi.tcl:253 -#: ../src/dialog_midi.tcl:257 +#: ../tcl/dialog_audio.tcl:198 ../tcl/dialog_midi.tcl:122 +#: ../tcl/dialog_midi.tcl:258 msgid "Input device 2:" msgstr "" -#: ../src/dialog_audio.tcl:194 ../src/dialog_audio.tcl:196 -#: ../src/dialog_audio.tcl:210 ../src/dialog_midi.tcl:127 -#: ../src/dialog_midi.tcl:129 ../src/dialog_midi.tcl:133 -#: ../src/dialog_midi.tcl:263 ../src/dialog_midi.tcl:265 -#: ../src/dialog_midi.tcl:269 +#: ../tcl/dialog_audio.tcl:214 ../tcl/dialog_midi.tcl:134 +#: ../tcl/dialog_midi.tcl:270 msgid "Input device 3:" msgstr "" -#: ../src/dialog_audio.tcl:209 ../src/dialog_audio.tcl:211 -#: ../src/dialog_audio.tcl:225 ../src/dialog_midi.tcl:139 -#: ../src/dialog_midi.tcl:141 ../src/dialog_midi.tcl:145 -#: ../src/dialog_midi.tcl:275 ../src/dialog_midi.tcl:277 -#: ../src/dialog_midi.tcl:281 +#: ../tcl/dialog_audio.tcl:229 ../tcl/dialog_midi.tcl:146 +#: ../tcl/dialog_midi.tcl:282 msgid "Input device 4:" msgstr "" -#: ../src/dialog_audio.tcl:223 ../src/dialog_audio.tcl:225 -#: ../src/dialog_audio.tcl:240 ../src/dialog_midi.tcl:150 -#: ../src/dialog_midi.tcl:152 ../src/dialog_midi.tcl:156 -#: ../src/dialog_midi.tcl:286 ../src/dialog_midi.tcl:288 -#: ../src/dialog_midi.tcl:292 +#: ../tcl/dialog_audio.tcl:244 ../tcl/dialog_midi.tcl:157 +#: ../tcl/dialog_midi.tcl:293 msgid "Output device 1:" msgstr "" -#: ../src/dialog_audio.tcl:226 ../src/dialog_audio.tcl:228 -#: ../src/dialog_audio.tcl:243 +#: ../tcl/dialog_audio.tcl:247 msgid "(same as input device) .............. " msgstr "" -#: ../src/dialog_audio.tcl:246 ../src/dialog_audio.tcl:248 -#: ../src/dialog_audio.tcl:264 ../src/dialog_midi.tcl:160 -#: ../src/dialog_midi.tcl:162 ../src/dialog_midi.tcl:166 -#: ../src/dialog_midi.tcl:296 ../src/dialog_midi.tcl:298 -#: ../src/dialog_midi.tcl:302 +#: ../tcl/dialog_audio.tcl:268 ../tcl/dialog_midi.tcl:167 +#: ../tcl/dialog_midi.tcl:303 msgid "Output device 2:" msgstr "" -#: ../src/dialog_audio.tcl:261 ../src/dialog_audio.tcl:263 -#: ../src/dialog_audio.tcl:280 ../src/dialog_midi.tcl:171 -#: ../src/dialog_midi.tcl:173 ../src/dialog_midi.tcl:177 -#: ../src/dialog_midi.tcl:307 ../src/dialog_midi.tcl:309 -#: ../src/dialog_midi.tcl:313 +#: ../tcl/dialog_audio.tcl:284 ../tcl/dialog_midi.tcl:178 +#: ../tcl/dialog_midi.tcl:314 msgid "Output device 3:" msgstr "" -#: ../src/dialog_audio.tcl:276 ../src/dialog_audio.tcl:278 -#: ../src/dialog_audio.tcl:296 ../src/dialog_midi.tcl:182 -#: ../src/dialog_midi.tcl:184 ../src/dialog_midi.tcl:188 -#: ../src/dialog_midi.tcl:318 ../src/dialog_midi.tcl:320 -#: ../src/dialog_midi.tcl:324 +#: ../tcl/dialog_audio.tcl:300 ../tcl/dialog_midi.tcl:189 +#: ../tcl/dialog_midi.tcl:325 msgid "Output device 4:" msgstr "" -#: ../src/dialog_audio.tcl:291 ../src/dialog_audio.tcl:293 -#: ../src/dialog_audio.tcl:312 ../src/dialog_midi.tcl:195 -#: ../src/dialog_midi.tcl:197 ../src/dialog_midi.tcl:201 +#: ../tcl/dialog_audio.tcl:316 ../tcl/dialog_midi.tcl:202 msgid "Use multiple devices" msgstr "" -#: ../src/dialog_canvas.tcl:122 +#: ../tcl/dialog_canvas.tcl:121 msgid "WARNING: unknown graphme flags received in pdtk_canvas_dialog" msgstr "" -#: ../src/dialog_canvas.tcl:142 +#: ../tcl/dialog_canvas.tcl:141 msgid "Canvas Properties" msgstr "" -#: ../src/dialog_canvas.tcl:146 ../src/dialog_canvas.tcl:150 +#: ../tcl/dialog_canvas.tcl:149 msgid "Scale" msgstr "" -#: ../src/dialog_canvas.tcl:150 ../src/dialog_canvas.tcl:154 +#: ../tcl/dialog_canvas.tcl:153 msgid "X units per pixel:" msgstr "" -#: ../src/dialog_canvas.tcl:155 ../src/dialog_canvas.tcl:159 +#: ../tcl/dialog_canvas.tcl:158 msgid "Y units per pixel:" msgstr "" -#: ../src/dialog_canvas.tcl:159 ../src/dialog_canvas.tcl:163 +#: ../tcl/dialog_canvas.tcl:162 msgid "Appearance on parent patch" msgstr "" -#: ../src/dialog_canvas.tcl:161 ../src/dialog_canvas.tcl:165 +#: ../tcl/dialog_canvas.tcl:164 msgid "Graph-On-Parent" msgstr "" -#: ../src/dialog_canvas.tcl:165 ../src/dialog_canvas.tcl:169 +#: ../tcl/dialog_canvas.tcl:168 msgid "Hide object name and arguments" msgstr "" -#: ../src/dialog_canvas.tcl:170 ../src/dialog_canvas.tcl:174 +#: ../tcl/dialog_canvas.tcl:173 msgid "Range and size" msgstr "" -#: ../src/dialog_canvas.tcl:174 ../src/dialog_canvas.tcl:178 +#: ../tcl/dialog_canvas.tcl:177 msgid "X range, from" msgstr "" -#: ../src/dialog_canvas.tcl:176 ../src/dialog_canvas.tcl:180 -#: ../src/dialog_canvas.tcl:191 ../src/dialog_canvas.tcl:195 +#: ../tcl/dialog_canvas.tcl:179 ../tcl/dialog_canvas.tcl:194 msgid "to" msgstr "" -#: ../src/dialog_canvas.tcl:180 ../src/dialog_canvas.tcl:184 -#: ../src/dialog_canvas.tcl:195 ../src/dialog_canvas.tcl:199 +#: ../tcl/dialog_canvas.tcl:183 ../tcl/dialog_canvas.tcl:198 msgid "Margin:" msgstr "" -#: ../src/dialog_canvas.tcl:189 ../src/dialog_canvas.tcl:193 +#: ../tcl/dialog_canvas.tcl:192 msgid "Y range, from" msgstr "" -#: ../src/dialog_data.tcl:29 +#: ../tcl/dialog_data.tcl:29 msgid "Data Properties" msgstr "" -#: ../src/dialog_data.tcl:37 +#: ../tcl/dialog_data.tcl:37 msgid "Send (Ctrl s)" msgstr "" -#: ../src/dialog_data.tcl:39 +#: ../tcl/dialog_data.tcl:39 msgid "OK (Ctrl t)" msgstr "" -#: ../src/dialog_find.tcl:63 ../src/dialog_find.tcl:66 -#: ../src/dialog_find.tcl:79 ../src/dialog_find.tcl:80 -#: ../src/dialog_find.tcl:83 ../src/dialog_find.tcl:85 -#: ../src/dialog_find.tcl:87 ../src/dialog_find.tcl:93 -#: ../src/dialog_find.tcl:101 ../src/dialog_find.tcl:105 -#: ../src/dialog_find.tcl:107 ../src/dialog_find.tcl:115 -#: ../src/dialog_find.tcl:123 ../src/dialog_find.tcl:164 -#: ../src/pd_menus.tcl:45 +#: ../tcl/dialog_find.tcl:108 +#, tcl-format +msgid "Couldn't find '%s' in %s" +msgstr "" + +#: ../tcl/dialog_find.tcl:126 ../tcl/dialog_find.tcl:167 msgid "Find" msgstr "" -#: ../src/dialog_find.tcl:70 ../src/dialog_find.tcl:73 -#: ../src/dialog_find.tcl:87 ../src/dialog_find.tcl:91 -#: ../src/dialog_find.tcl:93 ../src/dialog_find.tcl:101 -#: ../src/dialog_find.tcl:142 +#: ../tcl/dialog_find.tcl:145 msgid "Search in" msgstr "" -#: ../src/dialog_find.tcl:72 ../src/dialog_find.tcl:75 -#: ../src/dialog_find.tcl:89 ../src/dialog_find.tcl:93 -#: ../src/dialog_find.tcl:95 ../src/dialog_find.tcl:103 -#: ../src/dialog_find.tcl:144 -msgid "for:" +#: ../tcl/dialog_find.tcl:146 ../tcl/pd_menus.tcl:283 +msgid "Pd window" msgstr "" -#: ../src/dialog_find.tcl:83 ../src/dialog_find.tcl:90 -#: ../src/dialog_find.tcl:104 ../src/dialog_find.tcl:108 -#: ../src/dialog_find.tcl:110 ../src/dialog_find.tcl:118 -#: ../src/dialog_find.tcl:168 ../src/pd_menus.tcl:63 ../src/pd_menus.tcl:74 -#: ../src/pd_menus.tcl:85 ../src/pd_menus.tcl:86 ../src/pd_menus.tcl:87 -#: ../src/pd_menus.tcl:95 ../src/pd_menus.tcl:111 ../src/pd_menus.tcl:118 -#: ../src/pd_menus.tcl:132 ../src/pd_menus.tcl:133 ../src/pd_menus.tcl:138 -#: ../src/pd_menus.tcl:143 ../src/pd_menus.tcl:259 ../src/pd_menus.tcl:272 -#: ../src/pd_menus.tcl:295 ../src/pd_menus.tcl:308 ../src/pd_menus.tcl:332 -#: ../src/pd_menus.tcl:345 ../src/pd_menus.tcl:354 ../src/pd_menus.tcl:381 -#: ../src/pd_menus.tcl:392 ../src/pd_menus.tcl:410 ../src/pd_menus.tcl:419 -#: ../src/pd_menus.tcl:431 ../src/pd_menus.tcl:448 ../src/pd_menus.tcl:458 -#: ../src/pd_menus.tcl:489 ../src/pd_menus.tcl:496 ../src/pd_menus.tcl:527 -#: ../src/pd_menus.tcl:574 -msgid "Close" +#: ../tcl/dialog_find.tcl:147 +msgid "for:" msgstr "" -#: ../src/dialog_find.tcl:83 ../src/dialog_find.tcl:97 -#: ../src/dialog_find.tcl:101 ../src/dialog_find.tcl:103 -#: ../src/dialog_find.tcl:111 ../src/dialog_find.tcl:154 +#: ../tcl/dialog_find.tcl:157 msgid "Match whole word only" msgstr "" -#: ../src/dialog_find.tcl:92 ../src/dialog_find.tcl:102 -#: ../src/dialog_find.tcl:143 ../src/dialog_font.tcl:49 -#: ../src/dialog_font.tcl:50 ../src/pd-gui.tcl:280 ../src/pd-gui.tcl:283 -#: ../src/pd-gui.tcl:286 ../src/pd-gui.tcl:288 ../src/pd-gui.tcl:291 -#: ../src/pd_menus.tcl:212 ../src/pd_menus.tcl:258 ../src/pd_menus.tcl:285 -#: ../src/pd_menus.tcl:289 ../src/pd_menus.tcl:296 ../src/pdwindow.tcl:33 -#: ../src/pdwindow.tcl:128 ../src/pdwindow.tcl:277 ../src/pdwindow.tcl:278 -msgid "Pd window" -msgstr "" - -#: ../src/dialog_find.tcl:105 -#, tcl-format -msgid "Couldn't find '%s' in %s" -msgstr "" - -#: ../src/dialog_font.tcl:45 -msgid "Font Properties" +#: ../tcl/dialog_find.tcl:171 ../tcl/pd_menus.tcl:58 ../tcl/pd_menus.tcl:80 +#: ../tcl/pd_menus.tcl:106 ../tcl/pd_menus.tcl:133 ../tcl/pd_menus.tcl:487 +#: ../tcl/pd_menus.tcl:525 ../tcl/pd_menus.tcl:572 +msgid "Close" msgstr "" -#: ../src/dialog_font.tcl:46 ../src/dialog_font.tcl:49 -#: ../src/dialog_font.tcl:54 ../src/dialog_font.tcl:55 +#: ../tcl/dialog_font.tcl:49 #, tcl-format msgid "%s Font" msgstr "" -#: ../src/dialog_font.tcl:61 ../src/dialog_font.tcl:96 -#: ../src/dialog_font.tcl:104 ../src/dialog_font.tcl:105 -#: ../src/dialog_font.tcl:107 +#: ../tcl/dialog_font.tcl:107 msgid "Font Size" msgstr "" -#: ../src/dialog_font.tcl:89 ../src/dialog_font.tcl:108 -#: ../src/dialog_font.tcl:116 ../src/dialog_font.tcl:117 -#: ../src/dialog_font.tcl:119 +#: ../tcl/dialog_font.tcl:119 msgid "Stretch" msgstr "" -#: ../src/dialog_font.tcl:96 ../src/dialog_font.tcl:115 -#: ../src/dialog_font.tcl:123 ../src/dialog_font.tcl:124 -#: ../src/dialog_font.tcl:126 +#: ../tcl/dialog_font.tcl:126 msgid "X and Y" msgstr "" -#: ../src/dialog_font.tcl:98 ../src/dialog_font.tcl:117 -#: ../src/dialog_font.tcl:125 ../src/dialog_font.tcl:126 -#: ../src/dialog_font.tcl:128 +#: ../tcl/dialog_font.tcl:128 msgid "X only" msgstr "" -#: ../src/dialog_font.tcl:100 ../src/dialog_font.tcl:119 -#: ../src/dialog_font.tcl:127 ../src/dialog_font.tcl:128 -#: ../src/dialog_font.tcl:130 +#: ../tcl/dialog_font.tcl:130 msgid "Y only" msgstr "" -#: ../src/dialog_gatom.tcl:93 +#: ../tcl/dialog_gatom.tcl:93 msgid "Atom Box Properties" msgstr "" -#: ../src/dialog_gatom.tcl:99 ../src/dialog_gatom.tcl:103 +#: ../tcl/dialog_gatom.tcl:103 msgid "Width:" msgstr "" -#: ../src/dialog_gatom.tcl:103 ../src/dialog_gatom.tcl:107 +#: ../tcl/dialog_gatom.tcl:107 msgid "Limits" msgstr "" -#: ../src/dialog_gatom.tcl:107 ../src/dialog_gatom.tcl:111 +#: ../tcl/dialog_gatom.tcl:111 msgid "Lower:" msgstr "" -#: ../src/dialog_gatom.tcl:112 ../src/dialog_gatom.tcl:113 -#: ../src/dialog_gatom.tcl:116 +#: ../tcl/dialog_gatom.tcl:116 msgid "Upper:" msgstr "" -#: ../src/dialog_gatom.tcl:116 ../src/dialog_gatom.tcl:120 -#: ../src/dialog_gatom.tcl:121 ../src/dialog_iemgui.tcl:598 -#: ../src/dialog_iemgui.tcl:600 ../src/dialog_iemgui.tcl:606 -#: ../src/dialog_iemgui.tcl:650 ../src/dialog_iemgui.tcl:652 -#: ../src/dialog_iemgui.tcl:657 ../src/dialog_iemgui.tcl:659 +#: ../tcl/dialog_gatom.tcl:120 ../tcl/dialog_iemgui.tcl:610 +#: ../tcl/dialog_iemgui.tcl:663 msgid "Label" msgstr "" -#: ../src/dialog_gatom.tcl:124 ../src/dialog_gatom.tcl:128 -#: ../src/dialog_gatom.tcl:129 +#: ../tcl/dialog_gatom.tcl:128 msgid "Left " msgstr "" -#: ../src/dialog_gatom.tcl:126 ../src/dialog_gatom.tcl:130 -#: ../src/dialog_gatom.tcl:131 +#: ../tcl/dialog_gatom.tcl:130 msgid "Right" msgstr "" -#: ../src/dialog_gatom.tcl:128 ../src/dialog_gatom.tcl:132 -#: ../src/dialog_gatom.tcl:133 +#: ../tcl/dialog_gatom.tcl:132 msgid "Top" msgstr "" -#: ../src/dialog_gatom.tcl:130 ../src/dialog_gatom.tcl:134 -#: ../src/dialog_gatom.tcl:135 +#: ../tcl/dialog_gatom.tcl:134 msgid "Bottom" msgstr "" -#: ../src/dialog_gatom.tcl:137 ../src/dialog_gatom.tcl:141 -#: ../src/dialog_gatom.tcl:145 ../src/dialog_iemgui.tcl:572 -#: ../src/dialog_iemgui.tcl:574 ../src/dialog_iemgui.tcl:576 +#: ../tcl/dialog_gatom.tcl:141 ../tcl/dialog_iemgui.tcl:580 msgid "Messages" msgstr "" -#: ../src/dialog_gatom.tcl:141 ../src/dialog_gatom.tcl:145 -#: ../src/dialog_gatom.tcl:149 ../src/dialog_iemgui.tcl:576 -#: ../src/dialog_iemgui.tcl:578 ../src/dialog_iemgui.tcl:580 +#: ../tcl/dialog_gatom.tcl:145 ../tcl/dialog_iemgui.tcl:584 msgid "Send symbol:" msgstr "" -#: ../src/dialog_gatom.tcl:147 ../src/dialog_gatom.tcl:151 -#: ../src/dialog_gatom.tcl:155 ../src/dialog_iemgui.tcl:583 -#: ../src/dialog_iemgui.tcl:585 ../src/dialog_iemgui.tcl:589 +#: ../tcl/dialog_gatom.tcl:151 ../tcl/dialog_iemgui.tcl:593 msgid "Receive symbol:" msgstr "" -#: ../src/dialog_iemgui.tcl:197 +#: ../tcl/dialog_iemgui.tcl:197 msgid "Background color" msgstr "" -#: ../src/dialog_iemgui.tcl:204 +#: ../tcl/dialog_iemgui.tcl:204 msgid "Foreground color" msgstr "" -#: ../src/dialog_iemgui.tcl:211 +#: ../tcl/dialog_iemgui.tcl:211 msgid "Label color" msgstr "" -#: ../src/dialog_iemgui.tcl:272 +#: ../tcl/dialog_iemgui.tcl:272 msgid "Init" msgstr "" -#: ../src/dialog_iemgui.tcl:275 ../src/dialog_iemgui.tcl:546 -#: ../src/dialog_iemgui.tcl:550 +#: ../tcl/dialog_iemgui.tcl:275 ../tcl/dialog_iemgui.tcl:554 msgid "No init" msgstr "" -#: ../src/dialog_iemgui.tcl:287 ../src/dialog_iemgui.tcl:556 -#: ../src/dialog_iemgui.tcl:558 ../src/dialog_iemgui.tcl:560 +#: ../tcl/dialog_iemgui.tcl:287 ../tcl/dialog_iemgui.tcl:564 msgid "Jump on click" msgstr "" -#: ../src/dialog_iemgui.tcl:290 ../src/dialog_iemgui.tcl:559 -#: ../src/dialog_iemgui.tcl:561 ../src/dialog_iemgui.tcl:563 +#: ../tcl/dialog_iemgui.tcl:290 ../tcl/dialog_iemgui.tcl:567 msgid "Steady on click" msgstr "" -#: ../src/dialog_iemgui.tcl:498 +#: ../tcl/dialog_iemgui.tcl:502 #, tcl-format msgid "%s Properties" msgstr "" -#: ../src/dialog_iemgui.tcl:549 ../src/dialog_iemgui.tcl:550 -#: ../src/dialog_iemgui.tcl:553 ../src/pd_menus.tcl:60 ../src/pd_menus.tcl:71 -#: ../src/pd_menus.tcl:82 ../src/pd_menus.tcl:83 ../src/pd_menus.tcl:84 -#: ../src/pd_menus.tcl:92 ../src/pd_menus.tcl:107 ../src/pd_menus.tcl:115 -#: ../src/pd_menus.tcl:129 ../src/pd_menus.tcl:130 ../src/pd_menus.tcl:135 -#: ../src/pd_menus.tcl:140 ../src/pd_menus.tcl:260 ../src/pd_menus.tcl:273 -#: ../src/pd_menus.tcl:288 ../src/pd_menus.tcl:301 ../src/pd_menus.tcl:325 -#: ../src/pd_menus.tcl:338 ../src/pd_menus.tcl:355 ../src/pd_menus.tcl:382 -#: ../src/pd_menus.tcl:383 ../src/pd_menus.tcl:410 ../src/pd_menus.tcl:411 -#: ../src/pd_menus.tcl:422 ../src/pd_menus.tcl:439 ../src/pd_menus.tcl:449 -#: ../src/pd_menus.tcl:487 ../src/pd_menus.tcl:490 ../src/pd_menus.tcl:518 -#: ../src/pd_menus.tcl:563 +#: ../tcl/dialog_iemgui.tcl:557 ../tcl/pd_menus.tcl:55 ../tcl/pd_menus.tcl:77 +#: ../tcl/pd_menus.tcl:102 ../tcl/pd_menus.tcl:130 ../tcl/pd_menus.tcl:488 +#: ../tcl/pd_menus.tcl:516 ../tcl/pd_menus.tcl:561 msgid "Save" msgstr "" -#: ../src/dialog_iemgui.tcl:606 ../src/dialog_iemgui.tcl:608 -#: ../src/dialog_iemgui.tcl:614 +#: ../tcl/dialog_iemgui.tcl:618 msgid "X offset" msgstr "" -#: ../src/dialog_iemgui.tcl:609 ../src/dialog_iemgui.tcl:611 -#: ../src/dialog_iemgui.tcl:612 ../src/dialog_iemgui.tcl:617 +#: ../tcl/dialog_iemgui.tcl:621 msgid "Y offset" msgstr "" -#: ../src/dialog_iemgui.tcl:640 ../src/dialog_iemgui.tcl:642 -#: ../src/dialog_iemgui.tcl:645 ../src/dialog_iemgui.tcl:649 +#: ../tcl/dialog_iemgui.tcl:653 msgid "Colors" msgstr "" -#: ../src/dialog_iemgui.tcl:646 ../src/dialog_iemgui.tcl:648 -#: ../src/dialog_iemgui.tcl:651 ../src/dialog_iemgui.tcl:655 +#: ../tcl/dialog_iemgui.tcl:659 msgid "Background" msgstr "" -#: ../src/dialog_iemgui.tcl:648 ../src/dialog_iemgui.tcl:650 -#: ../src/dialog_iemgui.tcl:654 ../src/dialog_iemgui.tcl:657 +#: ../tcl/dialog_iemgui.tcl:661 msgid "Front" msgstr "" -#: ../src/dialog_iemgui.tcl:660 ../src/dialog_iemgui.tcl:662 -#: ../src/dialog_iemgui.tcl:668 ../src/dialog_iemgui.tcl:669 +#: ../tcl/dialog_iemgui.tcl:673 msgid "Compose color" msgstr "" -#: ../src/dialog_iemgui.tcl:679 ../src/dialog_iemgui.tcl:682 -#: ../src/dialog_iemgui.tcl:688 +#: ../tcl/dialog_iemgui.tcl:692 msgid "Test label" msgstr "" -#: ../src/dialog_message.tcl:61 +#: ../tcl/dialog_message.tcl:61 msgid "Send a Pd message" msgstr "" -#: ../src/dialog_message.tcl:80 +#: ../tcl/dialog_message.tcl:80 msgid "(use arrow keys for history)" msgstr "" -#: ../src/dialog_midi.tcl:85 +#: ../tcl/dialog_midi.tcl:86 msgid "MIDI Settings" msgstr "" -#: ../src/dialog_midi.tcl:220 ../src/dialog_midi.tcl:222 -#: ../src/dialog_midi.tcl:226 +#: ../tcl/dialog_midi.tcl:227 msgid "ALSA MIDI Settings" msgstr "" -#: ../src/dialog_midi.tcl:331 ../src/dialog_midi.tcl:333 -#: ../src/dialog_midi.tcl:337 +#: ../tcl/dialog_midi.tcl:338 msgid "Use multiple ALSA devices" msgstr "" -#: ../src/dialog_midi.tcl:337 ../src/dialog_midi.tcl:339 -#: ../src/dialog_midi.tcl:343 +#: ../tcl/dialog_midi.tcl:344 msgid "In Ports:" msgstr "" -#: ../src/dialog_midi.tcl:340 ../src/dialog_midi.tcl:342 -#: ../src/dialog_midi.tcl:346 +#: ../tcl/dialog_midi.tcl:347 msgid "Out Ports:" msgstr "" -#: ../src/dialog_path.tcl:30 +#: ../tcl/dialog_path.tcl:32 msgid "Pd search path for objects, help, fonts, and other files" msgstr "" -#: ../src/dialog_path.tcl:35 +#: ../tcl/dialog_path.tcl:37 msgid "Use standard extensions" msgstr "" -#: ../src/dialog_path.tcl:37 +#: ../tcl/dialog_path.tcl:39 msgid "Verbose" msgstr "" -#: ../src/dialog_startup.tcl:49 +#: ../tcl/dialog_startup.tcl:49 msgid "Add new library" msgstr "" -#: ../src/dialog_startup.tcl:53 +#: ../tcl/dialog_startup.tcl:53 msgid "Edit library" msgstr "" -#: ../src/dialog_startup.tcl:79 +#: ../tcl/dialog_startup.tcl:79 msgid "Pd libraries to load on startup" msgstr "" -#: ../src/dialog_startup.tcl:82 +#: ../tcl/dialog_startup.tcl:82 msgid "Startup flags:" msgstr "" -#: ../src/dialog_startup.tcl:91 +#: ../tcl/dialog_startup.tcl:91 msgid "Defeat real-time scheduling" msgstr "" -#: ../src/g_editor.c:1663 -msgid "Discard changes to this window??" -msgstr "" - -#: ../src/g_editor.c:1668 -msgid "really quit?" -msgstr "" - -#: ../src/g_editor.c:1699 -msgid "Close this window??" -msgstr "" - -#: ../src/helpbrowser.tcl:25 +#: ../tcl/helpbrowser.tcl:27 msgid "Help Browser" msgstr "" -#: ../src/pd-gui.tcl:185 ../src/pd-gui.tcl:195 ../src/pd-gui.tcl:203 -#: ../src/pd-gui.tcl:206 ../src/pd-gui.tcl:215 ../src/pd-gui.tcl:218 -#: ../src/pd-gui.tcl:226 ../src/pd-gui.tcl:230 ../src/pd-gui.tcl:241 -#: ../src/pd-gui.tcl:259 ../src/pd-gui.tcl:277 ../src/pd-gui.tcl:296 -msgid "Associated Files" -msgstr "" - -#: ../src/pd-gui.tcl:186 ../src/pd-gui.tcl:196 ../src/pd-gui.tcl:204 -#: ../src/pd-gui.tcl:207 ../src/pd-gui.tcl:216 ../src/pd-gui.tcl:219 -#: ../src/pd-gui.tcl:227 ../src/pd-gui.tcl:231 ../src/pd-gui.tcl:242 -#: ../src/pd-gui.tcl:260 ../src/pd-gui.tcl:278 ../src/pd-gui.tcl:297 -msgid "Pd Files" -msgstr "" - -#: ../src/pd-gui.tcl:187 ../src/pd-gui.tcl:205 ../src/pd-gui.tcl:208 -#: ../src/pd-gui.tcl:220 ../src/pd-gui.tcl:228 ../src/pd-gui.tcl:243 -#: ../src/pd-gui.tcl:261 ../src/pd-gui.tcl:298 -msgid "Max Patch Files" -msgstr "" - -#: ../src/pd-gui.tcl:188 ../src/pd-gui.tcl:206 ../src/pd-gui.tcl:209 -#: ../src/pd-gui.tcl:221 ../src/pd-gui.tcl:229 ../src/pd-gui.tcl:244 -#: ../src/pd-gui.tcl:262 ../src/pd-gui.tcl:299 -msgid "Max Text Files" -msgstr "" - -#: ../src/pd-gui.tcl:197 ../src/pd-gui.tcl:217 ../src/pd-gui.tcl:232 -#: ../src/pd-gui.tcl:279 -msgid "Max Patch Files (.pat)" -msgstr "" - -#: ../src/pd-gui.tcl:198 ../src/pd-gui.tcl:218 ../src/pd-gui.tcl:233 -#: ../src/pd-gui.tcl:280 -msgid "Max Text Files (.mxt)" -msgstr "" - -#: ../src/pd-gui.tcl:270 ../src/pd-gui.tcl:290 ../src/pd-gui.tcl:305 -#: ../src/pd-gui.tcl:374 -#, tcl-format -msgid "WARNING: Font family '%s' not found, using default (%s)" -msgstr "" - -#: ../src/pd-gui.tcl:278 ../src/pd-gui.tcl:298 ../src/pd-gui.tcl:313 -#: ../src/pd-gui.tcl:382 -#, tcl-format -msgid "WARNING: Font weight '%s' not found, using default (%s)" -msgstr "" - -#: ../src/pd-gui.tcl:303 ../src/pd-gui.tcl:323 -#, tcl-format -msgid "ERROR: %s failed to find font size (%s) that fits into %sx%s!" -msgstr "" - -#: ../src/pd-gui.tcl:338 ../src/pd-gui.tcl:407 -#, tcl-format -msgid "WARNING: %s failed to find font size (%s) that fits into %sx%s!" -msgstr "" - -#: ../src/pd-gui.tcl:478 ../src/pd-gui.tcl:483 ../src/pd-gui.tcl:501 -#: ../src/pd-gui.tcl:518 ../src/pd-gui.tcl:620 -msgid "ERROR: 'pd' never showed up, 'pd-gui' quitting!" -msgstr "" - -#: ../src/pd_connect.tcl:76 ../src/pd_connect.tcl:85 ../src/pdwindow.tcl:90 -#: ../src/pdwindow.tcl:239 +#: ../tcl/pd_connect.tcl:82 ../tcl/pdwindow.tcl:221 msgid "(Tcl) INVALID COMMAND NAME: " msgstr "" -#: ../src/pd_connect.tcl:78 ../src/pd_connect.tcl:87 ../src/pdwindow.tcl:92 -#: ../src/pdwindow.tcl:241 +#: ../tcl/pd_connect.tcl:84 ../tcl/pdwindow.tcl:223 msgid "(Tcl) UNHANDLED ERROR: " msgstr "" -#: ../src/pd_menucommands.tcl:19 -msgid "Untitled" -msgstr "" - -#: ../src/pd_menucommands.tcl:78 ../src/pd_menucommands.tcl:79 -#: ../src/pd_menucommands.tcl:83 ../src/pd_menucommands.tcl:90 -msgid "Send Message..." -msgstr "" - -#: ../src/pd_menucommands.tcl:82 ../src/pd_menucommands.tcl:83 -#: ../src/pd_menucommands.tcl:87 ../src/pd_menucommands.tcl:94 -#: ../src/pd_menus.tcl:87 ../src/pd_menus.tcl:88 ../src/pd_menus.tcl:133 -#: ../src/pd_menus.tcl:134 ../src/pd_menus.tcl:144 ../src/pd_menus.tcl:147 -#: ../src/pd_menus.tcl:190 ../src/pd_menus.tcl:192 ../src/pd_menus.tcl:193 -#: ../src/pd_menus.tcl:203 ../src/pd_menus.tcl:265 ../src/pd_menus.tcl:278 -#: ../src/pd_menus.tcl:292 ../src/pd_menus.tcl:305 ../src/pd_menus.tcl:329 -#: ../src/pd_menus.tcl:342 ../src/pd_menus.tcl:360 ../src/pd_menus.tcl:387 -#: ../src/pd_menus.tcl:414 ../src/pd_menus.tcl:416 ../src/pd_menus.tcl:426 -#: ../src/pd_menus.tcl:443 ../src/pd_menus.tcl:453 ../src/pd_menus.tcl:491 -#: ../startup/object_db.tcl:123 -msgid "Message" -msgstr "" - -#: ../src/pd_menucommands.tcl:108 ../src/pd_menucommands.tcl:111 -#: ../src/pd_menus.tcl:112 ../src/pd_menus.tcl:113 ../src/pd_menus.tcl:117 -#: ../src/pd_menus.tcl:118 ../src/pd_menus.tcl:158 ../src/pd_menus.tcl:159 -#: ../src/pd_menus.tcl:163 ../src/pd_menus.tcl:164 ../src/pd_menus.tcl:169 -#: ../src/pd_menus.tcl:174 -msgid "Font" -msgstr "" - -#: ../src/pd_menucommands.tcl:123 ../src/pd_menucommands.tcl:126 -#: ../src/pd_menus.tcl:138 ../src/pd_menus.tcl:183 ../src/pd_menus.tcl:184 -#: ../src/pd_menus.tcl:194 ../src/pd_menus.tcl:267 ../src/pd_menus.tcl:475 -#: ../src/pd_menus.tcl:569 -msgid "Preferences" -msgstr "" - -#: ../src/pd_menus.tcl:45 -msgid "Edit" -msgstr "" - -#: ../src/pd_menus.tcl:45 -msgid "File" -msgstr "" - -#: ../src/pd_menus.tcl:45 ../src/pdtk_canvas.tcl:48 ../src/pdtk_canvas.tcl:110 -#: ../src/pdtk_canvas.tcl:113 ../src/pdtk_canvas.tcl:160 -msgid "Help" -msgstr "" - -#: ../src/pd_menus.tcl:45 -msgid "Media" -msgstr "" - -#: ../src/pd_menus.tcl:45 -msgid "Put" -msgstr "" - -#: ../src/pd_menus.tcl:45 -msgid "Window" +#: ../tcl/pd_menucommands.tcl:201 ../tcl/pd_menus.tcl:292 +#: ../tcl/pd_menus.tcl:470 +msgid "About Pd" msgstr "" -#: ../src/pd_menus.tcl:61 ../src/pd_menus.tcl:72 ../src/pd_menus.tcl:83 -#: ../src/pd_menus.tcl:84 ../src/pd_menus.tcl:85 ../src/pd_menus.tcl:93 -#: ../src/pd_menus.tcl:108 ../src/pd_menus.tcl:116 ../src/pd_menus.tcl:130 -#: ../src/pd_menus.tcl:131 ../src/pd_menus.tcl:136 ../src/pd_menus.tcl:141 -#: ../src/pd_menus.tcl:261 ../src/pd_menus.tcl:274 ../src/pd_menus.tcl:289 -#: ../src/pd_menus.tcl:302 ../src/pd_menus.tcl:326 ../src/pd_menus.tcl:339 -#: ../src/pd_menus.tcl:356 ../src/pd_menus.tcl:383 ../src/pd_menus.tcl:384 -#: ../src/pd_menus.tcl:411 ../src/pd_menus.tcl:412 ../src/pd_menus.tcl:423 -#: ../src/pd_menus.tcl:440 ../src/pd_menus.tcl:450 ../src/pd_menus.tcl:488 -#: ../src/pd_menus.tcl:491 ../src/pd_menus.tcl:519 ../src/pd_menus.tcl:564 +#: ../tcl/pd_menus.tcl:56 ../tcl/pd_menus.tcl:78 ../tcl/pd_menus.tcl:103 +#: ../tcl/pd_menus.tcl:131 ../tcl/pd_menus.tcl:489 ../tcl/pd_menus.tcl:517 +#: ../tcl/pd_menus.tcl:562 msgid "Save As..." msgstr "" -#: ../src/pd_menus.tcl:62 ../src/pd_menus.tcl:73 ../src/pd_menus.tcl:84 -#: ../src/pd_menus.tcl:88 ../src/pd_menus.tcl:89 ../src/pd_menus.tcl:94 -#: ../src/pd_menus.tcl:109 ../src/pd_menus.tcl:117 ../src/pd_menus.tcl:134 -#: ../src/pd_menus.tcl:135 ../src/pd_menus.tcl:140 ../src/pd_menus.tcl:145 -#: ../src/pd_menus.tcl:267 ../src/pd_menus.tcl:280 ../src/pd_menus.tcl:293 -#: ../src/pd_menus.tcl:306 ../src/pd_menus.tcl:330 ../src/pd_menus.tcl:343 -#: ../src/pd_menus.tcl:362 ../src/pd_menus.tcl:388 ../src/pd_menus.tcl:389 -#: ../src/pd_menus.tcl:415 ../src/pd_menus.tcl:418 ../src/pd_menus.tcl:427 -#: ../src/pd_menus.tcl:444 ../src/pd_menus.tcl:454 ../src/pd_menus.tcl:492 -#: ../src/pd_menus.tcl:497 ../src/pd_menus.tcl:523 ../src/pd_menus.tcl:570 +#: ../tcl/pd_menus.tcl:57 ../tcl/pd_menus.tcl:79 ../tcl/pd_menus.tcl:104 +#: ../tcl/pd_menus.tcl:135 ../tcl/pd_menus.tcl:495 ../tcl/pd_menus.tcl:521 +#: ../tcl/pd_menus.tcl:568 msgid "Print..." msgstr "" -#: ../src/pd_menus.tcl:65 ../src/pd_menus.tcl:76 ../src/pd_menus.tcl:87 -#: ../src/pd_menus.tcl:97 ../src/pd_menus.tcl:104 ../src/pd_menus.tcl:105 -#: ../src/pd_menus.tcl:113 ../src/pd_menus.tcl:120 ../src/pd_menus.tcl:150 -#: ../src/pd_menus.tcl:151 ../src/pd_menus.tcl:156 ../src/pd_menus.tcl:161 +#: ../tcl/pd_menus.tcl:60 ../tcl/pd_menus.tcl:82 ../tcl/pd_menus.tcl:108 +#: ../tcl/pd_menus.tcl:151 msgid "Duplicate" msgstr "" -#: ../src/pd_menus.tcl:66 ../src/pd_menus.tcl:77 ../src/pd_menus.tcl:88 -#: ../src/pd_menus.tcl:98 ../src/pd_menus.tcl:114 ../src/pd_menus.tcl:120 -#: ../src/pd_menus.tcl:121 ../src/pd_menus.tcl:166 ../src/pd_menus.tcl:167 -#: ../src/pd_menus.tcl:172 ../src/pd_menus.tcl:177 +#: ../tcl/pd_menus.tcl:61 ../tcl/pd_menus.tcl:83 ../tcl/pd_menus.tcl:109 +#: ../tcl/pd_menus.tcl:167 msgid "Tidy Up" msgstr "" -#: ../src/pd_menus.tcl:67 ../src/pd_menus.tcl:78 ../src/pd_menus.tcl:89 -#: ../src/pd_menus.tcl:99 ../src/pd_menus.tcl:115 ../src/pd_menus.tcl:122 -#: ../src/pd_menus.tcl:128 ../src/pd_menus.tcl:129 ../src/pd_menus.tcl:174 -#: ../src/pd_menus.tcl:175 ../src/pd_menus.tcl:178 ../src/pd_menus.tcl:185 -#: ../src/pd_menus.tcl:551 ../src/pdtk_canvas.tcl:224 -#: ../src/pdtk_canvas.tcl:226 +#: ../tcl/pd_menus.tcl:62 ../tcl/pd_menus.tcl:84 ../tcl/pd_menus.tcl:110 +#: ../tcl/pd_menus.tcl:173 ../tcl/pd_menus.tcl:549 ../tcl/pdtk_canvas.tcl:270 +#: ../tcl/pdtk_canvas.tcl:272 msgid "Edit Mode" msgstr "" -#: ../src/pd_menus.tcl:70 ../src/pd_menus.tcl:80 ../src/pd_menus.tcl:93 -#: ../src/pd_menus.tcl:94 ../src/pd_menus.tcl:118 ../src/pd_menus.tcl:124 -#: ../src/pd_menus.tcl:139 ../src/pd_menus.tcl:140 ../src/pd_menus.tcl:145 -#: ../src/pd_menus.tcl:150 ../src/pd_menus.tcl:320 ../src/pd_menus.tcl:326 +#: ../tcl/pd_menus.tcl:65 ../tcl/pd_menus.tcl:113 ../tcl/pd_menus.tcl:140 +#: ../tcl/pd_menus.tcl:318 msgid "Undo" msgstr "" -#: ../src/pd_menus.tcl:71 ../src/pd_menus.tcl:81 ../src/pd_menus.tcl:95 -#: ../src/pd_menus.tcl:96 ../src/pd_menus.tcl:119 ../src/pd_menus.tcl:125 -#: ../src/pd_menus.tcl:141 ../src/pd_menus.tcl:142 ../src/pd_menus.tcl:147 -#: ../src/pd_menus.tcl:152 ../src/pd_menus.tcl:326 ../src/pd_menus.tcl:332 +#: ../tcl/pd_menus.tcl:66 ../tcl/pd_menus.tcl:114 ../tcl/pd_menus.tcl:142 +#: ../tcl/pd_menus.tcl:324 msgid "Redo" msgstr "" -#: ../src/pd_menus.tcl:81 ../src/pd_menus.tcl:82 ../src/pd_menus.tcl:127 -#: ../src/pd_menus.tcl:128 ../src/pd_menus.tcl:133 ../src/pd_menus.tcl:138 -#: ../src/pd_menus.tcl:255 ../src/pd_menus.tcl:267 ../src/pd_menus.tcl:285 -#: ../src/pd_menus.tcl:298 ../src/pd_menus.tcl:322 ../src/pd_menus.tcl:335 -#: ../src/pd_menus.tcl:349 ../src/pd_menus.tcl:376 ../src/pd_menus.tcl:380 -#: ../src/pd_menus.tcl:405 ../src/pd_menus.tcl:407 ../src/pd_menus.tcl:419 -#: ../src/pd_menus.tcl:436 ../src/pd_menus.tcl:446 ../src/pd_menus.tcl:484 -#: ../src/pd_menus.tcl:515 ../src/pd_menus.tcl:560 +#: ../tcl/pd_menus.tcl:128 ../tcl/pd_menus.tcl:482 ../tcl/pd_menus.tcl:513 +#: ../tcl/pd_menus.tcl:558 msgid "New" msgstr "" -#: ../src/pd_menus.tcl:82 ../src/pd_menus.tcl:83 ../src/pd_menus.tcl:128 -#: ../src/pd_menus.tcl:129 ../src/pd_menus.tcl:134 ../src/pd_menus.tcl:139 -#: ../src/pd_menus.tcl:256 ../src/pd_menus.tcl:268 ../src/pd_menus.tcl:286 -#: ../src/pd_menus.tcl:299 ../src/pd_menus.tcl:323 ../src/pd_menus.tcl:336 -#: ../src/pd_menus.tcl:350 ../src/pd_menus.tcl:377 ../src/pd_menus.tcl:381 -#: ../src/pd_menus.tcl:406 ../src/pd_menus.tcl:408 ../src/pd_menus.tcl:420 -#: ../src/pd_menus.tcl:437 ../src/pd_menus.tcl:447 ../src/pd_menus.tcl:485 -#: ../src/pd_menus.tcl:516 ../src/pd_menus.tcl:561 ../src/pdtk_canvas.tcl:46 -#: ../src/pdtk_canvas.tcl:108 ../src/pdtk_canvas.tcl:111 -#: ../src/pdtk_canvas.tcl:128 ../src/pdtk_canvas.tcl:130 -#: ../src/pdtk_canvas.tcl:131 ../src/pdtk_canvas.tcl:133 -#: ../src/pdtk_canvas.tcl:158 ../src/pdtk_canvas.tcl:178 -#: ../src/pdtk_canvas.tcl:180 +#: ../tcl/pd_menus.tcl:129 ../tcl/pd_menus.tcl:483 ../tcl/pd_menus.tcl:514 +#: ../tcl/pd_menus.tcl:559 ../tcl/pdtk_canvas.tcl:200 +#: ../tcl/pdtk_canvas.tcl:220 ../tcl/pdtk_canvas.tcl:222 msgid "Open" msgstr "" -#: ../src/pd_menus.tcl:98 ../src/pd_menus.tcl:99 ../src/pd_menus.tcl:144 -#: ../src/pd_menus.tcl:145 ../src/pd_menus.tcl:150 ../src/pd_menus.tcl:155 -msgid "Cut" +#: ../tcl/pd_menus.tcl:134 ../tcl/pd_menus.tcl:493 ../tcl/pd_menus.tcl:520 +#: ../tcl/pd_menus.tcl:565 +msgid "Message..." msgstr "" -#: ../src/pd_menus.tcl:106 ../src/pd_menus.tcl:107 ../src/pd_menus.tcl:152 -#: ../src/pd_menus.tcl:153 ../src/pd_menus.tcl:158 ../src/pd_menus.tcl:163 -msgid "Select All" +#: ../tcl/pd_menus.tcl:145 +msgid "Cut" msgstr "" -#: ../src/pd_menus.tcl:110 ../src/pd_menus.tcl:111 ../src/pd_menus.tcl:115 -#: ../src/pd_menus.tcl:116 ../src/pd_menus.tcl:156 ../src/pd_menus.tcl:157 -#: ../src/pd_menus.tcl:161 ../src/pd_menus.tcl:162 ../src/pd_menus.tcl:167 -#: ../src/pd_menus.tcl:172 -msgid "Text Editor" +#: ../tcl/pd_menus.tcl:153 +msgid "Select All" msgstr "" -#: ../src/pd_menus.tcl:122 ../src/pd_menus.tcl:123 ../src/pd_menus.tcl:168 -#: ../src/pd_menus.tcl:169 ../src/pd_menus.tcl:179 -msgid "Toggle Console" +#: ../tcl/pd_menus.tcl:159 ../tcl/pd_menus.tcl:164 +msgid "Font" msgstr "" -#: ../src/pd_menus.tcl:124 ../src/pd_menus.tcl:125 ../src/pd_menus.tcl:170 -#: ../src/pd_menus.tcl:171 ../src/pd_menus.tcl:174 ../src/pd_menus.tcl:181 +#: ../tcl/pd_menus.tcl:169 msgid "Clear Console" msgstr "" -#: ../src/pd_menus.tcl:139 ../src/pd_menus.tcl:495 ../src/pd_menus.tcl:522 -#: ../src/pd_menus.tcl:567 -msgid "Message..." +#: ../tcl/pd_menus.tcl:183 +msgid "Object" msgstr "" -#: ../src/pd_menus.tcl:145 ../src/pd_menus.tcl:188 ../src/pd_menus.tcl:190 -#: ../src/pd_menus.tcl:191 ../src/pd_menus.tcl:201 -msgid "Object" +#: ../tcl/pd_menus.tcl:185 +msgid "Message" msgstr "" -#: ../src/pd_menus.tcl:149 ../src/pd_menus.tcl:192 ../src/pd_menus.tcl:194 -#: ../src/pd_menus.tcl:195 ../src/pd_menus.tcl:205 +#: ../tcl/pd_menus.tcl:187 msgid "Number" msgstr "" -#: ../src/pd_menus.tcl:151 ../src/pd_menus.tcl:194 ../src/pd_menus.tcl:196 -#: ../src/pd_menus.tcl:197 ../src/pd_menus.tcl:207 +#: ../tcl/pd_menus.tcl:189 msgid "Symbol" msgstr "" -#: ../src/pd_menus.tcl:153 ../src/pd_menus.tcl:196 ../src/pd_menus.tcl:198 -#: ../src/pd_menus.tcl:199 ../src/pd_menus.tcl:209 +#: ../tcl/pd_menus.tcl:191 msgid "Comment" msgstr "" -#: ../src/pd_menus.tcl:156 ../src/pd_menus.tcl:199 ../src/pd_menus.tcl:201 -#: ../src/pd_menus.tcl:202 ../src/pd_menus.tcl:212 +#: ../tcl/pd_menus.tcl:194 msgid "Bang" msgstr "" -#: ../src/pd_menus.tcl:158 ../src/pd_menus.tcl:201 ../src/pd_menus.tcl:203 -#: ../src/pd_menus.tcl:204 ../src/pd_menus.tcl:214 +#: ../tcl/pd_menus.tcl:196 msgid "Toggle" msgstr "" -#: ../src/pd_menus.tcl:160 ../src/pd_menus.tcl:203 ../src/pd_menus.tcl:205 -#: ../src/pd_menus.tcl:206 ../src/pd_menus.tcl:216 +#: ../tcl/pd_menus.tcl:198 msgid "Number2" msgstr "" -#: ../src/pd_menus.tcl:162 ../src/pd_menus.tcl:205 ../src/pd_menus.tcl:207 -#: ../src/pd_menus.tcl:208 ../src/pd_menus.tcl:218 +#: ../tcl/pd_menus.tcl:200 msgid "Vslider" msgstr "" -#: ../src/pd_menus.tcl:164 ../src/pd_menus.tcl:207 ../src/pd_menus.tcl:209 -#: ../src/pd_menus.tcl:210 ../src/pd_menus.tcl:220 +#: ../tcl/pd_menus.tcl:202 msgid "Hslider" msgstr "" -#: ../src/pd_menus.tcl:166 ../src/pd_menus.tcl:209 ../src/pd_menus.tcl:211 -#: ../src/pd_menus.tcl:212 ../src/pd_menus.tcl:222 +#: ../tcl/pd_menus.tcl:204 msgid "Vradio" msgstr "" -#: ../src/pd_menus.tcl:168 ../src/pd_menus.tcl:211 ../src/pd_menus.tcl:213 -#: ../src/pd_menus.tcl:214 ../src/pd_menus.tcl:224 +#: ../tcl/pd_menus.tcl:206 msgid "Hradio" msgstr "" -#: ../src/pd_menus.tcl:170 ../src/pd_menus.tcl:213 ../src/pd_menus.tcl:215 -#: ../src/pd_menus.tcl:216 ../src/pd_menus.tcl:226 +#: ../tcl/pd_menus.tcl:208 msgid "VU Meter" msgstr "" -#: ../src/pd_menus.tcl:172 ../src/pd_menus.tcl:215 ../src/pd_menus.tcl:217 -#: ../src/pd_menus.tcl:218 ../src/pd_menus.tcl:228 +#: ../tcl/pd_menus.tcl:210 msgid "Canvas" msgstr "" -#: ../src/pd_menus.tcl:175 ../src/pd_menus.tcl:218 ../src/pd_menus.tcl:220 -#: ../src/pd_menus.tcl:221 ../src/pd_menus.tcl:231 +#: ../tcl/pd_menus.tcl:213 msgid "Graph" msgstr "" -#: ../src/pd_menus.tcl:176 ../src/pd_menus.tcl:219 ../src/pd_menus.tcl:221 -#: ../src/pd_menus.tcl:222 ../src/pd_menus.tcl:232 +#: ../tcl/pd_menus.tcl:214 msgid "Array" msgstr "" -#: ../src/pd_menus.tcl:181 ../src/pd_menus.tcl:224 ../src/pd_menus.tcl:226 -#: ../src/pd_menus.tcl:227 ../src/pd_menus.tcl:237 +#: ../tcl/pd_menus.tcl:219 msgid "Find..." msgstr "" -#: ../src/pd_menus.tcl:183 ../src/pd_menus.tcl:226 ../src/pd_menus.tcl:228 -#: ../src/pd_menus.tcl:229 ../src/pd_menus.tcl:239 +#: ../tcl/pd_menus.tcl:221 msgid "Find Again" msgstr "" -#: ../src/pd_menus.tcl:185 ../src/pd_menus.tcl:228 ../src/pd_menus.tcl:230 -#: ../src/pd_menus.tcl:231 ../src/pd_menus.tcl:241 +#: ../tcl/pd_menus.tcl:223 msgid "Find Last Error" msgstr "" -#: ../src/pd_menus.tcl:191 ../src/pd_menus.tcl:234 ../src/pd_menus.tcl:236 -#: ../src/pd_menus.tcl:237 ../src/pd_menus.tcl:247 +#: ../tcl/pd_menus.tcl:229 msgid "DSP On" msgstr "" -#: ../src/pd_menus.tcl:193 ../src/pd_menus.tcl:236 ../src/pd_menus.tcl:238 -#: ../src/pd_menus.tcl:239 ../src/pd_menus.tcl:249 +#: ../tcl/pd_menus.tcl:231 msgid "DSP Off" msgstr "" -#: ../src/pd_menus.tcl:196 ../src/pd_menus.tcl:240 ../src/pd_menus.tcl:242 -#: ../src/pd_menus.tcl:269 ../src/pd_menus.tcl:280 +#: ../tcl/pd_menus.tcl:235 msgid "Test Audio and MIDI..." msgstr "" -#: ../src/pd_menus.tcl:198 ../src/pd_menus.tcl:242 ../src/pd_menus.tcl:244 -#: ../src/pd_menus.tcl:271 ../src/pd_menus.tcl:282 +#: ../tcl/pd_menus.tcl:237 msgid "Load Meter" msgstr "" -#: ../src/pd_menus.tcl:205 ../src/pd_menus.tcl:251 ../src/pd_menus.tcl:274 -#: ../src/pd_menus.tcl:278 ../src/pd_menus.tcl:289 -msgid "Minimize" +#: ../tcl/pd_menus.tcl:260 ../tcl/pd_menus.tcl:473 ../tcl/pd_menus.tcl:567 +msgid "Preferences" msgstr "" -#: ../src/pd_menus.tcl:207 ../src/pd_menus.tcl:253 ../src/pd_menus.tcl:276 -#: ../src/pd_menus.tcl:280 ../src/pd_menus.tcl:291 -msgid "Zoom" +#: ../tcl/pd_menus.tcl:267 +msgid "Minimize" msgstr "" -#: ../src/pd_menus.tcl:210 ../src/pd_menus.tcl:256 ../src/pd_menus.tcl:283 -#: ../src/pd_menus.tcl:291 ../src/pd_menus.tcl:294 -msgid "Parent Window" +#: ../tcl/pd_menus.tcl:269 +msgid "Zoom" msgstr "" -#: ../src/pd_menus.tcl:216 ../src/pd_menus.tcl:262 ../src/pd_menus.tcl:278 -#: ../src/pd_menus.tcl:289 ../src/pd_menus.tcl:300 +#: ../tcl/pd_menus.tcl:272 msgid "Bring All to Front" msgstr "" -#: ../src/pd_menus.tcl:224 ../src/pd_menus.tcl:241 ../src/pd_menus.tcl:253 -#: ../src/pd_menus.tcl:270 ../src/pd_menus.tcl:297 ../src/pd_menus.tcl:298 -#: ../src/pd_menus.tcl:308 ../src/pd_menus.tcl:335 ../src/pd_menus.tcl:362 -#: ../src/pd_menus.tcl:390 ../src/pd_menus.tcl:472 -msgid "About Pd" +#: ../tcl/pd_menus.tcl:275 +msgid "Next Window" msgstr "" -#: ../src/pd_menus.tcl:227 ../src/pd_menus.tcl:273 ../src/pd_menus.tcl:300 -#: ../src/pd_menus.tcl:311 -msgid "HTML Manual..." +#: ../tcl/pd_menus.tcl:278 +msgid "Previous Window" msgstr "" -#: ../src/pd_menus.tcl:229 ../src/pd_menus.tcl:275 ../src/pd_menus.tcl:302 -#: ../src/pd_menus.tcl:313 -msgid "Browser..." +#: ../tcl/pd_menus.tcl:285 +msgid "Parent Window" msgstr "" -#: ../src/pd_menus.tcl:248 ../src/pd_menus.tcl:260 ../src/pd_menus.tcl:342 -#: ../src/pd_menus.tcl:369 ../src/pd_menus.tcl:395 -msgid "Preferences..." +#: ../tcl/pd_menus.tcl:294 +msgid "HTML Manual..." msgstr "" -#: ../src/pd_menus.tcl:257 ../src/pd_menus.tcl:270 ../src/pd_menus.tcl:352 -#: ../src/pd_menus.tcl:379 ../src/pd_menus.tcl:408 ../src/pd_menus.tcl:487 -msgid "Open Recent" +#: ../tcl/pd_menus.tcl:296 +msgid "Browser..." msgstr "" -#: ../src/pd_menus.tcl:263 ../src/pd_menus.tcl:274 -msgid "Audio Settings..." +#: ../tcl/pd_menus.tcl:299 +msgid "puredata.info" msgstr "" -#: ../src/pd_menus.tcl:265 ../src/pd_menus.tcl:276 ../src/pd_menus.tcl:461 -msgid "MIDI Settings..." +#: ../tcl/pd_menus.tcl:301 +msgid "Report a bug" msgstr "" -#: ../src/pd_menus.tcl:281 -msgid "Next Window" +#: ../tcl/pd_menus.tcl:304 +msgid "Tcl prompt" msgstr "" -#: ../src/pd_menus.tcl:284 -msgid "Previous Window" +#: ../tcl/pd_menus.tcl:348 +msgid "Clear Menu" msgstr "" -#: ../src/pd_menus.tcl:296 ../src/pd_menus.tcl:309 ../src/pd_menus.tcl:333 -#: ../src/pd_menus.tcl:346 ../src/pd_menus.tcl:393 ../src/pd_menus.tcl:420 -#: ../src/pd_menus.tcl:432 ../src/pd_menus.tcl:449 ../src/pd_menus.tcl:459 -#: ../src/pd_menus.tcl:497 ../src/pd_menus.tcl:528 ../src/pd_menus.tcl:575 -msgid "Quit" +#: ../tcl/pd_menus.tcl:453 +msgid "Path..." msgstr "" -#: ../src/pd_menus.tcl:304 ../src/pd_menus.tcl:331 ../src/pd_menus.tcl:350 -#: ../src/pd_menus.tcl:356 -msgid "Clear Menu" +#: ../tcl/pd_menus.tcl:455 +msgid "Startup..." msgstr "" -#: ../src/pd_menus.tcl:305 -msgid "puredata.info" +#: ../tcl/pd_menus.tcl:457 +msgid "Audio Settings..." msgstr "" -#: ../src/pd_menus.tcl:307 -msgid "Report a bug" +#: ../tcl/pd_menus.tcl:459 +msgid "MIDI Settings..." msgstr "" -#: ../src/pd_menus.tcl:455 -msgid "Path..." +#: ../tcl/pd_menus.tcl:485 +msgid "Open Recent" msgstr "" -#: ../src/pd_menus.tcl:457 -msgid "Startup..." +#: ../tcl/pd_menus.tcl:526 ../tcl/pd_menus.tcl:573 +msgid "Quit" msgstr "" -#: ../src/pdtk_canvas.tcl:44 ../src/pdtk_canvas.tcl:106 -#: ../src/pdtk_canvas.tcl:109 ../src/pdtk_canvas.tcl:123 -#: ../src/pdtk_canvas.tcl:125 ../src/pdtk_canvas.tcl:126 -#: ../src/pdtk_canvas.tcl:128 ../src/pdtk_canvas.tcl:156 -#: ../src/pdtk_canvas.tcl:173 ../src/pdtk_canvas.tcl:175 +#: ../tcl/pdtk_canvas.tcl:198 ../tcl/pdtk_canvas.tcl:215 +#: ../tcl/pdtk_canvas.tcl:217 msgid "Properties" msgstr "" -#: ../src/pdwindow.tcl:43 ../src/pdwindow.tcl:164 ../src/pdwindow.tcl:309 -msgid "DSP" +#: ../tcl/pdtk_canvas.tcl:202 +msgid "Help" msgstr "" -#: ../src/pdwindow.tcl:86 ../src/pdwindow.tcl:235 +#: ../tcl/pdwindow.tcl:217 msgid "(Tcl) MISSING CLOSE-BRACE '}': " msgstr "" -#: ../src/pdwindow.tcl:88 ../src/pdwindow.tcl:237 +#: ../tcl/pdwindow.tcl:219 msgid "(Tcl) MISSING CLOSE-BRACKET ']': " msgstr "" -#: ../src/pdwindow.tcl:161 ../src/pdwindow.tcl:306 -msgid "IN" -msgstr "" - -#: ../src/pdwindow.tcl:162 ../src/pdwindow.tcl:307 -msgid "OUT" -msgstr "" - -#: ../src/pdwindow.tcl:168 ../src/pdwindow.tcl:314 -msgid "DIO" -msgstr "" - -#: ../src/pdwindow.tcl:177 ../src/pdwindow.tcl:324 +#: ../tcl/pdwindow.tcl:258 msgid "Tcl:" msgstr "" -#: ../src/wheredoesthisgo.tcl:19 -#, tcl-format -msgid "Ignoring '%s': doesn't look like a Pd-file" +#: ../tcl/pdwindow.tcl:301 ../tcl/pdwindow.tcl:302 +msgid "Pd" msgstr "" -#: ../startup/object_db.tcl:113 -msgid "Signal" +#: ../tcl/pdwindow.tcl:317 +msgid "DSP" msgstr "" -#: ../startup/object_db.tcl:114 -msgid "Generators" +#: ../tcl/pdwindow.tcl:322 +msgid "audio I/O error" msgstr "" -#: ../startup/object_db.tcl:115 -msgid "Filters" +#: ../tcl/pdwindow.tcl:328 +msgid "Log:" msgstr "" -#: ../startup/object_db.tcl:116 ../startup/object_db.tcl:124 -msgid "Math" +#: ../tcl/pdwindow.tcl:333 +msgid "fatal" msgstr "" -#: ../startup/object_db.tcl:117 ../startup/object_db.tcl:125 -msgid "I/O" +#: ../tcl/pdwindow.tcl:334 +msgid "error" msgstr "" -#: ../startup/object_db.tcl:118 ../startup/object_db.tcl:126 -msgid "Sampling" +#: ../tcl/pdwindow.tcl:335 +msgid "normal" msgstr "" -#: ../startup/object_db.tcl:119 ../startup/object_db.tcl:128 -msgid "Routing" +#: ../tcl/pdwindow.tcl:336 +msgid "debug" msgstr "" -#: ../startup/object_db.tcl:120 ../startup/object_db.tcl:129 -msgid "Others" +#: ../tcl/pdwindow.tcl:337 +msgid "all" msgstr "" -#: ../startup/object_db.tcl:127 -msgid "GUI" +#: ../tcl/wheredoesthisgo.tcl:19 +#, tcl-format +msgid "Ignoring '%s': doesn't look like a Pd-file" msgstr "" -# iemgui +#: iemgui_dynamic_strings.tcl:11 msgid "-------dimensions(digits)(pix):-------" msgstr "" -# iemgui +#: iemgui_dynamic_strings.tcl:12 msgid "--------dimensions(pix)(pix):--------" msgstr "" -# iemgui +#: iemgui_dynamic_strings.tcl:13 msgid "----------dimensions(pix):-----------" msgstr "" -# iemgui -# iemgui +#: iemgui_dynamic_strings.tcl:14 +msgid "--------flash-time(ms)(ms):---------" +msgstr "" + +#: iemgui_dynamic_strings.tcl:15 +msgid "-----------output-range:-----------" +msgstr "" + +#: iemgui_dynamic_strings.tcl:16 msgid "------selectable_dimensions(pix):------" msgstr "" -# iemgui +#: iemgui_dynamic_strings.tcl:17 msgid "------visible_rectangle(pix)(pix):------" msgstr "" -# iemgui -msgid "-----------output-range:-----------" +#: iemgui_dynamic_strings.tcl:20 +msgid "bottom:" msgstr "" -# iemgui -msgid "--------flash-time(ms)(ms):---------" +#: iemgui_dynamic_strings.tcl:21 +msgid "height:" msgstr "" -# iemgui -msgid "log-height:" +#: iemgui_dynamic_strings.tcl:22 +msgid "hold:" msgstr "" -# iemgui -msgid "log" +#: iemgui_dynamic_strings.tcl:23 +msgid "intrrpt:" msgstr "" -# iemgui -msgid "lin" +#: iemgui_dynamic_strings.tcl:24 +msgid "left:" msgstr "" -# iemgui -msgid "top:" +#: iemgui_dynamic_strings.tcl:25 +msgid "lin" msgstr "" -# iemgui -msgid "bottom:" +#: iemgui_dynamic_strings.tcl:26 +msgid "log" msgstr "" -# iemgui -msgid "value:" +#: iemgui_dynamic_strings.tcl:27 +msgid "log-height:" msgstr "" -# iemgui +#: iemgui_dynamic_strings.tcl:28 msgid "max:" msgstr "" -# iemgui +#: iemgui_dynamic_strings.tcl:29 msgid "min:" msgstr "" -# iemgui +#: iemgui_dynamic_strings.tcl:30 msgid "right:" msgstr "" -# iemgui -msgid "left:" -msgstr "" - -# iemgui -msgid "hold:" +#: iemgui_dynamic_strings.tcl:31 +msgid "size:" msgstr "" -# iemgui -msgid "intrrpt:" +#: iemgui_dynamic_strings.tcl:32 +msgid "top:" msgstr "" -# iemgui -msgid "size:" +#: iemgui_dynamic_strings.tcl:33 +msgid "value:" msgstr "" -# iemgui +#: iemgui_dynamic_strings.tcl:34 msgid "width:" msgstr "" -# iemgui -msgid "height:" -msgstr "" - +#: pd_dynamic_strings.tcl:10 +#, tcl-format msgid "Do you want to save the changes you made in '%s'?" msgstr "" +#: pd_dynamic_strings.tcl:11 +#, tcl-format msgid "Discard changes to '%s'?" msgstr "" -msgid "Undo typing" -msgstr "" - +#: pd_dynamic_strings.tcl:13 msgid "Undo clear" msgstr "" +#: pd_dynamic_strings.tcl:14 msgid "Undo connect" msgstr "" +#: pd_dynamic_strings.tcl:15 +msgid "Undo cut" +msgstr "" + +#: pd_dynamic_strings.tcl:16 msgid "Undo disconnect" msgstr "" -msgid "Undo cut" +#: pd_dynamic_strings.tcl:17 +msgid "Undo duplicate" msgstr "" +#: pd_dynamic_strings.tcl:18 msgid "Undo motion" msgstr "" +#: pd_dynamic_strings.tcl:19 msgid "Undo paste" msgstr "" -msgid "Undo duplicate" -msgstr "" - -msgid "Redo typing" +#: pd_dynamic_strings.tcl:20 +msgid "Undo typing" msgstr "" +#: pd_dynamic_strings.tcl:22 msgid "Redo clear" msgstr "" +#: pd_dynamic_strings.tcl:23 msgid "Redo connect" msgstr "" +#: pd_dynamic_strings.tcl:24 +msgid "Redo cut" +msgstr "" + +#: pd_dynamic_strings.tcl:25 msgid "Redo disconnect" msgstr "" -msgid "Redo cut" +#: pd_dynamic_strings.tcl:26 +msgid "Redo duplicate" msgstr "" +#: pd_dynamic_strings.tcl:27 msgid "Redo motion" msgstr "" +#: pd_dynamic_strings.tcl:28 msgid "Redo paste" msgstr "" -msgid "Redo duplicate" +#: pd_dynamic_strings.tcl:29 +msgid "Redo typing" msgstr "" - diff --git a/pd/src/d_misc.c b/pd/src/d_misc.c index 444986ea..acb288b0 100644 --- a/pd/src/d_misc.c +++ b/pd/src/d_misc.c @@ -31,7 +31,7 @@ static t_int *print_perform(t_int *w) startpost("%s:", x->x_sym->s_name); for(i=0; i<n; i++) { if(i%8==0)endpost(); - startpost("%-8.5g", in[i]); + startpost("%.4g ", in[i]); } endpost(); x->x_count--; diff --git a/pd/src/d_soundfile.c b/pd/src/d_soundfile.c index 8c350305..ef121e11 100644 --- a/pd/src/d_soundfile.c +++ b/pd/src/d_soundfile.c @@ -286,7 +286,8 @@ int open_soundfile_via_fd(int fd, int headersize, { long chunksize = swap4(((t_wavechunk *)buf)->wc_size, swap), seekto = headersize + chunksize + 8, seekout; - + if (seekto & 1) /* pad up to even number of bytes */ + seekto++; if (!strncmp(((t_wavechunk *)buf)->wc_id, "fmt ", 4)) { long commblockonset = headersize + 8; @@ -338,6 +339,8 @@ int open_soundfile_via_fd(int fd, int headersize, { long chunksize = swap4(((t_datachunk *)buf)->dc_size, swap), seekto = headersize + chunksize + 8, seekout; + if (seekto & 1) /* pad up to even number of bytes */ + seekto++; /* post("chunk %c %c %c %c seek %d", ((t_datachunk *)buf)->dc_id[0], ((t_datachunk *)buf)->dc_id[1], @@ -368,8 +371,8 @@ int open_soundfile_via_fd(int fd, int headersize, goto badheader; headersize = seekto; } - bytelimit = swap4(((t_datachunk *)buf)->dc_size, swap); - headersize += 8; + bytelimit = swap4(((t_datachunk *)buf)->dc_size, swap) - 8; + headersize += sizeof(t_datachunk); } } /* seek past header and any sample frames to skip */ @@ -784,7 +787,7 @@ static int create_soundfile(t_canvas *canvas, const char *filename, memcpy(&aiffhdr->a_nframeshi, &longtmp, 4); aiffhdr->a_bitspersamp = swap2(8 * bytespersamp, swap); memcpy(aiffhdr->a_samprate, dogdoo, sizeof(dogdoo)); - longtmp = swap4(datasize, swap); + longtmp = swap4(datasize + 8, swap); memcpy(aiffhdr->a_samprate + sizeof(dogdoo), &longtmp, 4); memset(aiffhdr->a_samprate + sizeof(dogdoo) + 4, 0, 8); headersize = AIFFPLUS; @@ -1327,7 +1330,7 @@ static void soundfiler_read(t_soundfiler *x, t_symbol *s, goto done; usage: pd_error(x, "usage: read [flags] filename tablename..."); - post("flags: -skip <n> -nframes <n> -resize -maxsize <n> ..."); + post("flags: -skip <n> -resize -maxsize <n> ..."); post("-raw <headerbytes> <channels> <bytespersamp> <endian (b, l, or n)>."); done: if (fd >= 0) diff --git a/pd/src/d_ugen.c b/pd/src/d_ugen.c index 3fa7db54..1ed39600 100644 --- a/pd/src/d_ugen.c +++ b/pd/src/d_ugen.c @@ -617,6 +617,12 @@ t_dspcontext *ugen_start_graph(int toplevel, t_signal **sp, if (ugen_loud) post("ugen_start_graph..."); + /* protect against invalid numsignals + * this might happen if we have an abstraction with inlet~/outlet~ opened as a toplevel patch + */ + if(toplevel) + ninlets=noutlets=0; + dc->dc_ugenlist = 0; dc->dc_toplevel = toplevel; dc->dc_iosigs = sp; diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c index 89dd874c..f494732d 100644 --- a/pd/src/g_editor.c +++ b/pd/src/g_editor.c @@ -1916,8 +1916,8 @@ void canvas_menuclose(t_canvas *x, t_floatarg fforce) } else if (sys_perf) { - sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 1;\n}\n", - canvas_getrootfor(g), g); + sys_vgui("pdtk_check .x%lx {Close this window?} {.x%lx menuclose 1;\n} yes\n", + canvas_getrootfor(x), x); } else pd_free(&x->gl_pd); } diff --git a/pd/src/g_text.c b/pd/src/g_text.c index a6e50491..d30b2ac9 100644 --- a/pd/src/g_text.c +++ b/pd/src/g_text.c @@ -170,6 +170,8 @@ static void canvas_howputnew(t_canvas *x, int *connectp, int *xpixp, int *ypixp, else { glist_getnextxy(x, xpixp, ypixp); + *xpixp -= 3; + *ypixp -= 3; glist_noselect(x); } *connectp = connectme; @@ -1371,10 +1373,10 @@ void text_setto(t_text *x, t_glist *glist, char *buf, int bufsize) int xwas = x->te_xpix, ywas = x->te_ypix; glist_delete(glist, &x->te_g); canvas_objtext(glist, xwas, ywas, 0, b); + canvas_restoreconnections(glist_getcanvas(glist)); /* if it's an abstraction loadbang it here */ if (newest && pd_class(newest) == canvas_class) canvas_loadbang((t_canvas *)newest); - canvas_restoreconnections(glist_getcanvas(glist)); } /* if we made a new "pd" or changed a window name, update window list */ diff --git a/pd/src/m_binbuf.c b/pd/src/m_binbuf.c index d109ae56..f0542d40 100644 --- a/pd/src/m_binbuf.c +++ b/pd/src/m_binbuf.c @@ -917,6 +917,13 @@ int binbuf_write(t_binbuf *x, char *filename, char *dir, int crflag) sys_unixerror(fbuf); goto fail; } + + if (fflush(f) != 0) + { + sys_unixerror(fbuf); + goto fail; + } + if (deleteit) binbuf_free(x); fclose(f); @@ -1477,7 +1484,7 @@ void binbuf_evalfile(t_symbol *name, t_symbol *dir) canvas_resume_dsp(dspstate); } -void glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir) +t_pd *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir) { t_pd *x = 0; /* even though binbuf_evalfile appears to take care of dspstate, @@ -1487,8 +1494,12 @@ void glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir) int dspstate = canvas_suspend_dsp(); binbuf_evalfile(name, dir); - while ((x != s__X.s_thing) && (x = s__X.s_thing)) + while ((x != s__X.s_thing) && s__X.s_thing) + { + x = s__X.s_thing; vmess(x, gensym("pop"), "i", 1); + } pd_doloadbang(); canvas_resume_dsp(dspstate); + return x; } diff --git a/pd/src/m_imp.h b/pd/src/m_imp.h index d129bdbe..58468fd8 100644 --- a/pd/src/m_imp.h +++ b/pd/src/m_imp.h @@ -75,7 +75,7 @@ EXTERN int obj_siginletindex(t_object *x, int m); EXTERN int obj_sigoutletindex(t_object *x, int m); /* misc */ -EXTERN void glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir); +EXTERN t_pd *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir); EXTERN void glob_initfromgui(void *dummy, t_symbol *s, int argc, t_atom *argv); EXTERN void glob_quit(void *dummy); #define __m_imp_h_ diff --git a/pd/src/m_pd.h b/pd/src/m_pd.h index d04eae3a..4d9642fb 100644 --- a/pd/src/m_pd.h +++ b/pd/src/m_pd.h @@ -10,8 +10,8 @@ extern "C" { #define PD_MAJOR_VERSION 0 #define PD_MINOR_VERSION 43 -#define PD_BUGFIX_VERSION 0 -#define PD_TEST_VERSION "" +#define PD_BUGFIX_VERSION 1 +#define PD_TEST_VERSION "test4" /* old name for "MSW" flag -- we have to take it for the sake of many old "nmakefiles" for externs, which will define NT and not MSW */ diff --git a/pd/src/s_inter.c b/pd/src/s_inter.c index 6efa098c..99119983 100644 --- a/pd/src/s_inter.c +++ b/pd/src/s_inter.c @@ -1031,14 +1031,17 @@ int sys_startgui(const char *libdir) glob_t glob_buffer; char *homedir = getenv("HOME"); char embed_glob[FILENAME_MAX]; - char embed_filename[FILENAME_MAX], home_filename[FILENAME_MAX]; + char home_filename[FILENAME_MAX]; char *wish_paths[10] = { - "(did not find an embedded wish)", "(did not find a home directory)", "/Applications/Utilities/Wish.app/Contents/MacOS/Wish", "/Applications/Utilities/Wish Shell.app/Contents/MacOS/Wish Shell", "/Applications/Wish.app/Contents/MacOS/Wish", "/Applications/Wish Shell.app/Contents/MacOS/Wish Shell", + "/Library/Frameworks/Tk.framework/Resources/Wish.app/Contents/MacOS/Wish", + "/Library/Frameworks/Tk.framework/Resources/Wish Shell.app/Contents/MacOS/Wish Shell", + "/System/Library/Frameworks/Tk.framework/Resources/Wish.app/Contents/MacOS/Wish", + "/System/Library/Frameworks/Tk.framework/Resources/Wish Shell.app/Contents/MacOS/Wish Shell", "/usr/bin/wish" }; /* this glob is needed so the Wish executable can have the same @@ -1047,21 +1050,28 @@ int sys_startgui(const char *libdir) sprintf(embed_glob, "%s/../MacOS/Pd*", libdir); glob_buffer.gl_matchc = 1; /* we only need one match */ glob(embed_glob, GLOB_LIMIT, NULL, &glob_buffer); - if (glob_buffer.gl_pathc > 0) { - strcpy(embed_filename, glob_buffer.gl_pathv[0]); - wish_paths[0] = embed_filename; - } - sprintf(home_filename, - "%s/Applications/Wish.app/Contents/MacOS/Wish",homedir); - wish_paths[1] = home_filename; - for(i=0; i<10; i++) + /* If we are using a copy of Wish embedded in the Pd.app, then it + * will automatically load pd-gui.tcl if that embedded Wish can + * find ../Resources/Scripts/AppMain.tcl, then Wish doesn't want + * to receive the pd-gui.tcl as an argument. Otherwise it needs + * to know how to find pd-gui.tcl */ + if (glob_buffer.gl_pathc > 0) + sprintf(cmdbuf, "\"%s\" %d\n", glob_buffer.gl_pathv[0], portno); + else { - if (sys_verbose) - fprintf(stderr, "Trying Wish at \"%s\"\n", wish_paths[i]); - if (stat(wish_paths[i], &statbuf) >= 0) - break; + sprintf(home_filename, + "%s/Applications/Wish.app/Contents/MacOS/Wish",homedir); + wish_paths[0] = home_filename; + for(i=0; i<10; i++) + { + if (sys_verbose) + fprintf(stderr, "Trying Wish at \"%s\"\n", wish_paths[i]); + if (stat(wish_paths[i], &statbuf) >= 0) + break; + } + sprintf(cmdbuf, "\"%s\" \"%s/%spd-gui.tcl\" %d\n", + wish_paths[i], libdir, PDGUIDIR, portno); } - sprintf(cmdbuf,"\"%s\" %d\n", wish_paths[i], portno); #else /* __APPLE__ */ sprintf(cmdbuf, "TCL_LIBRARY=\"%s/lib/tcl/library\" TK_LIBRARY=\"%s/lib/tk/library\" \ @@ -1142,7 +1152,6 @@ int sys_startgui(const char *libdir) @audio - memlock unlimited in the system limits file, perhaps /etc/limits.conf or /etc/security/limits.conf */ - fprintf(stderr, "was... %d\n", sys_hipriority); if (sys_hipriority == -1) sys_hipriority = 1; diff --git a/pd/src/s_main.c b/pd/src/s_main.c index 24b5860e..119a629e 100644 --- a/pd/src/s_main.c +++ b/pd/src/s_main.c @@ -176,11 +176,7 @@ int sys_fontheight(int fontsize) } int sys_defaultfont; -#ifdef MSW -#define DEFAULTFONT 12 -#else #define DEFAULTFONT 10 -#endif static void openit(const char *dirname, const char *filename) { diff --git a/pd/src/s_print.c b/pd/src/s_print.c index c82601a1..6dbb6cfa 100644 --- a/pd/src/s_print.c +++ b/pd/src/s_print.c @@ -41,8 +41,8 @@ static char* strnescape(char *dest, const char *src, size_t len) static char* strnpointerid(char *dest, const void *pointer, size_t len) { *dest=0; - if(pointer) - snprintf(dest, len, ".x%lx", pointer); + if (pointer) + snprintf(dest, len, ".x%lx", (unsigned long)pointer); return dest; } @@ -280,13 +280,15 @@ void glob_finderror(t_pd *dummy) void glob_findinstance(t_pd *dummy, t_symbol*s) { - // revert s to (potential) pointer to object - void*obj=NULL; - if(sscanf(s->s_name, ".x%lx", &obj)) { - if(obj) { - canvas_finderror(obj); + // revert s to (potential) pointer to object + long obj = 0; + if (sscanf(s->s_name, ".x%lx", &obj)) + { + if (obj) + { + canvas_finderror((void *)obj); + } } - } } void bug(const char *fmt, ...) diff --git a/pd/src/s_stuff.h b/pd/src/s_stuff.h index b37b161a..03f42d38 100644 --- a/pd/src/s_stuff.h +++ b/pd/src/s_stuff.h @@ -290,7 +290,7 @@ void jack_listdevs(void); int mmio_open_audio(int naudioindev, int *audioindev, int nchindev, int *chindev, int naudiooutdev, int *audiooutdev, - int nchoutdev, int *choutdev, int rate); + int nchoutdev, int *choutdev, int rate, int blocksize); void mmio_close_audio( void); void mmio_reportidle(void); int mmio_send_dacs(void); @@ -375,6 +375,9 @@ EXTERN void sys_pollmidiqueue(void ); EXTERN int sys_pollgui(void ); EXTERN void sys_setchsr(int chin, int chout, int sr); +EXTERN void inmidi_realtimein(int portno, int cmd); +EXTERN void inmidi_byte(int portno, int byte); +EXTERN void inmidi_sysex(int portno, int byte); EXTERN void inmidi_noteon(int portno, int channel, int pitch, int velo); EXTERN void inmidi_controlchange(int portno, int channel, diff --git a/pd/src/s_watchdog.c b/pd/src/s_watchdog.c index 2602334d..d595773c 100644 --- a/pd/src/s_watchdog.c +++ b/pd/src/s_watchdog.c @@ -18,7 +18,7 @@ int main(int argc, char **argv) while (1) { struct timeval timout; - fd_set readset; + fd_set readset, exceptset; if (happy) { timout.tv_sec = 5; @@ -31,7 +31,11 @@ int main(int argc, char **argv) } FD_ZERO(&readset); FD_SET(0, &readset); - select(1, &readset, 0, 0, &timout); + FD_ZERO(&exceptset); + FD_SET(0, &exceptset); + select(1, &readset, 0, &exceptset, &timout); + if (FD_ISSET(0, &exceptset)) + return (0); if (FD_ISSET(0, &readset)) { char buf[100]; diff --git a/pd/tcl/Makefile.am b/pd/tcl/Makefile.am index 65780ebf..cf952d22 100644 --- a/pd/tcl/Makefile.am +++ b/pd/tcl/Makefile.am @@ -10,7 +10,7 @@ bin_SCRIPTS = pd-gui.tcl libpdtcldir = $(pkglibdir)/tcl dist_libpdtcl_SCRIPTS = pd-gui.tcl -dist_libpdtcl_DATA = apple_events.tcl dialog_canvas.tcl dialog_gatom.tcl dialog_path.tcl pd_bindings.tcl pd_menus.tcl pdwindow.tcl scrollboxwindow.tcl AppMain.tcl dialog_data.tcl dialog_iemgui.tcl dialog_startup.tcl pd_connect.tcl pdtk_array.tcl pkgIndex.tcl wheredoesthisgo.tcl dialog_array.tcl dialog_find.tcl dialog_message.tcl helpbrowser.tcl pdtk_canvas.tcl pkg_mkIndex.tcl dialog_audio.tcl dialog_font.tcl dialog_midi.tcl opt_parser.tcl pd_menucommands.tcl pdtk_text.tcl scrollbox.tcl pd.ico +dist_libpdtcl_DATA = apple_events.tcl dialog_canvas.tcl dialog_gatom.tcl dialog_path.tcl pd_bindings.tcl pd_menus.tcl pdwindow.tcl scrollboxwindow.tcl AppMain.tcl dialog_data.tcl dialog_iemgui.tcl dialog_startup.tcl pd_connect.tcl pdtk_array.tcl pkgIndex.tcl wheredoesthisgo.tcl dialog_array.tcl dialog_find.tcl dialog_message.tcl helpbrowser.tcl pdtk_canvas.tcl pkg_mkIndex.tcl dialog_audio.tcl dialog_font.tcl dialog_midi.tcl opt_parser.tcl pd_menucommands.tcl pdtk_text.tcl scrollbox.tcl pd_guiprefs.tcl pd.ico etags: TAGS etags --append --language=none --regex="/proc[ \t]+\([^ \t]+\)/\1/" *.tcl diff --git a/pd/tcl/pd-gui.tcl b/pd/tcl/pd-gui.tcl index 39b260f5..d2fbdba8 100644 --- a/pd/tcl/pd-gui.tcl +++ b/pd/tcl/pd-gui.tcl @@ -46,10 +46,15 @@ package require pdtk_canvas package require pdtk_text # TODO eliminate this kludge: package require wheredoesthisgo +package require pd_guiprefs #------------------------------------------------------------------------------# # import functions into the global namespace +# gui preferences +namespace import ::pd_guiprefs::init +namespace import ::pd_guiprefs::update_recentfiles +namespace import ::pd_guiprefs::write_recentfiles # make global since they are used throughout namespace import ::pd_menucommands::* @@ -167,9 +172,9 @@ set dsp 0 set meters 0 # the toplevel window that currently is on top and has focus set focused_window . -# store that last 10 files that were opened +# store that last 5 files that were opened set recentfiles_list {} -set total_recentfiles 10 +set total_recentfiles 5 # keep track of the location of popup menu for PatchWindows, in canvas coords set popup_xcanvas 0 set popup_ycanvas 0 @@ -492,6 +497,7 @@ proc pdtk_pd_startup {major minor bugfix test if {$::tcl_version >= 8.5} {find_default_font} set_base_font $sys_font $sys_fontweight fit_font_into_metrics + ::pd_guiprefs::init pdsend "pd init [enquote_path [pwd]] $oldtclversion $::font_measured_metrics" ::pd_bindings::class_bindings ::pd_bindings::global_bindings diff --git a/pd/tcl/pd_guiprefs.tcl b/pd/tcl/pd_guiprefs.tcl new file mode 100644 index 00000000..29d45677 --- /dev/null +++ b/pd/tcl/pd_guiprefs.tcl @@ -0,0 +1,240 @@ +# +# Copyright (c) 1997-2009 Miller Puckette. +# Copyright (c) 2011 Yvan Volochine. +#(c) 2008 WordTech Communications LLC. License: standard Tcl license, http://www.tcl.tk/software/tcltk/license.html + +package provide pd_guiprefs 0.1 + + +namespace eval ::pd_guiprefs:: { + namespace export init + namespace export write_recentfiles + namespace export update_recentfiles +} + +# FIXME should these be globals ? +set ::recentfiles_key "" +set ::recentfiles_domain "" + + +################################################################# +# global procedures +################################################################# +# ------------------------------------------------------------------------------ +# init preferences +# +proc ::pd_guiprefs::init {} { + switch -- $::windowingsystem { + "aqua" { init_aqua } + "win32" { init_win } + "x11" { init_x11 } + } + # assign gui preferences + # osx special case for arrays + set arr [expr { $::windowingsystem eq "aqua" }] + set ::recentfiles_list "" + catch {set ::recentfiles_list [get_config $::recentfiles_domain \ + $::recentfiles_key $arr]} +} + +proc init_aqua {} { + # osx has a "Open Recent" menu with 10 recent files (others have 5 inlined) + set ::recentfiles_domain org.puredata + set ::recentfiles_key "NSRecentDocuments" + set ::total_recentfiles 10 +} + +proc init_win {} { + # windows uses registry + set ::recentfiles_domain "HKEY_CURRENT_USER\\Software\\Pure-Data" + set ::recentfiles_key "RecentDocs" +} + +proc init_x11 {} { + # linux uses ~/.config/pure-data dir + set ::recentfiles_domain "~/.config/pure-data" + set ::recentfiles_key "recentfiles.conf" + prepare_configdir +} + +# ------------------------------------------------------------------------------ +# write recent files +# +proc ::pd_guiprefs::write_recentfiles {} { + write_config $::recentfiles_list $::recentfiles_domain $::recentfiles_key true +} + +# ------------------------------------------------------------------------------ +# this is called when opening a document (wheredoesthisshouldgo.tcl) +# +proc ::pd_guiprefs::update_recentfiles {afile} { + # remove duplicates first + set index [lsearch -exact $::recentfiles_list $afile] + set ::recentfiles_list [lreplace $::recentfiles_list $index $index] + # insert new one in the beginning and crop the list + set ::recentfiles_list [linsert $::recentfiles_list 0 $afile] + set ::recentfiles_list [lrange $::recentfiles_list 0 $::total_recentfiles] + ::pd_menus::update_recentfiles_menu +} + +################################################################# +# main read/write procedures +################################################################# + +# ------------------------------------------------------------------------------ +# get configs from a file or the registry +# +proc get_config {adomain {akey} {arr}} { + switch -- $::windowingsystem { + "aqua" { set conf [get_config_aqua $adomain $akey $arr] } + "win32" { set conf [get_config_win $adomain $akey $arr] } + "x11" { set conf [get_config_x11 $adomain $akey $arr] } + } + return $conf +} + +# ------------------------------------------------------------------------------ +# write configs to a file or to the registry +# $arr is true if the data needs to be written in an array +# +proc write_config {data {adomain} {akey} {arr false}} { + switch -- $::windowingsystem { + "aqua" { write_config_aqua $data $adomain $akey $arr } + "win32" { write_config_win $data $adomain $akey $arr } + "x11" { write_config_x11 $data $adomain $akey } + } +} + +################################################################# +# os specific procedures +################################################################# + +# ------------------------------------------------------------------------------ +# osx: read a plist file +# +proc get_config_aqua {adomain {akey} {arr false}} { + if {![catch {exec defaults read $adomain $akey} conf]} { + if {$arr} { + set conf [plist_array_to_tcl_list $conf] + } + } { + # initialize NSRecentDocuments with an empty array + exec defaults write $adomain $akey -array + set conf {} + } + return $conf +} + +# ------------------------------------------------------------------------------ +# win: read in the registry +# +proc get_config_win {adomain {akey} {arr false}} { + package require registry + if {![catch {registry get $adomain $akey} conf]} { + return [expr {$conf}] + } { + return {} + } +} + +# ------------------------------------------------------------------------------ +# linux: read a config file and return its lines splitted. +# +proc get_config_x11 {adomain {akey} {arr false}} { + set filename [file join $adomain $akey] + set conf {} + if { + [file exists $filename] == 1 + && [file readable $filename] + } { + set fl [open $filename r] + while {[gets $fl line] >= 0} { + lappend conf $line + } + close $fl + } + return $conf +} + +# ------------------------------------------------------------------------------ +# osx: write configs to plist file +# if $arr is true, we write an array +# +proc write_config_aqua {data {adomain} {akey} {arr false}} { + # FIXME empty and write again so we don't loose the order + if {[catch {exec defaults write $adomain $akey -array} errorMsg]} { + puts stderr "ERROR: write_config_aqua $akey: $errorMsg" + } + if {$arr} { + foreach filepath $data { + exec defaults write $adomain $akey -array-add $filepath + } + } { + exec defaults write $adomain $akey $data + } +} + +# ------------------------------------------------------------------------------ +# win: write configs to registry +# if $arr is true, we write an array +# +proc write_config_win {data {adomain} {akey} {arr false}} { + package require registry + # FIXME: ugly + if {$arr} { + if {[catch {registry set $adomain $akey $data multi_sz} errorMsg]} { + puts stderr "ERROR: write_config_win $data $akey: $errorMsg" + } + } { + if {[catch {registry set $adomain $akey $data sz} errorMsg]} { + puts stderr "ERROR: write_config_win $data $akey: $errorMsg" + } + } +} + +# ------------------------------------------------------------------------------ +# linux: write configs to USER_APP_CONFIG_DIR +# +proc write_config_x11 {data {adomain} {akey}} { + # right now I (yvan) assume that data are just \n separated, i.e. no keys + set data [join $data "\n"] + set filename [file join $adomain $akey] + if {[catch {set fl [open $filename w]} errorMsg]} { + puts stderr "ERROR: write_config_x11 $data $akey: $errorMsg" + } { + puts -nonewline $fl $data + close $fl + } +} + +################################################################# +# utils +################################################################# + +# ------------------------------------------------------------------------------ +# linux only! : look for pd config directory and create it if needed +# +proc prepare_configdir {} { + if {[file isdirectory $::recentfiles_domain] != 1} { + file mkdir $::recentfiles_domain + puts "$::recentfiles_domain was created.\n" + } +} + +# ------------------------------------------------------------------------------ +# osx: handles arrays in plist files (thanks hc) +# +proc plist_array_to_tcl_list {arr} { + set result {} + set filelist $arr + regsub -all -- {("?),\s+("?)} $filelist {\1 \2} filelist + regsub -all -- {\n} $filelist {} filelist + regsub -all -- {^\(} $filelist {} filelist + regsub -all -- {\)$} $filelist {} filelist + + foreach file $filelist { + set filename [regsub -- {,$} $file {}] + lappend result $filename + } + return $result +} diff --git a/pd/tcl/pd_menus.tcl b/pd/tcl/pd_menus.tcl index fc617dfa..9219f30a 100644 --- a/pd/tcl/pd_menus.tcl +++ b/pd/tcl/pd_menus.tcl @@ -123,7 +123,7 @@ proc ::pd_menus::configure_for_dialog {mytoplevel} { # ------------------------------------------------------------------------------ # menu building functions proc ::pd_menus::build_file_menu {mymenu} { - # run the platform-specific build_file_menu_* procs first, the config them + # run the platform-specific build_file_menu_* procs first, and config them [format build_file_menu_%s $::windowingsystem] $mymenu $mymenu entryconfigure [_ "New"] -command {menu_new} $mymenu entryconfigure [_ "Open"] -command {menu_open} @@ -133,6 +133,10 @@ proc ::pd_menus::build_file_menu {mymenu} { $mymenu entryconfigure [_ "Close"] -command {menu_send_float $::focused_window menuclose 0} $mymenu entryconfigure [_ "Message..."] -command {menu_message_dialog} $mymenu entryconfigure [_ "Print..."] -command {menu_print $::focused_window} + # update recent files + if {[llength $::recentfiles_list] > 0} { + ::pd_menus::update_recentfiles_menu false + } } proc ::pd_menus::build_edit_menu {mymenu} { @@ -171,7 +175,7 @@ proc ::pd_menus::build_edit_menu {mymenu} { $mymenu add separator #TODO madness! how to set the state of the check box without invoking the menu! $mymenu add check -label [_ "Edit Mode"] -accelerator "$accelerator+E" \ - -selectcolor grey85 -variable ::editmode_button \ + -variable ::editmode_button \ -command {menu_editmode $::editmode_button} } @@ -326,52 +330,69 @@ proc ::pd_menus::update_undo_on_menu {mytoplevel} { } # ------------------------------------------------------------------------------ -# update the menu entries for opening recent files -proc ::pd_menus::update_recentfiles_menu {} { +# update the menu entries for opening recent files (write arg should always be true except the first time when pd is opened) +proc ::pd_menus::update_recentfiles_menu {{write true}} { variable menubar switch -- $::windowingsystem { - "aqua" {::pd_menus::update_openrecent_menu_aqua .openrecent} - "win32" {update_recentfiles_on_menu $menubar.file} - "x11" {update_recentfiles_on_menu $menubar.file} + "aqua" {::pd_menus::update_openrecent_menu_aqua .openrecent $write} + "win32" {::pd_menus::update_recentfiles_on_menu $menubar.file $write} + "x11" {::pd_menus::update_recentfiles_on_menu $menubar.file $write} } } proc ::pd_menus::clear_recentfiles_menu {} { set ::recentfiles_list {} ::pd_menus::update_recentfiles_menu + # empty recentfiles in preferences (write empty array) + ::pd_guiprefs::write_recentfiles } -proc ::pd_menus::update_openrecent_menu_aqua {mymenu} { +proc ::pd_menus::update_openrecent_menu_aqua {mymenu {write}} { if {! [winfo exists $mymenu]} {menu $mymenu} $mymenu delete 0 end - $mymenu add separator - $mymenu add command -label [_ "Clear Menu"] \ - -command "::pd_menus::clear_recentfiles_menu" - # newest need to be on top, but the list in oldest first, so insert + + # now the list is last first so we just add foreach filename $::recentfiles_list { - $mymenu insert 0 command -label [file tail $filename] \ + $mymenu add command -label [file tail $filename] \ -command "open_file {$filename}" } + # clear button + $mymenu add separator + $mymenu add command -label [_ "Clear Menu"] \ + -command "::pd_menus::clear_recentfiles_menu" + # write to config file + if {$write == true} { ::pd_guiprefs::write_recentfiles } } +# ------------------------------------------------------------------------------ # this expects to be run on the File menu, and to insert above the last separator -proc ::pd_menus::update_recentfiles_on_menu {mymenu} { +proc ::pd_menus::update_recentfiles_on_menu {mymenu {write}} { set lastitem [$mymenu index end] set i 1 while {[$mymenu type [expr $lastitem-$i]] ne "separator"} {incr i} set bottom_separator [expr $lastitem-$i] incr i + while {[$mymenu type [expr $lastitem-$i]] ne "separator"} {incr i} set top_separator [expr $lastitem-$i] if {$top_separator < [expr $bottom_separator-1]} { $mymenu delete [expr $top_separator+1] [expr $bottom_separator-1] } - foreach filename $::recentfiles_list { + # insert the list from the end because we insert each element on the top + set i [llength $::recentfiles_list] + while {[incr i -1] > 0} { + + set filename [lindex $::recentfiles_list $i] $mymenu insert [expr $top_separator+1] command \ -label [file tail $filename] -command "open_file {$filename}" } -} + set filename [lindex $::recentfiles_list 0] + $mymenu insert [expr $top_separator+1] command \ + -label [file tail $filename] -command "open_file {$filename}" + # write to config file + if {$write == true} { ::pd_guiprefs::write_recentfiles } +} # ------------------------------------------------------------------------------ # lots of crazy recursion to update the Window menu @@ -481,7 +502,8 @@ proc ::pd_menus::build_file_menu_aqua {mymenu} { variable accelerator $mymenu add command -label [_ "New"] -accelerator "$accelerator+N" $mymenu add command -label [_ "Open"] -accelerator "$accelerator+O" - ::pd_menus::update_openrecent_menu_aqua .openrecent + # this is now done in main ::pd_menus::build_file_menu + #::pd_menus::update_openrecent_menu_aqua .openrecent $mymenu add cascade -label [_ "Open Recent"] -menu .openrecent $mymenu add separator $mymenu add command -label [_ "Close"] -accelerator "$accelerator+W" @@ -583,4 +605,3 @@ proc ::pd_menus::build_window_menu_win32 {mymenu} { } # the "Help" does not have cross-platform differences - diff --git a/pd/tcl/pdtk_canvas.tcl b/pd/tcl/pdtk_canvas.tcl index c1a85420..3ed8e0b6 100644 --- a/pd/tcl/pdtk_canvas.tcl +++ b/pd/tcl/pdtk_canvas.tcl @@ -127,6 +127,8 @@ proc pdtk_canvas_saveas {name initialfile initialdir} { set basename [file tail $filename] pdsend "$name savetofile [enquote_path $basename] [enquote_path $dirname]" set ::filenewdir $dirname + # add to recentfiles + ::pd_guiprefs::update_recentfiles $filename } ##### ask user Save? Discard? Cancel?, and if so, send a message on to Pd ###### @@ -180,7 +182,15 @@ proc pdtk_canvas_rightclick {tkcanvas x y b} { proc pdtk_canvas_clickpaste {tkcanvas x y b} { pdtk_canvas_mouse $tkcanvas $x $y $b 0 pdtk_canvas_mouseup $tkcanvas $x $y $b - pdtk_pastetext + if { [catch {set pdtk_pastebuffer [selection get]}] } { + # no selection... do nothing + } else { + for {set i 0} {$i < [string length $pdtk_pastebuffer]} {incr i 1} { + set cha [string index $pdtk_pastebuffer $i] + scan $cha %c keynum + pdsend "pd key 1 $keynum 0" + } + } } #------------------------------------------------------------------------------# @@ -264,13 +274,6 @@ proc ::pdtk_canvas::pdtk_canvas_editmode {mytoplevel state} { set ::editmode_button $state set ::editmode($mytoplevel) $state event generate $mytoplevel <<EditMode>> - # can't change the menu background color on Aqua - if {$::windowingsystem eq "aqua"} {return} - if {$state == 0} { - $::pd_menus::menubar.edit entryconfigure [_ "Edit Mode"] -background {} - } else { - $::pd_menus::menubar.edit entryconfigure [_ "Edit Mode"] -background green - } } # message from Pd to update the currently available undo/redo action diff --git a/pd/tcl/pdtk_text.tcl b/pd/tcl/pdtk_text.tcl index 5818926c..b23ae0b2 100644 --- a/pd/tcl/pdtk_text.tcl +++ b/pd/tcl/pdtk_text.tcl @@ -28,11 +28,14 @@ proc pdtk_text_set {tkcanvas tag text} { # paste into an existing text box by literally "typing" the contents of the # clipboard, i.e. send the contents one character at a time via 'pd key' proc pdtk_pastetext {args} { - catch {set pdtk_pastebuffer [clipboard get]} - for {set i 0} {$i < [string length $pdtk_pastebuffer]} {incr i 1} { - set cha [string index $pdtk_pastebuffer $i] - scan $cha %c keynum - pdsend "pd key 1 $keynum 0" + if { [catch {set pdtk_pastebuffer [clipboard get]}] } { + # no selection... do nothing + } else { + for {set i 0} {$i < [string length $pdtk_pastebuffer]} {incr i 1} { + set cha [string index $pdtk_pastebuffer $i] + scan $cha %c keynum + pdsend "pd key 1 $keynum 0" + } } } diff --git a/pd/tcl/pkgIndex.tcl b/pd/tcl/pkgIndex.tcl index 5f4921b8..0dc25e1c 100644 --- a/pd/tcl/pkgIndex.tcl +++ b/pd/tcl/pkgIndex.tcl @@ -25,6 +25,7 @@ package ifneeded dialog_path 0.1 [list source [file join $dir dialog_path.tcl]] package ifneeded dialog_startup 0.1 [list source [file join $dir dialog_startup.tcl]] package ifneeded helpbrowser 0.1 [list source [file join $dir helpbrowser.tcl]] package ifneeded opt_parser 0.1 [list source [file join $dir opt_parser.tcl]] +package ifneeded pd_guiprefs 0.1 [list source [file join $dir pd_guiprefs.tcl]] package ifneeded pdwindow 0.1 [list source [file join $dir pdwindow.tcl]] package ifneeded pd_menucommands 0.1 [list source [file join $dir pd_menucommands.tcl]] package ifneeded pd_menus 0.1 [list source [file join $dir pd_menus.tcl]] diff --git a/pd/tcl/wheredoesthisgo.tcl b/pd/tcl/wheredoesthisgo.tcl index 1e9e0344..acee40c0 100644 --- a/pd/tcl/wheredoesthisgo.tcl +++ b/pd/tcl/wheredoesthisgo.tcl @@ -6,15 +6,14 @@ package provide wheredoesthisgo 0.1 proc open_file {filename} { set directory [file normalize [file dirname $filename]] set basename [file tail $filename] - if {[regexp -nocase -- "\.(pd|pat|mxt)$" $filename]} { + if { + [file exists $filename] + && [regexp -nocase -- "\.(pd|pat|mxt)$" $filename] + } then { ::pdtk_canvas::started_loading_file [format "%s/%s" $basename $filename] pdsend "pd open [enquote_path $basename] [enquote_path $directory]" - # remove duplicates first, then the duplicate added after to the top - set index [lsearch -exact $::recentfiles_list $filename] - set ::recentfiles_list [lreplace $::recentfiles_list $index $index] - lappend ::recentfiles_list $filename - set ::recentfiles_list [lrange $::recentfiles_list 0 $::total_recentfiles] - ::pd_menus::update_recentfiles_menu + # now this is done in pd_guiprefs + ::pd_guiprefs::update_recentfiles $filename } { ::pdwindow::post [format [_ "Ignoring '%s': doesn't look like a Pd-file"] $filename] } |