aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LICENSE.txt290
-rw-r--r--Makefile274
-rw-r--r--README.txt31
-rw-r--r--debian/changelog5
-rw-r--r--debian/compat1
-rw-r--r--debian/control12
-rw-r--r--debian/copyright14
-rwxr-xr-xdebian/rules16
-rw-r--r--examples/pddp.css18
-rw-r--r--examples/pddplink-test-01.html5
-rw-r--r--examples/pddplink-test-01.pd17
-rw-r--r--examples/pddplink-test-01.xml19
-rw-r--r--examples/pddplink-test-02.html5
-rw-r--r--examples/pddplink-test-02.pd17
-rw-r--r--examples/pddplink-test-02.xml19
-rw-r--r--examples/test.bg.jpgbin0 -> 5491 bytes
-rwxr-xr-xexamples/toonepage21
-rwxr-xr-xexamples/topdf23
-rw-r--r--pddplink.c411
19 files changed, 1198 insertions, 0 deletions
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..fa0bef4
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,290 @@
+GNU GENERAL PUBLIC LICENSE
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom
+to share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This General
+Public License applies to most of the Free Software Foundation's
+software and to any other program whose authors commit to using it.
+(Some other Free Software Foundation software is covered by the
+GNU Library General Public License instead.) You can apply it to your
+programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new free
+programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone
+to deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis
+or for a fee, you must give the recipients all the rights that you have. You
+must make sure that they, too, receive or can get the source code. And
+you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on,
+we want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.
+We wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program
+proprietary. To prevent this, we have made it clear that any patent must
+be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS FOR
+COPYING, DISTRIBUTION AND
+MODIFICATION
+
+0. This License applies to any program or other work which contains a
+notice placed by the copyright holder saying it may be distributed under
+the terms of this General Public License. The "Program", below, refers
+to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it, either
+verbatim or with modifications and/or translated into another language.
+(Hereinafter, translation is included without limitation in the term
+"modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of running
+the Program is not restricted, and the output from the Program is
+covered only if its contents constitute a work based on the Program
+(independent of having been made by running the Program). Whether
+that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the notices
+that refer to this License and to the absence of any warranty; and give
+any other recipients of the Program a copy of this License along with the
+Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide a
+ warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but does
+ not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program, and
+can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based on
+the Program, the distribution of the whole must be on the terms of this
+License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based
+on the Program.
+
+In addition, mere aggregation of another work not based on the
+Program with the Program (or with a work based on the Program) on a
+volume of a storage or distribution medium does not bring the other
+work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding
+ machine-readable source code, which must be distributed under
+ the terms of Sections 1 and 2 above on a medium customarily
+ used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your cost
+ of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to control
+compilation and installation of the executable. However, as a special
+exception, the source code distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies the
+executable.
+
+If distribution of executable or object code is made by offering access to
+copy from a designated place, then offering equivalent access to copy
+the source code from the same place counts as distribution of the source
+code, even though third parties are not compelled to copy the source
+along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt otherwise
+to copy, modify, sublicense or distribute the Program is void, and will
+automatically terminate your rights under this License. However, parties
+who have received copies, or rights, from you under this License will not
+have their licenses terminated so long as such parties remain in full
+compliance.
+
+5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and all
+its terms and conditions for copying, distributing or modifying the
+Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these terms
+and conditions. You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein. You are not responsible
+for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot distribute
+so as to satisfy simultaneously your obligations under this License and
+any other pertinent obligations, then as a consequence you may not
+distribute the Program at all. For example, if a patent license would not
+permit royalty-free redistribution of the Program by all those who
+receive copies directly or indirectly through you, then the only way you
+could satisfy both it and this License would be to refrain entirely from
+distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents
+or other property right claims or to contest validity of any such claims;
+this section has the sole purpose of protecting the integrity of the free
+software distribution system, which is implemented by public license
+practices. Many people have made generous contributions to the wide
+range of software distributed through that system in reliance on
+consistent application of that system; it is up to the author/donor to
+decide if he or she is willing to distribute software through any other
+system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be
+a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an
+explicit geographical distribution limitation excluding those countries, so
+that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new
+versions of the General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may differ in
+detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number
+of this License, you may choose any version ever published by the Free
+Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we
+sometimes make exceptions for this. Our decision will be guided by the
+two goals of preserving the free status of all derivatives of our free
+software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF
+CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM,
+TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT
+WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD
+THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE
+COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW
+OR AGREED TO IN WRITING WILL ANY COPYRIGHT
+HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED
+ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING
+ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
+LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
+WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
+OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..7cca6fb
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,274 @@
+## Pd library template version 1.0
+# For instructions on how to use this template, see:
+# http://puredata.info/docs/developer/MakefileTemplate
+LIBRARY_NAME = template
+
+# add your .c source files to the SOURCES variable, help files will be
+# included automatically
+SOURCES = mycobject.c
+
+# For objects that only build on certain platforms, add those to the SOURCES
+# line for the right platforms.
+SOURCES_android =
+SOURCES_cygwin =
+SOURCES_macosx =
+SOURCES_iphoneos =
+SOURCES_linux =
+SOURCES_windows =
+
+# list all pd objects (i.e. myobject.pd) files here, and their helpfiles will
+# be included automatically
+PDOBJECTS = mypdobject.pd
+
+# example patches and related files, in the 'examples' subfolder
+EXAMPLES = bothtogether.pd
+
+# manuals and related files, in the 'manual' subfolder
+MANUAL = manual.txt
+
+# if you want to include any other files in the source and binary tarballs,
+# list them here. This can be anything from header files, example patches,
+# documentation, etc. README.txt and LICENSE.txt are required and therefore
+# automatically included
+EXTRA_DIST =
+
+
+
+#------------------------------------------------------------------------------#
+#
+# you shouldn't need to edit anything below here, if we did it right :)
+#
+#------------------------------------------------------------------------------#
+
+# get library version from meta file
+LIBRARY_VERSION = $(shell sed -n 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' $(LIBRARY_NAME)-meta.pd)
+
+# where Pd lives
+PD_PATH = ../../pd
+# where to install the library
+prefix = /usr/local
+libdir = $(prefix)/lib
+pkglibdir = $(libdir)/pd-externals
+objectsdir = $(pkglibdir)
+
+
+INSTALL = install
+INSTALL_FILE = $(INSTALL) -p -m 644
+INSTALL_DIR = $(INSTALL) -p -m 755 -d
+
+CFLAGS = -DPD -I$(PD_PATH)/src -Wall -W -g
+LDFLAGS =
+LIBS =
+ALLSOURCES := $(SOURCES) $(SOURCES_android) $(SOURCES_cygwin) $(SOURCES_macosx) \
+ $(SOURCES_iphoneos) $(SOURCES_linux) $(SOURCES_windows)
+
+UNAME := $(shell uname -s)
+ifeq ($(UNAME),Darwin)
+ CPU := $(shell uname -p)
+ ifeq ($(CPU),arm) # iPhone/iPod Touch
+ SOURCES += $(SOURCES_macosx)
+ EXTENSION = pd_darwin
+ OS = iphoneos
+ IPHONE_BASE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
+ CC=$(IPHONE_BASE)/gcc
+ CPP=$(IPHONE_BASE)/cpp
+ CXX=$(IPHONE_BASE)/g++
+ ISYSROOT = -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk
+ IPHONE_CFLAGS = -miphoneos-version-min=3.0 $(ISYSROOT) -arch armv6
+ OPT_CFLAGS = -fast -funroll-loops -fomit-frame-pointer
+ CFLAGS := $(IPHONE_CFLAGS) $(OPT_CFLAGS) $(CFLAGS) \
+ -I/Applications/Pd-extended.app/Contents/Resources/include
+ LDFLAGS += -arch armv6 -bundle -undefined dynamic_lookup $(ISYSROOT)
+ LIBS += -lc
+ STRIP = strip -x
+ DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION)
+ DISTBINDIR=$(DISTDIR)-$(OS)
+ else # Mac OS X
+ SOURCES += $(SOURCES_macosx)
+ EXTENSION = pd_darwin
+ OS = macosx
+ OPT_CFLAGS = -ftree-vectorize -ftree-vectorizer-verbose=2 -fast
+ FAT_FLAGS = -arch i386 -arch ppc -mmacosx-version-min=10.4
+ CFLAGS += $(FAT_FLAGS) -fPIC -I/sw/include \
+ -I/Applications/Pd-extended.app/Contents/Resources/include
+ LDFLAGS += $(FAT_FLAGS) -bundle -undefined dynamic_lookup -L/sw/lib
+ # if the 'pd' binary exists, check the linking against it to aid with stripping
+ LDFLAGS += $(shell test -e $(PD_PATH)/bin/pd && echo -bundle_loader $(PD_PATH)/bin/pd)
+ LIBS += -lc
+ STRIP = strip -x
+ DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION)
+ DISTBINDIR=$(DISTDIR)-$(OS)
+ endif
+endif
+ifeq ($(UNAME),Linux)
+ SOURCES += $(SOURCES_linux)
+ EXTENSION = pd_linux
+ OS = linux
+ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+ CFLAGS += -fPIC
+ LDFLAGS += -Wl,--export-dynamic -shared -fPIC
+ LIBS += -lc
+ STRIP = strip --strip-unneeded -R .note -R .comment
+ DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION)
+ DISTBINDIR=$(DISTDIR)-$(OS)-$(shell uname -m)
+endif
+ifeq (CYGWIN,$(findstring CYGWIN,$(UNAME)))
+ SOURCES += $(SOURCES_cygwin)
+ EXTENSION = dll
+ OS = cygwin
+ OPT_CFLAGS = -O6 -funroll-loops -fomit-frame-pointer
+ CFLAGS +=
+ LDFLAGS += -Wl,--export-dynamic -shared -L$(PD_PATH)/src
+ LIBS += -lc -lpd
+ STRIP = strip --strip-unneeded -R .note -R .comment
+ DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION)
+ DISTBINDIR=$(DISTDIR)-$(OS)
+endif
+ifeq (MINGW,$(findstring MINGW,$(UNAME)))
+ SOURCES += $(SOURCES_windows)
+ EXTENSION = dll
+ OS = windows
+ OPT_CFLAGS = -O3 -funroll-loops -fomit-frame-pointer -march=i686 -mtune=pentium4
+ CFLAGS += -mms-bitfields
+ LDFLAGS += -s -shared -Wl,--enable-auto-import
+ LIBS += -L$(PD_PATH)/src -L$(PD_PATH)/bin -L$(PD_PATH)/obj -lpd -lwsock32 -lkernel32 -luser32 -lgdi32
+ STRIP = strip --strip-unneeded -R .note -R .comment
+ DISTDIR=$(LIBRARY_NAME)-$(LIBRARY_VERSION)
+ DISTBINDIR=$(DISTDIR)-$(OS)
+endif
+
+CFLAGS += $(OPT_CFLAGS)
+
+
+.PHONY = install libdir_install single_install install-doc install-exec install-examples install-manual clean dist etags
+
+all: $(SOURCES:.c=.$(EXTENSION))
+
+%.o: %.c
+ $(CC) $(CFLAGS) -o "$*.o" -c "$*.c"
+
+%.$(EXTENSION): %.o
+ $(CC) $(LDFLAGS) -o "$*.$(EXTENSION)" "$*.o" $(LIBS)
+ chmod a-x "$*.$(EXTENSION)"
+
+# this links everything into a single binary file
+$(LIBRARY_NAME): $(SOURCES:.c=.o) $(LIBRARY_NAME).o
+ $(CC) $(LDFLAGS) -o $(LIBRARY_NAME).$(EXTENSION) $(SOURCES:.c=.o) $(LIBRARY_NAME).o $(LIBS)
+ chmod a-x $(LIBRARY_NAME).$(EXTENSION)
+
+
+install: libdir_install
+
+# The meta and help files are explicitly installed to make sure they are
+# actually there. Those files are not optional, then need to be there.
+libdir_install: $(SOURCES:.c=.$(EXTENSION)) install-doc install-examples install-manual
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ $(INSTALL_FILE) $(LIBRARY_NAME)-meta.pd \
+ $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ test -z "$(strip $(SOURCES))" || (\
+ $(INSTALL_FILE) $(SOURCES:.c=.$(EXTENSION)) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME) && \
+ $(STRIP) $(addprefix $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/,$(SOURCES:.c=.$(EXTENSION))))
+ test -z "$(strip $(PDOBJECTS))" || \
+ $(INSTALL_FILE) $(PDOBJECTS) \
+ $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+
+# install library linked as single binary
+single_install: $(LIBRARY_NAME) install-doc install-exec
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ $(INSTALL_FILE) $(LIBRARY_NAME).$(EXTENSION) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ $(STRIP) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/$(LIBRARY_NAME).$(EXTENSION)
+
+install-doc:
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ test -z "$(strip $(SOURCES))" || \
+ $(INSTALL_FILE) $(SOURCES:.c=-help.pd) \
+ $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ test -z "$(strip $(PDOBJECTS))" || \
+ $(INSTALL_FILE) $(PDOBJECTS:.pd=-help.pd) \
+ $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)
+ $(INSTALL_FILE) README.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/README.txt
+ $(INSTALL_FILE) LICENSE.txt $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/LICENSE.txt
+
+install-examples:
+ test -z "$(strip $(EXAMPLES))" || \
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples && \
+ for file in $(EXAMPLES); do \
+ $(INSTALL_FILE) examples/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/examples; \
+ done
+
+install-manual:
+ test -z "$(strip $(MANUAL))" || \
+ $(INSTALL_DIR) $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual && \
+ for file in $(MANUAL); do \
+ $(INSTALL_FILE) manual/$$file $(DESTDIR)$(objectsdir)/$(LIBRARY_NAME)/manual; \
+ done
+
+
+clean:
+ -rm -f -- $(SOURCES:.c=.o)
+ -rm -f -- $(SOURCES:.c=.$(EXTENSION))
+ -rm -f -- $(LIBRARY_NAME).o
+ -rm -f -- $(LIBRARY_NAME).$(EXTENSION)
+
+distclean: clean
+ -rm -f -- $(DISTBINDIR).tar.gz
+ -rm -rf -- $(DISTBINDIR)
+ -rm -f -- $(DISTDIR).tar.gz
+ -rm -rf -- $(DISTDIR)
+
+
+$(DISTBINDIR):
+ $(INSTALL_DIR) $(DISTBINDIR)
+
+libdir: all $(DISTBINDIR)
+ $(INSTALL_FILE) $(LIBRARY_NAME)-meta.pd $(DISTBINDIR)
+ $(INSTALL_FILE) $(SOURCES) $(DISTBINDIR)
+ $(INSTALL_FILE) $(SOURCES:.c=-help.pd) $(DISTBINDIR)
+ test -z "$(strip $(EXTRA_DIST))" || \
+ $(INSTALL_FILE) $(EXTRA_DIST) $(DISTBINDIR)
+# tar --exclude-vcs -czpf $(DISTBINDIR).tar.gz $(DISTBINDIR)
+
+$(DISTDIR):
+ $(INSTALL_DIR) $(DISTDIR)
+
+dist: $(DISTDIR)
+ $(INSTALL_FILE) Makefile $(DISTDIR)
+ $(INSTALL_FILE) README.txt $(DISTDIR)
+ $(INSTALL_FILE) LICENSE.txt $(DISTDIR)
+ $(INSTALL_FILE) $(LIBRARY_NAME)-meta.pd $(DISTDIR)
+ test -z "$(strip $(ALLSOURCES))" || \
+ $(INSTALL_FILE) $(ALLSOURCES) $(DISTDIR)
+ test -z "$(strip $(ALLSOURCES))" || \
+ $(INSTALL_FILE) $(ALLSOURCES:.c=-help.pd) $(DISTDIR)
+ test -z "$(strip $(PDOBJECTS))" || \
+ $(INSTALL_FILE) $(PDOBJECTS) $(DISTDIR)
+ test -z "$(strip $(PDOBJECTS))" || \
+ $(INSTALL_FILE) $(PDOBJECTS:.pd=-help.pd) $(DISTDIR)
+ test -z "$(strip $(EXTRA_DIST))" || \
+ $(INSTALL_FILE) $(EXTRA_DIST) $(DISTDIR)
+ test -z "$(strip $(EXAMPLES))" || \
+ $(INSTALL_DIR) $(DISTDIR)/examples && \
+ for file in $(EXAMPLES); do \
+ $(INSTALL_FILE) examples/$$file $(DISTDIR)/examples; \
+ done
+ test -z "$(strip $(MANUAL))" || \
+ $(INSTALL_DIR) $(DISTDIR)/manual && \
+ for file in $(MANUAL); do \
+ $(INSTALL_FILE) manual/$$file $(DISTDIR)/manual; \
+ done
+ tar --exclude-vcs -czpf $(DISTDIR).tar.gz $(DISTDIR)
+
+
+etags:
+ etags *.h $(SOURCES) ../../pd/src/*.[ch] /usr/include/*.h /usr/include/*/*.h
+
+showsetup:
+ @echo "PD_PATH: $(PD_PATH)"
+ @echo "objectsdir: $(objectsdir)"
+ @echo "LIBRARY_NAME: $(LIBRARY_NAME)"
+ @echo "LIBRARY_VERSION: $(LIBRARY_VERSION)"
+ @echo "SOURCES: $(SOURCES)"
+ @echo "PDOBJECTS: $(PDOBJECTS)"
+ @echo "ALLSOURCES: $(ALLSOURCES)"
+ @echo "UNAME: $(UNAME)"
+ @echo "CPU: $(CPU)"
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..f087ed8
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,31 @@
+TODO for pddp
+ * pddplink:
+ . standardize server's root directory (use $help_directory from pd.tk?)
+
+DONE for pddp
+
+alpha3
+ * .pd back-link tries not to open patches that are already open:
+ if a patch window already exists, it is raised and given focus instead
+ * new option "-gop" (visible in a gop)
+ * bug fix: unclickable in gop, unless visible
+
+alpha2
+ * loading tcl scripts through "package require pddp":
+ . storing them in an immediate subdirectory of the path of pddplink's binary
+ . storing a hand-crafted pkgIndex.tcl there
+ . pddplink's setup appends the path of its binary to tcl's "auto_path"
+ * pddpserver asks for auto-assigning its port first, then starts
+ incrementing from 32768
+ * pddplink's appearance controlled with creation options (an option switch
+ is any symbol starting from '-' followed by a letter)
+ * options currently recognized:
+ . "-box" (standard object box)
+ . "-text" followed by any number of non-option atoms (body text)
+ * nonboxed version (default) has a custom widgetbehavior, which is a thin
+ layer on top of the standard text widgetbehavior (using all rtext routines),
+ so that merging into core Pd, as a new object type, T_LINK, would be easy.
+
+alpha1
+ * prototype versions of the external "pddplink" and two pd-gui extensions
+ "pddpserver.tcl", "pddpclient.tcl"
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..9d53a4c
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+pd-template (0.0-1) unstable; urgency=low
+
+ * Initial release (Closes: #nnnn) <nnnn is the bug number of your ITP>
+
+ -- Hans-Christoph Steiner <hans@eds.org> Thu, 21 Jan 2010 23:27:04 -0500
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..7435c85
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,12 @@
+Source: pd-template
+Section: sound
+Priority: optional
+Maintainer: Paul Brossier <piem@debian.org>
+Build-Depends: debhelper (>= 7.0.50~), puredata (>= 0.42.5-3.1~)
+Standards-Version: 3.8.3
+Homepage: http://puredata.info
+
+Package: pd-template
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, pd
+Description:
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..21debdf
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,14 @@
+Debianized-By: Hans-Christoph Steiner <hans@eds.org>
+Debianized-Date: Sat, 3 Apr 2010 17:14:25 -0400
+Files: *
+Copyright: 2001-2003, Free Software Foundation
+
+License: GPL-2+
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ version 2 can be found in file "/usr/share/common-licenses/GPL-2".
+
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..0c273a4
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,16 @@
+#!/usr/bin/make -f
+
+LIBRARY_NAME = template
+PACKAGE = pd-$(LIBRARY_NAME)
+pkglibdir = /usr/lib/pd/extra
+
+%:
+ dh $@
+
+override_dh_auto_install:
+ make DESTDIR=$(CURDIR)/debian/$(PACKAGE) pkglibdir=$(pkglibdir) install
+
+override_dh_shlibdeps:
+ dpkg-shlibdeps $(CURDIR)/debian/$(PACKAGE)$(pkglibdir)/$(LIBRARY_NAME)/*.pd_linux \
+ -T$(CURDIR)/debian/$(PACKAGE).substvars
+
diff --git a/examples/pddp.css b/examples/pddp.css
new file mode 100644
index 0000000..40042d1
--- /dev/null
+++ b/examples/pddp.css
@@ -0,0 +1,18 @@
+body {
+ color: brown ;
+ background: gray url(test.bg.jpg) ;
+ margin-top: 10 ;
+ font-family: Helvetica, sans-serif ;
+ font-size: larger ;
+}
+
+pre.programlisting {
+ display: table ;
+ background-color: #EEEEEE ;
+ padding: 2pt ;
+ border-style: solid ;
+ border-width: 1pt ;
+ border-color: #000000 ;
+ border-spacing: 3pt ;
+ margin: 3pt ;
+}
diff --git a/examples/pddplink-test-01.html b/examples/pddplink-test-01.html
new file mode 100644
index 0000000..b73ea54
--- /dev/null
+++ b/examples/pddplink-test-01.html
@@ -0,0 +1,5 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>first simple test</title><link rel="stylesheet" href="pddp.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.66.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2447708"></a>first simple test</h2></div></div><hr></div><p>test patch is here: <a href="pddplink-test-01.pd" target="_top">pddplink-test-01.pd</a></p><p>The above link works if you opened this page from Pd,
+ for example, by clicking on an object
+ </p><pre class="programlisting"><span><b class="command">pddplink</b></span> pddplink-test-01.html</pre><p>
+ </p><p>Pd links should also work in all pages opened through any other,
+ initiating, Pd-opened page.</p><p>Another simple test page is here: <a href="pddplink-test-02.html" target="_top">pddplink-test-02.html</a></p></div></body></html>
diff --git a/examples/pddplink-test-01.pd b/examples/pddplink-test-01.pd
new file mode 100644
index 0000000..e7ca4b0
--- /dev/null
+++ b/examples/pddplink-test-01.pd
@@ -0,0 +1,17 @@
+#N canvas 421 92 475 404 12;
+#X text 20 10 first entry;
+#X text 50 50 three ways of linking to a;
+#X obj 270 50 pddplink pddplink-test-01.html -text local html page
+;
+#X obj 50 75 pddplink pddplink-test-01.html;
+#X obj 50 110 pddplink pddplink-test-01.html -box;
+#X text 50 170 three ways of linking to a;
+#X obj 270 170 pddplink http://puredata.info -text remote html page
+;
+#X obj 50 195 pddplink http://puredata.info;
+#X obj 50 230 pddplink http://puredata.info -box;
+#X text 50 290 three ways of linking to;
+#X obj 260 290 pddplink pddplink-test-02.pd -text another local patch
+;
+#X obj 50 315 pddplink pddplink-test-02.pd;
+#X obj 50 350 pddplink pddplink-test-02.pd -box;
diff --git a/examples/pddplink-test-01.xml b/examples/pddplink-test-01.xml
new file mode 100644
index 0000000..0282ea6
--- /dev/null
+++ b/examples/pddplink-test-01.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+
+<sect1>
+ <title>first simple test</title>
+
+ <para>test patch is here: <ulink url="pddplink-test-01.pd"/></para>
+
+ <para>The above link works if you opened this page from Pd,
+ for example, by clicking on an object
+ <programlisting><command>pddplink</command> pddplink-test-01.html</programlisting>
+ </para>
+
+ <para>Pd links should also work in all pages opened through any other,
+ initiating, Pd-opened page.</para>
+
+ <para>Another simple test page is here: <ulink url="pddplink-test-02.html"/></para>
+</sect1>
diff --git a/examples/pddplink-test-02.html b/examples/pddplink-test-02.html
new file mode 100644
index 0000000..aed49db
--- /dev/null
+++ b/examples/pddplink-test-02.html
@@ -0,0 +1,5 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>second simple test</title><link rel="stylesheet" href="pddp.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.66.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2447708"></a>second simple test</h2></div></div><hr></div><p>test patch is here: <a href="pddplink-test-02.pd" target="_top">pddplink-test-02.pd</a></p><p>The above link works if you opened this page from Pd,
+ for example, by clicking on an object
+ </p><pre class="programlisting"><span><b class="command">pddplink</b></span> pddplink-test-02.html</pre><p>
+ </p><p>Pd links should also work in all pages opened through any other,
+ initiating, Pd-opened page.</p><p>Another simple test page is here: <a href="pddplink-test-01.html" target="_top">pddplink-test-01.html</a></p></div></body></html>
diff --git a/examples/pddplink-test-02.pd b/examples/pddplink-test-02.pd
new file mode 100644
index 0000000..839c0b6
--- /dev/null
+++ b/examples/pddplink-test-02.pd
@@ -0,0 +1,17 @@
+#N canvas 321 192 475 404 12;
+#X text 20 10 first entry;
+#X text 50 50 three ways of linking to a;
+#X obj 270 50 pddplink pddplink-test-02.html -text local html page
+;
+#X obj 50 75 pddplink pddplink-test-02.html;
+#X obj 50 110 pddplink pddplink-test-02.html -box;
+#X text 50 170 three ways of linking to a;
+#X obj 270 170 pddplink http://puredata.info -text remote html page
+;
+#X obj 50 195 pddplink http://puredata.info;
+#X obj 50 230 pddplink http://puredata.info -box;
+#X text 50 290 three ways of linking to;
+#X obj 260 290 pddplink pddplink-test-01.pd -text another local patch
+;
+#X obj 50 315 pddplink pddplink-test-01.pd;
+#X obj 50 350 pddplink pddplink-test-01.pd -box;
diff --git a/examples/pddplink-test-02.xml b/examples/pddplink-test-02.xml
new file mode 100644
index 0000000..349f95e
--- /dev/null
+++ b/examples/pddplink-test-02.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+
+<sect1>
+ <title>second simple test</title>
+
+ <para>test patch is here: <ulink url="pddplink-test-02.pd"/></para>
+
+ <para>The above link works if you opened this page from Pd,
+ for example, by clicking on an object
+ <programlisting><command>pddplink</command> pddplink-test-02.html</programlisting>
+ </para>
+
+ <para>Pd links should also work in all pages opened through any other,
+ initiating, Pd-opened page.</para>
+
+ <para>Another simple test page is here: <ulink url="pddplink-test-01.html"/></para>
+</sect1>
diff --git a/examples/test.bg.jpg b/examples/test.bg.jpg
new file mode 100644
index 0000000..8224bbc
--- /dev/null
+++ b/examples/test.bg.jpg
Binary files differ
diff --git a/examples/toonepage b/examples/toonepage
new file mode 100755
index 0000000..f59273a
--- /dev/null
+++ b/examples/toonepage
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+usage () {
+ cat << EOF
+usage: toonepage <pddpsource>.xml
+EOF
+}
+
+[ "$#" == 0 ] && { usage; exit 1; }
+
+SOURCE_NAME="$(basename $1)"
+SOURCE_STUB="$(basename $SOURCE_NAME .xml)"
+
+[ $SOURCE_STUB == $SOURCE_NAME ] && { usage; exit 1; }
+
+xmllint >/dev/null --xinclude --postvalid $1
+xsltproc --nonet --xinclude \
+ --stringparam html.stylesheet pddp.css \
+ -o "$SOURCE_STUB.html" \
+ /usr/share/xml/docbook/stylesheet/nwalsh/html/docbook.xsl \
+ $1
diff --git a/examples/topdf b/examples/topdf
new file mode 100755
index 0000000..adf4b43
--- /dev/null
+++ b/examples/topdf
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+usage () {
+ cat << EOF
+usage: topdf <pddpsource>.xml
+EOF
+}
+
+[ "$#" == 0 ] && { usage; exit 1; }
+
+SOURCE_NAME="$(basename $1)"
+SOURCE_STUB="$(basename $SOURCE_NAME .xml)"
+
+[ $SOURCE_STUB == $SOURCE_NAME ] && { usage; exit 1; }
+
+xmllint >/dev/null --xinclude --postvalid $1
+xsltproc --nonet --xinclude \
+ -o "$SOURCE_STUB.fo" \
+ /usr/share/xml/docbook/stylesheet/nwalsh/fo/docbook.xsl \
+ $1
+
+# FIXME need to run this twice, it should be check-wrapped too
+pdfxmltex "$SOURCE_STUB.fo"
diff --git a/pddplink.c b/pddplink.c
new file mode 100644
index 0000000..4b8465c
--- /dev/null
+++ b/pddplink.c
@@ -0,0 +1,411 @@
+/* Copyright (c) 2005 krzYszcz and others.
+ * For information on usage and redistribution, and for a DISCLAIMER OF ALL
+ * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
+
+/* This is a prototype of an active comment. It might be replaced with
+ a new core object type, T_LINK (te_type bitfield would have to be
+ extended then). */
+
+#include <stdio.h>
+#include <string.h>
+#include "m_pd.h"
+#include "m_imp.h" /* FIXME need access to c_externdir... */
+#include "g_canvas.h"
+#include "common/loud.h"
+#include "build_counter"
+
+#ifdef KRZYSZCZ
+//#define PDDPLINK_DEBUG
+#endif
+
+enum { PDDPLINK_PD, PDDPLINK_HTML }; /* LATER add others */
+
+typedef struct _pddplink
+{
+ t_object x_ob;
+ t_glist *x_glist;
+ int x_isboxed;
+ int x_isgopvisible;
+ char *x_vistext;
+ int x_vissize;
+ int x_vislength;
+ int x_rtextactive;
+ t_symbol *x_dirsym;
+ t_symbol *x_ulink;
+ t_atom x_openargs[2];
+ int x_linktype;
+ int x_ishit;
+} t_pddplink;
+
+static t_class *pddplink_class;
+static t_class *pddplinkbox_class;
+
+/* Code that might be merged back to g_text.c starts here: */
+
+static void pddplink_getrect(t_gobj *z, t_glist *glist,
+ int *xp1, int *yp1, int *xp2, int *yp2)
+{
+ t_pddplink *x = (t_pddplink *)z;
+ int width, height;
+ float x1, y1, x2, y2;
+ if (glist->gl_editor && glist->gl_editor->e_rtext)
+ {
+ if (x->x_rtextactive)
+ {
+ t_rtext *y = glist_findrtext(glist, (t_text *)x);
+ width = rtext_width(y);
+ height = rtext_height(y) - 2;
+ }
+ else
+ {
+ int font = glist_getfont(glist);
+ width = x->x_vislength * sys_fontwidth(font) + 2;
+ height = sys_fontheight(font) + 2;
+ }
+ }
+ else width = height = 10;
+ x1 = text_xpix((t_text *)x, glist);
+ y1 = text_ypix((t_text *)x, glist);
+ x2 = x1 + width;
+ y2 = y1 + height;
+ y1 += 1;
+ *xp1 = x1;
+ *yp1 = y1;
+ *xp2 = x2;
+ *yp2 = y2;
+}
+
+static void pddplink_displace(t_gobj *z, t_glist *glist, int dx, int dy)
+{
+ t_text *t = (t_text *)z;
+ t->te_xpix += dx;
+ t->te_ypix += dy;
+ if (glist_isvisible(glist))
+ {
+ t_rtext *y = glist_findrtext(glist, t);
+ rtext_displace(y, dx, dy);
+ }
+}
+
+static void pddplink_select(t_gobj *z, t_glist *glist, int state)
+{
+ t_pddplink *x = (t_pddplink *)z;
+ t_rtext *y = glist_findrtext(glist, (t_text *)x);
+ rtext_select(y, state);
+ if (glist_isvisible(glist) && glist->gl_havewindow)
+ {
+ if (state)
+ sys_vgui(".x%lx.c itemconfigure %s -fill blue\n",
+ glist, rtext_gettag(y));
+ else
+ sys_vgui(".x%lx.c itemconfigure %s -text {%s} -fill #0000dd -activefill #e70000\n",
+ glist, rtext_gettag(y), x->x_vistext);
+ }
+}
+
+static void pddplink_activate(t_gobj *z, t_glist *glist, int state)
+{
+ t_pddplink *x = (t_pddplink *)z;
+ t_rtext *y = glist_findrtext(glist, (t_text *)x);
+ rtext_activate(y, state);
+ x->x_rtextactive = state;
+}
+
+static void pddplink_vis(t_gobj *z, t_glist *glist, int vis)
+{
+ t_pddplink *x = (t_pddplink *)z;
+ t_rtext *y;
+ if (vis)
+ {
+ if ((glist->gl_havewindow || x->x_isgopvisible)
+ && (y = glist_findrtext(glist, (t_text *)x)))
+ {
+ rtext_draw(y);
+ sys_vgui(".x%lx.c itemconfigure %s -text {%s} -fill #0000dd -activefill #e70000\n",
+ glist_getcanvas(glist), rtext_gettag(y), x->x_vistext);
+ }
+ }
+ else
+ {
+ if ((glist->gl_havewindow || x->x_isgopvisible)
+ && (y = glist_findrtext(glist, (t_text *)x)))
+ rtext_erase(y);
+ }
+}
+
+static int pddplink_wbclick(t_gobj *z, t_glist *glist, int xpix, int ypix,
+ int shift, int alt, int dbl, int doit);
+
+static t_widgetbehavior pddplink_widgetbehavior =
+{
+ pddplink_getrect,
+ pddplink_displace,
+ pddplink_select,
+ pddplink_activate,
+ 0,
+ pddplink_vis,
+ pddplink_wbclick,
+};
+
+/* Code that might be merged back to g_text.c ends here. */
+
+/* FIXME need access to glob_pdobject... */
+static t_pd *pddplink_pdtarget(t_pddplink *x)
+{
+ t_pd *pdtarget = gensym("pd")->s_thing;
+ if (pdtarget && !strcmp(class_getname(*pdtarget), "pd"))
+ return (pdtarget);
+ else
+ return ((t_pd *)x); /* internal error */
+}
+
+static void pddplink_anything(t_pddplink *x, t_symbol *s, int ac, t_atom *av)
+{
+ if (x->x_ishit)
+ {
+ startpost("pddplink: internal error (%s", (s ? s->s_name : ""));
+ postatom(ac, av);
+ post(")");
+ }
+}
+
+static void pddplink_click(t_pddplink *x, t_floatarg xpos, t_floatarg ypos,
+ t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
+{
+ x->x_ishit = 1;
+ switch (x->x_linktype)
+ {
+ case PDDPLINK_PD:
+ typedmess(pddplink_pdtarget(x), gensym("open"), 2, x->x_openargs);
+ break;
+ case PDDPLINK_HTML:
+ sys_vgui("after 0 {::pddp::cliOpen {%s}}\n", x->x_ulink->s_name);
+ break;
+ }
+ x->x_ishit = 0;
+}
+
+static int pddplink_wbclick(t_gobj *z, t_glist *glist, int xpix, int ypix,
+ int shift, int alt, int dbl, int doit)
+{
+ t_pddplink *x = (t_pddplink *)z;
+ if (glist->gl_havewindow || x->x_isgopvisible)
+ {
+ if (doit)
+ pddplink_click(x, (t_floatarg)xpix, (t_floatarg)ypix,
+ (t_floatarg)shift, 0, (t_floatarg)alt);
+ return (1);
+ }
+ else return (0);
+}
+
+static int pddplink_isoption(char *name)
+{
+ if (*name == '-')
+ {
+ char c = name[1];
+ return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
+ }
+ else return (0);
+}
+
+static t_symbol *pddplink_nextsymbol(int ac, t_atom *av, int opt, int *skipp)
+{
+ int ndx;
+ for (ndx = 0; ndx < ac; ndx++, av++)
+ {
+ if (av->a_type == A_SYMBOL &&
+ (!opt || pddplink_isoption(av->a_w.w_symbol->s_name)))
+ {
+ *skipp = ++ndx;
+ return (av->a_w.w_symbol);
+ }
+ }
+ return (0);
+}
+
+static int pddplink_dooptext(char *dst, int maxsize, int ac, t_atom *av)
+{
+ int i, sz, sep, len;
+ char buf[32], *src;
+ for (i = 0, sz = 0, sep = 0; i < ac; i++, av++)
+ {
+ if (sep)
+ {
+ sz++;
+ if (sz >= maxsize)
+ break;
+ else if (dst)
+ {
+ *dst++ = ' ';
+ *dst = 0;
+ }
+ }
+ else sep = 1;
+ if (av->a_type == A_SYMBOL)
+ src = av->a_w.w_symbol->s_name;
+ else if (av->a_type == A_FLOAT)
+ {
+ src = buf;
+ sprintf(src, "%g", av->a_w.w_float);
+ }
+ else
+ {
+ sep = 0;
+ continue;
+ }
+ len = strlen(src);
+ sz += len;
+ if (sz >= maxsize)
+ break;
+ else if (dst)
+ {
+ strcpy(dst, src);
+ dst += len;
+ }
+ }
+ return (sz);
+}
+
+static char *pddplink_optext(int *sizep, int ac, t_atom *av)
+{
+ char *result;
+ int sz = pddplink_dooptext(0, MAXPDSTRING, ac, av);
+ *sizep = sz + (sz >= MAXPDSTRING ? 4 : 1);
+ result = getbytes(*sizep);
+ pddplink_dooptext(result, sz + 1, ac, av);
+ if (sz >= MAXPDSTRING)
+ {
+ sz = strlen(result);
+ strcpy(result + sz, "...");
+ }
+ return (result);
+}
+
+#ifdef PDDPLINK_DEBUG
+static void pddplink_debug(t_pddplink *x)
+{
+}
+#endif
+
+static void pddplink_free(t_pddplink *x)
+{
+ if (x->x_vistext)
+ freebytes(x->x_vistext, x->x_vissize);
+}
+
+static void *pddplink_new(t_symbol *s, int ac, t_atom *av)
+{
+ t_pddplink xgen, *x;
+ int skip;
+ xgen.x_isboxed = 0;
+ xgen.x_isgopvisible = 0;
+ xgen.x_vistext = 0;
+ xgen.x_vissize = 0;
+ if (xgen.x_ulink = pddplink_nextsymbol(ac, av, 0, &skip))
+ {
+ t_symbol *opt;
+ ac -= skip;
+ av += skip;
+ while (opt = pddplink_nextsymbol(ac, av, 1, &skip))
+ {
+ ac -= skip;
+ av += skip;
+ if (opt == gensym("-box"))
+ xgen.x_isboxed = 1;
+ else if (opt == gensym("-gop"))
+ xgen.x_isgopvisible = 1;
+ else if (opt == gensym("-text"))
+ {
+ t_symbol *nextsym = pddplink_nextsymbol(ac, av, 1, &skip);
+ int natoms = (nextsym ? skip - 1 : ac);
+ if (natoms)
+ xgen.x_vistext =
+ pddplink_optext(&xgen.x_vissize, natoms, av);
+ }
+ }
+ }
+ x = (t_pddplink *)
+ pd_new(xgen.x_isboxed ? pddplinkbox_class : pddplink_class);
+ x->x_glist = canvas_getcurrent();
+ x->x_dirsym = canvas_getdir(x->x_glist); /* FIXME */
+
+ x->x_isboxed = xgen.x_isboxed;
+ x->x_isgopvisible = xgen.x_isgopvisible;
+ x->x_vistext = xgen.x_vistext;
+ x->x_vissize = xgen.x_vissize;
+ x->x_vislength = (x->x_vistext ? strlen(x->x_vistext) : 0);
+ x->x_rtextactive = 0;
+ if (xgen.x_ulink)
+ {
+ int len = strlen(xgen.x_ulink->s_name);
+ if (len > 3 && !strcmp(xgen.x_ulink->s_name + len - 3, ".pd"))
+ x->x_linktype = PDDPLINK_PD;
+ else
+ x->x_linktype = PDDPLINK_HTML;
+ x->x_ulink = xgen.x_ulink;
+ }
+ else
+ {
+ x->x_linktype = PDDPLINK_HTML;
+ x->x_ulink = gensym("index.html");
+ }
+ SETSYMBOL(&x->x_openargs[0], x->x_ulink);
+ SETSYMBOL(&x->x_openargs[1], x->x_dirsym);
+ x->x_ishit = 0;
+ if (x->x_isboxed)
+ outlet_new((t_object *)x, &s_anything);
+ else
+ {
+ /* do we need to set ((t_text *)x)->te_type = T_TEXT; ? */
+ if (!x->x_vistext)
+ {
+ x->x_vislength = strlen(x->x_ulink->s_name);
+ x->x_vissize = x->x_vislength + 1;
+ x->x_vistext = getbytes(x->x_vissize);
+ strcpy(x->x_vistext, x->x_ulink->s_name);
+ }
+ }
+ /* disable server until it works better, it takes forever to load
+ if (x->x_linktype == PDDPLINK_HTML)
+ sys_vgui("after 0 {::pddp::srvUse {%s}}\n", x->x_dirsym->s_name);
+ */
+ return (x);
+}
+
+void pddplink_setup(void)
+{
+ t_symbol *dirsym;
+ post("this is pddplink %s, %s %s build...",
+ PDDP_VERSION, loud_ordinal(PDDP_BUILD), PDDP_RELEASE);
+
+ pddplink_class = class_new(gensym("pddplink"),
+ (t_newmethod)pddplink_new,
+ (t_method)pddplink_free,
+ sizeof(t_pddplink),
+ CLASS_NOINLET | CLASS_PATCHABLE,
+ A_GIMME, 0);
+ class_addanything(pddplink_class, pddplink_anything);
+ class_setwidget(pddplink_class, &pddplink_widgetbehavior);
+
+ pddplinkbox_class = class_new(gensym("pddplink"), 0,
+ (t_method)pddplink_free,
+ sizeof(t_pddplink), 0, A_GIMME, 0);
+ class_addanything(pddplinkbox_class, pddplink_anything);
+ class_addmethod(pddplinkbox_class, (t_method)pddplink_click,
+ gensym("click"),
+ A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
+
+#ifdef PDDPLINK_DEBUG
+ class_addmethod(pddplink_class, (t_method)pddplink_debug,
+ gensym("debug"), 0);
+ class_addmethod(pddplinkbox_class, (t_method)pddplink_debug,
+ gensym("debug"), 0);
+#endif
+
+ dirsym = pddplink_class->c_externdir; /* FIXME */
+ sys_vgui(
+ "if {[lsearch $auto_path \"%s\"] < 0} {lappend auto_path \"%s\"}\n",
+ dirsym->s_name, dirsym->s_name);
+ sys_gui("after 0 {package require pddp}\n");
+}