From 045d0de0ee46f43a0c6575be2b457c4bff6bb8a8 Mon Sep 17 00:00:00 2001 From: gerber Date: Tue, 17 Jun 2003 17:10:52 +0000 Subject: [PATCH] Initial revision --- ABOUT-NLS | 324 +++ AUTHORS | 0 COPYING | 340 +++ ChangeLog | 28 + INSTALL | 182 ++ Makefile.am | 28 + Makefile.in | 451 ++++ NEWS | 0 README | 95 + acconfig.h | 9 + aclocal.m4 | 1428 +++++++++++++ autogen.sh | 15 + config.guess | 1321 ++++++++++++ config.h.in | 188 ++ config.sub | 1443 +++++++++++++ configure | 4760 +++++++++++++++++++++++++++++++++++++++++ configure.in | 93 + doc/C/Makefile.am | 112 + doc/C/Makefile.in | 417 ++++ doc/C/batch-gpiv.html | 65 + doc/C/errvec.html | 125 ++ doc/C/figures/Makefile.am | 16 + doc/C/figures/Makefile.in | 251 +++ doc/C/figures/gpiv-5.png | Bin 0 -> 609 bytes doc/C/figures/gpiv-fig1.png | Bin 0 -> 219082 bytes doc/C/figures/gpiv-fig2.png | Bin 0 -> 18388 bytes doc/C/figures/gpiv-fig3.png | Bin 0 -> 22431 bytes doc/C/figures/gpiv-fig4.png | Bin 0 -> 20609 bytes doc/C/figures/gpiv-fig5.png | Bin 0 -> 21876 bytes doc/C/figures/gpiv.xpm | 55 + doc/C/figures/piv.png | Bin 0 -> 725 bytes doc/C/flip.html | 105 + doc/C/gpiv.html | 342 +++ doc/C/hilo.html | 111 + doc/C/index.html | 65 + doc/C/intro.html | 83 + doc/C/manipiv.html | 120 ++ doc/C/peaklck.html | 93 + doc/C/piv2vec.html | 72 + doc/C/piv_intro.html | 165 ++ doc/C/rr.html | 244 +++ doc/C/s-avg.html | 97 + doc/C/scale.html | 108 + doc/C/t-avg.html | 104 + doc/C/topic.dat | 16 + doc/C/vorstra.html | 119 ++ doc/Makefile.am | 1 + doc/Makefile.in | 323 +++ gpiv_logo.png | Bin 0 -> 609 bytes install-sh | 251 +++ intl/ChangeLog | 4 + intl/Makefile.in | 313 +++ intl/VERSION | 1 + intl/bindtextdom.c | 369 ++++ intl/config.charset | 438 ++++ intl/dcgettext.c | 58 + intl/dcigettext.c | 1259 +++++++++++ intl/dcngettext.c | 60 + intl/dgettext.c | 59 + intl/dngettext.c | 61 + intl/explodename.c | 192 ++ intl/finddomain.c | 198 ++ intl/gettext.c | 64 + intl/gettext.h | 102 + intl/gettextP.h | 252 +++ intl/hash-string.h | 59 + intl/intl-compat.c | 166 ++ intl/l10nflist.c | 405 ++++ intl/libgettext.h | 49 + intl/libgnuintl.h | 128 ++ intl/loadinfo.h | 109 + intl/loadmsgcat.c | 567 +++++ intl/localcharset.c | 271 +++ intl/locale.alias | 78 + intl/localealias.c | 404 ++++ intl/ngettext.c | 68 + intl/plural.c | 1326 ++++++++++++ intl/plural.y | 413 ++++ intl/ref-add.sin | 31 + intl/ref-del.sin | 26 + intl/textdomain.c | 142 ++ macros/Makefile.am | 41 + macros/Makefile.in | 256 +++ macros/aclocal-include.m4 | 16 + macros/autogen.sh | 169 ++ macros/compiler-flags.m4 | 109 + macros/curses.m4 | 318 +++ macros/gnome-bonobo-check.m4 | 150 ++ macros/gnome-common.m4 | 14 + macros/gnome-fileutils.m4 | 414 ++++ macros/gnome-ghttp-check.m4 | 14 + macros/gnome-gnorba-check.m4 | 35 + macros/gnome-guile-checks.m4 | 119 ++ macros/gnome-libgtop-check.m4 | 217 ++ macros/gnome-objc-checks.m4 | 83 + macros/gnome-orbit-check.m4 | 33 + macros/gnome-print-check.m4 | 171 ++ macros/gnome-pthread-check.m4 | 16 + macros/gnome-support.m4 | 68 + macros/gnome-undelfs.m4 | 20 + macros/gnome-vfs.m4 | 120 ++ macros/gnome-x-checks.m4 | 80 + macros/gnome-xml-check.m4 | 30 + macros/gnome.m4 | 128 ++ macros/gperf-check.m4 | 79 + macros/linger.m4 | 28 + macros/need-declaration.m4 | 42 + missing | 190 ++ mkinstalldirs | 40 + po/ChangeLog | 924 ++++++++ po/Makefile.in.in | 196 ++ po/POTFILES.in | 20 + po/ca.gmo | Bin 0 -> 16918 bytes po/ca.po | 1640 ++++++++++++++ po/de.gmo | Bin 0 -> 12185 bytes po/de.po | 1607 ++++++++++++++ po/gpiv.pot | 1458 +++++++++++++ po/nl.gmo | Bin 0 -> 18864 bytes po/nl.po | 1656 ++++++++++++++ src/Makefile.am | 33 + src/Makefile.in | 336 +++ src/console.c | 1787 ++++++++++++++++ src/console.h | 286 +++ src/console_interface.c | 1840 ++++++++++++++++ src/console_interface.h | 174 ++ src/console_menus.h | 372 ++++ src/display.c | 2699 +++++++++++++++++++++++ src/display.h | 297 +++ src/display_interface.c | 870 ++++++++ src/display_interface.h | 200 ++ src/display_menus.h | 124 ++ src/gpiv_gtk.h | 261 +++ src/imgh.c | 111 + src/imgh.h | 55 + src/imgh_interface.c | 835 ++++++++ src/imgh_interface.h | 97 + src/main.c | 614 ++++++ src/piveval.c | 1755 +++++++++++++++ src/piveval.h | 162 ++ src/piveval_interface.c | 2668 +++++++++++++++++++++++ src/piveval_interface.h | 163 ++ src/pivpost.c | 699 ++++++ src/pivpost.h | 120 ++ src/pivpost_interface.c | 1218 +++++++++++ src/pivpost_interface.h | 99 + src/pivvalid.c | 666 ++++++ src/pivvalid.h | 152 ++ src/pivvalid_interface.c | 1187 ++++++++++ src/pivvalid_interface.h | 107 + src/preferences.c | 2437 +++++++++++++++++++++ src/preferences.h | 146 ++ src/support.c | 174 ++ src/support.h | 63 + src/utils.c | 527 +++++ src/utils.h | 96 + stamp-h.in | 1 + 156 files changed, 55769 insertions(+) create mode 100644 ABOUT-NLS create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 README create mode 100644 acconfig.h create mode 100644 aclocal.m4 create mode 100755 autogen.sh create mode 100755 config.guess create mode 100644 config.h.in create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 doc/C/Makefile.am create mode 100644 doc/C/Makefile.in create mode 100644 doc/C/batch-gpiv.html create mode 100644 doc/C/errvec.html create mode 100644 doc/C/figures/Makefile.am create mode 100644 doc/C/figures/Makefile.in create mode 100644 doc/C/figures/gpiv-5.png create mode 100644 doc/C/figures/gpiv-fig1.png create mode 100644 doc/C/figures/gpiv-fig2.png create mode 100644 doc/C/figures/gpiv-fig3.png create mode 100644 doc/C/figures/gpiv-fig4.png create mode 100644 doc/C/figures/gpiv-fig5.png create mode 100644 doc/C/figures/gpiv.xpm create mode 100644 doc/C/figures/piv.png create mode 100644 doc/C/flip.html create mode 100644 doc/C/gpiv.html create mode 100644 doc/C/hilo.html create mode 100644 doc/C/index.html create mode 100644 doc/C/intro.html create mode 100644 doc/C/manipiv.html create mode 100644 doc/C/peaklck.html create mode 100644 doc/C/piv2vec.html create mode 100644 doc/C/piv_intro.html create mode 100644 doc/C/rr.html create mode 100644 doc/C/s-avg.html create mode 100644 doc/C/scale.html create mode 100644 doc/C/t-avg.html create mode 100644 doc/C/topic.dat create mode 100644 doc/C/vorstra.html create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in create mode 100644 gpiv_logo.png create mode 100644 install-sh create mode 100644 intl/ChangeLog create mode 100644 intl/Makefile.in create mode 100644 intl/VERSION create mode 100644 intl/bindtextdom.c create mode 100755 intl/config.charset create mode 100644 intl/dcgettext.c create mode 100644 intl/dcigettext.c create mode 100644 intl/dcngettext.c create mode 100644 intl/dgettext.c create mode 100644 intl/dngettext.c create mode 100644 intl/explodename.c create mode 100644 intl/finddomain.c create mode 100644 intl/gettext.c create mode 100644 intl/gettext.h create mode 100644 intl/gettextP.h create mode 100644 intl/hash-string.h create mode 100644 intl/intl-compat.c create mode 100644 intl/l10nflist.c create mode 100644 intl/libgettext.h create mode 100644 intl/libgnuintl.h create mode 100644 intl/loadinfo.h create mode 100644 intl/loadmsgcat.c create mode 100644 intl/localcharset.c create mode 100644 intl/locale.alias create mode 100644 intl/localealias.c create mode 100644 intl/ngettext.c create mode 100644 intl/plural.c create mode 100644 intl/plural.y create mode 100644 intl/ref-add.sin create mode 100644 intl/ref-del.sin create mode 100644 intl/textdomain.c create mode 100644 macros/Makefile.am create mode 100644 macros/Makefile.in create mode 100644 macros/aclocal-include.m4 create mode 100644 macros/autogen.sh create mode 100644 macros/compiler-flags.m4 create mode 100644 macros/curses.m4 create mode 100644 macros/gnome-bonobo-check.m4 create mode 100644 macros/gnome-common.m4 create mode 100644 macros/gnome-fileutils.m4 create mode 100644 macros/gnome-ghttp-check.m4 create mode 100644 macros/gnome-gnorba-check.m4 create mode 100644 macros/gnome-guile-checks.m4 create mode 100644 macros/gnome-libgtop-check.m4 create mode 100644 macros/gnome-objc-checks.m4 create mode 100644 macros/gnome-orbit-check.m4 create mode 100644 macros/gnome-print-check.m4 create mode 100644 macros/gnome-pthread-check.m4 create mode 100644 macros/gnome-support.m4 create mode 100644 macros/gnome-undelfs.m4 create mode 100644 macros/gnome-vfs.m4 create mode 100644 macros/gnome-x-checks.m4 create mode 100644 macros/gnome-xml-check.m4 create mode 100644 macros/gnome.m4 create mode 100644 macros/gperf-check.m4 create mode 100644 macros/linger.m4 create mode 100644 macros/need-declaration.m4 create mode 100644 missing create mode 100644 mkinstalldirs create mode 100644 po/ChangeLog create mode 100644 po/Makefile.in.in create mode 100644 po/POTFILES.in create mode 100644 po/ca.gmo create mode 100644 po/ca.po create mode 100644 po/de.gmo create mode 100644 po/de.po create mode 100644 po/gpiv.pot create mode 100644 po/nl.gmo create mode 100644 po/nl.po create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/console.c create mode 100644 src/console.h create mode 100644 src/console_interface.c create mode 100644 src/console_interface.h create mode 100644 src/console_menus.h create mode 100644 src/display.c create mode 100644 src/display.h create mode 100644 src/display_interface.c create mode 100644 src/display_interface.h create mode 100644 src/display_menus.h create mode 100644 src/gpiv_gtk.h create mode 100644 src/imgh.c create mode 100644 src/imgh.h create mode 100644 src/imgh_interface.c create mode 100644 src/imgh_interface.h create mode 100644 src/main.c create mode 100644 src/piveval.c create mode 100644 src/piveval.h create mode 100644 src/piveval_interface.c create mode 100644 src/piveval_interface.h create mode 100644 src/pivpost.c create mode 100644 src/pivpost.h create mode 100644 src/pivpost_interface.c create mode 100644 src/pivpost_interface.h create mode 100644 src/pivvalid.c create mode 100644 src/pivvalid.h create mode 100644 src/pivvalid_interface.c create mode 100644 src/pivvalid_interface.h create mode 100644 src/preferences.c create mode 100644 src/preferences.h create mode 100644 src/support.c create mode 100644 src/support.h create mode 100644 src/utils.c create mode 100644 src/utils.h create mode 100644 stamp-h.in diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..5fde45a --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,324 @@ +Notes on the Free Translation Project +************************************* + + Free software is going international! The Free Translation Project +is a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +Quick configuration advice +========================== + + If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + + Some packages are "localizable" when properly installed; the +programs they contain can be made to speak your own native language. +Most such packages use GNU `gettext'. Other packages have their own +ways to internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is _not_ required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will respectively bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + + As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +Translating Teams +================= + + For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + + Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of September +2001. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files bg cs da de el en eo es et fi fr gl he hr id it ja + +----------------------------------------------------+ + a2ps | [] [] [] | + bash | [] [] [] [] | + bfd | | + binutils | [] | + bison | [] [] [] [] [] | + clisp | [] [] [] [] | + cpio | [] [] [] [] [] | + diffutils | [] [] [] [] [] [] [] | + enscript | [] [] | + error | [] [] | + fetchmail | | + fileutils | [] [] [] [] [] [] [] [] | + findutils | [] [] [] [] [] [] [] [] | + flex | [] [] [] | + freetype | | + gas | | + gawk | [] [] | + gcal | | + gcc | | + gettext | [] [] [] [] [] [] [] [] [] [] | + gnupg | [] [] [] [] [] [] [] | + gprof | | + grep | [] [] [] [] [] [] [] [] | + hello | [] [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] | + indent | [] [] [] [] [] | + jpilot | [] | + kbd | | + ld | [] | + libc | [] [] [] [] [] [] [] [] | + lilypond | [] | + lynx | [] [] [] [] | + m4 | [] [] [] [] [] [] [] [] | + make | [] [] [] [] [] [] | + mysecretdiary | [] | + nano | [] [] [] | + opcodes | | + parted | [] [] [] | + ptx | [] [] [] [] [] [] [] | + python | | + recode | [] [] [] [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] [] [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] [] [] | + sketch | | + soundtracker | [] [] [] | + sp | | + tar | [] [] [] [] [] [] [] [] | + texinfo | [] [] [] [] [] [] | + textutils | [] [] [] [] [] [] [] [] | + util-linux | [] [] | + wdiff | [] [] [] | + wget | [] [] [] [] [] [] [] [] [] [] | + +----------------------------------------------------+ + bg cs da de el en eo es et fi fr gl he hr id it ja + 0 14 24 32 11 1 8 23 13 1 33 22 4 0 7 9 18 + + ko lv nb nl nn no pl pt pt_BR ru sk sl sv tr uk zh + +----------------------------------------------------+ + a2ps | [] [] [] | 6 + bash | | 4 + bfd | | 0 + binutils | | 1 + bison | [] | 6 + clisp | [] | 5 + cpio | [] [] [] [] [] | 10 + diffutils | [] [] [] [] | 11 + enscript | [] [] [] | 5 + error | [] [] | 4 + fetchmail | | 0 + fileutils | [] [] [] [] [] [] [] [] [] | 17 + findutils | [] [] [] [] [] [] [] [] | 16 + flex | [] [] [] | 6 + freetype | | 0 + gas | | 0 + gawk | [] | 3 + gcal | | 0 + gcc | | 0 + gettext | [] [] [] [] [] [] [] [] | 18 + gnupg | [] [] [] | 10 + gprof | | 0 + grep | [] [] [] [] | 12 + hello | [] [] [] [] [] [] [] [] [] [] [] | 22 + id-utils | [] [] [] | 6 + indent | [] [] [] [] [] [] [] | 12 + jpilot | | 1 + kbd | [] | 1 + ld | | 1 + libc | [] [] [] [] [] [] [] [] | 16 + lilypond | [] [] | 3 + lynx | [] [] [] [] | 8 + m4 | [] [] [] [] | 12 + make | [] [] [] [] [] [] | 12 + mysecretdiary | | 1 + nano | [] | 4 + opcodes | [] | 1 + parted | [] [] | 5 + ptx | [] [] [] [] [] [] [] [] | 15 + python | | 0 + recode | [] [] [] [] | 13 + sed | [] [] [] [] [] [] [] | 19 + sh-utils | [] [] [] [] [] [] [] [] [] [] [] | 21 + sharutils | [] [] [] | 11 + sketch | | 0 + soundtracker | | 3 + sp | | 0 + tar | [] [] [] [] [] [] [] | 15 + texinfo | [] | 7 + textutils | [] [] [] [] [] [] [] [] | 16 + util-linux | [] [] | 4 + wdiff | [] [] [] [] | 7 + wget | [] [] [] [] [] [] [] | 17 + +----------------------------------------------------+ + 33 teams ko lv nb nl nn no pl pt pt_BR ru sk sl sv tr uk zh + 53 domains 9 1 6 20 0 6 17 1 13 25 10 11 23 21 2 2 387 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If September 2001 seems to be old, you may fetch a more recent copy +of this `ABOUT-NLS' file on most GNU archive sites. The most +up-to-date matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +Using `gettext' in new packages +=============================== + + If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +to use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..e69de29 diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + 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. + + GNU GENERAL PUBLIC LICENSE + 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 + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..c8450f3 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,28 @@ +2003-4-1 Gerber Van der Graaf + * src: multi-buffer support; any process includes all highlighted + buffers + * src: update interrogation area radiobuttons in eval tab + * src: stop button for process interruption + * src: "save as" support + +2003-6-3 Gerber Van der Graaf + * src: added utils.h and utils.c + * src: added hdf format support + * src: image dimensions used as parameters; limited by + maximum values as defined by IMAGE_WIDTH/HEIGHT_MAX in gpiv_gtk.h, + optionally defined by configure + +2003-6-4 Gerber Van der Graaf + * src: display image in separate window (temporarly disabled) + +2003-6-4 Gerber Van der Graaf + * src: "save data" dialog before exiting program (if necessary) + +2003-6-10 Gerber Van der Graaf + * src: close individual buffer(s) without exiting program + +2003-6-13 Gerber Van der Graaf + * src: scaling piv data + * src: stabalizing display correlation function + * src: drag and drop of filenames from the gnome filemanager + "nautilus" into the buffer list \ No newline at end of file diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..b42a17a --- /dev/null +++ b/INSTALL @@ -0,0 +1,182 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..09ce8bc --- /dev/null +++ b/Makefile.am @@ -0,0 +1,28 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = intl po macros src doc + +install-data-local: + @$(NORMAL_INSTALL) + if test -d $(srcdir)/pixmaps; then \ + $(mkinstalldirs) $(DESTDIR)@PACKAGE_PIXMAPS_DIR@; \ + for pixmap in $(srcdir)/pixmaps/*; do \ + if test -f $$pixmap; then \ + $(INSTALL_DATA) $$pixmap $(DESTDIR)@PACKAGE_PIXMAPS_DIR@; \ + fi \ + done \ + fi + +dist-hook: + if test -d pixmaps; then \ + mkdir $(distdir)/pixmaps; \ + for pixmap in pixmaps/*; do \ + if test -f $$pixmap; then \ + cp -p $$pixmap $(distdir)/pixmaps; \ + fi \ + done \ + fi + +EXTRA_DIST = gpiv_logo.png +pixmapdir = $(datadir)/pixmaps +pixmap_DATA = gpiv_logo.png diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..a145129 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,451 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +DATADIRNAME = @DATADIRNAME@ +DEBUG = @DEBUG@ +DEMO = @DEMO@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@ +GNOMEUI_LIBS = @GNOMEUI_LIBS@ +GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@ +GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@ +GNOME_CONFIG = @GNOME_CONFIG@ +GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@ +GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@ +GNOME_LIBDIR = @GNOME_LIBDIR@ +GNOME_LIBS = @GNOME_LIBS@ +GNORBA_CFLAGS = @GNORBA_CFLAGS@ +GNORBA_LIBS = @GNORBA_LIBS@ +GTKXMHTML_LIBS = @GTKXMHTML_LIBS@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIBICONV = @LIBICONV@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +ORBIT_CFLAGS = @ORBIT_CFLAGS@ +ORBIT_CONFIG = @ORBIT_CONFIG@ +ORBIT_IDL = @ORBIT_IDL@ +ORBIT_LIBS = @ORBIT_LIBS@ +OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ +OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ +PACKAGE = @PACKAGE@ +PACKAGE_PIXMAPS_DIR = @PACKAGE_PIXMAPS_DIR@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PTHREAD_LIB = @PTHREAD_LIB@ +RANLIB = @RANLIB@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XPM_LIBS = @XPM_LIBS@ +ZVT_LIBS = @ZVT_LIBS@ +cflags_set = @cflags_set@ +cxxflags_set = @cxxflags_set@ + +SUBDIRS = intl po macros src doc + +EXTRA_DIST = gpiv_logo.png +pixmapdir = $(datadir)/pixmaps +pixmap_DATA = gpiv_logo.png +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +DATA = $(pixmap_DATA) + +DIST_COMMON = README ./stamp-h.in ABOUT-NLS AUTHORS COPYING ChangeLog \ +INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 config.guess \ +config.h.in config.sub configure configure.in install-sh missing \ +mkinstalldirs + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +$(ACLOCAL_M4): configure.in + cd $(srcdir) && $(ACLOCAL) + +config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +config.h: stamp-h + @if test ! -f $@; then \ + rm -f stamp-h; \ + $(MAKE) stamp-h; \ + else :; fi +stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=config.h \ + $(SHELL) ./config.status + @echo timestamp > stamp-h 2> /dev/null +$(srcdir)/config.h.in: $(srcdir)/stamp-h.in + @if test ! -f $@; then \ + rm -f $(srcdir)/stamp-h.in; \ + $(MAKE) $(srcdir)/stamp-h.in; \ + else :; fi +$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f config.h + +maintainer-clean-hdr: + +install-pixmapDATA: $(pixmap_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(pixmapdir) + @list='$(pixmap_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pixmapdir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pixmapdir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pixmapdir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(pixmapdir)/$$p; \ + fi; fi; \ + done + +uninstall-pixmapDATA: + @$(NORMAL_UNINSTALL) + list='$(pixmap_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(pixmapdir)/$$p; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + -rm -rf $(distdir) + GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; \ + cd $(distdir)/=build \ + && ../configure --with-included-gettext --srcdir=.. --prefix=$$dc_install_base \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) dist + -rm -rf $(distdir) + @banner="$(distdir).tar.gz is ready for distribution"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +distdir: $(DISTFILES) + -rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook + +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +all-recursive-am: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +install-exec-am: +install-exec: install-exec-recursive + +install-data-am: install-pixmapDATA install-data-local +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: uninstall-pixmapDATA +uninstall: uninstall-recursive +all-am: Makefile $(DATA) config.h +all-redirect: all-recursive-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(pixmapdir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-hdr clean-tags clean-generic mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-hdr distclean-tags distclean-generic clean-am + +distclean: distclean-recursive + -rm -f config.status + +maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + -rm -f config.status + +.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ +uninstall-pixmapDATA install-pixmapDATA install-data-recursive \ +uninstall-data-recursive install-exec-recursive \ +uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ +all-recursive check-recursive installcheck-recursive info-recursive \ +dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ +install-exec-am install-exec install-data-local install-data-am \ +install-data install-am install uninstall-am uninstall all-redirect \ +all-am all installdirs-am installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +install-data-local: + @$(NORMAL_INSTALL) + if test -d $(srcdir)/pixmaps; then \ + $(mkinstalldirs) $(DESTDIR)@PACKAGE_PIXMAPS_DIR@; \ + for pixmap in $(srcdir)/pixmaps/*; do \ + if test -f $$pixmap; then \ + $(INSTALL_DATA) $$pixmap $(DESTDIR)@PACKAGE_PIXMAPS_DIR@; \ + fi \ + done \ + fi + +dist-hook: + if test -d pixmaps; then \ + mkdir $(distdir)/pixmaps; \ + for pixmap in pixmaps/*; do \ + if test -f $$pixmap; then \ + cp -p $$pixmap $(distdir)/pixmaps; \ + fi \ + done \ + fi + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..e2dde6f --- /dev/null +++ b/README @@ -0,0 +1,95 @@ + +GPIV is a graphic user interface for analysing images obtained from a +fluid flow that has been seeded with tracer particles by the so-called +Particle Image Velocimety technique. It is meant to have a quick +overview of the parameters of all piv processes, easely changing them, +running the processes and visualizing their results in an interactive +way. It uses LIBGPIV, which contains the main routines for data in-and +output, processing etc. The software is written in ANSI-C under the +LINUX operating system by using the GTK/GNOME libraries. + +GPIV is Free Software licenced under the GNU +Public licence terms. See the COPYING file for the licence. + +*** homepage *** + + + +Compilation and installation +============================ + +The General instructions of compilation and installlation can be found +in INSTALL. There are some additional configuration options for this +program, as well. These are: +--enable-img-width=WIDTH +--enable-img-height=HEIGHT +--enable-debug +--enable-demo +An expalantion of these options is printed with ./configure --help. + + + +Features +========= + +General +======== +- Data storage in ASCII format or HDF version 5 format. +- Loading of images with with file-open menu, "open" button or with "drag and + drop" from the gnome filemanager "nautilus" into the buffer list. +- Quick execution of all enabled process on all selected buffers. + + +Display +======== +- Visualization of interrogation area contours and highlighting them when + pointing to it. +- Displays pointer position and belonging estimated values. + + +Image info +=========== +- shows image name and dimensions +- defining of spatial and time scales, position of image within the experiment. +- Adding and updating header information. + + +Image evaluation +================= +- Interrogation at the entire image or at a defined region within the image + frames resulting into a displacement field on a rectangular grid. +- Interrogation at a single arbitrary point, along a vertical or horizontal + line. +- re-interrogation of a single area with, different parameters. +- dragging a single interrogation area from the rectangular grid. +- arbitrary interrogation area sizes. +- global pre-shifting. +- local pre-shifting or zero offsetting of the interrogation areas. +- forward and central interrogation scheme +- adaptive interrogation area sizes to obtain high resolution and dynamic range. +- different interpolation schemes for sub-pixel estimation. +- cross and auto correlation. +- defining order of correlation peak to be used as estimator. +- visualization of interrogation area's and correlation function + + +Validation +=========== +- manually enabling and disabling of PIV estimators +- checking on peaklocking effects +- validation on outliers by snr value or median test + + +Postprocessing +=============== +- apply time and spatial scaling +- calculate statistics and substraction of mean values from estimators +- calculation of vorticity and strain. + + +Currently the images can not be visualized, yet as the code is written +with the GNOME 1.4 libraries. It is planned to include the images in +the window that displays the data when the program will be ported to +GNOME-2. In that case the gnome-config allow to include pixmap images +int the gnome canvas. Any help, especially on the visialization of +images, on porting the program to GNOME-2 is welcome diff --git a/acconfig.h b/acconfig.h new file mode 100644 index 0000000..4a321c8 --- /dev/null +++ b/acconfig.h @@ -0,0 +1,9 @@ +#undef ENABLE_NLS +#undef HAVE_CATGETS +#undef HAVE_GETTEXT +#undef HAVE_LC_MESSAGES +#undef HAVE_STPCPY +#undef HAVE_LIBSM +#undef PACKAGE_LOCALE_DIR +#undef PACKAGE_DATA_DIR +#undef PACKAGE_SOURCE_DIR diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..f500a64 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1428 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4-p4 + +dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN(AM_INIT_AUTOMAKE, +[AC_REQUIRE([AC_PROG_INSTALL]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN(AM_SANITY_CHECK, +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN(AM_MISSING_PROG, +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +AC_DEFUN(AM_CONFIG_HEADER, +[AC_PREREQ([2.12]) +AC_CONFIG_HEADER([$1]) +dnl When config.status generates a header, we must update the stamp-h file. +dnl This file resides in the same directory as the config header +dnl that is generated. We must strip everything past the first ":", +dnl and everything past the last "/". +AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl +ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, +<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<>; do + case " <<$>>CONFIG_HEADERS " in + *" <<$>>am_file "*<<)>> + echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx + ;; + esac + am_indx=`expr "<<$>>am_indx" + 1` +done<<>>dnl>>) +changequote([,]))]) + +# aclocal-include.m4 +# +# This macro adds the name macrodir to the set of directories +# that `aclocal' searches for macros. + +# serial 1 + +dnl AM_ACLOCAL_INCLUDE(macrodir) +AC_DEFUN([AM_ACLOCAL_INCLUDE], +[ + AM_CONDITIONAL(INSIDE_GNOME_COMMON, test x = y) + + test -n "$ACLOCAL_FLAGS" && ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS" + + for k in $1 ; do ACLOCAL="$ACLOCAL -I $k" ; done +]) + +# Define a conditional. + +AC_DEFUN(AM_CONDITIONAL, +[AC_SUBST($1_TRUE) +AC_SUBST($1_FALSE) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi]) + +dnl +dnl GNOME_INIT_HOOK (script-if-gnome-enabled, [failflag], [additional-inits]) +dnl +dnl if failflag is "fail" then GNOME_INIT_HOOK will abort if gnomeConf.sh +dnl is not found. +dnl + +AC_DEFUN([GNOME_INIT_HOOK],[ + AC_SUBST(GNOME_LIBS) + AC_SUBST(GNOMEUI_LIBS) + AC_SUBST(GNOMEGNORBA_LIBS) + AC_SUBST(GTKXMHTML_LIBS) + AC_SUBST(ZVT_LIBS) + AC_SUBST(GNOME_LIBDIR) + AC_SUBST(GNOME_INCLUDEDIR) + + AC_ARG_WITH(gnome-includes, + [ --with-gnome-includes Specify location of GNOME headers],[ + CFLAGS="$CFLAGS -I$withval" + ]) + + AC_ARG_WITH(gnome-libs, + [ --with-gnome-libs Specify location of GNOME libs],[ + LDFLAGS="$LDFLAGS -L$withval" + gnome_prefix=$withval + ]) + + AC_ARG_WITH(gnome, + [ --with-gnome Specify prefix for GNOME files], + if test x$withval = xyes; then + want_gnome=yes + dnl Note that an empty true branch is not + dnl valid sh syntax. + ifelse([$1], [], :, [$1]) + else + if test "x$withval" = xno; then + want_gnome=no + else + want_gnome=yes + LDFLAGS="$LDFLAGS -L$withval/lib" + CFLAGS="$CFLAGS -I$withval/include" + gnome_prefix=$withval/lib + fi + fi, + want_gnome=yes) + + if test "x$want_gnome" = xyes; then + + AC_PATH_PROG(GNOME_CONFIG,gnome-config,no) + if test "$GNOME_CONFIG" = "no"; then + no_gnome_config="yes" + else + AC_MSG_CHECKING(if $GNOME_CONFIG works) + if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then + AC_MSG_RESULT(yes) + GNOME_GNORBA_HOOK([],$2) + GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome`" + GNOMEUI_LIBS="`$GNOME_CONFIG --libs-only-l gnomeui`" + GNOMEGNORBA_LIBS="`$GNOME_CONFIG --libs-only-l gnorba gnomeui`" + GTKXMHTML_LIBS="`$GNOME_CONFIG --libs-only-l gtkxmhtml`" + ZVT_LIBS="`$GNOME_CONFIG --libs-only-l zvt`" + GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`" + GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`" + $1 + else + AC_MSG_RESULT(no) + no_gnome_config="yes" + fi + fi + + if test x$exec_prefix = xNONE; then + if test x$prefix = xNONE; then + gnome_prefix=$ac_default_prefix/lib + else + gnome_prefix=$prefix/lib + fi + else + gnome_prefix=`eval echo \`echo $libdir\`` + fi + + if test "$no_gnome_config" = "yes"; then + AC_MSG_CHECKING(for gnomeConf.sh file in $gnome_prefix) + if test -f $gnome_prefix/gnomeConf.sh; then + AC_MSG_RESULT(found) + echo "loading gnome configuration from" \ + "$gnome_prefix/gnomeConf.sh" + . $gnome_prefix/gnomeConf.sh + $1 + else + AC_MSG_RESULT(not found) + if test x$2 = xfail; then + AC_MSG_ERROR(Could not find the gnomeConf.sh file that is generated by gnome-libs install) + fi + fi + fi + fi + + if test -n "$3"; then + n="$3" + for i in $n; do + AC_MSG_CHECKING(extra library \"$i\") + case $i in + applets) + AC_SUBST(GNOME_APPLETS_LIBS) + GNOME_APPLETS_LIBS=`$GNOME_CONFIG --libs-only-l applets` + AC_MSG_RESULT($GNOME_APPLETS_LIBS);; + docklets) + AC_SUBST(GNOME_DOCKLETS_LIBS) + GNOME_DOCKLETS_LIBS=`$GNOME_CONFIG --libs-only-l docklets` + AC_MSG_RESULT($GNOME_DOCKLETS_LIBS);; + capplet) + AC_SUBST(GNOME_CAPPLET_LIBS) + GNOME_CAPPLET_LIBS=`$GNOME_CONFIG --libs-only-l capplet` + AC_MSG_RESULT($GNOME_CAPPLET_LIBS);; + *) + AC_MSG_RESULT(unknown library) + esac + done + fi +]) + +dnl +dnl GNOME_INIT ([additional-inits]) +dnl + +AC_DEFUN([GNOME_INIT],[ + GNOME_INIT_HOOK([],fail,$1) +]) + +dnl +dnl GNOME_GNORBA_HOOK (script-if-gnorba-found, failflag) +dnl +dnl if failflag is "failure" it aborts if gnorba is not found. +dnl + +AC_DEFUN([GNOME_GNORBA_HOOK],[ + GNOME_ORBIT_HOOK([],$2) + AC_CACHE_CHECK([for gnorba libraries],gnome_cv_gnorba_found,[ + gnome_cv_gnorba_found=no + if test x$gnome_cv_orbit_found = xyes; then + GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`" + GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`" + if test -n "$GNORBA_LIBS"; then + gnome_cv_gnorba_found=yes + fi + fi + ]) + AM_CONDITIONAL(HAVE_GNORBA, test x$gnome_cv_gnorba_found = xyes) + if test x$gnome_cv_orbit_found = xyes; then + $1 + GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`" + GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`" + AC_SUBST(GNORBA_CFLAGS) + AC_SUBST(GNORBA_LIBS) + else + if test x$2 = xfailure; then + AC_MSG_ERROR(gnorba library not installed or installation problem) + fi + fi +]) + +AC_DEFUN([GNOME_GNORBA_CHECK], [ + GNOME_GNORBA_HOOK([],failure) +]) + +dnl +dnl GNOME_ORBIT_HOOK (script-if-orbit-found, failflag) +dnl +dnl if failflag is "failure" it aborts if orbit is not found. +dnl + +AC_DEFUN([GNOME_ORBIT_HOOK],[ + AC_PATH_PROG(ORBIT_CONFIG,orbit-config,no) + AC_PATH_PROG(ORBIT_IDL,orbit-idl,no) + AC_CACHE_CHECK([for working ORBit environment],gnome_cv_orbit_found,[ + if test x$ORBIT_CONFIG = xno -o x$ORBIT_IDL = xno; then + gnome_cv_orbit_found=no + else + gnome_cv_orbit_found=yes + fi + ]) + AM_CONDITIONAL(HAVE_ORBIT, test x$gnome_cv_orbit_found = xyes) + if test x$gnome_cv_orbit_found = xyes; then + $1 + ORBIT_CFLAGS=`orbit-config --cflags client server` + ORBIT_LIBS=`orbit-config --use-service=name --libs client server` + AC_SUBST(ORBIT_CFLAGS) + AC_SUBST(ORBIT_LIBS) + else + if test x$2 = xfailure; then + AC_MSG_ERROR(ORBit not installed or installation problem) + fi + fi +]) + +AC_DEFUN([GNOME_ORBIT_CHECK], [ + GNOME_ORBIT_HOOK([],failure) +]) + +#serial 1 +# This test replaces the one in autoconf. +# Currently this macro should have the same name as the autoconf macro +# because gettext's gettext.m4 (distributed in the automake package) +# still uses it. Otherwise, the use in gettext.m4 makes autoheader +# give these diagnostics: +# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX +# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX + +undefine([AC_ISC_POSIX]) + +AC_DEFUN([AC_ISC_POSIX], + [ + dnl This test replaces the obsolescent AC_ISC_POSIX kludge. + AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) + ] +) + + +# serial 1 + +# @defmac AC_PROG_CC_STDC +# @maindex PROG_CC_STDC +# @ovindex CC +# If the C compiler in not in ANSI C mode by default, try to add an option +# to output variable @code{CC} to make it so. This macro tries various +# options that select ANSI C on some system or another. It considers the +# compiler to be in ANSI C mode if it handles function prototypes correctly. +# +# If you use this macro, you should check after calling it whether the C +# compiler has been set to accept ANSI C; if not, the shell variable +# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source +# code in ANSI C, you can make an un-ANSIfied copy of it by using the +# program @code{ansi2knr}, which comes with Ghostscript. +# @end defmac + +AC_DEFUN(AM_PROG_CC_STDC, +[AC_REQUIRE([AC_PROG_CC]) +AC_BEFORE([$0], [AC_C_INLINE]) +AC_BEFORE([$0], [AC_C_CONST]) +dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require +dnl a magic option to avoid problems with ANSI preprocessor commands +dnl like #elif. +dnl FIXME: can't do this because then AC_AIX won't work due to a +dnl circular dependency. +dnl AC_BEFORE([$0], [AC_PROG_CPP]) +AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C) +AC_CACHE_VAL(am_cv_prog_cc_stdc, +[am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + AC_TRY_COMPILE( +[#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +], [ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +], +[am_cv_prog_cc_stdc="$ac_arg"; break]) +done +CC="$ac_save_CC" +]) +if test -z "$am_cv_prog_cc_stdc"; then + AC_MSG_RESULT([none needed]) +else + AC_MSG_RESULT($am_cv_prog_cc_stdc) +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac +]) + +dnl GNOME_COMPILE_WARNINGS +dnl Turn on many useful compiler warnings +dnl For now, only works on GCC +AC_DEFUN([GNOME_COMPILE_WARNINGS],[ + AC_ARG_ENABLE(compile-warnings, + [ --enable-compile-warnings=[no/minimum/yes] Turn on compiler warnings.],,enable_compile_warnings=minimum) + + AC_MSG_CHECKING(what warning flags to pass to the C compiler) + warnCFLAGS= + if test "x$GCC" != xyes; then + enable_compile_warnings=no + fi + + if test "x$enable_compile_warnings" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) warnCFLAGS="-Wall -Wunused" ;; + esac + + ## -W is not all that useful. And it cannot be controlled + ## with individual -Wno-xxx flags, unlike -Wall + if test "x$enable_compile_warnings" = "xyes"; then + warnCFLAGS="$warnCFLAGS -Wmissing-prototypes -Wmissing-declarations" + fi + fi + fi + AC_MSG_RESULT($warnCFLAGS) + + AC_ARG_ENABLE(iso-c, + [ --enable-iso-c Try to warn if code is not ISO C ],, + enable_iso_c=no) + + AC_MSG_CHECKING(what language compliance flags to pass to the C compiler) + complCFLAGS= + if test "x$enable_iso_c" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-ansi[\ \ ]*) ;; + *) complCFLAGS="$complCFLAGS -ansi" ;; + esac + + case " $CFLAGS " in + *[\ \ ]-pedantic[\ \ ]*) ;; + *) complCFLAGS="$complCFLAGS -pedantic" ;; + esac + fi + fi + AC_MSG_RESULT($complCFLAGS) + if test "x$cflags_set" != "xyes"; then + CFLAGS="$CFLAGS $warnCFLAGS $complCFLAGS" + cflags_set=yes + AC_SUBST(cflags_set) + fi +]) + +dnl For C++, do basically the same thing. + +AC_DEFUN([GNOME_CXX_WARNINGS],[ + AC_ARG_ENABLE(cxx-warnings, + [ --enable-cxx-warnings=[no/minimum/yes] Turn on compiler warnings.],,enable_cxx_warnings=minimum) + + AC_MSG_CHECKING(what warning flags to pass to the C++ compiler) + warnCXXFLAGS= + if test "x$GCC" != xyes; then + enable_compile_warnings=no + fi + if test "x$enable_cxx_warnings" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CXXFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) warnCXXFLAGS="-Wall -Wno-unused" ;; + esac + + ## -W is not all that useful. And it cannot be controlled + ## with individual -Wno-xxx flags, unlike -Wall + if test "x$enable_cxx_warnings" = "xyes"; then + warnCXXFLAGS="$warnCXXFLAGS -Wmissing-prototypes -Wmissing-declarations -Wshadow -Woverloaded-virtual" + fi + fi + fi + AC_MSG_RESULT($warnCXXFLAGS) + + AC_ARG_ENABLE(iso-cxx, + [ --enable-iso-cxx Try to warn if code is not ISO C++ ],, + enable_iso_cxx=no) + + AC_MSG_CHECKING(what language compliance flags to pass to the C++ compiler) + complCXXFLAGS= + if test "x$enable_iso_cxx" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CXXFLAGS " in + *[\ \ ]-ansi[\ \ ]*) ;; + *) complCXXFLAGS="$complCXXFLAGS -ansi" ;; + esac + + case " $CXXFLAGS " in + *[\ \ ]-pedantic[\ \ ]*) ;; + *) complCXXFLAGS="$complCXXFLAGS -pedantic" ;; + esac + fi + fi + AC_MSG_RESULT($complCXXFLAGS) + if test "x$cxxflags_set" != "xyes"; then + CXXFLAGS="$CXXFLAGS $warnCXXFLAGS $complCXXFLAGS" + cxxflags_set=yes + AC_SUBST(cxxflags_set) + fi +]) + +dnl GNOME_X_CHECKS +dnl +dnl Basic X11 related checks for X11. At the end, the following will be +dnl defined/changed: +dnl GTK_{CFLAGS,LIBS} From AM_PATH_GTK +dnl CPPFLAGS Will include $X_CFLAGS +dnl GNOME_HAVE_SM `true' or `false' depending on whether session +dnl management is available. It is available if +dnl both -lSM and X11/SM/SMlib.h exist. (Some +dnl Solaris boxes have the library but not the header) +dnl XPM_LIBS -lXpm if Xpm library is present, otherwise "" +dnl +dnl The following configure cache variables are defined (but not used): +dnl gnome_cv_passdown_{x_libs,X_LIBS,X_CFLAGS} +dnl +AC_DEFUN([GNOME_X_CHECKS], +[ + AM_PATH_GTK(1.2.0,,AC_MSG_ERROR(GTK not installed, or gtk-config not in path)) + dnl Hope that GTK_CFLAGS have only -I and -D. Otherwise, we could + dnl test -z "$x_includes" || CPPFLAGS="$CPPFLAGS -I$x_includes" + dnl + dnl Use CPPFLAGS instead of CFLAGS because AC_CHECK_HEADERS uses + dnl CPPFLAGS, not CFLAGS + CPPFLAGS="$CPPFLAGS $GTK_CFLAGS" + + saved_ldflags="$LDFLAGS" + LDFLAGS="$LDFLAGS $GTK_LIBS" + + gnome_cv_passdown_x_libs="$GTK_LIBS" + gnome_cv_passdown_X_LIBS="$GTK_LIBS" + gnome_cv_passdown_X_CFLAGS="$GTK_CFLAGS" + gnome_cv_passdown_GTK_LIBS="$GTK_LIBS" + + LDFLAGS="$saved_ldflags $GTK_LIBS" + +dnl We are requiring GTK >= 1.1.1, which means this will be fine anyhow. + USE_DEVGTK=true + +dnl AC_MSG_CHECKING([whether to use features from (unstable) GTK+ 1.1.x]) +dnl AC_EGREP_CPP(answer_affirmatively, +dnl [#include +dnl #ifdef GTK_HAVE_FEATURES_1_1_0 +dnl answer_affirmatively +dnl #endif +dnl ], dev_gtk=yes, dev_gtk=no) +dnl if test "$dev_gtk" = "yes"; then +dnl USE_DEVGTK=true +dnl fi +dnl AC_MSG_RESULT("$dev_gtk") + + GNOME_HAVE_SM=true + case "$GTK_LIBS" in + *-lSM*) + dnl Already found it. + ;; + *) + dnl Assume that if we have -lSM then we also have -lICE. + AC_CHECK_LIB(SM, SmcSaveYourselfDone, + [GTK_LIBS="-lSM -lICE $GTK_LIBS"],GNOME_HAVE_SM=false, + $x_libs -lICE) + ;; + esac + + if test "$GNOME_HAVE_SM" = true; then + AC_CHECK_HEADERS(X11/SM/SMlib.h,,GNOME_HAVE_SM=false) + fi + + if test "$GNOME_HAVE_SM" = true; then + AC_DEFINE(HAVE_LIBSM) + fi + + XPM_LIBS="" + AC_CHECK_LIB(Xpm, XpmFreeXpmImage, [XPM_LIBS="-lXpm"], , $x_libs) + AC_SUBST(XPM_LIBS) + + AC_REQUIRE([GNOME_PTHREAD_CHECK]) + LDFLAGS="$saved_ldflags" + + AC_PROVIDE([GNOME_X_CHECKS]) +]) + +# Configure paths for GTK+ +# Owen Taylor 97-11-3 + +dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS +dnl +AC_DEFUN(AM_PATH_GTK, +[dnl +dnl Get the cflags and libraries from the gtk-config script +dnl +AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], + gtk_config_prefix="$withval", gtk_config_prefix="") +AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], + gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") +AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], + , enable_gtktest=yes) + + for module in . $4 + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + AC_PATH_PROG(GTK_CONFIG, gtk-config, no) + min_gtk_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" +dnl +dnl Now check if the installed GTK is sufficiently new. (Also sanity +dnl checks the results of gtk-config to some extent +dnl + rm -f conf.gtktest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GTK_CFLAGS) + AC_SUBST(GTK_LIBS) + rm -f conf.gtktest +]) + +dnl +dnl And better, use gthreads instead... +dnl + +AC_DEFUN([GNOME_PTHREAD_CHECK],[ + PTHREAD_LIB="" + AC_CHECK_LIB(pthread, pthread_create, PTHREAD_LIB="-lpthread", + [AC_CHECK_LIB(pthreads, pthread_create, PTHREAD_LIB="-lpthreads", + [AC_CHECK_LIB(c_r, pthread_create, PTHREAD_LIB="-lc_r", + [AC_CHECK_FUNC(pthread_create)] + )] + )] + ) + AC_SUBST(PTHREAD_LIB) + AC_PROVIDE([GNOME_PTHREAD_CHECK]) +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License or the GNU Library General Public License but which still want +# to provide support for the GNU gettext functionality. +# Please note that the actual code of the GNU gettext library is covered +# by the GNU Library General Public License, and the rest of the GNU +# gettext package package is covered by the GNU General Public License. +# They are *not* in the public domain. + +# serial 10 + +dnl Usage: AM_WITH_NLS([TOOLSYMBOL], [NEEDSYMBOL], [LIBDIR]). +dnl If TOOLSYMBOL is specified and is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). Otherwise, a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. +dnl LIBDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_WITH_NLS], + [AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) + + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + INTLLIBS= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + CATOBJEXT=NONE + + dnl Add a version number to the cache macros. + define(gt_cv_func_gnugettext_libc, [gt_cv_func_gnugettext]ifelse([$2], need-ngettext, 2, 1)[_libc]) + define(gt_cv_func_gnugettext_libintl, [gt_cv_func_gnugettext]ifelse([$2], need-ngettext, 2, 1)[_libintl]) + + AC_CHECK_HEADER(libintl.h, + [AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include +extern int _nl_msg_cat_cntr;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $LIBICONV" + AC_TRY_LINK([#include +extern int _nl_msg_cat_cntr;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; then + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + dnl If iconv() is in a separate libiconv library, then anyone + dnl linking with libintl{.a,.so} also needs to link with + dnl libiconv. + INTLLIBS="-lintl $LIBICONV" + fi + + gt_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + AC_CHECK_FUNCS(dcgettext) + LIBS="$gt_save_LIBS" + + dnl Search for GNU msgfmt in the PATH. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1], :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Search for GNU xgettext in the PATH. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header /dev/null >/dev/null 2>&1], :) + + CATOBJEXT=.gmo + fi + ]) + + if test "$CATOBJEXT" = "NONE"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + INTLOBJS="\$(GETTOBJS)" + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1], :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header /dev/null >/dev/null 2>&1], :) + AC_SUBST(MSGFMT) + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.gmo + INTLLIBS="ifelse([$3],[],\$(top_builddir)/intl,[$3])/libintl.ifelse([$1], use-libtool, [l], [])a $LIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1; then + : ; + else + AC_MSG_RESULT( + [found msgfmt program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null >/dev/null 2>&1; then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + AC_OUTPUT_COMMANDS( + [for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," -e "\$s/\(.*\) \\\\/\1/" < "$ac_given_srcdir/$ac_dir/POTFILES.in" > "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/POTFILES =/r $ac_dir/POTFILES" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + fi + ;; + esac + done]) + + + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.in. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(GMOFILES) + AC_SUBST(INTLLIBS) + AC_SUBST(INTLOBJS) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + ]) + +dnl Usage: Just like AM_WITH_NLS, which see. +AC_DEFUN([AM_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getcwd getegid geteuid \ +getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \ +strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) + + AM_ICONV + AM_LANGINFO_CODESET + AM_LC_MESSAGES + AM_WITH_NLS([$1],[$2],[$3]) + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + for desiredlang in ${LINGUAS-$ALL_LINGUAS}; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=ifelse([$1], use-libtool, [l], []) + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License or the GNU Library General Public License but which still want +# to provide support for the GNU gettext functionality. +# Please note that the actual code of the GNU gettext library is covered +# by the GNU Library General Public License, and the rest of the GNU +# gettext package package is covered by the GNU General Public License. +# They are *not* in the public domain. + +# serial 2 + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +#serial 2 + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([jm_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) + +#serial AM2 + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + AC_ARG_WITH([libiconv-prefix], +[ --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib], [ + for dir in `echo "$withval" | tr : ' '`; do + if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi + if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi + done + ]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS -liconv" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi + LIBICONV= + if test "$am_cv_lib_iconv" = yes; then + LIBICONV="-liconv" + fi + AC_SUBST(LIBICONV) +]) + +#serial AM1 + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +]) + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License or the GNU Library General Public License but which still want +# to provide support for the GNU gettext functionality. +# Please note that the actual code of the GNU gettext library is covered +# by the GNU Library General Public License, and the rest of the GNU +# gettext package package is covered by the GNU General Public License. +# They are *not* in the public domain. + +# serial 2 + +AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi + fi]) + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..8cda498 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +PKG_NAME="the package." + +(test -f $srcdir/configure.in) || { + echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" + echo " top-level directory" + exit 1 +} + +. $srcdir/macros/autogen.sh diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..ed2e03b --- /dev/null +++ b/config.guess @@ -0,0 +1,1321 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-03-20' + +# This file 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. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c ; + for c in cc gcc c89 c99 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $dummy.c $dummy.o $dummy.rel ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i386-pc-interix3 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + rm -f $dummy.c + test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..642c985 --- /dev/null +++ b/config.h.in @@ -0,0 +1,188 @@ +/* config.h.in. Generated automatically from configure.in by autoheader 2.13. */ + +/* Define if using alloca.c. */ +#undef C_ALLOCA + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. + This function is required for alloca.c support on those systems. */ +#undef CRAY_STACKSEG_END + +/* Define if you have alloca, as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define if you have and it should be used (not on Ultrix). */ +#undef HAVE_ALLOCA_H + +/* Define if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define to `long' if doesn't define. */ +#undef off_t + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown + */ +#undef STACK_DIRECTION + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +#undef ENABLE_NLS +#undef HAVE_CATGETS +#undef HAVE_GETTEXT +#undef HAVE_LC_MESSAGES +#undef HAVE_STPCPY +#undef HAVE_LIBSM +#undef PACKAGE_LOCALE_DIR +#undef PACKAGE_DATA_DIR +#undef PACKAGE_SOURCE_DIR + +/* Define if you have the __argz_count function. */ +#undef HAVE___ARGZ_COUNT + +/* Define if you have the __argz_next function. */ +#undef HAVE___ARGZ_NEXT + +/* Define if you have the __argz_stringify function. */ +#undef HAVE___ARGZ_STRINGIFY + +/* Define if you have the dcgettext function. */ +#undef HAVE_DCGETTEXT + +/* Define if you have the feof_unlocked function. */ +#undef HAVE_FEOF_UNLOCKED + +/* Define if you have the fgets_unlocked function. */ +#undef HAVE_FGETS_UNLOCKED + +/* Define if you have the getcwd function. */ +#undef HAVE_GETCWD + +/* Define if you have the getegid function. */ +#undef HAVE_GETEGID + +/* Define if you have the geteuid function. */ +#undef HAVE_GETEUID + +/* Define if you have the getgid function. */ +#undef HAVE_GETGID + +/* Define if you have the getpagesize function. */ +#undef HAVE_GETPAGESIZE + +/* Define if you have the getuid function. */ +#undef HAVE_GETUID + +/* Define if you have the mempcpy function. */ +#undef HAVE_MEMPCPY + +/* Define if you have the munmap function. */ +#undef HAVE_MUNMAP + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the setenv function. */ +#undef HAVE_SETENV + +/* Define if you have the setlocale function. */ +#undef HAVE_SETLOCALE + +/* Define if you have the stpcpy function. */ +#undef HAVE_STPCPY + +/* Define if you have the strcasecmp function. */ +#undef HAVE_STRCASECMP + +/* Define if you have the strchr function. */ +#undef HAVE_STRCHR + +/* Define if you have the strdup function. */ +#undef HAVE_STRDUP + +/* Define if you have the strtoul function. */ +#undef HAVE_STRTOUL + +/* Define if you have the tsearch function. */ +#undef HAVE_TSEARCH + +/* Define if you have the header file. */ +#undef HAVE_X11_SM_SMLIB_H + +/* Define if you have the header file. */ +#undef HAVE_ARGZ_H + +/* Define if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define if you have the header file. */ +#undef HAVE_NL_TYPES_H + +/* Define if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define if you have the header file. */ +#undef HAVE_STRING_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the fftw library (-lfftw). */ +#undef HAVE_LIBFFTW + +/* Define if you have the gpiv library (-lgpiv). */ +#undef HAVE_LIBGPIV + +/* Define if you have the rfftw library (-lrfftw). */ +#undef HAVE_LIBRFFTW + +/* Name of package */ +#undef PACKAGE + +/* Version number of package */ +#undef VERSION + +/* Define if you have the iconv() function. */ +#undef HAVE_ICONV + +/* Define as const if the declaration of iconv() needs const. */ +#undef ICONV_CONST + +/* Define if you have and nl_langinfo(CODESET). */ +#undef HAVE_LANGINFO_CODESET + +/* Define if your file defines LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define to 1 if translation of program messages to the user's native language + is requested. */ +#undef ENABLE_NLS + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..f365797 --- /dev/null +++ b/config.sub @@ -0,0 +1,1443 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-03-07' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dsp16xx \ + | fr30 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el | mips64vr4300 \ + | mips64vr4300el | mips64vr5000 | mips64vr5000el \ + | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ + | mipsisa32 | mipsisa64 \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[34] | sh[34]eb | shbe | shle | sh64 \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c54x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ + | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ + | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3d) + basic_machine=alpha-cray + os=-unicos + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + windows32) + basic_machine=i386-pc + os=-windows32-msvcrt + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh3eb | sh4eb) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..b6f8346 --- /dev/null +++ b/configure @@ -0,0 +1,4760 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --with-gnome-includes Specify location of GNOME headers" +ac_help="$ac_help + --with-gnome-libs Specify location of GNOME libs" +ac_help="$ac_help + --with-gnome Specify prefix for GNOME files" +ac_help="$ac_help + --enable-compile-warnings=[no/minimum/yes] Turn on compiler warnings." +ac_help="$ac_help + --enable-iso-c Try to warn if code is not ISO C " +ac_help="$ac_help + --with-gtk-prefix=PFX Prefix where GTK is installed (optional)" +ac_help="$ac_help + --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)" +ac_help="$ac_help + --disable-gtktest Do not try to compile and run a test GTK program" +ac_help="$ac_help + --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib" +ac_help="$ac_help + --disable-nls do not use Native Language Support" +ac_help="$ac_help + --with-included-gettext use the GNU gettext library included here" +ac_help="$ac_help + --enable-img-width=WIDTH maximum image width to \ +be used (default SVGA)" +ac_help="$ac_help + --enable-img-height=HEIGHT maximum image height to \ +be used (default SVGA)" +ac_help="$ac_help + --enable-debug debug version (more verbose)" +ac_help="$ac_help + --enable-demo behaves as a \"true\" commercial \ +demonstration program: doesn't allow to save data ;)" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=configure.in + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:589: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +echo "configure:642: checking whether build environment is sane" >&5 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { echo "configure: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" 1>&2; exit 1; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { echo "configure: error: newly created file is older than distributed files! +Check your system clock" 1>&2; exit 1; } +fi +rm -f conftest* +echo "$ac_t""yes" 1>&6 +if test "$program_transform_name" = s,x,x,; then + program_transform_name= +else + # Double any \ or $. echo might interpret backslashes. + cat <<\EOF_SED > conftestsed +s,\\,\\\\,g; s,\$,$$,g +EOF_SED + program_transform_name="`echo $program_transform_name|sed -f conftestsed`" + rm -f conftestsed +fi +test "$program_prefix" != NONE && + program_transform_name="s,^,${program_prefix},; $program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" + +# sed with no file args requires a program. +test "$program_transform_name" = "" && program_transform_name="s,x,x," + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:699: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +PACKAGE=gpiv + +VERSION=0.1.0 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } +fi +cat >> confdefs.h <> confdefs.h <&6 +echo "configure:745: checking for working aclocal" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal + echo "$ac_t""found" 1>&6 +else + ACLOCAL="$missing_dir/missing aclocal" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +echo "configure:758: checking for working autoconf" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$ac_t""found" 1>&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working automake""... $ac_c" 1>&6 +echo "configure:771: checking for working automake" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake + echo "$ac_t""found" 1>&6 +else + AUTOMAKE="$missing_dir/missing automake" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +echo "configure:784: checking for working autoheader" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$ac_t""found" 1>&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +echo "configure:797: checking for working makeinfo" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$ac_t""found" 1>&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$ac_t""missing" 1>&6 +fi + + + + + + + + + +if test x = y; then + INSIDE_GNOME_COMMON_TRUE= + INSIDE_GNOME_COMMON_FALSE='#' +else + INSIDE_GNOME_COMMON_TRUE='#' + INSIDE_GNOME_COMMON_FALSE= +fi + + test -n "$ACLOCAL_FLAGS" && ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS" + + for k in macros ; do ACLOCAL="$ACLOCAL -I $k" ; done + + + + + + + + + + + + + # Check whether --with-gnome-includes or --without-gnome-includes was given. +if test "${with_gnome_includes+set}" = set; then + withval="$with_gnome_includes" + + CFLAGS="$CFLAGS -I$withval" + +fi + + + # Check whether --with-gnome-libs or --without-gnome-libs was given. +if test "${with_gnome_libs+set}" = set; then + withval="$with_gnome_libs" + + LDFLAGS="$LDFLAGS -L$withval" + gnome_prefix=$withval + +fi + + + # Check whether --with-gnome or --without-gnome was given. +if test "${with_gnome+set}" = set; then + withval="$with_gnome" + if test x$withval = xyes; then + want_gnome=yes + : + else + if test "x$withval" = xno; then + want_gnome=no + else + want_gnome=yes + LDFLAGS="$LDFLAGS -L$withval/lib" + CFLAGS="$CFLAGS -I$withval/include" + gnome_prefix=$withval/lib + fi + fi +else + want_gnome=yes +fi + + + if test "x$want_gnome" = xyes; then + + # Extract the first word of "gnome-config", so it can be a program name with args. +set dummy gnome-config; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:885: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GNOME_CONFIG'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GNOME_CONFIG" in + /*) + ac_cv_path_GNOME_CONFIG="$GNOME_CONFIG" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GNOME_CONFIG="$GNOME_CONFIG" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GNOME_CONFIG="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GNOME_CONFIG" && ac_cv_path_GNOME_CONFIG="no" + ;; +esac +fi +GNOME_CONFIG="$ac_cv_path_GNOME_CONFIG" +if test -n "$GNOME_CONFIG"; then + echo "$ac_t""$GNOME_CONFIG" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test "$GNOME_CONFIG" = "no"; then + no_gnome_config="yes" + else + echo $ac_n "checking if $GNOME_CONFIG works""... $ac_c" 1>&6 +echo "configure:922: checking if $GNOME_CONFIG works" >&5 + if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then + echo "$ac_t""yes" 1>&6 + + + # Extract the first word of "orbit-config", so it can be a program name with args. +set dummy orbit-config; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:930: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_ORBIT_CONFIG'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$ORBIT_CONFIG" in + /*) + ac_cv_path_ORBIT_CONFIG="$ORBIT_CONFIG" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_ORBIT_CONFIG="$ORBIT_CONFIG" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_ORBIT_CONFIG="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_ORBIT_CONFIG" && ac_cv_path_ORBIT_CONFIG="no" + ;; +esac +fi +ORBIT_CONFIG="$ac_cv_path_ORBIT_CONFIG" +if test -n "$ORBIT_CONFIG"; then + echo "$ac_t""$ORBIT_CONFIG" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "orbit-idl", so it can be a program name with args. +set dummy orbit-idl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:966: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_ORBIT_IDL'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$ORBIT_IDL" in + /*) + ac_cv_path_ORBIT_IDL="$ORBIT_IDL" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_ORBIT_IDL="$ORBIT_IDL" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_ORBIT_IDL="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_ORBIT_IDL" && ac_cv_path_ORBIT_IDL="no" + ;; +esac +fi +ORBIT_IDL="$ac_cv_path_ORBIT_IDL" +if test -n "$ORBIT_IDL"; then + echo "$ac_t""$ORBIT_IDL" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + echo $ac_n "checking for working ORBit environment""... $ac_c" 1>&6 +echo "configure:1000: checking for working ORBit environment" >&5 +if eval "test \"`echo '$''{'gnome_cv_orbit_found'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + if test x$ORBIT_CONFIG = xno -o x$ORBIT_IDL = xno; then + gnome_cv_orbit_found=no + else + gnome_cv_orbit_found=yes + fi + +fi + +echo "$ac_t""$gnome_cv_orbit_found" 1>&6 + + +if test x$gnome_cv_orbit_found = xyes; then + HAVE_ORBIT_TRUE= + HAVE_ORBIT_FALSE='#' +else + HAVE_ORBIT_TRUE='#' + HAVE_ORBIT_FALSE= +fi + if test x$gnome_cv_orbit_found = xyes; then + + ORBIT_CFLAGS=`orbit-config --cflags client server` + ORBIT_LIBS=`orbit-config --use-service=name --libs client server` + + + else + if test xfail = xfailure; then + { echo "configure: error: ORBit not installed or installation problem" 1>&2; exit 1; } + fi + fi + + echo $ac_n "checking for gnorba libraries""... $ac_c" 1>&6 +echo "configure:1036: checking for gnorba libraries" >&5 +if eval "test \"`echo '$''{'gnome_cv_gnorba_found'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + gnome_cv_gnorba_found=no + if test x$gnome_cv_orbit_found = xyes; then + GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`" + GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`" + if test -n "$GNORBA_LIBS"; then + gnome_cv_gnorba_found=yes + fi + fi + +fi + +echo "$ac_t""$gnome_cv_gnorba_found" 1>&6 + + +if test x$gnome_cv_gnorba_found = xyes; then + HAVE_GNORBA_TRUE= + HAVE_GNORBA_FALSE='#' +else + HAVE_GNORBA_TRUE='#' + HAVE_GNORBA_FALSE= +fi + if test x$gnome_cv_orbit_found = xyes; then + + GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`" + GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`" + + + else + if test xfail = xfailure; then + { echo "configure: error: gnorba library not installed or installation problem" 1>&2; exit 1; } + fi + fi + + GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome`" + GNOMEUI_LIBS="`$GNOME_CONFIG --libs-only-l gnomeui`" + GNOMEGNORBA_LIBS="`$GNOME_CONFIG --libs-only-l gnorba gnomeui`" + GTKXMHTML_LIBS="`$GNOME_CONFIG --libs-only-l gtkxmhtml`" + ZVT_LIBS="`$GNOME_CONFIG --libs-only-l zvt`" + GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`" + GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`" + + else + echo "$ac_t""no" 1>&6 + no_gnome_config="yes" + fi + fi + + if test x$exec_prefix = xNONE; then + if test x$prefix = xNONE; then + gnome_prefix=$ac_default_prefix/lib + else + gnome_prefix=$prefix/lib + fi + else + gnome_prefix=`eval echo \`echo $libdir\`` + fi + + if test "$no_gnome_config" = "yes"; then + echo $ac_n "checking for gnomeConf.sh file in $gnome_prefix""... $ac_c" 1>&6 +echo "configure:1100: checking for gnomeConf.sh file in $gnome_prefix" >&5 + if test -f $gnome_prefix/gnomeConf.sh; then + echo "$ac_t""found" 1>&6 + echo "loading gnome configuration from" \ + "$gnome_prefix/gnomeConf.sh" + . $gnome_prefix/gnomeConf.sh + + else + echo "$ac_t""not found" 1>&6 + if test xfail = xfail; then + { echo "configure: error: Could not find the gnomeConf.sh file that is generated by gnome-libs install" 1>&2; exit 1; } + fi + fi + fi + fi + + if test -n ""; then + n="" + for i in $n; do + echo $ac_n "checking extra library \"$i\"""... $ac_c" 1>&6 +echo "configure:1120: checking extra library \"$i\"" >&5 + case $i in + applets) + + GNOME_APPLETS_LIBS=`$GNOME_CONFIG --libs-only-l applets` + echo "$ac_t""$GNOME_APPLETS_LIBS" 1>&6;; + docklets) + + GNOME_DOCKLETS_LIBS=`$GNOME_CONFIG --libs-only-l docklets` + echo "$ac_t""$GNOME_DOCKLETS_LIBS" 1>&6;; + capplet) + + GNOME_CAPPLET_LIBS=`$GNOME_CONFIG --libs-only-l capplet` + echo "$ac_t""$GNOME_CAPPLET_LIBS" 1>&6;; + *) + echo "$ac_t""unknown library" 1>&6 + esac + done + fi + + + + echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6 +echo "configure:1143: checking for strerror in -lcposix" >&5 +ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lcposix $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lcposix" +else + echo "$ac_t""no" 1>&6 +fi + + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1187: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1217: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1268: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1300: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 1311 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:1316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:1342: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:1347: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:1375: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + + + + +echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6 +echo "configure:1410: checking for ${CC-cc} option to accept ANSI C" >&5 +if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + cat > conftest.$ac_ext < +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; + +int main() { + +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + +; return 0; } +EOF +if { (eval echo configure:1463: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + am_cv_prog_cc_stdc="$ac_arg"; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done +CC="$ac_save_CC" + +fi + +if test -z "$am_cv_prog_cc_stdc"; then + echo "$ac_t""none needed" 1>&6 +else + echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6 +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1487: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1508: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1525: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1542: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1567: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1580: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + + + + # Check whether --enable-compile-warnings or --disable-compile-warnings was given. +if test "${enable_compile_warnings+set}" = set; then + enableval="$enable_compile_warnings" + : +else + enable_compile_warnings=minimum +fi + + + echo $ac_n "checking what warning flags to pass to the C compiler""... $ac_c" 1>&6 +echo "configure:1682: checking what warning flags to pass to the C compiler" >&5 + warnCFLAGS= + if test "x$GCC" != xyes; then + enable_compile_warnings=no + fi + + if test "x$enable_compile_warnings" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *\ \ -Wall\ \ *) ;; + *) warnCFLAGS="-Wall -Wunused" ;; + esac + + ## -W is not all that useful. And it cannot be controlled + ## with individual -Wno-xxx flags, unlike -Wall + if test "x$enable_compile_warnings" = "xyes"; then + warnCFLAGS="$warnCFLAGS -Wmissing-prototypes -Wmissing-declarations" + fi + fi + fi + echo "$ac_t""$warnCFLAGS" 1>&6 + + # Check whether --enable-iso-c or --disable-iso-c was given. +if test "${enable_iso_c+set}" = set; then + enableval="$enable_iso_c" + : +else + enable_iso_c=no +fi + + + echo $ac_n "checking what language compliance flags to pass to the C compiler""... $ac_c" 1>&6 +echo "configure:1714: checking what language compliance flags to pass to the C compiler" >&5 + complCFLAGS= + if test "x$enable_iso_c" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *\ \ -ansi\ \ *) ;; + *) complCFLAGS="$complCFLAGS -ansi" ;; + esac + + case " $CFLAGS " in + *\ \ -pedantic\ \ *) ;; + *) complCFLAGS="$complCFLAGS -pedantic" ;; + esac + fi + fi + echo "$ac_t""$complCFLAGS" 1>&6 + if test "x$cflags_set" != "xyes"; then + CFLAGS="$CFLAGS $warnCFLAGS $complCFLAGS" + cflags_set=yes + + fi + + + PTHREAD_LIB="" + echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6 +echo "configure:1739: checking for pthread_create in -lpthread" >&5 +ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lpthread $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + PTHREAD_LIB="-lpthread" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for pthread_create in -lpthreads""... $ac_c" 1>&6 +echo "configure:1777: checking for pthread_create in -lpthreads" >&5 +ac_lib_var=`echo pthreads'_'pthread_create | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lpthreads $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + PTHREAD_LIB="-lpthreads" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for pthread_create in -lc_r""... $ac_c" 1>&6 +echo "configure:1815: checking for pthread_create in -lc_r" >&5 +ac_lib_var=`echo c_r'_'pthread_create | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lc_r $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + PTHREAD_LIB="-lc_r" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for pthread_create""... $ac_c" 1>&6 +echo "configure:1853: checking for pthread_create" >&5 +if eval "test \"`echo '$''{'ac_cv_func_pthread_create'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_create(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_pthread_create) || defined (__stub___pthread_create) +choke me +#else +pthread_create(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1881: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_pthread_create=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_pthread_create=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'pthread_create`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + +fi + + +fi + + +fi + + + + + + # Check whether --with-gtk-prefix or --without-gtk-prefix was given. +if test "${with_gtk_prefix+set}" = set; then + withval="$with_gtk_prefix" + gtk_config_prefix="$withval" +else + gtk_config_prefix="" +fi + +# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given. +if test "${with_gtk_exec_prefix+set}" = set; then + withval="$with_gtk_exec_prefix" + gtk_config_exec_prefix="$withval" +else + gtk_config_exec_prefix="" +fi + +# Check whether --enable-gtktest or --disable-gtktest was given. +if test "${enable_gtktest+set}" = set; then + enableval="$enable_gtktest" + : +else + enable_gtktest=yes +fi + + + for module in . + do + case "$module" in + gthread) + gtk_config_args="$gtk_config_args gthread" + ;; + esac + done + + if test x$gtk_config_exec_prefix != x ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + fi + if test x$gtk_config_prefix != x ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + if test x${GTK_CONFIG+set} != xset ; then + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + fi + + # Extract the first word of "gtk-config", so it can be a program name with args. +set dummy gtk-config; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1963: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GTK_CONFIG" in + /*) + ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no" + ;; +esac +fi +GTK_CONFIG="$ac_cv_path_GTK_CONFIG" +if test -n "$GTK_CONFIG"; then + echo "$ac_t""$GTK_CONFIG" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + min_gtk_version=1.2.0 + echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6 +echo "configure:1998: checking for GTK - version >= $min_gtk_version" >&5 + no_gtk="" + if test "$GTK_CONFIG" = "no" ; then + no_gtk=yes + else + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_gtktest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$GTK_LIBS $LIBS" + rm -f conf.gtktest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat > conftest.$ac_ext < +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gtktest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_gtk_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + + if ((gtk_major_version != $gtk_config_major_version) || + (gtk_minor_version != $gtk_config_minor_version) || + (gtk_micro_version != $gtk_config_micro_version)) + { + printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", + $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf ("*** was found! If gtk-config was correct, then it is best\n"); + printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); + printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } +#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) + else if ((gtk_major_version != GTK_MAJOR_VERSION) || + (gtk_minor_version != GTK_MINOR_VERSION) || + (gtk_micro_version != GTK_MICRO_VERSION)) + { + printf("*** GTK+ header files (version %d.%d.%d) do not match\n", + GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + } +#endif /* defined (GTK_MAJOR_VERSION) ... */ + else + { + if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", + gtk_major_version, gtk_minor_version, gtk_micro_version); + printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); + printf("*** correct copy of gtk-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} + +EOF +if { (eval echo configure:2099: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + no_gtk=yes +fi +rm -fr conftest* +fi + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gtk" = x ; then + echo "$ac_t""yes" 1>&6 + : + else + echo "$ac_t""no" 1>&6 + if test "$GTK_CONFIG" = "no" ; then + echo "*** The gtk-config script installed by GTK could not be found" + echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GTK_CONFIG environment variable to the" + echo "*** full path to gtk-config." + else + if test -f conf.gtktest ; then + : + else + echo "*** Could not run GTK test program, checking why..." + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + cat > conftest.$ac_ext < +#include + +int main() { + return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); +; return 0; } +EOF +if { (eval echo configure:2143: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GTK or finding the wrong" + echo "*** version of GTK. If it is not finding GTK, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GTK was incorrectly installed" + echo "*** or that you have moved GTK since it was installed. In the latter case, you" + echo "*** may want to edit the gtk-config script: $GTK_CONFIG" +fi +rm -f conftest* + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GTK_CFLAGS="" + GTK_LIBS="" + { echo "configure: error: GTK not installed" 1>&2; exit 1; } + fi + + + rm -f conf.gtktest + + CPPFLAGS="$CPPFLAGS $GTK_CFLAGS" + + saved_ldflags="$LDFLAGS" + LDFLAGS="$LDFLAGS $GTK_LIBS" + + gnome_cv_passdown_x_libs="$GTK_LIBS" + gnome_cv_passdown_X_LIBS="$GTK_LIBS" + gnome_cv_passdown_X_CFLAGS="$GTK_CFLAGS" + gnome_cv_passdown_GTK_LIBS="$GTK_LIBS" + + LDFLAGS="$saved_ldflags $GTK_LIBS" + + USE_DEVGTK=true + + + GNOME_HAVE_SM=true + case "$GTK_LIBS" in + *-lSM*) + ;; + *) + echo $ac_n "checking for SmcSaveYourselfDone in -lSM""... $ac_c" 1>&6 +echo "configure:2202: checking for SmcSaveYourselfDone in -lSM" >&5 +ac_lib_var=`echo SM'_'SmcSaveYourselfDone | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lSM $x_libs -lICE $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + GTK_LIBS="-lSM -lICE $GTK_LIBS" +else + echo "$ac_t""no" 1>&6 +GNOME_HAVE_SM=false +fi + + ;; + esac + + if test "$GNOME_HAVE_SM" = true; then + for ac_hdr in X11/SM/SMlib.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:2250: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2260: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +GNOME_HAVE_SM=false +fi +done + + fi + + if test "$GNOME_HAVE_SM" = true; then + cat >> confdefs.h <<\EOF +#define HAVE_LIBSM 1 +EOF + + fi + + XPM_LIBS="" + echo $ac_n "checking for XpmFreeXpmImage in -lXpm""... $ac_c" 1>&6 +echo "configure:2298: checking for XpmFreeXpmImage in -lXpm" >&5 +ac_lib_var=`echo Xpm'_'XpmFreeXpmImage | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lXpm $x_libs $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + XPM_LIBS="-lXpm" +else + echo "$ac_t""no" 1>&6 +fi + + + + + LDFLAGS="$saved_ldflags" + + + + +ALL_LINGUAS="ca de nl" + + +# Make sure we can run config.sub. +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:2354: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:2377: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:2405: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:2459: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking for inline""... $ac_c" 1>&6 +echo "configure:2480: checking for inline" >&5 +if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_inline=$ac_kw; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done + +fi + +echo "$ac_t""$ac_cv_c_inline" 1>&6 +case "$ac_cv_c_inline" in + inline | yes) ;; + no) cat >> confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >> confdefs.h <&6 +echo "configure:2520: checking for off_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_off_t=yes +else + rm -rf conftest* + ac_cv_type_off_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_off_t" 1>&6 +if test $ac_cv_type_off_t = no; then + cat >> confdefs.h <<\EOF +#define off_t long +EOF + +fi + +echo $ac_n "checking for size_t""... $ac_c" 1>&6 +echo "configure:2553: checking for size_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_size_t=yes +else + rm -rf conftest* + ac_cv_type_size_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_size_t" 1>&6 +if test $ac_cv_type_size_t = no; then + cat >> confdefs.h <<\EOF +#define size_t unsigned +EOF + +fi + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 +echo "configure:2588: checking for working alloca.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int main() { +char *p = alloca(2 * sizeof(int)); +; return 0; } +EOF +if { (eval echo configure:2600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_header_alloca_h=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_alloca_h=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 +if test $ac_cv_header_alloca_h = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_ALLOCA_H 1 +EOF + +fi + +echo $ac_n "checking for alloca""... $ac_c" 1>&6 +echo "configure:2621: checking for alloca" >&5 +if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int main() { +char *p = (char *) alloca(1); +; return 0; } +EOF +if { (eval echo configure:2654: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_func_alloca_works=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_func_alloca_works=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 +if test $ac_cv_func_alloca_works = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_ALLOCA 1 +EOF + +fi + +if test $ac_cv_func_alloca_works = no; then + # The SVR3 libPW and SVR4 libucb both contain incompatible functions + # that cause trouble. Some versions do not even contain alloca or + # contain a buggy version. If you still want to use their alloca, + # use ar to extract alloca.o from them instead of compiling alloca.c. + ALLOCA=alloca.${ac_objext} + cat >> confdefs.h <<\EOF +#define C_ALLOCA 1 +EOF + + +echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 +echo "configure:2686: checking whether alloca needs Cray hooks" >&5 +if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <&5 | + egrep "webecray" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_os_cray=yes +else + rm -rf conftest* + ac_cv_os_cray=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_os_cray" 1>&6 +if test $ac_cv_os_cray = yes; then +for ac_func in _getb67 GETB67 getb67; do + echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2716: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <&6 +fi + +done +fi + +echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 +echo "configure:2771: checking stack direction for C alloca" >&5 +if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat > conftest.$ac_ext < addr) ? 1 : -1; +} +main () +{ + exit (find_stack_direction() < 0); +} +EOF +if { (eval echo configure:2798: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_c_stack_direction=1 +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_c_stack_direction=-1 +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 +cat >> confdefs.h <&6 +echo "configure:2823: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2833: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + +for ac_func in getpagesize +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:2862: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking for working mmap""... $ac_c" 1>&6 +echo "configure:2915: checking for working mmap" >&5 +if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat > conftest.$ac_ext < +#include +#include + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef HAVE_UNISTD_H +# include +# endif + +/* Assume that all systems that can run configure have sys/param.h. */ +# ifndef HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +#ifdef __cplusplus +extern "C" { void *malloc(unsigned); } +#else +char *malloc(); +#endif + +int +main() +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize(); + + /* + * First, make a file with some known garbage in it. + */ + data = malloc(pagesize); + if (!data) + exit(1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand(); + umask(0); + fd = creat("conftestmmap", 0600); + if (fd < 0) + exit(1); + if (write(fd, data, pagesize) != pagesize) + exit(1); + close(fd); + + /* + * Next, try to mmap the file at a fixed address which + * already has something else allocated at it. If we can, + * also make sure that we see the same garbage. + */ + fd = open("conftestmmap", O_RDWR); + if (fd < 0) + exit(1); + data2 = malloc(2 * pagesize); + if (!data2) + exit(1); + data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit(1); + + /* + * Finally, make sure that changes to the mapped area + * do not percolate back to the file as seen by read(). + * (This is a bug on some variants of i386 svr4.0.) + */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = malloc(pagesize); + if (!data3) + exit(1); + if (read(fd, data3, pagesize) != pagesize) + exit(1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit(1); + close(fd); + unlink("conftestmmap"); + exit(0); +} + +EOF +if { (eval echo configure:3063: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_func_mmap_fixed_mapped=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_MMAP 1 +EOF + +fi + + + echo $ac_n "checking whether we are using the GNU C Library 2.1 or newer""... $ac_c" 1>&6 +echo "configure:3087: checking whether we are using the GNU C Library 2.1 or newer" >&5 +if eval "test \"`echo '$''{'ac_cv_gnu_library_2_1'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "Lucky GNU user" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_gnu_library_2_1=yes +else + rm -rf conftest* + ac_cv_gnu_library_2_1=no +fi +rm -f conftest* + + + +fi + +echo "$ac_t""$ac_cv_gnu_library_2_1" 1>&6 + + GLIBC21="$ac_cv_gnu_library_2_1" + + + + for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:3128: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3138: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + for ac_func in feof_unlocked fgets_unlocked getcwd getegid geteuid \ +getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \ +strdup strtoul tsearch __argz_count __argz_stringify __argz_next +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:3169: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3197: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + + + + # Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then + withval="$with_libiconv_prefix" + + for dir in `echo "$withval" | tr : ' '`; do + if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi + if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi + done + +fi + + + echo $ac_n "checking for iconv""... $ac_c" 1>&6 +echo "configure:3237: checking for iconv" >&5 +if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat > conftest.$ac_ext < +#include +int main() { +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); +; return 0; } +EOF +if { (eval echo configure:3255: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + am_cv_func_iconv=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS -liconv" + cat > conftest.$ac_ext < +#include +int main() { +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); +; return 0; } +EOF +if { (eval echo configure:3277: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* + LIBS="$am_save_LIBS" + fi + +fi + +echo "$ac_t""$am_cv_func_iconv" 1>&6 + if test "$am_cv_func_iconv" = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_ICONV 1 +EOF + + echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6 +echo "configure:3298: checking for iconv declaration" >&5 + if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + cat > conftest.$ac_ext < +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif + +int main() { + +; return 0; } +EOF +if { (eval echo configure:3323: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + am_cv_proto_iconv_arg1="" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + am_cv_proto_iconv_arg1="const" +fi +rm -f conftest* + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" +fi + + am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + echo "$ac_t""${ac_t:- + }$am_cv_proto_iconv" 1>&6 + cat >> confdefs.h <&6 +echo "configure:3352: checking for nl_langinfo and CODESET" >&5 +if eval "test \"`echo '$''{'am_cv_langinfo_codeset'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int main() { +char* cs = nl_langinfo(CODESET); +; return 0; } +EOF +if { (eval echo configure:3364: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + am_cv_langinfo_codeset=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + am_cv_langinfo_codeset=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$am_cv_langinfo_codeset" 1>&6 + if test $am_cv_langinfo_codeset = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_LANGINFO_CODESET 1 +EOF + + fi + + if test $ac_cv_header_locale_h = yes; then + echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 +echo "configure:3387: checking for LC_MESSAGES" >&5 +if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int main() { +return LC_MESSAGES +; return 0; } +EOF +if { (eval echo configure:3399: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + am_cv_val_LC_MESSAGES=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + am_cv_val_LC_MESSAGES=no +fi +rm -f conftest* +fi + +echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6 + if test $am_cv_val_LC_MESSAGES = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_LC_MESSAGES 1 +EOF + + fi + fi + echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 +echo "configure:3420: checking whether NLS is requested" >&5 + # Check whether --enable-nls or --disable-nls was given. +if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + USE_NLS=$enableval +else + USE_NLS=yes +fi + + echo "$ac_t""$USE_NLS" 1>&6 + + + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + INTLLIBS= + + if test "$USE_NLS" = "yes"; then + cat >> confdefs.h <<\EOF +#define ENABLE_NLS 1 +EOF + + echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 +echo "configure:3442: checking whether included gettext is requested" >&5 + # Check whether --with-included-gettext or --without-included-gettext was given. +if test "${with_included_gettext+set}" = set; then + withval="$with_included_gettext" + nls_cv_force_use_gnu_gettext=$withval +else + nls_cv_force_use_gnu_gettext=no +fi + + echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6 + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + CATOBJEXT=NONE + + + + + ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 +echo "configure:3462: checking for libintl.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3472: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + echo $ac_n "checking for GNU gettext in libc""... $ac_c" 1>&6 +echo "configure:3489: checking for GNU gettext in libc" >&5 +if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +extern int _nl_msg_cat_cntr; +int main() { +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr +; return 0; } +EOF +if { (eval echo configure:3503: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + gt_cv_func_gnugettext1_libc=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + gt_cv_func_gnugettext1_libc=no +fi +rm -f conftest* +fi + +echo "$ac_t""$gt_cv_func_gnugettext1_libc" 1>&6 + + if test "$gt_cv_func_gnugettext1_libc" != "yes"; then + echo $ac_n "checking for GNU gettext in libintl""... $ac_c" 1>&6 +echo "configure:3519: checking for GNU gettext in libintl" >&5 +if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libintl'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $LIBICONV" + cat > conftest.$ac_ext < +extern int _nl_msg_cat_cntr; +int main() { +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr +; return 0; } +EOF +if { (eval echo configure:3535: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + gt_cv_func_gnugettext1_libintl=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + gt_cv_func_gnugettext1_libintl=no +fi +rm -f conftest* + LIBS="$gt_save_LIBS" +fi + +echo "$ac_t""$gt_cv_func_gnugettext1_libintl" 1>&6 + fi + + if test "$gt_cv_func_gnugettext1_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; then + cat >> confdefs.h <<\EOF +#define HAVE_GETTEXT 1 +EOF + + + if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then + INTLLIBS="-lintl $LIBICONV" + fi + + gt_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + for ac_func in dcgettext +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:3568: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:3596: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + LIBS="$gt_save_LIBS" + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3625: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + echo "$ac_t""$MSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3659: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3696: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if $ac_dir/$ac_word --omit-header /dev/null >/dev/null 2>&1; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + echo "$ac_t""$XGETTEXT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + CATOBJEXT=.gmo + fi + +else + echo "$ac_t""no" 1>&6 +fi + + + if test "$CATOBJEXT" = "NONE"; then + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + INTLOBJS="\$(GETTOBJS)" + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3746: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + echo "$ac_t""$MSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3780: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GMSGFMT" in + /*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GMSGFMT="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT="$ac_cv_path_GMSGFMT" +if test -n "$GMSGFMT"; then + echo "$ac_t""$GMSGFMT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3816: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if $ac_dir/$ac_word --omit-header /dev/null >/dev/null 2>&1; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + echo "$ac_t""$XGETTEXT" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + CATOBJEXT=.gmo + INTLLIBS="\$(top_builddir)/intl/libintl.a $LIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$GMSGFMT" != ":"; then + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1; then + : ; + else + echo "$ac_t""found msgfmt program is not GNU msgfmt; ignore it" 1>&6 + GMSGFMT=":" + fi + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header /dev/null >/dev/null 2>&1; then + : ; + else + echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6 + XGETTEXT=":" + fi + fi + + POSUB=po + fi + + + + if test "$PACKAGE" = gettext; then + BUILD_INCLUDED_LIBINTL=yes + fi + + for ac_prog in bison +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3887: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_INTLBISON'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$INTLBISON"; then + ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_INTLBISON="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +INTLBISON="$ac_cv_prog_INTLBISON" +if test -n "$INTLBISON"; then + echo "$ac_t""$INTLBISON" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$INTLBISON" && break +done + + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + echo $ac_n "checking version of bison""... $ac_c" 1>&6 +echo "configure:3920: checking version of bison" >&5 + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + echo "$ac_t""$ac_prog_version" 1>&6 + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi + + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + + + + + + + + + + + nls_cv_header_intl= + nls_cv_header_libgt= + + DATADIRNAME=share + + + INSTOBJEXT=.mo + + + GENCAT=gencat + + + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 +echo "configure:3967: checking for catalogs to be installed" >&5 + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + for desiredlang in ${LINGUAS-$ALL_LINGUAS}; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + echo "$ac_t""$LINGUAS" 1>&6 + fi + + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + INTL_LIBTOOL_SUFFIX_PREFIX= + + + +if test "x${prefix}" = "xNONE"; then + cat >> confdefs.h <> confdefs.h <&6 +echo "configure:4023: checking for gpiv_error in -lgpiv" >&5 +ac_lib_var=`echo gpiv'_'gpiv_error | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lgpiv $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo gpiv | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +{ echo "configure: error: "libgpiv has not been installed"" 1>&2; exit 1; } +fi + +echo $ac_n "checking for rfftw2d_create_plan in -lrfftw""... $ac_c" 1>&6 +echo "configure:4071: checking for rfftw2d_create_plan in -lrfftw" >&5 +ac_lib_var=`echo rfftw'_'rfftw2d_create_plan | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lrfftw $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo rfftw | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +{ echo "configure: error: "librfftw not installed"" 1>&2; exit 1; } +fi + +echo $ac_n "checking for fftw_import_wisdom_from_string in -lfftw""... $ac_c" 1>&6 +echo "configure:4119: checking for fftw_import_wisdom_from_string in -lfftw" >&5 +ac_lib_var=`echo fftw'_'fftw_import_wisdom_from_string | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lfftw $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo fftw | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +{ echo "configure: error: "libfftw not installed"" 1>&2; exit 1; } +fi + + + +ac_safe=`echo "gpiv.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for gpiv.h""... $ac_c" 1>&6 +echo "configure:4170: checking for gpiv.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:4180: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +{ echo "configure: error: "giv.h is not installed"" 1>&2; exit 1; } +fi + +for ac_hdr in stdlib.h string.h unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:4206: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:4216: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + + + +# Check whether --enable-img-width or --disable-img-width was given. +if test "${enable_img_width+set}" = set; then + enableval="$enable_img_width" + OVERRIDE_IMAGE_WIDTH_MAX="-DIMAGE_WIDTH_MAX=$enableval" + +fi + + + + +# Check whether --enable-img-height or --disable-img-height was given. +if test "${enable_img_height+set}" = set; then + enableval="$enable_img_height" + OVERRIDE_IMAGE_HEIGHT_MAX="-DIMAGE_HEIGHT_MAX=$enableval" + +fi + + + + +# Check whether --enable-debug or --disable-debug was given. +if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + DEBUG="-DDEBUG" + +fi + + + + +# Check whether --enable-demo or --disable-demo was given. +if test "${enable_demo+set}" = set; then + enableval="$enable_demo" + DEMO="-DDEMO" + +fi + + + + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo " + Makefile + macros/Makefile + doc/Makefile + doc/C/Makefile + doc/C/figures/Makefile + src/Makefile + intl/Makefile + po/Makefile.in + config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@PACKAGE@%$PACKAGE%g +s%@VERSION@%$VERSION%g +s%@ACLOCAL@%$ACLOCAL%g +s%@AUTOCONF@%$AUTOCONF%g +s%@AUTOMAKE@%$AUTOMAKE%g +s%@AUTOHEADER@%$AUTOHEADER%g +s%@MAKEINFO@%$MAKEINFO%g +s%@SET_MAKE@%$SET_MAKE%g +s%@INSIDE_GNOME_COMMON_TRUE@%$INSIDE_GNOME_COMMON_TRUE%g +s%@INSIDE_GNOME_COMMON_FALSE@%$INSIDE_GNOME_COMMON_FALSE%g +s%@GNOME_LIBS@%$GNOME_LIBS%g +s%@GNOMEUI_LIBS@%$GNOMEUI_LIBS%g +s%@GNOMEGNORBA_LIBS@%$GNOMEGNORBA_LIBS%g +s%@GTKXMHTML_LIBS@%$GTKXMHTML_LIBS%g +s%@ZVT_LIBS@%$ZVT_LIBS%g +s%@GNOME_LIBDIR@%$GNOME_LIBDIR%g +s%@GNOME_INCLUDEDIR@%$GNOME_INCLUDEDIR%g +s%@GNOME_CONFIG@%$GNOME_CONFIG%g +s%@ORBIT_CONFIG@%$ORBIT_CONFIG%g +s%@ORBIT_IDL@%$ORBIT_IDL%g +s%@HAVE_ORBIT_TRUE@%$HAVE_ORBIT_TRUE%g +s%@HAVE_ORBIT_FALSE@%$HAVE_ORBIT_FALSE%g +s%@ORBIT_CFLAGS@%$ORBIT_CFLAGS%g +s%@ORBIT_LIBS@%$ORBIT_LIBS%g +s%@HAVE_GNORBA_TRUE@%$HAVE_GNORBA_TRUE%g +s%@HAVE_GNORBA_FALSE@%$HAVE_GNORBA_FALSE%g +s%@GNORBA_CFLAGS@%$GNORBA_CFLAGS%g +s%@GNORBA_LIBS@%$GNORBA_LIBS%g +s%@GNOME_APPLETS_LIBS@%$GNOME_APPLETS_LIBS%g +s%@GNOME_DOCKLETS_LIBS@%$GNOME_DOCKLETS_LIBS%g +s%@GNOME_CAPPLET_LIBS@%$GNOME_CAPPLET_LIBS%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@cflags_set@%$cflags_set%g +s%@GTK_CONFIG@%$GTK_CONFIG%g +s%@GTK_CFLAGS@%$GTK_CFLAGS%g +s%@GTK_LIBS@%$GTK_LIBS%g +s%@XPM_LIBS@%$XPM_LIBS%g +s%@PTHREAD_LIB@%$PTHREAD_LIB%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@RANLIB@%$RANLIB%g +s%@ALLOCA@%$ALLOCA%g +s%@GLIBC21@%$GLIBC21%g +s%@LIBICONV@%$LIBICONV%g +s%@USE_NLS@%$USE_NLS%g +s%@MSGFMT@%$MSGFMT%g +s%@GMSGFMT@%$GMSGFMT%g +s%@XGETTEXT@%$XGETTEXT%g +s%@INTLBISON@%$INTLBISON%g +s%@BUILD_INCLUDED_LIBINTL@%$BUILD_INCLUDED_LIBINTL%g +s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g +s%@CATALOGS@%$CATALOGS%g +s%@CATOBJEXT@%$CATOBJEXT%g +s%@GMOFILES@%$GMOFILES%g +s%@INTLLIBS@%$INTLLIBS%g +s%@INTLOBJS@%$INTLOBJS%g +s%@POFILES@%$POFILES%g +s%@POSUB@%$POSUB%g +s%@DATADIRNAME@%$DATADIRNAME%g +s%@INSTOBJEXT@%$INSTOBJEXT%g +s%@GENCAT@%$GENCAT%g +s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g +s%@INTL_LIBTOOL_SUFFIX_PREFIX@%$INTL_LIBTOOL_SUFFIX_PREFIX%g +s%@PACKAGE_PIXMAPS_DIR@%$PACKAGE_PIXMAPS_DIR%g +s%@OVERRIDE_IMAGE_WIDTH_MAX@%$OVERRIDE_IMAGE_WIDTH_MAX%g +s%@OVERRIDE_IMAGE_HEIGHT_MAX@%$OVERRIDE_IMAGE_HEIGHT_MAX%g +s%@DEBUG@%$DEBUG%g +s%@DEMO@%$DEMO%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h +for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," -e "\$s/\(.*\) \\\\/\1/" < "$ac_given_srcdir/$ac_dir/POTFILES.in" > "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/POTFILES =/r $ac_dir/POTFILES" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + fi + ;; + esac + done + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..7bcce6c --- /dev/null +++ b/configure.in @@ -0,0 +1,93 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(configure.in) +AM_INIT_AUTOMAKE(gpiv, 0.1.0) +AM_CONFIG_HEADER(config.h) + +dnl Pick up the Gnome macros. +AM_ACLOCAL_INCLUDE(macros) + +GNOME_INIT +AC_ISC_POSIX +AC_PROG_CC +AM_PROG_CC_STDC +AC_HEADER_STDC + +GNOME_COMPILE_WARNINGS +GNOME_X_CHECKS + +dnl Add the languages which your application supports here. +ALL_LINGUAS="ca de nl" + +dnl gnu gettext (intl directory) is old see http://developer.gnome.org/doc/tutorials/import.html +AM_GNU_GETTEXT +dnl AM_GNOME_GETTEXT + +dnl Set PACKAGE_LOCALE_DIR in config.h. +if test "x${prefix}" = "xNONE"; then + AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale") +else + AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale") +fi + +dnl Subst PACKAGE_PIXMAPS_DIR. +PACKAGE_PIXMAPS_DIR="`gnome-config --datadir`/pixmaps/${PACKAGE}" +AC_SUBST(PACKAGE_PIXMAPS_DIR) + +AC_CHECK_LIB(gpiv, gpiv_error, , + AC_MSG_ERROR("libgpiv has not been installed")) +dnl AC_CHECK_LIB(gpiv, gpiv_scan_resourcefiles, , +dnl AC_MSG_ERROR("libgpiv has not been installed")) +AC_CHECK_LIB(rfftw, rfftw2d_create_plan, , + AC_MSG_ERROR("librfftw not installed")) +AC_CHECK_LIB(fftw, fftw_import_wisdom_from_string, , + AC_MSG_ERROR("libfftw not installed")) + + +AC_CHECK_HEADER(gpiv.h,,AC_MSG_ERROR("giv.h is not installed")) +AC_CHECK_HEADERS([stdlib.h string.h unistd.h]) + + + +AC_ARG_ENABLE(img-width, + [ --enable-img-width=WIDTH maximum image width to \ +be used (default SVGA)], + [OVERRIDE_IMAGE_WIDTH_MAX="-DIMAGE_WIDTH_MAX=$enableval"] + ) +AC_SUBST(OVERRIDE_IMAGE_WIDTH_MAX) + + +AC_ARG_ENABLE(img-height, + [ --enable-img-height=HEIGHT maximum image height to \ +be used (default SVGA)], + [OVERRIDE_IMAGE_HEIGHT_MAX="-DIMAGE_HEIGHT_MAX=$enableval"] + ) +AC_SUBST(OVERRIDE_IMAGE_HEIGHT_MAX) + + +AC_ARG_ENABLE(debug, + [ --enable-debug debug version (more verbose)], + [DEBUG="-DDEBUG"] + ) +AC_SUBST(DEBUG) + + +AC_ARG_ENABLE(demo, + [ --enable-demo behaves as a \"true\" commercial \ +demonstration program: doesn't allow to save data ;)], + [DEMO="-DDEMO"] + ) +AC_SUBST(DEMO) + + + +AC_OUTPUT([ + Makefile + macros/Makefile + doc/Makefile + doc/C/Makefile + doc/C/figures/Makefile + src/Makefile + intl/Makefile + po/Makefile.in +]) diff --git a/doc/C/Makefile.am b/doc/C/Makefile.am new file mode 100644 index 0000000..61219a9 --- /dev/null +++ b/doc/C/Makefile.am @@ -0,0 +1,112 @@ + +SUBDIRS = figures + +gpiv_helpdir = $(datadir)/gnome/help/gpiv/C + +gpiv_help_DATA = \ + index.html \ + intro.html \ + gpiv.html \ + piv_intro.html \ + batch-gpiv.html \ + errvec.html \ + flip.html \ + hilo.html \ + manipiv.html \ + peaklck.html \ + rr.html \ + s-avg.html \ + scale.html \ + t-avg.html \ + vorstra.html \ + topic.dat + +#EXTRA_DIST = $(gpiv_help_DATA) + +## +##SGML_FILES = \ +## gpiv.sgml + +# files that aren't in a binary/data/library target have to be listed here +# to be included in the tarball when you 'make dist' +##EXTRA_DIST = \ +## topic.dat +## $(SGML_FILES) + + +## The - before the command means to ignore it if it fails. that way +## people can still build the software without the docbook tools + +all: + +#index.html: index.html +# -cp index.html . + +#intro.html: intro.html +# -cp intro.html . + +#gpiv.html: gpiv.html +# -cp gpiv/gpiv.html . + +#piv_intro.html: gpiv/piv_intro.html +# -cp piv_intro.html . + +#batch-gpiv.html: gpiv/batch-gpiv.html +# -cp gpiv/batch-gpiv.html . + +#errvec.html: gpiv/errvec.html +# -cp gpiv/errvec.html . + +#flip.html: gpiv/flip.html +# -cp gpiv/flip.html . + +#hilo.html: gpiv/hilo.html +# -cp gpiv/hilo.html . + +#manipiv.html: gpiv/manipiv.html +# -cp gpiv/manipiv.html . + +#peaklck.html: gpiv/peaklck.html +# -cp gpiv/peaklck.html . + +#rr.html: gpiv/rr.html +# -cp gpiv/rr.html . + +#s-avg.html: gpiv/s-avg.html +# -cp gpiv/s-avg.html . + +#scale.html: gpiv/scale.html +# -cp gpiv/scale.html . + +#t-avg.html: gpiv/t-avg.html +# -cp gpiv/t-avg.html . + +#vorstra.html: gpiv/vorstra.html +# -cp gpiv/vorstra.html . + + +##gpiv/gpiv.html: $(SGML_FILES) +## -db2html gpiv.sgml + +## when we make dist, we include the generated HTML so people don't +## have to have the docbook tools +dist-hook: + -cp *.html $(distdir) + -cp *.dat $(distdir) +# mkdir $(distdir)/gpiv +# -cp gpiv/*.html gpiv/*.css $(distdir)/gpiv +# -cp gpiv.html $(distdir) + +#install-data-local: gpiv.html +# $(mkinstalldirs) $(gpiv_helpdir)/images +# -for file in $(srcdir)/gpiv/*.html $(srcdir)/gpiv/*.css; do \ +# basefile=`basename $$file`; \ +# $(INSTALL_DATA) $(srcdir)/$$file $(gpiv_helpdir)/$$basefile; \ +# done + +##gpiv.ps: gpiv.sgml +## -db2ps $< + +##gpiv.rtf: gpiv.sgml +## -db2rtf $< + diff --git a/doc/C/Makefile.in b/doc/C/Makefile.in new file mode 100644 index 0000000..c7170f6 --- /dev/null +++ b/doc/C/Makefile.in @@ -0,0 +1,417 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = ../.. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +DATADIRNAME = @DATADIRNAME@ +DEBUG = @DEBUG@ +DEMO = @DEMO@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@ +GNOMEUI_LIBS = @GNOMEUI_LIBS@ +GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@ +GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@ +GNOME_CONFIG = @GNOME_CONFIG@ +GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@ +GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@ +GNOME_LIBDIR = @GNOME_LIBDIR@ +GNOME_LIBS = @GNOME_LIBS@ +GNORBA_CFLAGS = @GNORBA_CFLAGS@ +GNORBA_LIBS = @GNORBA_LIBS@ +GTKXMHTML_LIBS = @GTKXMHTML_LIBS@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIBICONV = @LIBICONV@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +ORBIT_CFLAGS = @ORBIT_CFLAGS@ +ORBIT_CONFIG = @ORBIT_CONFIG@ +ORBIT_IDL = @ORBIT_IDL@ +ORBIT_LIBS = @ORBIT_LIBS@ +OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ +OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ +PACKAGE = @PACKAGE@ +PACKAGE_PIXMAPS_DIR = @PACKAGE_PIXMAPS_DIR@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PTHREAD_LIB = @PTHREAD_LIB@ +RANLIB = @RANLIB@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XPM_LIBS = @XPM_LIBS@ +ZVT_LIBS = @ZVT_LIBS@ +cflags_set = @cflags_set@ +cxxflags_set = @cxxflags_set@ + +SUBDIRS = figures + +gpiv_helpdir = $(datadir)/gnome/help/gpiv/C + +gpiv_help_DATA = index.html intro.html gpiv.html piv_intro.html batch-gpiv.html errvec.html flip.html hilo.html manipiv.html peaklck.html rr.html s-avg.html scale.html t-avg.html vorstra.html topic.dat + +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../../config.h +CONFIG_CLEAN_FILES = +DATA = $(gpiv_help_DATA) + +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/C/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-gpiv_helpDATA: $(gpiv_help_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(gpiv_helpdir) + @list='$(gpiv_help_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(gpiv_helpdir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(gpiv_helpdir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(gpiv_helpdir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(gpiv_helpdir)/$$p; \ + fi; fi; \ + done + +uninstall-gpiv_helpDATA: + @$(NORMAL_UNINSTALL) + list='$(gpiv_help_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(gpiv_helpdir)/$$p; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = doc/C + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +install-exec-am: +install-exec: install-exec-recursive + +install-data-am: install-gpiv_helpDATA +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: uninstall-gpiv_helpDATA +uninstall: uninstall-recursive +all-am: Makefile $(DATA) +all-redirect: all-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(gpiv_helpdir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-tags clean-generic mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-tags distclean-generic clean-am + +distclean: distclean-recursive + +maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + +.PHONY: uninstall-gpiv_helpDATA install-gpiv_helpDATA \ +install-data-recursive uninstall-data-recursive install-exec-recursive \ +uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ +all-recursive check-recursive installcheck-recursive info-recursive \ +dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-redirect all-am all installdirs-am \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +#EXTRA_DIST = $(gpiv_help_DATA) + +# files that aren't in a binary/data/library target have to be listed here +# to be included in the tarball when you 'make dist' + +all: + +#index.html: index.html +# -cp index.html . + +#intro.html: intro.html +# -cp intro.html . + +#gpiv.html: gpiv.html +# -cp gpiv/gpiv.html . + +#piv_intro.html: gpiv/piv_intro.html +# -cp piv_intro.html . + +#batch-gpiv.html: gpiv/batch-gpiv.html +# -cp gpiv/batch-gpiv.html . + +#errvec.html: gpiv/errvec.html +# -cp gpiv/errvec.html . + +#flip.html: gpiv/flip.html +# -cp gpiv/flip.html . + +#hilo.html: gpiv/hilo.html +# -cp gpiv/hilo.html . + +#manipiv.html: gpiv/manipiv.html +# -cp gpiv/manipiv.html . + +#peaklck.html: gpiv/peaklck.html +# -cp gpiv/peaklck.html . + +#rr.html: gpiv/rr.html +# -cp gpiv/rr.html . + +#s-avg.html: gpiv/s-avg.html +# -cp gpiv/s-avg.html . + +#scale.html: gpiv/scale.html +# -cp gpiv/scale.html . + +#t-avg.html: gpiv/t-avg.html +# -cp gpiv/t-avg.html . + +#vorstra.html: gpiv/vorstra.html +# -cp gpiv/vorstra.html . + +dist-hook: + -cp *.html $(distdir) + -cp *.dat $(distdir) +# mkdir $(distdir)/gpiv +# -cp gpiv/*.html gpiv/*.css $(distdir)/gpiv +# -cp gpiv.html $(distdir) + +#install-data-local: gpiv.html +# $(mkinstalldirs) $(gpiv_helpdir)/images +# -for file in $(srcdir)/gpiv/*.html $(srcdir)/gpiv/*.css; do \ +# basefile=`basename $$file`; \ +# $(INSTALL_DATA) $(srcdir)/$$file $(gpiv_helpdir)/$$basefile; \ +# done + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/C/batch-gpiv.html b/doc/C/batch-gpiv.html new file mode 100644 index 0000000..8e17374 --- /dev/null +++ b/doc/C/batch-gpiv.html @@ -0,0 +1,65 @@ + + +
+
+[\fB-dl\fR | \fB--last_dir \fIN\fR]
+[\fB-fb\fR | \fB--file_name \fIfile base-name\fR] 
+[\fB-ff\fR | \fB--first_file \fIN\fR]
+[\fB-fl\fR | \fB--last_file \fIN\fR]
+[\fB-h\fR | \fB--help\fR] 
+[\fB-n\fR | \fB--none\fR] 
+[\fB-p\fR | \fB--print\fR] 
+[\fB-v\fR | \fB--version\fR] 
+\fIprocess\fR
+.SH DESCRIPTION
+
+\fBbatch-gpiv\fP processes a \fBseries\fR of files in an identical
+way. If no parameters are defined at the command line, standard
+parameters will be used that are defined in the script. Actually, any
+program or script can be invoked by \fBbatch-gpiv\fP. In contrast to
+the UNIX* program batch, this script executes in foreground and does
+not schedule its priority."\fIprocess\fR" is string which contains the
+name of program to be executed, including eventually command line
+options and arguments. The filename to be processed, as defined with
+-fb c.s., will be appended to the string. If the program needs -f
+"filename", write -f at the end of the string.
+
+.SH Options 
+.TP
+\fB-dn [--dir_name] \fIdir base-name\fR
+The \fIdir base-name\fR represents the directory name without its last number. It is supposed that the last number in the directory name is a counter.
+.TP
+\fB-fd [--first_dir] \fIN\fR
+Defines the counter \fIN\fR of the first directory number at which the analyses starts.
+.TP
+\fB-ld [--last_dir] \fIN\fR
+Last directory number \fIN\fR at which the analyses ends.
+.TP
+\fB-fn [--file_name] \fIfile base-name\fR
+The \fIfilename\fR has to be given without its \fB.piv\fR
+extension. The \fIfile base-name\fR represents the file name without
+its last number, before the extension. It is supposed that the last
+number in the file name is a counter.
+.TP
+\fB-ff [--first_file] \fIN\fR
+Defines the counter \fIN\fR of first file number at which the analyses starts.
+.TP
+\fB-lf [--last_file] \fIN\fR
+Last file number \fIN\fR at which the analyses ends.
+.TP
+\fB-h [--help] \fP
+On-line help.
+.TP
+\fB-n [--none] \fP
+Suppresses real execution.
+.TP
+\fB-p [--print] \fP
+The program has been tested for PIV data. So far, it works fine.
+
+
+
+Man(1) output converted with +man2html +
+ + diff --git a/doc/C/errvec.html b/doc/C/errvec.html new file mode 100644 index 0000000..7e19048 --- /dev/null +++ b/doc/C/errvec.html @@ -0,0 +1,125 @@ +Manpage of + +Name: ERRVEC
+Section: User Commands (1) +
+ +   +

NAME

+ +errvec - Searches erroneous vectors in a PIV data file and substitutes +with new values. +   +

SYNOPSIS

+ +

+errvec [-f filename] +[-h][-p] [-b || --b] [-bn N] [-g][-h] +[-r N] [-s N] [-t F] [-ta] [-v] < stdin > stdout +

+ +

+   +

DESCRIPTION

+ +

+errvec searches erroneous outliers in a PIV data stream and +substitutes with new values, if possible, i.e. if (the majority) of its +surroundings are non-erroneous. Evaluation of erroneous vectors is +done by looking up the Signal to Noise Ratio (SNR) value in the PIV +data file or by calculating the median residu of the vector with its +surroundings. A new displacement is obtained by the mean value of the +surrounding values or by the x-and y displacements belonging to the +median value or by the location of the next higher peak in the +covariance function. The latter needs the use of rr. +

+The parameters and options to be used for errvec are +subsequently searched errvec.par at local directory at +~/.gpivrc or at/etc/gpivrc. Each parameter is +described by the program key (Err_V) +and the parameter name, separated by a dot (.), followed by its +value. Some of the parameters are optional. The parameters may be +defined in arbitrary order. Blank lines and comment (starting with a +pound sign (#) at the first column) may be included in the parameter +files. The parameters may be overruled by the command line options, +as explained below. +

+   +

Options

+ +
+
-b N
+Calculate statistics of the median residues and print a histogram of +N bins. +
-f filename
+Overrides stdin and stdout with filename. The filename has to be +given without its .piv extension. Output will be written to +filename.erv.piv. The parameters will be written or appended +to filename.par. Other files, like image header file +filename.h and raw data file(s) filename.1.r and +filename.1.r (in case of cross-correlation) or +filename.r (in case of auto-correlation) are needed if a +particle displacement will have to be estimated by rr. +
-g
+Graphical visualization of residu statistcs with gnuplot. +
-h
+On-line help. +
-p
+Print parameters, command line options and eventually used input and +output filenames to stdout. The output may be used as parameters of +errvec for future use by re-directing stdout to +errvec.par. +
-r N
+Erroneous vector determined by SNR of the covariance function +(N = 0) or median residu (N = 1). +
-s N
+Substitution of the erroneous vectors by the mean of +the surrounding values +(N = 0), median (N = 1) or next highest covariance peak +(N = 2). +
-t F
+Threshhold value F of SNR or median residu to +determine validity of particle displacement. +
-ta
+Automatic threshold; calculates threshhold value from residu histogram. +
-v
+Print version information on standard output, then exit successfully. +
+   +

SEE ALSO

+ +batch-gp, dav2piv, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+   +

NOTES

+ +stdin and stdout has still to be implemented. +[-f filename ] will be added. +

+   +

AUTHOR

+ +Gerber Van der Graaf +

+   +

BUGS

+ +The program has been tested for artifical generated DPIV images. So far, no +serious bugs have been found. +

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/figures/Makefile.am b/doc/C/figures/Makefile.am new file mode 100644 index 0000000..cee3be6 --- /dev/null +++ b/doc/C/figures/Makefile.am @@ -0,0 +1,16 @@ + +gpiv_figdir = $(datadir)/gnome/help/gpiv/C/figures + +gpiv_fig_DATA = \ + gpiv-fig1.png \ + gpiv-fig2.png \ + gpiv-fig3.png \ + gpiv-fig4.png \ + gpiv-fig5.png + +dist-hook: + -cp *.png $(distdir) + -cp *.xpm $(distdir) + +all: + diff --git a/doc/C/figures/Makefile.in b/doc/C/figures/Makefile.in new file mode 100644 index 0000000..09eb299 --- /dev/null +++ b/doc/C/figures/Makefile.in @@ -0,0 +1,251 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = ../../.. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +DATADIRNAME = @DATADIRNAME@ +DEBUG = @DEBUG@ +DEMO = @DEMO@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@ +GNOMEUI_LIBS = @GNOMEUI_LIBS@ +GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@ +GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@ +GNOME_CONFIG = @GNOME_CONFIG@ +GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@ +GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@ +GNOME_LIBDIR = @GNOME_LIBDIR@ +GNOME_LIBS = @GNOME_LIBS@ +GNORBA_CFLAGS = @GNORBA_CFLAGS@ +GNORBA_LIBS = @GNORBA_LIBS@ +GTKXMHTML_LIBS = @GTKXMHTML_LIBS@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIBICONV = @LIBICONV@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +ORBIT_CFLAGS = @ORBIT_CFLAGS@ +ORBIT_CONFIG = @ORBIT_CONFIG@ +ORBIT_IDL = @ORBIT_IDL@ +ORBIT_LIBS = @ORBIT_LIBS@ +OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ +OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ +PACKAGE = @PACKAGE@ +PACKAGE_PIXMAPS_DIR = @PACKAGE_PIXMAPS_DIR@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PTHREAD_LIB = @PTHREAD_LIB@ +RANLIB = @RANLIB@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XPM_LIBS = @XPM_LIBS@ +ZVT_LIBS = @ZVT_LIBS@ +cflags_set = @cflags_set@ +cxxflags_set = @cxxflags_set@ + +gpiv_figdir = $(datadir)/gnome/help/gpiv/C/figures + +gpiv_fig_DATA = gpiv-fig1.png gpiv-fig2.png gpiv-fig3.png gpiv-fig4.png gpiv-fig5.png + +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../../../config.h +CONFIG_CLEAN_FILES = +DATA = $(gpiv_fig_DATA) + +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/C/figures/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-gpiv_figDATA: $(gpiv_fig_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(gpiv_figdir) + @list='$(gpiv_fig_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(gpiv_figdir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(gpiv_figdir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(gpiv_figdir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(gpiv_figdir)/$$p; \ + fi; fi; \ + done + +uninstall-gpiv_figDATA: + @$(NORMAL_UNINSTALL) + list='$(gpiv_fig_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(gpiv_figdir)/$$p; \ + done +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = doc/C/figures + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-gpiv_figDATA +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-gpiv_figDATA +uninstall: uninstall-am +all-am: Makefile $(DATA) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(gpiv_figdir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: uninstall-gpiv_figDATA install-gpiv_figDATA tags distdir info-am \ +info dvi-am dvi check check-am installcheck-am installcheck \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +dist-hook: + -cp *.png $(distdir) + -cp *.xpm $(distdir) + +all: + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/C/figures/gpiv-5.png b/doc/C/figures/gpiv-5.png new file mode 100644 index 0000000000000000000000000000000000000000..a53bd15450b93f8120a46bf2fb506b3218de99b0 GIT binary patch literal 609 zcwPZv0-pVeP)J*s0000QbVXQnQ*UN;cVTj6 z07p(wO+_F{V{dLCMPzAoZ*rb03TyxX0n$lCK~#90?U`+g!ypibw~kF{VISx8RO zK#?ZUW0~`0e=M^M){jxgh>#Zwf!NOTjx$D6A=NnatdG_Jr8*6?)@h)%P6Msgy@AWo z0e`-~cFMTN^Cc+b4lzK5&QUc3K4@xYsbV+a0_TRtVr^m@{_%VX7yP1UwvrNDyHN~} zp>5ck8sF~S)F|+EN?ev1@WEpsAGm95NQ<6#_zXi~4}`#N*xa)5eGklL8=$~LpheHS zFT0`pE_i!fmH{e!jxaR9hWewZgedUT(g{I^dLwxig6x-O-j(SbCCxx7JQp-p^}SFH zXsjv*YC~gHF;E*Ci~J~GMam8i}nBnlWG#iY;S>J7O2^e!KXfB*jFJ} zN%{JNhUGd4Re37`qCl3O?%0;m(v0SQzx%h-rvVO?l;7e14}iFy v#LZ`*wE3GGC{_0cn)LwJleqgC=-$9D=>0q6LSYd500000NkvXXu0mjfn@$ZL literal 0 HcwPel00001 diff --git a/doc/C/figures/gpiv-fig1.png b/doc/C/figures/gpiv-fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..fef8d1f07c66f6e7af3eaf9a1b5f40b00c211187 GIT binary patch literal 219082 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%0Ai#}?wPD`C_CFm&F%yLhUeWS6>D)YH?; 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 z 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
6w}zPfNyZ(V3j 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%0A`yf=Ip1#a2uV#`}8FT(7)abTdS=V)+yh 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 literal 0 HcwPel00001 diff --git a/doc/C/figures/gpiv-fig2.png b/doc/C/figures/gpiv-fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..3a65c1c121ff50b762c1f758817dac644878f525 GIT binary patch literal 18388 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 GGywoOweU*- literal 0 HcwPel00001 diff --git a/doc/C/figures/gpiv-fig3.png b/doc/C/figures/gpiv-fig3.png new file mode 100644 index 0000000000000000000000000000000000000000..ddbde287d4a346328a02f4485a893040cc366553 GIT binary patch literal 22431 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 Pw*yQKEwCjR7vg^arvSg# literal 0 HcwPel00001 diff --git a/doc/C/figures/gpiv-fig4.png b/doc/C/figures/gpiv-fig4.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0ffb3c84d044d5678af8ef29181923b1cad7b8 GIT binary patch literal 20609 zcwVHs1yoyI+bz0*3epw|#S0X7DNra*ai;{=6f5pfoIs0f@!}L3DDGYer8tE^aWC$! zfrOmA-}j&Y+&j*H&pqefjFF5r_IP%(*P3(9XU^;$^;SdiF+LSO0057bmE=GGfGv!9 z2jF63j>Jup>jA(EKw0jMj!*W%qVEqT>%eVvv7gxdKIfw>Hh#~#N0HR;S#rNe;hBw6 zqjq@5@~*bjgQ!M^H;3U$1)IHW_QV%AL++czP5va#WF+?=dF#pR(zv}qsB@eRP2gx_&mIQig%R8VY(~dluL+MAp zEc%(bym{d2@H7c8zNXhFGaJS{lIS10V{KS~U#ztuB4DZUprb=_tE@j=ZC=Qsw=>v! zrX>s!=I0dT`mSf8%TY3qTxO=xY5qfv!S4Y4r{OR`o}fR zI&7Qvaip`2IYS%nE!oUPH#bwWjqO%E>#=Xl=fb~JhMQ-;uh6UGDyyo33#!|cu;%)# zHqJY@T}&B=jiufNahKgiVQtd_44p*6%vM3 zzb%6g^Uif`9~}u7lh4<>fOWXew;r99y2G^C4gy!#e@W%Qtj41Q(5ELh8Ub5BqZ}#? zgaiczg@va#L0G|?*%af;%Pxj`g-O}jBKBM4kAL;U4Z;nns0{S_safOc`qRV7$jCy8 z!p+yue7Dd>74I`Qf3KgAaz13q6{}hK{Yo+6Ik>|y$1by>N2cP~B8EAA=;GqSFfA1< z_@31!eLswOJTu44q`l}xc`^#&b=GSlnO8NvM?gT(Vxocj^7ZTO@}7aOe>q`9GG9=L z%=YTHRe8c+z%3T87p1F%)?r^mIsz(RO9*@0yEnqQvJLpo!gbk5-;?iMAbe%ljoQG0 zyPFH6pWS*ha0FCa0w0p8qIx{w;Fs;q)kmEJ8xB*>q7M00U_k}}pwrwi&DyZR$m!j? z&c*{q#rXYY802t$VZSTt>m-iDbheaW^LyuaZnJM8CDj%sjqeQ8h%DZ{dyzhbIWKdw z`(Lm1l9s5#K4C{HQTI~G*RQLsXxS;t!f)bwjD~lZ9PTwD5QtgJWD?d~-^0uS17Z+lwnD>|iqs!>PZ2^T*ekT$Vc?(gjo-Rpj0bB(uI} z(aUK-Ldk!eMC+S+EvX9eWL#Lw;>bJ_N~?8hGpo{6Q(N#}4ona~?O(~uc`b^l6BzLw zKx~;JcBf6;rbIq*J}Cd#P|LC#*J(-7yRfiuhq{Fv7v4h7Kjr0$`|kc-X}56{zs*i} z3|h;I(9F1n8wP6B7;rtqZ**$o1w;-wR^mZkXFd25E*DWfevq#&h`H6;SD&=cSZV#& zLn7$>-Ys_o_H>Q5Y~?}_WlPPD!@US?ZPxep(4W??w5SDTD_P_b5mNrY&=;)UtOk5} zS!NyOY-DLqG-Fy!f`)5NoP%zzOS0{_#5|yhaOyLHx(9FY0gWw_$HX$?xBGQX3+_YX zno{i_4(6l~+xC{OziJRYRS;C47|dH--)B4{OGsUFa;l?#U6I}Y#CD7? ze2VKxSoI>gm=>}gvE07b7$qykxgPV%(rtNQCt1;E$@9YaVW|0UI0eGwXYKC$E?OA) zw%>GsjBB$3RFYC=7!j{Nl3{UhnracWyRB9Do^<-rhWdCV_mqmrQ7{3p?N(%$rUDHM z3$yHtrxEqEwYRrl>y6`#BQ2^XKMl($ta})L1lvx+@KBZDOrfOS`Q1Bd+_C9t{jy0G z7M9EXSr6p(iF*rj>?#V16re*Mq@xd(@AgmV(8sIXoK?;1yRwRxd6Td)J5`YtjJ|*J zzuXr=bPqt<+m6R?pWGcchAdNNyx!|d|8X>Z^y9kgt7@gsIEI`tJ*%f1Lr&8(Ey0Z` zJJFy51EYHTSLSMyn<`LJf7&3c%j1>Qo@|PK&FONG8{)Ju;ch>|fp_79*TpRB&F|Tb zK%308rrFa5xXD3)&(=j#8%(H3kfjy&Am~Yb^A|B~wUH_EC)sQpo4<8clRZ!t%QAuH zb}PTTs62wqaBJ9X)v!A4$Q(RyhSF)W#J!N$1G2Z5c}<70T~XR+2$0)J%TH(rG{de= z2YIq4Iwtjoi##co;;~KwFJVz*K=lWzVIXM|FdAr}sy~o=7hNu ztmztRnFz+qu4t)i-ZOtqb<{X4N8czNvUz=elhI=_MkMnaKJrZEOglz%m|7FH0twv8 ze%<{3E8N7O!vL);A$3)`H-g-9L3--C*`98P3=9b9RTwdcy7m%@>er1JHQhLfEg?t# zNNhO`90mUEjzgb49&!(ih|k9839Cl-m)zVBiY!lO(`p^Mh%PW9oTo<4>xUTJy)LRk zACbVWau;?}*Sd^Y@Ht&>70}5ERqWvU_ipdqXZh!A^=9=3>KGR&Me|VF6H>R6v0==0 zR=jf;J~aqHqDmAcxpp&5ajdCnTY?^#F;TNUx}P*qix!5tUO(b|`lmDQAzIH_3<*xor=q+GJ)Kb_$ntT0&1yrkmXL7Ajuxaz8KSCM74|ZTWcBnj$8^2+rdV%gie!d-xjBE3qPuf-} zeL~PezMYIVSDNbT8!-f%v4~RwGgRl*(cSJcSHSV&p4?$)Hn${tns?rNA*ioRNK+j3 zyY?#rkpZ=qbqFJRFCi=@W=c*#?&OQOUQ2l9AzN@c-jO8nQh@zN$Y65<4r_G3&ggrn z8Y6?t`WoY|T3SSY@$t0n*R~zCo*`p+=dNZ-;E|Gcg)ECKjQ%KGC&%Sqh|DiNUM{PtSb!el6q^~cizW7o~gM0lwo!Dt>9XP1B*CU+v z`X?cN@4F>~8XYhfMX`LCFnUC42{DZkapW@Wc%;|F+d>nbd#1az$QoMh=-~doQm21I zzTHfirTC09A}t#6$D%#R-LG+!Jb;q|IDcK{{A5!`mBT{dkDa;~y`}uqqC}XtWPr_i zyT)c5`{QNGz$&8E5!l^DZ@F+B66LM1yr;RNFMP(TIl@a_O>p0Qwr4=OE+vbX)X72P zxtJliCiB)8>xFcMq)UuNN%hV4z8sGYGNK99r&_fjes^6n2Foh>VfSv2v`XsAniB>= zCtT4<`VEAUUtE!Ikrjs#^;($C$ot!Ecdsn)K1TN@1R=N6JAMel1a(aeeGamM4jZb_ z8@JvGGk0Q`>;AuW7(I>4o3dr)`!^)hkIxY ze|h-i5QZKR%bmIE_O+=3r_&M1aPjcq)8mJI6rc#Sx8J?qUm4OfsXvf_880_~eJ$|H z*A+QZwTP%=gy**GEPVY+|BKJQ!AQ<{xBg{NxD)O?KleO`BL#-9yXe^^OU?a`or&Ld zf%1it(|L5e#zM_@wmrKtc1q_P4j)XjX+s+CHkS`>{@haMp~{p(BwmYY*Xi+WoXTVP zTV#((5&>VGr@Es^2x4r$wQ#7rn&Kxm^Mon2{75CaKVGZmW^r(H_p5L7sO4&8-nnEt zE&iOayuN$1^`f`Py2_}jvD)hKM(q8qjK|vA1PGHF9kz0#n$ztXS;7U#k+2KcfFBM!%urcx-t=~rPi`BWokqG zVazu|&tk$%YT!K2&R#L{lI?{vYf#5I|F{e+Jk-s-yQohY_~0oig_uD8rL2o_c%ZVU zA`r2)S7tL^IRLLbkn;U2cX(Vgmw7=Q3(c^~z>$7G8A?<{)J4>jO|++1ZXm+P*JM6Y zEA)z1ZhqNirYC@>$!d}y#*03bFE+^RO3Mwip3JO=Ur!wpAEdi28 z7*Rk!d5w!TmGbBt{fKrS(g}#|D)STj}mJ04mNlDtY7%MUW z*zv2G9~0U;l-A`*mr(BO?VZzR0i>(&2wont>DCRCANf+z(RrtxL~sJY9AiBUt&aPT&REY#H{VM9}VV ziG9PIX9;ns4o7aoZ7~~9S;q??-wWdoDz;A??Aqxl^h+o0&zx|(NC8h3TjSEPP>%E= zI|)+u@{m8cOiqyxL-yQRMA5?7S+`}$Gl;)W{O^j4EnEF9nPcid20;88KTbvKqe7XvPC(SGnt6LNb`E$R|_BDe}STfHUBAXX0}9v?D_;toN82(HyMF%3>$5J zS<@p$(*9GEn^-|f4LH)%cyXWtZurSrEWeWVc4!u4-Hc-|+Qh%u;?t^7qq7ts-CDnW zqUuonN$RaHe@gj~faF_A6F&C?^E^xIFR_Dn>p|?mBE!bZpi>Us{hPO~PMO_!T`J5i z<(` zh?%40NZTi)z>|_SYFvP34AJH%P-u*;+>}BB$Ym`rU;)xxbBmJ%fHaOJ5&&)rFbv4& z_506Z)o9{&ZvVu!N;fu8uP&X!|46pBv%g#Nb}ouXwf=rK+!8zcW1dS%Vs4yf>l?Xse|zlM6$#3g-sI#wbpj% zZ-T~FH8CkUr))_wUyn19WPN08kk)=yBay>H9?Vo9R2V@1N^T+BV)?9pjU+kQn73oQ zD(ren>MpRDfLXgl#~D$auzA+f=8XDg9$8UU7Jwq9+v%0|QifXKx(%rd=hU6Vrk3gB znPG3%5b>vxtajB|z0I|%Ey)Ce} z`+Ggy6HeHj*>KaU6YO%pC2(yG5pdY?ur%EanbZWk4cAC#YgFY-ty=O~Yn<-*fV#Q3 zfEu-%HH9q-3;ImW+NAS#_zd~lEVp=Up%J^&$g@vU+n&l;-J>hCQr->&B-zi8(2EHj zXm2Tw*t_1dob&QM)X6|bhu`d|mp;s`?Q*yT6HXGoqy@sSXnn_dO`K;h55VZ_Nf)%s zNO`Z@mVJ+$VaLEmY{vj~&$oE*l4!iW^UzO9pHO}|8ks)BiiKqC&W;GF;R3I|rTxO}a#B86(8$r5&YR(U;99kdbc#hHdi zzH%9F5xKbZUUuD+f;i5@O&w=H@T7Z0e9uCkFm~~|hp(i7;T1EWmTOMPZ4)(ouD-eY z-IRUS(1t|9;nPN&*VET{qh%}iTutP5 zpFk8u{DRx){QA{uve@gW@wMb!j?}^B{brBxOx>-#nw8V^b|${zci^3AGst93$&SBE z8?+s&z0sXZhjcwEmb_}f@SuC9U5ZR*!E28-8xR*1d`AHnw#M)dvuw@bAsj9gHhCTz zfp#Sw_4OO4L+V3wwHv33SNko;UBkY=t~Z*{yWHqwLI+_dzh4e!x1S;)6FXhlkzbP~ zf;2X^?|rR|(R>U?t-o{|W1ifD5Ezzhnu~4FP)av8`x2d?sM2TJ*rZ5h@l0Xm^00z6g%NKk-Dl9l7EI1)G3f?{9 zy|_qULN+GYkrsp!1-6(tIZu)GCK(F5BNXZUxmZI<3WAWMguFkFH&_#BYxXW~RzL2? z9=-R5Y$u4C-pgmk$k&#$1|EI(^+bVJ!w8M{(#3iA$#THiaVzN%HHqf%i2BHg6AaZR z6Upi=#TDB8H=5JSS>u%sN2>qP^_j^C+q2U!nI*nZpN?17Tkdc|i!mq8o7ij-VO}oI zbY6UVA@KF-$3zmDnegV*)T)l#P2=(&=xlN_tLF1MYnK9zxU&e;y`a}2amBZimnU`b zj?Nar3r^T69bMqL7TTI4e{cKrISh7NrrBuDUGcU;54}|^8MK+18n-!7GTUO4@ci~1 zw$zBaJUZ;ynon4)Vbt#jyY{4N9tIhlZKeFi1D>l{m1h!Y%RtZI*dtSMq2HTcUnnx&2VHmo}8J$BYNUpU1xV+n#uiAZ7>^Yk{4`Zm< z(}ysa3@$YGNLVH~&Yu2pSwad#>zrV+gAJ{HsY{d zxJl>sP}rGP@U$@Rhxy9H07+jwZRQt)`rjJljWoIbhZynO+tf(MRth1rL_R;=Od%Pl z-?g@Pz2Qc`@5>pvD8@jHe0bzLt+;$bHdMR0xv4geOl|5oC=))KIX!ck34}LkJ{Kd) zFt?GADu4$`zGy$F&_~S=w^g>^G&C5QQiR(XjleX>&jhdbeb=Jlx4BcCC*k_8Z^U#NsiokYar0~5*$d)TscMSoqbo`$ zq%7?5K#J=Zi+jdvI^SMOGz5*$Cf9jPx3A3&@s|8JB9sh39ic{UtUndmIky~t6mDOw zEtKKP7QY)cZSrpY#vf-MM7V$w8LxFuON4JM-A&~UZ9JlvYj>X7+nfU5$bMaZ`tp(G z>gdYPkdOgO#hz|+b3=kY7BZXnHY}{<jB@n; z^+EA@M5{P3$S3Cp^Lzyld-o5{x3B}Biw)z;Bmdpah|3>)lj)CBRWv0L>q|C4mpyP) z<7k!pl}BSw{l3W}e<+{3$S*#wAtCiTGhy;{dzqn%X3MLDCHEfEFq6Xs$>WeZp&V=D z_f8+~W)gqh64FSz?M^h&2DlbE2i+zvVlJrc#|p31;tm7A{Z%yqyry{_?rbO166ms@ zn{MWZxUX;0;)3=NMx*qPI?xX{K?mT&=Cj;+G%8-~a68SZM2Ev0a;BYTJ-OFa%l)e# zZ@$rSp1;Cqv3zn@>~6!dHSWX%d3(4h6AA8Ejke&?|Gk0V)lV&hTl3CHSSovVOC5Jv zp!d1B7xrwvd_tb0a4+kLOg?JksvR-}hpmtZ2VL+69W_0n%eZc6GTr-qgWQr@-oY+) z7g|4rpeGuekTpcBOJZn~nXdYBaPv(Z2UeJs8BT_ zj}d1Q{6OgEn9sAYt&HuA+0Oly(HF^{EoJ0$r5*X0s?iuxh(0d>n9CHVwBb#bm~R8Y zw2J@35=~CM49Xp|Fzxf0{-$UA^zxo@1%3uYPJ;X%ljPunRPf-jg}0{tD^#y1V$q}mDlHecs%*Spxobe5R>my~K!R`ToWo#$VCIlrgV zpO)|OoUSp5NC%G?Ev>Qcm>r8dv+md3a3OXxpI%zMNR2j@sWsh6+PC+8xtcZ#D+Dd~ z_FFzJd*mc`&*_EKV2B-nvJ>ouk2B9)6HK2K?&_=!7`iMBP3Qhm;Yi%PE$4Wnlcv(R zMH-WGDAanU^;-pnRIZt?_Nq$O{E!lI2*r?1-}Nd3*DiQpsfV6$Mt2&=iX`Gg;N1g# zDKeU|)@j`O6*e5Bv6Eq%AR|-*+m4ufv6f@sH#705>cKK-kFDKi#!k8FQ+j;L@l#=M zr67S_7&IQe&d_$P%L7A<*Za1Kf?_8Gw%lW$JF#1-=}Y!$mKEtn8!Z-<+?e$~ZK4=X z=PT>eAlX%<+$KBliO)kDHJwdLv5lZ+1*|w-_2%#0Z89_Csd2&Uv>`~9=&uGc%1$%U zPO<)6>(-+yM8Id;@isr*O0PBt5=gpEUsdugry`>Nr8iUBqg)NQHta(AcM;!;#oev~ z{`TI$ZqVN~_htqXmo7GVA+rL^&3&48GVGb!a%nwB|NU72Ab4W7v4RTPy#qh-Xs%Ln zE5rlxA5*M71V+idFR+309@BOJ2ps#@0g0gh@57xx|Jc*H>a;1l6xh5lQ>;~6ZR>zK zNQBwXe7eEn%-kzYoo@S=5h?&+K_vXxxTG# zM$lmUs-$-2ci?QyGfOEWW6JhFJoQouwI*gcnI&$NuMzs0=lf2Xxcnu*W>Yh%{NGKv z-1S5$M6*}SDuSdaqvFXe;(;B zTx>pfrW_Xd%#qx&tB2Qg4%y|3OCVI=m)H=eu^iIf4uqP@rDT)b;n07rJ+QO0+cZat zy>&P0<@jnfU9vU)yXH(=#CW0XbGd}xW1c){vx0B#F1ELfL1Pm3cl3JlB=>>HIi4Vx z1Mz0UIyUbvQ-r=%)xW^*V?#gT8~t~^GI8-=5Z7aG|3oW zB8YNxw#QAAr9wk8p}JPrG-tD-40~d_zz26udtX{TmkIB5XWtiUz^Cc|J*UUEhvQj- zW4UBhb4K5wRE8%+(Qbo`3cB!#Wsb6-6rX&2t`LFk*@$#Mt+gXATc!OtMJl#mueQe( zm#S$4=j<^PLo@8$6&NQLX9ak4?Xq2%g;@1C!@o{*>y52VOPY?=|7mQi8m9d4)G14k zR^3by&&1Nmw^6BVD9!JV>cdsk{i&qke>;xyz$+wIMO3nO2$p2?=Vs(`ijatJpH z&r8kvbSf#Z)MtiNK4vPl~vHhM<}!`Hn0*)>IC#eYQsySo#btuXwdJp*nd; zE0y}@%|PqzgltLiqa;Pja| zSLt!pC~Hu>k^Xc2WlEZOzxWd&ms@Kh%t<-=1yRe9gXPugxW8w?`}Z7Te+ztG)p#qy zP}9iZyqT1eh`425+U>VcQh{CzBygp=4ZoUxF7D&H@4qZ^y%1&Zb;as(eJ)EVvEI!J zH*L4Hv}9ytEG#Unlk|PS+8e2_xU>LLi<7&x2&;PKcj}C$ir*@vH--&(ScWvr_&~Rt$JEzrE!z&mIk>_K&;K6=~xeB0)Jx8Tt2L_iAM3h1EkBe-XIz- zD$Ud{n^}5*^KQa#bu(z%_N9Mxhw|V0^^datPye6%pA4&*Tn?+9+IpbafHbahiaQKB zN>dOX5m9#zk^_RDV5C?TseGh@5_Sb*QCjpSJd1T_u0 zPyihDzH=(^F2(EwwRG$2hVpe~@0LcC&$3?<K1|_i_S%~=ZTsM~*!s%w4b}_l zN54K#r?vlzBETbyU0fqKd_pg0`9=W;8+h(8UCEt3?Yek_rrhE*Q_|w(o#{<1aro^1-H%gXv+9a>ABB$(vv=o#^qnDI*B7r&n5hu#d;8_UaBdlO#o6ji65H5J_0`;MCeouztbvd>Y4~8A(XXcr*ehc)_lx>-- z=!-EXqa$sCu1dGV#(%@l8Xwm8r^Are@DwvURp>?ApX0vST#iDciU;8l%`X`jf$?zH zjoGH*ql2aL)w-X)d-sg`8V{D@KoSLOlX*6d-c~ve->$wr8tTh9L>>`lhqQ>;El>)P z%zrpsQ2w&BF=mxv5l^sOvf1`$kWC#`c2O&dRO2`M=^99Dn z*T{t-J=me@iANFLG5$j8)^sW#bdr$=9KNbU64NyDOo-4|JIEFUPO3%8D!y3agr@uz z!(Cn~ByCXSxgkgDAC<;}ljQU~)g(Hfs{;8+{6?pUMgG(u+#6N0zcefcK;{ju2K*Nc zEwBfA%Xp`nY8`Z$h9;+L>5hd+hcBItF}DuorOPl!gEkH~=Q#GAUZzwMWt2|JdR5Q_ zaf*tyTk4ry;G}uhLY(7#eCiTkY;(-{lV5!6u+ep`L643HcgN2lajRkADyuY=SD9R2 zdTuy*kNe0Buv(;qDeseT@htaVB9*hIl4(S5LvfWEn=?q*V^_73%S9daI8`{i;LHPr z;?%_AbUBKptm9LAAj;S3+9k_b3xqTaafd=GGw<*=YQ1A`|Bd zS+7%RO!|mmEu#3<^`RF18DSIlI7V08J}HF*3SzIY;?z+ZSy2P|8dw{Z;UY72OSJ~k z0&kI24sUu4IXI(V=_jr-m^Wzt)$a*}HdE_IYwa=k(ibEwq5W0Hht z8sclE^n?0U@65rv!Avd+E&Qi`=HEF#8+?obaVOoVjL&^$5!i{h(FB5Xsazz_0=8c} zwMnm%apiNT4sBriN+!s+b#ki0SPHp9=-v8^X568Qf`XQ|Qm<^oy=DCV4!7w!r@$k| z#inzPC;r-1qY{P0Mq|0EWS5z|2CfO*owMog|?{kfH)QuUt*l!6Ux$FQXulG4E! zJf~AFoQKZ{pQL?L{>&ZRxYDYVHjwvoGKhv(8hg>;{R>rF)r-#)5x@@b;_!ZA&I8-9 zMx6wEaWC+nrRae8+B5q7r>NYPJMza$X81$~xt+v=9>-E$EgAe}>nspL>{=%GeK1E% zFx#XoX#WR30clb`v9AYsVYO%YD}rCuJ^2T7h~%&RmyZe`$8^3)8LaIu3Kw@*I*cG} zBh+da)q~YBm4^<8*0YF7W%;UN^LI8LXpqxuuM1C*Kx@m_CZRX^&6^Q$=qn&0Bp_HX z5~P%Ib7qj$zykgUXx8 z&oM8}X~4OXH9EORL>aXM_jb}|^QbFc=F4xNd~*EJ5bzYS)vFKhbUx|ITAcu6rrFh8 zMQYpeJ841Yk|g;3Qz$>@)Y?r}z+Xu17NXCu5vGENviwOpU1_jsB^F2VK=2c-6cF4I z3BrUoOtbmtS1~w{iu!%Dxx()Mva({n^(&r6Y$DyL#zJ0I1?N@m%OH$3bmDvn)TcPj z9~NhtK~NVQsu@MTYjMJjX&UJ~cLsRwH9w?=XftBjkR7aJV(i}644nWSR}Z((|D z#khR1{yv-T37%SVvvi5LGppep;5UV#-iC{aOfi%1rQF~7W`QZ;{^Z$UT0v3KR;PI( zP0bggoME)EPMg|SdE7w#!^iA74eKI7x%$DvMgC?_*3Foz12^+%h2zAn4JfmB4uve% z%Vx2xI**U}hS?XtkwLNZjA$@7F$!_|jTa^YWwU`HJ8-Y`Xix zqM~zmr!U?*EKlz396Ff7X@5}y-5cVB?Bze@WK~Gmb}!_r`cM25EsvSlNr&>y zi~v*ny{U?%mT+^T@1CETR7#e`pM7Ymg0!AhGha!&`fhUAVQW7KN=uJjhE_(S-=?jy3@$Ao?@e2j@Mc!qJp za_s*zjs9ah|M$WwG6nVl<0a!J5Fnja-^eX5jSUDg`lfKC4<*_e-E7JN(wocy1O+4o zgB$J~E;e`p+9_w)#hugI%4yhum2wi>M(B5p^>uG~PWfHjW#}ULhnN1T?ultT5L`*t z)>rkkfC{bn0i}F{630?l@&TFP1D`2R3R1-6M4sW00svn3_Q_cUTZGCq*a`+V5zGbh z$-5&#Yinz%D%PH!I=C;z#rM^oQ&W@J>xch&tYZ?19c)Ha)mLRy5g!{HN&YeU4Bg+a z)MxoXofGK)HdDwd9>Sp)c}nPUtfuAY$ZU)cjCv)-%6Wh6-rlzTsFx!CmYKjOlnv-F z4fVb#HL=3a+RLN;!p~3n6A$3$MUW)n5(B|{Yr{1Et7ZH5`l@(eR2nx`PHq4|XF}uu za>Y4UZlOAkGu8C2H;IgjnZJd&9uAayHaN)xqiaSKP`PoelKH2 zUrnJkNLTQ@#1n<^<+<#BtaDEY=ntmQ+T9*2q!w~)-YLooC4!x+!q(M(>{Ygf5*_)% z{r?YE~W1Up0(ulaPOC0$o_|U&@V3TXW#^ATDP@|~ngRSc?lfv5D413Vn zDlQS4Xo!w!~hbDR4m|cI#MKP0;W`C!sFeFyUiVL zu2VLtk&cbmaA{X3osS{32050r_g@qUsC9I7EFYJb*7lQ78FRq{ME5TKp#kN8(4bWf z3OWh+{B0oVy^so=rof#ItKgZRzKdRb#=@?e^RwqFjAIEjVpF^BfScRHSkd9D)Xg4Q z8#mZ9(IQZZPburwGdQ^KF8X(!4`aI&yfYwsX9RthsxXxm!k)v>GEMO%A>bEj488JN z-emuB`{bQ9>OR5HRF1i2@?x1SuGsTC6lU(O%MWN(tR86Li$<6CG4CvrW-!rt>r#J- zy4hVPbzbn(hEhb|KjuBe47CByXg0IOq~9}C9@>yrx>%)F(IrhEO5sr+pmE@>B5 zlxQS^MpL#Dw!1HK{3J7VN)EUb3ahw!XzN%Avso0eZeFN-P42QEsOK0qK-AaG(&G`D zE>=wIw+z7%C3Nq(!4L$0j9usm!Uu=vhZIgs|?Pm7~%!jxHhX)X_! zp0$~ab37A|1WYI|)V>NI7#L?eG$&L(0>5KnKQy*d zIHiSQ)ai=*%^@|{f_AHZQ#$yedAr#izQ#-U(7?;B@h^J_j@5~|D0oP9*&B`w)jx7P zhqJo|&nhimPO)d4m@m;q-u=vg;)4 z;YaB+3psX3r29AG?^G!Nt}E)#k4Qjo-r-~_TFDgu*TVbKA6RE>=-#O*MReQ`G6hE4 zS1+zb)HBA$#%gM6Fm{AhE-p4!kPeUOD&SiTkC*yuRzje^hjwl2i4Md2Nc$kcMpi%h zC+%mkRjNY0ym~B=Rul@wF+jcp6J^vAu1+GoN>Ev{lqO`*Kp0P9^SOux-$_oA`-1y+ zuLh9MvtruLaRrp;nRRfJ$QH01sM1gXpCv%B5q8=Vrg&a_5=4JUAD-!!moH6-f zNgMssYGL%J3>z?o8}1@+^4;wNARC8K zY9sppwz$j#4F7>}K4pzR@}G?i`B*9Cg#lM$dOUsm_+C_}pqoC^KyvUsU?-X!xr~&*>Rqj0=TC&>hi+(!#~o)b=vTA5Mv+-nSGN=ewMs?9}{v0BHIz zL1x&TBv-b8l-u96#;>l{=yeAg0i(1he#p}Q8`6T{S4~bnew&TNT5=Us>Nd$bqgQD(sCHzvlh9D6@cPeFdU|1`5=6D6@#+Rs0+ zf)g!rYxuDMITas$m%kF4cY+)UxuPpI?}ydZ7#pj_8w-&??N+a(0*Kf!?&~`Q3#jPL z68nFLv*2iVu_Mr*dJqc;2Fs@ zDd1TqnNn4+|EZoyi+*;w`X=>?fyJk=QmP#}9C4^CC@DtAbkyj*H2^+5*jnB?v}FC5 z3C@+rhT~tkd2elM;^m|MM1k&FJLzzc1J8=Tm+RC3iDhq>iBgGW64xWy?%w1lan0iW z%43waVctJEi_QIvEF}eR(>9m;sazQ`)iLOQrD*@&*cy*4{~L@w7j3H=7Z>+R5{$_` zar4C>gs#64Q^jpzgBCNiBig;?cb$ku3uZAE{C@|6c76rszNULUYN`$&e-vGS;ao!A zTdCjCzd9ryzv%f*;?Tp<+t=qSu857NQM$>V3mmFy#~Jj5JP?)NY1LUMm8)6)4O3FB z!m76=MaC65J34alNh()zKz)8#Y^){dKHuiqklY)Mn>*RZyHHSzQK*l2^>=irO9Q7; zAInHtN~I)054W7DION zqiGHxpD_|t8mR`12AR@97vQcc)5piIG42llw%r>x=1>YsN@WSn`9>6+iYXUBBia8!09AvcD>QH=IkUt$|T*zzp{SprOL!T=RYXW(LbNb&k>*Wn+a6n__QHD z^dRUG@_2};R*`OL1q*6P)GsWDQV(;n(k$mMzbHL zW@acJv)^0te)PhWyM<>`t;t{2rN?_&4*J?CXY*MXQC_f6`n&#+@@>0vU3~_&HmITJim4sYC@g*p&iU8FDEyTNt-P9sW}2pV!ov z?SNO0e$lmK;}D17_cIkdtAAUer>LM1N~DqRez%pV14M#G!&u)c%jmqTi%RsDW_js{ zP36`F$HaFl&Oy5GxLVRIPoeqg)&5_xwM*glYV=>Q7Q--C9wCjLAM*dpA^cwpzusPh zC(0y+-Ak-uaBQDq5)a6Li@q12luh~g;h!6fKO4@TC`fbu(4zHolbML85vy#!G*YhZ zB!`P>iw~Fd>O-#avNuMil2iR#ZRER!^5roTizF$igx%f112zQ`LsY_8*Vz;bJI{Ap zu#}!+0+c+XoNn3VUKPwtaPeX*>iOYR0wfLM<~u>pf_3mFt&K1tX zd^|YYxPHh{UyK!V{rEQ76rvtZ22W+hCLIluWA|KYm^N$kJ=-J<+?Kss^j@B8aL9@3 zOP~{0*T${!K3eJ)5gu<{1(D?A_#yM}vp#D-^r{jILN*hvUZ1R0`7iFt=|tMsyF6pW zkE74uBZB4=c;|!gv=W)fE0J{!9*kXBG;b2<1Zy#0HJl~fhp!bPtl_&UB&qry@#!-< z{<{iPM)<|(dpY*)9z2~yn!qSn_^`Wh9Yfvemhv{XQ78tn;(>Tcz)ykX^Z(gl@RXQu?Ca~3AQ{@Ig)r1&=un^PG@rvGL!KPU zK&zjpi?IZwi?&ME)LQt`WEg*RS~RHk-x{^@cqsQZK9Ndf5VBMl>lk}lFpizfU@``Y zW{~w1VPqNE3OR#A!-TR7nl!c;*(OAeJt0euu^eLw$C4#Ww)?u>&*$Fz`P@J5`~Um< zz3=mUm*@BV9$@h~7mb(dNq?i~(i^`_1-_K#A#;h5G&)M-g<~flCga|ar0;%Qle_T| zE_PH-%?j8RsK?63Sgv8@El1IB+!*x;b?$sV-O-#WSuV#LYU`yYhK1*Pr%onfiUxnJ z9HA9)5l+BSk>%dZ{$K;ce9gi6M-mnQskBkl{y3RW0YU39MXKD@2=>zQnowJ*t7aRg zk@=t7xwv)x9N^CJFG;ntp4Y#h0@yO8QNSkkB$TL~0e53t%Vh7DcCcC}EU;2c|C)l= zXpz;7pq>`>rB>!5BFw$BI`P*(OUnnYt4FLtllzlTKYZ2(@MyQ|@sK1U_r>e0_Ud@Q z5B>IXB7JEcKJ}`WINUIfUE?J^TApJpWJI3yEkB*!cZCFop>Bfv|G~8qt-NPHT~pf@?^% z_2rpp`PS|4Y|CknOccmO_{EnGZWpQ{RPU9Bt~Nq;`lVqW>194TL3OJe2W~0?GOAau zm>4SD@kHjPKvsO$lCtoo^j62irN-=3zgoOCr+bHw$)=+((R>Oe+o3N5L>*sf%1iB4 zTe#CE_`cJc5py{Sa?Z~29lR0W;e-b&~RTUvj5vo@Dj(NG;x@U&f$Itre^nG!;&}2dviqsISkeWc>DTZ+WSp05wr`M%x2uKb?NT@F+7zDOh{`HzC5^-DkIr>$-igcULAJn$g$sJ8~4$3gzRtq)7#4A(LJwG{EMWRQ33Msk$KY+ za+P8feV-)Gnoh*b$eQ&tY@h48gp8PH|Ms*({qZa&Ndl3(&L*Yr#3gI{!!@HwWrp*~ zQyI>wB*^kLfgpRby}hxaLJEM1-jWX|Zb%>jsiH^5Vr==2Quf?B!!(tx_xn$%=mp(L z$5jCt_7q>}7s{0+I~zeM76f0(!z^CN4oJF!`g`PD$c)=aO0T?Fg zmSFW+q|0s8uZpA}GmstD9|{|afMHn>3Ra5Bsr3~ddJ=g8>Xz!$`kCXIr|;e3ATD-W z&o8HJ@Tw<+Jt=MATQ|=4eWi5^7Wr?XyT2SnHGRaDA*c}XTDctsTw%u=`&f*849_KQ zDcc`qYOFQr8qz|cgY`_(H!1Gk>fxmCF)fNSN)To{qQp^jlV-1yk8-`bKISOr*-mGJlK<1C9uK5)Ib|< z*=1r2taFb-!Eu2)JTt=+TEb(c)Zk=8d*Z*0;<`UytmOYglfnKOt5#4vH2o$NZD zJzew=dZ>u1U&$`5L2u0k9uoH|1oAK3jspP^vl6E+9f%IK$9=qXZ!yO;GpP6tF@*36 z`8+AA;*@*4>d(7o%sKC-}y5aYT+Qlz)*<;;OR$>KD4>S z1Zu^=<DC0CLv23TwJM3q(-c9g0~)igorsaS?t zDW}bRdCNYbv0}~{s-34>F4tUUKKEM%5hm;HZI+zJT(L|Zc9lFKR3Lz(aXz=En z@$cgMnyTeY^CYQ~c>)@&Xn7A`Usnoxl6KyP6%|ps7uFPo<+p(up3$#c4=pyEw{dNy+dQMLHg$Vv>bg_veAN8R1g1PkzaSNq zOT|Rd1PDT(YngW@jvJHBsL6QW$<&=S_=*v zGw4}Sg?_h9=P(x4Pd+g%4G}25pGSvVFIzOT_T`~mL3;SNd0G$&MB?wiSG_+EO8y8`b5j-l z-~mX0$^#?cq>1+S>o2;FfjEb&mgXPj|5(6Qc}MJY;Wo{=FX-qqg(7D^DD%x zS1I}tDv**@Jhes`-@JH;fMwrE(gS!LJ^IW{Li{km=C z_BO{OC#a6K9DHm~LyYba7Vv!)TP|F& zIb6U5Ql!6@L5{U6P~`=0E-_$nWt|4t--7+)ig)=j=JP`?L_mCH0bupOhJwBi4!U zb{vW|CiFmKue(h0t{&V%?e}bMRwilwD!FrQEDvnXUFD*8E@oIJZ2O}PmkGlf~ z!GG6yVW;SPaSe2^Yls-eBY|WrGE%c^J{$)r8Kfe_({6$!l$74%3eRbTSa5-OW97*_ z5NnA*u1MK`PS4wUIvjOTv;NuSzlP|uVy7Uj!raW87GWVj_8T_HD&g}m+#)6lL=nN@ z#=3b~EzD4Vcif?uH*FmkcrZLXc0pbU1TvWRAHUde?!A~M-q&d-*YNC;5Cry`qi5lV literal 0 HcwPel00001 diff --git a/doc/C/figures/gpiv-fig5.png b/doc/C/figures/gpiv-fig5.png new file mode 100644 index 0000000000000000000000000000000000000000..e3a953131ad5e29495751ca5604bf27630d5d08a GIT binary patch literal 21876 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 G#s3S>mhNo; literal 0 HcwPel00001 diff --git a/doc/C/figures/gpiv.xpm b/doc/C/figures/gpiv.xpm new file mode 100644 index 0000000..5ed7994 --- /dev/null +++ b/doc/C/figures/gpiv.xpm @@ -0,0 +1,55 @@ +/* XPM */ +static char * gpiv_xpm[] = { +"48 48 4 1", +" g None", +". g #00CF00", +"+ g #FF0000", +"@ g #0000FF", +" ", +" ", +" ", +" . ", +" .... .. .. ", +" . . . . . ", +" ... . . . ", +" . . . ", +" .. . ... ", +" ... ", +" ... ", +" ... ", +" ", +" ", +" + ", +" ++++ ++ ++ ", +" + + + + + ", +" +++ + + + ", +" + + + ", +" ++ + + ", +" +++ ", +" +++ ", +" +++ ", +" +++ ", +" ", +" ", +" ", +" @ ", +" @@@@ @@ @@ ", +" @ @ @ @ @ ", +" @@@ @ @ @ ", +" @ @ @ ", +" @@ @ @ ", +" @@@ ", +" @@@ ", +" @@@ ", +" @@@ ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/doc/C/figures/piv.png b/doc/C/figures/piv.png new file mode 100644 index 0000000000000000000000000000000000000000..4e97e1853767ed88bbc7e17991e8e3be3e69964c GIT binary patch literal 725 zcwPb30xJE9P)wrAVp+pbZ>H=Dhg}>00KoxL_t(|oYh!6lEN?ym3Np)4zT@poFHWi zj!r?z3FzoKK&Z4uVn$Z{lRvR}JDRbv$-d`jMaBRC7!&g{Ma^p!YHJvnm&xeg#`|vU zHr|bP4+uIiFVn8i=d_L=pTc>WU|yzfRy>5LoCx(>ht(0DBi{gPvd4gm?P2SkB$In1 zPZ1Q-k~{)}0u?nkSVxW`kBkNtpvM#_qixPl%#j+P4sgPH%;l1|jS07G})1TlM2vdN||l(|L~Bf$jT8-QWKWjXAej0uCkXx6XBRnTU{aVO+Yo)AyEmW`Usd*wrm4bK_d5U5}a>ygw zqbfmtu{u&><+-5sxf#d!)<_Z5r4S9tmh0;DYjZ*)am z@)9=yJVH`_Zo0@NB;0NCDIk{gT|aXAGpMa0T)d;R9zVDtdv^qYEvQ3^Q)&B&3| z8;lezzZauFzOL4%>v`kr8hj?=`H8rmoIVlimx$%}Vzham&+)|x06;zdcIs@a@4Bwc z0bOzKk`zvr2>1!#ywu>U9qRjHS4UEAFjA1a`W(AD($njeiVY=ucgJ`Md5Y+>)&L0a zN^Yf+r?5IQu#cz!J@y8*i31qeoEVfKPvP8J)B#GKj@5KY3hxEo0B9xqu1YBl-W+kS z_G)A=ZU8tO;W_dR$awuC3|p%QXGB7%Q$3KU2-cCF$y59TOl}RphtlZY00000NkvXX Hu0mjfr_n{d literal 0 HcwPel00001 diff --git a/doc/C/flip.html b/doc/C/flip.html new file mode 100644 index 0000000..57502e6 --- /dev/null +++ b/doc/C/flip.html @@ -0,0 +1,105 @@ +Manpage of + +Name: flip
+Section: User Commands (1) +


+ +   +

NAME

+ +flip, flipx, flipy, rot90, rot180 - Simple data manipulation tool for PIV data. +   +

SYNOPSIS

+ +

+flip [-h] [-p] [-r |--r] [-v] [-x |-y] +filename +

+ +

+   +

DESCRIPTION

+ +

+flip is a tool that belongs to the Particle Image Velocimetry +(PIV) post-processing group. It interchanges (flips) the data in +vertical (x) direction, horizontal (y) direction, rotates over 90 and +180 degrees. As rotating over 180 degrees is similar to flipping over +x as well as over y-direction, the program must be called twice or +must be called once by rot180. Rotation over 90 degrees can only +be applied by calling flip with rot90. +

+The filename has to be given without its .piv +extension. The output will be written to +filename.flip.piv. The parameters will be written or added to +filename.par. +

+The parameters and options to be used for flip are subsequently +searched in filename.par, generated by rr and, eventually +contains info about the input data, flip.par at local directory +or at ~/.Pivrc. Each parameter is described by the program key +(Flip) and the parameter name, separated by a dot (.), followed by its +value. The parameters may be defined in arbitrary order. Blank lines +and comment (starting with a pound sign (#) at the first column) may +be included in the parameter files. The parameters may be overruled +by the command line options, as explained below. +

+   +

Options

+ +
+
-h
+On-line help. +
-p
+Prints parameters, command line options and input and output filenames +to stdout. The output may be used as parameters of flip for +future use by re-directing stdout to flip.par. +
-r
+Rotates the data over 90 degrees. Identic to rot90. +
--r
+Suppreses rotating over 90 degrees. +
-v
+Print version information on standard output, then exits successfully. +
-x
+Flips the data in x-direction (vertical axis). Identical to flipx. +
-y
+Flips the data in y-direction (horizontal axis). Identical to flipy. +
+   +

SEE ALSO

+ +
+hilo, err_vec, rr, vorstra +

+   +

NOTES

+ +stdin and stdout has still to be implemented. +[-f filename ] will then be added. +

+   +

AUTHOR

+ +Gerber Van der Graaf +

+   +

BUGS

+ +The program has been tested for PIV data. So far, no bugs have been +found. +

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/gpiv.html b/doc/C/gpiv.html new file mode 100644 index 0000000..3466c1f --- /dev/null +++ b/doc/C/gpiv.html @@ -0,0 +1,342 @@ +GPIV + + + + Contents
+ Previous
+ Next +

+

2 GPIV

+ +

2.1 Starting up

+ +By invoking "gpiv" the GPIV console will be launched that consists a +menu bar, a toolbar, process toggle-buttons, a tabulator and a data +buffer list (Figure 2.1). At the bottom of the +console you can find an application bar that displays information of the +highlighted item as well as a progress bar that displays the progress +of the running process. +
+GPIV reads its default program parameters from ~/.gnome/gpiv following +the GNOME conventions. These parameters can be defined by command line +keys for the current session (invoke "gpiv --help" for information +about the options) or in the settings->preferences from the console +menu's. The variables that are used for interrogation, validation and +post-processing are read from ~/.gpivrc or from the system-wide +available gpivrc (mostly /etc/gpivrc under Unix/Linux) respectively. +
+ + +

+

+
+Figure 2.1 GPIV console with image inormation +tabulator +

+ +

2.2 Menu and toolbar

+ +The menu bar consists general tasks for GPIV, like file-handling, +preferences and help menus. Underlined characters represent the ALT +short-hand key for launching the menus. +

+The "File" menu contains the menus "open", "save", "save as" for +reading and storing data and "exit" for closing the application. +

+The settings menu contains the menus "gpiv buttons" and "tabulator" to +(un)display these parts of the console and "preferences" for defining +all GPIV settings. Closing the "preferences" menu +with "OK" stores the settings for future sessions. "Apply" only +affects the current session. "Cancel" undisplays the preferences menu +without action. +

+The "help" menu contains "show tooltips" for obtaining additional +help. Tooltips are small windows that pop up when an item is +highlighted and contain more extended information about the item than +can be displayed at the application bar. The "manual" menu shows this +document. "about" gives short info about the application. +

+ +The toolbar is a quick way for opening/saving images and data, +executing/stopping processes that are enabled by the process toggle +buttons below of the toolbar and for exiting the program. + + + +

2.3 Process toggle-buttons

+ +The process toggle-buttons may be switched on in order to define a +chain of processes that include interrogation, validation and +post-processing. The settings of the processes are defined in the +tabulator below. The chain is invoked by the "Execute" button on the +toolbar and, eventually, interrupted by the "Stop" button. + + +

2.4 Data buffer list and display window

+ +The data buffer list contains a number and the base name of the image +(without its extesion). A single buffer may be selected by pointing to +it and left mouse clicking. Several buffers may be selected by +clicking the first and last buffer while holding the "Shift" key. An +execution of a process will than be performed on every selected +buffer. +

+ +For each buffer a display window is launched that contains the +image (not visible in this version of GPIV), squared frames that +represent the interrogation areas of the first and the second image +(in different colors), vectors representing PIV estimators and derived +scalars that are obtained from the PIV estimators by post +processing. The interrogation areas are highlighted when the pointer +is moving over them. At the bottom of the diplay window an application +bar shows the position of the pointer, centre point of the highlighted +inetrrogation area and, eventually, values of the PIV estimators and +its derived quantities. The same information is diplayed in the +application bar of the GPIV console as well. When clicking the right +mouse button when it points at the display window, a menu pops for +in-and outzooming the window, (un)displaying features and choosing +vector lenght. + + + +

2.5 Tabulator

+ +The tabulator contains image header data, image evaluation, validation +and post-processing parameter settings and buttons to invoke the +individual processes. + +

2.5.1 Image info

+ +The most left tabulator 'Image Info' (Figure 2.1) +shows information of the image. The image dimensions are defined in +gpiv_gtk.h and can not be changed during execution of GPIV. In case +different dimensions will have to be researched, its definition has to +be changed and gpiv will have to be recompiled. Time scaling, spatial +scaling, the positions of row #0 and column #0 (related to a typical +location in the experiment) are the same as in the Post processing +tabulator. These parameters are used for scaling and positioning the +PIV data. The image header items "Project", "Creation date", "Place", +and "Comment" are optional. + + +

2.5.2 Evaluation

+ +The 'Evaluation' tab (Figure 2.2) shows all the +settings for interrogation a image (pair). +

+

+
+Figure 2.2 GPIV console with Evaluation +tabulator +

+

+ +- The upper-left corner of the image represents pixel # (0,0). The +starting point (first col/row) and the end-point (last col/row) of the +image to be interrogated may be defined in the entry-fields as well as +a global pre-shift in horizontal (pre-shift col) and vertical +(pre-shift row). The first column and row, as defined in the entrys will +always be included in the interrogations. The last column/row of the image +to be analysed depends on Interrogation Area sizes and shifts, but +will never exceed the last column/row as defined in the +entry-fields. +

+ +- The size of the interrogation area and the shift of adjacent area's, +expressed in image pixels, are defined by entrys (for arbitrary +dimensions) or or by radio-buttons (for power of 2 dimensions) +'Int. Size 1', 'Int. Size 2' and 'Shift'. As the size of the second +interrogation area has to be equal or larger than the first one, some +of the settings in the entries and of the radio buttons may be disabled +for manipulations. +

+ +- "Mouse select": +

+ +"None" disables mouse activitiy within the viewer window. +

+ +Enabling "Area", entering a viewer window, pressing the right mouse +button and moving the mouse creates a rectanglar frame that defines the area +to be interrogated. This is an alternative for using the entries "first/last +col/row". The entry values will be updated automatically. +

+ +Enabling "Single int.", entering a viewer window and clicking the right mouse button +invokes a new interrogation at the highlighted interrogation area. Already existing +estimators will be conserved. +

+ +Enabling "Single point", entering a viewer window and clicking the right mouse + button invokes a new interrogation at an arbitrary point. +Already existing estimators will be thrown away! +

+ +Enabling "Drag int." and entering a viewer window causes to displace +(drag) the highlighted interrogation area. An adjacent interrogation +area is highlighted and dragged in case the pointer is closer to its +centre point. Clicking the right mouse button invokes an interrogation +at the centre point of the (displaced) interrogation area. Already +existing estimators will be conserved. +

+ +With "Vert. line" a vertical line in the image may be defined at which +a single column of interogation areas are to be drawn. Interrogation +of the line has to be performed by clicking the "piv" button at the +bottom of the "Evaluation" tabulator or by enabling the "piv" process +button and pressing the "Execute" button on the toolbar. +

+With "Hor. line" a horizontal line in the image may be defined at which a +single row of interogation areas are to be drawn.Interrogation +of the line has to be performed by clicking the "piv" button at the +bottom of the "Evaluation" tabulator or by enabling the "piv" process +button and pressing the "Execute" button on the toolbar. +

+ +- "Interpolation scheme": interpolation scheme for estimating the correlation +peak at sub-pixel level. +

+ +- Peak #: normally the highest correlation peak is used (or the +second highest in case of auto-correlation, which is done automatically +if auto-correlation has been enabled). An erroneous velocity +vector, though, might be caused by a high noise peak in the correlation +function that overwhelmes the 'true' particle displacemnt peak. Searching +the second or third highest peak may result in a correct estimation. +

+ +- Interrogation with: a linear weight kernel in order to correct for +biasing effects that is generated by the estimation of the correlation +function. In case zero offset is enabled, i.e. a second interrogation +is performed with a pre-shift of the local estimator, the new +correlation peak is found between -1 and +1 pixels. In that case +kernel weighting will over-correct and, therefore, is disabled. If +zero-offsetting is enabled, the 'classic' forward interrogation scheme +is choosen or a central differential scheme may be used. +Interrogation following the central differential scheme is done by +displacing the interrogation area of the first image with half the +magnitude of the pre-shift value in negative direction and displacing +the interrogation area of the second image in positive direction (of +identic magnitude). +

+ +- "Correlation"; in case recordings have been +performed on separate image frames ("Auto") or on one single frame ("Cross"). +

+ +- "Interrogation areas and correlation": displays interrogation areas and +correlation function, together with the estimated displacement vector +by enabling the "Display" button. Though, this uption +is unstable, yet. +

+ +- At the bottom of the "Evaluation" tabulator the "piv" button may be +invoked to interrogation the image. The function of this button is +similar to the command line program rr of +gpivtools. + + +

2.5.3 Validation

+ +

+
+Figure 2.3 GPIV console with Validation +tabulator +

+

+ +- "Disable data": to put PIV data into (in)active state for further processing. +At inactive state the vector color will be displayed red. +

+activate "Enable/Disable point" to put in active/inactive state by pointing +and clicking a single PIV estimator. +

+activate "Enable/Disable area" to put in active/inactive state a rectangular +area containing PIV data. The starting corner of the area (upper-left) to be +disables is defined by pressing the right mouse button. The opposite corner +is defined by moving the mouse with pressed button and realxing the button at +the location of the opposite corner. A rectangular frame is drawn during the +operation. +

+ +-"peak lock" displays a histogram of sub-pixel estimators of the PIV +dataset. This button is similar to the command line program peaklck of gpivtools. +

+ +"residu statistics" displays the (log) inverse histogram of median residus. The +critical residu value for accepting/rejecting outliers is determined by the +slope of the straight line. The critical value is calculated and displayed in +the "Threshold" entry. This button is similar to the command line program errvec of gpivtools. +

+ +Activating the "validate on velocity gradient" button puts all vectors +into red color if they exceed the critical value of the velocity +gradient over an interrogation area. The critical value is defined in +libgpiv/include/gpiv/valid.h: GRADIENT_THRESHOLD and is set to 2 +pixels, i.e. identic to the optimum particle image diameter. This +quantity is choosen in order to prevent a too wide, or even a +splitting up of the highest correlation peak. +

+ +"Outliers" defines the parameters for testing and substituting on +erroneous vectors. The type of residus may be choosen between "Snr" +or "Median". The "Data yield" has to be filled in manually and should +be obtained from the mean number of particles within an interrogation +area. The critical threshold may be filled in manually or may be +obtained by invoking "residu statistics" button. Outliers are +substituted by the local mean value of surrounding vectors, by the +median value of surrounding vectors or by interrogating the area with +a next highes correlation peak. Finally, the validation on outliers is +performed by pressing the "validate on outliers" button. This button +is similar to the command line program errvec + of gpivtools, too. + + + +

2.5.4 Post processing

+ +The "Post processing" tab (Figure 2.4) contains +tools to apply modifications on PIV estimators and to calculate +derived quantities from the PIV estimators. +

+ +spatial scaling is calculated by measuring the number of pixels per +mm. For the moment, this measuring has to be performed with different +image visualization tools. The time scale represents the time between +two succesive image recordings (mostly the separation time between two +laser flashes). The location of the image within an experiment is +defined by the position of column and row #0, related to a marker +point in the experiment. Enabling the "Apply" button will display the +scaled data in the application bars of the buffer window and of the +console, including their positions in the experiment. This will not +affect the original data set itself, yet. The conversion of the data +is performed during storage execution. So, disabling the "Apply" +button will display the original (unscaled) estimators and their +position in the image, expressed in pixels. This button is similar to +the command line program scale of the +gpivtools distribution. +

+ +Vorticity, shear and normal strain may be derived from the PIV +estimators with different numerical schemes; Central differential +scheme, Least squares, Richardson and the Circulation method (only for +the calculation of vorticity). This button is similar to the command +line program vorstra of the gpivtools +distribution. + +

+
+Figure 2.4 GPIV console with Post processing +tabulator +

+

+ Contents
+ Previous
+ Next + + + + \ No newline at end of file diff --git a/doc/C/hilo.html b/doc/C/hilo.html new file mode 100644 index 0000000..f20d49d --- /dev/null +++ b/doc/C/hilo.html @@ -0,0 +1,111 @@ +Manpage of + +Name: HILO
+Section: User Commands (1) +


+ +  +

NAME

+ +hilo - Low-pass filter for removing non-uniform background and +maximizing contrast in (PIV) imgages +  +

SYNOPSIS

+ +

+hilo [-b int][-c int][-h][-f filename][-p][-r int][-v][-w] < stdin > stdoutfR +

+ +

+  +

DESCRIPTION

+ +

+hilo is a low-band pass +filter for removing (non-homogeneos) background illumination and +maximizing the contrast of images. For this purpose it searches for +each pixel the highest and lowest pixel value within a window. By moving the window over the image, a maximum and a minimum envelope is +found. The envelopes are smoothed by linear interpolation. For each +pixel in the image the minimum envelope is substracted from the pixel +value and the maximum envelope is stretched to the maximum pixel +value, defined by the number of bits a pixel is represented (255 +for 8 bits image) +

+The parameters and options to be used for hilo are subsequently +searched in hilo.par at local directory, at +~/.gpivrc or at /etc/gpivrc. Except for the number of input data, each parameter is +described by the program key (F_HL) and the parameter name, separated +by a dot (.), followed by its value. The parameters may be defined in +arbitrary order. Blank lines and comment (starting with a pound sign +(#) at the first column) may be included in the parameter files. The +parameters may be overruled by the command line options, as explained +below. +

+  +

Options

+ +
+
-b N
+The number of bits N that represent the pixel value (depth). +
-c N
+Number of columns N that contains the image. +
-f filename Opens file filename.r for reading the image
+and writes the output to filename.fhl. The number of rows and +columns are read from filename.h, if exists. The filename +has to be given without its .r extension. The output will be +written to filename.fhl.r. +
-h
+On-line help +
-p
+Print parameters, command line options and eventually used input and +output filenames to stdout. The output may be used as parameters of +hilo for future use by re-directing stdout to hilo.par. +
-v
+Print version information on standard output, then exit successfully. +
-r N
+Number of rows N that contains the image. +
-w N
+Window size N will be used for calculating the local maximum and +minimum pixel value. +
+
+  +

SEE ALSO

+ +batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+  +

NOTES

+ +The program has been tested and validated with artificial images. +

+  +

AUTHOR

+ +Gerber Van der Graaf +

+  +

BUGS

+ +So far: none. +

+

+

+

+

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/index.html b/doc/C/index.html new file mode 100644 index 0000000..d37961c --- /dev/null +++ b/doc/C/index.html @@ -0,0 +1,65 @@ +G-PIV help + + + + +

index

+

1 Introduction


+ 1.1 General description
+ 1.2 Licence
+ 1.3 Final remarks
+

+

2 GPIV


+ 2.1 General description
+ 2.2 Menu and toolbar
+ 2.3 Process toggle-buttons
+ 2.4 Data buffer list
+ 2.5 Tabulator
+ 2.5.1 Image info
+ 2.5.2 Evaluation
+ 2.5.3 Validation
+ 2.5.3 Post processing
+

+

3 Quantitative Flow Visualization techniques


+ 3.1 Introduction
+ 3.2 Particle Tracking Velocimetry
+ 3.3 Particle Image Velocimetry
+ 3.4 Laser Speckle Velocimetry
+ 3.5 Other techniques
+ 3.6 References
+

+

4 Manual pages GPIV tools

+ 4.1 batch-gpiv Batch processing tool for PIV images +and data. +
+ 4.2 errvec Searches erroneous vectors in a PIV data +file and substitutes with new values. +
+ 4.3 manipiv, fasty, flipx, flipy, revert, rot90, +rot180 Simple data manipulation tool for PIV data. +
+ 4.4 hilo Low-pass filter for removing non-uniform +background and maximizing contrast in (PIV) imgages. +
+ 4.5 rr Correlates image pairs in order to obtain particle +displacements for Digital Particle Image Velocimetry. +
+ 4.6 scale Scaling of PIV data. +
+ 4.7 s-avg Calculates spatial mean and variances of PIV +data. +
+ 4.8 t-avg Calculates time-averaged mean and variances +of PIV data. +
+ 4.9 peaklck Tests PIV data on the so-called +peak-locking effect. +
+ 4.10 piv2vec Converting of PIV data for PLOTMTV +presentation. +
+ 4.11 vorstra Calculates the differential quantities +vorticity, shear strain and normal strain from PIV data. + + + \ No newline at end of file diff --git a/doc/C/intro.html b/doc/C/intro.html new file mode 100644 index 0000000..daf70a6 --- /dev/null +++ b/doc/C/intro.html @@ -0,0 +1,83 @@ +Introduction + + + + Contents
+ Next +

+

Introduction

+ +

1.1 General description

+ +GPIV (Figure 1.1) is a program that performs +Particle Image Velocimetry (PIV) interrogations on a (pair of) +images. A short explanation about PIV and related techniques is given +in Chapter 3. It also includes validation +of the estimators and post-processing on the PIV data that result into +derived (scalar) flow quantities. It is meant to have a quick overview +of the parameters of all piv processes, to change them easely, to run +the processes and visualizing their results in an interactive way. It +visualizes interrogation area's, piv estimators, outliers, velocity +gradients over the interrogation area's and post processing results in +a single window frame. The graphical user interface of GPIV has been +written with the GTK/GNOME libraries. Currently, the images itself can +not be visualized, yet. +

+ +Actually, GPIV is one of the end-user programs that makes extensively +use of libgpiv. Libgpiv includes the main algorithms for +interrogation, validation, post-processing, memory (de)allocation, +in-and output handling, etc. Other end-user programs may be found in +the gpivtools distribution. Gpivtools contains command line programs +that may be invoked from a shell or from scripts. Some example +scripts, written in PERL can be found in the gpivtools distrib, as +well. All codes have been written in ANSI-C and have been developed on +a LINUX box. +

+

+ +
+Figure 1.1 Screenshot of GPIV with PIV estimators +(vectors) from an artificial, computer generated image pair [1]and the derived +vorticity field (background color) +

+ +

1.2 License

+Gpiv 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, or (at your option) any later +version. +

+This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. +

+You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. + + +

1.3 Final remarks

+

+I kindly ask to acknowledge the use of the software in articles, +reports etc. in case the software has considerably contributed in the +analyzes of PIV images. I hope you'll enjoy GPIV. Suggestions for +improvements and additions are welcome. +

+Gerber van der Graaf
+e-mail: gerber.van.der.graaf@upc.es +

+

References

+[1] Okamoto, K., Nishio, S., Saga, T. and Kobayashi, T., 2000, "Standard images +for particle-image velocimetry," Meas. Sci. Technol., 11, 685-691. + vsj.or.jp/piv/ +

+

Contents
+ Next + + + + diff --git a/doc/C/manipiv.html b/doc/C/manipiv.html new file mode 100644 index 0000000..ab06115 --- /dev/null +++ b/doc/C/manipiv.html @@ -0,0 +1,120 @@ +Manpage of + +Name: manipiv
+Section: User Commands (1) +


+ +  +

NAME

+ +manipiv, fasty, flipx, flipy, revert, rot90, rot180 - Simple data manipulation tool for PIV data. +  +

SYNOPSIS

+ +

+manipiv [-f filename] [-h] [-p] [-v] +-fi x0 y0 x1 y1 | --fi x0 y0 x1 y1 | -fy | +
 -r | -rev-x | -y] <  +stdin > stdout +

+ +

+  +

DESCRIPTION

+ +

+manipiv manipulates order and positions of PIV data, mirrors +(flips) the data in horizontal (x) direction, vertical (y) direction, +rotates over 90 and 180 degrees. As rotating over 180 degrees is +similar to flipping over x as well as over y-direction, the program +must be called twice or must be called once by rot180. +

+The parameters and options to be used for manipiv are +subsequently searched in manipiv.par at local directory, at +~/.gpivrc or at /etc/gpivrc. Each parameter is described by the program key (Ar) +and the parameter name, separated by a dot (.), followed by its +value. The parameters may be defined in arbitrary order. Blank lines +and comment (starting with a pound sign (#) at the first column) may +be included in the parameter files. The parameters may be overruled +by the command line options, as explained below. In case an alias has +been used, all other parameters are unset (else they will have to be +defined explicetly). +

+  +

Options

+ +
+
-f filename
+Overrides stdin and stdout with +filename. The filename has to be given without its .piv +extension. Output will be written to filename.ar.piv. The +parameters will be written or appended to filename.par. +
-fi x0 y0 x1 y1
+filters out data from a piv data stream from location (x0,y0) to +(x1,y1). Filtering only implies setting the peak number to -1. +
--fi x0 y0 x1 y1
+filters out all data, except those from (x0,y0) to +(x1,y1). This option is the opposite of -fi. Filtering +only implies setting the peak number to -1. +
-fy
+Returns fast running y-positions of data that are originally written with fast +running x-positions. All other variables (particle displacements, snr, peak#) +are at the new positions, too. Identic to fasty. +
-h
+On-line help. +
-p
+Prints parameters, command line options and input and output filenames +to stdout. The output may be used as parameters of manipiv for +future use by re-directing stdout to manipiv.par. +
-r
+Rotates the data over 90 degrees. Identic to rot90. +
-rev
+Reverts array indexes of output data for getting reversed order. +This results into high to low running positions or vice versa. Identic to +revert. +
-v
+Print version information on standard output, then exits successfully. +
-x
+Flips the data in x-direction (vertical axis). Identic to flipx. +
-y
+Flips the data in y-direction (horizontal axis). Identic to flipy. +
+  +

SEE ALSO

+ +
+batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+  +

NOTES

+ +stdin and stdout has still to be implemented. +[-f filename ] will then be added. +

+  +

AUTHOR

+ +Gerber Van der Graaf +

+  +

BUGS

+ +The program has been tested for PIV data. So far, no bugs have been +found. +

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/peaklck.html b/doc/C/peaklck.html new file mode 100644 index 0000000..21ec29e --- /dev/null +++ b/doc/C/peaklck.html @@ -0,0 +1,93 @@ +Manpage of + +Name: PEAKLCK
+Section: User Commands (1) +
+ +  +

NAME

+ +peaklck - Tests PIV data on the so-called peak-locking effect +by printing/displaying an histogram of the particle displacements at +sub-pixel level. +  +

SYNOPSIS

+ +peaklck +[-g || --g] [-gui || --gui] [-h] [n] filename +

+ +

+  +

DESCRIPTION

+ +

+Peak-locking effects in Particle Image Velocimetry (PIV) result into +estimations of the particle displacments that are mainly at an integer +number of pixels, instead of at sub-pixel displacements. This effect +may due to stretching of the (round) pixel images, due to a too low +resolution of the pixel-image or may due to signal interferences of the +data from camera to frame grabber. Peaklck calculates the +particle displacement distribution at sub-pixel level in between 0.0 +an 1.0 (0 included, 1 excluded). If peaklocking occurs, a non-uniform +distribution of the estimated particle displacements at sub-pixel +level will be found. +

+  +

Options

+ +
+
-g
+Graphical visualization of the histogram with gnuplot. +
--g
+Suppresses graphical visualization. +
-gui
+Setting(s) specific for gpiv graphical user interface; shows the histogram +during 10 seconds +
--gui
+Suppresses setting(s) gpiv graphical user interface. +
-h
+On-line help +
-n N
+Override number of bins (default 10, hard coded). +
-v
+Print version information on standard output, then exit successfully. +

+

+  +

SEE ALSO

+ +batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+  +

NOTES

+ +stdin and stdout has still to be implemented. +[-f filename ] will be added. +

+  +

AUTHOR

+ +Gerber Van der Graaf +

+  +

BUGS

+ +The program seems to work fine with real PIV data. So far, no +serious bugs have been found. + +
+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/piv2vec.html b/doc/C/piv2vec.html new file mode 100644 index 0000000..a5f0d82 --- /dev/null +++ b/doc/C/piv2vec.html @@ -0,0 +1,72 @@ +Manpage of + +Name: piv2vec
+Section: User Commands (1) +
+ +  +

NAME

+ +piv2vec - Converting of PIV data. +  +

SYNOPSIS

+ +

+piv2vec [-f filename] [-h] [-i] [-p] [-v] vecor_scale < stdin > stdout +

+ +

+  +

DESCRIPTION

+ +

+piv2vec adds an header to piv data for a vector plot with Plotmtv. +

+  +

Options

+ +
+
-h
+On-line help. +
-f filename
+Uses files instead of stdin and stdout. The filename has to be +given without its .piv extension. The output will be written to +filename.vec. +
-p
+Plots the output on screen with Plotmtv if -f filename +has been used. +
-v
+Prints version information on standard output, then exits successfully. +
+
+  +

SEE ALSO

+ +batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+  +

AUTHOR

+ +Gerber Van der Graaf +

+  +

BUGS

+ +The program has been tested for PIV data. So far, no bugs have been +found. +

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Author +
  7. Bugs +
+ + diff --git a/doc/C/piv_intro.html b/doc/C/piv_intro.html new file mode 100644 index 0000000..53a0cd6 --- /dev/null +++ b/doc/C/piv_intro.html @@ -0,0 +1,165 @@ +Quantitative Flow Visualization techniques + + + Contents
+ Previous + + +

3 Quantitative Flow Visualization techniques

+ +

3.1 Introduction

+ +For quantitative flow visualization techniques, a flow is visualized +by seeding the fluid with small particles that allow to follow the +instantaneous changes of the flow. The region in the flow to be +researched is illuminated, mostly by a sheet of light. This +light-sheet is generated by an expanding laser beam by means of a +cylindrical lens or due to the projection of the beam on a rotating +hexagonal mirror. The instantaneous flow is recorded at least twice by +very short light flashes with a separation time (Dt) in between that +is known. The flashes have to be sufficiently short in order +image the particle shape. Too long illumination times will result into +streaks of the particle images that will not allow to determine the +exact particle location in the fluid. Several illuminations result in +trace patterns of each particle on the image plane. Analyzing these +particle traces result in local particle displacements. As the +separation time between the recordings is known, the analyses directly +result in velocities. Mainly two different techniques are known: +Particle Tracking Velocimetry (PTV) and Particle Image Velocimetry +(PIV). The difference is in the density of the seeding. In literature +the particle density is often represented by two dimensionless +parameters; the image particle density NI and source +density NS. The source density represents whether the +particle images are overlapping (NS > 1) or can be +recogized individually (NS < 1). NI represents +the ratio of the length of the particles tracks between successive +illuminations and the distances between individual particles. +

+ + + +

3.2 Particle Tracking Velocimetry

+ +In case of PTV a sparse seeding is used (NS < 1 and +NI < 1). Therefore, each particle trace can be analyzed +individually. As the particles are present at random locations in the +fluid, the velocity estimators are found at random locations in the +flow, too. Velocities that have to be obtained in-between the points +of observations will have to be interpolated. PTV is a relatively easy way +for obtaining quantitative information of the flow. Interpolation, +though, is only allowed if the smallest scales of the flow are much +smaller than the distances between the points of observation. Mainly +laminar flows may satisfy this demand. +

+ + + +

3.3 Particle Image Velocimetry

+ +In case of turbulent flows, a whole spectrum of eddies occur with +maximum dimensions related to the flow domain and minimum dimensions +in the order of the Kolmogorov length scale (a few millimeters for +laboratorium experiments). In order to observe these large ranges of +eddy sizes, a high particle density is needed (NI > +1). This means that it is impossible to track the individual +particles. Therefore, the mean displacement of particles in a small +region of the image(s) (the interrogation area) has to be +calculated.
+ + Actually, not the particle displacements are +analyzed, but the image transparency as function of the relative +translation within the interrogation area's. For computerized images +the image density is represented by the pixel values. By locating the +maximum transparancy the mean displacement of the particles in the +interrogation area has been found. The transparancy can be obtained by +shifting the two interrogation areas and subsequently plotting a +two-dimensional histogram of the transparancy. This shifting may be +performed physically, in case of analog images (i.e. photographic slides) +or by means of a numeric algorithm, in case of digital PIV (DPIV). An +other way to obtain the 2-dimensional transparancy function is by +(auto) correlating the interrogation area's of the image. For analog +images the correlation function may be obtained by optical Fourier +Transformation techniques. The interrogation area, then, is +determined by the diameter of the laser beam that interrogates the +image. In case of DPIV, the calculation time of Fourier Transforming +an interrogation area increases linearly with its dimension +(NxN). Therefore, a more efficient method is mostly used by means of +Fast Fourier Transformation (FFT) techniques. With FFT the +calculation effort is related to Nlog(N), which means that it is +advantagous for interrogation areas large than 16x16 points. Typical +dimensions of an interrogation area for Digital PIV are 16x16 to +128x128 pixels.
+ + In order to obtain a reliable estimator of the particle image +displacement, about 10 to 15 particles in an interrogation area have +to be present.
+ + As the particle image density is very high, the +entire image may be interrogated at arbitrary locations. Mostly, the +interrogation process is performed on a rectangular grid of +interrogation areas that are adjacent or partly +overlapping. Therefore, in contrast to PTV, PIV results in a two +dimensional velocity field on a rectangular grid. +

+ + + +

3.4 Laser Speckle Velocimetry

+ +In case particles are overlapping (Ns > 1) no individual +particles can be recognized anymore. By using a coherent light source, +a pattern of speckles is generated due to interferences of the +coherent light. The speckel pattern, then, is imaged and +recordered. Evaluations of interrogation areas from subsequent +recordings, in a identical way as is done for PIV, will result into +the displacements of the speckle patterns. As extremely high particle +densities are needed, penetration of the light sheet is difficult and +care should be taken that particles will not affect the flow +itself. Laser Speckle Velocimetry is mostly used for determining of +velocities of solid surfaces in transport mechanisms (photocopy +machines, for example). +

+ + +

3.5 Other techniques

+PIV has been evolved from photographic PIV in its beginning , some 15 +to 20 years ago, that interrogates the slides by optical Fourier +Transformation to digital PIV, that uses CCD cameras and computer +techniques to carry out the interrogation. Nowadays, even three +dimensional PIV within the light sheet is done by observing the flow +with two or more cameras that are looking under different angels to +the area of researchlight.
Holographic PIV does not have +the restriction of the thickness of the light sheet. It allows to +research a region in the flow that is defined by the coherence length +of the laser source. Their analyses result in three-dimensional +velocities on a three-dimensional grid.
An other +technique that has been reported is 'Global Doppler +Velocimetry'. It uses the doppler shift of the reflected light from +the particles. The doppler shift is then recorded on an image. Time +averaging is needed in order to obtain sufficiently signal So, this +technique results in time averaged velocities at every pixel +of the image, instead of every 16x16 or 128x128 pixels in case of PIV. +

+

3.6 References

+Ronald J. Adrian, 'Particle-imaging techniques for experimental fluid +mechanics', Annu. Rev. Fluid Mech., 1991, 23, 261-304 +

+'Particle Image Velocimetry', Measurement Science and Technology, +vol 8, no 12, special issue +

+M. Raffel, C. Willert, J. Kompenhans, 'Particle Image Velocimetry', +Springer, 1998 +

+'Application of Particle Image Velocimtry, Theory and Practice', +Course notes, March 2-6, 1998, Gottingen +

+J. Westerweel, 'Digital Particle Image Velocimetry, Theory and Application', +PhD thesis, Delft University, 1993 +

+

+ Contents
+ Previous + + + + \ No newline at end of file diff --git a/doc/C/rr.html b/doc/C/rr.html new file mode 100644 index 0000000..d148e54 --- /dev/null +++ b/doc/C/rr.html @@ -0,0 +1,244 @@ +Manpage of + +Name: RR
+Section: Misc. Reference Manual Pages (n) +


+ +  +

NAME

+ +rr - correlates image pairs in order to obtain particle displacements +for Digital Particle Image Velocimetry +  +

SYNOPSIS

+ +

+rr [-ad_int | --ad_int] [-autokey] [-c int] [-cf +int] [-cl int] [-cp int][-cmpr | --cmpr] [-f filename] [-h] [-isi1 int] [-isi_2 int] [-ish int] [-o] [-ifit -1/0/1/2/3] [-k | --k] [-p] [-peak N] [-p_cov] [-p_iter] [-p_int] [-p_piv] [-point f f] [-r int] [-rf int] [-rl int] [-rp int] [-v] [-x | --x] [-z | --z] < inputfile > outputfile +

+  +

DESCRIPTION

+ +

+rr correlates an image or image pair that is obtained from +a fluid flow by the so-called Digital Particle Image Velocimetry +(DPIV) technique. The image(s) are subdevided in interrogation areas +at which the mean particle displacements are estimated. This is done +by correlating the interrogation areas resulting into a +two-dimensional covariance function. The covariance function is +obtained by Fast Fourier Transformation (FFT) techniques. The location +of the covariance peak then represent the mean particle image +displacement within the interrogation area. Estimation of the +covariance peak at sub-pixel level is possible by different +interpolation schemes. The program allows cross-correlation of +single-exposed images on different frames or auto-correlation of +multi-exposed single-frame images. Analyses with different sizes of +interrogation areas between the first and second frame allows large +dynamic ranges of the particle displacements. Zero off-setting of the +interrogation areas by an iterative evaluation process allows high +accuracy of the particle image displacements. +

+For cross-correlation of single-exposed multi-frame images, rr +has to be fed by the (raw or ASCII) data of the images, the second +image concatenated after the first one. If not stdin and stdout is +used (with -f filename), the images have to be called +filename.1.r and filename.2.r (raw image format) for +cross-correlation and filename.r for auto-correlation. The +number of rows and columns are read from the ASCII file +filename.h. Output will then be written to +filename.piv, containing the estimators of the particle +displacements, filename.par with the used parameters for +rr, filename.cov with covariance data (optional) and +filename.1.int, filename.2.int with actual +interrogation regions (optional). Particle displacements from a +previous analysis (eventually obtained without sub-pixel estimation) +may be used as local pre-shifts for further analysis. In that case the +input file filename.piv will be renamed to +filename.old.piv. +

+The parameters and options to be used for rr are subsequently searched +in rr.par at local directory, at +~/.gpivrc or at /etc/gpivrc. Each parameter is described by the program key (Rr) +and the parameter name, separated by a dot (.), followed by its +value. Some of the parameters are optional. The parameters may be +defined in arbitrary order. Blank lines and comment (starting with a +pound sign (#) at the first column) may be included in the parameter +files. Parameters may be overruled by the command line options, +as explained below. If -f has been used, the used parameters are +written to filename.par. By renaming this file to +rr-2.2.par, it may directly be re-used for identic analyses of +other images. +

+  +

Options

+ +
+
-ad_int
+Adaptive interrogation size; The size of the second interrogation +region may be choosen larger than the first one in order to obtain +high dynamic ranges. Though, this may result into low spatial +resolutions of the PIV estimators. Only if -z has been set, +-ad_int will adapt the size of the 2nd interrogation region to +the first one after the first iteration step, resulting into higher +spatial resolutions. See also -col_start, -row_start and +-int_size_2N. +
--ad_int
+Supresses adaptive interrogation size. +
-autokey
+Sets automatically parameters that depend on others: zero_off is set to 1 if +ad_int = 1 , weight is set to 0 if zero_off = 1 and weight is set to 1 +if zero_off = 0. +
-cmpr N
+Compresses the image with factor N by taking the mean value of +the NxN pixel values. N has to be a power of +2. -cmpr can only be used in combination with -fit equal to +0. This option will speed up the image analyses by a factor +N**2. The output, may be read as local pre-shift +values in a next image evaluation, similar to -z. +
--cmpr
+Suppresses image compression. +
-c N
+Specify the number of columns with N that +contains the image. +
-cf N
+Specify the first column N in the image to interrogate. If -ad_int has been used, the first column has to be equal or larger than +(int_size_2 - int_size_1)/2. +
-cl N
+Specify the last column N in the image to interrogate. +
-cp N
+Pre-shift of N columns. This can be used if +there is a common mean flow in x-direction in the area of +observation. Relative small interrogation areas (allowing a high spatial +resolution) may be used in that case with conservation of a high +probability in finding the correct displacement peaks. +
-f filename
+Overrides stdin and stdout with filename. +
-h
+Print a help message on standard output and exit successfully. +
-ifit -1/0/1/2/3
+Interpolation model for peak maximum estimation at sub-pixel +level. -1: Levenberg-Marquardt model parameter estimation: +0: none, 1: Gauss, 2: Parabolic or 3 Centre of +Gravity. +
-isi1 N
+Size of first interrogation area N, expressed in pixels. Must be +a power of two. +
-isi2 N
+Size of second interrogation area N. Must be a power of two and +must be equal or larger than isi1. Larger sizes of the 2nd +interrogation area allows particle displacements larger than 1/4th of +the first interrogation size (which is generally recommended in order +to keep in-plane error at minimum), i.e. an increase of dynamical +range. Though, the Signal to Noise Ratio (SNR) may decrease in that +case, resulting in a lower probability in finding the correct +displacement peak. It is adviced to keep the ratio of the second and +first interrogation size below 4. In combination with ad_int the +SNR and spatial resolution (i.e. independancy of neighbouring +interrogation regions) may be increased significantly during a next +iteration sweep. +
-ish N
+Shift of adjacent interrogation areas N, expressed in pixels. +
-k
+Uses kernel weighting. This is applied in the calculation of the +covariance function; the weighting of the image data decreases towards +the edges of the interrogation region. Kernel weighting compensates +this effect. +
--k
+Suppresses kernel weighting. +
-o
+Reads an old output file from a previous evaluation with rr +for further analysis. The data are used as individual pre-shifts for +each interrogation area. Can only be used in combination with -f +filename +
-p
+Print parameters, command line options, progress of calculation and +eventually used input and output filenames to stdout. The output is +the same as filename.par if -f is used and it can be used as input +parameters of rr for future analyses by re-directing stdout to +rr-2.2.par (X-your-fingers). +
-peak N
+Find the N-th maximum of the covariance peak. In case of +auto-covariance the second peak is taken by default, as the first peak +denotes the zero-shift of the particle displacements. +
-p_cov
+Print the covariance function. +
-p_int
+Print the interrogation region(s). +
-p_iter
+Print the iteration steps for the covariance peak search if -z +has been used. +
-p_piv
+Print the piv results to stdout, even if -f has been specified. +
-point x y
+Select a single area in the image to interrogate at location x +y. This option is usefull for substitution of erroneous +displacement vectors. A new estimation of the particle displacement +with -peak may give a correct result. Mind to use -p_piv +if -f is used; else the original data file will be overwritten +with a single point analyses. +
-r N
+Number of rows N that contains the image. +
-rf N
+Specify the first row N in the image to interrogate. If -ad_int has been used, the first row has to be equal or larger than +(int_size_2 - int_size_1)/2. +
-rl N
+Specify the last row N in the image to interrogate. +
-rp N
+Pre-shift of N rows. This can be used if +there is a common mean flow in y-direction in the area of +observation. Relative small interrogation areas (allowing a high spatial +resolution) may be used in that case with conservation of a high +probability in finding the correct displacement peaks. +
-v
+Print version information on standard output then exit successfully. +
-x
+Calculates cross-covariance function of two images. +
--x
+Calculates auto-covariance function of a single, double-exposed image. +
-z
+Searches (iteratively) the covariance peak for zero-offset use, until +the top lies between (-1,-1) and (1,1). Then sub-pixel interrogation will be +done. +
--z
+Supresses zero-offset +

+

+  +

SEE ALSO

+ +batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+  +

NOTES

+ +rr has been tested with artificial images and with PIV images from gas and +liquid flows. Comparison with PIV data, obtained from different codes, +and with literature results that similar data reliability and accuracy can +be obtained with this program. +

+  +

AUTHOR

+ +Gerber Van der Graaf +

+  +

BUGS

+ +So far, no serious bugs have been found. +

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/s-avg.html b/doc/C/s-avg.html new file mode 100644 index 0000000..7de2a9a --- /dev/null +++ b/doc/C/s-avg.html @@ -0,0 +1,97 @@ +Manpage of + +Name: s-avg
+Section: User Commands (1) +
+ +   +

NAME

+ +s-avg - Spatial statistics of PIV data. +   +

SYNOPSIS

+ +

+s-avg [-f filename] [-h] [-p] [-s | --s] +[-v] < stdin > stdout +

+ +

+   +

DESCRIPTION

+ +

+s-avg s-avg reports the spatial global mean velocities and +variances in x and y-direction of a PIV data stream. Only input data +of which the peak number is not equal to -1 are taken into +account. +

+The parameters and options to be used for s-avg are subsequently +searched in s-avg.par at local directory +, at +~/.gpivrc or at /etc/gpivrc. Each parameter is described by the program key +(S-Avg) and the parameter name, separated by a dot (.), followed by its +value. The parameters may be defined in arbitrary order. Blank lines +and comment (starting with a pound sign (#) at the first column) may +be included in the parameter files. The parameters may be overruled +by the command line options, as explained below. +

+   +

Options

+ +
+
-f filename
+Overrides stdin and stdout with filename. The filename has +to be given without its .piv extension. The output will be +written to filename.sa.piv. The parameters will be written or +appended to filename.par. +
-h
+On-line help. +
-p
+Prints parameters, command line options and input and output filenames +to stdout. The output may be used as parameters of s-avg for +future use by re-directing stdout to s-avg.par. +
-s
+Substracts the mean x-and y-particle displacements from the input data. +
--s
+Suppresses substacting the mean values from the input data. +
-v
+Prints version information on standard output, then exits successfully. +
+
+   +

SEE ALSO

+ +batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+   +

NOTES

+ +

+   +

AUTHOR

+ +Gerber Van der Graaf +

+   +

BUGS

+ +The program has been tested for PIV data. So far, no bugs have been +found. +

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/scale.html b/doc/C/scale.html new file mode 100644 index 0000000..169977f --- /dev/null +++ b/doc/C/scale.html @@ -0,0 +1,108 @@ +Manpage of + +Name: scale
+Section: User Commands (1) +
+ +  +

NAME

+ +scale - Scaling of PIV data. +  +

SYNOPSIS

+ +

+scale [-f filename] [-h] [-p] [-s M |-S M] +[-t dT |-T dT] +[-v] [-z x0 y0] < stdin > stdoutfR +

+ +

+  +

DESCRIPTION

+ +

+scale corrects PIV data for the image magnification and timing +between successive recordings. This results that particle +displacements [px] are translated to velocities [m/s]. A physical +reference for the positions of the PIV data can be applied by the +zero-offset option. +

+The parameters and options to be used for scale are subsequently +searched in scale.par at local directory, at ~/.gpivrc or +at /etc/gpivrc. Each parameter is described by the program key +(Scale) and the parameter name, separated by a dot (.), followed by +its value. The parameters may be defined in arbitrary order. Blank +lines and comment (starting with a pound sign (#) at the first column) +may be included in the parameter files. The parameters may be +overruled by the command line options, as explained below. +

+  +

Options

+ +
+
-f filename
+Overrides stdin and stdout with filename. The filename has +to be given without its .piv extension. The output will be +written to filename.sc.piv. The parameters will be written or +appended to filename.par. +
-h
+On-line help. +
-p
+Prints parameters, command line options and input and output filenames +to stdout. The output may be used as parameters of scale for +future use by re-directing stdout to scale.par. +
-s M
+spatial scaling with magnifation factor M [m/px] +
-S M
+Inverse spatial scaling with magnifation factor M [m/px]; returns +scaled data to their original magnitudes. +
-v
+Prints version information on standard output, then exits successfully. +
-t dT
+Translates particle displacements into velocities by deviding them +with the time between subsequent recordings dT [s]. +
-T dT
+Inverse time scaling. Returns velocities into displacements [px] +
[-z x0 y0]
+Relates the positions of the observations of velocities/displacements +to a physical location in the experiment by zero off-setting. x0 +y0 denote the physical position of pixel (0,0) in the image. +

+

+  +

SEE ALSO

+ +batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+  +

NOTES

+ +

+  +

AUTHOR

+ +Gerber Van der Graaf +

+  +

BUGS

+ +The program has been tested for PIV data. So far, no bugs have been +found. +

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/t-avg.html b/doc/C/t-avg.html new file mode 100644 index 0000000..293e45d --- /dev/null +++ b/doc/C/t-avg.html @@ -0,0 +1,104 @@ +Manpage of + +Name: t-avg
+Section: User Commands (1) +
+ +  +

NAME

+ +t-avg - Calculates time-averaged mean and variances of PIV data. +  +

SYNOPSIS

+ +

+t-avg +[-dn | --dir_name dir base-name] +[-fd | --first_dir N] +[-ld | --last_dir N] +[-fn | --file_name file base-name] +[-ff | --first_file N] +[-lf | --last_file N] +[-hf | --help] +[-p | --print] +[-v | --version] +

+ +

+  +

DESCRIPTION

+ +

+t-avg calculates mean and variances of a set of piv data +resulting into time-avaraged values. If no parameters are defined at +the command line, standard parameters will be used that are defined in +the script. +

+  +

Options

+ +
+
-dn [--dir_name] dir base-name
+The dir base-name represents the directory name without its last number. It is supposed that the last number in the directory name is a counter. +
-fd [--first_dir]
+Defines the counter N of the first directory number at which the analyses starts. +
-ld [--last_dir]
+Last directory number N at which the analyses ends. +
-fn [--file_name] file base-name
+The filename has to be given without its .piv +extension. The file base-name represents the file name without +its last number, before the extension. It is supposed that the last +number in the file name is a counter. The output will be written to +dir base-name/file base-name.mpiv and +dirname/filename.spiv at +which mean values and variances are written respectively. +
-ff [--first_file]
+Defines the counter Nof first file number at which the analyses starts. +
-lf [--last_file]
+Last file number N at which the analyses ends. +
-h [--help]
+On-line help. +
-p [--print]
+Prints parameters, command line options and input and output filenames +to stdout. The output may be used as parameters of t-avg for +future use by re-directing stdout to t-avg.par. +
-v [--version]
+Prints version information on standard output, then exits successfully. +
+
+  +

SEE ALSO

+ +batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec,vorstra +

+  +

NOTES

+ +

+  +

AUTHOR

+ +Gerber Van der Graaf +

+  +

BUGS

+ +The program has been tested for PIV data. So far, no bugs have been +found. +

+ +


+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/C/topic.dat b/doc/C/topic.dat new file mode 100644 index 0000000..92e1552 --- /dev/null +++ b/doc/C/topic.dat @@ -0,0 +1,16 @@ +index.html index manual +intro.html introduction manual +gpiv.html gpiv manual +piv_intro.html piv introduction manual + +batch-gpiv.html batch-gpiv manual +err_vec.html err_vec manual +flip.html flip manual +hilo.html hilo manual +manipiv.html manipiv manual +peaklck.html peaklck manual +rr.html rr manual +s-avg.html s-avg manual +scale.html scale manual +t-avg.html t-avg manual +vorstra.html vorstra manual \ No newline at end of file diff --git a/doc/C/vorstra.html b/doc/C/vorstra.html new file mode 100644 index 0000000..47912c4 --- /dev/null +++ b/doc/C/vorstra.html @@ -0,0 +1,119 @@ +Manpage of + +Name: VORSTRA
+Section: User Commands (1) +
+ +  +

NAME

+ +vorstra - Calculates the differential quantities vorticity, shear +strain and normal strain from PIV data. +  +

SYNOPSIS

+ +

+vorstra +[-d int] [-f filename] [-h] [-n | -o | -s] +[-p] [-g | --g] [-gui | --gui] [-v] < stdin > stdoutfR +

+ +

+  +

DESCRIPTION

+ +

+vorstra calculates the differential +quantities like vorticity, shear strain and normal strain from PIV +data. You can choose from several differential schemes: central +differentiation, least squares, Richardson +extrapolation and circulation method. Circulation method allows only +to calculate vorticity, but no strain. The output can be generated +as ASCII data containing four columns or as GNUPlot Data format that +allows to view/print the data as contour plots. +

+The parameters and options to be used for vorstra are +subsequently searched in vorstra.par at local directory, at +~/.gpivrc or at /etc/gpivrc. Except for the number of +input data, each parameter is described by the program key (Vos) and +the parameter name, separated by a dot (.), followed by its +value. Some of the parameters are optional. The parameters may be +defined in arbitrary order. Blank lines and comment (starting with a +pound sign (#) at the first column) may be included in the parameter +files. The parameters may be overruled by the command line options, +as explained below. +

+  +

Options

+ +
+
-d N
+Differential type to be used: central difference +(N=0), least squares (N=1), Richardson interpolation +(N=2), circulation method (N=3) +
-f filename
+Overrides stdin and stdout with filename. The filename has +to be given without its .piv extension. The output will be +written to filename.vor. +
-h
+On-line help +
-n
+Calculate normal strain of the PIV data. +
-o
+Calculate vorticity of the PIV data. +
-p
+Print parameters, command line options and eventually used input and +output filenames to stdout. The output may be used as parameters of +vorstra for future use by re-directing stdout to +vorstra.par. +
-s
+Calculate shear strain of the PIV data. +
-g
+Show contour plot of the output with gnuplot. +
--g
+Suppresses to show contour plot of the output with gnuplot. +
-gui
+Setting(s) specific for gpiv graphical user interface; will show the +contourplot during 10 seconds. +
--gui
+Suppresses settngs specific for gpiv graphical user interface +
-v
+Print version information on standard output, then exit successfully. +

+

+  +

SEE ALSO

+ +batch-gp, dav2piv, err_vec, manipiv, hilo, rr, scale, s-avg, t-avg, peaklck, +piv2vec, vorstra +

+  +

NOTES

+ +The program has been tested and validated for manual generated PIV +data. +

+  +

AUTHOR

+ +Gerber Van der Graaf +

+  +

BUGS

+ +Stdin and stdout do not work. + +
+ 

Table of Contents

+
    +
  1. Name +
  2. Synopsis +
  3. Description +
  4. Options +
  5. See also +
  6. Notes +
  7. Author +
  8. Bugs +
+ + diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..15fb0bc --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = C diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..d585e02 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,323 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +DATADIRNAME = @DATADIRNAME@ +DEBUG = @DEBUG@ +DEMO = @DEMO@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@ +GNOMEUI_LIBS = @GNOMEUI_LIBS@ +GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@ +GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@ +GNOME_CONFIG = @GNOME_CONFIG@ +GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@ +GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@ +GNOME_LIBDIR = @GNOME_LIBDIR@ +GNOME_LIBS = @GNOME_LIBS@ +GNORBA_CFLAGS = @GNORBA_CFLAGS@ +GNORBA_LIBS = @GNORBA_LIBS@ +GTKXMHTML_LIBS = @GTKXMHTML_LIBS@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIBICONV = @LIBICONV@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +ORBIT_CFLAGS = @ORBIT_CFLAGS@ +ORBIT_CONFIG = @ORBIT_CONFIG@ +ORBIT_IDL = @ORBIT_IDL@ +ORBIT_LIBS = @ORBIT_LIBS@ +OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ +OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ +PACKAGE = @PACKAGE@ +PACKAGE_PIXMAPS_DIR = @PACKAGE_PIXMAPS_DIR@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PTHREAD_LIB = @PTHREAD_LIB@ +RANLIB = @RANLIB@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XPM_LIBS = @XPM_LIBS@ +ZVT_LIBS = @ZVT_LIBS@ +cflags_set = @cflags_set@ +cxxflags_set = @cxxflags_set@ + +SUBDIRS = C +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = doc + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +install-exec-am: +install-exec: install-exec-recursive + +install-data-am: +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: +uninstall: uninstall-recursive +all-am: Makefile +all-redirect: all-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-tags clean-generic mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-tags distclean-generic clean-am + +distclean: distclean-recursive + +maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + +.PHONY: install-data-recursive uninstall-data-recursive \ +install-exec-recursive uninstall-exec-recursive installdirs-recursive \ +uninstalldirs-recursive all-recursive check-recursive \ +installcheck-recursive info-recursive dvi-recursive \ +mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-redirect all-am all installdirs-am \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gpiv_logo.png b/gpiv_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a53bd15450b93f8120a46bf2fb506b3218de99b0 GIT binary patch literal 609 zcwPZv0-pVeP)J*s0000QbVXQnQ*UN;cVTj6 z07p(wO+_F{V{dLCMPzAoZ*rb03TyxX0n$lCK~#90?U`+g!ypibw~kF{VISx8RO zK#?ZUW0~`0e=M^M){jxgh>#Zwf!NOTjx$D6A=NnatdG_Jr8*6?)@h)%P6Msgy@AWo z0e`-~cFMTN^Cc+b4lzK5&QUc3K4@xYsbV+a0_TRtVr^m@{_%VX7yP1UwvrNDyHN~} zp>5ck8sF~S)F|+EN?ev1@WEpsAGm95NQ<6#_zXi~4}`#N*xa)5eGklL8=$~LpheHS zFT0`pE_i!fmH{e!jxaR9hWewZgedUT(g{I^dLwxig6x-O-j(SbCCxx7JQp-p^}SFH zXsjv*YC~gHF;E*Ci~J~GMam8i}nBnlWG#iY;S>J7O2^e!KXfB*jFJ} zN%{JNhUGd4Re37`qCl3O?%0;m(v0SQzx%h-rvVO?l;7e14}iFy v#LZ`*wE3GGC{_0cn)LwJleqgC=-$9D=>0q6LSYd500000NkvXXu0mjfn@$ZL literal 0 HcwPel00001 diff --git a/install-sh b/install-sh new file mode 100644 index 0000000..e9de238 --- /dev/null +++ b/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/intl/ChangeLog b/intl/ChangeLog new file mode 100644 index 0000000..84e2b37 --- /dev/null +++ b/intl/ChangeLog @@ -0,0 +1,4 @@ +2001-09-13 GNU + + * Version 0.10.40 released. + diff --git a/intl/Makefile.in b/intl/Makefile.in new file mode 100644 index 0000000..19ed4a7 --- /dev/null +++ b/intl/Makefile.in @@ -0,0 +1,313 @@ +# Makefile for directory with message catalog handling in GNU NLS Utilities. +# Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = .. +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +transform = @program_transform_name@ +libdir = @libdir@ +includedir = @includedir@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/intl +aliaspath = $(localedir) +subdir = intl + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` + +l = @INTL_LIBTOOL_SUFFIX_PREFIX@ + +AR = ar +CC = @CC@ +LIBTOOL = @LIBTOOL@ +RANLIB = @RANLIB@ +YACC = @INTLBISON@ -y -d +YFLAGS = --name-prefix=__gettext + +DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ +-DLIBDIR=\"$(libdir)\" @DEFS@ +CPPFLAGS = @CPPFLAGS@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +HEADERS = $(COMHDRS) libgnuintl.h libgettext.h loadinfo.h +COMHDRS = gettext.h gettextP.h hash-string.h +SOURCES = $(COMSRCS) intl-compat.c +COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ +finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ +explodename.c dcigettext.c dcngettext.c dngettext.c ngettext.c plural.y \ +localcharset.c +OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ +finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ +explodename.$lo dcigettext.$lo dcngettext.$lo dngettext.$lo ngettext.$lo \ +plural.$lo localcharset.$lo +GETTOBJS = intl-compat.$lo +DISTFILES.common = Makefile.in \ +config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) +DISTFILES.generated = plural.c +DISTFILES.normal = VERSION +DISTFILES.gettext = COPYING.LIB-2 COPYING.LIB-2.1 libintl.glibc +DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c + +# Libtool's library version information for libintl. +# Before making a gettext release, the gettext maintainer must change this +# according to the libtool documentation, section "Library interface versions". +# Maintainers of other packages that include the intl directory must *not* +# change these values. +LTV_CURRENT=1 +LTV_REVISION=1 +LTV_AGE=0 + +.SUFFIXES: +.SUFFIXES: .c .y .o .lo .sin .sed +.c.o: + $(COMPILE) $< +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) $< + +.y.c: + $(YACC) $(YFLAGS) --output $@ $< + rm -f $*.h + +.sin.sed: + sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ + mv t-$@ $@ + +INCLUDES = -I.. -I. -I$(top_srcdir)/intl + +all: all-@USE_INCLUDED_LIBINTL@ +all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed +all-no: all-no-@BUILD_INCLUDED_LIBINTL@ +all-no-yes: libgnuintl.$la +all-no-no: + +libintl.a libgnuintl.a: $(OBJECTS) + rm -f $@ + $(AR) cru $@ $(OBJECTS) + $(RANLIB) $@ + +libintl.la libgnuintl.la: $(OBJECTS) + $(LIBTOOL) --mode=link \ + $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ + $(OBJECTS) @LIBICONV@ \ + -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ + -rpath $(libdir) \ + -no-undefined + +libintl.h: libgnuintl.h + cp $(srcdir)/libgnuintl.h libintl.h + +charset.alias: config.charset + $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ + mv t-$@ $@ + +check: all + +# This installation goal is only used in GNU gettext. Packages which +# only use the library should use install instead. + +# We must not install the libintl.h/libintl.a files if we are on a +# system which has the GNU gettext() function in its C library or in a +# separate library. +# If you want to use the one which comes with this version of the +# package, you have to use `configure --with-included-gettext'. +install: install-exec install-data +install-exec: all + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ + $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ + $(LIBTOOL) --mode=install \ + $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir); \ + temp=$(DESTDIR)$(libdir)/t-charset.alias; \ + dest=$(DESTDIR)$(libdir)/charset.alias; \ + if test -f $(DESTDIR)$(libdir)/charset.alias; then \ + orig=$(DESTDIR)$(libdir)/charset.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + else \ + if test @GLIBC21@ = no; then \ + orig=charset.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + fi; \ + fi; \ + $(mkinstalldirs) $(DESTDIR)$(localedir); \ + test -f $(DESTDIR)$(localedir)/locale.alias \ + && orig=$(DESTDIR)$(localedir)/locale.alias \ + || orig=$(srcdir)/locale.alias; \ + temp=$(DESTDIR)$(localedir)/t-locale.alias; \ + dest=$(DESTDIR)$(localedir)/locale.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + else \ + : ; \ + fi +install-data: all + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ + $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \ + dists="COPYING.LIB-2 COPYING.LIB-2.1 $(DISTFILES.common)"; \ + for file in $$dists; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \ + dists="$(DISTFILES.generated)"; \ + for file in $$dists; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + $(INSTALL_DATA) $$dir/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + dists="$(DISTFILES.obsolete)"; \ + for file in $$dists; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + if test "$(PACKAGE)" = "gettext" \ + && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ + rm -f $(DESTDIR)$(includedir)/libintl.h; \ + $(LIBTOOL) --mode=uninstall \ + rm -f $(DESTDIR)$(libdir)/libintl.$la; \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + if test -f $(DESTDIR)$(libdir)/charset.alias; then \ + temp=$(DESTDIR)$(libdir)/t-charset.alias; \ + dest=$(DESTDIR)$(libdir)/charset.alias; \ + sed -f ref-del.sed $$dest > $$temp; \ + if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ + rm -f $$dest; \ + else \ + $(INSTALL_DATA) $$temp $$dest; \ + fi; \ + rm -f $$temp; \ + fi; \ + if test -f $(DESTDIR)$(localedir)/locale.alias; then \ + temp=$(DESTDIR)$(localedir)/t-locale.alias; \ + dest=$(DESTDIR)$(localedir)/locale.alias; \ + sed -f ref-del.sed $$dest > $$temp; \ + if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ + rm -f $$dest; \ + else \ + $(INSTALL_DATA) $$temp $$dest; \ + fi; \ + rm -f $$temp; \ + fi; \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext"; then \ + for file in VERSION ChangeLog COPYING.LIB-2 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +info dvi: + +$(OBJECTS): ../config.h libgnuintl.h +bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h +dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h + +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) + +id: ID + +ID: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) + + +mostlyclean: + rm -f *.a *.la *.o *.lo core core.* + rm -f libintl.h charset.alias ref-add.sed ref-del.sed + rm -f -r .libs _libs + +clean: mostlyclean + +distclean: clean + rm -f Makefile ID TAGS + if test "$(PACKAGE)" = gettext; then \ + rm -f ChangeLog.inst $(DISTFILES.normal); \ + else \ + : ; \ + fi + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + + +# GNU gettext needs not contain the file `VERSION' but contains some +# other files which should not be distributed in other packages. +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: Makefile + if test "$(PACKAGE)" = gettext; then \ + additional="$(DISTFILES.gettext)"; \ + else \ + additional="$(DISTFILES.normal)"; \ + fi; \ + $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ + for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + ln $$dir/$$file $(distdir) 2> /dev/null \ + || cp -p $$dir/$$file $(distdir); \ + done + +Makefile: Makefile.in ../config.status + cd .. \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/intl/VERSION b/intl/VERSION new file mode 100644 index 0000000..cb8a01a --- /dev/null +++ b/intl/VERSION @@ -0,0 +1 @@ +GNU gettext library from gettext-0.10.40 diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c new file mode 100644 index 0000000..c6a9bd1 --- /dev/null +++ b/intl/bindtextdom.c @@ -0,0 +1,369 @@ +/* Implementation of the bindtextdomain(3) function + Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "gettextP.h" + +#ifdef _LIBC +/* We have to handle multi-threaded applications. */ +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_rwlock_define(CLASS, NAME) +# define __libc_rwlock_wrlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_dirname _nl_default_dirname__ +# define _nl_domain_bindings _nl_domain_bindings__ +#endif + +/* Some compilers, like SunOS4 cc, don't have offsetof in . */ +#ifndef offsetof +# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) +#endif + +/* @@ end of prolog @@ */ + +/* Contains the default location of the message catalogs. */ +extern const char _nl_default_dirname[]; + +/* List with bindings of specific domains. */ +extern struct binding *_nl_domain_bindings; + +/* Lock variable to protect the global data in the gettext implementation. */ +__libc_rwlock_define (extern, _nl_state_lock) + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define BINDTEXTDOMAIN __bindtextdomain +# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define BINDTEXTDOMAIN bindtextdomain__ +# define BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset__ +#endif + +/* Prototypes for local functions. */ +static void set_binding_values PARAMS ((const char *domainname, + const char **dirnamep, + const char **codesetp)); + +/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP + to be used for the DOMAINNAME message catalog. + If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not + modified, only the current value is returned. + If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither + modified nor returned. */ +static void +set_binding_values (domainname, dirnamep, codesetp) + const char *domainname; + const char **dirnamep; + const char **codesetp; +{ + struct binding *binding; + int modified; + + /* Some sanity checks. */ + if (domainname == NULL || domainname[0] == '\0') + { + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + return; + } + + __libc_rwlock_wrlock (_nl_state_lock); + + modified = 0; + + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding != NULL) + { + if (dirnamep) + { + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The current binding has be to returned. */ + *dirnamep = binding->dirname; + else + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->dirname; + if (strcmp (dirname, result) != 0) + { + if (strcmp (dirname, _nl_default_dirname) == 0) + result = (char *) _nl_default_dirname; + else + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (dirname); +#else + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, dirname, len); +#endif + } + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->dirname != _nl_default_dirname) + free (binding->dirname); + + binding->dirname = result; + modified = 1; + } + } + *dirnamep = result; + } + } + + if (codesetp) + { + const char *codeset = *codesetp; + + if (codeset == NULL) + /* The current binding has be to returned. */ + *codesetp = binding->codeset; + else + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->codeset; + if (result == NULL || strcmp (codeset, result) != 0) + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, codeset, len); +#endif + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->codeset != NULL) + free (binding->codeset); + + binding->codeset = result; + binding->codeset_cntr++; + modified = 1; + } + } + *codesetp = result; + } + } + } + else if ((dirnamep == NULL || *dirnamep == NULL) + && (codesetp == NULL || *codesetp == NULL)) + { + /* Simply return the default values. */ + if (dirnamep) + *dirnamep = _nl_default_dirname; + if (codesetp) + *codesetp = NULL; + } + else + { + /* We have to create a new binding. */ + size_t len = strlen (domainname) + 1; + struct binding *new_binding = + (struct binding *) malloc (offsetof (struct binding, domainname) + len); + + if (__builtin_expect (new_binding == NULL, 0)) + goto failed; + + memcpy (new_binding->domainname, domainname, len); + + if (dirnamep) + { + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The default value. */ + dirname = _nl_default_dirname; + else + { + if (strcmp (dirname, _nl_default_dirname) == 0) + dirname = _nl_default_dirname; + else + { + char *result; +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (dirname); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; +#else + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; + memcpy (result, dirname, len); +#endif + dirname = result; + } + } + *dirnamep = dirname; + new_binding->dirname = (char *) dirname; + } + else + /* The default value. */ + new_binding->dirname = (char *) _nl_default_dirname; + + new_binding->codeset_cntr = 0; + + if (codesetp) + { + const char *codeset = *codesetp; + + if (codeset != NULL) + { + char *result; + +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; + memcpy (result, codeset, len); +#endif + codeset = result; + new_binding->codeset_cntr++; + } + *codesetp = codeset; + new_binding->codeset = (char *) codeset; + } + else + new_binding->codeset = NULL; + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + modified = 1; + + /* Here we deal with memory allocation failures. */ + if (0) + { + failed_codeset: + if (new_binding->dirname != _nl_default_dirname) + free (new_binding->dirname); + failed_dirname: + free (new_binding); + failed: + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + } + } + + /* If we modified any binding, we flush the caches. */ + if (modified) + ++_nl_msg_cat_cntr; + + __libc_rwlock_unlock (_nl_state_lock); +} + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +char * +BINDTEXTDOMAIN (domainname, dirname) + const char *domainname; + const char *dirname; +{ + set_binding_values (domainname, &dirname, NULL); + return (char *) dirname; +} + +/* Specify the character encoding in which the messages from the + DOMAINNAME message catalog will be returned. */ +char * +BIND_TEXTDOMAIN_CODESET (domainname, codeset) + const char *domainname; + const char *codeset; +{ + set_binding_values (domainname, NULL, &codeset); + return (char *) codeset; +} + +#ifdef _LIBC +/* Aliases for function names in GNU C Library. */ +weak_alias (__bindtextdomain, bindtextdomain); +weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset); +#endif diff --git a/intl/config.charset b/intl/config.charset new file mode 100755 index 0000000..f4f2611 --- /dev/null +++ b/intl/config.charset @@ -0,0 +1,438 @@ +#! /bin/sh +# Output a system dependent table of character encoding aliases. +# +# Copyright (C) 2000-2001 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# The table consists of lines of the form +# ALIAS CANONICAL +# +# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". +# ALIAS is compared in a case sensitive way. +# +# CANONICAL is the GNU canonical name for this character encoding. +# It must be an encoding supported by libiconv. Support by GNU libc is +# also desirable. CANONICAL is case insensitive. Usually an upper case +# MIME charset name is preferred. +# The current list of GNU canonical charset names is as follows. +# +# name used by which systems a MIME name? +# ASCII, ANSI_X3.4-1968 glibc solaris freebsd +# ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-3 glibc yes +# ISO-8859-4 osf solaris freebsd yes +# ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes +# ISO-8859-6 glibc aix hpux solaris yes +# ISO-8859-7 glibc aix hpux irix osf solaris yes +# ISO-8859-8 glibc aix hpux osf solaris yes +# ISO-8859-9 glibc aix hpux irix osf solaris yes +# ISO-8859-13 glibc +# ISO-8859-15 glibc aix osf solaris freebsd +# KOI8-R glibc solaris freebsd yes +# KOI8-U glibc freebsd yes +# CP437 dos +# CP775 dos +# CP850 aix osf dos +# CP852 dos +# CP855 dos +# CP856 aix +# CP857 dos +# CP861 dos +# CP862 dos +# CP864 dos +# CP865 dos +# CP866 freebsd dos +# CP869 dos +# CP874 win32 dos +# CP922 aix +# CP932 aix win32 dos +# CP943 aix +# CP949 osf win32 dos +# CP950 win32 dos +# CP1046 aix +# CP1124 aix +# CP1129 aix +# CP1250 win32 +# CP1251 glibc win32 +# CP1252 aix win32 +# CP1253 win32 +# CP1254 win32 +# CP1255 win32 +# CP1256 win32 +# CP1257 win32 +# GB2312 glibc aix hpux irix solaris freebsd yes +# EUC-JP glibc aix hpux irix osf solaris freebsd yes +# EUC-KR glibc aix hpux irix osf solaris freebsd yes +# EUC-TW glibc aix hpux irix osf solaris +# BIG5 glibc aix hpux osf solaris freebsd yes +# BIG5-HKSCS glibc +# GBK aix osf win32 dos +# GB18030 glibc +# SHIFT_JIS hpux osf solaris freebsd yes +# JOHAB glibc win32 +# TIS-620 glibc aix hpux osf solaris +# VISCII glibc yes +# HP-ROMAN8 hpux +# HP-ARABIC8 hpux +# HP-GREEK8 hpux +# HP-HEBREW8 hpux +# HP-TURKISH8 hpux +# HP-KANA8 hpux +# DEC-KANJI osf +# DEC-HANYU osf +# UTF-8 glibc aix hpux osf solaris yes +# +# Note: Names which are not marked as being a MIME name should not be used in +# Internet protocols for information interchange (mail, news, etc.). +# +# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications +# must understand both names and treat them as equivalent. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + +host="$1" +os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` +echo "# This file contains a table of character encoding aliases," +echo "# suitable for operating system '${os}'." +echo "# It was automatically generated from config.charset." +# List of references, updated during installation: +echo "# Packages using this file: " +case "$os" in + linux* | *-gnu*) + # With glibc-2.1 or newer, we don't need any canonicalization, + # because glibc has iconv and both glibc and libiconv support all + # GNU canonical names directly. Therefore, the Makefile does not + # need to install the alias file at all. + # The following applies only to glibc-2.0.x and older libcs. + echo "ISO_646.IRV:1983 ASCII" + ;; + aix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "IBM-850 CP850" + echo "IBM-856 CP856" + echo "IBM-921 ISO-8859-13" + echo "IBM-922 CP922" + echo "IBM-932 CP932" + echo "IBM-943 CP943" + echo "IBM-1046 CP1046" + echo "IBM-1124 CP1124" + echo "IBM-1129 CP1129" + echo "IBM-1252 CP1252" + echo "IBM-eucCN GB2312" + echo "IBM-eucJP EUC-JP" + echo "IBM-eucKR EUC-KR" + echo "IBM-eucTW EUC-TW" + echo "big5 BIG5" + echo "GBK GBK" + echo "TIS-620 TIS-620" + echo "UTF-8 UTF-8" + ;; + hpux*) + echo "iso88591 ISO-8859-1" + echo "iso88592 ISO-8859-2" + echo "iso88595 ISO-8859-5" + echo "iso88596 ISO-8859-6" + echo "iso88597 ISO-8859-7" + echo "iso88598 ISO-8859-8" + echo "iso88599 ISO-8859-9" + echo "iso885915 ISO-8859-15" + echo "roman8 HP-ROMAN8" + echo "arabic8 HP-ARABIC8" + echo "greek8 HP-GREEK8" + echo "hebrew8 HP-HEBREW8" + echo "turkish8 HP-TURKISH8" + echo "kana8 HP-KANA8" + echo "tis620 TIS-620" + echo "big5 BIG5" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "hp15CN GB2312" + #echo "ccdc ?" # what is this? + echo "SJIS SHIFT_JIS" + echo "utf8 UTF-8" + ;; + irix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-9 ISO-8859-9" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + ;; + osf*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "cp850 CP850" + echo "big5 BIG5" + echo "dechanyu DEC-HANYU" + echo "dechanzi GB2312" + echo "deckanji DEC-KANJI" + echo "deckorean EUC-KR" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "GBK GBK" + echo "KSC5601 CP949" + echo "sdeckanji EUC-JP" + echo "SJIS SHIFT_JIS" + echo "TACTIS TIS-620" + echo "UTF-8 UTF-8" + ;; + solaris*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "koi8-r KOI8-R" + echo "BIG5 BIG5" + echo "gb2312 GB2312" + echo "cns11643 EUC-TW" + echo "5601 EUC-KR" + echo "eucJP EUC-JP" + echo "PCK SHIFT_JIS" + echo "TIS620.2533 TIS-620" + #echo "sun_eu_greek ?" # what is this? + echo "UTF-8 UTF-8" + ;; + freebsd*) + # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "C ASCII" + echo "US-ASCII ASCII" + for l in la_LN lt_LN; do + echo "$l.ASCII ASCII" + done + for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ + fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ + lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do + echo "$l.ISO_8859-1 ISO-8859-1" + echo "$l.DIS_8859-15 ISO-8859-15" + done + for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do + echo "$l.ISO_8859-2 ISO-8859-2" + done + for l in la_LN lt_LT; do + echo "$l.ISO_8859-4 ISO-8859-4" + done + for l in ru_RU ru_SU; do + echo "$l.KOI8-R KOI8-R" + echo "$l.ISO_8859-5 ISO-8859-5" + echo "$l.CP866 CP866" + done + echo "uk_UA.KOI8-U KOI8-U" + echo "zh_TW.BIG5 BIG5" + echo "zh_TW.Big5 BIG5" + echo "zh_CN.EUC GB2312" + echo "ja_JP.EUC EUC-JP" + echo "ja_JP.SJIS SHIFT_JIS" + echo "ja_JP.Shift_JIS SHIFT_JIS" + echo "ko_KR.EUC EUC-KR" + ;; + beos*) + # BeOS has a single locale, and it has UTF-8 encoding. + echo "* UTF-8" + ;; + msdosdjgpp*) + # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "#" + echo "# The encodings given here may not all be correct." + echo "# If you find that the encoding given for your language and" + echo "# country is not the one your DOS machine actually uses, just" + echo "# correct it in this file, and send a mail to" + echo "# Juan Manuel Guerrero " + echo "# and Bruno Haible ." + echo "#" + echo "C ASCII" + # ISO-8859-1 languages + echo "ca CP850" + echo "ca_ES CP850" + echo "da CP865" # not CP850 ?? + echo "da_DK CP865" # not CP850 ?? + echo "de CP850" + echo "de_AT CP850" + echo "de_CH CP850" + echo "de_DE CP850" + echo "en CP850" + echo "en_AU CP850" # not CP437 ?? + echo "en_CA CP850" + echo "en_GB CP850" + echo "en_NZ CP437" + echo "en_US CP437" + echo "en_ZA CP850" # not CP437 ?? + echo "es CP850" + echo "es_AR CP850" + echo "es_BO CP850" + echo "es_CL CP850" + echo "es_CO CP850" + echo "es_CR CP850" + echo "es_CU CP850" + echo "es_DO CP850" + echo "es_EC CP850" + echo "es_ES CP850" + echo "es_GT CP850" + echo "es_HN CP850" + echo "es_MX CP850" + echo "es_NI CP850" + echo "es_PA CP850" + echo "es_PY CP850" + echo "es_PE CP850" + echo "es_SV CP850" + echo "es_UY CP850" + echo "es_VE CP850" + echo "et CP850" + echo "et_EE CP850" + echo "eu CP850" + echo "eu_ES CP850" + echo "fi CP850" + echo "fi_FI CP850" + echo "fr CP850" + echo "fr_BE CP850" + echo "fr_CA CP850" + echo "fr_CH CP850" + echo "fr_FR CP850" + echo "ga CP850" + echo "ga_IE CP850" + echo "gd CP850" + echo "gd_GB CP850" + echo "gl CP850" + echo "gl_ES CP850" + echo "id CP850" # not CP437 ?? + echo "id_ID CP850" # not CP437 ?? + echo "is CP861" # not CP850 ?? + echo "is_IS CP861" # not CP850 ?? + echo "it CP850" + echo "it_CH CP850" + echo "it_IT CP850" + echo "lt CP775" + echo "lt_LT CP775" + echo "lv CP775" + echo "lv_LV CP775" + echo "nb CP865" # not CP850 ?? + echo "nb_NO CP865" # not CP850 ?? + echo "nl CP850" + echo "nl_BE CP850" + echo "nl_NL CP850" + echo "nn CP865" # not CP850 ?? + echo "nn_NO CP865" # not CP850 ?? + echo "no CP865" # not CP850 ?? + echo "no_NO CP865" # not CP850 ?? + echo "pt CP850" + echo "pt_BR CP850" + echo "pt_PT CP850" + echo "sv CP850" + echo "sv_SE CP850" + # ISO-8859-2 languages + echo "cs CP852" + echo "cs_CZ CP852" + echo "hr CP852" + echo "hr_HR CP852" + echo "hu CP852" + echo "hu_HU CP852" + echo "pl CP852" + echo "pl_PL CP852" + echo "ro CP852" + echo "ro_RO CP852" + echo "sk CP852" + echo "sk_SK CP852" + echo "sl CP852" + echo "sl_SI CP852" + echo "sq CP852" + echo "sq_AL CP852" + echo "sr CP852" # CP852 or CP866 or CP855 ?? + echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? + # ISO-8859-3 languages + echo "mt CP850" + echo "mt_MT CP850" + # ISO-8859-5 languages + echo "be CP866" + echo "be_BE CP866" + echo "bg CP866" # not CP855 ?? + echo "bg_BG CP866" # not CP855 ?? + echo "mk CP866" # not CP855 ?? + echo "mk_MK CP866" # not CP855 ?? + echo "ru KOI8-R" # not CP866 ?? + echo "ru_RU KOI8-R" # not CP866 ?? + # ISO-8859-6 languages + echo "ar CP864" + echo "ar_AE CP864" + echo "ar_DZ CP864" + echo "ar_EG CP864" + echo "ar_IQ CP864" + echo "ar_IR CP864" + echo "ar_JO CP864" + echo "ar_KW CP864" + echo "ar_MA CP864" + echo "ar_OM CP864" + echo "ar_QA CP864" + echo "ar_SA CP864" + echo "ar_SY CP864" + # ISO-8859-7 languages + echo "el CP869" + echo "el_GR CP869" + # ISO-8859-8 languages + echo "he CP862" + echo "he_IL CP862" + # ISO-8859-9 languages + echo "tr CP857" + echo "tr_TR CP857" + # Japanese + echo "ja CP932" + echo "ja_JP CP932" + # Chinese + echo "zh_CN GBK" + echo "zh_TW CP950" # not CP938 ?? + # Korean + echo "kr CP949" # not CP934 ?? + echo "kr_KR CP949" # not CP934 ?? + # Thai + echo "th CP874" + echo "th_TH CP874" + # Other + echo "eo CP850" + echo "eo_EO CP850" + ;; +esac diff --git a/intl/dcgettext.c b/intl/dcgettext.c new file mode 100644 index 0000000..b7c9652 --- /dev/null +++ b/intl/dcgettext.c @@ -0,0 +1,58 @@ +/* Implementation of the dcgettext(3) function. + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCGETTEXT __dcgettext +# define DCIGETTEXT __dcigettext +#else +# define DCGETTEXT dcgettext__ +# define DCIGETTEXT dcigettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCGETTEXT (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dcgettext, dcgettext); +#endif diff --git a/intl/dcigettext.c b/intl/dcigettext.c new file mode 100644 index 0000000..6acde19 --- /dev/null +++ b/intl/dcigettext.c @@ -0,0 +1,1259 @@ +/* Implementation of the internal dcigettext function. + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#ifndef errno +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#include +#include + +#include +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include + +#if defined HAVE_SYS_PARAM_H || defined _LIBC +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "hash-string.h" + +/* Thread safetyness. */ +#ifdef _LIBC +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_lock_define_initialized(CLASS, NAME) +# define __libc_lock_lock(NAME) +# define __libc_lock_unlock(NAME) +# define __libc_rwlock_define_initialized(CLASS, NAME) +# define __libc_rwlock_rdlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* Alignment of types. */ +#if defined __GNUC__ && __GNUC__ >= 2 +# define alignof(TYPE) __alignof__ (TYPE) +#else +# define alignof(TYPE) \ + ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_default_domain _nl_default_default_domain__ +# define _nl_current_default_domain _nl_current_default_domain__ +# define _nl_default_dirname _nl_default_dirname__ +# define _nl_domain_bindings _nl_domain_bindings__ +#endif + +/* Some compilers, like SunOS4 cc, don't have offsetof in . */ +#ifndef offsetof +# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define getcwd __getcwd +# ifndef stpcpy +# define stpcpy __stpcpy +# endif +# define tfind __tfind +#else +# if !defined HAVE_GETCWD +char *getwd (); +# define getcwd(buf, max) getwd (buf) +# else +char *getcwd (); +# endif +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +# ifndef HAVE_MEMPCPY +static void *mempcpy PARAMS ((void *dest, const void *src, size_t n)); +# endif +#endif + +/* Amount to increase buffer size by in each try. */ +#define PATH_INCR 32 + +/* The following is from pathmax.h. */ +/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define + PATH_MAX but might cause redefinition warnings when sys/param.h is + later included (as on MORE/BSD 4.3). */ +#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__) +# include +#endif + +#ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 255 +#endif + +#if !defined PATH_MAX && defined _PC_PATH_MAX +# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) +#endif + +/* Don't include sys/param.h if it already has been. */ +#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN +# include +#endif + +#if !defined PATH_MAX && defined MAXPATHLEN +# define PATH_MAX MAXPATHLEN +#endif + +#ifndef PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +#endif + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, + it may be concatenated to a directory pathname. + IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. + */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) +# define IS_PATH_WITH_DIR(P) \ + (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) +# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) +#endif + +/* XPG3 defines the result of `setlocale (category, NULL)' as: + ``Directs `setlocale()' to query `category' and return the current + setting of `local'.'' + However it does not specify the exact format. Neither do SUSV2 and + ISO C 99. So we can use this feature only on selected systems (e.g. + those using GNU C Library). */ +#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) +# define HAVE_LOCALE_NULL +#endif + +/* This is the type used for the search tree where known translations + are stored. */ +struct known_translation_t +{ + /* Domain in which to search. */ + char *domainname; + + /* The category. */ + int category; + + /* State of the catalog counter at the point the string was found. */ + int counter; + + /* Catalog where the string was found. */ + struct loaded_l10nfile *domain; + + /* And finally the translation. */ + const char *translation; + size_t translation_length; + + /* Pointer to the string in question. */ + char msgid[ZERO]; +}; + +/* Root of the search tree with known translations. We can use this + only if the system provides the `tsearch' function family. */ +#if defined HAVE_TSEARCH || defined _LIBC +# include + +static void *root; + +# ifdef _LIBC +# define tsearch __tsearch +# endif + +/* Function to compare two entries in the table of known translations. */ +static int transcmp PARAMS ((const void *p1, const void *p2)); +static int +transcmp (p1, p2) + const void *p1; + const void *p2; +{ + const struct known_translation_t *s1; + const struct known_translation_t *s2; + int result; + + s1 = (const struct known_translation_t *) p1; + s2 = (const struct known_translation_t *) p2; + + result = strcmp (s1->msgid, s2->msgid); + if (result == 0) + { + result = strcmp (s1->domainname, s2->domainname); + if (result == 0) + /* We compare the category last (though this is the cheapest + operation) since it is hopefully always the same (namely + LC_MESSAGES). */ + result = s1->category - s2->category; + } + + return result; +} +#endif + +/* Name of the default domain used for gettext(3) prior any call to + textdomain(3). The default value for this is "messages". */ +const char _nl_default_default_domain[] = "messages"; + +/* Value used as the default domain for gettext(3). */ +const char *_nl_current_default_domain = _nl_default_default_domain; + +/* Contains the default location of the message catalogs. */ +const char _nl_default_dirname[] = LOCALEDIR; + +/* List with bindings of specific domains created by bindtextdomain() + calls. */ +struct binding *_nl_domain_bindings; + +/* Prototypes for local functions. */ +static char *plural_lookup PARAMS ((struct loaded_l10nfile *domain, + unsigned long int n, + const char *translation, + size_t translation_len)) + internal_function; +static unsigned long int plural_eval PARAMS ((struct expression *pexp, + unsigned long int n)) + internal_function; +static const char *category_to_name PARAMS ((int category)) internal_function; +static const char *guess_category_value PARAMS ((int category, + const char *categoryname)) + internal_function; + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +#endif /* have alloca */ + + +#ifdef _LIBC +/* List of blocks allocated for translations. */ +typedef struct transmem_list +{ + struct transmem_list *next; + char data[ZERO]; +} transmem_block_t; +static struct transmem_list *transmem_list; +#else +typedef unsigned char transmem_block_t; +#endif + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCIGETTEXT __dcigettext +#else +# define DCIGETTEXT dcigettext__ +#endif + +/* Lock variable to protect the global data in the gettext implementation. */ +#ifdef _LIBC +__libc_rwlock_define_initialized (, _nl_state_lock) +#endif + +/* Checking whether the binaries runs SUID must be done and glibc provides + easier methods therefore we make a difference here. */ +#ifdef _LIBC +# define ENABLE_SECURE __libc_enable_secure +# define DETERMINE_SECURE +#else +# ifndef HAVE_GETUID +# define getuid() 0 +# endif +# ifndef HAVE_GETGID +# define getgid() 0 +# endif +# ifndef HAVE_GETEUID +# define geteuid() getuid() +# endif +# ifndef HAVE_GETEGID +# define getegid() getgid() +# endif +static int enable_secure; +# define ENABLE_SECURE (enable_secure == 1) +# define DETERMINE_SECURE \ + if (enable_secure == 0) \ + { \ + if (getuid () != geteuid () || getgid () != getegid ()) \ + enable_secure = 1; \ + else \ + enable_secure = -1; \ + } +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current + CATEGORY locale and, if PLURAL is nonzero, search over string + depending on the plural form determined by N. */ +char * +DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + int plural; + unsigned long int n; + int category; +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + struct loaded_l10nfile *domain; + struct binding *binding; + const char *categoryname; + const char *categoryvalue; + char *dirname, *xdomainname; + char *single_locale; + char *retval; + size_t retlen; + int saved_errno; +#if defined HAVE_TSEARCH || defined _LIBC + struct known_translation_t *search; + struct known_translation_t **foundp = NULL; + size_t msgid_len; +#endif + size_t domainname_len; + + /* If no real MSGID is given return NULL. */ + if (msgid1 == NULL) + return NULL; + + __libc_rwlock_rdlock (_nl_state_lock); + + /* If DOMAINNAME is NULL, we are interested in the default domain. If + CATEGORY is not LC_MESSAGES this might not make much sense but the + definition left this undefined. */ + if (domainname == NULL) + domainname = _nl_current_default_domain; + +#if defined HAVE_TSEARCH || defined _LIBC + msgid_len = strlen (msgid1) + 1; + + /* Try to find the translation among those which we found at + some time. */ + search = (struct known_translation_t *) + alloca (offsetof (struct known_translation_t, msgid) + msgid_len); + memcpy (search->msgid, msgid1, msgid_len); + search->domainname = (char *) domainname; + search->category = category; + + foundp = (struct known_translation_t **) tfind (search, &root, transcmp); + if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) + { + /* Now deal with plural. */ + if (plural) + retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation, + (*foundp)->translation_length); + else + retval = (char *) (*foundp)->translation; + + __libc_rwlock_unlock (_nl_state_lock); + return retval; + } +#endif + + /* Preserve the `errno' value. */ + saved_errno = errno; + + /* See whether this is a SUID binary or not. */ + DETERMINE_SECURE; + + /* First find matching binding. */ + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding == NULL) + dirname = (char *) _nl_default_dirname; + else if (IS_ABSOLUTE_PATH (binding->dirname)) + dirname = binding->dirname; + else + { + /* We have a relative path. Make it absolute now. */ + size_t dirname_len = strlen (binding->dirname) + 1; + size_t path_max; + char *ret; + + path_max = (unsigned int) PATH_MAX; + path_max += 2; /* The getcwd docs say to do this. */ + + for (;;) + { + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + + __set_errno (0); + ret = getcwd (dirname, path_max); + if (ret != NULL || errno != ERANGE) + break; + + path_max += path_max / 2; + path_max += PATH_INCR; + } + + if (ret == NULL) + { + /* We cannot get the current working directory. Don't signal an + error but simply return the default string. */ + FREE_BLOCKS (block_list); + __libc_rwlock_unlock (_nl_state_lock); + __set_errno (saved_errno); + return (plural == 0 + ? (char *) msgid1 + /* Use the Germanic plural rule. */ + : n == 1 ? (char *) msgid1 : (char *) msgid2); + } + + stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); + } + + /* Now determine the symbolic name of CATEGORY and its value. */ + categoryname = category_to_name (category); + categoryvalue = guess_category_value (category, categoryname); + + domainname_len = strlen (domainname); + xdomainname = (char *) alloca (strlen (categoryname) + + domainname_len + 5); + ADD_BLOCK (block_list, xdomainname); + + stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), + domainname, domainname_len), + ".mo"); + + /* Creating working area. */ + single_locale = (char *) alloca (strlen (categoryvalue) + 1); + ADD_BLOCK (block_list, single_locale); + + + /* Search for the given string. This is a loop because we perhaps + got an ordered list of languages to consider for the translation. */ + while (1) + { + /* Make CATEGORYVALUE point to the next element of the list. */ + while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') + ++categoryvalue; + if (categoryvalue[0] == '\0') + { + /* The whole contents of CATEGORYVALUE has been searched but + no valid entry has been found. We solve this situation + by implicitly appending a "C" entry, i.e. no translation + will take place. */ + single_locale[0] = 'C'; + single_locale[1] = '\0'; + } + else + { + char *cp = single_locale; + while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') + *cp++ = *categoryvalue++; + *cp = '\0'; + + /* When this is a SUID binary we must not allow accessing files + outside the dedicated directories. */ + if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale)) + /* Ingore this entry. */ + continue; + } + + /* If the current locale value is C (or POSIX) we don't load a + domain. Return the MSGID. */ + if (strcmp (single_locale, "C") == 0 + || strcmp (single_locale, "POSIX") == 0) + { + FREE_BLOCKS (block_list); + __libc_rwlock_unlock (_nl_state_lock); + __set_errno (saved_errno); + return (plural == 0 + ? (char *) msgid1 + /* Use the Germanic plural rule. */ + : n == 1 ? (char *) msgid1 : (char *) msgid2); + } + + + /* Find structure describing the message catalog matching the + DOMAINNAME and CATEGORY. */ + domain = _nl_find_domain (dirname, single_locale, xdomainname, binding); + + if (domain != NULL) + { + retval = _nl_find_msg (domain, binding, msgid1, &retlen); + + if (retval == NULL) + { + int cnt; + + for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) + { + retval = _nl_find_msg (domain->successor[cnt], binding, + msgid1, &retlen); + + if (retval != NULL) + { + domain = domain->successor[cnt]; + break; + } + } + } + + if (retval != NULL) + { + /* Found the translation of MSGID1 in domain DOMAIN: + starting at RETVAL, RETLEN bytes. */ + FREE_BLOCKS (block_list); + __set_errno (saved_errno); +#if defined HAVE_TSEARCH || defined _LIBC + if (foundp == NULL) + { + /* Create a new entry and add it to the search tree. */ + struct known_translation_t *newp; + + newp = (struct known_translation_t *) + malloc (offsetof (struct known_translation_t, msgid) + + msgid_len + domainname_len + 1); + if (newp != NULL) + { + newp->domainname = + mempcpy (newp->msgid, msgid1, msgid_len); + memcpy (newp->domainname, domainname, domainname_len + 1); + newp->category = category; + newp->counter = _nl_msg_cat_cntr; + newp->domain = domain; + newp->translation = retval; + newp->translation_length = retlen; + + /* Insert the entry in the search tree. */ + foundp = (struct known_translation_t **) + tsearch (newp, &root, transcmp); + if (foundp == NULL + || __builtin_expect (*foundp != newp, 0)) + /* The insert failed. */ + free (newp); + } + } + else + { + /* We can update the existing entry. */ + (*foundp)->counter = _nl_msg_cat_cntr; + (*foundp)->domain = domain; + (*foundp)->translation = retval; + (*foundp)->translation_length = retlen; + } +#endif + /* Now deal with plural. */ + if (plural) + retval = plural_lookup (domain, n, retval, retlen); + + __libc_rwlock_unlock (_nl_state_lock); + return retval; + } + } + } + /* NOTREACHED */ +} + + +char * +internal_function +_nl_find_msg (domain_file, domainbinding, msgid, lengthp) + struct loaded_l10nfile *domain_file; + struct binding *domainbinding; + const char *msgid; + size_t *lengthp; +{ + struct loaded_domain *domain; + size_t act; + char *result; + size_t resultlen; + + if (domain_file->decided == 0) + _nl_load_domain (domain_file, domainbinding); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + /* Locate the MSGID and its translation. */ + if (domain->hash_size > 2 && domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + + while (1) + { + nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + /* Compare msgid with the original string at index nstr-1. + We compare the lengths with >=, not ==, because plural entries + are represented by strings with an embedded NUL. */ + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) >= len + && (strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) + == 0)) + { + act = nstr - 1; + goto found; + } + + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + } + /* NOTREACHED */ + } + else + { + /* Try the default method: binary search in the sorted array of + messages. */ + size_t top, bottom; + + bottom = 0; + top = domain->nstrings; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, (domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset))); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + goto found; + } + /* No translation was found. */ + return NULL; + } + + found: + /* The translation was found at index ACT. If we have to convert the + string to use a different character set, this is the time. */ + result = ((char *) domain->data + + W (domain->must_swap, domain->trans_tab[act].offset)); + resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; + +#if defined _LIBC || HAVE_ICONV + if (domain->codeset_cntr + != (domainbinding != NULL ? domainbinding->codeset_cntr : 0)) + { + /* The domain's codeset has changed through bind_textdomain_codeset() + since the message catalog was initialized or last accessed. We + have to reinitialize the converter. */ + _nl_free_domain_conv (domain); + _nl_init_domain_conv (domain_file, domain, domainbinding); + } + + if ( +# ifdef _LIBC + domain->conv != (__gconv_t) -1 +# else +# if HAVE_ICONV + domain->conv != (iconv_t) -1 +# endif +# endif + ) + { + /* We are supposed to do a conversion. First allocate an + appropriate table with the same structure as the table + of translations in the file, where we can put the pointers + to the converted strings in. + There is a slight complication with plural entries. They + are represented by consecutive NUL terminated strings. We + handle this case by converting RESULTLEN bytes, including + NULs. */ + + if (domain->conv_tab == NULL + && ((domain->conv_tab = (char **) calloc (domain->nstrings, + sizeof (char *))) + == NULL)) + /* Mark that we didn't succeed allocating a table. */ + domain->conv_tab = (char **) -1; + + if (__builtin_expect (domain->conv_tab == (char **) -1, 0)) + /* Nothing we can do, no more memory. */ + goto converted; + + if (domain->conv_tab[act] == NULL) + { + /* We haven't used this string so far, so it is not + translated yet. Do this now. */ + /* We use a bit more efficient memory handling. + We allocate always larger blocks which get used over + time. This is faster than many small allocations. */ + __libc_lock_define_initialized (static, lock) +# define INITIAL_BLOCK_SIZE 4080 + static unsigned char *freemem; + static size_t freemem_size; + + const unsigned char *inbuf; + unsigned char *outbuf; + int malloc_count; +# ifndef _LIBC + transmem_block_t *transmem_list = NULL; +# endif + + __libc_lock_lock (lock); + + inbuf = (const unsigned char *) result; + outbuf = freemem + sizeof (size_t); + + malloc_count = 0; + while (1) + { + transmem_block_t *newmem; +# ifdef _LIBC + size_t non_reversible; + int res; + + if (freemem_size < sizeof (size_t)) + goto resize_freemem; + + res = __gconv (domain->conv, + &inbuf, inbuf + resultlen, + &outbuf, + outbuf + freemem_size - sizeof (size_t), + &non_reversible); + + if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) + break; + + if (res != __GCONV_FULL_OUTPUT) + { + __libc_lock_unlock (lock); + goto converted; + } + + inbuf = result; +# else +# if HAVE_ICONV + const char *inptr = (const char *) inbuf; + size_t inleft = resultlen; + char *outptr = (char *) outbuf; + size_t outleft; + + if (freemem_size < sizeof (size_t)) + goto resize_freemem; + + outleft = freemem_size - sizeof (size_t); + if (iconv (domain->conv, + (ICONV_CONST char **) &inptr, &inleft, + &outptr, &outleft) + != (size_t) (-1)) + { + outbuf = (unsigned char *) outptr; + break; + } + if (errno != E2BIG) + { + __libc_lock_unlock (lock); + goto converted; + } +# endif +# endif + + resize_freemem: + /* We must allocate a new buffer or resize the old one. */ + if (malloc_count > 0) + { + ++malloc_count; + freemem_size = malloc_count * INITIAL_BLOCK_SIZE; + newmem = (transmem_block_t *) realloc (transmem_list, + freemem_size); +# ifdef _LIBC + if (newmem != NULL) + transmem_list = transmem_list->next; + else + { + struct transmem_list *old = transmem_list; + + transmem_list = transmem_list->next; + free (old); + } +# endif + } + else + { + malloc_count = 1; + freemem_size = INITIAL_BLOCK_SIZE; + newmem = (transmem_block_t *) malloc (freemem_size); + } + if (__builtin_expect (newmem == NULL, 0)) + { + freemem = NULL; + freemem_size = 0; + __libc_lock_unlock (lock); + goto converted; + } + +# ifdef _LIBC + /* Add the block to the list of blocks we have to free + at some point. */ + newmem->next = transmem_list; + transmem_list = newmem; + + freemem = newmem->data; + freemem_size -= offsetof (struct transmem_list, data); +# else + transmem_list = newmem; + freemem = newmem; +# endif + + outbuf = freemem + sizeof (size_t); + } + + /* We have now in our buffer a converted string. Put this + into the table of conversions. */ + *(size_t *) freemem = outbuf - freemem - sizeof (size_t); + domain->conv_tab[act] = (char *) freemem; + /* Shrink freemem, but keep it aligned. */ + freemem_size -= outbuf - freemem; + freemem = outbuf; + freemem += freemem_size & (alignof (size_t) - 1); + freemem_size = freemem_size & ~ (alignof (size_t) - 1); + + __libc_lock_unlock (lock); + } + + /* Now domain->conv_tab[act] contains the translation of all + the plural variants. */ + result = domain->conv_tab[act] + sizeof (size_t); + resultlen = *(size_t *) domain->conv_tab[act]; + } + + converted: + /* The result string is converted. */ + +#endif /* _LIBC || HAVE_ICONV */ + + *lengthp = resultlen; + return result; +} + + +/* Look up a plural variant. */ +static char * +internal_function +plural_lookup (domain, n, translation, translation_len) + struct loaded_l10nfile *domain; + unsigned long int n; + const char *translation; + size_t translation_len; +{ + struct loaded_domain *domaindata = (struct loaded_domain *) domain->data; + unsigned long int index; + const char *p; + + index = plural_eval (domaindata->plural, n); + if (index >= domaindata->nplurals) + /* This should never happen. It means the plural expression and the + given maximum value do not match. */ + index = 0; + + /* Skip INDEX strings at TRANSLATION. */ + p = translation; + while (index-- > 0) + { +#ifdef _LIBC + p = __rawmemchr (p, '\0'); +#else + p = strchr (p, '\0'); +#endif + /* And skip over the NUL byte. */ + p++; + + if (p >= translation + translation_len) + /* This should never happen. It means the plural expression + evaluated to a value larger than the number of variants + available for MSGID1. */ + return (char *) translation; + } + return (char *) p; +} + + +/* Function to evaluate the plural expression and return an index value. */ +static unsigned long int +internal_function +plural_eval (pexp, n) + struct expression *pexp; + unsigned long int n; +{ + switch (pexp->nargs) + { + case 0: + switch (pexp->operation) + { + case var: + return n; + case num: + return pexp->val.num; + default: + break; + } + /* NOTREACHED */ + break; + case 1: + { + /* pexp->operation must be lnot. */ + unsigned long int arg = plural_eval (pexp->val.args[0], n); + return ! arg; + } + case 2: + { + unsigned long int leftarg = plural_eval (pexp->val.args[0], n); + if (pexp->operation == lor) + return leftarg || plural_eval (pexp->val.args[1], n); + else if (pexp->operation == land) + return leftarg && plural_eval (pexp->val.args[1], n); + else + { + unsigned long int rightarg = plural_eval (pexp->val.args[1], n); + + switch (pexp->operation) + { + case mult: + return leftarg * rightarg; + case divide: + return leftarg / rightarg; + case module: + return leftarg % rightarg; + case plus: + return leftarg + rightarg; + case minus: + return leftarg - rightarg; + case less_than: + return leftarg < rightarg; + case greater_than: + return leftarg > rightarg; + case less_or_equal: + return leftarg <= rightarg; + case greater_or_equal: + return leftarg >= rightarg; + case equal: + return leftarg == rightarg; + case not_equal: + return leftarg != rightarg; + default: + break; + } + } + /* NOTREACHED */ + break; + } + case 3: + { + /* pexp->operation must be qmop. */ + unsigned long int boolarg = plural_eval (pexp->val.args[0], n); + return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); + } + } + /* NOTREACHED */ + return 0; +} + + +/* Return string representation of locale CATEGORY. */ +static const char * +internal_function +category_to_name (category) + int category; +{ + const char *retval; + + switch (category) + { +#ifdef LC_COLLATE + case LC_COLLATE: + retval = "LC_COLLATE"; + break; +#endif +#ifdef LC_CTYPE + case LC_CTYPE: + retval = "LC_CTYPE"; + break; +#endif +#ifdef LC_MONETARY + case LC_MONETARY: + retval = "LC_MONETARY"; + break; +#endif +#ifdef LC_NUMERIC + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; +#endif +#ifdef LC_TIME + case LC_TIME: + retval = "LC_TIME"; + break; +#endif +#ifdef LC_MESSAGES + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; +#endif +#ifdef LC_RESPONSE + case LC_RESPONSE: + retval = "LC_RESPONSE"; + break; +#endif +#ifdef LC_ALL + case LC_ALL: + /* This might not make sense but is perhaps better than any other + value. */ + retval = "LC_ALL"; + break; +#endif + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} + +/* Guess value of current locale from value of the environment variables. */ +static const char * +internal_function +guess_category_value (category, categoryname) + int category; + const char *categoryname; +{ + const char *language; + const char *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. But we don't use the value if the currently selected + locale is the C locale. This is a GNU extension. */ + language = getenv ("LANGUAGE"); + if (language != NULL && language[0] == '\0') + language = NULL; + + /* We have to proceed with the POSIX methods of looking to `LC_ALL', + `LC_xxx', and `LANG'. On some systems this can be done by the + `setlocale' function itself. */ +#if defined _LIBC || (defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL) + retval = setlocale (category, NULL); +#else + /* Setting of LC_ALL overwrites all other. */ + retval = getenv ("LC_ALL"); + if (retval == NULL || retval[0] == '\0') + { + /* Next comes the name of the desired category. */ + retval = getenv (categoryname); + if (retval == NULL || retval[0] == '\0') + { + /* Last possibility is the LANG environment variable. */ + retval = getenv ("LANG"); + if (retval == NULL || retval[0] == '\0') + /* We use C as the default domain. POSIX says this is + implementation defined. */ + return "C"; + } + } +#endif + + return language != NULL && strcmp (retval, "C") != 0 ? language : retval; +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif + +#if !_LIBC && !HAVE_MEMPCPY +static void * +mempcpy (dest, src, n) + void *dest; + const void *src; + size_t n; +{ + return (void *) ((char *) memcpy (dest, src, n) + n); +} +#endif + + +#ifdef _LIBC +/* If we want to free all resources we have to do some work at + program's end. */ +static void __attribute__ ((unused)) +free_mem (void) +{ + void *old; + + while (_nl_domain_bindings != NULL) + { + struct binding *oldp = _nl_domain_bindings; + _nl_domain_bindings = _nl_domain_bindings->next; + if (oldp->dirname != _nl_default_dirname) + /* Yes, this is a pointer comparison. */ + free (oldp->dirname); + free (oldp->codeset); + free (oldp); + } + + if (_nl_current_default_domain != _nl_default_default_domain) + /* Yes, again a pointer comparison. */ + free ((char *) _nl_current_default_domain); + + /* Remove the search tree with the known translations. */ + __tdestroy (root, free); + root = NULL; + + while (transmem_list != NULL) + { + old = transmem_list; + transmem_list = transmem_list->next; + free (old); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/intl/dcngettext.c b/intl/dcngettext.c new file mode 100644 index 0000000..c16af21 --- /dev/null +++ b/intl/dcngettext.c @@ -0,0 +1,60 @@ +/* Implementation of the dcngettext(3) function. + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCNGETTEXT __dcngettext +# define DCIGETTEXT __dcigettext +#else +# define DCNGETTEXT dcngettext__ +# define DCIGETTEXT dcigettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCNGETTEXT (domainname, msgid1, msgid2, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; + int category; +{ + return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dcngettext, dcngettext); +#endif diff --git a/intl/dgettext.c b/intl/dgettext.c new file mode 100644 index 0000000..3651207 --- /dev/null +++ b/intl/dgettext.c @@ -0,0 +1,59 @@ +/* Implementation of the dgettext(3) function. + Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DGETTEXT __dgettext +# define DCGETTEXT __dcgettext +#else +# define DGETTEXT dgettext__ +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale. */ +char * +DGETTEXT (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return DCGETTEXT (domainname, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dgettext, dgettext); +#endif diff --git a/intl/dngettext.c b/intl/dngettext.c new file mode 100644 index 0000000..f214e95 --- /dev/null +++ b/intl/dngettext.c @@ -0,0 +1,61 @@ +/* Implementation of the dngettext(3) function. + Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DNGETTEXT __dngettext +# define DCNGETTEXT __dcngettext +#else +# define DNGETTEXT dngettext__ +# define DCNGETTEXT dcngettext__ +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale and skip message according to the plural form. */ +char * +DNGETTEXT (domainname, msgid1, msgid2, n) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dngettext, dngettext); +#endif diff --git a/intl/explodename.c b/intl/explodename.c new file mode 100644 index 0000000..2985064 --- /dev/null +++ b/intl/explodename.c @@ -0,0 +1,192 @@ +/* Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +char * +_nl_find_language (name) + const char *name; +{ + while (name[0] != '\0' && name[0] != '_' && name[0] != '@' + && name[0] != '+' && name[0] != ',') + ++name; + + return (char *) name; +} + + +int +_nl_explode_name (name, language, modifier, territory, codeset, + normalized_codeset, special, sponsor, revision) + char *name; + const char **language; + const char **modifier; + const char **territory; + const char **codeset; + const char **normalized_codeset; + const char **special; + const char **sponsor; + const char **revision; +{ + enum { undecided, xpg, cen } syntax; + char *cp; + int mask; + + *modifier = NULL; + *territory = NULL; + *codeset = NULL; + *normalized_codeset = NULL; + *special = NULL; + *sponsor = NULL; + *revision = NULL; + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = 0; + syntax = undecided; + *language = cp = name; + cp = _nl_find_language (*language); + + if (*language == cp) + /* This does not make sense: language has to be specified. Use + this entry as it is without exploding. Perhaps it is an alias. */ + cp = strchr (*language, '\0'); + else if (cp[0] == '_') + { + /* Next is the territory. */ + cp[0] = '\0'; + *territory = ++cp; + + while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= TERRITORY; + + if (cp[0] == '.') + { + /* Next is the codeset. */ + syntax = xpg; + cp[0] = '\0'; + *codeset = ++cp; + + while (cp[0] != '\0' && cp[0] != '@') + ++cp; + + mask |= XPG_CODESET; + + if (*codeset != cp && (*codeset)[0] != '\0') + { + *normalized_codeset = _nl_normalize_codeset (*codeset, + cp - *codeset); + if (strcmp (*codeset, *normalized_codeset) == 0) + free ((char *) *normalized_codeset); + else + mask |= XPG_NORM_CODESET; + } + } + } + + if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) + { + /* Next is the modifier. */ + syntax = cp[0] == '@' ? xpg : cen; + cp[0] = '\0'; + *modifier = ++cp; + + while (syntax == cen && cp[0] != '\0' && cp[0] != '+' + && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= XPG_MODIFIER | CEN_AUDIENCE; + } + + if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) + { + syntax = cen; + + if (cp[0] == '+') + { + /* Next is special application (CEN syntax). */ + cp[0] = '\0'; + *special = ++cp; + + while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= CEN_SPECIAL; + } + + if (cp[0] == ',') + { + /* Next is sponsor (CEN syntax). */ + cp[0] = '\0'; + *sponsor = ++cp; + + while (cp[0] != '\0' && cp[0] != '_') + ++cp; + + mask |= CEN_SPONSOR; + } + + if (cp[0] == '_') + { + /* Next is revision (CEN syntax). */ + cp[0] = '\0'; + *revision = ++cp; + + mask |= CEN_REVISION; + } + } + + /* For CEN syntax values it might be important to have the + separator character in the file name, not for XPG syntax. */ + if (syntax == xpg) + { + if (*territory != NULL && (*territory)[0] == '\0') + mask &= ~TERRITORY; + + if (*codeset != NULL && (*codeset)[0] == '\0') + mask &= ~XPG_CODESET; + + if (*modifier != NULL && (*modifier)[0] == '\0') + mask &= ~XPG_MODIFIER; + } + + return mask; +} diff --git a/intl/finddomain.c b/intl/finddomain.c new file mode 100644 index 0000000..2f103d5 --- /dev/null +++ b/intl/finddomain.c @@ -0,0 +1,198 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ +/* List of already loaded domains. */ +static struct loaded_l10nfile *_nl_loaded_domains; + + +/* Return a data structure describing the message catalog described by + the DOMAINNAME and CATEGORY parameters with respect to the currently + established bindings. */ +struct loaded_l10nfile * +internal_function +_nl_find_domain (dirname, locale, domainname, domainbinding) + const char *dirname; + char *locale; + const char *domainname; + struct binding *domainbinding; +{ + struct loaded_l10nfile *retval; + const char *language; + const char *modifier; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *special; + const char *sponsor; + const char *revision; + const char *alias_value; + int mask; + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + + language[_territory[.codeset]][@modifier] + + and six parts for the CEN syntax: + + language[_territory][+audience][+special][,[sponsor][_revision]] + + Beside the first part all of them are allowed to be missing. If + the full specified locale is not found, the less specific one are + looked for. The various parts will be stripped off according to + the following order: + (1) revision + (2) sponsor + (3) special + (4) codeset + (5) normalized codeset + (6) territory + (7) audience/modifier + */ + + /* If we have already tested for this locale entry there has to + be one data set in the list of loaded domains. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, 0, locale, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, domainname, 0); + if (retval != NULL) + { + /* We know something about this locale. */ + int cnt; + + if (retval->decided == 0) + _nl_load_domain (retval, domainbinding); + + if (retval->data != NULL) + return retval; + + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt], domainbinding); + + if (retval->successor[cnt]->data != NULL) + break; + } + return cnt >= 0 ? retval : NULL; + /* NOTREACHED */ + } + + /* See whether the locale value is an alias. If yes its value + *overwrites* the alias name. No test for the original value is + done. */ + alias_value = _nl_expand_alias (locale); + if (alias_value != NULL) + { +#if defined _LIBC || defined HAVE_STRDUP + locale = strdup (alias_value); + if (locale == NULL) + return NULL; +#else + size_t len = strlen (alias_value) + 1; + locale = (char *) malloc (len); + if (locale == NULL) + return NULL; + + memcpy (locale, alias_value, len); +#endif + } + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = _nl_explode_name (locale, &language, &modifier, &territory, + &codeset, &normalized_codeset, &special, + &sponsor, &revision); + + /* Create all possible locale entries which might be interested in + generalization. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, mask, language, territory, + codeset, normalized_codeset, modifier, special, + sponsor, revision, domainname, 1); + if (retval == NULL) + /* This means we are out of core. */ + return NULL; + + if (retval->decided == 0) + _nl_load_domain (retval, domainbinding); + if (retval->data == NULL) + { + int cnt; + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt], domainbinding); + if (retval->successor[cnt]->data != NULL) + break; + } + } + + /* The room for an alias was dynamically allocated. Free it now. */ + if (alias_value != NULL) + free (locale); + + /* The space for normalized_codeset is dynamically allocated. Free it. */ + if (mask & XPG_NORM_CODESET) + free ((void *) normalized_codeset); + + return retval; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + struct loaded_l10nfile *runp = _nl_loaded_domains; + + while (runp != NULL) + { + struct loaded_l10nfile *here = runp; + if (runp->data != NULL) + _nl_unload_domain ((struct loaded_domain *) runp->data); + runp = runp->next; + free ((char *) here->filename); + free (here); + } +} + +text_set_element (__libc_subfreeres, free_mem); +#endif diff --git a/intl/gettext.c b/intl/gettext.c new file mode 100644 index 0000000..22a6c24 --- /dev/null +++ b/intl/gettext.c @@ -0,0 +1,64 @@ +/* Implementation of gettext(3) function. + Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# include /* Just for NULL. */ +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define GETTEXT __gettext +# define DCGETTEXT __dcgettext +#else +# define GETTEXT gettext__ +# define DCGETTEXT dcgettext__ +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +GETTEXT (msgid) + const char *msgid; +{ + return DCGETTEXT (NULL, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__gettext, gettext); +#endif diff --git a/intl/gettext.h b/intl/gettext.h new file mode 100644 index 0000000..6f5d760 --- /dev/null +++ b/intl/gettext.h @@ -0,0 +1,102 @@ +/* Description of GNU message catalog format: general file layout. + Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _GETTEXT_H +#define _GETTEXT_H 1 + +#if HAVE_LIMITS_H || _LIBC +# include +#endif + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work + when cross-compiling. */ + +#if __STDC__ +# define UINT_MAX_32_BITS 4294967295U +#else +# define UINT_MAX_32_BITS 0xFFFFFFFF +#endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +#ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +#endif + +#if UINT_MAX == UINT_MAX_32_BITS +typedef unsigned nls_uint32; +#else +# if USHRT_MAX == UINT_MAX_32_BITS +typedef unsigned short nls_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS +typedef unsigned long nls_uint32; +# else + /* The following line is intended to throw an error. Using #error is + not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +#endif + + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translation strings. */ + nls_uint32 trans_tab_offset; + /* Size of hashing table. */ + nls_uint32 hash_tab_size; + /* Offset of first hashing entry. */ + nls_uint32 hash_tab_offset; +}; + +struct string_desc +{ + /* Length of addressed string. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* @@ begin of epilog @@ */ + +#endif /* gettext.h */ diff --git a/intl/gettextP.h b/intl/gettextP.h new file mode 100644 index 0000000..43de1cd --- /dev/null +++ b/intl/gettextP.h @@ -0,0 +1,252 @@ +/* Header describing internals of libintl library. + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _GETTEXTP_H +#define _GETTEXTP_H + +#include /* Get size_t. */ + +#ifdef _LIBC +# include "../iconv/gconv_int.h" +#else +# if HAVE_ICONV +# include +# endif +#endif + +#include "loadinfo.h" + +#include "gettext.h" /* Get nls_uint32. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +/* Tell the compiler when a conditional or integer expression is + almost always true or almost always false. */ +#ifndef HAVE_BUILTIN_EXPECT +# define __builtin_expect(expr, val) (expr) +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + + +#ifdef _LIBC +# include +# define SWAP(i) bswap_32 (i) +#else +static inline nls_uint32 +SWAP (i) + nls_uint32 i; +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} +#endif + + +/* This is the representation of the expressions to determine the + plural form. */ +struct expression +{ + int nargs; /* Number of arguments. */ + enum operator + { + /* Without arguments: */ + var, /* The variable "n". */ + num, /* Decimal number. */ + /* Unary operators: */ + lnot, /* Logical NOT. */ + /* Binary operators: */ + mult, /* Multiplication. */ + divide, /* Division. */ + module, /* Module operation. */ + plus, /* Addition. */ + minus, /* Subtraction. */ + less_than, /* Comparison. */ + greater_than, /* Comparison. */ + less_or_equal, /* Comparison. */ + greater_or_equal, /* Comparison. */ + equal, /* Comparision for equality. */ + not_equal, /* Comparision for inequality. */ + land, /* Logical AND. */ + lor, /* Logical OR. */ + /* Ternary operators: */ + qmop /* Question mark operator. */ + } operation; + union + { + unsigned long int num; /* Number value for `num'. */ + struct expression *args[3]; /* Up to three arguments. */ + } val; +}; + +/* This is the data structure to pass information to the parser and get + the result in a thread-safe way. */ +struct parse_args +{ + const char *cp; + struct expression *res; +}; + + +/* The representation of an opened message catalog. */ +struct loaded_domain +{ + const char *data; + int use_mmap; + size_t mmap_size; + int must_swap; + nls_uint32 nstrings; + struct string_desc *orig_tab; + struct string_desc *trans_tab; + nls_uint32 hash_size; + nls_uint32 *hash_tab; + int codeset_cntr; +#ifdef _LIBC + __gconv_t conv; +#else +# if HAVE_ICONV + iconv_t conv; +# endif +#endif + char **conv_tab; + + struct expression *plural; + unsigned long int nplurals; +}; + +/* We want to allocate a string at the end of the struct. But ISO C + doesn't allow zero sized arrays. */ +#ifdef __GNUC__ +# define ZERO 0 +#else +# define ZERO 1 +#endif + +/* A set of settings bound to a message domain. Used to store settings + from bindtextdomain() and bind_textdomain_codeset(). */ +struct binding +{ + struct binding *next; + char *dirname; + int codeset_cntr; /* Incremented each time codeset changes. */ + char *codeset; + char domainname[ZERO]; +}; + +/* A counter which is incremented each time some previous translations + become invalid. + This variable is part of the external ABI of the GNU libintl. */ +extern int _nl_msg_cat_cntr; + +struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, + char *__locale, + const char *__domainname, + struct binding *__domainbinding)) + internal_function; +void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain, + struct binding *__domainbinding)) + internal_function; +void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) + internal_function; +const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_file, + struct loaded_domain *__domain, + struct binding *__domainbinding)) + internal_function; +void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain)) + internal_function; + +char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file, + struct binding *domainbinding, + const char *msgid, size_t *lengthp)) + internal_function; + +#ifdef _LIBC +extern char *__gettext PARAMS ((const char *__msgid)); +extern char *__dgettext PARAMS ((const char *__domainname, + const char *__msgid)); +extern char *__dcgettext PARAMS ((const char *__domainname, + const char *__msgid, int __category)); +extern char *__ngettext PARAMS ((const char *__msgid1, const char *__msgid2, + unsigned long int __n)); +extern char *__dngettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int n)); +extern char *__dcngettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category)); +extern char *__dcigettext PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + int __plural, unsigned long int __n, + int __category)); +extern char *__textdomain PARAMS ((const char *__domainname)); +extern char *__bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *__bind_textdomain_codeset PARAMS ((const char *__domainname, + const char *__codeset)); +#else +extern char *gettext__ PARAMS ((const char *__msgid)); +extern char *dgettext__ PARAMS ((const char *__domainname, + const char *__msgid)); +extern char *dcgettext__ PARAMS ((const char *__domainname, + const char *__msgid, int __category)); +extern char *ngettext__ PARAMS ((const char *__msgid1, const char *__msgid2, + unsigned long int __n)); +extern char *dngettext__ PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n)); +extern char *dcngettext__ PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category)); +extern char *dcigettext__ PARAMS ((const char *__domainname, + const char *__msgid1, const char *__msgid2, + int __plural, unsigned long int __n, + int __category)); +extern char *textdomain__ PARAMS ((const char *__domainname)); +extern char *bindtextdomain__ PARAMS ((const char *__domainname, + const char *__dirname)); +extern char *bind_textdomain_codeset__ PARAMS ((const char *__domainname, + const char *__codeset)); +#endif + +#ifdef _LIBC +extern void __gettext_free_exp PARAMS ((struct expression *exp)) + internal_function; +extern int __gettextparse PARAMS ((void *arg)); +#else +extern void gettext_free_exp__ PARAMS ((struct expression *exp)) + internal_function; +extern int gettextparse__ PARAMS ((void *arg)); +#endif + +/* @@ begin of epilog @@ */ + +#endif /* gettextP.h */ diff --git a/intl/hash-string.h b/intl/hash-string.h new file mode 100644 index 0000000..ccb7acc --- /dev/null +++ b/intl/hash-string.h @@ -0,0 +1,59 @@ +/* Description of GNU message catalog format: string hashing function. + Copyright (C) 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* @@ end of prolog @@ */ + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static unsigned long int hash_string PARAMS ((const char *__str_param)); + +static inline unsigned long int +hash_string (str_param) + const char *str_param; +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned long int) *str++; + g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} diff --git a/intl/intl-compat.c b/intl/intl-compat.c new file mode 100644 index 0000000..0a06ce9 --- /dev/null +++ b/intl/intl-compat.c @@ -0,0 +1,166 @@ +/* intl-compat.c - Stub functions to call gettext functions from GNU gettext + Library. + Copyright (C) 1995, 2000, 2001 Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "libgnuintl.h" +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +/* This file redirects the gettext functions (without prefix or suffix) to + those defined in the included GNU gettext library (with "__" suffix). + It is compiled into libintl when the included GNU gettext library is + configured --with-included-gettext. + + This redirection works also in the case that the system C library or + the system libintl library contain gettext/textdomain/... functions. + If it didn't, we would need to add preprocessor level redirections to + libgnuintl.h of the following form: + +# define gettext gettext__ +# define dgettext dgettext__ +# define dcgettext dcgettext__ +# define ngettext ngettext__ +# define dngettext dngettext__ +# define dcngettext dcngettext__ +# define textdomain textdomain__ +# define bindtextdomain bindtextdomain__ +# define bind_textdomain_codeset bind_textdomain_codeset__ + + How does this redirection work? There are two cases. + A. When libintl.a is linked into an executable, it works because + functions defined in the executable always override functions in + the shared libraries. + B. When libintl.so is used, it works because + 1. those systems defining gettext/textdomain/... in the C library + (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer) are + ELF systems and define these symbols as weak, thus explicitly + letting other shared libraries override it. + 2. those systems defining gettext/textdomain/... in a standalone + libintl.so library (namely, Solaris 2.3 and newer) have this + shared library in /usr/lib, and the linker will search /usr/lib + *after* the directory where the GNU gettext library is installed. + + A third case, namely when libintl.a is linked into a shared library + whose name is not libintl.so, is not supported. In this case, on + Solaris, when -lintl precedes the linker option for the shared library + containing GNU gettext, the system's gettext would indeed override + the GNU gettext. Anyone doing this kind of stuff must be clever enough + to 1. compile libintl.a with -fPIC, 2. remove -lintl from his linker + command line. */ + + +#undef gettext +#undef dgettext +#undef dcgettext +#undef ngettext +#undef dngettext +#undef dcngettext +#undef textdomain +#undef bindtextdomain +#undef bind_textdomain_codeset + + +char * +gettext (msgid) + const char *msgid; +{ + return gettext__ (msgid); +} + + +char * +dgettext (domainname, msgid) + const char *domainname; + const char *msgid; +{ + return dgettext__ (domainname, msgid); +} + + +char * +dcgettext (domainname, msgid, category) + const char *domainname; + const char *msgid; + int category; +{ + return dcgettext__ (domainname, msgid, category); +} + + +char * +ngettext (msgid1, msgid2, n) + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return ngettext__ (msgid1, msgid2, n); +} + + +char * +dngettext (domainname, msgid1, msgid2, n) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return dngettext__ (domainname, msgid1, msgid2, n); +} + + +char * +dcngettext (domainname, msgid1, msgid2, n, category) + const char *domainname; + const char *msgid1; + const char *msgid2; + unsigned long int n; + int category; +{ + return dcngettext__ (domainname, msgid1, msgid2, n, category); +} + + +char * +textdomain (domainname) + const char *domainname; +{ + return textdomain__ (domainname); +} + + +char * +bindtextdomain (domainname, dirname) + const char *domainname; + const char *dirname; +{ + return bindtextdomain__ (domainname, dirname); +} + + +char * +bind_textdomain_codeset (domainname, codeset) + const char *domainname; + const char *codeset; +{ + return bind_textdomain_codeset__ (domainname, codeset); +} diff --git a/intl/l10nflist.c b/intl/l10nflist.c new file mode 100644 index 0000000..533e94b --- /dev/null +++ b/intl/l10nflist.c @@ -0,0 +1,405 @@ +/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for stpcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#if defined _LIBC || defined HAVE_ARGZ_H +# include +#endif +#include +#include +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# ifndef stpcpy +# define stpcpy(dest, src) __stpcpy(dest, src) +# endif +#else +# ifndef HAVE_STPCPY +static char *stpcpy PARAMS ((char *dest, const char *src)); +# endif +#endif + +/* Define function which are usually not available. */ + +#if !defined _LIBC && !defined HAVE___ARGZ_COUNT +/* Returns the number of strings in ARGZ. */ +static size_t argz_count__ PARAMS ((const char *argz, size_t len)); + +static size_t +argz_count__ (argz, len) + const char *argz; + size_t len; +{ + size_t count = 0; + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len + 1; + len -= part_len + 1; + count++; + } + return count; +} +# undef __argz_count +# define __argz_count(argz, len) argz_count__ (argz, len) +#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ + +#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY +/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's + except the last into the character SEP. */ +static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); + +static void +argz_stringify__ (argz, len, sep) + char *argz; + size_t len; + int sep; +{ + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len; + len -= part_len + 1; + if (len > 0) + *argz++ = sep; + } +} +# undef __argz_stringify +# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) +#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ + +#if !defined _LIBC && !defined HAVE___ARGZ_NEXT +static char *argz_next__ PARAMS ((char *argz, size_t argz_len, + const char *entry)); + +static char * +argz_next__ (argz, argz_len, entry) + char *argz; + size_t argz_len; + const char *entry; +{ + if (entry) + { + if (entry < argz + argz_len) + entry = strchr (entry, '\0') + 1; + + return entry >= argz + argz_len ? NULL : (char *) entry; + } + else + if (argz_len > 0) + return argz; + else + return 0; +} +# undef __argz_next +# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) +#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ + + +/* Return number of bits set in X. */ +static int pop PARAMS ((int x)); + +static inline int +pop (x) + int x; +{ + /* We assume that no more than 16 bits are used. */ + x = ((x & ~0x5555) >> 1) + (x & 0x5555); + x = ((x & ~0x3333) >> 2) + (x & 0x3333); + x = ((x >> 4) + x) & 0x0f0f; + x = ((x >> 8) + x) & 0xff; + + return x; +} + + +struct loaded_l10nfile * +_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, + territory, codeset, normalized_codeset, modifier, special, + sponsor, revision, filename, do_allocate) + struct loaded_l10nfile **l10nfile_list; + const char *dirlist; + size_t dirlist_len; + int mask; + const char *language; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *modifier; + const char *special; + const char *sponsor; + const char *revision; + const char *filename; + int do_allocate; +{ + char *abs_filename; + struct loaded_l10nfile *last = NULL; + struct loaded_l10nfile *retval; + char *cp; + size_t entries; + int cnt; + + /* Allocate room for the full file name. */ + abs_filename = (char *) malloc (dirlist_len + + strlen (language) + + ((mask & TERRITORY) != 0 + ? strlen (territory) + 1 : 0) + + ((mask & XPG_CODESET) != 0 + ? strlen (codeset) + 1 : 0) + + ((mask & XPG_NORM_CODESET) != 0 + ? strlen (normalized_codeset) + 1 : 0) + + (((mask & XPG_MODIFIER) != 0 + || (mask & CEN_AUDIENCE) != 0) + ? strlen (modifier) + 1 : 0) + + ((mask & CEN_SPECIAL) != 0 + ? strlen (special) + 1 : 0) + + (((mask & CEN_SPONSOR) != 0 + || (mask & CEN_REVISION) != 0) + ? (1 + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) + 1 : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0)) : 0) + + 1 + strlen (filename) + 1); + + if (abs_filename == NULL) + return NULL; + + retval = NULL; + last = NULL; + + /* Construct file name. */ + memcpy (abs_filename, dirlist, dirlist_len); + __argz_stringify (abs_filename, dirlist_len, PATH_SEPARATOR); + cp = abs_filename + (dirlist_len - 1); + *cp++ = '/'; + cp = stpcpy (cp, language); + + if ((mask & TERRITORY) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, territory); + } + if ((mask & XPG_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, codeset); + } + if ((mask & XPG_NORM_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, normalized_codeset); + } + if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) + { + /* This component can be part of both syntaces but has different + leading characters. For CEN we use `+', else `@'. */ + *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; + cp = stpcpy (cp, modifier); + } + if ((mask & CEN_SPECIAL) != 0) + { + *cp++ = '+'; + cp = stpcpy (cp, special); + } + if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) + { + *cp++ = ','; + if ((mask & CEN_SPONSOR) != 0) + cp = stpcpy (cp, sponsor); + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } + } + + *cp++ = '/'; + stpcpy (cp, filename); + + /* Look in list of already loaded domains whether it is already + available. */ + last = NULL; + for (retval = *l10nfile_list; retval != NULL; retval = retval->next) + if (retval->filename != NULL) + { + int compare = strcmp (retval->filename, abs_filename); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It's not in the list. */ + retval = NULL; + break; + } + + last = retval; + } + + if (retval != NULL || do_allocate == 0) + { + free (abs_filename); + return retval; + } + + retval = (struct loaded_l10nfile *) + malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) + * (1 << pop (mask)) + * sizeof (struct loaded_l10nfile *))); + if (retval == NULL) + return NULL; + + retval->filename = abs_filename; + retval->decided = (__argz_count (dirlist, dirlist_len) != 1 + || ((mask & XPG_CODESET) != 0 + && (mask & XPG_NORM_CODESET) != 0)); + retval->data = NULL; + + if (last == NULL) + { + retval->next = *l10nfile_list; + *l10nfile_list = retval; + } + else + { + retval->next = last->next; + last->next = retval; + } + + entries = 0; + /* If the DIRLIST is a real list the RETVAL entry corresponds not to + a real file. So we have to use the DIRLIST separation mechanism + of the inner loop. */ + cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask; + for (; cnt >= 0; --cnt) + if ((cnt & ~mask) == 0 + && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) + && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) + { + /* Iterate over all elements of the DIRLIST. */ + char *dir = NULL; + + while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) + != NULL) + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, + language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + retval->successor[entries] = NULL; + + return retval; +} + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. The return value is dynamically allocated and has to be + freed by the caller. */ +const char * +_nl_normalize_codeset (codeset, name_len) + const char *codeset; + size_t name_len; +{ + int len = 0; + int only_digit = 1; + char *retval; + char *wp; + size_t cnt; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalnum (codeset[cnt])) + { + ++len; + + if (isalpha (codeset[cnt])) + only_digit = 0; + } + + retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); + + if (retval != NULL) + { + if (only_digit) + wp = stpcpy (retval, "iso"); + else + wp = retval; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalpha (codeset[cnt])) + *wp++ = tolower (codeset[cnt]); + else if (isdigit (codeset[cnt])) + *wp++ = codeset[cnt]; + + *wp = '\0'; + } + + return (const char *) retval; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (dest, src) + char *dest; + const char *src; +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/intl/libgettext.h b/intl/libgettext.h new file mode 100644 index 0000000..c5be54a --- /dev/null +++ b/intl/libgettext.h @@ -0,0 +1,49 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +#else + +# define gettext(Msgid) (Msgid) +# define dgettext(Domainname, Msgid) (Msgid) +# define dcgettext(Domainname, Msgid, Category) (Msgid) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2)) +# define textdomain(Domainname) ((char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((char *) (Codeset)) + +#endif + +/* For automatical extraction of messages sometimes no real + translation is needed. Instead the string itself is the result. */ +#define gettext_noop(Str) (Str) + +#endif /* _LIBGETTEXT_H */ diff --git a/intl/libgnuintl.h b/intl/libgnuintl.h new file mode 100644 index 0000000..f891deb --- /dev/null +++ b/intl/libgnuintl.h @@ -0,0 +1,128 @@ +/* Message catalogs for internationalization. + Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LIBINTL_H +#define _LIBINTL_H 1 + +#include + +/* The LC_MESSAGES locale category is the category used by the functions + gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. + On systems that don't define it, use an arbitrary value instead. + On Solaris, defines __LOCALE_H then includes (i.e. + this file!) and then only defines LC_MESSAGES. To avoid a redefinition + warning, don't define LC_MESSAGES in this case. */ +#if !defined LC_MESSAGES && !defined __LOCALE_H +# define LC_MESSAGES 1729 +#endif + +/* We define an additional symbol to signal that we use the GNU + implementation of gettext. */ +#define __USE_GNU_GETTEXT 1 + +/* Resolve a platform specific conflict on DJGPP. GNU gettext takes + precedence over _conio_gettext. */ +#ifdef __DJGPP__ +# undef gettext +# define gettext gettext +#endif + +#ifndef PARAMS +# if __STDC__ || defined __cplusplus +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +extern char *gettext PARAMS ((const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current + LC_MESSAGES locale. */ +extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid)); + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid, + int __category)); + + +/* Similar to `gettext' but select the plural form corresponding to the + number N. */ +extern char *ngettext PARAMS ((const char *__msgid1, const char *__msgid2, + unsigned long int __n)); + +/* Similar to `dgettext' but select the plural form corresponding to the + number N. */ +extern char *dngettext PARAMS ((const char *__domainname, const char *__msgid1, + const char *__msgid2, unsigned long int __n)); + +/* Similar to `dcgettext' but select the plural form corresponding to the + number N. */ +extern char *dcngettext PARAMS ((const char *__domainname, const char *__msgid1, + const char *__msgid2, unsigned long int __n, + int __category)); + + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +extern char *textdomain PARAMS ((const char *__domainname)); + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +extern char *bindtextdomain PARAMS ((const char *__domainname, + const char *__dirname)); + +/* Specify the character encoding in which the messages from the + DOMAINNAME message catalog will be returned. */ +extern char *bind_textdomain_codeset PARAMS ((const char *__domainname, + const char *__codeset)); + + +/* Optimized version of the functions above. */ +#if defined __OPTIMIZED +/* These are macros, but could also be inline functions. */ + +# define gettext(msgid) \ + dgettext (NULL, msgid) + +# define dgettext(domainname, msgid) \ + dcgettext (domainname, msgid, LC_MESSAGES) + +# define ngettext(msgid1, msgid2, n) \ + dngettext (NULL, msgid1, msgid2, n) + +# define dngettext(domainname, msgid1, msgid2, n) \ + dcngettext (domainname, msgid1, msgid2, n, LC_MESSAGES) + +#endif /* Optimizing. */ + + +#ifdef __cplusplus +} +#endif + +#endif /* libintl.h */ diff --git a/intl/loadinfo.h b/intl/loadinfo.h new file mode 100644 index 0000000..b861260 --- /dev/null +++ b/intl/loadinfo.h @@ -0,0 +1,109 @@ +/* Copyright (C) 1996-1999, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LOADINFO_H +#define _LOADINFO_H 1 + +#ifndef PARAMS +# if __STDC__ +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif +#endif + +#ifndef internal_function +# define internal_function +#endif + +/* Tell the compiler when a conditional or integer expression is + almost always true or almost always false. */ +#ifndef HAVE_BUILTIN_EXPECT +# define __builtin_expect(expr, val) (expr) +#endif + +/* Separator in PATH like lists of pathnames. */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define PATH_SEPARATOR ';' +#else + /* Unix */ +# define PATH_SEPARATOR ':' +#endif + +/* Encoding of locale name parts. */ +#define CEN_REVISION 1 +#define CEN_SPONSOR 2 +#define CEN_SPECIAL 4 +#define XPG_NORM_CODESET 8 +#define XPG_CODESET 16 +#define TERRITORY 32 +#define CEN_AUDIENCE 64 +#define XPG_MODIFIER 128 + +#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) +#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) + + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + struct loaded_l10nfile *next; + struct loaded_l10nfile *successor[1]; +}; + + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. The return value is dynamically allocated and has to be + freed by the caller. */ +extern const char *_nl_normalize_codeset PARAMS ((const char *codeset, + size_t name_len)); + +extern struct loaded_l10nfile * +_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, int mask, + const char *language, const char *territory, + const char *codeset, + const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate)); + + +extern const char *_nl_expand_alias PARAMS ((const char *name)); + +/* normalized_codeset is dynamically allocated and has to be freed by + the caller. */ +extern int _nl_explode_name PARAMS ((char *name, const char **language, + const char **modifier, + const char **territory, + const char **codeset, + const char **normalized_codeset, + const char **special, + const char **sponsor, + const char **revision)); + +extern char *_nl_find_language PARAMS ((const char *name)); + +#endif /* loadinfo.h */ diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c new file mode 100644 index 0000000..f99ebee --- /dev/null +++ b/intl/loadmsgcat.c @@ -0,0 +1,567 @@ +/* Load needed message catalogs. + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#ifdef _LIBC +# include +# include +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || (defined _LIBC && defined _POSIX_MAPPED_FILES) +# include +# undef HAVE_MMAP +# define HAVE_MMAP 1 +#else +# undef HAVE_MMAP +#endif + +#include "gettext.h" +#include "gettextP.h" + +#ifdef _LIBC +# include "../locale/localeinfo.h" +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ISO C functions. This is required by the standard + because some ISO C functions will require linking with this object + file and the name space must not be polluted. */ +# define open __open +# define close __close +# define read __read +# define mmap __mmap +# define munmap __munmap +#endif + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define PLURAL_PARSE __gettextparse +#else +# define PLURAL_PARSE gettextparse__ +#endif + +/* For those losing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +/* For systems that distinguish between text and binary I/O. + O_BINARY is usually declared in . */ +#if !defined O_BINARY && defined _O_BINARY + /* For MSC-compatible compilers. */ +# define O_BINARY _O_BINARY +# define O_TEXT _O_TEXT +#endif +#ifdef __BEOS__ + /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ +# undef O_BINARY +# undef O_TEXT +#endif +/* On reasonable systems, binary I/O is the default. */ +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/* We need a sign, whether a new catalog was loaded, which can be associated + with all translations. This is important if the translations are + cached by one of GCC's features. */ +int _nl_msg_cat_cntr; + +#if (defined __GNUC__ && !defined __APPLE_CC__) \ + || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) + +/* These structs are the constant expression for the germanic plural + form determination. It represents the expression "n != 1". */ +static const struct expression plvar = +{ + .nargs = 0, + .operation = var, +}; +static const struct expression plone = +{ + .nargs = 0, + .operation = num, + .val = + { + .num = 1 + } +}; +static struct expression germanic_plural = +{ + .nargs = 2, + .operation = not_equal, + .val = + { + .args = + { + [0] = (struct expression *) &plvar, + [1] = (struct expression *) &plone + } + } +}; + +# define INIT_GERMANIC_PLURAL() + +#else + +/* For compilers without support for ISO C 99 struct/union initializers: + Initialization at run-time. */ + +static struct expression plvar; +static struct expression plone; +static struct expression germanic_plural; + +static void +init_germanic_plural () +{ + if (plone.val.num == 0) + { + plvar.nargs = 0; + plvar.operation = var; + + plone.nargs = 0; + plone.operation = num; + plone.val.num = 1; + + germanic_plural.nargs = 2; + germanic_plural.operation = not_equal; + germanic_plural.val.args[0] = &plvar; + germanic_plural.val.args[1] = &plone; + } +} + +# define INIT_GERMANIC_PLURAL() init_germanic_plural () + +#endif + + +/* Initialize the codeset dependent parts of an opened message catalog. + Return the header entry. */ +const char * +internal_function +_nl_init_domain_conv (domain_file, domain, domainbinding) + struct loaded_l10nfile *domain_file; + struct loaded_domain *domain; + struct binding *domainbinding; +{ + /* Find out about the character set the file is encoded with. + This can be found (in textual form) in the entry "". If this + entry does not exist or if this does not contain the `charset=' + information, we will assume the charset matches the one the + current locale and we don't have to perform any conversion. */ + char *nullentry; + size_t nullentrylen; + + /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ + domain->codeset_cntr = + (domainbinding != NULL ? domainbinding->codeset_cntr : 0); +#ifdef _LIBC + domain->conv = (__gconv_t) -1; +#else +# if HAVE_ICONV + domain->conv = (iconv_t) -1; +# endif +#endif + domain->conv_tab = NULL; + + /* Get the header entry. */ + nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); + + if (nullentry != NULL) + { +#if defined _LIBC || HAVE_ICONV + const char *charsetstr; + + charsetstr = strstr (nullentry, "charset="); + if (charsetstr != NULL) + { + size_t len; + char *charset; + const char *outcharset; + + charsetstr += strlen ("charset="); + len = strcspn (charsetstr, " \t\n"); + + charset = (char *) alloca (len + 1); +# if defined _LIBC || HAVE_MEMPCPY + *((char *) mempcpy (charset, charsetstr, len)) = '\0'; +# else + memcpy (charset, charsetstr, len); + charset[len] = '\0'; +# endif + + /* The output charset should normally be determined by the + locale. But sometimes the locale is not used or not correctly + set up, so we provide a possibility for the user to override + this. Moreover, the value specified through + bind_textdomain_codeset overrides both. */ + if (domainbinding != NULL && domainbinding->codeset != NULL) + outcharset = domainbinding->codeset; + else + { + outcharset = getenv ("OUTPUT_CHARSET"); + if (outcharset == NULL || outcharset[0] == '\0') + { +# ifdef _LIBC + outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string; +# else +# if HAVE_ICONV + extern const char *locale_charset (void); + outcharset = locale_charset (); +# endif +# endif + } + } + +# ifdef _LIBC + /* We always want to use transliteration. */ + outcharset = norm_add_slashes (outcharset, "TRANSLIT"); + charset = norm_add_slashes (charset, NULL); + if (__gconv_open (outcharset, charset, &domain->conv, + GCONV_AVOID_NOCONV) + != __GCONV_OK) + domain->conv = (__gconv_t) -1; +# else +# if HAVE_ICONV + /* When using GNU libiconv, we want to use transliteration. */ +# if _LIBICONV_VERSION >= 0x0105 + len = strlen (outcharset); + { + char *tmp = (char *) alloca (len + 10 + 1); + memcpy (tmp, outcharset, len); + memcpy (tmp + len, "//TRANSLIT", 10 + 1); + outcharset = tmp; + } +# endif + domain->conv = iconv_open (outcharset, charset); +# if _LIBICONV_VERSION >= 0x0105 + freea (outcharset); +# endif +# endif +# endif + + freea (charset); + } +#endif /* _LIBC || HAVE_ICONV */ + } + + return nullentry; +} + +/* Frees the codeset dependent parts of an opened message catalog. */ +void +internal_function +_nl_free_domain_conv (domain) + struct loaded_domain *domain; +{ + if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) + free (domain->conv_tab); + +#ifdef _LIBC + if (domain->conv != (__gconv_t) -1) + __gconv_close (domain->conv); +#else +# if HAVE_ICONV + if (domain->conv != (iconv_t) -1) + iconv_close (domain->conv); +# endif +#endif +} + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +internal_function +_nl_load_domain (domain_file, domainbinding) + struct loaded_l10nfile *domain_file; + struct binding *domainbinding; +{ + int fd; + size_t size; +#ifdef _LIBC + struct stat64 st; +#else + struct stat st; +#endif + struct mo_file_header *data = (struct mo_file_header *) -1; + int use_mmap = 0; + struct loaded_domain *domain; + const char *nullentry; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* Note that it would be useless to store domainbinding in domain_file + because domainbinding might be == NULL now but != NULL later (after + a call to bind_textdomain_codeset). */ + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY | O_BINARY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if ( +#ifdef _LIBC + __builtin_expect (fstat64 (fd, &st) != 0, 0) +#else + __builtin_expect (fstat (fd, &st) != 0, 0) +#endif + || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) + || __builtin_expect (size < sizeof (struct mo_file_header), 0)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#ifdef HAVE_MMAP + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (__builtin_expect (data != (struct mo_file_header *) -1, 1)) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + size_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (size); + if (data == NULL) + return; + + to_read = size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb <= 0) + { +#ifdef EINTR + if (nb == -1 && errno == EINTR) + continue; +#endif + close (fd); + return; + } + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED, + 0)) + { + /* The magic number is wrong: not a message catalog file. */ +#ifdef HAVE_MMAP + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + return; + } + + domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain == NULL) + return; + domain_file->data = domain; + + domain->data = (char *) data; + domain->use_mmap = use_mmap; + domain->mmap_size = size; + domain->must_swap = data->magic != _MAGIC; + + /* Fill in the information about the available tables. */ + switch (W (domain->must_swap, data->revision)) + { + case 0: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = (nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)); + break; + default: + /* This is an invalid revision. */ +#ifdef HAVE_MMAP + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } + + /* Now initialize the character set converter from the character set + the file is encoded with (found in the header entry) to the domain's + specified character set or the locale's character set. */ + nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); + + /* Also look for a plural specification. */ + if (nullentry != NULL) + { + const char *plural; + const char *nplurals; + + plural = strstr (nullentry, "plural="); + nplurals = strstr (nullentry, "nplurals="); + if (plural == NULL || nplurals == NULL) + goto no_plural; + else + { + /* First get the number. */ + char *endp; + unsigned long int n; + struct parse_args args; + + nplurals += 9; + while (*nplurals != '\0' && isspace (*nplurals)) + ++nplurals; +#if defined HAVE_STRTOUL || defined _LIBC + n = strtoul (nplurals, &endp, 10); +#else + for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) + n = n * 10 + (*endp - '0'); +#endif + domain->nplurals = n; + if (nplurals == endp) + goto no_plural; + + /* Due to the restrictions bison imposes onto the interface of the + scanner function we have to put the input string and the result + passed up from the parser into the same structure which address + is passed down to the parser. */ + plural += 7; + args.cp = plural; + if (PLURAL_PARSE (&args) != 0) + goto no_plural; + domain->plural = args.res; + } + } + else + { + /* By default we are using the Germanic form: singular form only + for `one', the plural form otherwise. Yes, this is also what + English is using since English is a Germanic language. */ + no_plural: + INIT_GERMANIC_PLURAL (); + domain->plural = &germanic_plural; + domain->nplurals = 2; + } +} + + +#ifdef _LIBC +void +internal_function +_nl_unload_domain (domain) + struct loaded_domain *domain; +{ + if (domain->plural != &germanic_plural) + __gettext_free_exp (domain->plural); + + _nl_free_domain_conv (domain); + +# ifdef _POSIX_MAPPED_FILES + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else +# endif /* _POSIX_MAPPED_FILES */ + free ((void *) domain->data); + + free (domain); +} +#endif diff --git a/intl/localcharset.c b/intl/localcharset.c new file mode 100644 index 0000000..61f8f3e --- /dev/null +++ b/intl/localcharset.c @@ -0,0 +1,271 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Bruno Haible . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if HAVE_STDDEF_H +# include +#endif + +#include +#if HAVE_STRING_H +# include +#else +# include +#endif +#if HAVE_STDLIB_H +# include +#endif + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#ifndef WIN32 +# if HAVE_LANGINFO_CODESET +# include +# else +# if HAVE_SETLOCALE +# include +# endif +# endif +#else /* WIN32 */ +# define WIN32_LEAN_AND_MEAN +# include +#endif + +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif + +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif +/* Pointer to the contents of the charset.alias file, if it has already been + read, else NULL. Its format is: + ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ +static const char * volatile charset_aliases; + +/* Return a pointer to the contents of the charset.alias file. */ +static const char * +get_charset_aliases () +{ + const char *cp; + + cp = charset_aliases; + if (cp == NULL) + { +#ifndef WIN32 + FILE *fp; + const char *dir = LIBDIR; + const char *base = "charset.alias"; + char *file_name; + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } + + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ + cp = ""; + else + { + /* Parse the file's contents. */ + int c; + char buf1[50+1]; + char buf2[50+1]; + char *res_ptr = NULL; + size_t res_size = 0; + size_t l1, l2; + + for (;;) + { + c = getc (fp); + if (c == EOF) + break; + if (c == '\n' || c == ' ' || c == '\t') + continue; + if (c == '#') + { + /* Skip comment, to end of line. */ + do + c = getc (fp); + while (!(c == EOF || c == '\n')); + if (c == EOF) + break; + continue; + } + ungetc (c, fp); + if (fscanf(fp, "%50s %50s", buf1, buf2) < 2) + break; + l1 = strlen (buf1); + l2 = strlen (buf2); + if (res_size == 0) + { + res_size = l1 + 1 + l2 + 1; + res_ptr = malloc (res_size + 1); + } + else + { + res_size += l1 + 1 + l2 + 1; + res_ptr = realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + break; + } + strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); + strcpy (res_ptr + res_size - (l2 + 1), buf2); + } + fclose (fp); + if (res_size == 0) + cp = ""; + else + { + *(res_ptr + res_size) = '\0'; + cp = res_ptr; + } + } + + if (file_name != NULL) + free (file_name); + +#else /* WIN32 */ + + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0"; +#endif + + charset_aliases = cp; + } + + return cp; +} + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +#ifdef STATIC +STATIC +#endif +const char * +locale_charset () +{ + const char *codeset; + const char *aliases; + +#ifndef WIN32 + +# if HAVE_LANGINFO_CODESET + + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +# else + + /* On old systems which lack it, use setlocale or getenv. */ + const char *locale = NULL; + + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if HAVE_SETLOCALE && 0 + locale = setlocale (LC_CTYPE, NULL); +# endif + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + } + + /* On some old systems, one used to set locale = "iso8859_1". On others, + you set it to "language_COUNTRY.charset". In any case, we resolve it + through the charset.alias file. */ + codeset = locale; + +# endif + +#else /* WIN32 */ + + static char buf[2 + 10 + 1]; + + /* Win32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + +#endif + + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } + + return codeset; +} diff --git a/intl/locale.alias b/intl/locale.alias new file mode 100644 index 0000000..bd7b9b3 --- /dev/null +++ b/intl/locale.alias @@ -0,0 +1,78 @@ +# Locale name alias data base. +# Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. + +# The format of this file is the same as for the corresponding file of +# the X Window System, which normally can be found in +# /usr/lib/X11/locale/locale.alias +# A single line contains two fields: an alias and a substitution value. +# All entries are case independent. + +# Note: This file is far from being complete. If you have a value for +# your own site which you think might be useful for others too, share +# it with the rest of us. Send it using the `glibcbug' script to +# bugs@gnu.org. + +# Packages using this file: + +bokmal no_NO.ISO-8859-1 +bokmÃ¥l no_NO.ISO-8859-1 +catalan ca_ES.ISO-8859-1 +croatian hr_HR.ISO-8859-2 +czech cs_CZ.ISO-8859-2 +danish da_DK.ISO-8859-1 +dansk da_DK.ISO-8859-1 +deutsch de_DE.ISO-8859-1 +dutch nl_NL.ISO-8859-1 +eesti et_EE.ISO-8859-1 +estonian et_EE.ISO-8859-1 +finnish fi_FI.ISO-8859-1 +français fr_FR.ISO-8859-1 +french fr_FR.ISO-8859-1 +galego gl_ES.ISO-8859-1 +galician gl_ES.ISO-8859-1 +german de_DE.ISO-8859-1 +greek el_GR.ISO-8859-7 +hebrew he_IL.ISO-8859-8 +hrvatski hr_HR.ISO-8859-2 +hungarian hu_HU.ISO-8859-2 +icelandic is_IS.ISO-8859-1 +italian it_IT.ISO-8859-1 +japanese ja_JP.eucJP +japanese.euc ja_JP.eucJP +ja_JP ja_JP.eucJP +ja_JP.ujis ja_JP.eucJP +japanese.sjis ja_JP.SJIS +korean ko_KR.eucKR +korean.euc ko_KR.eucKR +ko_KR ko_KR.eucKR +lithuanian lt_LT.ISO-8859-13 +nb_NO no_NO.ISO-8859-1 +nb_NO.ISO-8859-1 no_NO.ISO-8859-1 +norwegian no_NO.ISO-8859-1 +nynorsk nn_NO.ISO-8859-1 +polish pl_PL.ISO-8859-2 +portuguese pt_PT.ISO-8859-1 +romanian ro_RO.ISO-8859-2 +russian ru_RU.ISO-8859-5 +slovak sk_SK.ISO-8859-2 +slovene sl_SI.ISO-8859-2 +slovenian sl_SI.ISO-8859-2 +spanish es_ES.ISO-8859-1 +swedish sv_SE.ISO-8859-1 +thai th_TH.TIS-620 +turkish tr_TR.ISO-8859-9 diff --git a/intl/localealias.c b/intl/localealias.c new file mode 100644 index 0000000..91e7acc --- /dev/null +++ b/intl/localealias.c @@ -0,0 +1,404 @@ +/* Handle aliases for locale names. + Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +#endif + +#include + +#include +#if !HAVE_STRCHR && !defined _LIBC +# ifndef strchr +# define strchr index +# endif +#endif + +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define strcasecmp __strcasecmp + +# ifndef mempcpy +# define mempcpy __mempcpy +# endif +# define HAVE_MEMPCPY 1 + +/* We need locking here since we can be called from different places. */ +# include + +__libc_lock_define_initialized (static, lock); +#endif + +#ifndef internal_function +# define internal_function +#endif + +/* For those losing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED +# undef fgets +# define fgets(buf, len, s) fgets_unlocked (buf, len, s) +#endif +#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED +# undef feof +# define feof(s) feof_unlocked (s) +#endif + + +struct alias_map +{ + const char *alias; + const char *value; +}; + + +static char *string_space; +static size_t string_space_act; +static size_t string_space_max; +static struct alias_map *map; +static size_t nmap; +static size_t maxmap; + + +/* Prototypes for local functions. */ +static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) + internal_function; +static int extend_alias_table PARAMS ((void)); +static int alias_compare PARAMS ((const struct alias_map *map1, + const struct alias_map *map2)); + + +const char * +_nl_expand_alias (name) + const char *name; +{ + static const char *locale_alias_path = LOCALE_ALIAS_PATH; + struct alias_map *retval; + const char *result = NULL; + size_t added; + +#ifdef _LIBC + __libc_lock_lock (lock); +#endif + + do + { + struct alias_map item; + + item.alias = name; + + if (nmap > 0) + retval = (struct alias_map *) bsearch (&item, map, nmap, + sizeof (struct alias_map), + (int (*) PARAMS ((const void *, + const void *)) + ) alias_compare); + else + retval = NULL; + + /* We really found an alias. Return the value. */ + if (retval != NULL) + { + result = retval->value; + break; + } + + /* Perhaps we can find another alias file. */ + added = 0; + while (added == 0 && locale_alias_path[0] != '\0') + { + const char *start; + + while (locale_alias_path[0] == PATH_SEPARATOR) + ++locale_alias_path; + start = locale_alias_path; + + while (locale_alias_path[0] != '\0' + && locale_alias_path[0] != PATH_SEPARATOR) + ++locale_alias_path; + + if (start < locale_alias_path) + added = read_alias_file (start, locale_alias_path - start); + } + } + while (added != 0); + +#ifdef _LIBC + __libc_lock_unlock (lock); +#endif + + return result; +} + + +static size_t +internal_function +read_alias_file (fname, fname_len) + const char *fname; + int fname_len; +{ + FILE *fp; + char *full_fname; + size_t added; + static const char aliasfile[] = "/locale.alias"; + + full_fname = (char *) alloca (fname_len + sizeof aliasfile); +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (full_fname, fname, fname_len), + aliasfile, sizeof aliasfile); +#else + memcpy (full_fname, fname, fname_len); + memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); +#endif + + fp = fopen (full_fname, "r"); + freea (full_fname); + if (fp == NULL) + return 0; + + added = 0; + while (!feof (fp)) + { + /* It is a reasonable approach to use a fix buffer here because + a) we are only interested in the first two fields + b) these fields must be usable as file names and so must not + be that long + */ + char buf[BUFSIZ]; + char *alias; + char *value; + char *cp; + + if (fgets (buf, sizeof buf, fp) == NULL) + /* EOF reached. */ + break; + + /* Possibly not the whole line fits into the buffer. Ignore + the rest of the line. */ + if (strchr (buf, '\n') == NULL) + { + char altbuf[BUFSIZ]; + do + if (fgets (altbuf, sizeof altbuf, fp) == NULL) + /* Make sure the inner loop will be left. The outer loop + will exit at the `feof' test. */ + break; + while (strchr (altbuf, '\n') == NULL); + } + + cp = buf; + /* Ignore leading white space. */ + while (isspace (cp[0])) + ++cp; + + /* A leading '#' signals a comment line. */ + if (cp[0] != '\0' && cp[0] != '#') + { + alias = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate alias name. */ + if (cp[0] != '\0') + *cp++ = '\0'; + + /* Now look for the beginning of the value. */ + while (isspace (cp[0])) + ++cp; + + if (cp[0] != '\0') + { + size_t alias_len; + size_t value_len; + + value = cp++; + while (cp[0] != '\0' && !isspace (cp[0])) + ++cp; + /* Terminate value. */ + if (cp[0] == '\n') + { + /* This has to be done to make the following test + for the end of line possible. We are looking for + the terminating '\n' which do not overwrite here. */ + *cp++ = '\0'; + *cp = '\n'; + } + else if (cp[0] != '\0') + *cp++ = '\0'; + + if (nmap >= maxmap) + if (__builtin_expect (extend_alias_table (), 0)) + return added; + + alias_len = strlen (alias) + 1; + value_len = strlen (value) + 1; + + if (string_space_act + alias_len + value_len > string_space_max) + { + /* Increase size of memory pool. */ + size_t new_size = (string_space_max + + (alias_len + value_len > 1024 + ? alias_len + value_len : 1024)); + char *new_pool = (char *) realloc (string_space, new_size); + if (new_pool == NULL) + return added; + + if (__builtin_expect (string_space != new_pool, 0)) + { + size_t i; + + for (i = 0; i < nmap; i++) + { + map[i].alias += new_pool - string_space; + map[i].value += new_pool - string_space; + } + } + + string_space = new_pool; + string_space_max = new_size; + } + + map[nmap].alias = memcpy (&string_space[string_space_act], + alias, alias_len); + string_space_act += alias_len; + + map[nmap].value = memcpy (&string_space[string_space_act], + value, value_len); + string_space_act += value_len; + + ++nmap; + ++added; + } + } + } + + /* Should we test for ferror()? I think we have to silently ignore + errors. --drepper */ + fclose (fp); + + if (added > 0) + qsort (map, nmap, sizeof (struct alias_map), + (int (*) PARAMS ((const void *, const void *))) alias_compare); + + return added; +} + + +static int +extend_alias_table () +{ + size_t new_size; + struct alias_map *new_map; + + new_size = maxmap == 0 ? 100 : 2 * maxmap; + new_map = (struct alias_map *) realloc (map, (new_size + * sizeof (struct alias_map))); + if (new_map == NULL) + /* Simply don't extend: we don't have any more core. */ + return -1; + + map = new_map; + maxmap = new_size; + return 0; +} + + +#ifdef _LIBC +static void __attribute__ ((unused)) +free_mem (void) +{ + if (string_space != NULL) + free (string_space); + if (map != NULL) + free (map); +} +text_set_element (__libc_subfreeres, free_mem); +#endif + + +static int +alias_compare (map1, map2) + const struct alias_map *map1; + const struct alias_map *map2; +{ +#if defined _LIBC || defined HAVE_STRCASECMP + return strcasecmp (map1->alias, map2->alias); +#else + const unsigned char *p1 = (const unsigned char *) map1->alias; + const unsigned char *p2 = (const unsigned char *) map2->alias; + unsigned char c1, c2; + + if (p1 == p2) + return 0; + + do + { + /* I know this seems to be odd but the tolower() function in + some systems libc cannot handle nonalpha characters. */ + c1 = isupper (*p1) ? tolower (*p1) : *p1; + c2 = isupper (*p2) ? tolower (*p2) : *p2; + if (c1 == '\0') + break; + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +#endif +} diff --git a/intl/ngettext.c b/intl/ngettext.c new file mode 100644 index 0000000..fb3ec5a --- /dev/null +++ b/intl/ngettext.c @@ -0,0 +1,68 @@ +/* Implementation of ngettext(3) function. + Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# include /* Just for NULL. */ +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +#include + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define NGETTEXT __ngettext +# define DCNGETTEXT __dcngettext +#else +# define NGETTEXT ngettext__ +# define DCNGETTEXT dcngettext__ +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +NGETTEXT (msgid1, msgid2, n) + const char *msgid1; + const char *msgid2; + unsigned long int n; +{ + return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__ngettext, ngettext); +#endif diff --git a/intl/plural.c b/intl/plural.c new file mode 100644 index 0000000..640d43c --- /dev/null +++ b/intl/plural.c @@ -0,0 +1,1326 @@ + +/* A Bison parser, made from plural.y + by GNU Bison version 1.28 */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define yyparse __gettextparse +#define yylex __gettextlex +#define yyerror __gettexterror +#define yylval __gettextlval +#define yychar __gettextchar +#define yydebug __gettextdebug +#define yynerrs __gettextnerrs +#define EQUOP2 257 +#define CMPOP2 258 +#define ADDOP2 259 +#define MULOP2 260 +#define NUMBER 261 + +#line 1 "plural.y" + +/* Expression parsing for plural form selection. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* The bison generated parser uses alloca. AIX 3 forces us to put this + declaration at the beginning of the file. The declaration in bison's + skeleton file comes too late. This must come before + because may include arbitrary system headers. */ +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "gettextP.h" + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define FREE_EXPRESSION __gettext_free_exp +#else +# define FREE_EXPRESSION gettext_free_exp__ +# define __gettextparse gettextparse__ +#endif + +#define YYLEX_PARAM &((struct parse_args *) arg)->cp +#define YYPARSE_PARAM arg + +#line 53 "plural.y" +typedef union { + unsigned long int num; + enum operator op; + struct expression *exp; +} YYSTYPE; +#line 59 "plural.y" + +/* Prototypes for local functions. */ +static struct expression *new_exp PARAMS ((int nargs, enum operator op, + struct expression * const *args)); +static inline struct expression *new_exp_0 PARAMS ((enum operator op)); +static inline struct expression *new_exp_1 PARAMS ((enum operator op, + struct expression *right)); +static struct expression *new_exp_2 PARAMS ((enum operator op, + struct expression *left, + struct expression *right)); +static inline struct expression *new_exp_3 PARAMS ((enum operator op, + struct expression *bexp, + struct expression *tbranch, + struct expression *fbranch)); +static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); +static void yyerror PARAMS ((const char *str)); + +/* Allocation of expressions. */ + +static struct expression * +new_exp (nargs, op, args) + int nargs; + enum operator op; + struct expression * const *args; +{ + int i; + struct expression *newp; + + /* If any of the argument could not be malloc'ed, just return NULL. */ + for (i = nargs - 1; i >= 0; i--) + if (args[i] == NULL) + goto fail; + + /* Allocate a new expression. */ + newp = (struct expression *) malloc (sizeof (*newp)); + if (newp != NULL) + { + newp->nargs = nargs; + newp->operation = op; + for (i = nargs - 1; i >= 0; i--) + newp->val.args[i] = args[i]; + return newp; + } + + fail: + for (i = nargs - 1; i >= 0; i--) + FREE_EXPRESSION (args[i]); + + return NULL; +} + +static inline struct expression * +new_exp_0 (op) + enum operator op; +{ + return new_exp (0, op, NULL); +} + +static inline struct expression * +new_exp_1 (op, right) + enum operator op; + struct expression *right; +{ + struct expression *args[1]; + + args[0] = right; + return new_exp (1, op, args); +} + +static struct expression * +new_exp_2 (op, left, right) + enum operator op; + struct expression *left; + struct expression *right; +{ + struct expression *args[2]; + + args[0] = left; + args[1] = right; + return new_exp (2, op, args); +} + +static inline struct expression * +new_exp_3 (op, bexp, tbranch, fbranch) + enum operator op; + struct expression *bexp; + struct expression *tbranch; + struct expression *fbranch; +{ + struct expression *args[3]; + + args[0] = bexp; + args[1] = tbranch; + args[2] = fbranch; + return new_exp (3, op, args); +} + +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 27 +#define YYFLAG -32768 +#define YYNTBASE 16 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 10, 2, 2, 2, 2, 5, 2, 14, + 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 12, 2, 2, + 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 6, 7, 8, 9, + 11 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 8, 12, 16, 20, 24, 28, 32, 35, + 37, 39 +}; + +static const short yyrhs[] = { 17, + 0, 17, 3, 17, 12, 17, 0, 17, 4, 17, + 0, 17, 5, 17, 0, 17, 6, 17, 0, 17, + 7, 17, 0, 17, 8, 17, 0, 17, 9, 17, + 0, 10, 17, 0, 13, 0, 11, 0, 14, 17, + 15, 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 178, 186, 190, 194, 198, 202, 206, 210, 214, 218, + 222, 227 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","'?'","'|'", +"'&'","EQUOP2","CMPOP2","ADDOP2","MULOP2","'!'","NUMBER","':'","'n'","'('","')'", +"start","exp", NULL +}; +#endif + +static const short yyr1[] = { 0, + 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17 +}; + +static const short yyr2[] = { 0, + 1, 5, 3, 3, 3, 3, 3, 3, 2, 1, + 1, 3 +}; + +static const short yydefact[] = { 0, + 0, 11, 10, 0, 1, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 0, 3, 4, 5, 6, + 7, 8, 0, 2, 0, 0, 0 +}; + +static const short yydefgoto[] = { 25, + 5 +}; + +static const short yypact[] = { -9, + -9,-32768,-32768, -9, 34,-32768, 11, -9, -9, -9, + -9, -9, -9, -9,-32768, 24, 39, 43, 16, 26, + -3,-32768, -9, 34, 21, 53,-32768 +}; + +static const short yypgoto[] = {-32768, + -1 +}; + + +#define YYLAST 53 + + +static const short yytable[] = { 6, + 1, 2, 7, 3, 4, 14, 16, 17, 18, 19, + 20, 21, 22, 8, 9, 10, 11, 12, 13, 14, + 26, 24, 12, 13, 14, 15, 8, 9, 10, 11, + 12, 13, 14, 13, 14, 23, 8, 9, 10, 11, + 12, 13, 14, 10, 11, 12, 13, 14, 11, 12, + 13, 14, 27 +}; + +static const short yycheck[] = { 1, + 10, 11, 4, 13, 14, 9, 8, 9, 10, 11, + 12, 13, 14, 3, 4, 5, 6, 7, 8, 9, + 0, 23, 7, 8, 9, 15, 3, 4, 5, 6, + 7, 8, 9, 8, 9, 12, 3, 4, 5, 6, + 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, + 8, 9, 0 +}; +#define YYPURE 1 + +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple" +/* This file comes from bison-1.28. */ + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include +#endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ + #pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ +#endif +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc +#endif + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Define __yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *to, char *from, unsigned int count) +{ + register char *t = to; + register char *f = from; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 217 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +#ifdef YYPARSE_PARAM +int yyparse (void *); +#else +int yyparse (void); +#endif +#endif + +int +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + int yyfree_stacks = 0; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; +#ifndef YYSTACK_USE_ALLOCA + yyfree_stacks = 1; +#endif + yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, + size * (unsigned int) sizeof (*yyssp)); + yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, + size * (unsigned int) sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, + size * (unsigned int) sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 1: +#line 179 "plural.y" +{ + if (yyvsp[0].exp == NULL) + YYABORT; + ((struct parse_args *) arg)->res = yyvsp[0].exp; + ; + break;} +case 2: +#line 187 "plural.y" +{ + yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 3: +#line 191 "plural.y" +{ + yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 4: +#line 195 "plural.y" +{ + yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 5: +#line 199 "plural.y" +{ + yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 6: +#line 203 "plural.y" +{ + yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 7: +#line 207 "plural.y" +{ + yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 8: +#line 211 "plural.y" +{ + yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); + ; + break;} +case 9: +#line 215 "plural.y" +{ + yyval.exp = new_exp_1 (lnot, yyvsp[0].exp); + ; + break;} +case 10: +#line 219 "plural.y" +{ + yyval.exp = new_exp_0 (var); + ; + break;} +case 11: +#line 223 "plural.y" +{ + if ((yyval.exp = new_exp_0 (num)) != NULL) + yyval.exp->val.num = yyvsp[0].num; + ; + break;} +case 12: +#line 228 "plural.y" +{ + yyval.exp = yyvsp[-1].exp; + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; + + yyacceptlab: + /* YYACCEPT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 0; + + yyabortlab: + /* YYABORT comes here. */ + if (yyfree_stacks) + { + free (yyss); + free (yyvs); +#ifdef YYLSP_NEEDED + free (yyls); +#endif + } + return 1; +} +#line 233 "plural.y" + + +void +internal_function +FREE_EXPRESSION (exp) + struct expression *exp; +{ + if (exp == NULL) + return; + + /* Handle the recursive case. */ + switch (exp->nargs) + { + case 3: + FREE_EXPRESSION (exp->val.args[2]); + /* FALLTHROUGH */ + case 2: + FREE_EXPRESSION (exp->val.args[1]); + /* FALLTHROUGH */ + case 1: + FREE_EXPRESSION (exp->val.args[0]); + /* FALLTHROUGH */ + default: + break; + } + + free (exp); +} + + +static int +yylex (lval, pexp) + YYSTYPE *lval; + const char **pexp; +{ + const char *exp = *pexp; + int result; + + while (1) + { + if (exp[0] == '\0') + { + *pexp = exp; + return YYEOF; + } + + if (exp[0] != ' ' && exp[0] != '\t') + break; + + ++exp; + } + + result = *exp++; + switch (result) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + unsigned long int n = result - '0'; + while (exp[0] >= '0' && exp[0] <= '9') + { + n *= 10; + n += exp[0] - '0'; + ++exp; + } + lval->num = n; + result = NUMBER; + } + break; + + case '=': + if (exp[0] == '=') + { + ++exp; + lval->op = equal; + result = EQUOP2; + } + else + result = YYERRCODE; + break; + + case '!': + if (exp[0] == '=') + { + ++exp; + lval->op = not_equal; + result = EQUOP2; + } + break; + + case '&': + case '|': + if (exp[0] == result) + ++exp; + else + result = YYERRCODE; + break; + + case '<': + if (exp[0] == '=') + { + ++exp; + lval->op = less_or_equal; + } + else + lval->op = less_than; + result = CMPOP2; + break; + + case '>': + if (exp[0] == '=') + { + ++exp; + lval->op = greater_or_equal; + } + else + lval->op = greater_than; + result = CMPOP2; + break; + + case '*': + lval->op = mult; + result = MULOP2; + break; + + case '/': + lval->op = divide; + result = MULOP2; + break; + + case '%': + lval->op = module; + result = MULOP2; + break; + + case '+': + lval->op = plus; + result = ADDOP2; + break; + + case '-': + lval->op = minus; + result = ADDOP2; + break; + + case 'n': + case '?': + case ':': + case '(': + case ')': + /* Nothing, just return the character. */ + break; + + case ';': + case '\n': + case '\0': + /* Be safe and let the user call this function again. */ + --exp; + result = YYEOF; + break; + + default: + result = YYERRCODE; +#if YYDEBUG != 0 + --exp; +#endif + break; + } + + *pexp = exp; + + return result; +} + + +static void +yyerror (str) + const char *str; +{ + /* Do nothing. We don't print error messages here. */ +} diff --git a/intl/plural.y b/intl/plural.y new file mode 100644 index 0000000..be049a6 --- /dev/null +++ b/intl/plural.y @@ -0,0 +1,413 @@ +%{ +/* Expression parsing for plural form selection. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* The bison generated parser uses alloca. AIX 3 forces us to put this + declaration at the beginning of the file. The declaration in bison's + skeleton file comes too late. This must come before + because may include arbitrary system headers. */ +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "gettextP.h" + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define FREE_EXPRESSION __gettext_free_exp +#else +# define FREE_EXPRESSION gettext_free_exp__ +# define __gettextparse gettextparse__ +#endif + +#define YYLEX_PARAM &((struct parse_args *) arg)->cp +#define YYPARSE_PARAM arg +%} +%pure_parser +%expect 10 + +%union { + unsigned long int num; + enum operator op; + struct expression *exp; +} + +%{ +/* Prototypes for local functions. */ +static struct expression *new_exp PARAMS ((int nargs, enum operator op, + struct expression * const *args)); +static inline struct expression *new_exp_0 PARAMS ((enum operator op)); +static inline struct expression *new_exp_1 PARAMS ((enum operator op, + struct expression *right)); +static struct expression *new_exp_2 PARAMS ((enum operator op, + struct expression *left, + struct expression *right)); +static inline struct expression *new_exp_3 PARAMS ((enum operator op, + struct expression *bexp, + struct expression *tbranch, + struct expression *fbranch)); +static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); +static void yyerror PARAMS ((const char *str)); + +/* Allocation of expressions. */ + +static struct expression * +new_exp (nargs, op, args) + int nargs; + enum operator op; + struct expression * const *args; +{ + int i; + struct expression *newp; + + /* If any of the argument could not be malloc'ed, just return NULL. */ + for (i = nargs - 1; i >= 0; i--) + if (args[i] == NULL) + goto fail; + + /* Allocate a new expression. */ + newp = (struct expression *) malloc (sizeof (*newp)); + if (newp != NULL) + { + newp->nargs = nargs; + newp->operation = op; + for (i = nargs - 1; i >= 0; i--) + newp->val.args[i] = args[i]; + return newp; + } + + fail: + for (i = nargs - 1; i >= 0; i--) + FREE_EXPRESSION (args[i]); + + return NULL; +} + +static inline struct expression * +new_exp_0 (op) + enum operator op; +{ + return new_exp (0, op, NULL); +} + +static inline struct expression * +new_exp_1 (op, right) + enum operator op; + struct expression *right; +{ + struct expression *args[1]; + + args[0] = right; + return new_exp (1, op, args); +} + +static struct expression * +new_exp_2 (op, left, right) + enum operator op; + struct expression *left; + struct expression *right; +{ + struct expression *args[2]; + + args[0] = left; + args[1] = right; + return new_exp (2, op, args); +} + +static inline struct expression * +new_exp_3 (op, bexp, tbranch, fbranch) + enum operator op; + struct expression *bexp; + struct expression *tbranch; + struct expression *fbranch; +{ + struct expression *args[3]; + + args[0] = bexp; + args[1] = tbranch; + args[2] = fbranch; + return new_exp (3, op, args); +} + +%} + +/* This declares that all operators have the same associativity and the + precedence order as in C. See [Harbison, Steele: C, A Reference Manual]. + There is no unary minus and no bitwise operators. + Operators with the same syntactic behaviour have been merged into a single + token, to save space in the array generated by bison. */ +%right '?' /* ? */ +%left '|' /* || */ +%left '&' /* && */ +%left EQUOP2 /* == != */ +%left CMPOP2 /* < > <= >= */ +%left ADDOP2 /* + - */ +%left MULOP2 /* * / % */ +%right '!' /* ! */ + +%token EQUOP2 CMPOP2 ADDOP2 MULOP2 +%token NUMBER +%type exp + +%% + +start: exp + { + if ($1 == NULL) + YYABORT; + ((struct parse_args *) arg)->res = $1; + } + ; + +exp: exp '?' exp ':' exp + { + $$ = new_exp_3 (qmop, $1, $3, $5); + } + | exp '|' exp + { + $$ = new_exp_2 (lor, $1, $3); + } + | exp '&' exp + { + $$ = new_exp_2 (land, $1, $3); + } + | exp EQUOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp CMPOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp ADDOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp MULOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | '!' exp + { + $$ = new_exp_1 (lnot, $2); + } + | 'n' + { + $$ = new_exp_0 (var); + } + | NUMBER + { + if (($$ = new_exp_0 (num)) != NULL) + $$->val.num = $1; + } + | '(' exp ')' + { + $$ = $2; + } + ; + +%% + +void +internal_function +FREE_EXPRESSION (exp) + struct expression *exp; +{ + if (exp == NULL) + return; + + /* Handle the recursive case. */ + switch (exp->nargs) + { + case 3: + FREE_EXPRESSION (exp->val.args[2]); + /* FALLTHROUGH */ + case 2: + FREE_EXPRESSION (exp->val.args[1]); + /* FALLTHROUGH */ + case 1: + FREE_EXPRESSION (exp->val.args[0]); + /* FALLTHROUGH */ + default: + break; + } + + free (exp); +} + + +static int +yylex (lval, pexp) + YYSTYPE *lval; + const char **pexp; +{ + const char *exp = *pexp; + int result; + + while (1) + { + if (exp[0] == '\0') + { + *pexp = exp; + return YYEOF; + } + + if (exp[0] != ' ' && exp[0] != '\t') + break; + + ++exp; + } + + result = *exp++; + switch (result) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + unsigned long int n = result - '0'; + while (exp[0] >= '0' && exp[0] <= '9') + { + n *= 10; + n += exp[0] - '0'; + ++exp; + } + lval->num = n; + result = NUMBER; + } + break; + + case '=': + if (exp[0] == '=') + { + ++exp; + lval->op = equal; + result = EQUOP2; + } + else + result = YYERRCODE; + break; + + case '!': + if (exp[0] == '=') + { + ++exp; + lval->op = not_equal; + result = EQUOP2; + } + break; + + case '&': + case '|': + if (exp[0] == result) + ++exp; + else + result = YYERRCODE; + break; + + case '<': + if (exp[0] == '=') + { + ++exp; + lval->op = less_or_equal; + } + else + lval->op = less_than; + result = CMPOP2; + break; + + case '>': + if (exp[0] == '=') + { + ++exp; + lval->op = greater_or_equal; + } + else + lval->op = greater_than; + result = CMPOP2; + break; + + case '*': + lval->op = mult; + result = MULOP2; + break; + + case '/': + lval->op = divide; + result = MULOP2; + break; + + case '%': + lval->op = module; + result = MULOP2; + break; + + case '+': + lval->op = plus; + result = ADDOP2; + break; + + case '-': + lval->op = minus; + result = ADDOP2; + break; + + case 'n': + case '?': + case ':': + case '(': + case ')': + /* Nothing, just return the character. */ + break; + + case ';': + case '\n': + case '\0': + /* Be safe and let the user call this function again. */ + --exp; + result = YYEOF; + break; + + default: + result = YYERRCODE; +#if YYDEBUG != 0 + --exp; +#endif + break; + } + + *pexp = exp; + + return result; +} + + +static void +yyerror (str) + const char *str; +{ + /* Do nothing. We don't print error messages here. */ +} diff --git a/intl/ref-add.sin b/intl/ref-add.sin new file mode 100644 index 0000000..167374e --- /dev/null +++ b/intl/ref-add.sin @@ -0,0 +1,31 @@ +# Add this package to a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + ta + :a + s/ @PACKAGE@ / @PACKAGE@ / + tb + s/ $/ @PACKAGE@ / + :b + s/^/# Packages using this file:/ +} diff --git a/intl/ref-del.sin b/intl/ref-del.sin new file mode 100644 index 0000000..613cf37 --- /dev/null +++ b/intl/ref-del.sin @@ -0,0 +1,26 @@ +# Remove this package from a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + s/ @PACKAGE@ / / + s/^/# Packages using this file:/ +} diff --git a/intl/textdomain.c b/intl/textdomain.c new file mode 100644 index 0000000..2e420ad --- /dev/null +++ b/intl/textdomain.c @@ -0,0 +1,142 @@ +/* Implementation of the textdomain(3) function. + Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "gettextP.h" + +#ifdef _LIBC +/* We have to handle multi-threaded applications. */ +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_rwlock_define(CLASS, NAME) +# define __libc_rwlock_wrlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_default_domain _nl_default_default_domain__ +# define _nl_current_default_domain _nl_current_default_domain__ +#endif + +/* @@ end of prolog @@ */ + +/* Name of the default text domain. */ +extern const char _nl_default_default_domain[]; + +/* Default text domain in which entries for gettext(3) are to be found. */ +extern const char *_nl_current_default_domain; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define TEXTDOMAIN __textdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define TEXTDOMAIN textdomain__ +#endif + +/* Lock variable to protect the global data in the gettext implementation. */ +__libc_rwlock_define (extern, _nl_state_lock) + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +char * +TEXTDOMAIN (domainname) + const char *domainname; +{ + char *new_domain; + char *old_domain; + + /* A NULL pointer requests the current setting. */ + if (domainname == NULL) + return (char *) _nl_current_default_domain; + + __libc_rwlock_wrlock (_nl_state_lock); + + old_domain = (char *) _nl_current_default_domain; + + /* If domain name is the null string set to default domain "messages". */ + if (domainname[0] == '\0' + || strcmp (domainname, _nl_default_default_domain) == 0) + { + _nl_current_default_domain = _nl_default_default_domain; + new_domain = (char *) _nl_current_default_domain; + } + else if (strcmp (domainname, old_domain) == 0) + /* This can happen and people will use it to signal that some + environment variable changed. */ + new_domain = old_domain; + else + { + /* If the following malloc fails `_nl_current_default_domain' + will be NULL. This value will be returned and so signals we + are out of core. */ +#if defined _LIBC || defined HAVE_STRDUP + new_domain = strdup (domainname); +#else + size_t len = strlen (domainname) + 1; + new_domain = (char *) malloc (len); + if (new_domain != NULL) + memcpy (new_domain, domainname, len); +#endif + + if (new_domain != NULL) + _nl_current_default_domain = new_domain; + } + + /* We use this possibility to signal a change of the loaded catalogs + since this is most likely the case and there is no other easy we + to do it. Do it only when the call was successful. */ + if (new_domain != NULL) + { + ++_nl_msg_cat_cntr; + + if (old_domain != new_domain && old_domain != _nl_default_default_domain) + free (old_domain); + } + + __libc_rwlock_unlock (_nl_state_lock); + + return new_domain; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__textdomain, textdomain); +#endif diff --git a/macros/Makefile.am b/macros/Makefile.am new file mode 100644 index 0000000..2b7b6eb --- /dev/null +++ b/macros/Makefile.am @@ -0,0 +1,41 @@ +## Please update this variable if any new macros are created + +MACROS= \ + aclocal-include.m4 \ + compiler-flags.m4 \ + curses.m4 \ + gnome-bonobo-check.m4 \ + gnome-fileutils.m4 \ + gnome-ghttp-check.m4 \ + gnome-gnorba-check.m4 \ + gnome-guile-checks.m4 \ + gnome-libgtop-check.m4 \ + gnome-objc-checks.m4 \ + gnome-orbit-check.m4 \ + gnome-print-check.m4 \ + gnome-pthread-check.m4 \ + gnome-support.m4 \ + gnome-undelfs.m4 \ + gnome-vfs.m4 \ + gnome-x-checks.m4 \ + gnome-xml-check.m4 \ + gnome.m4 \ + gperf-check.m4 \ + linger.m4 \ + need-declaration.m4 + +EXTRA_DIST=$(MACROS) gnome-common.m4 autogen.sh +MAINTAINERCLEANFILES=macros.dep + +@MAINT@macros.dep: Makefile.am +@MAINT@ @echo '$$(top_srcdir)/aclocal.m4: $(MACROS:%=macros/%)' > $@ + +if INSIDE_GNOME_COMMON +gnome_aclocaldir = $(datadir)/aclocal/gnome + +gnome-macros.dep: Makefile.am + @echo '$$(top_srcdir)/aclocal.m4: $(MACROS:%=$(gnome_aclocaldir)/%)' > $@ + +gnome_aclocal_DATA = $(MACROS) gnome-macros.dep gnome-common.m4 autogen.sh + +endif diff --git a/macros/Makefile.in b/macros/Makefile.in new file mode 100644 index 0000000..a139310 --- /dev/null +++ b/macros/Makefile.in @@ -0,0 +1,256 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +DATADIRNAME = @DATADIRNAME@ +DEBUG = @DEBUG@ +DEMO = @DEMO@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@ +GNOMEUI_LIBS = @GNOMEUI_LIBS@ +GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@ +GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@ +GNOME_CONFIG = @GNOME_CONFIG@ +GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@ +GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@ +GNOME_LIBDIR = @GNOME_LIBDIR@ +GNOME_LIBS = @GNOME_LIBS@ +GNORBA_CFLAGS = @GNORBA_CFLAGS@ +GNORBA_LIBS = @GNORBA_LIBS@ +GTKXMHTML_LIBS = @GTKXMHTML_LIBS@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIBICONV = @LIBICONV@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +ORBIT_CFLAGS = @ORBIT_CFLAGS@ +ORBIT_CONFIG = @ORBIT_CONFIG@ +ORBIT_IDL = @ORBIT_IDL@ +ORBIT_LIBS = @ORBIT_LIBS@ +OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ +OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ +PACKAGE = @PACKAGE@ +PACKAGE_PIXMAPS_DIR = @PACKAGE_PIXMAPS_DIR@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PTHREAD_LIB = @PTHREAD_LIB@ +RANLIB = @RANLIB@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XPM_LIBS = @XPM_LIBS@ +ZVT_LIBS = @ZVT_LIBS@ +cflags_set = @cflags_set@ +cxxflags_set = @cxxflags_set@ + +MACROS = aclocal-include.m4 compiler-flags.m4 curses.m4 gnome-bonobo-check.m4 gnome-fileutils.m4 gnome-ghttp-check.m4 gnome-gnorba-check.m4 gnome-guile-checks.m4 gnome-libgtop-check.m4 gnome-objc-checks.m4 gnome-orbit-check.m4 gnome-print-check.m4 gnome-pthread-check.m4 gnome-support.m4 gnome-undelfs.m4 gnome-vfs.m4 gnome-x-checks.m4 gnome-xml-check.m4 gnome.m4 gperf-check.m4 linger.m4 need-declaration.m4 + + +EXTRA_DIST = $(MACROS) gnome-common.m4 autogen.sh +MAINTAINERCLEANFILES = macros.dep + +@INSIDE_GNOME_COMMON_TRUE@gnome_aclocaldir = $(datadir)/aclocal/gnome + +@INSIDE_GNOME_COMMON_TRUE@gnome_aclocal_DATA = $(MACROS) gnome-macros.dep gnome-common.m4 autogen.sh +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +DATA = $(gnome_aclocal_DATA) + +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps macros/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-gnome_aclocalDATA: $(gnome_aclocal_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(gnome_aclocaldir) + @list='$(gnome_aclocal_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(gnome_aclocaldir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(gnome_aclocaldir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(gnome_aclocaldir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(gnome_aclocaldir)/$$p; \ + fi; fi; \ + done + +uninstall-gnome_aclocalDATA: + @$(NORMAL_UNINSTALL) + list='$(gnome_aclocal_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(gnome_aclocaldir)/$$p; \ + done +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = macros + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-gnome_aclocalDATA +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-gnome_aclocalDATA +uninstall: uninstall-am +all-am: Makefile $(DATA) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(gnome_aclocaldir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: uninstall-gnome_aclocalDATA install-gnome_aclocalDATA tags \ +distdir info-am info dvi-am dvi check check-am installcheck-am \ +installcheck install-exec-am install-exec install-data-am install-data \ +install-am install uninstall-am uninstall all-redirect all-am all \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +macros.dep: Makefile.am + @echo '$$(top_srcdir)/aclocal.m4: $(MACROS:%=macros/%)' > $@ + +@INSIDE_GNOME_COMMON_TRUE@gnome-macros.dep: Makefile.am +@INSIDE_GNOME_COMMON_TRUE@ @echo '$$(top_srcdir)/aclocal.m4: $(MACROS:%=$(gnome_aclocaldir)/%)' > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/macros/aclocal-include.m4 b/macros/aclocal-include.m4 new file mode 100644 index 0000000..abf6533 --- /dev/null +++ b/macros/aclocal-include.m4 @@ -0,0 +1,16 @@ +# aclocal-include.m4 +# +# This macro adds the name macrodir to the set of directories +# that `aclocal' searches for macros. + +# serial 1 + +dnl AM_ACLOCAL_INCLUDE(macrodir) +AC_DEFUN([AM_ACLOCAL_INCLUDE], +[ + AM_CONDITIONAL(INSIDE_GNOME_COMMON, test x = y) + + test -n "$ACLOCAL_FLAGS" && ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS" + + for k in $1 ; do ACLOCAL="$ACLOCAL -I $k" ; done +]) diff --git a/macros/autogen.sh b/macros/autogen.sh new file mode 100644 index 0000000..18cfd60 --- /dev/null +++ b/macros/autogen.sh @@ -0,0 +1,169 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +DIE=0 + +if [ -n "$GNOME2_PATH" ]; then + ACLOCAL_FLAGS="-I $GNOME2_PATH/share/aclocal $ACLOCAL_FLAGS" + PATH="$GNOME2_PATH/bin:$PATH" + export PATH +fi + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed to compile Gnome." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && { + (libtool --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`libtool' installed to compile Gnome." + echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed to compile Gnome." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed to compile Gnome." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`automake' installed to compile Gnome." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + NO_AUTOMAKE=yes +} + + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + +for coin in `find $srcdir -name configure.in -print` +do + dr=`dirname $coin` + if test -f $dr/NO-AUTO-GEN; then + echo skipping $dr -- flagged as no auto-gen + else + echo processing $dr + macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` + ( cd $dr + macrosdir=`find . -name macros -print` + for i in $macrodirs; do + if test -f $i/gnome-gettext.m4; then + DELETEFILES="$DELETEFILES $i/gnome-gettext.m4" + fi + done + + echo "deletefiles is $DELETEFILES" + aclocalinclude="$ACLOCAL_FLAGS" + for k in $aclocalinclude; do + if test -d $k; then + if [ -f $k/gnome.m4 -a "$GNOME_INTERFACE_VERSION" = "1" ]; then + rm -f $DELETEFILES + fi + fi + done + for k in $macrodirs; do + if test -d $k; then + aclocalinclude="$aclocalinclude -I $k" + if [ -f $k/gnome.m4 -a "$GNOME_INTERFACE_VERSION" = "1" ]; then + rm -f $DELETEFILES + fi + fi + done + if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then + if grep "sed.*POTFILES" configure.in >/dev/null; then + : do nothing -- we still have an old unmodified configure.in + else + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running gettextize... Ignore non-fatal messages." + echo "no" | gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + fi + if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running gettextize... Ignore non-fatal messages." + echo "no" | gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then + if test -z "$NO_LIBTOOLIZE" ; then + echo "Running libtoolize..." + libtoolize --force --copy + fi + fi + echo "Running aclocal $aclocalinclude ..." + aclocal $aclocalinclude + if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then + echo "Running autoheader..." + autoheader + fi + echo "Running automake --gnu $am_opt ..." + automake --add-missing --gnu $am_opt + echo "Running autoconf ..." + autoconf + ) + fi +done + +conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME || exit 1 +else + echo Skipping configure process. +fi diff --git a/macros/compiler-flags.m4 b/macros/compiler-flags.m4 new file mode 100644 index 0000000..63f8e2e --- /dev/null +++ b/macros/compiler-flags.m4 @@ -0,0 +1,109 @@ +dnl GNOME_COMPILE_WARNINGS +dnl Turn on many useful compiler warnings +dnl For now, only works on GCC +AC_DEFUN([GNOME_COMPILE_WARNINGS],[ + AC_ARG_ENABLE(compile-warnings, + [ --enable-compile-warnings=[no/minimum/yes] Turn on compiler warnings.],,enable_compile_warnings=minimum) + + AC_MSG_CHECKING(what warning flags to pass to the C compiler) + warnCFLAGS= + if test "x$GCC" != xyes; then + enable_compile_warnings=no + fi + + if test "x$enable_compile_warnings" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) warnCFLAGS="-Wall -Wunused" ;; + esac + + ## -W is not all that useful. And it cannot be controlled + ## with individual -Wno-xxx flags, unlike -Wall + if test "x$enable_compile_warnings" = "xyes"; then + warnCFLAGS="$warnCFLAGS -Wmissing-prototypes -Wmissing-declarations" + fi + fi + fi + AC_MSG_RESULT($warnCFLAGS) + + AC_ARG_ENABLE(iso-c, + [ --enable-iso-c Try to warn if code is not ISO C ],, + enable_iso_c=no) + + AC_MSG_CHECKING(what language compliance flags to pass to the C compiler) + complCFLAGS= + if test "x$enable_iso_c" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-ansi[\ \ ]*) ;; + *) complCFLAGS="$complCFLAGS -ansi" ;; + esac + + case " $CFLAGS " in + *[\ \ ]-pedantic[\ \ ]*) ;; + *) complCFLAGS="$complCFLAGS -pedantic" ;; + esac + fi + fi + AC_MSG_RESULT($complCFLAGS) + if test "x$cflags_set" != "xyes"; then + CFLAGS="$CFLAGS $warnCFLAGS $complCFLAGS" + cflags_set=yes + AC_SUBST(cflags_set) + fi +]) + +dnl For C++, do basically the same thing. + +AC_DEFUN([GNOME_CXX_WARNINGS],[ + AC_ARG_ENABLE(cxx-warnings, + [ --enable-cxx-warnings=[no/minimum/yes] Turn on compiler warnings.],,enable_cxx_warnings=minimum) + + AC_MSG_CHECKING(what warning flags to pass to the C++ compiler) + warnCXXFLAGS= + if test "x$GCC" != xyes; then + enable_compile_warnings=no + fi + if test "x$enable_cxx_warnings" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CXXFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) warnCXXFLAGS="-Wall -Wno-unused" ;; + esac + + ## -W is not all that useful. And it cannot be controlled + ## with individual -Wno-xxx flags, unlike -Wall + if test "x$enable_cxx_warnings" = "xyes"; then + warnCXXFLAGS="$warnCXXFLAGS -Wmissing-prototypes -Wmissing-declarations -Wshadow -Woverloaded-virtual" + fi + fi + fi + AC_MSG_RESULT($warnCXXFLAGS) + + AC_ARG_ENABLE(iso-cxx, + [ --enable-iso-cxx Try to warn if code is not ISO C++ ],, + enable_iso_cxx=no) + + AC_MSG_CHECKING(what language compliance flags to pass to the C++ compiler) + complCXXFLAGS= + if test "x$enable_iso_cxx" != "xno"; then + if test "x$GCC" = "xyes"; then + case " $CXXFLAGS " in + *[\ \ ]-ansi[\ \ ]*) ;; + *) complCXXFLAGS="$complCXXFLAGS -ansi" ;; + esac + + case " $CXXFLAGS " in + *[\ \ ]-pedantic[\ \ ]*) ;; + *) complCXXFLAGS="$complCXXFLAGS -pedantic" ;; + esac + fi + fi + AC_MSG_RESULT($complCXXFLAGS) + if test "x$cxxflags_set" != "xyes"; then + CXXFLAGS="$CXXFLAGS $warnCXXFLAGS $complCXXFLAGS" + cxxflags_set=yes + AC_SUBST(cxxflags_set) + fi +]) diff --git a/macros/curses.m4 b/macros/curses.m4 new file mode 100644 index 0000000..3dd4ffa --- /dev/null +++ b/macros/curses.m4 @@ -0,0 +1,318 @@ +dnl Curses detection: Munged from Midnight Commander's configure.in +dnl +dnl What it does: +dnl ============= +dnl +dnl - Determine which version of curses is installed on your system +dnl and set the -I/-L/-l compiler entries and add a few preprocessor +dnl symbols +dnl - Do an AC_SUBST on the CURSES_INCLUDEDIR and CURSES_LIBS so that +dnl @CURSES_INCLUDEDIR@ and @CURSES_LIBS@ will be available in +dnl Makefile.in's +dnl - Modify the following configure variables (these are the only +dnl curses.m4 variables you can access from within configure.in) +dnl CURSES_INCLUDEDIR - contains -I's and possibly -DRENAMED_CURSES if +dnl an ncurses.h that's been renamed to curses.h +dnl is found. +dnl CURSES_LIBS - sets -L and -l's appropriately +dnl CFLAGS - if --with-sco, add -D_SVID3 +dnl has_curses - exports result of tests to rest of configure +dnl +dnl Usage: +dnl ====== +dnl 1) Add lines indicated below to acconfig.h +dnl 2) call AC_CHECK_CURSES after AC_PROG_CC in your configure.in +dnl 3) Instead of #include you should use the following to +dnl properly locate ncurses or curses header file +dnl +dnl #if defined(USE_NCURSES) && !defined(RENAMED_NCURSES) +dnl #include +dnl #else +dnl #include +dnl #endif +dnl +dnl 4) Make sure to add @CURSES_INCLUDEDIR@ to your preprocessor flags +dnl 5) Make sure to add @CURSES_LIBS@ to your linker flags or LIBS +dnl +dnl Notes with automake: +dnl - call AM_CONDITIONAL(HAS_CURSES, test "$has_curses" = true) from +dnl configure.in +dnl - your Makefile.am can look something like this +dnl ----------------------------------------------- +dnl INCLUDES= blah blah blah $(CURSES_INCLUDEDIR) +dnl if HAS_CURSES +dnl CURSES_TARGETS=name_of_curses_prog +dnl endif +dnl bin_PROGRAMS = other_programs $(CURSES_TARGETS) +dnl other_programs_SOURCES = blah blah blah +dnl name_of_curses_prog_SOURCES = blah blah blah +dnl other_programs_LDADD = blah +dnl name_of_curses_prog_LDADD = blah $(CURSES_LIBS) +dnl ----------------------------------------------- +dnl +dnl +dnl The following lines should be added to acconfig.h: +dnl ================================================== +dnl +dnl /*=== Curses version detection defines ===*/ +dnl /* Found some version of curses that we're going to use */ +dnl #undef HAS_CURSES +dnl +dnl /* Use SunOS SysV curses? */ +dnl #undef USE_SUNOS_CURSES +dnl +dnl /* Use old BSD curses - not used right now */ +dnl #undef USE_BSD_CURSES +dnl +dnl /* Use SystemV curses? */ +dnl #undef USE_SYSV_CURSES +dnl +dnl /* Use Ncurses? */ +dnl #undef USE_NCURSES +dnl +dnl /* If you Curses does not have color define this one */ +dnl #undef NO_COLOR_CURSES +dnl +dnl /* Define if you want to turn on SCO-specific code */ +dnl #undef SCO_FLAVOR +dnl +dnl /* Set to reflect version of ncurses * +dnl * 0 = version 1.* +dnl * 1 = version 1.9.9g +dnl * 2 = version 4.0/4.1 */ +dnl #undef NCURSES_970530 +dnl +dnl /*=== End new stuff for acconfig.h ===*/ +dnl + + +AC_DEFUN(AC_CHECK_CURSES,[ + search_ncurses=true + screen_manager="" + has_curses=false + + CFLAGS=${CFLAGS--O} + + AC_SUBST(CURSES_LIBS) + AC_SUBST(CURSES_INCLUDEDIR) + + AC_ARG_WITH(sco, + [ --with-sco Use this to turn on SCO-specific code],[ + if test x$withval = xyes; then + AC_DEFINE(SCO_FLAVOR) + CFLAGS="$CFLAGS -D_SVID3" + fi + ]) + + AC_ARG_WITH(sunos-curses, + [ --with-sunos-curses Used to force SunOS 4.x curses],[ + if test x$withval = xyes; then + AC_USE_SUNOS_CURSES + fi + ]) + + AC_ARG_WITH(osf1-curses, + [ --with-osf1-curses Used to force OSF/1 curses],[ + if test x$withval = xyes; then + AC_USE_OSF1_CURSES + fi + ]) + + AC_ARG_WITH(vcurses, + [ --with-vcurses[=incdir] Used to force SysV curses], + if test x$withval != xyes; then + CURSES_INCLUDEDIR="-I$withval" + fi + AC_USE_SYSV_CURSES + ) + + AC_ARG_WITH(ncurses, + [ --with-ncurses[=dir] Compile with ncurses/locate base dir], + if test x$withval = xno ; then + search_ncurses=false + elif test x$withval != xyes ; then + CURSES_LIBS="$LIBS -L$withval/lib -lncurses" + CURSES_INCLUDEDIR="-I$withval/include" + search_ncurses=false + screen_manager="ncurses" + AC_DEFINE(USE_NCURSES) + AC_DEFINE(HAS_CURSES) + has_curses=true + fi + ) + + if $search_ncurses + then + AC_SEARCH_NCURSES() + fi + + +]) + + +AC_DEFUN(AC_USE_SUNOS_CURSES, [ + search_ncurses=false + screen_manager="SunOS 4.x /usr/5include curses" + AC_MSG_RESULT(Using SunOS 4.x /usr/5include curses) + AC_DEFINE(USE_SUNOS_CURSES) + AC_DEFINE(HAS_CURSES) + has_curses=true + AC_DEFINE(NO_COLOR_CURSES) + AC_DEFINE(USE_SYSV_CURSES) + CURSES_INCLUDEDIR="-I/usr/5include" + CURSES_LIBS="/usr/5lib/libcurses.a /usr/5lib/libtermcap.a" + AC_MSG_RESULT(Please note that some screen refreshs may fail) +]) + +AC_DEFUN(AC_USE_OSF1_CURSES, [ + AC_MSG_RESULT(Using OSF1 curses) + search_ncurses=false + screen_manager="OSF1 curses" + AC_DEFINE(HAS_CURSES) + has_curses=true + AC_DEFINE(NO_COLOR_CURSES) + AC_DEFINE(USE_SYSV_CURSES) + CURSES_LIBS="-lcurses" +]) + +AC_DEFUN(AC_USE_SYSV_CURSES, [ + AC_MSG_RESULT(Using SysV curses) + AC_DEFINE(HAS_CURSES) + has_curses=true + AC_DEFINE(USE_SYSV_CURSES) + search_ncurses=false + screen_manager="SysV/curses" + CURSES_LIBS="-lcurses" +]) + +dnl AC_ARG_WITH(bsd-curses, +dnl [--with-bsd-curses Used to compile with bsd curses, not very fancy], +dnl search_ncurses=false +dnl screen_manager="Ultrix/cursesX" +dnl if test $system = ULTRIX +dnl then +dnl THIS_CURSES=cursesX +dnl else +dnl THIS_CURSES=curses +dnl fi +dnl +dnl CURSES_LIBS="-l$THIS_CURSES -ltermcap" +dnl AC_DEFINE(HAS_CURSES) +dnl has_curses=true +dnl AC_DEFINE(USE_BSD_CURSES) +dnl AC_MSG_RESULT(Please note that some screen refreshs may fail) +dnl AC_WARN(Use of the bsdcurses extension has some) +dnl AC_WARN(display/input problems.) +dnl AC_WARN(Reconsider using xcurses) +dnl) + + +dnl +dnl Parameters: directory filename cureses_LIBS curses_INCLUDEDIR nicename +dnl +AC_DEFUN(AC_NCURSES, [ + if $search_ncurses + then + if test -f $1/$2 + then + AC_MSG_RESULT(Found ncurses on $1/$2) + CURSES_LIBS="$3" + CURSES_INCLUDEDIR="$4" + search_ncurses=false + screen_manager=$5 + AC_DEFINE(HAS_CURSES) + has_curses=true + AC_DEFINE(USE_NCURSES) + fi + fi +]) + +AC_DEFUN(AC_SEARCH_NCURSES, [ + AC_CHECKING("location of ncurses.h file") + + AC_NCURSES(/usr/include, ncurses.h, -lncurses,, "ncurses on /usr/include") + AC_NCURSES(/usr/include/ncurses, ncurses.h, -lncurses, -I/usr/include/ncurses, "ncurses on /usr/include/ncurses") + AC_NCURSES(/usr/local/include, ncurses.h, -L/usr/local/lib -lncurses, -I/usr/local/include, "ncurses on /usr/local") + AC_NCURSES(/usr/local/include/ncurses, ncurses.h, -L/usr/local/lib -L/usr/local/lib/ncurses -lncurses, -I/usr/local/include/ncurses, "ncurses on /usr/local/include/ncurses") + + AC_NCURSES(/usr/local/include/ncurses, curses.h, -L/usr/local/lib -lncurses, -I/usr/local/include/ncurses -DRENAMED_NCURSES, "renamed ncurses on /usr/local/.../ncurses") + + AC_NCURSES(/usr/include/ncurses, curses.h, -lncurses, -I/usr/include/ncurses -DRENAMED_NCURSES, "renamed ncurses on /usr/include/ncurses") + + dnl + dnl We couldn't find ncurses, try SysV curses + dnl + if $search_ncurses + then + AC_EGREP_HEADER(init_color, /usr/include/curses.h, + AC_USE_SYSV_CURSES) + AC_EGREP_CPP(USE_NCURSES,[ +#include +#ifdef __NCURSES_H +#undef USE_NCURSES +USE_NCURSES +#endif +],[ + CURSES_INCLUDEDIR="$CURSES_INCLUDEDIR -DRENAMED_NCURSES" + AC_DEFINE(HAS_CURSES) + has_curses=true + AC_DEFINE(USE_NCURSES) + search_ncurses=false + screen_manager="ncurses installed as curses" +]) + fi + + dnl + dnl Try SunOS 4.x /usr/5{lib,include} ncurses + dnl The flags USE_SUNOS_CURSES, USE_BSD_CURSES and BUGGY_CURSES + dnl should be replaced by a more fine grained selection routine + dnl + if $search_ncurses + then + if test -f /usr/5include/curses.h + then + AC_USE_SUNOS_CURSES + fi + else + # check for ncurses version, to properly ifdef mouse-fix + AC_MSG_CHECKING(for ncurses version) + ncurses_version=unknown +cat > conftest.$ac_ext < +#else +#include +#endif +#undef VERSION +VERSION:NCURSES_VERSION +EOF + if (eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | + egrep "VERSION:" >conftest.out 2>&1; then +changequote(,)dnl + ncurses_version=`cat conftest.out|sed -e 's/^[^"]*"//' -e 's/".*//'` +changequote([,])dnl + fi + rm -rf conftest* + AC_MSG_RESULT($ncurses_version) + case "$ncurses_version" in +changequote(,)dnl + 4.[01]) +changequote([,])dnl + AC_DEFINE(NCURSES_970530,2) + ;; + 1.9.9g) + AC_DEFINE(NCURSES_970530,1) + ;; + 1*) + AC_DEFINE(NCURSES_970530,0) + ;; + esac + fi +]) + + + + + diff --git a/macros/gnome-bonobo-check.m4 b/macros/gnome-bonobo-check.m4 new file mode 100644 index 0000000..7eb2b26 --- /dev/null +++ b/macros/gnome-bonobo-check.m4 @@ -0,0 +1,150 @@ +# Configure paths for Bonobo +# Miguel de Icaza, 99-04-12 +# Stolen from Chris Lahey 99-2-5 +# stolen from Manish Singh again +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_BONOBO ([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for Bonobo, and define BONOBO_CFLAGS and BONOBO_LIBS +dnl +AC_DEFUN([AM_PATH_BONOBO], +[ +dnl +dnl Get the cflags and libraries from the gnome-config script +dnl +AC_ARG_WITH(bonobo-prefix,[ --with-bonobo-prefix=PFX Prefix where Bonobo is installed (optional)], + bonobo_prefix="$withval", bonobo_prefix="") +AC_ARG_WITH(bonobo-exec-prefix,[ --with-bonobo-exec-prefix=PFX Exec prefix where Bonobo is installed (optional)], + bonobo_exec_prefix="$withval", bonobo_exec_prefix="") +AC_ARG_ENABLE(bonobotest, [ --disable-bonobotest Do not try to compile and run a test Bonobo program], + , enable_bonobotest=yes) + + if test x$bonobo_exec_prefix != x ; then + bonobo_args="$bonobo_args --exec-prefix=$bonobo_exec_prefix" + if test x${GNOME_CONFIG+set} != xset ; then + GNOME_CONFIG=$bonobo_exec_prefix/bin/gnome-config + fi + fi + if test x$bonobo_prefix != x ; then + bonobo_args="$bonobo_args --prefix=$bonobo_prefix" + if test x${GNOME_CONFIG+set} != xset ; then + GNOME_CONFIG=$bonobo_prefix/bin/gnome-config + fi + fi + + AC_PATH_PROG(GNOME_CONFIG, gnome-config, no) + min_bonobo_version=ifelse([$1], ,0.1.0,$1) + AC_MSG_CHECKING(for BONOBO - version >= $min_bonobo_version) + no_bonobo="" + if test "$GNOME_CONFIG" = "no" ; then + no_bonobo=yes + else + BONOBO_CFLAGS=`$GNOME_CONFIG $bonoboconf_args --cflags bonobo` + BONOBO_LIBS=`$GNOME_CONFIG $bonoboconf_args --libs bonobo` + + bonobo_major_version=`$GNOME_CONFIG $bonobo_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + bonobo_minor_version=`$GNOME_CONFIG $bonobo_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + bonobo_micro_version=`$GNOME_CONFIG $bonobo_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_bonobotest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $BONOBO_CFLAGS" + LIBS="$LIBS $BONOBO_LIBS" +dnl +dnl Now check if the installed BONOBO is sufficiently new. (Also sanity +dnl checks the results of gnome-config to some extent +dnl + rm -f conf.bonobotest + AC_TRY_RUN([ +#include +#include +#include +#include + +static char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.bonobotest"); + bonobo_object_get_type (); + return 0; +} + +],, no_bonobo=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_bonobo" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GNOME_CONFIG" = "no" ; then + echo "*** The gnome-config script installed by GNOME-LIBS could not be found" + echo "*** If BONOBO was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GNOME_CONFIG environment variable to the" + echo "*** full path to gnome-config." + else + if test -f conf.bonobotest ; then + : + else + echo "*** Could not run BONOBO test program, checking why..." + CFLAGS="$CFLAGS $BONOBO_CFLAGS" + LIBS="$LIBS $BONOBO_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding BONOBO or finding the wrong" + echo "*** version of BONOBO. If it is not finding BONOBO, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means BONOBO was incorrectly installed" + echo "*** or that you have moved BONOBO since it was installed. In the latter case, you" + echo "*** may want to edit the gnome-config script: $GNOME_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + BONOBO_CFLAGS="" + BONOBO_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(BONOBO_CFLAGS) + AC_SUBST(BONOBO_LIBS) + rm -f conf.bonobotest +]) + +AC_DEFUN([BONOBO_CHECK], [ + AM_PATH_BONOBO(0.1.0,,[AC_MSG_ERROR(BONOBO not found)]) +]) + diff --git a/macros/gnome-common.m4 b/macros/gnome-common.m4 new file mode 100644 index 0000000..b723829 --- /dev/null +++ b/macros/gnome-common.m4 @@ -0,0 +1,14 @@ +# gnome-common.m4 +# +# This only for packages that are not in the GNOME CVS tree. + +dnl GNOME_COMMON_INIT + +AC_DEFUN([GNOME_COMMON_INIT], +[ + GNOME_ACLOCAL_DIR=`$ACLOCAL --print-ac-dir`/gnome + AC_SUBST(GNOME_ACLOCAL_DIR) + + ACLOCAL="$ACLOCAL -I $GNOME_ACLOCAL_DIR" +]) + diff --git a/macros/gnome-fileutils.m4 b/macros/gnome-fileutils.m4 new file mode 100644 index 0000000..7c11a78 --- /dev/null +++ b/macros/gnome-fileutils.m4 @@ -0,0 +1,414 @@ +dnl +dnl GNOME_FILEUTILS_CHECKS +dnl +dnl checks that are needed for the diskusage applet. +dnl + +AC_DEFUN([GNOME_FILEUTILS_CHECKS], +[ +AC_CHECK_HEADERS(fcntl.h sys/param.h sys/statfs.h sys/fstyp.h \ +mnttab.h mntent.h sys/statvfs.h sys/vfs.h sys/mount.h \ +sys/filsys.h sys/fs_types.h sys/fs/s5param.h) + +AC_CHECK_FUNCS(bcopy endgrent endpwent fchdir ftime ftruncate \ +getcwd getmntinfo gettimeofday isascii lchown \ +listmntent memcpy mkfifo strchr strerror strrchr vprintf) + +dnl Set some defaults when cross-compiling + +if test x$cross_compiling = xyes ; then + case "$host_os" in + linux*) + fu_cv_sys_mounted_getmntent1=yes + fu_cv_sys_stat_statfs2_bsize=yes + ;; + sunos*) + fu_cv_sys_stat_statfs4=yes + ;; + freebsd*) + fu_cv_sys_stat_statfs2_bsize=yes + ;; + osf*) + fu_cv_sys_stat_statfs3_osf1=yes + ;; + esac +fi + +# Determine how to get the list of mounted filesystems. +list_mounted_fs= + +# If the getmntent function is available but not in the standard library, +# make sure LIBS contains -lsun (on Irix4) or -lseq (on PTX). +AC_FUNC_GETMNTENT + +# This test must precede the ones for getmntent because Unicos-9 is +# reported to have the getmntent function, but its support is incompatible +# with other getmntent implementations. + +# NOTE: Normally, I wouldn't use a check for system type as I've done for +# `CRAY' below since that goes against the whole autoconf philosophy. But +# I think there is too great a chance that some non-Cray system has a +# function named listmntent to risk the false positive. + +if test -z "$list_mounted_fs"; then +# Cray UNICOS 9 +AC_MSG_CHECKING([for listmntent of Cray/Unicos-9]) +AC_CACHE_VAL(fu_cv_sys_mounted_cray_listmntent, +[fu_cv_sys_mounted_cray_listmntent=no +AC_EGREP_CPP(yes, +[#ifdef _CRAY +yes +#endif +], [test $ac_cv_func_listmntent = yes \ +&& fu_cv_sys_mounted_cray_listmntent=yes] +) +] +) +AC_MSG_RESULT($fu_cv_sys_mounted_cray_listmntent) +if test $fu_cv_sys_mounted_cray_listmntent = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_LISTMNTENT) +fi +fi + +if test $ac_cv_func_getmntent = yes; then + +# This system has the getmntent function. +# Determine whether it's the one-argument variant or the two-argument one. + +if test -z "$list_mounted_fs"; then +# 4.3BSD, SunOS, HP-UX, Dynix, Irix +AC_MSG_CHECKING([for one-argument getmntent function]) +AC_CACHE_VAL(fu_cv_sys_mounted_getmntent1, +[test $ac_cv_header_mntent_h = yes \ +&& fu_cv_sys_mounted_getmntent1=yes \ +|| fu_cv_sys_mounted_getmntent1=no]) +AC_MSG_RESULT($fu_cv_sys_mounted_getmntent1) +if test $fu_cv_sys_mounted_getmntent1 = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_GETMNTENT1) +fi +fi + +if test -z "$list_mounted_fs"; then +# SVR4 +AC_MSG_CHECKING([for two-argument getmntent function]) +AC_CACHE_VAL(fu_cv_sys_mounted_getmntent2, +[AC_EGREP_HEADER(getmntent, sys/mnttab.h, +fu_cv_sys_mounted_getmntent2=yes, +fu_cv_sys_mounted_getmntent2=no)]) +AC_MSG_RESULT($fu_cv_sys_mounted_getmntent2) +if test $fu_cv_sys_mounted_getmntent2 = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_GETMNTENT2) +fi +fi + +if test -z "$list_mounted_fs"; then +AC_MSG_ERROR([could not determine how to read list of mounted filesystems]) +fi + +fi + +if test -z "$list_mounted_fs"; then +# DEC Alpha running OSF/1. +AC_MSG_CHECKING([for getfsstat function]) +AC_CACHE_VAL(fu_cv_sys_mounted_getsstat, +[AC_TRY_LINK([ +#include +#include +#include ], +[struct statfs *stats; +int numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT); ], +fu_cv_sys_mounted_getsstat=yes, +fu_cv_sys_mounted_getsstat=no)]) +AC_MSG_RESULT($fu_cv_sys_mounted_getsstat) +if test $fu_cv_sys_mounted_getsstat = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_GETFSSTAT) +fi +fi + +if test -z "$list_mounted_fs"; then +# AIX. +AC_MSG_CHECKING([for mntctl function and struct vmount]) +AC_CACHE_VAL(fu_cv_sys_mounted_vmount, +[AC_TRY_CPP([#include ], +fu_cv_sys_mounted_vmount=yes, +fu_cv_sys_mounted_vmount=no)]) +AC_MSG_RESULT($fu_cv_sys_mounted_vmount) +if test $fu_cv_sys_mounted_vmount = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_VMOUNT) +fi +fi + +if test -z "$list_mounted_fs"; then +# SVR3 +AC_MSG_CHECKING([for FIXME existence of three headers]) +AC_CACHE_VAL(fu_cv_sys_mounted_fread_fstyp, +[AC_TRY_CPP([ +#include +#include +#include ], +fu_cv_sys_mounted_fread_fstyp=yes, +fu_cv_sys_mounted_fread_fstyp=no)]) +AC_MSG_RESULT($fu_cv_sys_mounted_fread_fstyp) +if test $fu_cv_sys_mounted_fread_fstyp = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_FREAD_FSTYP) +fi +fi + +if test -z "$list_mounted_fs"; then +# 4.4BSD and DEC OSF/1. +AC_MSG_CHECKING([for getmntinfo function]) +AC_CACHE_VAL(fu_cv_sys_mounted_getmntinfo, +[ +ok= +if test $ac_cv_func_getmntinfo = yes; then +AC_EGREP_HEADER(f_type;, sys/mount.h, +ok=yes) +fi +test -n "$ok" \ +&& fu_cv_sys_mounted_getmntinfo=yes \ +|| fu_cv_sys_mounted_getmntinfo=no +]) +AC_MSG_RESULT($fu_cv_sys_mounted_getmntinfo) +if test $fu_cv_sys_mounted_getmntinfo = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_GETMNTINFO) +fi +fi + +# FIXME: add a test for netbsd-1.1 here + +if test -z "$list_mounted_fs"; then +# Ultrix +AC_MSG_CHECKING([for getmnt function]) +AC_CACHE_VAL(fu_cv_sys_mounted_getmnt, +[AC_TRY_CPP([ +#include +#include ], +fu_cv_sys_mounted_getmnt=yes, +fu_cv_sys_mounted_getmnt=no)]) +AC_MSG_RESULT($fu_cv_sys_mounted_getmnt) +if test $fu_cv_sys_mounted_getmnt = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_GETMNT) +fi +fi + +if test -z "$list_mounted_fs"; then +# SVR2 +AC_MSG_CHECKING([whether it is possible to resort to fread on /etc/mnttab]) +AC_CACHE_VAL(fu_cv_sys_mounted_fread, +[AC_TRY_CPP([#include ], +fu_cv_sys_mounted_fread=yes, +fu_cv_sys_mounted_fread=no)]) +AC_MSG_RESULT($fu_cv_sys_mounted_fread) +if test $fu_cv_sys_mounted_fread = yes; then +list_mounted_fs=found +AC_DEFINE(MOUNTED_FREAD) +fi +fi + +if test -z "$list_mounted_fs"; then +AC_MSG_ERROR([could not determine how to read list of mounted filesystems]) +# FIXME -- no need to abort building the whole package +# Can't build mountlist.c or anything that needs its functions +fi + +AC_CHECKING(how to get filesystem space usage) +space=no + +# Perform only the link test since it seems there are no variants of the +# statvfs function. This check is more than just AC_CHECK_FUNCS(statvfs) +# because that got a false positive on SCO OSR5. Adding the declaration +# of a `struct statvfs' causes this test to fail (as it should) on such +# systems. That system is reported to work fine with STAT_STATFS4 which +# is what it gets when this test fails. +if test $space = no; then +# SVR4 +AC_CACHE_CHECK([statvfs function (SVR4)], fu_cv_sys_stat_statvfs, +[AC_TRY_LINK([#include +#include ], +[struct statvfs fsd; statvfs (0, &fsd);], +fu_cv_sys_stat_statvfs=yes, +fu_cv_sys_stat_statvfs=no)]) +if test $fu_cv_sys_stat_statvfs = yes; then +space=yes +AC_DEFINE(STAT_STATVFS) +fi +fi + +if test $space = no; then +# DEC Alpha running OSF/1 +AC_MSG_CHECKING([for 3-argument statfs function (DEC OSF/1)]) +AC_CACHE_VAL(fu_cv_sys_stat_statfs3_osf1, +[AC_TRY_RUN([ +#include +#include +#include +main () +{ +struct statfs fsd; +fsd.f_fsize = 0; +exit (statfs (".", &fsd, sizeof (struct statfs))); +}], +fu_cv_sys_stat_statfs3_osf1=yes, +fu_cv_sys_stat_statfs3_osf1=no, +fu_cv_sys_stat_statfs3_osf1=no)]) +AC_MSG_RESULT($fu_cv_sys_stat_statfs3_osf1) +if test $fu_cv_sys_stat_statfs3_osf1 = yes; then +space=yes +AC_DEFINE(STAT_STATFS3_OSF1) +fi +fi + +if test $space = no; then +# AIX +AC_MSG_CHECKING([for two-argument statfs with statfs.bsize dnl +member (AIX, 4.3BSD)]) +AC_CACHE_VAL(fu_cv_sys_stat_statfs2_bsize, +[AC_TRY_RUN([ +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif +#ifdef HAVE_SYS_VFS_H +#include +#endif +main () +{ +struct statfs fsd; +fsd.f_bsize = 0; +exit (statfs (".", &fsd)); +}], +fu_cv_sys_stat_statfs2_bsize=yes, +fu_cv_sys_stat_statfs2_bsize=no, +fu_cv_sys_stat_statfs2_bsize=no)]) +AC_MSG_RESULT($fu_cv_sys_stat_statfs2_bsize) +if test $fu_cv_sys_stat_statfs2_bsize = yes; then +space=yes +AC_DEFINE(STAT_STATFS2_BSIZE) +fi +fi + +if test $space = no; then +# SVR3 +AC_MSG_CHECKING([for four-argument statfs (AIX-3.2.5, SVR3)]) +AC_CACHE_VAL(fu_cv_sys_stat_statfs4, +[AC_TRY_RUN([#include +#include +main () +{ +struct statfs fsd; +exit (statfs (".", &fsd, sizeof fsd, 0)); +}], +fu_cv_sys_stat_statfs4=yes, +fu_cv_sys_stat_statfs4=no, +fu_cv_sys_stat_statfs4=no)]) +AC_MSG_RESULT($fu_cv_sys_stat_statfs4) +if test $fu_cv_sys_stat_statfs4 = yes; then +space=yes +AC_DEFINE(STAT_STATFS4) +fi +fi + +if test $space = no; then +# 4.4BSD and NetBSD +AC_MSG_CHECKING([for two-argument statfs with statfs.fsize dnl +member (4.4BSD and NetBSD)]) +AC_CACHE_VAL(fu_cv_sys_stat_statfs2_fsize, +[AC_TRY_RUN([#include +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif +main () +{ +struct statfs fsd; +fsd.f_fsize = 0; +exit (statfs (".", &fsd)); +}], +fu_cv_sys_stat_statfs2_fsize=yes, +fu_cv_sys_stat_statfs2_fsize=no, +fu_cv_sys_stat_statfs2_fsize=no)]) +AC_MSG_RESULT($fu_cv_sys_stat_statfs2_fsize) +if test $fu_cv_sys_stat_statfs2_fsize = yes; then +space=yes +AC_DEFINE(STAT_STATFS2_FSIZE) +fi +fi + +if test $space = no; then +# Ultrix +AC_MSG_CHECKING([for two-argument statfs with struct fs_data (Ultrix)]) +AC_CACHE_VAL(fu_cv_sys_stat_fs_data, +[AC_TRY_RUN([#include +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif +#ifdef HAVE_SYS_FS_TYPES_H +#include +#endif +main () +{ +struct fs_data fsd; +/* Ultrix's statfs returns 1 for success, +0 for not mounted, -1 for failure. */ +exit (statfs (".", &fsd) != 1); +}], +fu_cv_sys_stat_fs_data=yes, +fu_cv_sys_stat_fs_data=no, +fu_cv_sys_stat_fs_data=no)]) +AC_MSG_RESULT($fu_cv_sys_stat_fs_data) +if test $fu_cv_sys_stat_fs_data = yes; then +space=yes +AC_DEFINE(STAT_STATFS2_FS_DATA) +fi +fi + +if test $space = no; then +# SVR2 +AC_TRY_CPP([#include ], +AC_DEFINE(STAT_READ_FILSYS) space=yes) +fi + +if test -n "$list_mounted_fs" && test $space != no; then +DF_PROG="df" +# LIBOBJS="$LIBOBJS fsusage.o" +# LIBOBJS="$LIBOBJS mountlist.o" +fi + +# Check for SunOS statfs brokenness wrt partitions 2GB and larger. +# If exists and struct statfs has a member named f_spare, +# enable the work-around code in fsusage.c. +AC_MSG_CHECKING([for statfs that truncates block counts]) +AC_CACHE_VAL(fu_cv_sys_truncating_statfs, +[AC_TRY_COMPILE([ +#if !defined(sun) && !defined(__sun) +choke -- this is a workaround for a Sun-specific problem +#endif +#include +#include ], +[struct statfs t; long c = *(t.f_spare);], +fu_cv_sys_truncating_statfs=yes, +fu_cv_sys_truncating_statfs=no, +)]) +if test $fu_cv_sys_truncating_statfs = yes; then +AC_DEFINE(STATFS_TRUNCATES_BLOCK_COUNTS) +fi +AC_MSG_RESULT($fu_cv_sys_truncating_statfs) + +AC_CHECKING(for AFS) +test -d /afs && AC_DEFINE(AFS) +]) diff --git a/macros/gnome-ghttp-check.m4 b/macros/gnome-ghttp-check.m4 new file mode 100644 index 0000000..0ecacaa --- /dev/null +++ b/macros/gnome-ghttp-check.m4 @@ -0,0 +1,14 @@ +AC_DEFUN([GNOME_GHTTP_CHECK],[ + AC_REQUIRE([GNOME_INIT_HOOK]) + GHTTP_LIB= + AC_CHECK_FUNC(connect,,[ + AC_CHECK_LIB(socket,connect, + GHTTP_LIB="-lsocket $GHTTP_LIB",,$GHTTP_LIB)]) + AC_CHECK_FUNC(gethostbyname,,[ + AC_CHECK_LIB(nsl,gethostbyname, + GHTTP_LIB="-lnsl $GHTTP_LIB",,$GHTTP_LIB)]) + AC_CHECK_LIB(ghttp, ghttp_request_new, + GHTTP_LIB="-lghttp $GHTTP_LIB",GHTTP_LIB="",-L$gnome_prefix $GHTTP_LIB) + AC_SUBST(GHTTP_LIB) + AC_PROVIDE([GNOME_GHTTP_CHECK]) +]) diff --git a/macros/gnome-gnorba-check.m4 b/macros/gnome-gnorba-check.m4 new file mode 100644 index 0000000..dbac0a6 --- /dev/null +++ b/macros/gnome-gnorba-check.m4 @@ -0,0 +1,35 @@ +dnl +dnl GNOME_GNORBA_HOOK (script-if-gnorba-found, failflag) +dnl +dnl if failflag is "failure" it aborts if gnorba is not found. +dnl + +AC_DEFUN([GNOME_GNORBA_HOOK],[ + GNOME_ORBIT_HOOK([],$2) + AC_CACHE_CHECK([for gnorba libraries],gnome_cv_gnorba_found,[ + gnome_cv_gnorba_found=no + if test x$gnome_cv_orbit_found = xyes; then + GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`" + GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`" + if test -n "$GNORBA_LIBS"; then + gnome_cv_gnorba_found=yes + fi + fi + ]) + AM_CONDITIONAL(HAVE_GNORBA, test x$gnome_cv_gnorba_found = xyes) + if test x$gnome_cv_orbit_found = xyes; then + $1 + GNORBA_CFLAGS="`gnome-config --cflags gnorba gnomeui`" + GNORBA_LIBS="`gnome-config --libs gnorba gnomeui`" + AC_SUBST(GNORBA_CFLAGS) + AC_SUBST(GNORBA_LIBS) + else + if test x$2 = xfailure; then + AC_MSG_ERROR(gnorba library not installed or installation problem) + fi + fi +]) + +AC_DEFUN([GNOME_GNORBA_CHECK], [ + GNOME_GNORBA_HOOK([],failure) +]) diff --git a/macros/gnome-guile-checks.m4 b/macros/gnome-guile-checks.m4 new file mode 100644 index 0000000..1086d30 --- /dev/null +++ b/macros/gnome-guile-checks.m4 @@ -0,0 +1,119 @@ +dnl +dnl GNOME_CHECK_GUILE (failflag) +dnl +dnl if failflag is "fail" then GNOME_CHECK_GUILE will abort if guile is not found. +dnl + +AC_DEFUN([GNOME_CHECK_GUILE], +[ + saved_ldflags="$LDFLAGS" + saved_cppflags="$CPPFLAGS" + LDFLAGS="$LDFLAGS $GNOME_LIBDIR" + + AC_CHECK_LIB(qthreads,qt_null,[ + QTTHREADS_LIB="-lqthreads" + ],[ + AC_CHECK_LIB(qt, qt_null, QTTHREADS_LIB="-lqt") + ],$LIBS) + AC_SUBST(QTTHREADS_LIB) + + AC_CHECK_LIB(termcap,main,TERMCAP_LIB="-ltermcap") + AC_CHECK_LIB(readline,main,READLINE_LIB="-lreadline",,$TERMCAP_LIB) + + AC_SUBST(TERMCAP_LIB) + AC_SUBST(READLINE_LIB) + + if test "x$cross_compiling" = "xyes" ; then + name_build_guile="$target_alias-guile-config" + else + name_build_guile="guile-config" + fi + + AC_CHECK_PROG(BUILD_GUILE, $name_build_guile, yes, no) + + if test "x$BUILD_GUILE" = "xyes"; then + AC_MSG_CHECKING(whether $name_build_guile works) + if test x`$name_build_guile --version >/dev/null 2>&1 || \ + echo no` = xno; then + BUILD_GUILE=no + fi + AC_MSG_RESULT($BUILD_GUILE) + else + + if test "x$cross_compiling" = "xyes" ; then + name_build_guile="$target_alias-build-guile" + else + name_build_guile="build-guile" + fi + + AC_CHECK_PROG(BUILD_GUILE, $name_build_guile, yes, no) + + if test "x$BUILD_GUILE" = "xyes"; then + AC_MSG_CHECKING(whether $name_build_guile works) + if test x`$name_build_guile --version >/dev/null 2>&1 || \ + echo no` = xno; then + BUILD_GUILE=no + fi + AC_MSG_RESULT($BUILD_GUILE) + fi + fi + + AC_CHECK_LIB(m, sin) + + if test "x$BUILD_GUILE" = "xyes"; then + AC_MSG_CHECKING(for guile libraries) + GUILE_LIBS="`$name_build_guile link`" + AC_MSG_RESULT($GUILE_LIBS) + AC_MSG_CHECKING(for guile headers) + GUILE_INCS="`$name_build_guile compile`" + AC_MSG_RESULT($GUILE_INCS) + else + GUILE_LIBS="$GNOME_LIBDIR" + GUILE_INCS="$GNOME_INCLUDEDIR" + AC_CHECK_LIB(rx, main, GUILE_LIBS="-lrx $GUILE_LIBS") + AC_CHECK_LIB(qt, qt_null, GUILE_LIBS="-lqt $GUILE_LIBS") + AC_CHECK_LIB(dl, dlopen, GUILE_LIBS="-ldl $GUILE_LIBS") + AC_CHECK_LIB(nsl, t_accept, GUILE_LIBS="$GUILE_LIBS -lnsl") + AC_CHECK_LIB(socket, socket, GUILE_LIBS="$GUILE_LIBS -lsocket") + GUILE_LIBS="-lguile $GUILE_LIBS $QTTHREADS_LIB $READLINE_LIB $TERMCAP_LIB" + fi + + AC_SUBST(GUILE_LIBS) + AC_SUBST(GUILE_INCS) + + saved_LIBS="$LIBS" + LIBS="$LIBS $GUILE_LIBS" + CPPFLAGS="$saved_cppflags $GUILE_INCS" + + AC_MSG_CHECKING(whether guile works) + AC_TRY_LINK([ + #include + #include + ],[ + gh_eval_str("(newline)"); + scm_boot_guile(0,NULL,NULL,NULL); + ],[ + ac_cv_guile_found=yes + AC_DEFINE(HAVE_GUILE) + ],[ + ac_cv_guile_found=no + ]) + AC_MSG_RESULT($ac_cv_guile_found) + + if test x$ac_cv_guile_found = xno ; then + if test x$1 = xfail ; then + AC_MSG_ERROR(Can not find Guile on this system) + else + AC_MSG_WARN(Can not find Guile on this system) + fi + ac_cv_guile_found=no + GUILE_LIBS= GUILE_INCS= + fi + + LIBS="$saved_LIBS" + LDFLAGS="$saved_ldflags" + CPPFLAGS="$saved_cppflags" + + AC_SUBST(GUILE_LIBS) + AM_CONDITIONAL(GUILE, test x$ac_cv_guile_found = xyes) +]) diff --git a/macros/gnome-libgtop-check.m4 b/macros/gnome-libgtop-check.m4 new file mode 100644 index 0000000..0ce6f6f --- /dev/null +++ b/macros/gnome-libgtop-check.m4 @@ -0,0 +1,217 @@ +dnl +dnl LIBGTOP_CHECK_TYPE +dnl +dnl Improved version of AC_CHECK_TYPE which takes into account +dnl that we need to #include some other header files on some +dnl systems to get some types. + +dnl AC_LIBGTOP_CHECK_TYPE(TYPE, DEFAULT) +AC_DEFUN(AC_LIBGTOP_CHECK_TYPE, +[AC_REQUIRE([AC_HEADER_STDC])dnl +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(ac_cv_type_$1, +[AC_EGREP_CPP(dnl +changequote(<<,>>)dnl +<<(^|[^a-zA-Z_0-9])$1[^a-zA-Z_0-9]>>dnl +changequote([,]), [#include +#if STDC_HEADERS +#include +#include +#endif + +/* For Tru64 */ +#ifdef HAVE_SYS_BITYPES_H +#include +#endif +], ac_cv_type_$1=yes, ac_cv_type_$1=no)])dnl +AC_MSG_RESULT($ac_cv_type_$1) +if test $ac_cv_type_$1 = no; then + AC_DEFINE($1, $2) +fi +]) + +dnl +dnl GNOME_LIBGTOP_TYPES +dnl +dnl some typechecks for libgtop. +dnl + +AC_DEFUN([GNOME_LIBGTOP_TYPES], +[ + AC_CHECK_HEADERS(sys/bitypes.h) + AC_LIBGTOP_CHECK_TYPE(u_int64_t, unsigned long long int) + AC_LIBGTOP_CHECK_TYPE(int64_t, signed long long int) +]) + +dnl +dnl GNOME_LIBGTOP_HOOK (minversion, script-if-libgtop-enabled, failflag) +dnl +dnl if failflag is "fail" then GNOME_LIBGTOP_HOOK will abort if LibGTop +dnl is not found. +dnl + +AC_DEFUN([GNOME_LIBGTOP_HOOK], +[ + AC_REQUIRE([GNOME_LIBGTOP_TYPES]) + + AC_SUBST(LIBGTOP_LIBDIR) + AC_SUBST(LIBGTOP_INCLUDEDIR) + AC_SUBST(LIBGTOP_EXTRA_LIBS) + AC_SUBST(LIBGTOP_LIBS) + AC_SUBST(LIBGTOP_INCS) + AC_SUBST(LIBGTOP_NAMES_LIBS) + AC_SUBST(LIBGTOP_NAMES_INCS) + AC_SUBST(LIBGTOP_MAJOR_VERSION) + AC_SUBST(LIBGTOP_MINOR_VERSION) + AC_SUBST(LIBGTOP_MICRO_VERSION) + AC_SUBST(LIBGTOP_VERSION) + AC_SUBST(LIBGTOP_VERSION_CODE) + AC_SUBST(LIBGTOP_SERVER_VERSION) + AC_SUBST(LIBGTOP_INTERFACE_AGE) + AC_SUBST(LIBGTOP_BINARY_AGE) + AC_SUBST(LIBGTOP_BINDIR) + AC_SUBST(LIBGTOP_SERVER) + + dnl Get the cflags and libraries from the libgtop-config script + dnl + AC_ARG_WITH(libgtop, + [ --with-libgtop=PFX Prefix where LIBGTOP is installed (optional)], + libgtop_config_prefix="$withval", libgtop_config_prefix="") + AC_ARG_WITH(libgtop-exec, + [ --with-libgtop-exec=PFX Exec prefix where LIBGTOP is installed (optional)], + libgtop_config_exec_prefix="$withval", libgtop_config_exec_prefix="") + + if test x$libgtop_config_exec_prefix != x ; then + libgtop_config_args="$libgtop_config_args --exec-prefix=$libgtop_config_exec_prefix" + if test x${LIBGTOP_CONFIG+set} != xset ; then + LIBGTOP_CONFIG=$libgtop_config_exec_prefix/bin/libgtop-config + fi + fi + if test x$libgtop_config_prefix != x ; then + libgtop_config_args="$libgtop_config_args --prefix=$libgtop_config_prefix" + if test x${LIBGTOP_CONFIG+set} != xset ; then + LIBGTOP_CONFIG=$libgtop_config_prefix/bin/libgtop-config + fi + fi + + AC_PATH_PROG(LIBGTOP_CONFIG, libgtop-config, no) + dnl IMPORTANT NOTICE: + dnl If you increase this number here, this means that *ALL* + dnl modules will require the new version, even if they explicitly + dnl give a lower number in their `configure.in' !!! + real_min_libgtop_version=1.0.0 + min_libgtop_version=ifelse([$1], ,$real_min_libgtop_version,$1) + dnl I know, the following code looks really ugly, but if you want + dnl to make changes, please test it with a brain-dead /bin/sh and + dnl with a brain-dead /bin/test (not all shells/tests support the + dnl `<' operator to compare strings, that's why I convert everything + dnl into numbers and test them). + min_libgtop_major=`echo $min_libgtop_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + min_libgtop_minor=`echo $min_libgtop_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + min_libgtop_micro=`echo $min_libgtop_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + test x$min_libgtop_micro = x && min_libgtop_micro=0 + real_min_libgtop_major=`echo $real_min_libgtop_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + real_min_libgtop_minor=`echo $real_min_libgtop_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + real_min_libgtop_micro=`echo $real_min_libgtop_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + test x$real_min_libgtop_micro = x && real_min_libgtop_micro=0 + dnl You cannot require a version less then $real_min_libgtop_version, + dnl so you don't need to update each `configure.in' when it's increased. + if test $real_min_libgtop_major -gt $min_libgtop_major ; then + min_libgtop_major=$real_min_libgtop_major + min_libgtop_minor=$real_min_libgtop_minor + min_libgtop_micro=$real_min_libgtop_micro + elif test $real_min_libgtop_major = $min_libgtop_major ; then + if test $real_min_libgtop_minor -gt $min_libgtop_minor ; then + min_libgtop_minor=$real_min_libgtop_minor + min_libgtop_micro=$real_min_libgtop_micro + elif test $real_min_libgtop_minor = $min_libgtop_minor ; then + if test $real_min_libgtop_micro -gt $min_libgtop_micro ; then + min_libgtop_micro=$real_min_libgtop_micro + fi + fi + fi + min_libgtop_version="$min_libgtop_major.$min_libgtop_minor.$min_libgtop_micro" + AC_MSG_CHECKING(for libgtop - version >= $min_libgtop_version) + no_libgtop="" + if test "$LIBGTOP_CONFIG" = "no" ; then + no_libgtop=yes + else + configfile=`$LIBGTOP_CONFIG --config` + libgtop_major_version=`$LIBGTOP_CONFIG --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + libgtop_minor_version=`$LIBGTOP_CONFIG --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + libgtop_micro_version=`$LIBGTOP_CONFIG --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test $libgtop_major_version != $min_libgtop_major ; then + no_libgtop=mismatch + else + test $libgtop_minor_version -lt $min_libgtop_minor && no_libgtop=yes + if test $libgtop_minor_version = $min_libgtop_minor ; then + test $libgtop_micro_version -lt $min_libgtop_micro && no_libgtop=yes + fi + fi + . $configfile + fi + if test x$no_libgtop = x ; then + AC_DEFINE(HAVE_LIBGTOP) + AC_DEFINE_UNQUOTED(LIBGTOP_VERSION, "$LIBGTOP_VERSION") + AC_DEFINE_UNQUOTED(LIBGTOP_VERSION_CODE, $LIBGTOP_VERSION_CODE) + AC_DEFINE_UNQUOTED(LIBGTOP_MAJOR_VERSION, $LIBGTOP_MAJOR_VERSION) + AC_DEFINE_UNQUOTED(LIBGTOP_MINOR_VERSION, $LIBGTOP_MINOR_VERSION) + AC_DEFINE_UNQUOTED(LIBGTOP_MICRO_VERSION, $LIBGTOP_MICRO_VERSION) + AC_DEFINE_UNQUOTED(LIBGTOP_SERVER_VERSION, $LIBGTOP_SERVER_VERSION) + AC_MSG_RESULT(yes) + dnl Note that an empty true branch is not valid sh syntax. + ifelse([$2], [], :, [$2]) + else + AC_MSG_RESULT(no) + if test "$no_libgtop"x = mismatchx; then + AC_MSG_ERROR(LibGTop major version mismatch $libgtop_major_version != $min_libgtop_major) + fi + if test "x$3" = "xfail"; then + AC_MSG_ERROR(LibGTop >= $min_libgtop_version not found) + else + AC_MSG_WARN(LibGTop >= $min_libgtop_version not found) + fi + fi + + AM_CONDITIONAL(HAVE_LIBGTOP, test x$no_libgtop != xyes) +]) + +AC_DEFUN([GNOME_INIT_LIBGTOP],[ + GNOME_LIBGTOP_HOOK($1,[ifelse([$3], [], :, [$3])],$2) +]) + +dnl +dnl GNOME_LIBGTOP_DOCU +dnl +dnl checks whether the documentation of LibGTop is installed +dnl + +AC_DEFUN([GNOME_LIBGTOP_DOCU], +[ + AC_REQUIRE([GNOME_LIBGTOP_HOOK]) + + helpdir="$LIBGTOP_DATADIR/gnome/help/libgtop" + + AC_MSG_CHECKING(whether you have the LibGTop Documentation) + + if test -f "$helpdir/C/topic.dat" ; then + have_libgtop_docu=yes + AC_DEFINE(HAVE_LIBGTOP_DOCU) + else + have_libgtop_docu=no + fi + + AC_MSG_RESULT($have_libgtop_docu) + + AM_CONDITIONAL(HAVE_LIBGTOP_DOCU, test x$have_libgtop_docu = xyes) +]) + diff --git a/macros/gnome-objc-checks.m4 b/macros/gnome-objc-checks.m4 new file mode 100644 index 0000000..c69acb0 --- /dev/null +++ b/macros/gnome-objc-checks.m4 @@ -0,0 +1,83 @@ +AC_DEFUN([GNOME_CHECK_OBJC], +[ +dnl Look for an ObjC compiler. +dnl FIXME: extend list of possible names of ObjC compilers. + AC_CHECK_PROGS(OBJC, $OBJC egcs, "") + if test "x$OBJC" = "x" ; then + AC_CHECK_PROGS(OBJC, $OBJC egcc, "") + if test "x$OBJC" = "x" ; then + AC_CHECK_PROGS(OBJC, $OBJC gcc, "") + fi + fi + + AC_REQUIRE([GNOME_PTHREAD_CHECK]) + + OBJC_LIBS="-lobjc $PTHREAD_LIB" + AC_CHECK_FUNC(sched_yield,,[ + AC_CHECK_LIB(rt,sched_yield, + OBJC_LIBS="$OBJC_LIBS -lrt",[ + AC_CHECK_LIB(posix4,sched_yield, + OBJC_LIBS="$OBJC_LIBS -lposix4",, + $OBJC_LIBS)], + $OBJC_LIBS)]) + AC_SUBST(OBJC_LIBS) + + AC_CACHE_CHECK([if Objective C compiler ($OBJC) works], + ac_cv_prog_objc_works, [ + if test -n "$OBJC"; then + cat > conftest.m < +@interface myRandomObj : Object +{ +} +@end +@implementation myRandomObj +@end +int main () { + /* No, you are not seeing double. Remember that square brackets + are the autoconf m4 quotes. */ + id myid = [[myRandomObj alloc]]; + [[myid free]]; + return 0; +} +EOF + + $OBJC $CFLAGS -o conftest $LDFLAGS conftest.m $OBJC_LIBS 1>&AC_FD_CC 2>&1 + result=$? + rm -f conftest* + + if test $result -eq 0; then + ac_cv_prog_objc_works=yes + fi + else + ac_cv_prog_objc_works=no + fi + ]) + + AM_CONDITIONAL(OBJECTIVE_C, test x$ac_cv_prog_objc_works = xyes) + dnl Also set the shell variable OBJECTIVE_C to "yes" or "no". + OBJECTIVE_C=$ac_cv_prog_objc_works +]) + +AC_DEFUN([GNOME_INIT_OBJC], +[ + AC_MSG_CHECKING(for an obGnomeConf.sh) + my_gnome_libdir=`$GNOME_CONFIG --libdir` + if test -f $my_gnome_libdir/obGnomeConf.sh; then + . $my_gnome_libdir/obGnomeConf.sh + AC_MSG_RESULT(found $my_gnome_libdir) + ac_cv_have_gnome_objc=yes + else + AC_MSG_RESULT(not found) + AC_MSG_WARN(Could not find the obGnomeConf.sh file that is generated by gnome-objc install) + ac_cv_have_gnome_objc=no + fi + + dnl Add a conditional on whether or not we have gnome-objc + AM_CONDITIONAL(HAVE_GNOME_OBJC, test x$ac_cv_have_gnome_objc = xyes) + HAVE_GNOME_OBJC=$ac_cv_have_gnome_objc + + AC_SUBST(OBGNOME_INCLUDEDIR) + AC_SUBST(OBGNOME_LIBS) + AC_SUBST(OBGTK_LIBS) +]) diff --git a/macros/gnome-orbit-check.m4 b/macros/gnome-orbit-check.m4 new file mode 100644 index 0000000..54bf33a --- /dev/null +++ b/macros/gnome-orbit-check.m4 @@ -0,0 +1,33 @@ +dnl +dnl GNOME_ORBIT_HOOK (script-if-orbit-found, failflag) +dnl +dnl if failflag is "failure" it aborts if orbit is not found. +dnl + +AC_DEFUN([GNOME_ORBIT_HOOK],[ + AC_PATH_PROG(ORBIT_CONFIG,orbit-config,no) + AC_PATH_PROG(ORBIT_IDL,orbit-idl,no) + AC_CACHE_CHECK([for working ORBit environment],gnome_cv_orbit_found,[ + if test x$ORBIT_CONFIG = xno -o x$ORBIT_IDL = xno; then + gnome_cv_orbit_found=no + else + gnome_cv_orbit_found=yes + fi + ]) + AM_CONDITIONAL(HAVE_ORBIT, test x$gnome_cv_orbit_found = xyes) + if test x$gnome_cv_orbit_found = xyes; then + $1 + ORBIT_CFLAGS=`orbit-config --cflags client server` + ORBIT_LIBS=`orbit-config --use-service=name --libs client server` + AC_SUBST(ORBIT_CFLAGS) + AC_SUBST(ORBIT_LIBS) + else + if test x$2 = xfailure; then + AC_MSG_ERROR(ORBit not installed or installation problem) + fi + fi +]) + +AC_DEFUN([GNOME_ORBIT_CHECK], [ + GNOME_ORBIT_HOOK([],failure) +]) diff --git a/macros/gnome-print-check.m4 b/macros/gnome-print-check.m4 new file mode 100644 index 0000000..7d98281 --- /dev/null +++ b/macros/gnome-print-check.m4 @@ -0,0 +1,171 @@ +# Configure paths for GNOME-PRINT +# Chris Lahey 99-2-5 +# stolen from Manish Singh again +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_GNOME_PRINT([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for GNOME-PRINT, and define GNOME_PRINT_CFLAGS and GNOME_PRINT_LIBS +dnl +AC_DEFUN(AM_PATH_GNOME_PRINT, +[dnl +dnl Get the cflags and libraries from the gnome-config script +dnl +AC_ARG_WITH(gnome-print-prefix,[ --with-gnome-print-prefix=PFX Prefix where GNOME-PRINT is installed (optional)], + gnome_print_prefix="$withval", gnome_print_prefix="") +AC_ARG_WITH(gnome-print-exec-prefix,[ --with-gnome-print-exec-prefix=PFX Exec prefix where GNOME-PRINT is installed (optional)], + gnome_print_exec_prefix="$withval", gnome_print_exec_prefix="") +AC_ARG_ENABLE(gnome-printtest, [ --disable-gnome-printtest Do not try to compile and run a test GNOME-PRINT program], + , enable_gnome_printtest=yes) + + if test x$gnome_print_exec_prefix != x ; then + gnome_print_args="$gnome_print_args --exec-prefix=$gnome_print_exec_prefix" + if test x${GNOME_CONFIG+set} != xset ; then + GNOME_CONFIG=$gnome_print_exec_prefix/bin/gnome-config + fi + fi + if test x$gnome_print_prefix != x ; then + gnome_print_args="$gnome_print_args --prefix=$gnome_print_prefix" + if test x${GNOME_CONFIG+set} != xset ; then + GNOME_CONFIG=$gnome_print_prefix/bin/gnome-config + fi + fi + + AC_PATH_PROG(GNOME_CONFIG, gnome-config, no) + min_gnome_print_version=ifelse([$1], ,0.1.0,$1) + AC_MSG_CHECKING(for GNOME-PRINT - version >= $min_gnome_print_version) + no_gnome_print="" + if test "$GNOME_CONFIG" = "no" ; then + no_gnome_print=yes + else + GNOME_PRINT_CFLAGS=`$GNOME_CONFIG $gnome_printconf_args --cflags print` + GNOME_PRINT_LIBS=`$GNOME_CONFIG $gnome_printconf_args --libs print` + + gnome_print_major_version=`$GNOME_CONFIG $gnome_print_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + gnome_print_minor_version=`$GNOME_CONFIG $gnome_print_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + gnome_print_micro_version=`$GNOME_CONFIG $gnome_print_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_gnome_printtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GNOME_PRINT_CFLAGS" + LIBS="$LIBS $GNOME_PRINT_LIBS" +dnl +dnl Now check if the installed GNOME-PRINT is sufficiently new. (Also sanity +dnl checks the results of gnome-config to some extent +dnl + rm -f conf.gnome_printtest + AC_TRY_RUN([ +#include +#include +#include +#include + +static char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gnome_printtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_gnome_print_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gnome_print_version"); + exit(1); + } + return 0; +#if 0 + if (($gnome_print_major_version > major) || + (($gnome_print_major_version == major) && ($gnome_print_minor_version > minor)) || + (($gnome_print_major_version == major) && ($gnome_print_minor_version == minor) && ($gnome_print_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'gnome-config print --version' returned %d.%d.%d, but the minimum version\n", $gnome_print_major_version, $gnome_print_minor_version, $gnome_print_micro_version); + printf("*** of GNOME-PRINT required is %d.%d.%d. If gnome-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If gnome-config was wrong, set the environment variable GNOME_CONFIG\n"); + printf("*** to point to the correct copy of gnome-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +#endif +} + +],, no_gnome_print=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gnome_print" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GNOME_CONFIG" = "no" ; then + echo "*** The gnome-config script installed by GNOME-LIBS could not be found" + echo "*** If GNOME-PRINT was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GNOME_CONFIG environment variable to the" + echo "*** full path to gnome-config." + else + if test -f conf.gnome_printtest ; then + : + else + echo "*** Could not run GNOME-PRINT test program, checking why..." + CFLAGS="$CFLAGS $GNOME_PRINT_CFLAGS" + LIBS="$LIBS $GNOME_PRINT_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GNOME-PRINT or finding the wrong" + echo "*** version of GNOME-PRINT. If it is not finding GNOME-PRINT, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GNOME-PRINT was incorrectly installed" + echo "*** or that you have moved GNOME-PRINT since it was installed. In the latter case, you" + echo "*** may want to edit the gnome-config script: $GNOME_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GNOME_PRINT_CFLAGS="" + GNOME_PRINT_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GNOME_PRINT_CFLAGS) + AC_SUBST(GNOME_PRINT_LIBS) + rm -f conf.gnome_printtest +]) + +AC_DEFUN([GNOME_PRINT_CHECK], [ + AM_PATH_GNOME_PRINT(0.1.0,,[AC_MSG_ERROR(GNOME-PRINT not found)]) +]) diff --git a/macros/gnome-pthread-check.m4 b/macros/gnome-pthread-check.m4 new file mode 100644 index 0000000..a4eb3b4 --- /dev/null +++ b/macros/gnome-pthread-check.m4 @@ -0,0 +1,16 @@ +dnl +dnl And better, use gthreads instead... +dnl + +AC_DEFUN([GNOME_PTHREAD_CHECK],[ + PTHREAD_LIB="" + AC_CHECK_LIB(pthread, pthread_create, PTHREAD_LIB="-lpthread", + [AC_CHECK_LIB(pthreads, pthread_create, PTHREAD_LIB="-lpthreads", + [AC_CHECK_LIB(c_r, pthread_create, PTHREAD_LIB="-lc_r", + [AC_CHECK_FUNC(pthread_create)] + )] + )] + ) + AC_SUBST(PTHREAD_LIB) + AC_PROVIDE([GNOME_PTHREAD_CHECK]) +]) diff --git a/macros/gnome-support.m4 b/macros/gnome-support.m4 new file mode 100644 index 0000000..2c1d049 --- /dev/null +++ b/macros/gnome-support.m4 @@ -0,0 +1,68 @@ +dnl GNOME_SUPPORT_CHECKS +dnl Check for various support functions needed by the standard +dnl Gnome libraries. Sets LIBOBJS, might define some macros. +dnl This should only be used when building the Gnome libs; +dnl Gnome clients should not need this macro. +AC_DEFUN([GNOME_SUPPORT_CHECKS],[ + # we need an `awk' to build `gnomesupport.h' + AC_REQUIRE([AC_PROG_AWK]) + + # this should go away soon + need_gnome_support=yes + + save_LIBOBJS="$LIBOBJS" + LIBOBJS= + + AC_CHECK_FUNCS(getopt_long,,LIBOBJS="$LIBOBJS getopt.o getopt1.o") + + # for `scandir' + AC_HEADER_DIRENT + + # copied from `configure.in' of `libiberty' + vars="program_invocation_short_name program_invocation_name sys_errlist" + for v in $vars; do + AC_MSG_CHECKING([for $v]) + AC_CACHE_VAL(gnome_cv_var_$v, + [AC_TRY_LINK([int *p;], [extern int $v; p = &$v;], + [eval "gnome_cv_var_$v=yes"], + [eval "gnome_cv_var_$v=no"])]) + if eval "test \"`echo '$gnome_cv_var_'$v`\" = yes"; then + AC_MSG_RESULT(yes) + n=HAVE_`echo $v | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + AC_DEFINE_UNQUOTED($n) + else + AC_MSG_RESULT(no) + fi + done + + AC_REPLACE_FUNCS(memmove mkstemp scandir strcasecmp strerror strndup strnlen) + AC_REPLACE_FUNCS(strtok_r strtod strtol strtoul vasprintf vsnprintf) + + AC_CHECK_FUNCS(realpath,,LIBOBJS="$LIBOBJS canonicalize.o") + + # to include `error.c' error.c has some HAVE_* checks + AC_CHECK_FUNCS(vprintf doprnt strerror_r) + AM_FUNC_ERROR_AT_LINE + + # This is required if we declare setreuid () and setregid (). + AC_TYPE_UID_T + + # see if we need to declare some functions. Solaris is notorious for + # putting functions into the `libc' but not listing them in the headers + AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h dirent.h) + GCC_NEED_DECLARATIONS(gethostname setreuid setregid getpagesize) + GCC_NEED_DECLARATION(scandir,[ +#ifdef HAVE_DIRENT_H +#include +#endif +]) + + # Turn our LIBOBJS into libtool objects. This is gross, but it + # requires changes to autoconf before it goes away. + LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.o/.lo/g'` + AC_SUBST(need_gnome_support) + AC_SUBST(LTLIBOBJS) + + LIBOBJS="$save_LIBOBJS" + AM_CONDITIONAL(BUILD_GNOME_SUPPORT, test "$need_gnome_support" = yes) +]) diff --git a/macros/gnome-undelfs.m4 b/macros/gnome-undelfs.m4 new file mode 100644 index 0000000..c8ea6f4 --- /dev/null +++ b/macros/gnome-undelfs.m4 @@ -0,0 +1,20 @@ +dnl GNOME_UNDELFS_CHECKS +dnl Check for ext2fs undel support. +dnl Set shell variable ext2fs_undel to "yes" if we have it, +dnl "no" otherwise. May define USE_EXT2FSLIB for cpp. +dnl Will set EXT2FS_UNDEL_LIBS to required libraries. + +AC_DEFUN([GNOME_UNDELFS_CHECKS], [ + AC_CHECK_HEADERS(ext2fs/ext2fs.h linux/ext2_fs.h) + ext2fs_undel=no + EXT2FS_UNDEL_LIBS= + if test x$ac_cv_header_ext2fs_ext2fs_h = xyes + then + if test x$ac_cv_header_linux_ext2_fs_h = xyes + then + AC_DEFINE(USE_EXT2FSLIB) + ext2fs_undel=yes + EXT2FS_UNDEL_LIBS="-lext2fs -lcom_err" + fi + fi +]) diff --git a/macros/gnome-vfs.m4 b/macros/gnome-vfs.m4 new file mode 100644 index 0000000..137a39d --- /dev/null +++ b/macros/gnome-vfs.m4 @@ -0,0 +1,120 @@ +dnl GNOME_VFS_CHECKS +dnl Check for various functions needed by libvfs. +dnl This has various effects: +dnl Sets GNOME_VFS_LIBS to libraries required +dnl Sets termnet to true or false depending on whether it is required. +dnl If yes, defines USE_TERMNET. +dnl Sets vfs_flags to "pretty" list of vfs implementations we include. +dnl Sets shell variable use_vfs to yes (default, --with-vfs) or +dnl "no" (--without-vfs). +dnl Calls AC_SUBST(mcserv), which is either empty or "mcserv". + +dnl Private define +AC_DEFUN([GNOME_WITH_VFS],[ + dnl FIXME: network checks should probably be in their own macro. + AC_CHECK_LIB(nsl, t_accept) + AC_CHECK_LIB(socket, socket) + + have_socket=no + AC_CHECK_FUNCS(socket, have_socket=yes) + if test $have_socket = no; then + # socket is not in the default libraries. See if it's in some other. + for lib in bsd socket inet; do + AC_CHECK_LIB($lib, socket, [ + LIBS="$LIBS -l$lib" + have_socket=yes + AC_DEFINE(HAVE_SOCKET) + break]) + done + fi + + have_gethostbyname=no + AC_CHECK_FUNC(gethostbyname, have_gethostbyname=yes) + if test $have_gethostbyname = no; then + # gethostbyname is not in the default libraries. See if it's in some other. + for lib in bsd socket inet; do + AC_CHECK_LIB($lib, gethostbyname, [LIBS="$LIBS -l$lib"; have_gethostbyname=yes; break]) + done + fi + + vfs_flags="tarfs" + use_net_code=false + if test $have_socket = yes; then + AC_STRUCT_LINGER + AC_CHECK_FUNCS(pmap_set, , [ + AC_CHECK_LIB(rpc, pmap_set, [ + LIBS="-lrpc $LIBS" + AC_DEFINE(HAVE_PMAP_SET) + ])]) + AC_CHECK_FUNCS(pmap_getport pmap_getmaps rresvport) + dnl add for source routing support setsockopt + AC_CHECK_HEADERS(rpc/pmap_clnt.h) + vfs_flags="$vfs_flags, mcfs, ftpfs, fish" + use_net_code=true + fi + + dnl + dnl Samba support + dnl + smbfs="" + SAMBAFILES="" + AC_ARG_WITH(samba, + [--with-samba Support smb virtual file system],[ + if test "x$withval != xno"; then + AC_DEFINE(WITH_SMBFS) + vfs_flags="$vfs_flags, smbfs" + smbfs="smbfs.o" + SAMBAFILES="\$(SAMBAFILES)" + fi + ]) + AC_SUBST(smbfs) + AC_SUBST(SAMBAFILES) + + dnl + dnl The termnet support + dnl + termnet=false + AC_ARG_WITH(termnet, + [--with-termnet If you want a termified net support],[ + if test x$withval = xyes; then + AC_DEFINE(USE_TERMNET) + termnet=true + fi + ]) + + TERMNET="" + AC_DEFINE(USE_VFS) + if $use_net_code; then + AC_DEFINE(USE_NETCODE) + fi + mcserv= + if test $have_socket = yes; then + mcserv="mcserv" + if $termnet; then + TERMNET="-ltermnet" + fi + fi + + AC_SUBST(TERMNET) + AC_SUBST(mcserv) + +dnl FIXME: +dnl GNOME_VFS_LIBS= + +]) + +AC_DEFUN([GNOME_VFS_CHECKS],[ + use_vfs=yes + AC_ARG_WITH(vfs, + [--with-vfs Compile with the VFS code], + use_vfs=$withval + ) + case $use_vfs in + yes) GNOME_WITH_VFS;; + no) use_vfs=no;; + *) use_vfs=no;; + dnl Should we issue a warning? + esac +]) + + diff --git a/macros/gnome-x-checks.m4 b/macros/gnome-x-checks.m4 new file mode 100644 index 0000000..1e397ef --- /dev/null +++ b/macros/gnome-x-checks.m4 @@ -0,0 +1,80 @@ +dnl GNOME_X_CHECKS +dnl +dnl Basic X11 related checks for X11. At the end, the following will be +dnl defined/changed: +dnl GTK_{CFLAGS,LIBS} From AM_PATH_GTK +dnl CPPFLAGS Will include $X_CFLAGS +dnl GNOME_HAVE_SM `true' or `false' depending on whether session +dnl management is available. It is available if +dnl both -lSM and X11/SM/SMlib.h exist. (Some +dnl Solaris boxes have the library but not the header) +dnl XPM_LIBS -lXpm if Xpm library is present, otherwise "" +dnl +dnl The following configure cache variables are defined (but not used): +dnl gnome_cv_passdown_{x_libs,X_LIBS,X_CFLAGS} +dnl +AC_DEFUN([GNOME_X_CHECKS], +[ + AM_PATH_GTK(1.2.0,,AC_MSG_ERROR(GTK not installed, or gtk-config not in path)) + dnl Hope that GTK_CFLAGS have only -I and -D. Otherwise, we could + dnl test -z "$x_includes" || CPPFLAGS="$CPPFLAGS -I$x_includes" + dnl + dnl Use CPPFLAGS instead of CFLAGS because AC_CHECK_HEADERS uses + dnl CPPFLAGS, not CFLAGS + CPPFLAGS="$CPPFLAGS $GTK_CFLAGS" + + saved_ldflags="$LDFLAGS" + LDFLAGS="$LDFLAGS $GTK_LIBS" + + gnome_cv_passdown_x_libs="$GTK_LIBS" + gnome_cv_passdown_X_LIBS="$GTK_LIBS" + gnome_cv_passdown_X_CFLAGS="$GTK_CFLAGS" + gnome_cv_passdown_GTK_LIBS="$GTK_LIBS" + + LDFLAGS="$saved_ldflags $GTK_LIBS" + +dnl We are requiring GTK >= 1.1.1, which means this will be fine anyhow. + USE_DEVGTK=true + +dnl AC_MSG_CHECKING([whether to use features from (unstable) GTK+ 1.1.x]) +dnl AC_EGREP_CPP(answer_affirmatively, +dnl [#include +dnl #ifdef GTK_HAVE_FEATURES_1_1_0 +dnl answer_affirmatively +dnl #endif +dnl ], dev_gtk=yes, dev_gtk=no) +dnl if test "$dev_gtk" = "yes"; then +dnl USE_DEVGTK=true +dnl fi +dnl AC_MSG_RESULT("$dev_gtk") + + GNOME_HAVE_SM=true + case "$GTK_LIBS" in + *-lSM*) + dnl Already found it. + ;; + *) + dnl Assume that if we have -lSM then we also have -lICE. + AC_CHECK_LIB(SM, SmcSaveYourselfDone, + [GTK_LIBS="-lSM -lICE $GTK_LIBS"],GNOME_HAVE_SM=false, + $x_libs -lICE) + ;; + esac + + if test "$GNOME_HAVE_SM" = true; then + AC_CHECK_HEADERS(X11/SM/SMlib.h,,GNOME_HAVE_SM=false) + fi + + if test "$GNOME_HAVE_SM" = true; then + AC_DEFINE(HAVE_LIBSM) + fi + + XPM_LIBS="" + AC_CHECK_LIB(Xpm, XpmFreeXpmImage, [XPM_LIBS="-lXpm"], , $x_libs) + AC_SUBST(XPM_LIBS) + + AC_REQUIRE([GNOME_PTHREAD_CHECK]) + LDFLAGS="$saved_ldflags" + + AC_PROVIDE([GNOME_X_CHECKS]) +]) diff --git a/macros/gnome-xml-check.m4 b/macros/gnome-xml-check.m4 new file mode 100644 index 0000000..4bc91d1 --- /dev/null +++ b/macros/gnome-xml-check.m4 @@ -0,0 +1,30 @@ +dnl +dnl GNOME_XML_HOOK (script-if-xml-found, failflag) +dnl +dnl If failflag is "failure", script aborts due to lack of XML +dnl +dnl Check for availability of the libxml library +dnl the XML parser uses libz if available too +dnl + +AC_DEFUN([GNOME_XML_HOOK],[ + AC_PATH_PROG(GNOME_CONFIG,gnome-config,no) + if test "$GNOME_CONFIG" = no; then + if test x$2 = xfailure; then + AC_MSG_ERROR(Could not find gnome-config) + fi + fi + AC_CHECK_LIB(xml, xmlNewDoc, [ + $1 + GNOME_XML_LIB=`$GNOME_CONFIG --libs xml` + ], [ + if test x$2 = xfailure; then + AC_MSG_ERROR(Could not link sample xml program) + fi + ], `$GNOME_CONFIG --libs xml`) + AC_SUBST(GNOME_XML_LIB) +]) + +AC_DEFUN([GNOME_XML_CHECK], [ + GNOME_XML_HOOK([],failure) +]) diff --git a/macros/gnome.m4 b/macros/gnome.m4 new file mode 100644 index 0000000..659c22c --- /dev/null +++ b/macros/gnome.m4 @@ -0,0 +1,128 @@ +dnl +dnl GNOME_INIT_HOOK (script-if-gnome-enabled, [failflag], [additional-inits]) +dnl +dnl if failflag is "fail" then GNOME_INIT_HOOK will abort if gnomeConf.sh +dnl is not found. +dnl + +AC_DEFUN([GNOME_INIT_HOOK],[ + AC_SUBST(GNOME_LIBS) + AC_SUBST(GNOMEUI_LIBS) + AC_SUBST(GNOMEGNORBA_LIBS) + AC_SUBST(GTKXMHTML_LIBS) + AC_SUBST(ZVT_LIBS) + AC_SUBST(GNOME_LIBDIR) + AC_SUBST(GNOME_INCLUDEDIR) + + AC_ARG_WITH(gnome-includes, + [ --with-gnome-includes Specify location of GNOME headers],[ + CFLAGS="$CFLAGS -I$withval" + ]) + + AC_ARG_WITH(gnome-libs, + [ --with-gnome-libs Specify location of GNOME libs],[ + LDFLAGS="$LDFLAGS -L$withval" + gnome_prefix=$withval + ]) + + AC_ARG_WITH(gnome, + [ --with-gnome Specify prefix for GNOME files], + if test x$withval = xyes; then + want_gnome=yes + dnl Note that an empty true branch is not + dnl valid sh syntax. + ifelse([$1], [], :, [$1]) + else + if test "x$withval" = xno; then + want_gnome=no + else + want_gnome=yes + LDFLAGS="$LDFLAGS -L$withval/lib" + CFLAGS="$CFLAGS -I$withval/include" + gnome_prefix=$withval/lib + fi + fi, + want_gnome=yes) + + if test "x$want_gnome" = xyes; then + + AC_PATH_PROG(GNOME_CONFIG,gnome-config,no) + if test "$GNOME_CONFIG" = "no"; then + no_gnome_config="yes" + else + AC_MSG_CHECKING(if $GNOME_CONFIG works) + if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then + AC_MSG_RESULT(yes) + GNOME_GNORBA_HOOK([],$2) + GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome`" + GNOMEUI_LIBS="`$GNOME_CONFIG --libs-only-l gnomeui`" + GNOMEGNORBA_LIBS="`$GNOME_CONFIG --libs-only-l gnorba gnomeui`" + GTKXMHTML_LIBS="`$GNOME_CONFIG --libs-only-l gtkxmhtml`" + ZVT_LIBS="`$GNOME_CONFIG --libs-only-l zvt`" + GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`" + GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`" + $1 + else + AC_MSG_RESULT(no) + no_gnome_config="yes" + fi + fi + + if test x$exec_prefix = xNONE; then + if test x$prefix = xNONE; then + gnome_prefix=$ac_default_prefix/lib + else + gnome_prefix=$prefix/lib + fi + else + gnome_prefix=`eval echo \`echo $libdir\`` + fi + + if test "$no_gnome_config" = "yes"; then + AC_MSG_CHECKING(for gnomeConf.sh file in $gnome_prefix) + if test -f $gnome_prefix/gnomeConf.sh; then + AC_MSG_RESULT(found) + echo "loading gnome configuration from" \ + "$gnome_prefix/gnomeConf.sh" + . $gnome_prefix/gnomeConf.sh + $1 + else + AC_MSG_RESULT(not found) + if test x$2 = xfail; then + AC_MSG_ERROR(Could not find the gnomeConf.sh file that is generated by gnome-libs install) + fi + fi + fi + fi + + if test -n "$3"; then + n="$3" + for i in $n; do + AC_MSG_CHECKING(extra library \"$i\") + case $i in + applets) + AC_SUBST(GNOME_APPLETS_LIBS) + GNOME_APPLETS_LIBS=`$GNOME_CONFIG --libs-only-l applets` + AC_MSG_RESULT($GNOME_APPLETS_LIBS);; + docklets) + AC_SUBST(GNOME_DOCKLETS_LIBS) + GNOME_DOCKLETS_LIBS=`$GNOME_CONFIG --libs-only-l docklets` + AC_MSG_RESULT($GNOME_DOCKLETS_LIBS);; + capplet) + AC_SUBST(GNOME_CAPPLET_LIBS) + GNOME_CAPPLET_LIBS=`$GNOME_CONFIG --libs-only-l capplet` + AC_MSG_RESULT($GNOME_CAPPLET_LIBS);; + *) + AC_MSG_RESULT(unknown library) + esac + done + fi +]) + +dnl +dnl GNOME_INIT ([additional-inits]) +dnl + +AC_DEFUN([GNOME_INIT],[ + GNOME_INIT_HOOK([],fail,$1) +]) diff --git a/macros/gperf-check.m4 b/macros/gperf-check.m4 new file mode 100644 index 0000000..1b73d3f --- /dev/null +++ b/macros/gperf-check.m4 @@ -0,0 +1,79 @@ +dnl +dnl AC_PROG_GPERF (MINIMUM-VERSION) +dnl +dnl Check for availability of gperf. +dnl Abort if not found or if current version is not up to par. +dnl + +AC_DEFUN([AC_PROG_GPERF],[ + AC_PATH_PROG(GPERF, gperf, no) + if test "$GPERF" = no; then + AC_MSG_ERROR(Could not find gperf) + fi + min_gperf_version=ifelse([$1], ,2.7,$1) + AC_MSG_CHECKING(for gperf - version >= $min_gperf_version) + gperf_major_version=`$GPERF --version | \ + sed 's/GNU gperf \([[0-9]]*\).\([[0-9]]*\)/\1/'` + gperf_minor_version=`$GPERF --version | \ + sed 's/GNU gperf \([[0-9]]*\).\([[0-9]]*\)/\2/'` + no_gperf="" +dnl +dnl Now check if the installed gperf is sufficiently new. +dnl + AC_TRY_RUN([ +#include +#include +#include + +static char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int +main () +{ + char *tmp_version; + + int major; + int minor; + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_gperf_version"); + if (sscanf(tmp_version, "%d.%d", &major, &minor) != 2) { + printf ("%s, bad version string\n", "$min_gperf_version"); + exit (1); + } + + if (($gperf_major_version > major) || + (($gperf_major_version == major) && ($gperf_minor_version >= minor))) { + return 0; + } else { + printf ("\n"); + printf ("*** An old version of gperf ($gperf_major_version.$gperf_minor_version) was found.\n"); + printf ("*** You need a version of gperf newer than %d.%d.%d. The latest version of\n", + major, minor); + printf ("*** gperf is always available from ftp://ftp.gnu.org.\n"); + printf ("***\n"); + return 1; + } +} +],,no_gperf=yes,[/bin/true]) + if test "x$no_gperf" = x ; then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + +]) diff --git a/macros/linger.m4 b/macros/linger.m4 new file mode 100644 index 0000000..dfa7c8a --- /dev/null +++ b/macros/linger.m4 @@ -0,0 +1,28 @@ +dnl +dnl Check for struct linger +dnl +AC_DEFUN(AC_STRUCT_LINGER, [ +av_struct_linger=no +AC_MSG_CHECKING(struct linger is available) +AC_TRY_RUN([ +#include +#include + +struct linger li; + +main () +{ + li.l_onoff = 1; + li.l_linger = 120; + exit (0); +} +],[ +AC_DEFINE(HAVE_STRUCT_LINGER) +av_struct_linger=yes +],[ +av_struct_linger=no +],[ +av_struct_linger=no +]) +AC_MSG_RESULT($av_struct_linger) +]) diff --git a/macros/need-declaration.m4 b/macros/need-declaration.m4 new file mode 100644 index 0000000..d5b7bc6 --- /dev/null +++ b/macros/need-declaration.m4 @@ -0,0 +1,42 @@ +dnl See whether we need a declaration for a function. +dnl GCC_NEED_DECLARATION(FUNCTION [, EXTRA-HEADER-FILES]) +AC_DEFUN(GCC_NEED_DECLARATION, +[AC_MSG_CHECKING([whether $1 must be declared]) +AC_CACHE_VAL(gcc_cv_decl_needed_$1, +[AC_TRY_COMPILE([ +#include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +$2], +[char *(*pfn) = (char *(*)) $1], +eval "gcc_cv_decl_needed_$1=no", eval "gcc_cv_decl_needed_$1=yes")]) +if eval "test \"`echo '$gcc_cv_decl_needed_'$1`\" = yes"; then + AC_MSG_RESULT(yes) + gcc_need_declarations="$gcc_need_declarations $1" + gcc_tr_decl=NEED_DECLARATION_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + AC_DEFINE_UNQUOTED($gcc_tr_decl) +else + AC_MSG_RESULT(no) +fi +])dnl + +dnl Check multiple functions to see whether each needs a declaration. +dnl GCC_NEED_DECLARATIONS(FUNCTION... [, EXTRA-HEADER-FILES]) +AC_DEFUN(GCC_NEED_DECLARATIONS, +[for ac_func in $1 +do +GCC_NEED_DECLARATION($ac_func, $2) +done +] +) diff --git a/missing b/missing new file mode 100644 index 0000000..7789652 --- /dev/null +++ b/missing @@ -0,0 +1,190 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997 Free Software Foundation, Inc. +# Franc,ois Pinard , 1996. + +# This program 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, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing - GNU libit 0.0" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`configure.in'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`configure.in'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`configure.in'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100644 index 0000000..bcfd828 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 2003-06-17 17:10:52 gerber Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 0000000..19e3e53 --- /dev/null +++ b/po/ChangeLog @@ -0,0 +1,924 @@ +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-10 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-08 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-06 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-06 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-03 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-06-02 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-05-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-31 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-03-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-17 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-14 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-13 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2003-02-12 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-11 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-09 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-09 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-09 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-09 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-09 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-09 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-08 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-05 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-12-04 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-11-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-11-08 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + * cat-id-tbl.c: Remove file. + * stamp-cat-id: Remove file. + +2002-11-01 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + * cat-id-tbl.c: Remove file. + * stamp-cat-id: Remove file. + +2002-10-29 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + * cat-id-tbl.c: Remove file. + * stamp-cat-id: Remove file. + +2002-10-25 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-23 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + * cat-id-tbl.c: Remove file. + * stamp-cat-id: Remove file. + +2002-10-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-21 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-20 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-20 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-20 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-20 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-20 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-20 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-20 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-20 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + +2002-10-19 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + * cat-id-tbl.c: Remove file. + * stamp-cat-id: Remove file. + +2002-03-28 gettextize + + * Makefile.in.in: Upgrade to gettext-0.10.40. + * cat-id-tbl.c: Remove file. + * stamp-cat-id: Remove file. + diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..28726a2 --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,196 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995-1997, 2000, 2001 by Ulrich Drepper +# +# This file file be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` + +CC = @CC@ +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +MSGMERGE = msgmerge + +DEFS = @DEFS@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ + +INCLUDES = -I.. -I$(top_srcdir)/intl + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ +$(POFILES) $(GMOFILES) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +.SUFFIXES: +.SUFFIXES: .c .o .po .pox .gmo .mo + +.c.o: + $(COMPILE) $< + +.po.pox: + $(MAKE) $(PACKAGE).pot + $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox + +.po.mo: + $(MSGFMT) -o $@ $< + +.po.gmo: + file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) --statistics -o $$file $< + + +all: all-@USE_NLS@ + +all-yes: $(CATALOGS) +all-no: + +# Note: Target 'all' must not depend on target '$(srcdir)/$(PACKAGE).pot', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +$(srcdir)/$(PACKAGE).pot: $(POTFILES) $(srcdir)/POTFILES.in + $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ + --add-comments --keyword=_ --keyword=N_ \ + --files-from=$(srcdir)/POTFILES.in \ + && test ! -f $(PACKAGE).po \ + || ( rm -f $(srcdir)/$(PACKAGE).pot \ + && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ + $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + if test -r $$cat; then \ + $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \ + echo "installing $$cat as $(DESTDIR)$$dir/$(PACKAGE).mo"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$cat $(DESTDIR)$$dir/$(PACKAGE).mo; \ + echo "installing $(srcdir)/$$cat as" \ + "$(DESTDIR)$$dir/$(PACKAGE).mo"; \ + fi; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\.gmo$$//'`; \ + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(PACKAGE).mo; \ + done + if test "$(PACKAGE)" = "gettext"; then \ + rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ + else \ + : ; \ + fi + +check: all + +dvi info tags TAGS ID: + +mostlyclean: + rm -f core core.* *.pox $(PACKAGE).po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: $(DISTFILES) + dists="$(DISTFILES)"; \ + for file in $$dists; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + cp -p $$dir/$$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(PACKAGE).pot + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; fi; \ + cd $(srcdir); \ + catalogs='$(GMOFILES)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\.gmo$$//'`; \ + echo "$$lang:"; \ + if $(MSGMERGE) $$lang.po $(PACKAGE).pot -o $$lang.new.po; then \ + mv -f $$lang.new.po $$lang.po; \ + else \ + echo "msgmerge for $$cat failed!"; \ + rm -f $$lang.new.po; \ + fi; \ + done + $(MAKE) update-gmo + +update-gmo: Makefile $(GMOFILES) + @: + +Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..b628a55 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,20 @@ +# List of source files containing translatable strings. + +src/main.c +src/support.c +src/utils.c +src/preferences.c +src/console_menus.h +src/console_interface.c +src/console.c +src/imgh_interface.c +src/imgh.c +src/piveval_interface.c +src/piveval.c +src/pivvalid_interface.c +src/pivvalid.c +src/pivpost_interface.c +src/pivpost.c +src/display_menus.h +src/display_interface.c +src/display.c diff --git a/po/ca.gmo b/po/ca.gmo new file mode 100644 index 0000000000000000000000000000000000000000..84420217717ca6a9185e150422ced76abc3a7032 GIT binary patch literal 16918 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, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: gpiv 0.0 \n" +"POT-Creation-Date: 2003-06-17 19:04+0200\n" +"PO-Revision-Date: 2002-12-10 21:30+0100\n" +"Last-Translator: Gerber \n" +"Language-Team: ca \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:85 +msgid "number of bins for histograms" +msgstr "quantitat dels barres pels histogrammes" + +#: src/main.c:85 +msgid "BINS" +msgstr "BARRES" + +#: src/main.c:88 +#, fuzzy +msgid "number of columns in image" +msgstr "quantitat del colons" + +#: src/main.c:88 +msgid "NCOLUMNS" +msgstr "" + +#: src/main.c:91 +#, fuzzy +msgid "number of rows in image" +msgstr "quantitat del lineas" + +#: src/main.c:91 +msgid "NROWS" +msgstr "" + +#: src/main.c:94 +#, fuzzy +msgid "enables displaying of the first image of a PIV image pair" +msgstr "deixes a enseignar les dades de tensio shorn" + +#: src/main.c:98 +#, fuzzy +msgid "enables displaying of the second image of a PIV image pair" +msgstr "deixes a enseignar les dades del PIV" + +#: src/main.c:102 +msgid "enables displaying of interrogation regions" +msgstr "deixes a enseignar els areas de interrogacio" + +#: src/main.c:105 +msgid "enables displaying of PIV data" +msgstr "deixes a enseignar les dades del PIV" + +#: src/main.c:108 +msgid "enables displaying of vorticity data" +msgstr "deixes a enseignar les dades de vorticitat" + +#: src/main.c:111 +msgid "enables displaying of shear strain data" +msgstr "deixes a enseignar les dades de tensio shorn" + +#: src/main.c:114 +msgid "enables displaying of normal strain data" +msgstr "deixes a enseignar les dades de tensio normal" + +#: src/main.c:117 +msgid "save data in hdf5 format with .gpi extension" +msgstr "" + +#: src/main.c:119 +msgid "include image data in .gpi file (hdf5 format)" +msgstr "" + +#: src/main.c:122 +msgid "print parameters and other info to stdout" +msgstr "impres els parametres i altres informacio al stdout" + +#: src/main.c:125 +msgid "includes piv in the chain-proces" +msgstr "inclueix piv en el proces de cadena" + +#: src/main.c:128 +msgid "includes gradient in the chain-proces" +msgstr "incluiex gradient en el proces de cadena" + +#: src/main.c:131 +msgid "includes resstats in the chain-proces" +msgstr "incluiex resstats en el proces de cadena" + +#: src/main.c:134 +msgid "includes validate in the chain-proces" +msgstr "inclueix validar en el proces de cadena" + +#: src/main.c:137 +msgid "includes peaklock in the chain-proces" +msgstr "inclueix peacklock en el proces de cadena" + +#: src/main.c:140 +msgid "includes average in the chain-proces" +msgstr "inclueix mitja en el proces de cadena" + +#: src/main.c:143 +#, fuzzy +msgid "includes scaling in the chain-proces" +msgstr "inclueix piv en el proces de cadena" + +#: src/main.c:146 +msgid "includes substract in the chain-proces" +msgstr "inclueix treure en el proces de cadena" + +#: src/main.c:149 +msgid "includes vorticity in the chain-proces" +msgstr "inclueix vorticitat en el proces de cadena" + +#: src/main.c:152 +#, fuzzy +msgid "display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0" +msgstr "" +"index del zoom per finestre d'enseignar: 1:0.5, 2: 0.6, 3:0.83, 4:1.0, " +"5:1.3, 6:1.6, 7:2.0 (int)" + +#: src/main.c:153 src/main.c:156 +msgid "SCALE" +msgstr "SCALA" + +#: src/main.c:156 +#, fuzzy +msgid "vector length scale" +msgstr "scala de la llarga del fletche (int)" + +#: src/console_menus.h:92 src/console_menus.h:338 src/main.c:162 +msgid "show tooltips" +msgstr "enseignar instructions" + +#: src/main.c:165 +#, fuzzy +msgid "view the gpiv buttons of the application" +msgstr "vista la barra del gpiv" + +#: src/main.c:168 +#, fuzzy +msgid "view the tabulator of the application" +msgstr "vista les taules" + +#: src/main.c:576 +#, c-format +msgid "image width = %d image height = %d" +msgstr "" + +#: src/main.c:605 +#, c-format +msgid "Image dimensions are larger then the allowed maxima (%dx%d)." +msgstr "" + +#: src/support.c:125 src/support.c:163 +#, c-format +msgid "Couldn't find pixmap file: %s" +msgstr "No ha pogut trobar el fitxe pixmap: %s" + +#: src/support.c:141 +#, c-format +msgid "Couldn't create pixmap from file: %s" +msgstr "No ha pogute crear el pixmap del fitxe: %s" + +#. _parented +#. gnome_dialog_new +#: src/console_menus.h:77 src/console_menus.h:324 src/preferences.c:144 +msgid "Preferences" +msgstr "Preferencies" + +#: src/preferences.c:198 +msgid "View" +msgstr "Enseignar" + +#: src/console_menus.h:59 src/console_menus.h:309 src/preferences.c:230 +msgid "gpiv buttons" +msgstr "barre gpiv" + +#: src/console_menus.h:67 src/console_menus.h:316 src/preferences.c:259 +msgid "tabulator" +msgstr "taula" + +#. +#: src/preferences.c:288 +#, fuzzy +msgid "In/output" +msgstr "Result:" + +#: src/preferences.c:318 +msgid "hdf5 format (.gpi)" +msgstr "" + +#: src/preferences.c:346 +msgid "include image in .gpi" +msgstr "" + +#: src/preferences.c:392 +msgid "img width: " +msgstr "" + +#: src/preferences.c:451 +msgid "img height: " +msgstr "" + +#. +#. * General; tooltips and histogram bins +#. +#: src/preferences.c:496 +msgid "tooltips" +msgstr "instructions" + +#: src/preferences.c:530 +msgid "processes" +msgstr "procesos" + +#. +#. * PIV activating button +#. +#: src/console_interface.c:612 src/console_menus.h:177 +#: src/piveval_interface.c:2392 src/preferences.c:563 +msgid "piv" +msgstr "piv" + +#: src/console_interface.c:660 src/console_menus.h:188 src/preferences.c:593 +msgid "gradient" +msgstr "gradient" + +#: src/console_interface.c:706 src/console_menus.h:209 src/preferences.c:623 +msgid "residu stats" +msgstr "residu stats" + +#: src/console_interface.c:754 src/console_menus.h:198 src/preferences.c:653 +msgid "validate" +msgstr "validacio" + +#: src/console_interface.c:801 src/console_menus.h:220 src/preferences.c:683 +msgid "peaklock" +msgstr "peaklock" + +#: src/preferences.c:712 +#, fuzzy +msgid "scaling" +msgstr "Scala" + +#: src/console_interface.c:893 src/console_menus.h:241 src/preferences.c:742 +msgid "average" +msgstr "mitja" + +#. +#. * button to substracts averages +#. +#: src/console_interface.c:938 src/console_menus.h:251 +#: src/pivpost_interface.c:702 src/preferences.c:772 +msgid "substract" +msgstr "treure" + +#: src/console_interface.c:984 src/console_menus.h:261 +#: src/pivpost_interface.c:1181 src/preferences.c:802 +msgid "vorticity" +msgstr "vorticitat" + +#: src/preferences.c:852 +msgid "number of histogram bins: " +msgstr "numero dels barres pel histogram" + +#: src/preferences.c:895 +msgid "console" +msgstr "" + +#. +#. * Vector scale +#. +#: src/preferences.c:930 +msgid "vector scale" +msgstr "scala fletches" + +#: src/display_menus.h:77 src/piveval_interface.c:1796 src/preferences.c:964 +msgid "1" +msgstr "1" + +#: src/display_menus.h:71 src/display_menus.h:79 src/piveval_interface.c:1829 +#: src/preferences.c:997 +msgid "2" +msgstr "2" + +#: src/display_menus.h:81 src/preferences.c:1029 +msgid "4" +msgstr "4" + +#: src/display_menus.h:83 src/piveval_interface.c:1093 src/preferences.c:1061 +msgid "8" +msgstr "8" + +#: src/display_menus.h:85 src/piveval_interface.c:663 +#: src/piveval_interface.c:892 src/piveval_interface.c:1128 +#: src/preferences.c:1093 +msgid "16" +msgstr "16" + +#: src/display_menus.h:87 src/piveval_interface.c:697 +#: src/piveval_interface.c:926 src/piveval_interface.c:1162 +#: src/preferences.c:1122 +msgid "32" +msgstr "32" + +#: src/display_menus.h:89 src/piveval_interface.c:731 +#: src/piveval_interface.c:960 src/piveval_interface.c:1196 +#: src/preferences.c:1151 +msgid "64" +msgstr "64" + +#. +#. * Zoom scale +#. +#: src/preferences.c:1180 +msgid "zoom scale" +msgstr "scala zoom" + +#: src/display_menus.h:61 src/preferences.c:1211 +msgid "0.5" +msgstr "0.5" + +#: src/display_menus.h:63 src/preferences.c:1242 +msgid "0.83" +msgstr "0.83" + +#: src/display_menus.h:65 src/preferences.c:1273 +msgid "1.0" +msgstr "1.0" + +#: src/display_menus.h:67 src/preferences.c:1304 +msgid "1.3" +msgstr "1.3" + +#: src/display_menus.h:69 src/preferences.c:1335 +msgid "1.6" +msgstr "1.6" + +#: src/preferences.c:1366 +msgid "2.0" +msgstr "2.0" + +#. +#. * Hide and display data +#. +#: src/preferences.c:1398 +msgid "hide/display data" +msgstr "amagar/enseignar dades" + +#: src/preferences.c:1429 +msgid "image A" +msgstr "imatge A" + +#: src/preferences.c:1454 +msgid "image B" +msgstr "imatge B" + +#: src/display_menus.h:48 src/preferences.c:1479 +msgid "Interrogation area's" +msgstr "Areas de interrogacio" + +#: src/display_menus.h:50 src/preferences.c:1504 +msgid "Velocity vectors" +msgstr "Fletches de velocitats" + +#: src/display_menus.h:51 src/pivpost_interface.c:810 src/preferences.c:1529 +msgid "Vorticity" +msgstr "Vorticitat" + +#: src/display_menus.h:52 src/pivpost_interface.c:851 src/preferences.c:1554 +msgid "Shear strain" +msgstr "Tensio shorn" + +#: src/display_menus.h:53 src/pivpost_interface.c:892 src/preferences.c:1575 +msgid "Normal strain" +msgstr "tensio normal" + +#: src/preferences.c:1603 +#, fuzzy +msgid "display" +msgstr "Enseignar" + +#: src/preferences.c:1665 +msgid "Updates parameters and save as defaults" +msgstr "Actualitzar els parametres i guardar com defecte" + +#: src/preferences.c:1689 +msgid "Updates actual parameters, do not store as defaults" +msgstr "Actualitzar els parametres, no guardar com defecte" + +#: src/preferences.c:1715 +msgid "Close preferences window" +msgstr "Tancar finestre de preferencies" + +#: src/console_menus.h:60 src/console_menus.h:310 +msgid "show gpiv check-buttons" +msgstr "enseignes la barra gpiv" + +#: src/console_menus.h:68 src/console_menus.h:317 +msgid "show tabulator containing parameter settings" +msgstr "enseignes la taula que porten les parametres" + +#: src/console_menus.h:78 +#, fuzzy +msgid "Define settings of the application" +msgstr "vista la barra del gpiv" + +#: src/console_menus.h:93 src/console_menus.h:339 +msgid "show extended information in a small pop-up window" +msgstr "enseignes informacio llarga en un finestre petita pop-up" + +#: src/console_menus.h:100 src/console_menus.h:345 +msgid "manual" +msgstr "manual" + +#: src/console_menus.h:129 +msgid "Open" +msgstr "Obrir" + +#: src/console_menus.h:129 +msgid "Open a PIV image or data-file" +msgstr "Obres un imatge PIV o un fiche de dades" + +#: src/console_menus.h:135 +msgid "Save" +msgstr "Guardar" + +#: src/console_menus.h:135 +#, fuzzy +msgid "Save data" +msgstr "Guardar dades" + +#: src/console_menus.h:141 +msgid "Execute" +msgstr "Executar" + +#: src/console_menus.h:141 +msgid "Execute the enabled chain process(es)" +msgstr "Executar els procesos de cadena connectat" + +#: src/console_menus.h:147 +msgid "Stop" +msgstr "" + +#: src/console_menus.h:147 +#, fuzzy +msgid "Cancels all running processes" +msgstr "Executar totes proceses marcat" + +#: src/console_menus.h:153 +#, fuzzy +msgid "Close" +msgstr "Cruade" + +#: src/console_menus.h:153 +msgid "" +"Close active buffer(s).\n" +"A warning message will be issued for unsaved data" +msgstr "" + +#: src/console_menus.h:161 +msgid "Exit" +msgstr "Surt" + +#: src/console_menus.h:161 +msgid "" +"Exit gpiv. \n" +"A warning message will be issued for unsaved data" +msgstr "" + +#: src/console_interface.c:626 src/console_menus.h:178 +msgid "" +"Enables PIV for chain processing: analysing of a PIV image (pair), resulting " +"into the mean displacements of the particle images within each interrogation " +"area. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Conectes el proces PIV: la analyse d'una imatge(pareilla) que resulteras en " +"el diplacement mitjana dels particules en un area d'interrogacio.\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:674 src/console_menus.h:189 +msgid "" +"Enables gradient for chain processing: Disables velocities with gradients " +"larger than 0.05 over the interrogation area. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Conectes gradient en el proces cadena: disconnectar velocitats que son mes " +"gran de 0.05 en al area de interrogacio.\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:768 src/console_menus.h:199 +#, fuzzy +msgid "" +"Enables validation for chain processing: detects outliers of PIV data by " +"testing on median residu or by Signal to Noise Ratio magnitudes and, " +"eventually, substitutes. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Conectes validacio en el proces cadena: trobar els outliers en PIV data per " +"examinar els resuals mediana o per magnitut de Signal / Soroll i, si es " +"possible, substituir.\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:720 src/console_menus.h:210 +msgid "" +"Enables residu statistics for chain processing: calculates the residus of " +"displacements for detection of outliers and shows an histogram of them. The " +"histogram will be displayed in the Piv Validation tab. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Conectes residu en el proces cadena: la calculacio dels residuals dels " +"displacements per trobar outliers i enseignar un histogram. \n" +"El histogram sera enseignat en la taula Piv Validacio.\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:815 src/console_menus.h:221 +msgid "" +"Enables peak-lock for chain processing: shows an histogram of sub-pixel " +"displacements in order to check on peak-locking effects. The histogram will " +"be displayed in the Piv Validation tab. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Conectes peaklock en el proces cadena: enseignes una histograma dels " +"displacements en nivell sub-pixel\n" +"per examinar effectes de peak-locking. El histogram sera enseignat en la " +"taula Piv Validacio\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:848 src/console_menus.h:231 +#: src/pivpost_interface.c:443 +#, fuzzy +msgid "scale" +msgstr "scala zoom" + +#: src/console_menus.h:232 +#, fuzzy +msgid "" +"Enables scale for chain processing: scales spatial displacements from all " +"data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Conectes treure en el proces cadena: treus el displacement mitja espacial " +"des de totes les dades.\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:906 src/console_menus.h:242 +msgid "" +"Enables average for chain processing: Calculates spatial average " +"displacements over all data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Conectes mitja en el proces cadena: Calculacio dels displacemts mitja " +"espacial utilizant totes les dades\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:952 src/console_menus.h:252 +msgid "" +"Enables substract for chain processing: substracts spatial average " +"displacements from all data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Conectes treure en el proces cadena: treus el displacement mitja espacial " +"des de totes les dades.\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:998 src/console_menus.h:262 +msgid "" +"Enables vorticity for chain processing: calculates vorticity or strain " +"magnitudes from a velocity field.\n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Conectes vorticitat en el proces cadena: calculacio de vorticitat o tensio " +"shorn\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:215 +msgid "gpiv" +msgstr "gpiv" + +#: src/console_interface.c:861 +#, fuzzy +msgid "" +"Enables scaling for chain processing: scales spatial displacements over all " +"data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Conectes mitja en el proces cadena: Calculacio dels displacemts mitja " +"espacial utilizant totes les dades\n" +"El proces sera executat per empretar el boto d'Executacio" + +#: src/console_interface.c:1067 +msgid "Image Info" +msgstr "Informacio d'imatge" + +#: src/console_interface.c:1085 +#, fuzzy +msgid "Evaluation" +msgstr "Piv validacio" + +#: src/console_interface.c:1135 +#, fuzzy +msgid "Validation" +msgstr "Piv validacio" + +#. gtk_object_set_data(GTK_OBJECT(gpiv->console), +#. "gpiv", +#. gpiv); +#: src/console_interface.c:1216 +#, fuzzy +msgid "Post processing" +msgstr "Piv: post procesing dels dades" + +#: src/console_interface.c:1293 +msgid "buffer names and numbers" +msgstr "noms i numeros dels buffers" + +#: src/console_interface.c:1371 +msgid "buffer list" +msgstr "llista del buffer" + +#: src/console_interface.c:1392 +msgid "#" +msgstr "#" + +#: src/console_interface.c:1404 +msgid "buffer name" +msgstr "nom del buffer" + +#. GtkWidget *about; +#. Title: +#. VersioN: +#. Copyright +#: src/console_interface.c:1524 +msgid "Copyright G. Van der Graaf" +msgstr "Copyright G. Van der Graaf" + +#. Author(s): +#. Comments: +#: src/console_interface.c:1526 +msgid "" +"gpiv is a program for (Digital) Particle Image Velocimetry. It evaluates " +"images (pairs), resulting into a velocity field of a fluid flow. The program " +"includes validation of the velocities and allows to post-proces the data " +"resulting into derivatives of the flow." +msgstr "" +"gpiv es un programa per (Digital) Particle Image Velocimetry. Es pot " +"analitzar (pareilles de) imatges que resulten en un camp de velocitats del " +"flux d'un fluid. El programa inclous algoritmes de validacio i post-procesar " +"per a obtenir derivitats del camp de flux." + +#: src/console_interface.c:1585 +msgid "" +"There are unsaved data that will be lost.\n" +"Are you sure you want to quit?" +msgstr "" + +#: src/console_interface.c:1680 +msgid "gpiv message" +msgstr "mesatge gpiv" + +#: src/console_interface.c:1754 +msgid "gpiv error" +msgstr "falla gpiv" + +#: src/console.c:334 src/console.c:350 +#, fuzzy +msgid "this is a demo!" +msgstr "Aixo es un demo sense licenci" + +#: src/console.c:474 +msgid "gpiv_fcreate_hdf5_image: unable to create file" +msgstr "" + +#: src/console.c:595 +#, fuzzy +msgid "Failure opening image header for output" +msgstr "He fallat obrir %s per input" + +#: src/console.c:607 +#, fuzzy +msgid "Failure opening parameter file for output" +msgstr "He fallat obrir %s per input" + +#: src/console.c:628 src/console.c:638 +msgid "Failure calling gpiv_fwrite_pivdata" +msgstr "He fallat a cridar piv_fwrite_scdata" + +#: src/console.c:666 src/console.c:688 src/console.c:710 +msgid "Failure calling gpiv_fwrite_scdata" +msgstr "He fallat a cridar gpiv_fwrite_scdata" + +#: src/console.c:842 +msgid "" +"There are unsaved data that will be lost.\n" +"Are you sure you want to close buffer #" +msgstr "" + +#: src/console.c:844 +msgid "?" +msgstr "" + +#. +#. * Create a new file selection widget +#. * Connect the ok_button and cancel_button to file_ok_sel function +#. * Set a default filename +#. * set user data "gpiv" to filew +#. +#: src/console.c:988 +msgid "File selection" +msgstr "Selectio fiche" + +#: src/console.c:1121 +#, fuzzy +msgid "Opens image/PIV data (and display)" +msgstr "Obrir imatge/piv-dades (i finestre d'enseignar)" + +#: src/console.c:1132 +msgid "Saves data" +msgstr "Guardar dades" + +#: src/console.c:1143 +msgid "Executes all tickmarked processes" +msgstr "Executar totes proceses marcat" + +#: src/console.c:1154 +msgid "Cancels any running processes" +msgstr "" + +#: src/console.c:1165 +msgid "Close active buffer(s)" +msgstr "" + +#: src/console.c:1175 +msgid "Exits gpiv" +msgstr "Surt gpiv" + +#: src/console.c:1531 +msgid "load_buffer:: non-valid file name" +msgstr "" + +#: src/console.c:1667 +#, c-format +msgid "" +"Image dimensions (%dx%d) differ from \n" +"parameter settings (%dx%d" +msgstr "" + +#: src/console.c:1678 src/console.c:1725 +msgid "" +"cross correlation parameter from image \n" +"not in agreement with gpiv setting" +msgstr "" + +#: src/console.c:1688 +msgid "file contains no image data" +msgstr "" + +#: src/console.c:1710 +#, c-format +msgid "" +"Image dimensions (%dx%d) differ from \n" +"parameter settings (%dx%d)" +msgstr "" + +#: src/console.c:1739 +msgid "failure reading image" +msgstr "" + +#: src/console.c:1763 +#, c-format +msgid "%s: Failure calling gpiv_count_pivdata\n" +msgstr "He fallat per cridar gpiv_count_pivdata\n" + +#: src/console.c:1775 +#, c-format +msgid "%s: Failure calling fread_pivdata\n" +msgstr "He fallat per cridar fread_pivdata\n" + +#: src/imgh_interface.c:67 +msgid "Image Header Info" +msgstr "Imatge cap informacio" + +#: src/imgh_interface.c:166 +#, fuzzy +msgid "buffer #: " +msgstr "nom del buffer" + +#: src/imgh_interface.c:215 +msgid "name: " +msgstr "nom" + +#. viewport_imgh +#. +#. * label for ncols +#. +#: src/imgh_interface.c:264 +msgid "number of columns: " +msgstr "quantitat del colons" + +#. +#. * label for nrows +#. +#: src/imgh_interface.c:306 +msgid "number of rows: " +msgstr "quantitat del lineas" + +#. +#. * spinner for spatial scale "sscale" +#. +#: src/imgh_interface.c:350 src/pivpost_interface.c:185 +msgid "spatial scale (mm/px): " +msgstr "scala espacial" + +#. +#. * spinner for time scale "tscale" +#. +#: src/imgh_interface.c:414 src/pivpost_interface.c:249 +#, fuzzy +msgid "time scale (ms): " +msgstr "scala temporal" + +#. +#. * spinner for column position +#. +#: src/imgh_interface.c:493 +#, fuzzy +msgid "position of column #0 (m): " +msgstr "positio del colon #0 (mm): " + +#. +#. * spinner for row position +#. +#: src/imgh_interface.c:558 +#, fuzzy +msgid "position of row #0 (m): " +msgstr "positio del linea #0 (mm): " + +#. +#. * entry for project +#. +#: src/imgh_interface.c:622 +#, fuzzy +msgid "Project: " +msgstr "Project" + +#. +#. * entry for creation date +#. +#: src/imgh_interface.c:675 +#, fuzzy +msgid "Creation date: " +msgstr "data de creacio" + +#. +#. * entry for location +#. +#: src/imgh_interface.c:730 +#, fuzzy +msgid "Place: " +msgstr "Lloc" + +#. +#. * entry for comment +#. +#: src/imgh_interface.c:785 +#, fuzzy +msgid "Comment: " +msgstr "Comentari" + +#: src/piveval_interface.c:64 +#, fuzzy +msgid "Piv: image evaluation" +msgstr "Piv: validacio de dades" + +#: src/piveval_interface.c:165 +msgid "first col:" +msgstr "primer col:" + +#: src/piveval_interface.c:185 +msgid "last col:" +msgstr "ultim col:" + +#: src/piveval_interface.c:205 +msgid "pre-shift col:" +msgstr "pre-displacement col:" + +#: src/piveval_interface.c:225 +msgid "first row:" +msgstr "primer linea" + +#: src/piveval_interface.c:245 +msgid "last row:" +msgstr "ultim linea" + +#: src/piveval_interface.c:265 +msgid "pre-shift row:" +msgstr "pre-diplacement linea" + +#: src/piveval_interface.c:574 +msgid "Int Size 1" +msgstr "Mida Int 1" + +#: src/display_menus.h:91 src/piveval_interface.c:765 +#: src/piveval_interface.c:993 src/piveval_interface.c:1230 +msgid "128" +msgstr "128" + +#. +#. * radio buttons for interrogation size 2 +#. +#: src/piveval_interface.c:800 +msgid "Int Size 2" +msgstr "Mida int 2" + +#. +#. * radio buttons for shifted distance of interrogation areas +#. +#: src/piveval_interface.c:1028 +msgid "Shift" +msgstr "Displacement" + +#. +#. * radio button for mouse selecting +#. +#: src/piveval_interface.c:1265 +msgid "Mouse select" +msgstr "Seleccio ratoli" + +#: src/piveval_interface.c:1298 src/piveval_interface.c:1598 +#: src/pivvalid_interface.c:182 +msgid "None" +msgstr "Cap" + +#: src/piveval_interface.c:1336 +msgid "Area" +msgstr "Area" + +#: src/piveval_interface.c:1374 +msgid "Single int." +msgstr "Sol int." + +#: src/piveval_interface.c:1412 +msgid "Single point" +msgstr "Sol punt" + +#: src/piveval_interface.c:1450 +msgid "Drag int." +msgstr "tira int." + +#: src/piveval_interface.c:1488 +msgid "Vert. Line" +msgstr "" + +#: src/piveval_interface.c:1526 +msgid "Hor. Line" +msgstr "" + +#. +#. * radio buttons for sub-pixel interpolation scheme +#. +#: src/piveval_interface.c:1565 +msgid "Interpolation scheme" +msgstr "Schema de interpolacio" + +#: src/piveval_interface.c:1631 +msgid "Gauss" +msgstr "Gauss" + +#: src/piveval_interface.c:1665 +msgid "Power" +msgstr "Power" + +#: src/piveval_interface.c:1699 +msgid "Gravity" +msgstr "Gravitat" + +#. eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, +#. _("Marquardt")); +#. eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); +#. gtk_widget_ref (eval->radiobutton_fit_marquardt); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "radiobutton_fit_marquardt", +#. eval->radiobutton_fit_marquardt, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->radiobutton_fit_marquardt); +#. gtk_box_pack_start (GTK_BOX (eval->vbox10), +#. eval->radiobutton_fit_marquardt, +#. FALSE, +#. FALSE, +#. 0); +#. gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "ifit", +#. "4"); +#. gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_marquardt), +#. "eval", +#. eval); +#. gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "var_type", +#. "0"); +#. gtk_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "toggled", +#. GTK_SIGNAL_FUNC (on_toggle_piv), +#. NULL); +#. +#. * radio buttons for correlation peak number to be detected +#. +#: src/piveval_interface.c:1765 +msgid "Peak #" +msgstr "Cim #" + +#: src/piveval_interface.c:1862 +msgid "3" +msgstr "3" + +#. +#. * additonal calculation schemes for correlation detection +#. +#: src/piveval_interface.c:1896 +msgid "Interrogation with:" +msgstr "Interrogacio amb:" + +#: src/piveval_interface.c:1928 +msgid "Weight Kernel" +msgstr "factor de pes" + +#: src/piveval_interface.c:1955 +msgid "Zero off-set" +msgstr "Displacement al zero" + +#: src/piveval_interface.c:1982 +#, fuzzy +msgid "Central diff." +msgstr "Central" + +#. +#. * radio buttons for cross-or auto correlation +#. +#: src/piveval_interface.c:2011 src/piveval_interface.c:2261 +msgid "Correlation" +msgstr "Correlacio" + +#: src/piveval_interface.c:2044 +msgid "Auto" +msgstr "Auto" + +#: src/piveval_interface.c:2077 +msgid "Cross" +msgstr "Cruade" + +#: src/piveval_interface.c:2113 +msgid "Interrogation areas and correlation" +msgstr "Areas de interrogacio i correlacio" + +#. +#. * drawing area interrogation area1 +#. +#: src/piveval_interface.c:2148 +msgid "Int. area 1" +msgstr "Area int. 1" + +#. gnome canvas interrogation area1 +#. gtk_widget_push_visual (gdk_imlib_get_visual ()); +#. gtk_widget_push_colormap (gdk_imlib_get_colormap ()); +#. eval->canvas_disprocess_int1 = gnome_canvas_new (); +#. gtk_widget_pop_colormap (); +#. gtk_widget_pop_visual (); +#. gtk_widget_ref (eval->canvas_disprocess_int1); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "canvas_disprocess_int1", +#. eval->canvas_disprocess_int1, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->canvas_disprocess_int1); +#. gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_int1 ), +#. eval->canvas_disprocess_int1); +#. --------- drawing area interrogation area2 +#: src/piveval_interface.c:2204 +msgid "Int. area 2" +msgstr "Area int 2" + +#. gtk_widget_push_visual (gdk_imlib_get_visual ()); +#. gtk_widget_push_colormap (gdk_imlib_get_colormap ()); +#. eval->canvas_disprocess_cov = gnome_canvas_new (); +#. gtk_widget_pop_colormap (); +#. gtk_widget_pop_visual (); +#. gtk_widget_ref (eval->canvas_disprocess_cov); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "canvas_disprocess_cov", +#. eval->canvas_disprocess_cov, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->canvas_disprocess_cov); +#. gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_cov), +#. eval->canvas_disprocess_cov); +#. gnome canvas display values +#: src/piveval_interface.c:2316 +msgid "Estimator" +msgstr "Estimacio" + +#: src/piveval_interface.c:2353 +msgid "Display" +msgstr "Enseignar" + +#: src/piveval_interface.c:2411 +msgid "" +"analyses a PIV image (pair) resulting into mean displacements of the " +"particle images within the interrogation areas" +msgstr "" +"Evaluacio d'un (pareilla de) imatge que resulteras en el displacement " +"mitjana dels partikles en un area de interrogacio" + +#: src/piveval.c:86 src/pivvalid.c:82 +msgid "No mouse activity within displayer" +msgstr "Cap activitat del ratoli en el finestre d'enseignar" + +#: src/piveval.c:96 +msgid "Selects an area within the image to be analyzed" +msgstr "Tria un area en el imatge per analitzar" + +#: src/piveval.c:106 +msgid "" +"Piv evaluation at a single interrogation area. Conserves other existing data" +msgstr "PIV evaluacio en un sol area d'interrogacio. Guarde les altres dades" + +#: src/piveval.c:117 +msgid "" +"Piv evaluation at a single point in the image. Rejects all existing data!!" +msgstr "Piv evaluacio en un sol punt. Perd totes les dades que existen" + +#: src/piveval.c:128 +msgid "Displaces a single interrogation area and analyzes" +msgstr "Displacar un sol area d'interrogacio i analitzeras" + +#: src/piveval.c:138 +msgid "Evaluation at a vertical line. " +msgstr "" + +#: src/piveval.c:148 +msgid "Evaluation at a horizontal line. " +msgstr "" + +#: src/piveval.c:652 +msgid "Displays subimages, correlation image and cov. peak location" +msgstr "Enseinar sub-imatges, correlacio i locacio del cor. cim" + +#: src/piveval.c:731 +msgid "Analyses a PIV image (pair)" +msgstr "Analitzes un (pareille d')imatge PIV" + +#: src/piveval.c:803 +#, c-format +msgid "Failure calling gpiv_count_pivdata for %s" +msgstr "He fallat per cridar gpiv_count_pivdata for %s" + +#: src/piveval.c:840 +#, c-format +msgid "Failure calling gpiv_fread_pivdata for %s" +msgstr "He fallat per cridar gpiv_fread_pivdata for %s" + +#: src/piveval.c:965 +#, fuzzy +msgid "At first, open an image. Than we'll further see what will happen." +msgstr "Per commencar, obres un imatge. Despres ja veurem que passera" + +#: src/pivvalid_interface.c:61 +msgid "Piv: data validation" +msgstr "Piv: validacio de dades" + +#. +#. * Enable / Disable frame +#. +#: src/pivvalid_interface.c:146 +msgid "Disable data" +msgstr "Disconectar dades" + +#: src/pivvalid_interface.c:224 +msgid "Enable point" +msgstr "Conectar un sol punt" + +#: src/pivvalid_interface.c:263 +msgid "Disable point" +msgstr "Desconectar un sol punt" + +#: src/pivvalid_interface.c:302 +msgid "Enable area" +msgstr "Conectar un area" + +#: src/pivvalid_interface.c:341 +msgid "Disable area" +msgstr "Desconectar un area" + +#: src/pivvalid_interface.c:382 +msgid "validate on velocity gradient " +msgstr "validacio del gradient de velocitat" + +#: src/pivvalid_interface.c:402 +msgid "" +"Disables PIV data that have a too large velocity gradient over the " +"Interrogation Area" +msgstr "" +"Disconecte les dades PIV que tenen un gradient de velocitat mes gran que " +"0.05 en el area de interrogacio." + +#. +#. * Frame for histogram of sub-pixel values (used to test on peak-locking +#. * effect) +#. +#: src/pivvalid_interface.c:430 +msgid "Peak locking" +msgstr "Peak locking" + +#: src/pivvalid_interface.c:481 +msgid "# bins: " +msgstr "# barres" + +#: src/pivvalid_interface.c:573 +msgid "residu statistics" +msgstr "statist. dels residus" + +#: src/pivvalid_interface.c:587 +msgid "calculates residus of displacements and displays in a histogram" +msgstr "Calculacio dels residus dels diplacements i enseignar en un histogram" + +#: src/pivvalid_interface.c:609 +msgid "peak lock" +msgstr "peak lock" + +#: src/pivvalid_interface.c:623 +msgid "" +"shows histogram of sub-pixel displacements in order to check on peak-locking " +"effects" +msgstr "" +"Enseignes el histogram dels displacements en nivell sub-pixel per examinar " +"els effectes de peak locking" + +#. +#. * Errvec frame +#. +#: src/pivvalid_interface.c:649 +msgid "Outliers" +msgstr "Outliers" + +#: src/pivvalid_interface.c:683 +msgid "Residu type:" +msgstr "Type del residu" + +#: src/pivvalid_interface.c:715 +msgid "Snr" +msgstr "Snr" + +#: src/pivvalid_interface.c:760 src/pivvalid_interface.c:1057 +msgid "Median" +msgstr "Mediana" + +#: src/pivvalid_interface.c:826 +msgid "Data yield: " +msgstr "" + +#: src/pivvalid_interface.c:891 +msgid "Threshold: " +msgstr "Llindar" + +#: src/pivvalid_interface.c:941 +msgid "show values" +msgstr "enseignar magnituds" + +#. +#. * Radio buttons for substitution type +#. +#: src/pivvalid_interface.c:980 +msgid "Substituted by:" +msgstr "Substituir per:" + +#: src/pivvalid_interface.c:1012 +msgid "Mean of surroundings" +msgstr "Mitja dels veins" + +#: src/pivvalid_interface.c:1101 +msgid "Next highest cov. peak" +msgstr "Proxima cim mes alt" + +#: src/pivvalid_interface.c:1145 +msgid "validate on outliers" +msgstr "validar de outliers" + +#: src/pivvalid_interface.c:1159 +msgid "substitutes outliers" +msgstr "substituir outliers" + +#: src/pivvalid.c:45 +msgid "Examines PIV data on velocity gradients" +msgstr "Examinar dades de PIV per gradient de velocitats" + +#: src/pivvalid.c:92 +#, fuzzy +msgid "Enables a single PIV data-point" +msgstr "Disconectes un sol punt de dades PIV" + +#: src/pivvalid.c:102 +msgid "Disables a single PIV data-point" +msgstr "Disconectes un sol punt de dades PIV" + +#: src/pivvalid.c:112 +#, fuzzy +msgid "Enables an area containing PIV data" +msgstr "Disconnectes un area de dades PIV" + +#: src/pivvalid.c:122 +msgid "Disables an area containing PIV data" +msgstr "Disconnectes un area de dades PIV" + +#: src/pivvalid.c:139 +msgid "Defines residu type to examine data on" +msgstr "Definicio de tipo residu per eaxaminar dades de PIV" + +#: src/pivvalid.c:165 +#, fuzzy +msgid "Displays inverse cumulative histogram of residus" +msgstr "Enseignes el (cum?) histogram de residuals" + +#: src/pivvalid.c:227 +msgid "Display PIV vector colors related to residu or SNR value" +msgstr "Enseignes els colors dels PIV fletches amb relacio del residu o SNR" + +#: src/pivvalid.c:251 +msgid "Defines how to substitute the data" +msgstr "Defines com s'ha de substituir les dades" + +#: src/pivvalid.c:279 +msgid "Examines PIV data on outliers and substitutes" +msgstr "Examinar les dades PIV als outliers i substitueix" + +#: src/pivvalid.c:324 +msgid "Calculates a histogram of sub-pixel displacements" +msgstr "Calular el histogram dels displacements en nivell sub-pixel" + +#: src/pivpost.c:322 src/pivpost.c:414 src/pivpost.c:531 src/pivpost.c:671 +#: src/pivvalid.c:375 src/pivvalid.c:570 src/pivvalid.c:657 +msgid "no PIV data" +msgstr "No n'hi ha PIV data (ni cap)" + +#: src/pivpost_interface.c:62 +msgid "Piv: data post processing" +msgstr "Piv: post procesing dels dades" + +#. +#. * Scale frame +#. +#. +#. * Spinners use the adjustment from spinbutton_adj_imgh_* +#. +#: src/pivpost_interface.c:149 +msgid "Scaling" +msgstr "Scala" + +#. +#. * spinner for column position +#. +#: src/pivpost_interface.c:314 +#, fuzzy +msgid "pos. of col #0 (m): " +msgstr "positio del colon #0 (mm): " + +#. +#. * spinner for row position +#. +#: src/pivpost_interface.c:380 +#, fuzzy +msgid "pos. of row #0 (m): " +msgstr "positio del linea #0 (mm): " + +#: src/pivpost_interface.c:462 +#, fuzzy +msgid "" +"Calculates time and spatial scaled particle displacements (i.e. velocities) " +"from a PIV displacement field, and their scaled positions" +msgstr "" +"Calculacio dels displacements mitjana dels particules o velocidades d'un " +"camp de velocitat, adquirit dels dades PIV" + +#. +#. * Spatial average frame +#. +#: src/pivpost_interface.c:489 +msgid "Spatial statistics" +msgstr "Statistices espacial" + +#. +#. *spinner for spatial U-avg +#. +#: src/pivpost_interface.c:525 +#, fuzzy +msgid "dx (px), U (m/s): " +msgstr "dx (px), U (mm/s): " + +#. +#. * KEEP DISABLED +#. +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "post", post); +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "var_type", "3"); +#. gtk_signal_connect(GTK_OBJECT(post->spinbutton_suavg), +#. "changed", +#. on_spinbutton_post_suavg, +#. post->spinbutton_suavg); +#. +#. * end of KEEP DISABLED +#. +#. +#. * spinner for spatial V-avg +#. +#: src/pivpost_interface.c:593 +#, fuzzy +msgid "dy (px), V (m/s): " +msgstr "dy (px), V (mm/s): " + +#. +#. * KEEP DISABLED +#. +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_svavg), +#. "var_type", "3"); +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "post", post); +#. gtk_signal_connect(GTK_OBJECT(post->spinbutton_svavg), +#. "changed", +#. on_spinbutton_post_svavg, +#. post->spinbutton_svavg); +#. +#. * end of KEEP DISABLED +#. +#. +#. * button to calculate averages +#. +#: src/pivpost_interface.c:660 +msgid "avarage" +msgstr "mitja" + +#: src/pivpost_interface.c:678 +msgid "" +"Calculates spatial average particle displacements or velocities from a " +"velocity field, obtained from PIV data" +msgstr "" +"Calculacio dels displacements mitjana dels particules o velocidades d'un " +"camp de velocitat, adquirit dels dades PIV" + +#: src/pivpost_interface.c:721 +msgid "" +"Substracts the spatial averages, or values that have been entered manually, " +"from each estimator" +msgstr "" +"Treus la mitjana espacial, o un quantitat posat manual, de tots estimators" + +#. +#. * Vorstra frame +#. +#: src/pivpost_interface.c:745 +msgid "Vorticity & strain" +msgstr "Voricitat i shorn" + +#: src/pivpost_interface.c:778 +msgid "Output:" +msgstr "Result:" + +#: src/pivpost_interface.c:930 +msgid "Differential scheme:" +msgstr "Schema diferential" + +#: src/pivpost_interface.c:964 +msgid "Central" +msgstr "Central" + +#: src/pivpost_interface.c:1005 +msgid "Least squares" +msgstr "Least squares" + +#: src/pivpost_interface.c:1047 +msgid "Richardson" +msgstr "Richardson" + +#: src/pivpost_interface.c:1097 +msgid "Circulation method" +msgstr "Metode circulacio" + +#: src/pivpost_interface.c:1195 +msgid "" +"Calculates vorticity or strain magnitudes from a velocity field, obtained by " +"PIV" +msgstr "" +"Calculacio de vorticitat o magnitut de tensio obtingut d'un camp de " +"velocitats amb PIV" + +#: src/pivpost.c:100 +#, fuzzy +msgid "Calculates scaled locations and velocities" +msgstr "Enseignar llocs i velocitats en scala" + +#: src/pivpost.c:137 +msgid "Calculates spatial average displacements" +msgstr "Calcular la mitja espacial" + +#: src/pivpost.c:173 +msgid "Substracts mean displacements from PIV data" +msgstr "Treus la displacement mitjana des de les dades PIV" + +#: src/pivpost.c:209 +msgid "Selects the differential quantity" +msgstr "Selectar la quantitat diferential" + +#: src/pivpost.c:244 +msgid "Selects the type of differential scheme" +msgstr "Selectes el tipo de schema diferential " + +#: src/pivpost.c:265 +msgid "Calculates differential quantity" +msgstr "Calcules la quantitat diferential" + +#: src/pivpost.c:666 +msgid "non valid vorstra operation" +msgstr "operacio prohibit per vorstra" + +#: src/display_menus.h:42 +#, fuzzy +msgid "Stretch display window" +msgstr "enllargar finestre d'enseignar" + +#: src/display_menus.h:43 +#, fuzzy +msgid "Stretch or fit display window to the image area" +msgstr "enllargar finestre d'enseignar fins a les mides del area d'imatge" + +#: src/display_menus.h:46 +msgid "Image A" +msgstr "Imatge A" + +#: src/display_menus.h:47 +msgid "Image B" +msgstr "Imatge B" + +#: src/display_menus.h:93 +msgid "256" +msgstr "256" + +#: src/display_menus.h:115 +msgid "Zoom in/out" +msgstr "Zoom in/out" + +#: src/display_menus.h:116 +msgid "Vector scale" +msgstr "Scala fletche" + +#: src/display.c:1056 +#, fuzzy +msgid "no image or piv data" +msgstr "Obres un imatge PIV o un fiche de dades" + +#, fuzzy +#~ msgid "view the menu bar of the application" +#~ msgstr "vista la barra dels menus" + +#, fuzzy +#~ msgid "view the tool buttons of the application" +#~ msgstr "vista la barra dels eines" + +#~ msgid "menubar" +#~ msgstr "Barre menus" + +#~ msgid "tool buttons" +#~ msgstr "barre eines" + +#~ msgid "interface" +#~ msgstr "interface" + +#~ msgid "Save File(s)" +#~ msgstr "Guarda fiche(s)" + +#~ msgid "Exit gpiv" +#~ msgstr "Surt gpiv" + +#~ msgid "Aren't you sure you don't want to quit?" +#~ msgstr "No estas segur que no vols sortir? (segur que ets!)" + +#~ msgid "menu bar" +#~ msgstr "barra dels menus" + +#~ msgid "show menu bar" +#~ msgstr "enseignes la barra dels menus" + +#~ msgid "show tool button bar" +#~ msgstr "enseignes la barra dels eines" + +#~ msgid "Adaptive Inter." +#~ msgstr "Int. adaptacio" + +#~ msgid "Apply" +#~ msgstr "Executar" + +#~ msgid "0.6" +#~ msgstr "0.6" + +#~ msgid "viewer" +#~ msgstr "finestre d'eneignement" + +#~ msgid "" +#~ "Enables a single PIV data-point to be used for further validating and " +#~ "post processing" +#~ msgstr "Conectes un sol punt de dades PIV per a validar i post processar" + +#~ msgid "Enables an area containing PIV data to be used" +#~ msgstr "Conectes un area de dades PIV per utilitzar a processar" + +#~ msgid "not connected, yet" +#~ msgstr "Encara no esta connectat" + +#~ msgid "Image processing" +#~ msgstr "Procesar imatge" + +#~ msgid "Image Proc" +#~ msgstr "Imatge proc" + +#~ msgid "Piv: image analysis" +#~ msgstr "Piv: imatge analysis" + +#~ msgid "Piv analysis" +#~ msgstr "Analysis piv" + +#~ msgid "Piv Post" +#~ msgstr "Piv Post" + +#~ msgid "" +#~ "Disables a single data point that will not be usedfor further validating " +#~ "and post processing" +#~ msgstr "" +#~ "Desconectar un sol punt que no sera utilitzat per validacio o post " +#~ "procesar" diff --git a/po/de.gmo b/po/de.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ec0663e90be05d7b606bd11a1cee967331882b6e GIT binary patch literal 12185 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 literal 0 HcwPel00001 diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..976fb5c --- /dev/null +++ b/po/de.po @@ -0,0 +1,1607 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-06-17 19:04+0200\n" +"PO-Revision-Date: 2002-12-11-09:35+0100\n" +"Last-Translator: Gerber \n" +"Language-Team: GERMAN \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:85 +#, fuzzy +msgid "number of bins for histograms" +msgstr "anzahl Zeule der histogram" + +#: src/main.c:85 +msgid "BINS" +msgstr "Zeule" + +#: src/main.c:88 +#, fuzzy +msgid "number of columns in image" +msgstr "Anzahl des Zuele:" + +#: src/main.c:88 +msgid "NCOLUMNS" +msgstr "" + +#: src/main.c:91 +#, fuzzy +msgid "number of rows in image" +msgstr "Anzahl de Regeln:" + +#: src/main.c:91 +msgid "NROWS" +msgstr "" + +#: src/main.c:94 +#, fuzzy +msgid "enables displaying of the first image of a PIV image pair" +msgstr "Anschluss des Zeigen der shear strain Angabe" + +#: src/main.c:98 +#, fuzzy +msgid "enables displaying of the second image of a PIV image pair" +msgstr "Anschluss des Zeigen von die PIV Angabe" + +#: src/main.c:102 +msgid "enables displaying of interrogation regions" +msgstr "Anschluss des Zeigen von dem interrogation regions" + +#: src/main.c:105 +msgid "enables displaying of PIV data" +msgstr "Anschluss des Zeigen von die PIV Angabe" + +#: src/main.c:108 +#, fuzzy +msgid "enables displaying of vorticity data" +msgstr "Anschluss des Zeigen der vorticiteits Angabe" + +#: src/main.c:111 +msgid "enables displaying of shear strain data" +msgstr "Anschluss des Zeigen der shear strain Angabe" + +#: src/main.c:114 +msgid "enables displaying of normal strain data" +msgstr "Anschluss des Zeigen der Druck Angabe" + +#: src/main.c:117 +msgid "save data in hdf5 format with .gpi extension" +msgstr "" + +#: src/main.c:119 +msgid "include image data in .gpi file (hdf5 format)" +msgstr "" + +#: src/main.c:122 +msgid "print parameters and other info to stdout" +msgstr "print die Parameters und alteres Infoation nach stdout" + +#: src/main.c:125 +msgid "includes piv in the chain-proces" +msgstr "einbegriffen von piv ins Kette bearbeitung" + +#: src/main.c:128 +msgid "includes gradient in the chain-proces" +msgstr "einbegriffen von gradient ins Kette bearbeitung" + +#: src/main.c:131 +msgid "includes resstats in the chain-proces" +msgstr "einbegriffen von resstats ins Kette bearbeitung" + +#: src/main.c:134 +msgid "includes validate in the chain-proces" +msgstr "einbegriffen von gelten ins Kette bearbeitung" + +#: src/main.c:137 +msgid "includes peaklock in the chain-proces" +msgstr "einbegriffen von peaklock ins Kette bearbeitung" + +#: src/main.c:140 +msgid "includes average in the chain-proces" +msgstr "einbegriffen von Durchschnitt ins Kette bearbeitung" + +#: src/main.c:143 +#, fuzzy +msgid "includes scaling in the chain-proces" +msgstr "einbegriffen von piv ins Kette bearbeitung" + +#: src/main.c:146 +msgid "includes substract in the chain-proces" +msgstr "einbegriffen von abziehen ins Kette bearbeitung" + +#: src/main.c:149 +#, fuzzy +msgid "includes vorticity in the chain-proces" +msgstr "einbegriffen von vorticity ins Kette bearbeitung" + +#: src/main.c:152 +#, fuzzy +msgid "display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0" +msgstr "Index des Zeigner zoom" + +#: src/main.c:153 src/main.c:156 +msgid "SCALE" +msgstr "Skala" + +#: src/main.c:156 +msgid "vector length scale" +msgstr "vector lange Skala" + +#: src/console_menus.h:92 src/console_menus.h:338 src/main.c:162 +msgid "show tooltips" +msgstr "Zeigt Gerattip" + +#: src/main.c:165 +#, fuzzy +msgid "view the gpiv buttons of the application" +msgstr "Ansicht Gpivleiste des Programm" + +#: src/main.c:168 +#, fuzzy +msgid "view the tabulator of the application" +msgstr "Sicht die Reiter des Programm an" + +#: src/main.c:576 +#, c-format +msgid "image width = %d image height = %d" +msgstr "" + +#: src/main.c:605 +#, c-format +msgid "Image dimensions are larger then the allowed maxima (%dx%d)." +msgstr "" + +#: src/support.c:125 src/support.c:163 +#, c-format +msgid "Couldn't find pixmap file: %s" +msgstr "" + +#: src/support.c:141 +#, c-format +msgid "Couldn't create pixmap from file: %s" +msgstr "Konnte kein pixmap vom Datei anmachen" + +#. _parented +#. gnome_dialog_new +#: src/console_menus.h:77 src/console_menus.h:324 src/preferences.c:144 +msgid "Preferences" +msgstr "Vorlieben" + +#: src/preferences.c:198 +msgid "View" +msgstr "Ansicht" + +#: src/console_menus.h:59 src/console_menus.h:309 src/preferences.c:230 +msgid "gpiv buttons" +msgstr "gpivleiste" + +#: src/console_menus.h:67 src/console_menus.h:316 src/preferences.c:259 +msgid "tabulator" +msgstr "Reiter" + +#. +#: src/preferences.c:288 +msgid "In/output" +msgstr "" + +#: src/preferences.c:318 +msgid "hdf5 format (.gpi)" +msgstr "" + +#: src/preferences.c:346 +msgid "include image in .gpi" +msgstr "" + +#: src/preferences.c:392 +msgid "img width: " +msgstr "" + +#: src/preferences.c:451 +msgid "img height: " +msgstr "" + +#. +#. * General; tooltips and histogram bins +#. +#: src/preferences.c:496 +msgid "tooltips" +msgstr "Gerattip" + +#: src/preferences.c:530 +msgid "processes" +msgstr "Bearbeitungen" + +#. +#. * PIV activating button +#. +#: src/console_interface.c:612 src/console_menus.h:177 +#: src/piveval_interface.c:2392 src/preferences.c:563 +msgid "piv" +msgstr "piv" + +#: src/console_interface.c:660 src/console_menus.h:188 src/preferences.c:593 +#, fuzzy +msgid "gradient" +msgstr "gradient" + +#: src/console_interface.c:706 src/console_menus.h:209 src/preferences.c:623 +msgid "residu stats" +msgstr "residu stats" + +#: src/console_interface.c:754 src/console_menus.h:198 src/preferences.c:653 +msgid "validate" +msgstr "gelten" + +#: src/console_interface.c:801 src/console_menus.h:220 src/preferences.c:683 +msgid "peaklock" +msgstr "Gipfeleinschluss" + +#: src/preferences.c:712 +#, fuzzy +msgid "scaling" +msgstr "Skalierung" + +#: src/console_interface.c:893 src/console_menus.h:241 src/preferences.c:742 +msgid "average" +msgstr "durchsnitt" + +#. +#. * button to substracts averages +#. +#: src/console_interface.c:938 src/console_menus.h:251 +#: src/pivpost_interface.c:702 src/preferences.c:772 +msgid "substract" +msgstr "abziehen" + +#: src/console_interface.c:984 src/console_menus.h:261 +#: src/pivpost_interface.c:1181 src/preferences.c:802 +#, fuzzy +msgid "vorticity" +msgstr "vortizitat" + +#: src/preferences.c:852 +msgid "number of histogram bins: " +msgstr "" + +#: src/preferences.c:895 +msgid "console" +msgstr "" + +#. +#. * Vector scale +#. +#: src/preferences.c:930 +msgid "vector scale" +msgstr "Vektor Skala" + +#: src/display_menus.h:77 src/piveval_interface.c:1796 src/preferences.c:964 +msgid "1" +msgstr "1" + +#: src/display_menus.h:71 src/display_menus.h:79 src/piveval_interface.c:1829 +#: src/preferences.c:997 +msgid "2" +msgstr "2" + +#: src/display_menus.h:81 src/preferences.c:1029 +msgid "4" +msgstr "4" + +#: src/display_menus.h:83 src/piveval_interface.c:1093 src/preferences.c:1061 +msgid "8" +msgstr "8" + +#: src/display_menus.h:85 src/piveval_interface.c:663 +#: src/piveval_interface.c:892 src/piveval_interface.c:1128 +#: src/preferences.c:1093 +msgid "16" +msgstr "16" + +#: src/display_menus.h:87 src/piveval_interface.c:697 +#: src/piveval_interface.c:926 src/piveval_interface.c:1162 +#: src/preferences.c:1122 +msgid "32" +msgstr "32" + +#: src/display_menus.h:89 src/piveval_interface.c:731 +#: src/piveval_interface.c:960 src/piveval_interface.c:1196 +#: src/preferences.c:1151 +msgid "64" +msgstr "64" + +#. +#. * Zoom scale +#. +#: src/preferences.c:1180 +msgid "zoom scale" +msgstr "" + +#: src/display_menus.h:61 src/preferences.c:1211 +msgid "0.5" +msgstr "0.5" + +#: src/display_menus.h:63 src/preferences.c:1242 +msgid "0.83" +msgstr "0.83" + +#: src/display_menus.h:65 src/preferences.c:1273 +msgid "1.0" +msgstr "1.0" + +#: src/display_menus.h:67 src/preferences.c:1304 +msgid "1.3" +msgstr "1.3" + +#: src/display_menus.h:69 src/preferences.c:1335 +msgid "1.6" +msgstr "1.6" + +#: src/preferences.c:1366 +msgid "2.0" +msgstr "2.0" + +#. +#. * Hide and display data +#. +#: src/preferences.c:1398 +msgid "hide/display data" +msgstr "verbergen/schauen Angabe" + +#: src/preferences.c:1429 +msgid "image A" +msgstr "Bild A" + +#: src/preferences.c:1454 +msgid "image B" +msgstr "Bild B" + +#: src/display_menus.h:48 src/preferences.c:1479 +msgid "Interrogation area's" +msgstr "Forschungsanflache" + +#: src/display_menus.h:50 src/preferences.c:1504 +msgid "Velocity vectors" +msgstr "Geschwindichkeitsvectoren" + +#: src/display_menus.h:51 src/pivpost_interface.c:810 src/preferences.c:1529 +msgid "Vorticity" +msgstr "Vortizitat" + +#: src/display_menus.h:52 src/pivpost_interface.c:851 src/preferences.c:1554 +msgid "Shear strain" +msgstr "" + +#: src/display_menus.h:53 src/pivpost_interface.c:892 src/preferences.c:1575 +msgid "Normal strain" +msgstr "" + +#: src/preferences.c:1603 +#, fuzzy +msgid "display" +msgstr "Zeigner" + +#: src/preferences.c:1665 +msgid "Updates parameters and save as defaults" +msgstr "" + +#: src/preferences.c:1689 +msgid "Updates actual parameters, do not store as defaults" +msgstr "" + +#: src/preferences.c:1715 +msgid "Close preferences window" +msgstr "" + +#: src/console_menus.h:60 src/console_menus.h:310 +msgid "show gpiv check-buttons" +msgstr "zeigt Gpivleiste" + +#: src/console_menus.h:68 src/console_menus.h:317 +msgid "show tabulator containing parameter settings" +msgstr "zeigt Reiter mit parameter einstelungen" + +#: src/console_menus.h:78 +#, fuzzy +msgid "Define settings of the application" +msgstr "Ansicht Gpivleiste des Programm" + +#: src/console_menus.h:93 src/console_menus.h:339 +msgid "show extended information in a small pop-up window" +msgstr "Zeigt ausgebreited Information in ein kleines pop-up Fenster" + +#: src/console_menus.h:100 src/console_menus.h:345 +msgid "manual" +msgstr "Handleitung" + +#: src/console_menus.h:129 +msgid "Open" +msgstr "Offnen" + +#: src/console_menus.h:129 +msgid "Open a PIV image or data-file" +msgstr "Offnet ein PIV Bild oder Angabe Datei" + +#: src/console_menus.h:135 +msgid "Save" +msgstr "Speichern" + +#: src/console_menus.h:135 +#, fuzzy +msgid "Save data" +msgstr "Daten speichern" + +#: src/console_menus.h:141 +msgid "Execute" +msgstr "Ausfuhren" + +#: src/console_menus.h:141 +msgid "Execute the enabled chain process(es)" +msgstr "Ausfuhren der Kettebearbeitung" + +#: src/console_menus.h:147 +msgid "Stop" +msgstr "" + +#: src/console_menus.h:147 +#, fuzzy +msgid "Cancels all running processes" +msgstr "Ausfuhrung von Kettebearbeitun" + +# Kreuz +#: src/console_menus.h:153 +#, fuzzy +msgid "Close" +msgstr "Kreuz" + +#: src/console_menus.h:153 +msgid "" +"Close active buffer(s).\n" +"A warning message will be issued for unsaved data" +msgstr "" + +#: src/console_menus.h:161 +msgid "Exit" +msgstr "Beenden" + +#: src/console_menus.h:161 +msgid "" +"Exit gpiv. \n" +"A warning message will be issued for unsaved data" +msgstr "" + +#: src/console_interface.c:626 src/console_menus.h:178 +msgid "" +"Enables PIV for chain processing: analysing of a PIV image (pair), resulting " +"into the mean displacements of the particle images within each interrogation " +"area. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Schlusst PIV an fur die Kettebearbeitung: die Analyse eines PIV Bild(paar) " +"welche ein durchshnitt der Versetzung der Partikeln in einer Forschungsarea " +"liefern soll.\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:674 src/console_menus.h:189 +msgid "" +"Enables gradient for chain processing: Disables velocities with gradients " +"larger than 0.05 over the interrogation area. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Schlusst gradient an fur die Kettebearbeitung: Macht Geschwindichkeisangabe " +"ungultig wenn die gradient groser sein soll wie 0.05 uber die " +"Vorschungsarea.\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:768 src/console_menus.h:199 +#, fuzzy +msgid "" +"Enables validation for chain processing: detects outliers of PIV data by " +"testing on median residu or by Signal to Noise Ratio magnitudes and, " +"eventually, substitutes. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Schlusst gelten an fur die Kettebearbeitung: findet Ausschiessen von testen " +"des mediaan Ruckstand oder des haltnis von Sinal und Rauschen (SNR). Wenn " +"moglich soll die Ausschiessen ersetzen werden.\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:720 src/console_menus.h:210 +msgid "" +"Enables residu statistics for chain processing: calculates the residus of " +"displacements for detection of outliers and shows an histogram of them. The " +"histogram will be displayed in the Piv Validation tab. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Schlusst residu Statistiek an fur die Kettebearbeitung: Berechnet die \n" +"Ruckstand der Versetzung des Partikeln um ausschiessen zum finden und " +"zeignet \n" +"ein Histogram im PIV Geltung Reiter\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:815 src/console_menus.h:221 +msgid "" +"Enables peak-lock for chain processing: shows an histogram of sub-pixel " +"displacements in order to check on peak-locking effects. The histogram will " +"be displayed in the Piv Validation tab. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Schlusst Geipfeleinschluss an fur die Kettebearbeitung: zeigt ein histogram " +"des sub-pixel Versetzung zum testen auf Gipfeleinschluss effects\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:848 src/console_menus.h:231 +#: src/pivpost_interface.c:443 +msgid "scale" +msgstr "" + +#: src/console_menus.h:232 +#, fuzzy +msgid "" +"Enables scale for chain processing: scales spatial displacements from all " +"data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Schlusst abziehen an fur die Kettebearbeitung: zieht Raumdurcschnitt ab von " +"alle Angabe.\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:906 src/console_menus.h:242 +msgid "" +"Enables average for chain processing: Calculates spatial average " +"displacements over all data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Schlusst durchsnitt an fur die Kettebearbeitung: berechnet die " +"Raumdurcschnitt\n" +"Versetzung von alle Angabe.\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:952 src/console_menus.h:252 +msgid "" +"Enables substract for chain processing: substracts spatial average " +"displacements from all data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Schlusst abziehen an fur die Kettebearbeitung: zieht Raumdurcschnitt ab von " +"alle Angabe.\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:998 src/console_menus.h:262 +msgid "" +"Enables vorticity for chain processing: calculates vorticity or strain " +"magnitudes from a velocity field.\n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Schlusst vortizitat an fur die Kettebearbeitung: berechnet die vortizitat " +"oder abschiebung von eider Geschwindigheidsfeld.\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:215 +msgid "gpiv" +msgstr "gpiv" + +#: src/console_interface.c:861 +#, fuzzy +msgid "" +"Enables scaling for chain processing: scales spatial displacements over all " +"data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Schlusst durchsnitt an fur die Kettebearbeitung: berechnet die " +"Raumdurcschnitt\n" +"Versetzung von alle Angabe.\n" +"Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." + +#: src/console_interface.c:1067 +msgid "Image Info" +msgstr "Bild Info:" + +#: src/console_interface.c:1085 +#, fuzzy +msgid "Evaluation" +msgstr "Piv Geltung" + +#: src/console_interface.c:1135 +#, fuzzy +msgid "Validation" +msgstr "Piv Geltung" + +#. gtk_object_set_data(GTK_OBJECT(gpiv->console), +#. "gpiv", +#. gpiv); +#: src/console_interface.c:1216 +#, fuzzy +msgid "Post processing" +msgstr "Piv: Angabe post prozessung" + +#: src/console_interface.c:1293 +msgid "buffer names and numbers" +msgstr "Puffer Namen un Numero s" + +#: src/console_interface.c:1371 +msgid "buffer list" +msgstr "Puffer Leiste" + +#: src/console_interface.c:1392 +msgid "#" +msgstr "#" + +#: src/console_interface.c:1404 +msgid "buffer name" +msgstr "Puffer Name" + +#. GtkWidget *about; +#. Title: +#. VersioN: +#. Copyright +#: src/console_interface.c:1524 +msgid "Copyright G. Van der Graaf" +msgstr "" + +#. Author(s): +#. Comments: +#: src/console_interface.c:1526 +msgid "" +"gpiv is a program for (Digital) Particle Image Velocimetry. It evaluates " +"images (pairs), resulting into a velocity field of a fluid flow. The program " +"includes validation of the velocities and allows to post-proces the data " +"resulting into derivatives of the flow." +msgstr "" +"gpiv ist ein program fur ((Digitalische) Particle Image Velocimetry. Es " +"evaluiert \n" +"Bild (Paren), welche ein Geschwindigkeitsfeld eines Fluidum Stromung " +"aufliefert. Das Program enthalt\n" +"PIV Geltung des geschwindichkeits Daten und post prozessung" + +#: src/console_interface.c:1585 +msgid "" +"There are unsaved data that will be lost.\n" +"Are you sure you want to quit?" +msgstr "" + +#: src/console_interface.c:1680 +msgid "gpiv message" +msgstr "" + +#: src/console_interface.c:1754 +msgid "gpiv error" +msgstr "" + +#: src/console.c:334 src/console.c:350 +msgid "this is a demo!" +msgstr "" + +#: src/console.c:474 +msgid "gpiv_fcreate_hdf5_image: unable to create file" +msgstr "" + +#: src/console.c:595 +msgid "Failure opening image header for output" +msgstr "" + +#: src/console.c:607 +msgid "Failure opening parameter file for output" +msgstr "" + +#: src/console.c:628 src/console.c:638 +msgid "Failure calling gpiv_fwrite_pivdata" +msgstr "" + +#: src/console.c:666 src/console.c:688 src/console.c:710 +msgid "Failure calling gpiv_fwrite_scdata" +msgstr "" + +#: src/console.c:842 +msgid "" +"There are unsaved data that will be lost.\n" +"Are you sure you want to close buffer #" +msgstr "" + +#: src/console.c:844 +msgid "?" +msgstr "" + +#. +#. * Create a new file selection widget +#. * Connect the ok_button and cancel_button to file_ok_sel function +#. * Set a default filename +#. * set user data "gpiv" to filew +#. +#: src/console.c:988 +msgid "File selection" +msgstr "" + +#: src/console.c:1121 +#, fuzzy +msgid "Opens image/PIV data (and display)" +msgstr "Offnet ein Bild/PIV (und Zeigner)" + +#: src/console.c:1132 +msgid "Saves data" +msgstr "Daten speichern" + +#: src/console.c:1143 +msgid "Executes all tickmarked processes" +msgstr "Ausfuhrung von Kettebearbeitun" + +#: src/console.c:1154 +msgid "Cancels any running processes" +msgstr "" + +#: src/console.c:1165 +msgid "Close active buffer(s)" +msgstr "" + +#: src/console.c:1175 +msgid "Exits gpiv" +msgstr "Beendet gpiv" + +#: src/console.c:1531 +msgid "load_buffer:: non-valid file name" +msgstr "" + +#: src/console.c:1667 +#, c-format +msgid "" +"Image dimensions (%dx%d) differ from \n" +"parameter settings (%dx%d" +msgstr "" + +#: src/console.c:1678 src/console.c:1725 +msgid "" +"cross correlation parameter from image \n" +"not in agreement with gpiv setting" +msgstr "" + +#: src/console.c:1688 +msgid "file contains no image data" +msgstr "" + +#: src/console.c:1710 +#, c-format +msgid "" +"Image dimensions (%dx%d) differ from \n" +"parameter settings (%dx%d)" +msgstr "" + +#: src/console.c:1739 +msgid "failure reading image" +msgstr "" + +#: src/console.c:1763 +#, c-format +msgid "%s: Failure calling gpiv_count_pivdata\n" +msgstr "Fehlen des anrufen gpiv_count_pivdata\n" + +#: src/console.c:1775 +#, c-format +msgid "%s: Failure calling fread_pivdata\n" +msgstr "%s: Fehlen des anrufen fread_pivdata\n" + +#: src/imgh_interface.c:67 +msgid "Image Header Info" +msgstr "Bild Information" + +#: src/imgh_interface.c:166 +#, fuzzy +msgid "buffer #: " +msgstr "Puffer Name" + +#: src/imgh_interface.c:215 +msgid "name: " +msgstr "Name:" + +#. viewport_imgh +#. +#. * label for ncols +#. +#: src/imgh_interface.c:264 +msgid "number of columns: " +msgstr "Anzahl des Zuele:" + +#. +#. * label for nrows +#. +#: src/imgh_interface.c:306 +msgid "number of rows: " +msgstr "Anzahl de Regeln:" + +#. +#. * spinner for spatial scale "sscale" +#. +#: src/imgh_interface.c:350 src/pivpost_interface.c:185 +msgid "spatial scale (mm/px): " +msgstr "raumlichen Skala (mm/px):" + +#. +#. * spinner for time scale "tscale" +#. +#: src/imgh_interface.c:414 src/pivpost_interface.c:249 +#, fuzzy +msgid "time scale (ms): " +msgstr "Zeit Skala (s):" + +#. +#. * spinner for column position +#. +#: src/imgh_interface.c:493 +#, fuzzy +msgid "position of column #0 (m): " +msgstr "Platz Zuelse #0 (mm):" + +#. +#. * spinner for row position +#. +#: src/imgh_interface.c:558 +#, fuzzy +msgid "position of row #0 (m): " +msgstr "Platz Regel #0 (mm):" + +#. +#. * entry for project +#. +#: src/imgh_interface.c:622 +#, fuzzy +msgid "Project: " +msgstr "Project:" + +#. +#. * entry for creation date +#. +#: src/imgh_interface.c:675 +#, fuzzy +msgid "Creation date: " +msgstr "Datum der Ververtigung" + +#. +#. * entry for location +#. +#: src/imgh_interface.c:730 +#, fuzzy +msgid "Place: " +msgstr "Lokation:" + +#. +#. * entry for comment +#. +#: src/imgh_interface.c:785 +#, fuzzy +msgid "Comment: " +msgstr "Komment:" + +#: src/piveval_interface.c:64 +#, fuzzy +msgid "Piv: image evaluation" +msgstr "Piv: Angabe Geltung" + +#: src/piveval_interface.c:165 +msgid "first col:" +msgstr "erste Zeule:" + +#: src/piveval_interface.c:185 +msgid "last col:" +msgstr "letzte Zeule:" + +#: src/piveval_interface.c:205 +msgid "pre-shift col:" +msgstr "Vorverschiebung Zeule:" + +#: src/piveval_interface.c:225 +msgid "first row:" +msgstr "erste Regel:" + +#: src/piveval_interface.c:245 +msgid "last row:" +msgstr "letzte Regel:" + +#: src/piveval_interface.c:265 +msgid "pre-shift row:" +msgstr "Vorverschiebung Regel:" + +#: src/piveval_interface.c:574 +msgid "Int Size 1" +msgstr "F.Area Dim. 1" + +#: src/display_menus.h:91 src/piveval_interface.c:765 +#: src/piveval_interface.c:993 src/piveval_interface.c:1230 +msgid "128" +msgstr "128" + +#. +#. * radio buttons for interrogation size 2 +#. +#: src/piveval_interface.c:800 +msgid "Int Size 2" +msgstr "F.Area Dim. 2" + +#. +#. * radio buttons for shifted distance of interrogation areas +#. +#: src/piveval_interface.c:1028 +msgid "Shift" +msgstr "Verschiebung" + +#. +#. * radio button for mouse selecting +#. +#: src/piveval_interface.c:1265 +msgid "Mouse select" +msgstr "Maus Selection" + +#: src/piveval_interface.c:1298 src/piveval_interface.c:1598 +#: src/pivvalid_interface.c:182 +msgid "None" +msgstr "Kein" + +#: src/piveval_interface.c:1336 +msgid "Area" +msgstr "Flache" + +#: src/piveval_interface.c:1374 +msgid "Single int." +msgstr "Einzel Vorsch." + +#: src/piveval_interface.c:1412 +msgid "Single point" +msgstr "Einzel Punkt" + +#: src/piveval_interface.c:1450 +msgid "Drag int." +msgstr "Versetzung Vorsch." + +#: src/piveval_interface.c:1488 +msgid "Vert. Line" +msgstr "" + +#: src/piveval_interface.c:1526 +msgid "Hor. Line" +msgstr "" + +#. +#. * radio buttons for sub-pixel interpolation scheme +#. +#: src/piveval_interface.c:1565 +msgid "Interpolation scheme" +msgstr "Interpolation Schema" + +#: src/piveval_interface.c:1631 +msgid "Gauss" +msgstr "Gauss" + +#: src/piveval_interface.c:1665 +msgid "Power" +msgstr "Potenz" + +#: src/piveval_interface.c:1699 +msgid "Gravity" +msgstr "Schwertpunkt" + +#. eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, +#. _("Marquardt")); +#. eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); +#. gtk_widget_ref (eval->radiobutton_fit_marquardt); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "radiobutton_fit_marquardt", +#. eval->radiobutton_fit_marquardt, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->radiobutton_fit_marquardt); +#. gtk_box_pack_start (GTK_BOX (eval->vbox10), +#. eval->radiobutton_fit_marquardt, +#. FALSE, +#. FALSE, +#. 0); +#. gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "ifit", +#. "4"); +#. gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_marquardt), +#. "eval", +#. eval); +#. gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "var_type", +#. "0"); +#. gtk_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "toggled", +#. GTK_SIGNAL_FUNC (on_toggle_piv), +#. NULL); +#. +#. * radio buttons for correlation peak number to be detected +#. +#: src/piveval_interface.c:1765 +msgid "Peak #" +msgstr "Pike #" + +#: src/piveval_interface.c:1862 +msgid "3" +msgstr "3" + +#. +#. * additonal calculation schemes for correlation detection +#. +#: src/piveval_interface.c:1896 +msgid "Interrogation with:" +msgstr "Vorschung mit:" + +#: src/piveval_interface.c:1928 +msgid "Weight Kernel" +msgstr "wagen Kernel" + +#: src/piveval_interface.c:1955 +msgid "Zero off-set" +msgstr "Null Verschiebung" + +#: src/piveval_interface.c:1982 +#, fuzzy +msgid "Central diff." +msgstr "Zentral" + +#. +#. * radio buttons for cross-or auto correlation +#. +#: src/piveval_interface.c:2011 src/piveval_interface.c:2261 +msgid "Correlation" +msgstr "Korrelation" + +#: src/piveval_interface.c:2044 +msgid "Auto" +msgstr "Auto" + +# Kreuz +#: src/piveval_interface.c:2077 +msgid "Cross" +msgstr "Kreuz" + +#: src/piveval_interface.c:2113 +msgid "Interrogation areas and correlation" +msgstr "Vorschungsraume und Korrelation" + +#. +#. * drawing area interrogation area1 +#. +#: src/piveval_interface.c:2148 +msgid "Int. area 1" +msgstr "V.Raum 1" + +#. gnome canvas interrogation area1 +#. gtk_widget_push_visual (gdk_imlib_get_visual ()); +#. gtk_widget_push_colormap (gdk_imlib_get_colormap ()); +#. eval->canvas_disprocess_int1 = gnome_canvas_new (); +#. gtk_widget_pop_colormap (); +#. gtk_widget_pop_visual (); +#. gtk_widget_ref (eval->canvas_disprocess_int1); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "canvas_disprocess_int1", +#. eval->canvas_disprocess_int1, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->canvas_disprocess_int1); +#. gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_int1 ), +#. eval->canvas_disprocess_int1); +#. --------- drawing area interrogation area2 +#: src/piveval_interface.c:2204 +msgid "Int. area 2" +msgstr "V.Raum 2" + +#. gtk_widget_push_visual (gdk_imlib_get_visual ()); +#. gtk_widget_push_colormap (gdk_imlib_get_colormap ()); +#. eval->canvas_disprocess_cov = gnome_canvas_new (); +#. gtk_widget_pop_colormap (); +#. gtk_widget_pop_visual (); +#. gtk_widget_ref (eval->canvas_disprocess_cov); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "canvas_disprocess_cov", +#. eval->canvas_disprocess_cov, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->canvas_disprocess_cov); +#. gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_cov), +#. eval->canvas_disprocess_cov); +#. gnome canvas display values +#: src/piveval_interface.c:2316 +msgid "Estimator" +msgstr "Schatzer" + +#: src/piveval_interface.c:2353 +msgid "Display" +msgstr "Zeigner" + +#: src/piveval_interface.c:2411 +msgid "" +"analyses a PIV image (pair) resulting into mean displacements of the " +"particle images within the interrogation areas" +msgstr "" + +#: src/piveval.c:86 src/pivvalid.c:82 +msgid "No mouse activity within displayer" +msgstr "" + +#: src/piveval.c:96 +msgid "Selects an area within the image to be analyzed" +msgstr "" + +#: src/piveval.c:106 +msgid "" +"Piv evaluation at a single interrogation area. Conserves other existing data" +msgstr "" + +#: src/piveval.c:117 +msgid "" +"Piv evaluation at a single point in the image. Rejects all existing data!!" +msgstr "" + +#: src/piveval.c:128 +msgid "Displaces a single interrogation area and analyzes" +msgstr "" + +#: src/piveval.c:138 +msgid "Evaluation at a vertical line. " +msgstr "" + +#: src/piveval.c:148 +msgid "Evaluation at a horizontal line. " +msgstr "" + +#: src/piveval.c:652 +msgid "Displays subimages, correlation image and cov. peak location" +msgstr "" + +#: src/piveval.c:731 +msgid "Analyses a PIV image (pair)" +msgstr "" + +#: src/piveval.c:803 +#, c-format +msgid "Failure calling gpiv_count_pivdata for %s" +msgstr "%s: Fehlen des anrufen gpiv_count_pivdata fur %s" + +#: src/piveval.c:840 +#, c-format +msgid "Failure calling gpiv_fread_pivdata for %s" +msgstr "Fehlen des anrufen gpiv_fread_pivdata fur %s" + +#: src/piveval.c:965 +#, fuzzy +msgid "At first, open an image. Than we'll further see what will happen." +msgstr "" +"Zum anfangen, offnen Sie ein Bild. Nachdem mochten wir mal sehen wass " +"passieren soll" + +#: src/pivvalid_interface.c:61 +msgid "Piv: data validation" +msgstr "Piv: Angabe Geltung" + +#. +#. * Enable / Disable frame +#. +#: src/pivvalid_interface.c:146 +msgid "Disable data" +msgstr "Ausschaltung Anlage" + +#: src/pivvalid_interface.c:224 +msgid "Enable point" +msgstr "Anschaltung einzel Punkt" + +#: src/pivvalid_interface.c:263 +msgid "Disable point" +msgstr "Ausschaltung einzel Punkt" + +#: src/pivvalid_interface.c:302 +msgid "Enable area" +msgstr "Anschaltun Flache" + +#: src/pivvalid_interface.c:341 +msgid "Disable area" +msgstr "Ausschaltung Flache" + +#: src/pivvalid_interface.c:382 +msgid "validate on velocity gradient " +msgstr "Geltung des Geschwidigkeitsgradient" + +#: src/pivvalid_interface.c:402 +msgid "" +"Disables PIV data that have a too large velocity gradient over the " +"Interrogation Area" +msgstr "" +"Ausschaltung des PIV Anlage die eine zu grosen Geschwidigkeitsgradient uber " +"die Vorschungsanflache haben" + +#. +#. * Frame for histogram of sub-pixel values (used to test on peak-locking +#. * effect) +#. +#: src/pivvalid_interface.c:430 +msgid "Peak locking" +msgstr "Gipfel einschliessen" + +#: src/pivvalid_interface.c:481 +msgid "# bins: " +msgstr "#bins" + +#: src/pivvalid_interface.c:573 +msgid "residu statistics" +msgstr "residu Statistiek" + +#: src/pivvalid_interface.c:587 +msgid "calculates residus of displacements and displays in a histogram" +msgstr "Berechnet residus von Versetzung und zeigt im Histogram." + +#: src/pivvalid_interface.c:609 +msgid "peak lock" +msgstr "Gipfel Einschluss" + +#: src/pivvalid_interface.c:623 +msgid "" +"shows histogram of sub-pixel displacements in order to check on peak-locking " +"effects" +msgstr "" +"Zeigt ein histogram des Partikeln Versetzung und zum testen auf " +"Gipfeleinschluss effects" + +#. +#. * Errvec frame +#. +#: src/pivvalid_interface.c:649 +msgid "Outliers" +msgstr "Ausschiesern" + +#: src/pivvalid_interface.c:683 +msgid "Residu type:" +msgstr "Residu Type" + +#: src/pivvalid_interface.c:715 +msgid "Snr" +msgstr "Snr" + +#: src/pivvalid_interface.c:760 src/pivvalid_interface.c:1057 +msgid "Median" +msgstr "Mediaan" + +#: src/pivvalid_interface.c:826 +msgid "Data yield: " +msgstr "" + +#: src/pivvalid_interface.c:891 +msgid "Threshold: " +msgstr "" + +#: src/pivvalid_interface.c:941 +msgid "show values" +msgstr "zeigt Werte" + +#. +#. * Radio buttons for substitution type +#. +#: src/pivvalid_interface.c:980 +msgid "Substituted by:" +msgstr "Ersetzen durch" + +#: src/pivvalid_interface.c:1012 +msgid "Mean of surroundings" +msgstr "durchshnitt des Nachbarn" + +#: src/pivvalid_interface.c:1101 +msgid "Next highest cov. peak" +msgstr "Nachstest hohest cov. Gipfel" + +#: src/pivvalid_interface.c:1145 +msgid "validate on outliers" +msgstr "gelten auf Ausschiessern" + +#: src/pivvalid_interface.c:1159 +msgid "substitutes outliers" +msgstr "ersetzn des Ausschiessern" + +#: src/pivvalid.c:45 +msgid "Examines PIV data on velocity gradients" +msgstr "" + +#: src/pivvalid.c:92 +#, fuzzy +msgid "Enables a single PIV data-point" +msgstr "Anschluss des Zeigen von die PIV Angabe" + +#: src/pivvalid.c:102 +msgid "Disables a single PIV data-point" +msgstr "" + +#: src/pivvalid.c:112 +#, fuzzy +msgid "Enables an area containing PIV data" +msgstr "Anschluss des Zeigen von die PIV Angabe" + +#: src/pivvalid.c:122 +msgid "Disables an area containing PIV data" +msgstr "" + +#: src/pivvalid.c:139 +msgid "Defines residu type to examine data on" +msgstr "" + +#: src/pivvalid.c:165 +msgid "Displays inverse cumulative histogram of residus" +msgstr "" + +#: src/pivvalid.c:227 +msgid "Display PIV vector colors related to residu or SNR value" +msgstr "" + +#: src/pivvalid.c:251 +msgid "Defines how to substitute the data" +msgstr "" + +#: src/pivvalid.c:279 +msgid "Examines PIV data on outliers and substitutes" +msgstr "" + +#: src/pivvalid.c:324 +msgid "Calculates a histogram of sub-pixel displacements" +msgstr "" + +#: src/pivpost.c:322 src/pivpost.c:414 src/pivpost.c:531 src/pivpost.c:671 +#: src/pivvalid.c:375 src/pivvalid.c:570 src/pivvalid.c:657 +msgid "no PIV data" +msgstr "keine PIV Angabe" + +#: src/pivpost_interface.c:62 +msgid "Piv: data post processing" +msgstr "Piv: Angabe post prozessung" + +#. +#. * Scale frame +#. +#. +#. * Spinners use the adjustment from spinbutton_adj_imgh_* +#. +#: src/pivpost_interface.c:149 +msgid "Scaling" +msgstr "Skalierung" + +#. +#. * spinner for column position +#. +#: src/pivpost_interface.c:314 +#, fuzzy +msgid "pos. of col #0 (m): " +msgstr "Platz Zuelse #0 (mm):" + +#. +#. * spinner for row position +#. +#: src/pivpost_interface.c:380 +#, fuzzy +msgid "pos. of row #0 (m): " +msgstr "Platz Regel #0 (mm):" + +#: src/pivpost_interface.c:462 +msgid "" +"Calculates time and spatial scaled particle displacements (i.e. velocities) " +"from a PIV displacement field, and their scaled positions" +msgstr "" + +#. +#. * Spatial average frame +#. +#: src/pivpost_interface.c:489 +msgid "Spatial statistics" +msgstr "" + +#. +#. *spinner for spatial U-avg +#. +#: src/pivpost_interface.c:525 +#, fuzzy +msgid "dx (px), U (m/s): " +msgstr "dx (px), U (mm/s): " + +#. +#. * KEEP DISABLED +#. +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "post", post); +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "var_type", "3"); +#. gtk_signal_connect(GTK_OBJECT(post->spinbutton_suavg), +#. "changed", +#. on_spinbutton_post_suavg, +#. post->spinbutton_suavg); +#. +#. * end of KEEP DISABLED +#. +#. +#. * spinner for spatial V-avg +#. +#: src/pivpost_interface.c:593 +#, fuzzy +msgid "dy (px), V (m/s): " +msgstr "dy (px), V (mm/s): " + +#. +#. * KEEP DISABLED +#. +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_svavg), +#. "var_type", "3"); +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "post", post); +#. gtk_signal_connect(GTK_OBJECT(post->spinbutton_svavg), +#. "changed", +#. on_spinbutton_post_svavg, +#. post->spinbutton_svavg); +#. +#. * end of KEEP DISABLED +#. +#. +#. * button to calculate averages +#. +#: src/pivpost_interface.c:660 +msgid "avarage" +msgstr "Durchschnitt" + +#: src/pivpost_interface.c:678 +msgid "" +"Calculates spatial average particle displacements or velocities from a " +"velocity field, obtained from PIV data" +msgstr "" + +#: src/pivpost_interface.c:721 +msgid "" +"Substracts the spatial averages, or values that have been entered manually, " +"from each estimator" +msgstr "" + +#. +#. * Vorstra frame +#. +#: src/pivpost_interface.c:745 +msgid "Vorticity & strain" +msgstr "Vortizitat und " + +#: src/pivpost_interface.c:778 +msgid "Output:" +msgstr "" + +#: src/pivpost_interface.c:930 +msgid "Differential scheme:" +msgstr "" + +#: src/pivpost_interface.c:964 +msgid "Central" +msgstr "Zentral" + +#: src/pivpost_interface.c:1005 +msgid "Least squares" +msgstr "" + +#: src/pivpost_interface.c:1047 +msgid "Richardson" +msgstr "Richardson" + +#: src/pivpost_interface.c:1097 +msgid "Circulation method" +msgstr "" + +#: src/pivpost_interface.c:1195 +msgid "" +"Calculates vorticity or strain magnitudes from a velocity field, obtained by " +"PIV" +msgstr "" + +#: src/pivpost.c:100 +msgid "Calculates scaled locations and velocities" +msgstr "" + +#: src/pivpost.c:137 +msgid "Calculates spatial average displacements" +msgstr "" + +#: src/pivpost.c:173 +msgid "Substracts mean displacements from PIV data" +msgstr "" + +#: src/pivpost.c:209 +msgid "Selects the differential quantity" +msgstr "" + +#: src/pivpost.c:244 +msgid "Selects the type of differential scheme" +msgstr "" + +#: src/pivpost.c:265 +msgid "Calculates differential quantity" +msgstr "" + +#: src/pivpost.c:666 +msgid "non valid vorstra operation" +msgstr "kein geltig vorstra Handlung" + +#: src/display_menus.h:42 +msgid "Stretch display window" +msgstr "" + +#: src/display_menus.h:43 +msgid "Stretch or fit display window to the image area" +msgstr "" + +#: src/display_menus.h:46 +msgid "Image A" +msgstr "Bild A" + +#: src/display_menus.h:47 +msgid "Image B" +msgstr "Bild B" + +#: src/display_menus.h:93 +msgid "256" +msgstr "256" + +#: src/display_menus.h:115 +msgid "Zoom in/out" +msgstr "" + +#: src/display_menus.h:116 +msgid "Vector scale" +msgstr "Vektor Skala" + +#: src/display.c:1056 +#, fuzzy +msgid "no image or piv data" +msgstr "Offnet ein PIV Bild oder Angabe Datei" + +#, fuzzy +#~ msgid "view the menu bar of the application" +#~ msgstr "Ansicht Menuleiste des Programm" + +#, fuzzy +#~ msgid "view the tool buttons of the application" +#~ msgstr "Ansicht Werkzeugleiste des Programm" + +#~ msgid "menubar" +#~ msgstr "Menuleiste" + +#~ msgid "tool buttons" +#~ msgstr "Werkzuegleiste" + +#~ msgid "Save File(s)" +#~ msgstr "Speichern Datei(s)" + +#~ msgid "Exit gpiv" +#~ msgstr "Beenden gpiv" + +#~ msgid "menu bar" +#~ msgstr "Menuleiste" + +#~ msgid "show menu bar" +#~ msgstr "Zeigt Menuleiste" + +#~ msgid "show tool button bar" +#~ msgstr "zeigt Werkzeugleiste" + +#~ msgid "Adaptive Inter." +#~ msgstr "Anpassung V.Flache" + +#~ msgid "Apply" +#~ msgstr "Aktivieren" + +#~ msgid "0.6" +#~ msgstr "0.6" + +#~ msgid "viewer" +#~ msgstr "Zeigner" + +#~ msgid "not connected, yet" +#~ msgstr "noch nicht angeschlossen" + +#~ msgid "Image processing" +#~ msgstr "Bild bearbeitung" + +#~ msgid "Image Proc" +#~ msgstr "Bild Bearb." + +#~ msgid "Piv: image analysis" +#~ msgstr "Piv: Bild Evaluierung" + +#~ msgid "Piv analysis" +#~ msgstr "Piv Evaluierung" diff --git a/po/gpiv.pot b/po/gpiv.pot new file mode 100644 index 0000000..a09c754 --- /dev/null +++ b/po/gpiv.pot @@ -0,0 +1,1458 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-06-17 19:04+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:85 +msgid "number of bins for histograms" +msgstr "" + +#: src/main.c:85 +msgid "BINS" +msgstr "" + +#: src/main.c:88 +msgid "number of columns in image" +msgstr "" + +#: src/main.c:88 +msgid "NCOLUMNS" +msgstr "" + +#: src/main.c:91 +msgid "number of rows in image" +msgstr "" + +#: src/main.c:91 +msgid "NROWS" +msgstr "" + +#: src/main.c:94 +msgid "enables displaying of the first image of a PIV image pair" +msgstr "" + +#: src/main.c:98 +msgid "enables displaying of the second image of a PIV image pair" +msgstr "" + +#: src/main.c:102 +msgid "enables displaying of interrogation regions" +msgstr "" + +#: src/main.c:105 +msgid "enables displaying of PIV data" +msgstr "" + +#: src/main.c:108 +msgid "enables displaying of vorticity data" +msgstr "" + +#: src/main.c:111 +msgid "enables displaying of shear strain data" +msgstr "" + +#: src/main.c:114 +msgid "enables displaying of normal strain data" +msgstr "" + +#: src/main.c:117 +msgid "save data in hdf5 format with .gpi extension" +msgstr "" + +#: src/main.c:119 +msgid "include image data in .gpi file (hdf5 format)" +msgstr "" + +#: src/main.c:122 +msgid "print parameters and other info to stdout" +msgstr "" + +#: src/main.c:125 +msgid "includes piv in the chain-proces" +msgstr "" + +#: src/main.c:128 +msgid "includes gradient in the chain-proces" +msgstr "" + +#: src/main.c:131 +msgid "includes resstats in the chain-proces" +msgstr "" + +#: src/main.c:134 +msgid "includes validate in the chain-proces" +msgstr "" + +#: src/main.c:137 +msgid "includes peaklock in the chain-proces" +msgstr "" + +#: src/main.c:140 +msgid "includes average in the chain-proces" +msgstr "" + +#: src/main.c:143 +msgid "includes scaling in the chain-proces" +msgstr "" + +#: src/main.c:146 +msgid "includes substract in the chain-proces" +msgstr "" + +#: src/main.c:149 +msgid "includes vorticity in the chain-proces" +msgstr "" + +#: src/main.c:152 +msgid "display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0" +msgstr "" + +#: src/main.c:153 src/main.c:156 +msgid "SCALE" +msgstr "" + +#: src/main.c:156 +msgid "vector length scale" +msgstr "" + +#: src/console_menus.h:92 src/console_menus.h:338 src/main.c:162 +msgid "show tooltips" +msgstr "" + +#: src/main.c:165 +msgid "view the gpiv buttons of the application" +msgstr "" + +#: src/main.c:168 +msgid "view the tabulator of the application" +msgstr "" + +#: src/main.c:576 +#, c-format +msgid "image width = %d image height = %d" +msgstr "" + +#: src/main.c:605 +#, c-format +msgid "Image dimensions are larger then the allowed maxima (%dx%d)." +msgstr "" + +#: src/support.c:125 src/support.c:163 +#, c-format +msgid "Couldn't find pixmap file: %s" +msgstr "" + +#: src/support.c:141 +#, c-format +msgid "Couldn't create pixmap from file: %s" +msgstr "" + +#. _parented +#. gnome_dialog_new +#: src/console_menus.h:77 src/console_menus.h:324 src/preferences.c:144 +msgid "Preferences" +msgstr "" + +#: src/preferences.c:198 +msgid "View" +msgstr "" + +#: src/console_menus.h:59 src/console_menus.h:309 src/preferences.c:230 +msgid "gpiv buttons" +msgstr "" + +#: src/console_menus.h:67 src/console_menus.h:316 src/preferences.c:259 +msgid "tabulator" +msgstr "" + +#. +#: src/preferences.c:288 +msgid "In/output" +msgstr "" + +#: src/preferences.c:318 +msgid "hdf5 format (.gpi)" +msgstr "" + +#: src/preferences.c:346 +msgid "include image in .gpi" +msgstr "" + +#: src/preferences.c:392 +msgid "img width: " +msgstr "" + +#: src/preferences.c:451 +msgid "img height: " +msgstr "" + +#. +#. * General; tooltips and histogram bins +#. +#: src/preferences.c:496 +msgid "tooltips" +msgstr "" + +#: src/preferences.c:530 +msgid "processes" +msgstr "" + +#. +#. * PIV activating button +#. +#: src/console_interface.c:612 src/console_menus.h:177 +#: src/piveval_interface.c:2392 src/preferences.c:563 +msgid "piv" +msgstr "" + +#: src/console_interface.c:660 src/console_menus.h:188 src/preferences.c:593 +msgid "gradient" +msgstr "" + +#: src/console_interface.c:706 src/console_menus.h:209 src/preferences.c:623 +msgid "residu stats" +msgstr "" + +#: src/console_interface.c:754 src/console_menus.h:198 src/preferences.c:653 +msgid "validate" +msgstr "" + +#: src/console_interface.c:801 src/console_menus.h:220 src/preferences.c:683 +msgid "peaklock" +msgstr "" + +#: src/preferences.c:712 +msgid "scaling" +msgstr "" + +#: src/console_interface.c:893 src/console_menus.h:241 src/preferences.c:742 +msgid "average" +msgstr "" + +#. +#. * button to substracts averages +#. +#: src/console_interface.c:938 src/console_menus.h:251 +#: src/pivpost_interface.c:702 src/preferences.c:772 +msgid "substract" +msgstr "" + +#: src/console_interface.c:984 src/console_menus.h:261 +#: src/pivpost_interface.c:1181 src/preferences.c:802 +msgid "vorticity" +msgstr "" + +#: src/preferences.c:852 +msgid "number of histogram bins: " +msgstr "" + +#: src/preferences.c:895 +msgid "console" +msgstr "" + +#. +#. * Vector scale +#. +#: src/preferences.c:930 +msgid "vector scale" +msgstr "" + +#: src/display_menus.h:77 src/piveval_interface.c:1796 src/preferences.c:964 +msgid "1" +msgstr "" + +#: src/display_menus.h:71 src/display_menus.h:79 src/piveval_interface.c:1829 +#: src/preferences.c:997 +msgid "2" +msgstr "" + +#: src/display_menus.h:81 src/preferences.c:1029 +msgid "4" +msgstr "" + +#: src/display_menus.h:83 src/piveval_interface.c:1093 src/preferences.c:1061 +msgid "8" +msgstr "" + +#: src/display_menus.h:85 src/piveval_interface.c:663 +#: src/piveval_interface.c:892 src/piveval_interface.c:1128 +#: src/preferences.c:1093 +msgid "16" +msgstr "" + +#: src/display_menus.h:87 src/piveval_interface.c:697 +#: src/piveval_interface.c:926 src/piveval_interface.c:1162 +#: src/preferences.c:1122 +msgid "32" +msgstr "" + +#: src/display_menus.h:89 src/piveval_interface.c:731 +#: src/piveval_interface.c:960 src/piveval_interface.c:1196 +#: src/preferences.c:1151 +msgid "64" +msgstr "" + +#. +#. * Zoom scale +#. +#: src/preferences.c:1180 +msgid "zoom scale" +msgstr "" + +#: src/display_menus.h:61 src/preferences.c:1211 +msgid "0.5" +msgstr "" + +#: src/display_menus.h:63 src/preferences.c:1242 +msgid "0.83" +msgstr "" + +#: src/display_menus.h:65 src/preferences.c:1273 +msgid "1.0" +msgstr "" + +#: src/display_menus.h:67 src/preferences.c:1304 +msgid "1.3" +msgstr "" + +#: src/display_menus.h:69 src/preferences.c:1335 +msgid "1.6" +msgstr "" + +#: src/preferences.c:1366 +msgid "2.0" +msgstr "" + +#. +#. * Hide and display data +#. +#: src/preferences.c:1398 +msgid "hide/display data" +msgstr "" + +#: src/preferences.c:1429 +msgid "image A" +msgstr "" + +#: src/preferences.c:1454 +msgid "image B" +msgstr "" + +#: src/display_menus.h:48 src/preferences.c:1479 +msgid "Interrogation area's" +msgstr "" + +#: src/display_menus.h:50 src/preferences.c:1504 +msgid "Velocity vectors" +msgstr "" + +#: src/display_menus.h:51 src/pivpost_interface.c:810 src/preferences.c:1529 +msgid "Vorticity" +msgstr "" + +#: src/display_menus.h:52 src/pivpost_interface.c:851 src/preferences.c:1554 +msgid "Shear strain" +msgstr "" + +#: src/display_menus.h:53 src/pivpost_interface.c:892 src/preferences.c:1575 +msgid "Normal strain" +msgstr "" + +#: src/preferences.c:1603 +msgid "display" +msgstr "" + +#: src/preferences.c:1665 +msgid "Updates parameters and save as defaults" +msgstr "" + +#: src/preferences.c:1689 +msgid "Updates actual parameters, do not store as defaults" +msgstr "" + +#: src/preferences.c:1715 +msgid "Close preferences window" +msgstr "" + +#: src/console_menus.h:60 src/console_menus.h:310 +msgid "show gpiv check-buttons" +msgstr "" + +#: src/console_menus.h:68 src/console_menus.h:317 +msgid "show tabulator containing parameter settings" +msgstr "" + +#: src/console_menus.h:78 +msgid "Define settings of the application" +msgstr "" + +#: src/console_menus.h:93 src/console_menus.h:339 +msgid "show extended information in a small pop-up window" +msgstr "" + +#: src/console_menus.h:100 src/console_menus.h:345 +msgid "manual" +msgstr "" + +#: src/console_menus.h:129 +msgid "Open" +msgstr "" + +#: src/console_menus.h:129 +msgid "Open a PIV image or data-file" +msgstr "" + +#: src/console_menus.h:135 +msgid "Save" +msgstr "" + +#: src/console_menus.h:135 +msgid "Save data" +msgstr "" + +#: src/console_menus.h:141 +msgid "Execute" +msgstr "" + +#: src/console_menus.h:141 +msgid "Execute the enabled chain process(es)" +msgstr "" + +#: src/console_menus.h:147 +msgid "Stop" +msgstr "" + +#: src/console_menus.h:147 +msgid "Cancels all running processes" +msgstr "" + +#: src/console_menus.h:153 +msgid "Close" +msgstr "" + +#: src/console_menus.h:153 +msgid "" +"Close active buffer(s).\n" +"A warning message will be issued for unsaved data" +msgstr "" + +#: src/console_menus.h:161 +msgid "Exit" +msgstr "" + +#: src/console_menus.h:161 +msgid "" +"Exit gpiv. \n" +"A warning message will be issued for unsaved data" +msgstr "" + +#: src/console_interface.c:626 src/console_menus.h:178 +msgid "" +"Enables PIV for chain processing: analysing of a PIV image (pair), resulting " +"into the mean displacements of the particle images within each interrogation " +"area. \n" +"The process will be executed by clicking the Execute button" +msgstr "" + +#: src/console_interface.c:674 src/console_menus.h:189 +msgid "" +"Enables gradient for chain processing: Disables velocities with gradients " +"larger than 0.05 over the interrogation area. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" + +#: src/console_interface.c:768 src/console_menus.h:199 +msgid "" +"Enables validation for chain processing: detects outliers of PIV data by " +"testing on median residu or by Signal to Noise Ratio magnitudes and, " +"eventually, substitutes. \n" +"The process will be executed by clicking the Execute button" +msgstr "" + +#: src/console_interface.c:720 src/console_menus.h:210 +msgid "" +"Enables residu statistics for chain processing: calculates the residus of " +"displacements for detection of outliers and shows an histogram of them. The " +"histogram will be displayed in the Piv Validation tab. \n" +"The process will be executed by clicking the Execute button" +msgstr "" + +#: src/console_interface.c:815 src/console_menus.h:221 +msgid "" +"Enables peak-lock for chain processing: shows an histogram of sub-pixel " +"displacements in order to check on peak-locking effects. The histogram will " +"be displayed in the Piv Validation tab. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" + +#: src/console_interface.c:848 src/console_menus.h:231 +#: src/pivpost_interface.c:443 +msgid "scale" +msgstr "" + +#: src/console_menus.h:232 +msgid "" +"Enables scale for chain processing: scales spatial displacements from all " +"data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" + +#: src/console_interface.c:906 src/console_menus.h:242 +msgid "" +"Enables average for chain processing: Calculates spatial average " +"displacements over all data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" + +#: src/console_interface.c:952 src/console_menus.h:252 +msgid "" +"Enables substract for chain processing: substracts spatial average " +"displacements from all data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" + +#: src/console_interface.c:998 src/console_menus.h:262 +msgid "" +"Enables vorticity for chain processing: calculates vorticity or strain " +"magnitudes from a velocity field.\n" +"The process will be executed by clicking the Execute button" +msgstr "" + +#: src/console_interface.c:215 +msgid "gpiv" +msgstr "" + +#: src/console_interface.c:861 +msgid "" +"Enables scaling for chain processing: scales spatial displacements over all " +"data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" + +#: src/console_interface.c:1067 +msgid "Image Info" +msgstr "" + +#: src/console_interface.c:1085 +msgid "Evaluation" +msgstr "" + +#: src/console_interface.c:1135 +msgid "Validation" +msgstr "" + +#. gtk_object_set_data(GTK_OBJECT(gpiv->console), +#. "gpiv", +#. gpiv); +#: src/console_interface.c:1216 +msgid "Post processing" +msgstr "" + +#: src/console_interface.c:1293 +msgid "buffer names and numbers" +msgstr "" + +#: src/console_interface.c:1371 +msgid "buffer list" +msgstr "" + +#: src/console_interface.c:1392 +msgid "#" +msgstr "" + +#: src/console_interface.c:1404 +msgid "buffer name" +msgstr "" + +#. GtkWidget *about; +#. Title: +#. VersioN: +#. Copyright +#: src/console_interface.c:1524 +msgid "Copyright G. Van der Graaf" +msgstr "" + +#. Author(s): +#. Comments: +#: src/console_interface.c:1526 +msgid "" +"gpiv is a program for (Digital) Particle Image Velocimetry. It evaluates " +"images (pairs), resulting into a velocity field of a fluid flow. The program " +"includes validation of the velocities and allows to post-proces the data " +"resulting into derivatives of the flow." +msgstr "" + +#: src/console_interface.c:1585 +msgid "" +"There are unsaved data that will be lost.\n" +"Are you sure you want to quit?" +msgstr "" + +#: src/console_interface.c:1680 +msgid "gpiv message" +msgstr "" + +#: src/console_interface.c:1754 +msgid "gpiv error" +msgstr "" + +#: src/console.c:334 src/console.c:350 +msgid "this is a demo!" +msgstr "" + +#: src/console.c:474 +msgid "gpiv_fcreate_hdf5_image: unable to create file" +msgstr "" + +#: src/console.c:595 +msgid "Failure opening image header for output" +msgstr "" + +#: src/console.c:607 +msgid "Failure opening parameter file for output" +msgstr "" + +#: src/console.c:628 src/console.c:638 +msgid "Failure calling gpiv_fwrite_pivdata" +msgstr "" + +#: src/console.c:666 src/console.c:688 src/console.c:710 +msgid "Failure calling gpiv_fwrite_scdata" +msgstr "" + +#: src/console.c:842 +msgid "" +"There are unsaved data that will be lost.\n" +"Are you sure you want to close buffer #" +msgstr "" + +#: src/console.c:844 +msgid "?" +msgstr "" + +#. +#. * Create a new file selection widget +#. * Connect the ok_button and cancel_button to file_ok_sel function +#. * Set a default filename +#. * set user data "gpiv" to filew +#. +#: src/console.c:988 +msgid "File selection" +msgstr "" + +#: src/console.c:1121 +msgid "Opens image/PIV data (and display)" +msgstr "" + +#: src/console.c:1132 +msgid "Saves data" +msgstr "" + +#: src/console.c:1143 +msgid "Executes all tickmarked processes" +msgstr "" + +#: src/console.c:1154 +msgid "Cancels any running processes" +msgstr "" + +#: src/console.c:1165 +msgid "Close active buffer(s)" +msgstr "" + +#: src/console.c:1175 +msgid "Exits gpiv" +msgstr "" + +#: src/console.c:1531 +msgid "load_buffer:: non-valid file name" +msgstr "" + +#: src/console.c:1667 +#, c-format +msgid "" +"Image dimensions (%dx%d) differ from \n" +"parameter settings (%dx%d" +msgstr "" + +#: src/console.c:1678 src/console.c:1725 +msgid "" +"cross correlation parameter from image \n" +"not in agreement with gpiv setting" +msgstr "" + +#: src/console.c:1688 +msgid "file contains no image data" +msgstr "" + +#: src/console.c:1710 +#, c-format +msgid "" +"Image dimensions (%dx%d) differ from \n" +"parameter settings (%dx%d)" +msgstr "" + +#: src/console.c:1739 +msgid "failure reading image" +msgstr "" + +#: src/console.c:1763 +#, c-format +msgid "%s: Failure calling gpiv_count_pivdata\n" +msgstr "" + +#: src/console.c:1775 +#, c-format +msgid "%s: Failure calling fread_pivdata\n" +msgstr "" + +#: src/imgh_interface.c:67 +msgid "Image Header Info" +msgstr "" + +#: src/imgh_interface.c:166 +msgid "buffer #: " +msgstr "" + +#: src/imgh_interface.c:215 +msgid "name: " +msgstr "" + +#. viewport_imgh +#. +#. * label for ncols +#. +#: src/imgh_interface.c:264 +msgid "number of columns: " +msgstr "" + +#. +#. * label for nrows +#. +#: src/imgh_interface.c:306 +msgid "number of rows: " +msgstr "" + +#. +#. * spinner for spatial scale "sscale" +#. +#: src/imgh_interface.c:350 src/pivpost_interface.c:185 +msgid "spatial scale (mm/px): " +msgstr "" + +#. +#. * spinner for time scale "tscale" +#. +#: src/imgh_interface.c:414 src/pivpost_interface.c:249 +msgid "time scale (ms): " +msgstr "" + +#. +#. * spinner for column position +#. +#: src/imgh_interface.c:493 +msgid "position of column #0 (m): " +msgstr "" + +#. +#. * spinner for row position +#. +#: src/imgh_interface.c:558 +msgid "position of row #0 (m): " +msgstr "" + +#. +#. * entry for project +#. +#: src/imgh_interface.c:622 +msgid "Project: " +msgstr "" + +#. +#. * entry for creation date +#. +#: src/imgh_interface.c:675 +msgid "Creation date: " +msgstr "" + +#. +#. * entry for location +#. +#: src/imgh_interface.c:730 +msgid "Place: " +msgstr "" + +#. +#. * entry for comment +#. +#: src/imgh_interface.c:785 +msgid "Comment: " +msgstr "" + +#: src/piveval_interface.c:64 +msgid "Piv: image evaluation" +msgstr "" + +#: src/piveval_interface.c:165 +msgid "first col:" +msgstr "" + +#: src/piveval_interface.c:185 +msgid "last col:" +msgstr "" + +#: src/piveval_interface.c:205 +msgid "pre-shift col:" +msgstr "" + +#: src/piveval_interface.c:225 +msgid "first row:" +msgstr "" + +#: src/piveval_interface.c:245 +msgid "last row:" +msgstr "" + +#: src/piveval_interface.c:265 +msgid "pre-shift row:" +msgstr "" + +#: src/piveval_interface.c:574 +msgid "Int Size 1" +msgstr "" + +#: src/display_menus.h:91 src/piveval_interface.c:765 +#: src/piveval_interface.c:993 src/piveval_interface.c:1230 +msgid "128" +msgstr "" + +#. +#. * radio buttons for interrogation size 2 +#. +#: src/piveval_interface.c:800 +msgid "Int Size 2" +msgstr "" + +#. +#. * radio buttons for shifted distance of interrogation areas +#. +#: src/piveval_interface.c:1028 +msgid "Shift" +msgstr "" + +#. +#. * radio button for mouse selecting +#. +#: src/piveval_interface.c:1265 +msgid "Mouse select" +msgstr "" + +#: src/piveval_interface.c:1298 src/piveval_interface.c:1598 +#: src/pivvalid_interface.c:182 +msgid "None" +msgstr "" + +#: src/piveval_interface.c:1336 +msgid "Area" +msgstr "" + +#: src/piveval_interface.c:1374 +msgid "Single int." +msgstr "" + +#: src/piveval_interface.c:1412 +msgid "Single point" +msgstr "" + +#: src/piveval_interface.c:1450 +msgid "Drag int." +msgstr "" + +#: src/piveval_interface.c:1488 +msgid "Vert. Line" +msgstr "" + +#: src/piveval_interface.c:1526 +msgid "Hor. Line" +msgstr "" + +#. +#. * radio buttons for sub-pixel interpolation scheme +#. +#: src/piveval_interface.c:1565 +msgid "Interpolation scheme" +msgstr "" + +#: src/piveval_interface.c:1631 +msgid "Gauss" +msgstr "" + +#: src/piveval_interface.c:1665 +msgid "Power" +msgstr "" + +#: src/piveval_interface.c:1699 +msgid "Gravity" +msgstr "" + +#. eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, +#. _("Marquardt")); +#. eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); +#. gtk_widget_ref (eval->radiobutton_fit_marquardt); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "radiobutton_fit_marquardt", +#. eval->radiobutton_fit_marquardt, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->radiobutton_fit_marquardt); +#. gtk_box_pack_start (GTK_BOX (eval->vbox10), +#. eval->radiobutton_fit_marquardt, +#. FALSE, +#. FALSE, +#. 0); +#. gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "ifit", +#. "4"); +#. gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_marquardt), +#. "eval", +#. eval); +#. gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "var_type", +#. "0"); +#. gtk_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "toggled", +#. GTK_SIGNAL_FUNC (on_toggle_piv), +#. NULL); +#. +#. * radio buttons for correlation peak number to be detected +#. +#: src/piveval_interface.c:1765 +msgid "Peak #" +msgstr "" + +#: src/piveval_interface.c:1862 +msgid "3" +msgstr "" + +#. +#. * additonal calculation schemes for correlation detection +#. +#: src/piveval_interface.c:1896 +msgid "Interrogation with:" +msgstr "" + +#: src/piveval_interface.c:1928 +msgid "Weight Kernel" +msgstr "" + +#: src/piveval_interface.c:1955 +msgid "Zero off-set" +msgstr "" + +#: src/piveval_interface.c:1982 +msgid "Central diff." +msgstr "" + +#. +#. * radio buttons for cross-or auto correlation +#. +#: src/piveval_interface.c:2011 src/piveval_interface.c:2261 +msgid "Correlation" +msgstr "" + +#: src/piveval_interface.c:2044 +msgid "Auto" +msgstr "" + +#: src/piveval_interface.c:2077 +msgid "Cross" +msgstr "" + +#: src/piveval_interface.c:2113 +msgid "Interrogation areas and correlation" +msgstr "" + +#. +#. * drawing area interrogation area1 +#. +#: src/piveval_interface.c:2148 +msgid "Int. area 1" +msgstr "" + +#. gnome canvas interrogation area1 +#. gtk_widget_push_visual (gdk_imlib_get_visual ()); +#. gtk_widget_push_colormap (gdk_imlib_get_colormap ()); +#. eval->canvas_disprocess_int1 = gnome_canvas_new (); +#. gtk_widget_pop_colormap (); +#. gtk_widget_pop_visual (); +#. gtk_widget_ref (eval->canvas_disprocess_int1); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "canvas_disprocess_int1", +#. eval->canvas_disprocess_int1, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->canvas_disprocess_int1); +#. gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_int1 ), +#. eval->canvas_disprocess_int1); +#. --------- drawing area interrogation area2 +#: src/piveval_interface.c:2204 +msgid "Int. area 2" +msgstr "" + +#. gtk_widget_push_visual (gdk_imlib_get_visual ()); +#. gtk_widget_push_colormap (gdk_imlib_get_colormap ()); +#. eval->canvas_disprocess_cov = gnome_canvas_new (); +#. gtk_widget_pop_colormap (); +#. gtk_widget_pop_visual (); +#. gtk_widget_ref (eval->canvas_disprocess_cov); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "canvas_disprocess_cov", +#. eval->canvas_disprocess_cov, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->canvas_disprocess_cov); +#. gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_cov), +#. eval->canvas_disprocess_cov); +#. gnome canvas display values +#: src/piveval_interface.c:2316 +msgid "Estimator" +msgstr "" + +#: src/piveval_interface.c:2353 +msgid "Display" +msgstr "" + +#: src/piveval_interface.c:2411 +msgid "" +"analyses a PIV image (pair) resulting into mean displacements of the " +"particle images within the interrogation areas" +msgstr "" + +#: src/piveval.c:86 src/pivvalid.c:82 +msgid "No mouse activity within displayer" +msgstr "" + +#: src/piveval.c:96 +msgid "Selects an area within the image to be analyzed" +msgstr "" + +#: src/piveval.c:106 +msgid "" +"Piv evaluation at a single interrogation area. Conserves other existing data" +msgstr "" + +#: src/piveval.c:117 +msgid "" +"Piv evaluation at a single point in the image. Rejects all existing data!!" +msgstr "" + +#: src/piveval.c:128 +msgid "Displaces a single interrogation area and analyzes" +msgstr "" + +#: src/piveval.c:138 +msgid "Evaluation at a vertical line. " +msgstr "" + +#: src/piveval.c:148 +msgid "Evaluation at a horizontal line. " +msgstr "" + +#: src/piveval.c:652 +msgid "Displays subimages, correlation image and cov. peak location" +msgstr "" + +#: src/piveval.c:731 +msgid "Analyses a PIV image (pair)" +msgstr "" + +#: src/piveval.c:803 +#, c-format +msgid "Failure calling gpiv_count_pivdata for %s" +msgstr "" + +#: src/piveval.c:840 +#, c-format +msgid "Failure calling gpiv_fread_pivdata for %s" +msgstr "" + +#: src/piveval.c:965 +msgid "At first, open an image. Than we'll further see what will happen." +msgstr "" + +#: src/pivvalid_interface.c:61 +msgid "Piv: data validation" +msgstr "" + +#. +#. * Enable / Disable frame +#. +#: src/pivvalid_interface.c:146 +msgid "Disable data" +msgstr "" + +#: src/pivvalid_interface.c:224 +msgid "Enable point" +msgstr "" + +#: src/pivvalid_interface.c:263 +msgid "Disable point" +msgstr "" + +#: src/pivvalid_interface.c:302 +msgid "Enable area" +msgstr "" + +#: src/pivvalid_interface.c:341 +msgid "Disable area" +msgstr "" + +#: src/pivvalid_interface.c:382 +msgid "validate on velocity gradient " +msgstr "" + +#: src/pivvalid_interface.c:402 +msgid "" +"Disables PIV data that have a too large velocity gradient over the " +"Interrogation Area" +msgstr "" + +#. +#. * Frame for histogram of sub-pixel values (used to test on peak-locking +#. * effect) +#. +#: src/pivvalid_interface.c:430 +msgid "Peak locking" +msgstr "" + +#: src/pivvalid_interface.c:481 +msgid "# bins: " +msgstr "" + +#: src/pivvalid_interface.c:573 +msgid "residu statistics" +msgstr "" + +#: src/pivvalid_interface.c:587 +msgid "calculates residus of displacements and displays in a histogram" +msgstr "" + +#: src/pivvalid_interface.c:609 +msgid "peak lock" +msgstr "" + +#: src/pivvalid_interface.c:623 +msgid "" +"shows histogram of sub-pixel displacements in order to check on peak-locking " +"effects" +msgstr "" + +#. +#. * Errvec frame +#. +#: src/pivvalid_interface.c:649 +msgid "Outliers" +msgstr "" + +#: src/pivvalid_interface.c:683 +msgid "Residu type:" +msgstr "" + +#: src/pivvalid_interface.c:715 +msgid "Snr" +msgstr "" + +#: src/pivvalid_interface.c:760 src/pivvalid_interface.c:1057 +msgid "Median" +msgstr "" + +#: src/pivvalid_interface.c:826 +msgid "Data yield: " +msgstr "" + +#: src/pivvalid_interface.c:891 +msgid "Threshold: " +msgstr "" + +#: src/pivvalid_interface.c:941 +msgid "show values" +msgstr "" + +#. +#. * Radio buttons for substitution type +#. +#: src/pivvalid_interface.c:980 +msgid "Substituted by:" +msgstr "" + +#: src/pivvalid_interface.c:1012 +msgid "Mean of surroundings" +msgstr "" + +#: src/pivvalid_interface.c:1101 +msgid "Next highest cov. peak" +msgstr "" + +#: src/pivvalid_interface.c:1145 +msgid "validate on outliers" +msgstr "" + +#: src/pivvalid_interface.c:1159 +msgid "substitutes outliers" +msgstr "" + +#: src/pivvalid.c:45 +msgid "Examines PIV data on velocity gradients" +msgstr "" + +#: src/pivvalid.c:92 +msgid "Enables a single PIV data-point" +msgstr "" + +#: src/pivvalid.c:102 +msgid "Disables a single PIV data-point" +msgstr "" + +#: src/pivvalid.c:112 +msgid "Enables an area containing PIV data" +msgstr "" + +#: src/pivvalid.c:122 +msgid "Disables an area containing PIV data" +msgstr "" + +#: src/pivvalid.c:139 +msgid "Defines residu type to examine data on" +msgstr "" + +#: src/pivvalid.c:165 +msgid "Displays inverse cumulative histogram of residus" +msgstr "" + +#: src/pivvalid.c:227 +msgid "Display PIV vector colors related to residu or SNR value" +msgstr "" + +#: src/pivvalid.c:251 +msgid "Defines how to substitute the data" +msgstr "" + +#: src/pivvalid.c:279 +msgid "Examines PIV data on outliers and substitutes" +msgstr "" + +#: src/pivvalid.c:324 +msgid "Calculates a histogram of sub-pixel displacements" +msgstr "" + +#: src/pivpost.c:322 src/pivpost.c:414 src/pivpost.c:531 src/pivpost.c:671 +#: src/pivvalid.c:375 src/pivvalid.c:570 src/pivvalid.c:657 +msgid "no PIV data" +msgstr "" + +#: src/pivpost_interface.c:62 +msgid "Piv: data post processing" +msgstr "" + +#. +#. * Scale frame +#. +#. +#. * Spinners use the adjustment from spinbutton_adj_imgh_* +#. +#: src/pivpost_interface.c:149 +msgid "Scaling" +msgstr "" + +#. +#. * spinner for column position +#. +#: src/pivpost_interface.c:314 +msgid "pos. of col #0 (m): " +msgstr "" + +#. +#. * spinner for row position +#. +#: src/pivpost_interface.c:380 +msgid "pos. of row #0 (m): " +msgstr "" + +#: src/pivpost_interface.c:462 +msgid "" +"Calculates time and spatial scaled particle displacements (i.e. velocities) " +"from a PIV displacement field, and their scaled positions" +msgstr "" + +#. +#. * Spatial average frame +#. +#: src/pivpost_interface.c:489 +msgid "Spatial statistics" +msgstr "" + +#. +#. *spinner for spatial U-avg +#. +#: src/pivpost_interface.c:525 +msgid "dx (px), U (m/s): " +msgstr "" + +#. +#. * KEEP DISABLED +#. +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "post", post); +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "var_type", "3"); +#. gtk_signal_connect(GTK_OBJECT(post->spinbutton_suavg), +#. "changed", +#. on_spinbutton_post_suavg, +#. post->spinbutton_suavg); +#. +#. * end of KEEP DISABLED +#. +#. +#. * spinner for spatial V-avg +#. +#: src/pivpost_interface.c:593 +msgid "dy (px), V (m/s): " +msgstr "" + +#. +#. * KEEP DISABLED +#. +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_svavg), +#. "var_type", "3"); +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "post", post); +#. gtk_signal_connect(GTK_OBJECT(post->spinbutton_svavg), +#. "changed", +#. on_spinbutton_post_svavg, +#. post->spinbutton_svavg); +#. +#. * end of KEEP DISABLED +#. +#. +#. * button to calculate averages +#. +#: src/pivpost_interface.c:660 +msgid "avarage" +msgstr "" + +#: src/pivpost_interface.c:678 +msgid "" +"Calculates spatial average particle displacements or velocities from a " +"velocity field, obtained from PIV data" +msgstr "" + +#: src/pivpost_interface.c:721 +msgid "" +"Substracts the spatial averages, or values that have been entered manually, " +"from each estimator" +msgstr "" + +#. +#. * Vorstra frame +#. +#: src/pivpost_interface.c:745 +msgid "Vorticity & strain" +msgstr "" + +#: src/pivpost_interface.c:778 +msgid "Output:" +msgstr "" + +#: src/pivpost_interface.c:930 +msgid "Differential scheme:" +msgstr "" + +#: src/pivpost_interface.c:964 +msgid "Central" +msgstr "" + +#: src/pivpost_interface.c:1005 +msgid "Least squares" +msgstr "" + +#: src/pivpost_interface.c:1047 +msgid "Richardson" +msgstr "" + +#: src/pivpost_interface.c:1097 +msgid "Circulation method" +msgstr "" + +#: src/pivpost_interface.c:1195 +msgid "" +"Calculates vorticity or strain magnitudes from a velocity field, obtained by " +"PIV" +msgstr "" + +#: src/pivpost.c:100 +msgid "Calculates scaled locations and velocities" +msgstr "" + +#: src/pivpost.c:137 +msgid "Calculates spatial average displacements" +msgstr "" + +#: src/pivpost.c:173 +msgid "Substracts mean displacements from PIV data" +msgstr "" + +#: src/pivpost.c:209 +msgid "Selects the differential quantity" +msgstr "" + +#: src/pivpost.c:244 +msgid "Selects the type of differential scheme" +msgstr "" + +#: src/pivpost.c:265 +msgid "Calculates differential quantity" +msgstr "" + +#: src/pivpost.c:666 +msgid "non valid vorstra operation" +msgstr "" + +#: src/display_menus.h:42 +msgid "Stretch display window" +msgstr "" + +#: src/display_menus.h:43 +msgid "Stretch or fit display window to the image area" +msgstr "" + +#: src/display_menus.h:46 +msgid "Image A" +msgstr "" + +#: src/display_menus.h:47 +msgid "Image B" +msgstr "" + +#: src/display_menus.h:93 +msgid "256" +msgstr "" + +#: src/display_menus.h:115 +msgid "Zoom in/out" +msgstr "" + +#: src/display_menus.h:116 +msgid "Vector scale" +msgstr "" + +#: src/display.c:1056 +msgid "no image or piv data" +msgstr "" diff --git a/po/nl.gmo b/po/nl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..50f2fb0a3410e8a0b14a510d82442ad57cf958a1 GIT binary patch literal 18864 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 literal 0 HcwPel00001 diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..1cf826f --- /dev/null +++ b/po/nl.po @@ -0,0 +1,1656 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: gpiv 0.0\n" +"POT-Creation-Date: 2003-06-17 19:04+0200\n" +"PO-Revision-Date: 2002-12-09 12:10+0100\n" +"Last-Translator: Gerber van der Graaf \n" +"Language-Team: DUTCH \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:85 +msgid "number of bins for histograms" +msgstr "aantal histogram staven" + +#: src/main.c:85 +msgid "BINS" +msgstr "STAVEN" + +#: src/main.c:88 +#, fuzzy +msgid "number of columns in image" +msgstr "aantal colommen: " + +#: src/main.c:88 +msgid "NCOLUMNS" +msgstr "" + +#: src/main.c:91 +#, fuzzy +msgid "number of rows in image" +msgstr "aantal regels: " + +#: src/main.c:91 +msgid "NROWS" +msgstr "" + +#: src/main.c:94 +#, fuzzy +msgid "enables displaying of the first image of a PIV image pair" +msgstr "laat afschuifsnelheid data zien" + +#: src/main.c:98 +#, fuzzy +msgid "enables displaying of the second image of a PIV image pair" +msgstr "laat PIV data zien" + +#: src/main.c:102 +msgid "enables displaying of interrogation regions" +msgstr "laat onderzoeks-gebieden zien" + +#: src/main.c:105 +msgid "enables displaying of PIV data" +msgstr "laat PIV data zien" + +#: src/main.c:108 +msgid "enables displaying of vorticity data" +msgstr "laat vorticiteit zien" + +#: src/main.c:111 +msgid "enables displaying of shear strain data" +msgstr "laat afschuifsnelheid data zien" + +#: src/main.c:114 +msgid "enables displaying of normal strain data" +msgstr "laat druk data zien" + +#: src/main.c:117 +msgid "save data in hdf5 format with .gpi extension" +msgstr "" + +#: src/main.c:119 +msgid "include image data in .gpi file (hdf5 format)" +msgstr "" + +#: src/main.c:122 +msgid "print parameters and other info to stdout" +msgstr "druk de parameters af naar stdout" + +#: src/main.c:125 +msgid "includes piv in the chain-proces" +msgstr "neem PIV op in het ketting process" + +#: src/main.c:128 +msgid "includes gradient in the chain-proces" +msgstr "neem gradient op in het ketting process" + +#: src/main.c:131 +msgid "includes resstats in the chain-proces" +msgstr "neem resstats op in het ketting process" + +#: src/main.c:134 +msgid "includes validate in the chain-proces" +msgstr "neem valideer op in het ketting process" + +#: src/main.c:137 +msgid "includes peaklock in the chain-proces" +msgstr "neem peaklock op in het ketting process" + +#: src/main.c:140 +msgid "includes average in the chain-proces" +msgstr "neem gemiddelde op in het ketting process" + +#: src/main.c:143 +#, fuzzy +msgid "includes scaling in the chain-proces" +msgstr "neem PIV op in het ketting process" + +#: src/main.c:146 +msgid "includes substract in the chain-proces" +msgstr "neem aftrekken op in het ketting process" + +#: src/main.c:149 +msgid "includes vorticity in the chain-proces" +msgstr "neem vorticiteit op in het ketting process" + +#: src/main.c:152 +#, fuzzy +msgid "display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0" +msgstr "" +"index voor vergroting: 1:0.5, 2:0.6, 3:0.83, 4:1.0, 5:1.3, 6:1.6, 7:2.0" + +#: src/main.c:153 src/main.c:156 +msgid "SCALE" +msgstr "SCHAAL" + +#: src/main.c:156 +msgid "vector length scale" +msgstr "vektor lengte schaal" + +#: src/console_menus.h:92 src/console_menus.h:338 src/main.c:162 +msgid "show tooltips" +msgstr "laat aanwijzingen zien" + +#: src/main.c:165 +msgid "view the gpiv buttons of the application" +msgstr "laat de gpivbalk van het programma zien" + +#: src/main.c:168 +msgid "view the tabulator of the application" +msgstr "laat de tabbladen van het programma zien" + +#: src/main.c:576 +#, c-format +msgid "image width = %d image height = %d" +msgstr "" + +#: src/main.c:605 +#, c-format +msgid "Image dimensions are larger then the allowed maxima (%dx%d)." +msgstr "" + +#: src/support.c:125 src/support.c:163 +#, c-format +msgid "Couldn't find pixmap file: %s" +msgstr "Kon geen pixmap bestand vinden: %s" + +#: src/support.c:141 +#, c-format +msgid "Couldn't create pixmap from file: %s" +msgstr "Kon geen pixmap bestand aanmaken: %s" + +#. _parented +#. gnome_dialog_new +#: src/console_menus.h:77 src/console_menus.h:324 src/preferences.c:144 +msgid "Preferences" +msgstr "Voorkeuren..." + +#: src/preferences.c:198 +msgid "View" +msgstr "Laat zien" + +#: src/console_menus.h:59 src/console_menus.h:309 src/preferences.c:230 +msgid "gpiv buttons" +msgstr "gpivbalk" + +#: src/console_menus.h:67 src/console_menus.h:316 src/preferences.c:259 +msgid "tabulator" +msgstr "tabbladen" + +#. +#: src/preferences.c:288 +#, fuzzy +msgid "In/output" +msgstr "Resultaat" + +#: src/preferences.c:318 +msgid "hdf5 format (.gpi)" +msgstr "" + +#: src/preferences.c:346 +msgid "include image in .gpi" +msgstr "" + +#: src/preferences.c:392 +msgid "img width: " +msgstr "" + +#: src/preferences.c:451 +msgid "img height: " +msgstr "" + +#. +#. * General; tooltips and histogram bins +#. +#: src/preferences.c:496 +msgid "tooltips" +msgstr "aanwijzingen" + +#: src/preferences.c:530 +msgid "processes" +msgstr "processen" + +#. +#. * PIV activating button +#. +#: src/console_interface.c:612 src/console_menus.h:177 +#: src/piveval_interface.c:2392 src/preferences.c:563 +msgid "piv" +msgstr "piv" + +#: src/console_interface.c:660 src/console_menus.h:188 src/preferences.c:593 +msgid "gradient" +msgstr "gradient" + +#: src/console_interface.c:706 src/console_menus.h:209 src/preferences.c:623 +msgid "residu stats" +msgstr "residu stats" + +#: src/console_interface.c:754 src/console_menus.h:198 src/preferences.c:653 +msgid "validate" +msgstr "valideer" + +#: src/console_interface.c:801 src/console_menus.h:220 src/preferences.c:683 +msgid "peaklock" +msgstr "peaklock" + +#: src/preferences.c:712 +#, fuzzy +msgid "scaling" +msgstr "Schaling" + +#: src/console_interface.c:893 src/console_menus.h:241 src/preferences.c:742 +msgid "average" +msgstr "gemiddelde" + +#. +#. * button to substracts averages +#. +#: src/console_interface.c:938 src/console_menus.h:251 +#: src/pivpost_interface.c:702 src/preferences.c:772 +msgid "substract" +msgstr "trek af" + +#: src/console_interface.c:984 src/console_menus.h:261 +#: src/pivpost_interface.c:1181 src/preferences.c:802 +msgid "vorticity" +msgstr "vorticiteit" + +#: src/preferences.c:852 +msgid "number of histogram bins: " +msgstr "aantal histogram punten" + +#: src/preferences.c:895 +msgid "console" +msgstr "" + +#. +#. * Vector scale +#. +#: src/preferences.c:930 +msgid "vector scale" +msgstr "vector schaal" + +#: src/display_menus.h:77 src/piveval_interface.c:1796 src/preferences.c:964 +msgid "1" +msgstr "1" + +#: src/display_menus.h:71 src/display_menus.h:79 src/piveval_interface.c:1829 +#: src/preferences.c:997 +msgid "2" +msgstr "2" + +#: src/display_menus.h:81 src/preferences.c:1029 +msgid "4" +msgstr "4" + +#: src/display_menus.h:83 src/piveval_interface.c:1093 src/preferences.c:1061 +msgid "8" +msgstr "8" + +#: src/display_menus.h:85 src/piveval_interface.c:663 +#: src/piveval_interface.c:892 src/piveval_interface.c:1128 +#: src/preferences.c:1093 +msgid "16" +msgstr "16" + +#: src/display_menus.h:87 src/piveval_interface.c:697 +#: src/piveval_interface.c:926 src/piveval_interface.c:1162 +#: src/preferences.c:1122 +msgid "32" +msgstr "32" + +#: src/display_menus.h:89 src/piveval_interface.c:731 +#: src/piveval_interface.c:960 src/piveval_interface.c:1196 +#: src/preferences.c:1151 +msgid "64" +msgstr "64" + +#. +#. * Zoom scale +#. +#: src/preferences.c:1180 +msgid "zoom scale" +msgstr "vergrotingsschaal" + +#: src/display_menus.h:61 src/preferences.c:1211 +msgid "0.5" +msgstr "0.5" + +#: src/display_menus.h:63 src/preferences.c:1242 +msgid "0.83" +msgstr "0.83" + +#: src/display_menus.h:65 src/preferences.c:1273 +msgid "1.0" +msgstr "1.0" + +#: src/display_menus.h:67 src/preferences.c:1304 +msgid "1.3" +msgstr "1.3" + +#: src/display_menus.h:69 src/preferences.c:1335 +msgid "1.6" +msgstr "1.6" + +#: src/preferences.c:1366 +msgid "2.0" +msgstr "2.0" + +#. +#. * Hide and display data +#. +#: src/preferences.c:1398 +msgid "hide/display data" +msgstr "verberg/plot data" + +#: src/preferences.c:1429 +msgid "image A" +msgstr "beeld A" + +#: src/preferences.c:1454 +msgid "image B" +msgstr "beeld B" + +#: src/display_menus.h:48 src/preferences.c:1479 +msgid "Interrogation area's" +msgstr "Onderzoeksgebiedjes" + +#: src/display_menus.h:50 src/preferences.c:1504 +msgid "Velocity vectors" +msgstr "Snelheidsvektoren" + +#: src/display_menus.h:51 src/pivpost_interface.c:810 src/preferences.c:1529 +msgid "Vorticity" +msgstr "Vorticiteit" + +#: src/display_menus.h:52 src/pivpost_interface.c:851 src/preferences.c:1554 +msgid "Shear strain" +msgstr "Afschuiving" + +#: src/display_menus.h:53 src/pivpost_interface.c:892 src/preferences.c:1575 +msgid "Normal strain" +msgstr "Druk" + +#: src/preferences.c:1603 +#, fuzzy +msgid "display" +msgstr "Laat zien" + +#: src/preferences.c:1665 +msgid "Updates parameters and save as defaults" +msgstr "Moderniseer parameters en sla op als standaard waarden" + +#: src/preferences.c:1689 +msgid "Updates actual parameters, do not store as defaults" +msgstr "Moderniseer parameters, sla niet op als standaard waarden" + +#: src/preferences.c:1715 +msgid "Close preferences window" +msgstr "Sluit voorkeursvenster af" + +#: src/console_menus.h:60 src/console_menus.h:310 +msgid "show gpiv check-buttons" +msgstr "laat gpivbalk zien" + +#: src/console_menus.h:68 src/console_menus.h:317 +msgid "show tabulator containing parameter settings" +msgstr "laat tabbladen met de parameterinstellingen zien" + +#: src/console_menus.h:78 +#, fuzzy +msgid "Define settings of the application" +msgstr "laat de gpivbalk van het programma zien" + +#: src/console_menus.h:93 src/console_menus.h:339 +msgid "show extended information in a small pop-up window" +msgstr "" +"laat uitgebreide informatie (aanwijzingen) in een kleine pop-up venster zien" + +#: src/console_menus.h:100 src/console_menus.h:345 +msgid "manual" +msgstr "handleiding" + +#: src/console_menus.h:129 +msgid "Open" +msgstr "Open" + +#: src/console_menus.h:129 +msgid "Open a PIV image or data-file" +msgstr "Open een PIV beeld of databestand" + +#: src/console_menus.h:135 +msgid "Save" +msgstr "Sla op" + +#: src/console_menus.h:135 +#, fuzzy +msgid "Save data" +msgstr "Bewaar data" + +#: src/console_menus.h:141 +msgid "Execute" +msgstr "Voer uit" + +#: src/console_menus.h:141 +msgid "Execute the enabled chain process(es)" +msgstr "Voer de gemarkeerde kettingprocessen uit" + +#: src/console_menus.h:147 +msgid "Stop" +msgstr "" + +#: src/console_menus.h:147 +#, fuzzy +msgid "Cancels all running processes" +msgstr "Voer alle gemarkeerde processen uit" + +#: src/console_menus.h:153 +#, fuzzy +msgid "Close" +msgstr "Kruis" + +#: src/console_menus.h:153 +msgid "" +"Close active buffer(s).\n" +"A warning message will be issued for unsaved data" +msgstr "" + +#: src/console_menus.h:161 +msgid "Exit" +msgstr "Sluit af" + +#: src/console_menus.h:161 +msgid "" +"Exit gpiv. \n" +"A warning message will be issued for unsaved data" +msgstr "" + +#: src/console_interface.c:626 src/console_menus.h:178 +msgid "" +"Enables PIV for chain processing: analysing of a PIV image (pair), resulting " +"into the mean displacements of the particle images within each interrogation " +"area. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Markeer PIV voor het kettingprocess: de analyse van een PIV beeld(paar), " +"welke resulteerd in de gemiddelde verplaatsing van de deeltjes binnen ieder " +"onderzoeks gebiedje.\n" +"Het process wordt uitgevoerd door het drukken op de Uitvoer knop" + +#: src/console_interface.c:674 src/console_menus.h:189 +msgid "" +"Enables gradient for chain processing: Disables velocities with gradients " +"larger than 0.05 over the interrogation area. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Markeer gradient voor het kettingprocess: Sluit snelheden uit met een " +"gradient groter dan 0.005 over het onderzoeksgebiedje.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." + +#: src/console_interface.c:768 src/console_menus.h:199 +msgid "" +"Enables validation for chain processing: detects outliers of PIV data by " +"testing on median residu or by Signal to Noise Ratio magnitudes and, " +"eventually, substitutes. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Markeer valideer voor het kettingprocess: vind uitschieters in PIV data door " +"het testen op de mediaan residu of op de grootte van de Signaal Ruis " +"verhouding (SNR) en, indien mogelijk, vervangt deze.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop" + +#: src/console_interface.c:720 src/console_menus.h:210 +msgid "" +"Enables residu statistics for chain processing: calculates the residus of " +"displacements for detection of outliers and shows an histogram of them. The " +"histogram will be displayed in the Piv Validation tab. \n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Markeer residu stats voor het kettingprocess: berekend de residuen in PIV " +"data voor het vinden van uitschieters en laat een histogram er van zien.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." + +#: src/console_interface.c:815 src/console_menus.h:221 +msgid "" +"Enables peak-lock for chain processing: shows an histogram of sub-pixel " +"displacements in order to check on peak-locking effects. The histogram will " +"be displayed in the Piv Validation tab. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Markeer peaklock process voor het kettingprocess: laat een histogram zien " +"van verplaatsingen op sub-pixel niveau. Nodig voor het controleren op peak " +"locking effecten.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop" + +#: src/console_interface.c:848 src/console_menus.h:231 +#: src/pivpost_interface.c:443 +#, fuzzy +msgid "scale" +msgstr "vergrotingsschaal" + +#: src/console_menus.h:232 +#, fuzzy +msgid "" +"Enables scale for chain processing: scales spatial displacements from all " +"data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Markeer aftrekken voor het kettingprocess: Trek de gemiddelde ruimtelijke " +"verplaatsing af van alle data.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." + +#: src/console_interface.c:906 src/console_menus.h:242 +msgid "" +"Enables average for chain processing: Calculates spatial average " +"displacements over all data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Markeer gemiddelde voor het kettingprocess: Berekend ruimtelijk gemiddelde " +"van alle data.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." + +#: src/console_interface.c:952 src/console_menus.h:252 +msgid "" +"Enables substract for chain processing: substracts spatial average " +"displacements from all data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Markeer aftrekken voor het kettingprocess: Trek de gemiddelde ruimtelijke " +"verplaatsing af van alle data.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." + +#: src/console_interface.c:998 src/console_menus.h:262 +msgid "" +"Enables vorticity for chain processing: calculates vorticity or strain " +"magnitudes from a velocity field.\n" +"The process will be executed by clicking the Execute button" +msgstr "" +"Markeer vorticiteit voor het kettingprocess: berekend vorticiteit of " +"afschuiving uit een snelheidsveld.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." + +#: src/console_interface.c:215 +msgid "gpiv" +msgstr "gpiv" + +#: src/console_interface.c:861 +#, fuzzy +msgid "" +"Enables scaling for chain processing: scales spatial displacements over all " +"data. \n" +"The process will be executed by clicking the \"Execute\" button" +msgstr "" +"Markeer gemiddelde voor het kettingprocess: Berekend ruimtelijk gemiddelde " +"van alle data.\n" +"Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." + +#: src/console_interface.c:1067 +msgid "Image Info" +msgstr "Beeld informatie" + +#: src/console_interface.c:1085 +msgid "Evaluation" +msgstr "Evaluatie" + +#: src/console_interface.c:1135 +msgid "Validation" +msgstr "Validatie" + +#. gtk_object_set_data(GTK_OBJECT(gpiv->console), +#. "gpiv", +#. gpiv); +#: src/console_interface.c:1216 +msgid "Post processing" +msgstr "Nabewerking" + +#: src/console_interface.c:1293 +msgid "buffer names and numbers" +msgstr "buffer namen en nummers" + +#: src/console_interface.c:1371 +msgid "buffer list" +msgstr "buffer lijst" + +#: src/console_interface.c:1392 +msgid "#" +msgstr "#" + +#: src/console_interface.c:1404 +msgid "buffer name" +msgstr "buffer naam" + +#. GtkWidget *about; +#. Title: +#. VersioN: +#. Copyright +#: src/console_interface.c:1524 +msgid "Copyright G. Van der Graaf" +msgstr "Copyright G. Van der Graaf" + +#. Author(s): +#. Comments: +#: src/console_interface.c:1526 +msgid "" +"gpiv is a program for (Digital) Particle Image Velocimetry. It evaluates " +"images (pairs), resulting into a velocity field of a fluid flow. The program " +"includes validation of the velocities and allows to post-proces the data " +"resulting into derivatives of the flow." +msgstr "" +"gpiv is een programma voor (Digitale) Particle Image Velocimetry. Het " +"evalueerd de beelden, welke resulteren in een snelheidsveld van een " +"vloeistof-of gasstroming. Het programma valideerd de resulterende PIV data " +"en kan post-processing uitvoeren om afgeleiden van het snelheidsveld te " +"berekenen" + +#: src/console_interface.c:1585 +msgid "" +"There are unsaved data that will be lost.\n" +"Are you sure you want to quit?" +msgstr "" + +#: src/console_interface.c:1680 +msgid "gpiv message" +msgstr "gpiv boodschap" + +#: src/console_interface.c:1754 +msgid "gpiv error" +msgstr "gpiv fout" + +#: src/console.c:334 src/console.c:350 +#, fuzzy +msgid "this is a demo!" +msgstr "Dit is een demo zonder licentie" + +#: src/console.c:474 +msgid "gpiv_fcreate_hdf5_image: unable to create file" +msgstr "" + +#: src/console.c:595 +msgid "Failure opening image header for output" +msgstr "Falen in het openen van beeldhooft voor invoer" + +#: src/console.c:607 +msgid "Failure opening parameter file for output" +msgstr "Falen in het openen van parameterbestand voor invoer" + +#: src/console.c:628 src/console.c:638 +msgid "Failure calling gpiv_fwrite_pivdata" +msgstr "Falen in het aanroepen van gpiv_fwrite_pivdata" + +#: src/console.c:666 src/console.c:688 src/console.c:710 +msgid "Failure calling gpiv_fwrite_scdata" +msgstr "Falen in het aanroepen van gpiv_fwrite_scdata" + +#: src/console.c:842 +msgid "" +"There are unsaved data that will be lost.\n" +"Are you sure you want to close buffer #" +msgstr "" + +#: src/console.c:844 +msgid "?" +msgstr "" + +#. +#. * Create a new file selection widget +#. * Connect the ok_button and cancel_button to file_ok_sel function +#. * Set a default filename +#. * set user data "gpiv" to filew +#. +#: src/console.c:988 +msgid "File selection" +msgstr "Bestands selectie" + +#: src/console.c:1121 +#, fuzzy +msgid "Opens image/PIV data (and display)" +msgstr "Open beel/PIV data (en viewer)" + +#: src/console.c:1132 +msgid "Saves data" +msgstr "Bewaar data" + +#: src/console.c:1143 +msgid "Executes all tickmarked processes" +msgstr "Voer alle gemarkeerde processen uit" + +#: src/console.c:1154 +msgid "Cancels any running processes" +msgstr "" + +#: src/console.c:1165 +msgid "Close active buffer(s)" +msgstr "" + +#: src/console.c:1175 +msgid "Exits gpiv" +msgstr "Sluit gpiv af" + +#: src/console.c:1531 +msgid "load_buffer:: non-valid file name" +msgstr "" + +#: src/console.c:1667 +#, c-format +msgid "" +"Image dimensions (%dx%d) differ from \n" +"parameter settings (%dx%d" +msgstr "" + +#: src/console.c:1678 src/console.c:1725 +msgid "" +"cross correlation parameter from image \n" +"not in agreement with gpiv setting" +msgstr "" + +#: src/console.c:1688 +msgid "file contains no image data" +msgstr "" + +#: src/console.c:1710 +#, c-format +msgid "" +"Image dimensions (%dx%d) differ from \n" +"parameter settings (%dx%d)" +msgstr "" + +#: src/console.c:1739 +msgid "failure reading image" +msgstr "" + +#: src/console.c:1763 +#, c-format +msgid "%s: Failure calling gpiv_count_pivdata\n" +msgstr "Gefaald in het aanroepen van gpiv_count_pivdata\n" + +#: src/console.c:1775 +#, c-format +msgid "%s: Failure calling fread_pivdata\n" +msgstr "Gefaald in het aanroepen van fread_pivdata\n" + +#: src/imgh_interface.c:67 +msgid "Image Header Info" +msgstr "Beeldhoofd informatie" + +#: src/imgh_interface.c:166 +msgid "buffer #: " +msgstr "buffer nummer" + +#: src/imgh_interface.c:215 +msgid "name: " +msgstr "naam:" + +#. viewport_imgh +#. +#. * label for ncols +#. +#: src/imgh_interface.c:264 +msgid "number of columns: " +msgstr "aantal colommen: " + +#. +#. * label for nrows +#. +#: src/imgh_interface.c:306 +msgid "number of rows: " +msgstr "aantal regels: " + +#. +#. * spinner for spatial scale "sscale" +#. +#: src/imgh_interface.c:350 src/pivpost_interface.c:185 +msgid "spatial scale (mm/px): " +msgstr "ruimtelijke schaal (mm/px): " + +#. +#. * spinner for time scale "tscale" +#. +#: src/imgh_interface.c:414 src/pivpost_interface.c:249 +#, fuzzy +msgid "time scale (ms): " +msgstr "tijdsschaal (s): " + +#. +#. * spinner for column position +#. +#: src/imgh_interface.c:493 +#, fuzzy +msgid "position of column #0 (m): " +msgstr "plaats van colom #0 (mm): " + +#. +#. * spinner for row position +#. +#: src/imgh_interface.c:558 +#, fuzzy +msgid "position of row #0 (m): " +msgstr "plaats van regel #0 (mm): " + +#. +#. * entry for project +#. +#: src/imgh_interface.c:622 +msgid "Project: " +msgstr "Project" + +#. +#. * entry for creation date +#. +#: src/imgh_interface.c:675 +msgid "Creation date: " +msgstr "Aanmaak datum:" + +#. +#. * entry for location +#. +#: src/imgh_interface.c:730 +msgid "Place: " +msgstr "Plaats:" + +#. +#. * entry for comment +#. +#: src/imgh_interface.c:785 +msgid "Comment: " +msgstr "Commentaar:" + +#: src/piveval_interface.c:64 +msgid "Piv: image evaluation" +msgstr "Piv: data evaluatie" + +#: src/piveval_interface.c:165 +msgid "first col:" +msgstr "eerste col:" + +#: src/piveval_interface.c:185 +msgid "last col:" +msgstr "laatste col:" + +#: src/piveval_interface.c:205 +msgid "pre-shift col:" +msgstr "voorversch. col:" + +#: src/piveval_interface.c:225 +msgid "first row:" +msgstr "eerste regel:" + +#: src/piveval_interface.c:245 +msgid "last row:" +msgstr "laatste regel:" + +#: src/piveval_interface.c:265 +msgid "pre-shift row:" +msgstr "voorversch. regel:" + +#: src/piveval_interface.c:574 +msgid "Int Size 1" +msgstr "Ond. afm. 1" + +#: src/display_menus.h:91 src/piveval_interface.c:765 +#: src/piveval_interface.c:993 src/piveval_interface.c:1230 +msgid "128" +msgstr "128" + +#. +#. * radio buttons for interrogation size 2 +#. +#: src/piveval_interface.c:800 +msgid "Int Size 2" +msgstr "Ond. afm. 2" + +#. +#. * radio buttons for shifted distance of interrogation areas +#. +#: src/piveval_interface.c:1028 +msgid "Shift" +msgstr "Verplaatsing" + +#. +#. * radio button for mouse selecting +#. +#: src/piveval_interface.c:1265 +msgid "Mouse select" +msgstr "Muis selectie" + +#: src/piveval_interface.c:1298 src/piveval_interface.c:1598 +#: src/pivvalid_interface.c:182 +msgid "None" +msgstr "Geen" + +#: src/piveval_interface.c:1336 +msgid "Area" +msgstr "Gebied" + +#: src/piveval_interface.c:1374 +msgid "Single int." +msgstr "Enkel gebied" + +#: src/piveval_interface.c:1412 +msgid "Single point" +msgstr "Enkel punt" + +#: src/piveval_interface.c:1450 +msgid "Drag int." +msgstr "Verschuif gebied" + +#: src/piveval_interface.c:1488 +msgid "Vert. Line" +msgstr "Vert. lijn" + +#: src/piveval_interface.c:1526 +msgid "Hor. Line" +msgstr "Hor. lijn" + +#. +#. * radio buttons for sub-pixel interpolation scheme +#. +#: src/piveval_interface.c:1565 +msgid "Interpolation scheme" +msgstr "Interpolatie schema" + +#: src/piveval_interface.c:1631 +msgid "Gauss" +msgstr "Gauss" + +#: src/piveval_interface.c:1665 +msgid "Power" +msgstr "Macht" + +#: src/piveval_interface.c:1699 +msgid "Gravity" +msgstr "Zwaartepunt" + +#. eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, +#. _("Marquardt")); +#. eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); +#. gtk_widget_ref (eval->radiobutton_fit_marquardt); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "radiobutton_fit_marquardt", +#. eval->radiobutton_fit_marquardt, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->radiobutton_fit_marquardt); +#. gtk_box_pack_start (GTK_BOX (eval->vbox10), +#. eval->radiobutton_fit_marquardt, +#. FALSE, +#. FALSE, +#. 0); +#. gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "ifit", +#. "4"); +#. gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_marquardt), +#. "eval", +#. eval); +#. gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "var_type", +#. "0"); +#. gtk_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), +#. "toggled", +#. GTK_SIGNAL_FUNC (on_toggle_piv), +#. NULL); +#. +#. * radio buttons for correlation peak number to be detected +#. +#: src/piveval_interface.c:1765 +msgid "Peak #" +msgstr "Top #" + +#: src/piveval_interface.c:1862 +msgid "3" +msgstr "3" + +#. +#. * additonal calculation schemes for correlation detection +#. +#: src/piveval_interface.c:1896 +msgid "Interrogation with:" +msgstr "Onderzoeken met:" + +#: src/piveval_interface.c:1928 +msgid "Weight Kernel" +msgstr "Weegfactor" + +#: src/piveval_interface.c:1955 +msgid "Zero off-set" +msgstr "Nul verschuiving" + +#: src/piveval_interface.c:1982 +#, fuzzy +msgid "Central diff." +msgstr "Centraal" + +#. +#. * radio buttons for cross-or auto correlation +#. +#: src/piveval_interface.c:2011 src/piveval_interface.c:2261 +msgid "Correlation" +msgstr "Correlatie" + +#: src/piveval_interface.c:2044 +msgid "Auto" +msgstr "Auto" + +#: src/piveval_interface.c:2077 +msgid "Cross" +msgstr "Kruis" + +#: src/piveval_interface.c:2113 +msgid "Interrogation areas and correlation" +msgstr "Onderzoeksgebieden en correlatie" + +#. +#. * drawing area interrogation area1 +#. +#: src/piveval_interface.c:2148 +msgid "Int. area 1" +msgstr "Ond. gebied 1" + +#. gnome canvas interrogation area1 +#. gtk_widget_push_visual (gdk_imlib_get_visual ()); +#. gtk_widget_push_colormap (gdk_imlib_get_colormap ()); +#. eval->canvas_disprocess_int1 = gnome_canvas_new (); +#. gtk_widget_pop_colormap (); +#. gtk_widget_pop_visual (); +#. gtk_widget_ref (eval->canvas_disprocess_int1); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "canvas_disprocess_int1", +#. eval->canvas_disprocess_int1, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->canvas_disprocess_int1); +#. gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_int1 ), +#. eval->canvas_disprocess_int1); +#. --------- drawing area interrogation area2 +#: src/piveval_interface.c:2204 +msgid "Int. area 2" +msgstr "Ond. gebied 2" + +#. gtk_widget_push_visual (gdk_imlib_get_visual ()); +#. gtk_widget_push_colormap (gdk_imlib_get_colormap ()); +#. eval->canvas_disprocess_cov = gnome_canvas_new (); +#. gtk_widget_pop_colormap (); +#. gtk_widget_pop_visual (); +#. gtk_widget_ref (eval->canvas_disprocess_cov); +#. gtk_object_set_data_full (GTK_OBJECT (main_window), +#. "canvas_disprocess_cov", +#. eval->canvas_disprocess_cov, +#. (GtkDestroyNotify) gtk_widget_unref); +#. gtk_widget_show (eval->canvas_disprocess_cov); +#. gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_cov), +#. eval->canvas_disprocess_cov); +#. gnome canvas display values +#: src/piveval_interface.c:2316 +msgid "Estimator" +msgstr "Schatter" + +#: src/piveval_interface.c:2353 +msgid "Display" +msgstr "Laat zien" + +#: src/piveval_interface.c:2411 +msgid "" +"analyses a PIV image (pair) resulting into mean displacements of the " +"particle images within the interrogation areas" +msgstr "" +"analyseerd een PIV beeld(paar) resulterend in een gemiddelde verplaatsing " +"van\n" +"de deeltjes-beelden binnen een onderzoeksgebiedje" + +#: src/piveval.c:86 src/pivvalid.c:82 +msgid "No mouse activity within displayer" +msgstr "Geen muis activiteit binnen de display window" + +#: src/piveval.c:96 +msgid "Selects an area within the image to be analyzed" +msgstr "Selecteer een gebied binnen het beeld om te analyseren" + +#: src/piveval.c:106 +msgid "" +"Piv evaluation at a single interrogation area. Conserves other existing data" +msgstr "" +"Piv berekening in een enkel onderzoeksgebiedje. Bewaard andere bestaande data" + +#: src/piveval.c:117 +msgid "" +"Piv evaluation at a single point in the image. Rejects all existing data!!" +msgstr "" +"Piv berekening in een enkel onderzoeks gebiedje. Gooit bestaande data weg!!" + +#: src/piveval.c:128 +msgid "Displaces a single interrogation area and analyzes" +msgstr "Verplaats een enkel onderzoeksgebiedje en analyseerd" + +#: src/piveval.c:138 +msgid "Evaluation at a vertical line. " +msgstr "Evaluatie op een vertikale line" + +#: src/piveval.c:148 +msgid "Evaluation at a horizontal line. " +msgstr "Evaluatie op een horizontale lijn" + +#: src/piveval.c:652 +msgid "Displays subimages, correlation image and cov. peak location" +msgstr "Plot onderzoeksgebiedje, correlatie functie en plaats van piek" + +#: src/piveval.c:731 +msgid "Analyses a PIV image (pair)" +msgstr "Analyseer een PIV beeld(paar)" + +#: src/piveval.c:803 +#, c-format +msgid "Failure calling gpiv_count_pivdata for %s" +msgstr "Gefaald in het aanroepen van gpiv_count_pivdata for %s" + +#: src/piveval.c:840 +#, c-format +msgid "Failure calling gpiv_fread_pivdata for %s" +msgstr "Gefaald in het aanroepen van gpiv_fread_pivdata for %s" + +#: src/piveval.c:965 +#, fuzzy +msgid "At first, open an image. Than we'll further see what will happen." +msgstr "" +"Om te beginnen: laad een beeld(paar). Dan zullen we daarna wel zien wat er " +"zal gebeuren." + +#: src/pivvalid_interface.c:61 +msgid "Piv: data validation" +msgstr "Piv: data validatie" + +#. +#. * Enable / Disable frame +#. +#: src/pivvalid_interface.c:146 +msgid "Disable data" +msgstr "Sluit data buiten" + +#: src/pivvalid_interface.c:224 +msgid "Enable point" +msgstr "Sluit punt aan" + +#: src/pivvalid_interface.c:263 +msgid "Disable point" +msgstr "Sluit punt buiten" + +#: src/pivvalid_interface.c:302 +msgid "Enable area" +msgstr "Sluit gebied aan" + +#: src/pivvalid_interface.c:341 +msgid "Disable area" +msgstr "Sluit gebied buiten" + +#: src/pivvalid_interface.c:382 +msgid "validate on velocity gradient " +msgstr "valideer a.h.v. snelheidsgradient" + +#: src/pivvalid_interface.c:402 +msgid "" +"Disables PIV data that have a too large velocity gradient over the " +"Interrogation Area" +msgstr "" +"Sluit PIV data buiten die een te hoge snelheidsgradient over een \n" +"onderzoeksgebiedje hebben" + +#. +#. * Frame for histogram of sub-pixel values (used to test on peak-locking +#. * effect) +#. +#: src/pivvalid_interface.c:430 +msgid "Peak locking" +msgstr "Peak locking" + +#: src/pivvalid_interface.c:481 +msgid "# bins: " +msgstr "#bins" + +#: src/pivvalid_interface.c:573 +msgid "residu statistics" +msgstr "residu statistiek" + +#: src/pivvalid_interface.c:587 +msgid "calculates residus of displacements and displays in a histogram" +msgstr "Berekend residuen van verplaatsingen en plot een histogram" + +#: src/pivvalid_interface.c:609 +msgid "peak lock" +msgstr "peak lock" + +#: src/pivvalid_interface.c:623 +msgid "" +"shows histogram of sub-pixel displacements in order to check on peak-locking " +"effects" +msgstr "" +"plot een histogram van sub-pixel verplaatsingen om te controleren op peak-" +"locking" + +#. +#. * Errvec frame +#. +#: src/pivvalid_interface.c:649 +msgid "Outliers" +msgstr "Uitschieters" + +#: src/pivvalid_interface.c:683 +msgid "Residu type:" +msgstr "Residu type" + +#: src/pivvalid_interface.c:715 +msgid "Snr" +msgstr "Snr" + +#: src/pivvalid_interface.c:760 src/pivvalid_interface.c:1057 +msgid "Median" +msgstr "Mediaan" + +#: src/pivvalid_interface.c:826 +msgid "Data yield: " +msgstr "Data opbrengst" + +#: src/pivvalid_interface.c:891 +msgid "Threshold: " +msgstr "Drempel" + +#: src/pivvalid_interface.c:941 +msgid "show values" +msgstr "Laat waarden zien" + +#. +#. * Radio buttons for substitution type +#. +#: src/pivvalid_interface.c:980 +msgid "Substituted by:" +msgstr "Vervangen door:" + +#: src/pivvalid_interface.c:1012 +msgid "Mean of surroundings" +msgstr "Gemiddelde van omliggenden" + +#: src/pivvalid_interface.c:1101 +msgid "Next highest cov. peak" +msgstr "Volgende hoogste corr. piek" + +#: src/pivvalid_interface.c:1145 +msgid "validate on outliers" +msgstr "valideer uitschieters" + +#: src/pivvalid_interface.c:1159 +msgid "substitutes outliers" +msgstr "vervang uitschieters" + +#: src/pivvalid.c:45 +msgid "Examines PIV data on velocity gradients" +msgstr "Onderzoek PIV data op snelheidsgradienten" + +#: src/pivvalid.c:92 +#, fuzzy +msgid "Enables a single PIV data-point" +msgstr "Sluit een enkel PIV punt af" + +#: src/pivvalid.c:102 +msgid "Disables a single PIV data-point" +msgstr "Sluit een enkel PIV punt af" + +#: src/pivvalid.c:112 +#, fuzzy +msgid "Enables an area containing PIV data" +msgstr "Sluit een gebied met PIV data af" + +#: src/pivvalid.c:122 +msgid "Disables an area containing PIV data" +msgstr "Sluit een gebied met PIV data af" + +#: src/pivvalid.c:139 +msgid "Defines residu type to examine data on" +msgstr "Bepaal het type residu waarmee de data moeten worden beoordeeld" + +#: src/pivvalid.c:165 +msgid "Displays inverse cumulative histogram of residus" +msgstr "Plot een inverse cumulatief histogram van residuen" + +#: src/pivvalid.c:227 +msgid "Display PIV vector colors related to residu or SNR value" +msgstr "" +"Plot PIV vektoren in de kleuren welke gerelateerd zijn aan de SNR waarde" + +#: src/pivvalid.c:251 +msgid "Defines how to substitute the data" +msgstr "Bepaal hoe de data vervangen moeten worden" + +#: src/pivvalid.c:279 +msgid "Examines PIV data on outliers and substitutes" +msgstr "Onderzoek de PIV data op uitschieters en vervang" + +#: src/pivvalid.c:324 +msgid "Calculates a histogram of sub-pixel displacements" +msgstr "Berekent een histogram van sub-pixel verplaatsingen." + +#: src/pivpost.c:322 src/pivpost.c:414 src/pivpost.c:531 src/pivpost.c:671 +#: src/pivvalid.c:375 src/pivvalid.c:570 src/pivvalid.c:657 +msgid "no PIV data" +msgstr "geen PIV data" + +#: src/pivpost_interface.c:62 +msgid "Piv: data post processing" +msgstr "Piv: data post precessing" + +#. +#. * Scale frame +#. +#. +#. * Spinners use the adjustment from spinbutton_adj_imgh_* +#. +#: src/pivpost_interface.c:149 +msgid "Scaling" +msgstr "Schaling" + +#. +#. * spinner for column position +#. +#: src/pivpost_interface.c:314 +#, fuzzy +msgid "pos. of col #0 (m): " +msgstr "plaats van colom #0 (mm): " + +#. +#. * spinner for row position +#. +#: src/pivpost_interface.c:380 +#, fuzzy +msgid "pos. of row #0 (m): " +msgstr "plaats van regel #0 (mm): " + +#: src/pivpost_interface.c:462 +#, fuzzy +msgid "" +"Calculates time and spatial scaled particle displacements (i.e. velocities) " +"from a PIV displacement field, and their scaled positions" +msgstr "" +"Berekend ruimtelijk gemiddelde verplaatsingen of snelheden van een \n" +"snelheidsveld, verkregen van PIV data." + +#. +#. * Spatial average frame +#. +#: src/pivpost_interface.c:489 +msgid "Spatial statistics" +msgstr "Ruimtelijke statistiek" + +#. +#. *spinner for spatial U-avg +#. +#: src/pivpost_interface.c:525 +#, fuzzy +msgid "dx (px), U (m/s): " +msgstr "dx (px), U (mm/s): " + +#. +#. * KEEP DISABLED +#. +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "post", post); +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "var_type", "3"); +#. gtk_signal_connect(GTK_OBJECT(post->spinbutton_suavg), +#. "changed", +#. on_spinbutton_post_suavg, +#. post->spinbutton_suavg); +#. +#. * end of KEEP DISABLED +#. +#. +#. * spinner for spatial V-avg +#. +#: src/pivpost_interface.c:593 +#, fuzzy +msgid "dy (px), V (m/s): " +msgstr "dy (px), V (mm/s): " + +#. +#. * KEEP DISABLED +#. +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_svavg), +#. "var_type", "3"); +#. gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), +#. "post", post); +#. gtk_signal_connect(GTK_OBJECT(post->spinbutton_svavg), +#. "changed", +#. on_spinbutton_post_svavg, +#. post->spinbutton_svavg); +#. +#. * end of KEEP DISABLED +#. +#. +#. * button to calculate averages +#. +#: src/pivpost_interface.c:660 +msgid "avarage" +msgstr "gemiddelde" + +#: src/pivpost_interface.c:678 +msgid "" +"Calculates spatial average particle displacements or velocities from a " +"velocity field, obtained from PIV data" +msgstr "" +"Berekend ruimtelijk gemiddelde verplaatsingen of snelheden van een \n" +"snelheidsveld, verkregen van PIV data." + +#: src/pivpost_interface.c:721 +msgid "" +"Substracts the spatial averages, or values that have been entered manually, " +"from each estimator" +msgstr "" +"Trek ruimtelijk gemidelde, of de zelf ingevoerde waarde, af van iedere " +"schatter" + +#. +#. * Vorstra frame +#. +#: src/pivpost_interface.c:745 +msgid "Vorticity & strain" +msgstr "Vorticiteit en afschuiving" + +#: src/pivpost_interface.c:778 +msgid "Output:" +msgstr "Resultaat" + +#: src/pivpost_interface.c:930 +msgid "Differential scheme:" +msgstr "Deifferentiaal schema" + +#: src/pivpost_interface.c:964 +msgid "Central" +msgstr "Centraal" + +#: src/pivpost_interface.c:1005 +msgid "Least squares" +msgstr "Kleinste kwadraten" + +#: src/pivpost_interface.c:1047 +msgid "Richardson" +msgstr "Richardson" + +#: src/pivpost_interface.c:1097 +msgid "Circulation method" +msgstr "Circulatie methode" + +#: src/pivpost_interface.c:1195 +msgid "" +"Calculates vorticity or strain magnitudes from a velocity field, obtained by " +"PIV" +msgstr "" +"Berekend vorticiteit of afschuiving uit een snelheidsveld, verkregen met " +"behulp van PIV" + +#: src/pivpost.c:100 +#, fuzzy +msgid "Calculates scaled locations and velocities" +msgstr "Plot geschaalde plaatsen en snelheden" + +#: src/pivpost.c:137 +msgid "Calculates spatial average displacements" +msgstr "Berekend ruimtelijk gemiddelde verplaatsingen/snelheden" + +#: src/pivpost.c:173 +msgid "Substracts mean displacements from PIV data" +msgstr "Trek gemiddelde verplaatsingen van de PIV data af" + +#: src/pivpost.c:209 +msgid "Selects the differential quantity" +msgstr "Selecteer de differentiaal grootheid" + +#: src/pivpost.c:244 +msgid "Selects the type of differential scheme" +msgstr "Kies het type differentiaal schema" + +#: src/pivpost.c:265 +msgid "Calculates differential quantity" +msgstr "Bereken de differentiaal grootheid" + +#: src/pivpost.c:666 +msgid "non valid vorstra operation" +msgstr "geen geldige uitvoering van vorstra" + +#: src/display_menus.h:42 +#, fuzzy +msgid "Stretch display window" +msgstr "Strek plotvenster uit" + +#: src/display_menus.h:43 +#, fuzzy +msgid "Stretch or fit display window to the image area" +msgstr "Strek plotvenster uit tot de afmetingen van het beeldoppervlak" + +#: src/display_menus.h:46 +msgid "Image A" +msgstr "Beeld A" + +#: src/display_menus.h:47 +msgid "Image B" +msgstr "Beeld B" + +#: src/display_menus.h:93 +msgid "256" +msgstr "256" + +#: src/display_menus.h:115 +msgid "Zoom in/out" +msgstr "Vergroot/verklein" + +#: src/display_menus.h:116 +msgid "Vector scale" +msgstr "Vektor schaal" + +#: src/display.c:1056 +#, fuzzy +msgid "no image or piv data" +msgstr "Open een PIV beeld of databestand" + +#~ msgid "view the menu bar of the application" +#~ msgstr "laat de menubalk van het programma zien" + +#~ msgid "view the tool buttons of the application" +#~ msgstr "laat de werkbalk van het programma zien" + +#~ msgid "menubar" +#~ msgstr "menubalk" + +#~ msgid "tool buttons" +#~ msgstr "werkbalk" + +#~ msgid "interface" +#~ msgstr "interface" + +#~ msgid "Save File(s)" +#~ msgstr "Sla bestand(en) op" + +#~ msgid "Exit gpiv" +#~ msgstr "Sluit gpiv af" + +#~ msgid "Aren't you sure you don't want to quit?" +#~ msgstr "Ben je er niet zeker van dat je niet wilt afsluiten?" + +#~ msgid "menu bar" +#~ msgstr "menubalk" + +#~ msgid "show menu bar" +#~ msgstr "laat menubalk zien" + +#~ msgid "show tool button bar" +#~ msgstr "laat werkbalk zien" + +#~ msgid "Adaptive Inter." +#~ msgstr "Aanpassend Ond." + +#~ msgid "Apply" +#~ msgstr "Pas toe" + +#~ msgid "0.6" +#~ msgstr "0.6" + +#~ msgid "viewer" +#~ msgstr "plot venster" + +#~ msgid "" +#~ "Enables a single PIV data-point to be used for further validating and " +#~ "post processing" +#~ msgstr "" +#~ "Sluit een enkel PIV punt aan om te gebruiken voor verdere validatie en " +#~ "post processen" + +#~ msgid "Enables an area containing PIV data to be used" +#~ msgstr "" +#~ "Sluit een gebied aan met PIV data om te gebruiken voor verdere validatie " +#~ "en post processen" + +#~ msgid "not connected, yet" +#~ msgstr "(nog) niet aangesloten" + +#~ msgid "Image processing" +#~ msgstr "Beeld bewerking" + +#~ msgid "Image Proc" +#~ msgstr "Beeld bew." + +#~ msgid "Piv: image analysis" +#~ msgstr "Piv: beeld analyse" + +#~ msgid "Piv analysis" +#~ msgstr "Piv analyse" + +#~ msgid "Piv Post" +#~ msgstr "Piv Post" + +#~ msgid "" +#~ "Disables a single data point that will not be usedfor further validating " +#~ "and post processing" +#~ msgstr "" +#~ "Sluit een enkel punt buiten zodat het niet wordt gebruikt voor validatie " +#~ "en post processing" + +#~ msgid "" +#~ "gpiv is a program for (Digital) Particle Image Velocimetry. It evaluates " +#~ "images (pairs), " +#~ msgstr "" +#~ "gpiv is een programma voor (Digitale) Particle Image Velocimetry. Het " +#~ "onderzoekt beelden (paren)" + +# Obsolete +#~ msgid "_Interrogation area's" +#~ msgstr "Onderzoeksgebiedjes" + +#~ msgid "_Vorticity" +#~ msgstr "Vorticiteit" + +#~ msgid "_Shear strain" +#~ msgstr "Afschuiving" + +#~ msgid "_Normal strain" +#~ msgstr "Druk" + +#~ msgid "Covariance" +#~ msgstr "Correlatie" diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..8213d43 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,33 @@ +## Process this file with automake to produce Makefile.in +##AM_CFLAGS = -DDEBUG + +INCLUDES = \ + -I$(top_srcdir)/intl \ + $(GNOME_INCLUDEDIR) + +bin_PROGRAMS = gpiv + +gpiv_SOURCES = \ + pivpost.c pivpost.h \ + pivpost_interface.c pivpost_interface.h \ + pivvalid.c pivvalid.h \ + pivvalid_interface.c pivvalid_interface.h \ + piveval.c piveval.h \ + piveval_interface.c piveval_interface.h \ + imgh.c imgh.h \ + imgh_interface.c imgh_interface.h \ + display.c display.h \ + display_interface.c display_interface.h display_menus.h \ + console.c console.h \ + console_interface.c console_interface.h console_menus.h \ + preferences.c preferences.h \ + support.c support.h \ + utils.c utils.h \ + main.c gpiv_gtk.h + +AM_CFLAGS = @OVERRIDE_IMAGE_WIDTH_MAX@ \ + @OVERRIDE_IMAGE_HEIGHT_MAX@ \ + @DEBUG@ \ + @DEMO@ + +gpiv_LDADD = $(GNOME_LIBDIR) $(GNOMEUI_LIBS) $(INTLLIBS) diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..2ae8ff8 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,336 @@ +# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +DATADIRNAME = @DATADIRNAME@ +DEBUG = @DEBUG@ +DEMO = @DEMO@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNOMEGNORBA_LIBS = @GNOMEGNORBA_LIBS@ +GNOMEUI_LIBS = @GNOMEUI_LIBS@ +GNOME_APPLETS_LIBS = @GNOME_APPLETS_LIBS@ +GNOME_CAPPLET_LIBS = @GNOME_CAPPLET_LIBS@ +GNOME_CONFIG = @GNOME_CONFIG@ +GNOME_DOCKLETS_LIBS = @GNOME_DOCKLETS_LIBS@ +GNOME_INCLUDEDIR = @GNOME_INCLUDEDIR@ +GNOME_LIBDIR = @GNOME_LIBDIR@ +GNOME_LIBS = @GNOME_LIBS@ +GNORBA_CFLAGS = @GNORBA_CFLAGS@ +GNORBA_LIBS = @GNORBA_LIBS@ +GTKXMHTML_LIBS = @GTKXMHTML_LIBS@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIBICONV = @LIBICONV@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +ORBIT_CFLAGS = @ORBIT_CFLAGS@ +ORBIT_CONFIG = @ORBIT_CONFIG@ +ORBIT_IDL = @ORBIT_IDL@ +ORBIT_LIBS = @ORBIT_LIBS@ +OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ +OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ +PACKAGE = @PACKAGE@ +PACKAGE_PIXMAPS_DIR = @PACKAGE_PIXMAPS_DIR@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PTHREAD_LIB = @PTHREAD_LIB@ +RANLIB = @RANLIB@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XPM_LIBS = @XPM_LIBS@ +ZVT_LIBS = @ZVT_LIBS@ +cflags_set = @cflags_set@ +cxxflags_set = @cxxflags_set@ + +INCLUDES = -I$(top_srcdir)/intl $(GNOME_INCLUDEDIR) + + +bin_PROGRAMS = gpiv + +gpiv_SOURCES = pivpost.c pivpost.h pivpost_interface.c pivpost_interface.h pivvalid.c pivvalid.h pivvalid_interface.c pivvalid_interface.h piveval.c piveval.h piveval_interface.c piveval_interface.h imgh.c imgh.h imgh_interface.c imgh_interface.h display.c display.h display_interface.c display_interface.h display_menus.h console.c console.h console_interface.c console_interface.h console_menus.h preferences.c preferences.h support.c support.h utils.c utils.h main.c gpiv_gtk.h + + +AM_CFLAGS = @OVERRIDE_IMAGE_WIDTH_MAX@ @OVERRIDE_IMAGE_HEIGHT_MAX@ @DEBUG@ @DEMO@ + + +gpiv_LDADD = $(GNOME_LIBDIR) $(GNOMEUI_LIBS) $(INTLLIBS) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(bin_PROGRAMS) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I.. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +gpiv_OBJECTS = pivpost.o pivpost_interface.o pivvalid.o \ +pivvalid_interface.o piveval.o piveval_interface.o imgh.o \ +imgh_interface.o display.o display_interface.o console.o \ +console_interface.o preferences.o support.o utils.o main.o +gpiv_DEPENDENCIES = +gpiv_LDFLAGS = +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +SOURCES = $(gpiv_SOURCES) +OBJECTS = $(gpiv_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ + $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + done + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +gpiv: $(gpiv_OBJECTS) $(gpiv_DEPENDENCIES) + @rm -f gpiv + $(LINK) $(gpiv_LDFLAGS) $(gpiv_OBJECTS) $(gpiv_LDADD) $(LIBS) + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = src + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: install-binPROGRAMS +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-binPROGRAMS +uninstall: uninstall-am +all-am: Makefile $(PROGRAMS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ + mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \ + mostlyclean-am + +clean: clean-am + +distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ + distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-binPROGRAMS \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ +maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ +check-am installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/console.c b/src/console.c new file mode 100644 index 0000000..52df3d5 --- /dev/null +++ b/src/console.c @@ -0,0 +1,1787 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (Callback) functions for console + * $Log: console.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#include "support.h" + +#include "gpiv_gtk.h" +#include "console_interface.h" +#include "console_menus.h" +#include "console.h" +#include "display.h" +#include "piveval.h" +#include "pivvalid.h" +#include "pivpost.h" +#include "preferences.h" +#include "utils.h" + + + +/* + * loading images and (piv) data functions + */ + + + +static void +file_ok_sel(GtkWidget * w, + GtkFileSelection * fs); + +static void +select_action_from_fname(GpivConsole *gpiv, + gchar *fname_in); + +static void +load_buffer(GpivConsole *gpiv, + char *fname_in, + char *fname_base, + char *fname_ext, + gboolean read_hdf, + int ibuf, + enum ClistPut clist_put); + +static int +open_img(char *fname_in, + Image * img, + gboolean read_hdf); + +static void +open_piv(char *fname_in, + GpivData * gpd); + + +/* + * General callbacks + */ + +void +on_widget_leave(GtkContainer * container, + GtkDirectionType direction, gpointer user_data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(container), "gpiv"); + gnome_appbar_push(GNOME_APPBAR(gpiv->appbar), msg_default); +} + + +/* + * Callback functions for pop-up menus + */ + +gint +on_my_popup_handler(GtkWidget *widget, GdkEvent *event) + { + GtkMenu *menu; + GdkEventButton *event_button; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (GTK_IS_MENU (widget), FALSE); + g_return_val_if_fail (event != NULL, FALSE); + + /* The "widget" is the menu that was supplied when + * gtk_signal_connect_object was called. + */ + menu = GTK_MENU (widget); + + if (event->type == GDK_BUTTON_PRESS) + { + event_button = (GdkEventButton *) event; + if (event_button->button == 3) + { + gtk_menu_popup (menu, NULL, NULL, NULL, NULL, + event_button->button, event_button->time); + return TRUE; + } + } + + return FALSE; + } + + + + + +/* + * Main gpiv-gui callbacks + */ + + +void +on_clist_buf_rowselect(GtkWidget * clist, + gint row, + gint column, + GdkEventButton * event, + gpointer data) +{ + gchar * text, labelno[MAX_CHARS]; + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(clist), "gpiv"); + GList *lis; + gint cnt = 0, buf_dum = 0/* , ibuf = 0 */; + + if (!exec_process && GTK_CLIST (clist)->selection) { + for (lis = GTK_CLIST (clist)->selection; lis; lis = lis->next) { + row=GPOINTER_TO_INT (lis->data); + gtk_clist_get_text(GTK_CLIST(clist), row, /* column */ 0, &text); + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + + /* Just prints some information about the selected row */ +/* ibuf = display_act->count; */ + +#ifdef DEBUG + if (print_par) g_warning("on_clist_buf_rowselect:: row=%d, text=%s", + row, text); +#endif + + if(cnt == 0) { + gpiv->first_selected_row = row; + } else { + gpiv->last_selected_row = row; + } +/* + * update variables of display before leaving the focus + */ + if (display_act->intreg.exist == TRUE) { + display_act->intreg.row_start_old = 0; + display_act->intreg.row_start = piv_eval_par.row_start; + display_act->intreg.row_end = piv_eval_par.row_end; + display_act->intreg.col_start_old = 0; + display_act->intreg.col_start = piv_eval_par.col_start; + display_act->intreg.col_end = piv_eval_par.col_end; + display_act->intreg.int_size_1 = piv_eval_par.int_size_1; + display_act->intreg.int_size_2 = piv_eval_par.int_size_2; + display_act->intreg.int_shift = piv_eval_par.int_shift; + display_act->intreg.pre_shift_row = piv_eval_par.pre_shift_row; + display_act->intreg.pre_shift_col = piv_eval_par.pre_shift_col; + } + + +/* if (GTK_WIDGET_REALIZED(display_act->gpd.display)) */ + + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); +/* + * Set variables of new active display equal to parameters +*/ + if (display_act->intreg.exist == TRUE + && (display_act->intreg.row_start != piv_eval_par.row_start + || display_act->intreg.row_end != piv_eval_par.row_end + || display_act->intreg.col_start != piv_eval_par.col_start + || display_act->intreg.col_end != piv_eval_par.col_end + || display_act->intreg.int_size_1 != piv_eval_par.int_size_1 + || display_act->intreg.int_size_2 != piv_eval_par.int_size_2 + || display_act->intreg.int_shift != piv_eval_par.int_shift + || display_act->intreg.pre_shift_row != piv_eval_par.pre_shift_row + || display_act->intreg.pre_shift_col != piv_eval_par.pre_shift_col) + ) { + destroy_all_intregs(display_act); + create_all_intregs(display_act); + } + + if (display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) + { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + +/* + * update labels in image header tab/window + */ + g_snprintf(labelno, MAX_CHARS,"%d", display_act->count); + gtk_label_set_text(GTK_LABEL(gpiv->imgh->label_bufno), + (char *) labelno); + gtk_label_set_text(GTK_LABEL(gpiv->imgh->label_name), + display_act->fname_base); + gtk_entry_set_text(GTK_ENTRY(gpiv->imgh->entry_project), + /* display_act->gpd. */ image_par.project); + gtk_entry_set_text(GTK_ENTRY(gpiv->imgh->entry_crdate), + /* display_act->gpd. */ image_par.creation_date); + gtk_entry_set_text(GTK_ENTRY(gpiv->imgh->entry_location), + /* display_act->gpd. */ image_par.location); + gtk_entry_set_text(GTK_ENTRY(gpiv->imgh->entry_comment), + /* display_act->gpd. */ image_par.comment); +/* gtk_widget_grab_focus (display_act); */ + } + + + cnt++; + } + if (cnt == 1) { + gpiv->last_selected_row = gpiv->first_selected_row; + } + + if (gpiv->last_selected_row < gpiv->first_selected_row) { + buf_dum = gpiv->last_selected_row; + gpiv->last_selected_row = gpiv->first_selected_row; + gpiv->first_selected_row = buf_dum; + } + + } + +#ifdef DEBUG + if (print_par) g_warning("on_clist_buf_rowselect:: first_selected_row = %d, ast_selected_row = %d", + gpiv->first_selected_row, gpiv->last_selected_row); +#endif +} + + +void +on_clist_buf_drag_data_received (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *data, + guint info, + guint time) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *fname_in; + gchar **fname_v; + + g_print("Got: %s\n", data->data); + fname_in = g_strdup(data->data); + + fname_v = g_strsplit(data->data, ":", 1); + fname_in = g_strdup(fname_v[1]); + g_strchomp (fname_in); + + g_warning("fname_in = %s", fname_in); + select_action_from_fname(gpiv, fname_in); + + g_free(fname_in); + g_strfreev(fname_v); +} + + +void +on_open_activate(GtkMenuItem * menuitem, + gpointer user_data) +{ + GtkWidget *filew; + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(menuitem), "gpiv"); + +/* + * Create a new file selection widget + * Connect the ok_button and cancel_button to file_ok_sel function + * set user data to filew + * Lets set a default filename + */ + filew = gtk_file_selection_new(/* "File selection" */"gpiv: open image"); + gtk_signal_connect(GTK_OBJECT(filew), "destroy", + (GtkSignalFunc) destroy, &filew); + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), + "clicked", (GtkSignalFunc) file_ok_sel, + GTK_OBJECT(filew)); + gtk_signal_connect_object(GTK_OBJECT + (GTK_FILE_SELECTION(filew)->ok_button), + "clicked", + (GtkSignalFunc) gtk_widget_destroy, + GTK_OBJECT(filew)); + gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), + "gpiv", + gpiv); + gtk_signal_connect_object(GTK_OBJECT + (GTK_FILE_SELECTION(filew)->cancel_button), + "clicked", + (GtkSignalFunc) gtk_widget_destroy, + GTK_OBJECT(filew)); + gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), + /* DEFAULT_TEST_IMAGE */ fname_last); + gtk_widget_show(filew); + gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(filew)), + "gpiv", + gpiv); + +} + + + +void +on_save_activate(GtkMenuItem * menuitem, + gpointer user_data) +{ +#ifdef DEMO + gtk_warning(_("this is a demo!")); +#else + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(menuitem), "gpiv"); + save_all_data(gpiv); +#endif +} + + +void +on_save_as_activate(GtkMenuItem * menuitem, + gpointer user_data) +{ + GtkWidget *filew; + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(menuitem), "gpiv"); + +#ifdef DEMO + gtk_warning(_("this is a demo!")); +#else + +/* + * Create a new file selection widget + * Connect the ok_button and cancel_button to file_saveas_ok_sel function + * set user data to filew + * Lets set a default filename + */ + filew = gtk_file_selection_new("File selection"); + gtk_signal_connect(GTK_OBJECT(filew), "destroy", + (GtkSignalFunc) destroy, &filew); + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), + "clicked", (GtkSignalFunc) file_saveas_ok_sel, + GTK_OBJECT(filew)); + gtk_signal_connect_object(GTK_OBJECT + (GTK_FILE_SELECTION(filew)->ok_button), + "clicked", + (GtkSignalFunc) gtk_widget_destroy, + GTK_OBJECT(filew)); + gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), + "gpiv", + gpiv); + gtk_signal_connect_object(GTK_OBJECT + (GTK_FILE_SELECTION(filew)->cancel_button), + "clicked", + (GtkSignalFunc) gtk_widget_destroy, + GTK_OBJECT(filew)); + gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), + /* DEFAULT_TEST_IMAGE */ fname_last); + gtk_widget_show(filew); + gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(filew)), + "gpiv", + gpiv); + +#endif +} + + +void +file_saveas_ok_sel(GtkWidget * widget, + GtkFileSelection * fs + ) +/* ---------------------------------------------- PIV data file selection */ +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(fs), "gpiv"); + gchar *fname_in, + *dirname, + *fname_base, + *fname_ext; + + gchar *clist_buf_txt[MAX_BUFS][2], cl_int[2]; + + + fname_in = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs))); + +/* + * Stripping file name + * + */ +/*---------------------------------------------------------------------- + * With GLIB-2.0: + * gchar* g_path_get_basename (const gchar *file_name); + * gchar* g_path_get_dirname (const gchar *file_name); + * g_build_filename + *----------------------------------------------------------------------*/ + dirname = g_strdup(g_dirname(fname_in)); + fname_base = g_strdup(g_basename(fname_in)); + strtok(fname_base, "."); + fname_ext = g_strdup(g_strconcat(dirname, G_DIR_SEPARATOR_S, + fname_base, NULL)); + +/* + * Substituting fname_base and storing data of display_act + */ + gtk_clist_remove(GTK_CLIST(gpiv->clist_buf), display_act->count); + g_snprintf(cl_int, 2, "%d", display_act->count); + g_snprintf(display_act->fname_base, MAX_CHARS, "%s", fname_ext); + clist_buf_txt[display_act->count][0] = (gchar *) cl_int; + clist_buf_txt[display_act->count][1] = fname_base; + gtk_clist_insert(GTK_CLIST(gpiv->clist_buf), display_act->count, + clist_buf_txt[display_act->count]); + + g_snprintf(display_act->msg_display_default, MAX_CHARS, "%s", + display_act->fname_base); + gnome_appbar_set_default(GNOME_APPBAR(display_act->appbar), + display_act->msg_display_default); + + save_all_data(gpiv); + g_free(fname_in); + g_free(dirname); + g_free(fname_base); + g_free(fname_ext); +} + + + +void +save_all_data(GpivConsole * gpiv) +{ + gint row, ibuf, return_val, flag_vor = 0; + char fname_out[MAX_CHARS], fname_par[MAX_CHARS]; + FILE *fp_par; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + ibuf = display_act->count; + if (display[ibuf] != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } +/* + * Store all data in display_act->fname_base.gpi in hdf5 format + */ + if (gpiv_par.hdf) { + int return_val = 0; + if (print_par) gpiv_warning("writing HDF5 fmt"); + gpiv_io_make_fname(display_act->fname_base, EXT_GPIV, fname_out); + + if ((return_val = gpiv_fcreate_hdf5 (fname_out)) < 0) + gtk_warning(_("gpiv_fcreate_hdf5_image: unable to create file")); + + gpiv_img_fwrite_hdf5_parameters (fname_out, + &display_act->img.image_par); + if (gpiv_par.hdf_img) { + gpiv_fwrite_hdf5_image (fname_out, display_act->img.img1, + display_act->img.img2, + &display_act->img.image_par); + } + + + + if (display_act->gpd.exist_piv) { + if (display_act->gpd.scaled_piv) { + gpiv_fwrite_hdf5_piv_position + (fname_out, + &display_act->gpd.piv_data_scaled, + RCSID, + &display_act->gpd.scaled_piv); + + gpiv_fwrite_hdf5_pivdata + (fname_out, + &display_act->gpd.piv_data_scaled, + "PIV", + RCSID, + &display_act->gpd.scaled_piv); + } else { + gpiv_fwrite_hdf5_piv_position + (fname_out, + &display_act->gpd.piv_data, + RCSID, + &display_act->gpd.scaled_piv); + + gpiv_fwrite_hdf5_pivdata + (fname_out, + &display_act->gpd.piv_data, + "PIV", + RCSID, + &display_act->gpd.scaled_piv); + } + display_act->gpd.saved_piv = TRUE; + + gpiv_piv_fwrite_hdf5_parameters + (fname_out, + &display_act->gpd.piv_eval_par); + } + + + if (display_act->gpd.exist_valid) { + gpiv_valid_fwrite_hdf5_parameters + (fname_out, &display_act->gpd.piv_valid_par); + } + + + if (display_act->gpd.exist_vor) { + if (display_act->gpd.scaled_piv ) { + gpiv_fwrite_hdf5_scdata(fname_out, + &display_act->gpd. + vor_data_scaled, + "VORTICITY", + RCSID); + } else { + gpiv_fwrite_hdf5_scdata(fname_out, + &display_act->gpd.vor_data, + "VORTICITY", + RCSID); + } + display_act->gpd.saved_vor = TRUE; + } + + + if (display_act->gpd.exist_sstrain) { + if (display_act->gpd.scaled_piv ) { + gpiv_fwrite_hdf5_scdata(fname_out, + &display_act->gpd. + sstrain_data_scaled, + "SHEAR_STRAIN", + RCSID); + } else { + gpiv_fwrite_hdf5_scdata(fname_out, + &display_act->gpd.sstrain_data, + "SHEAR_STRAIN", + RCSID); + } + display_act->gpd.saved_sstrain = TRUE; + } + + + if (display_act->gpd.exist_nstrain) { + if (display_act->gpd.scaled_piv ) { + gpiv_fwrite_hdf5_scdata(fname_out, + &display_act->gpd. + nstrain_data_scaled, + "NORMAL_STRAIN", + RCSID); + } else { + gpiv_fwrite_hdf5_scdata(fname_out, + &display_act->gpd.nstrain_data, + "NORMAL_STRAIN", + RCSID); + } + display_act->gpd.saved_nstrain = TRUE; + } + + + gpiv_post_fwrite_hdf5_parameters (fname_out, + &display_act->gpd.piv_post_par); + + + +/* + * Store all data in ASCII format at different files + */ + } else { + if (print_par) gpiv_warning("writing ASCII fmt"); + +/* + * Image header + */ + gpiv_io_make_fname(display_act->fname_base, EXT_HEADER, fname_par); + if ((fp_par = fopen(fname_par, "w")) == NULL) { + gtk_error(_("Failure opening image header for output")); + } + fprintf(fp_par, "#%s\n", RCSID); + gpiv_img_fprint_header(fp_par, display_act->img.image_par); + fclose(fp_par); + + +/* + * Parameters + */ + gpiv_io_make_fname(display_act->fname_base, EXT_PAR, fname_par); + if ((fp_par = fopen(fname_par, "w")) == NULL) { + gtk_error(_("Failure opening parameter file for output")); + } + fprintf(fp_par, "#%s\n", RCSID); + gpiv_img_fprint_header(fp_par, display_act->img.image_par); + + +/* + * Piv data + */ + if (display_act->gpd.exist_piv) { + gpiv_io_make_fname(display_act->fname_base, EXT_PIV, + fname_out); + + if (display_act->gpd.scaled_piv) { + if ((return_val = + gpiv_fwrite_pivdata(fname_out, + &display_act->gpd.piv_data_scaled, + c_line, + 0, + display_act->gpd.scaled_piv, + RCSID)) != 0) { + gtk_error(_("Failure calling gpiv_fwrite_pivdata")); + } + } else { + if ((return_val = + gpiv_fwrite_pivdata(fname_out, + &display_act->gpd.piv_data, + c_line, + 0, + display_act->gpd.scaled_piv, + RCSID)) != 0) { + gtk_error(_("Failure calling gpiv_fwrite_pivdata")); + } + } + + display_act->gpd.saved_piv = TRUE; + gpiv_piv_fprint_parameters + (fp_par, display_act->gpd.piv_eval_par); + if (display_act->gpd.exist_valid) { + gpiv_valid_fprint_parameters + (fp_par, display_act->gpd.piv_valid_par); + } + } + + +/* + * (Eventual) scalar data + */ + if (display_act->gpd.exist_vor) { + gpiv_io_make_fname(display_act->fname_base, EXT_VOR, + fname_out); + if ((return_val = + gpiv_fwrite_scdata(fname_out, + &display_act->gpd.vor_data, + c_line, + nc_lines, + display_act->gpd.scaled_piv, + RCSID)) + != 0) { + gtk_warning(_("Failure calling gpiv_fwrite_scdata")); + } + display_act->gpd.saved_vor = TRUE; + + if (flag_vor == 0) { + gpiv_post_print_parameters(display_act->gpd.piv_post_par); + gpiv_post_fprint_parameters(fp_par, + display_act->gpd.piv_post_par); + flag_vor = 1; + } + } + + if (display_act->gpd.exist_sstrain) { + gpiv_io_make_fname(display_act->fname_base, EXT_SSTR, + fname_out); + if ((return_val = + gpiv_fwrite_scdata(fname_out, + &display_act->gpd.sstrain_data, + c_line, + nc_lines, display_act->gpd.scaled_piv, + RCSID)) + != 0) { + gtk_warning(_("Failure calling gpiv_fwrite_scdata")); + } + display_act->gpd.saved_sstrain = TRUE; + + if (flag_vor == 0) { + gpiv_post_fprint_parameters(fp_par, + display_act->gpd.piv_post_par); + flag_vor = 1; + } + } + + if (display_act->gpd.exist_nstrain) { + gpiv_io_make_fname(display_act->fname_base, EXT_NSTR, + fname_out); + if ((return_val = + gpiv_fwrite_scdata(fname_out, + &display_act->gpd.nstrain_data, + c_line, + nc_lines, + display_act->gpd.scaled_piv, + RCSID)) + != 0) { + gtk_warning(_("Failure calling gpiv_fwrite_scdata")); + } + display_act->gpd.saved_nstrain = TRUE; + + if (flag_vor == 0) { + gpiv_post_fprint_parameters(fp_par, + display_act->gpd.piv_post_par); + flag_vor = 1; + } + } + + fclose(fp_par); + } + } + } +} + + + +void +on_execute_activate(GtkMenuItem * menuitem, + gpointer user_data) +{ + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(menuitem), "gpiv"); + gint row, ibuf; + + if (nbufs > 0) { + exec_process = TRUE; + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + ibuf = display_act->count; + if (display[ibuf] != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + + if (!cancel_process && gpiv_par.process_piv) { + exec_piv(gpiv); + } + + if (!cancel_process && gpiv_par.process_gradient) { + exec_gradient(); + } + + if (!cancel_process && gpiv_par.process_resstats) { + piv_valid_par.res_stats = 1; + exec_errvec(gpiv->pivvalid); + } + + if (!cancel_process && gpiv_par.process_errvec) { + piv_valid_par.res_stats = 0; + exec_errvec(gpiv->pivvalid); + } + + if (!cancel_process && gpiv_par.process_peaklock) { + exec_peaklock(gpiv->pivvalid); + } + + if (!cancel_process && gpiv_par.process_scale) { + exec_scale(gpiv->pivpost); + } + + if (!cancel_process && gpiv_par.process_average) { + exec_savg(gpiv->pivpost); + } + + if (!cancel_process && gpiv_par.process_substract) { + exec_subavg(gpiv->pivpost); + } + + if (!cancel_process && gpiv_par.process_vorstra) { + exec_vorstra(); + } + + } + + exec_process = FALSE; + } +} + + +void +on_stop_activate(GtkMenuItem * menuitem, + gpointer user_data) +{ +/* gtk_warning(_("process has been stopped")); */ +} + + +void +on_button_stop_press (GtkWidget * widget, + gpointer data) +{ + cancel_process = TRUE; +} + + +void +on_button_stop_release (GtkWidget * widget, + gpointer data) +{ + cancel_process = FALSE; +} + + +void +on_close_activate(GtkMenuItem * menuitem, + gpointer user_data) +{ + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(menuitem), "gpiv"); + gint row, ibuf; + char message[2 * MAX_CHARS]; + gint answer; + + if (nbufs > 0) { + + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data + (GTK_CLIST(gpiv->clist_buf), row); + ibuf = display_act->count; + if (display[ibuf] != NULL) { + + if(!display_act->gpd.saved_piv + || !display_act->gpd.saved_vor + || !display_act->gpd.saved_nstrain + || !display_act->gpd.saved_sstrain) { + + g_snprintf(message, 2 * MAX_CHARS, "%s%d%s", + _("There are unsaved data that will be lost.\n\ +Are you sure you want to close buffer #"), + display_act->count, _("?")); + answer = close_buffer_yes_no (gpiv, message); + switch (answer){ + case 0: + printf ("User selected yes\n"); + free_all_bufmems(display_act); + ibuf = display_act->count; + gtk_widget_destroy(GTK_WIDGET(display_act->mwin)); + display[ibuf] = NULL; + break; + case 1: + printf ("User selected no\n"); + break; + case -1: + printf ("User closed the window with the window manager\n"); + break; + } + + + } else { + free_all_bufmems(display_act); + ibuf = display_act->count; + gtk_widget_destroy(GTK_WIDGET(display_act->mwin)); + display[ibuf] = NULL; + } + + } + } + +/* + * Cleaning up clist + */ + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data + (GTK_CLIST(gpiv->clist_buf), gpiv->first_selected_row); + ibuf = display_act->count; + if (display[ibuf] == NULL) { + gtk_clist_remove(GTK_CLIST(gpiv->clist_buf), + gpiv->first_selected_row); + nbufs--; + } else { + gpiv->first_selected_row++; + } + } + + + } + +/* + * Point display_act to an existing buffer + */ + for (ibuf = 0; ibuf < nbufs; ibuf++) { + if(display[ibuf] != NULL) { + gtk_clist_select_row(GTK_CLIST(gpiv->clist_buf), + ibuf, + 0); + display_act = display[ibuf]; + } + } + +} + +void +on_exit_activate(GtkMenuItem * menuitem, + gpointer user_data) +{ +/* GtkWidget *gpiv_exit; */ + gint ibuf; + + if (nbufs > 0) { + for (ibuf = 0; ibuf < nbufs; ibuf++) { + if (display[ibuf] != NULL) display_act = display[ibuf]; + + if(!display_act->gpd.saved_piv + || !display_act->gpd.saved_vor + || !display_act->gpd.saved_nstrain + || !display_act->gpd.saved_sstrain) { + gpiv_exit = create_exit (); + gtk_widget_show (gpiv_exit); + } else { + free_all_bufmems(display_act); + gtk_main_quit(); + } + + } + + } else { + gtk_main_quit(); + } +} + + +void on_preferences_activate(GtkWidget * widget, +/* GtkMenuItem * menuitem, */ + gpointer user_data) +{ +/* GtkWidget *gpiv_preferences; */ + + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gpiv_preferences = create_preferences(gpiv); + gtk_widget_show(gpiv_preferences); +} + + + +void on_about_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + GtkWidget *about; + about = create_about(); + gtk_widget_show(about); + +} + + + + +void on_manual_activate(GtkMenuItem * menuitem, gpointer user_data) +{ + static GnomeHelpMenuEntry help_entry = { "gpiv", "index.html" }; +/* /home/gerber/gpiv/doc/C/index.html */ + gnome_help_display(NULL, &help_entry); + +} + +/* + * Gnome toolbar buttons + */ + +void +on_button_open_clicked(GtkButton * button, + gpointer data) +{ + gchar *msg = "Opens PIV data"; + GtkWidget *filew; + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(button), "gpiv"); + + +/* + * Create a new file selection widget + * Connect the ok_button and cancel_button to file_ok_sel function + * Set a default filename + * set user data "gpiv" to filew + */ + filew = gtk_file_selection_new(_("File selection")); + gtk_signal_connect(GTK_OBJECT(filew), "destroy", + (GtkSignalFunc) destroy, &filew); + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), + "clicked", (GtkSignalFunc) file_ok_sel, + GTK_OBJECT(filew)); + gtk_signal_connect_object(GTK_OBJECT + (GTK_FILE_SELECTION(filew)->ok_button), + "clicked", + (GtkSignalFunc) gtk_widget_destroy, + GTK_OBJECT(filew)); + gtk_signal_connect_object(GTK_OBJECT + (GTK_FILE_SELECTION(filew)->cancel_button), + "clicked", + (GtkSignalFunc) gtk_widget_destroy, + GTK_OBJECT(filew)); + gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), + /* DEFAULT_TEST_IMAGE */ fname_last); + gtk_widget_show(filew); + gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(filew)), + "gpiv", + gpiv); + + + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void on_menubar_activate(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + if (GTK_CHECK_MENU_ITEM(widget)->active) { + gtk_widget_show(gpiv->menubar); + } else { + gtk_widget_hide(gpiv->menubar); + } +} + + +void on_toolbuttons_activate(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + if (GTK_CHECK_MENU_ITEM(widget)->active) { + gtk_widget_show(gpiv->toolbar1); +/* gtk_widget_ref(settings_menu_gpiv_popup[1].widget); */ +/* gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM */ +/* (settings_menu_gpiv_popup[1].widget), */ +/* TRUE); */ + } else { + gtk_widget_hide(gpiv->toolbar1); +/* gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM */ +/* (settings_menu_gpiv_popup[1].widget), */ +/* FALSE); */ + } + +} + + +void on_gpivbuttons_activate(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + if (GTK_CHECK_MENU_ITEM(widget)->active) { + gtk_widget_show(gpiv->handlebox1); + + } else { + gtk_widget_hide(gpiv->handlebox1); + } +} + + +void on_tabulator_activate(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + if (GTK_CHECK_MENU_ITEM(widget)->active) { + gtk_widget_show(gpiv->notebook); + } else { + gtk_widget_hide(gpiv->notebook); + } + +} + + +void on_tooltip_activate(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + if (GTK_CHECK_MENU_ITEM(widget)->active) { + gtk_tooltips_enable(gpiv->tooltips ); + gtk_tooltips_enable(gpiv->imgh->tooltips ); + gtk_tooltips_enable(gpiv->piveval->tooltips ); + gtk_tooltips_enable(gpiv->pivvalid->tooltips ); + gtk_tooltips_enable(gpiv->pivpost->tooltips ); + } else { + gtk_tooltips_disable(gpiv->tooltips ); + gtk_tooltips_disable(gpiv->imgh->tooltips ); + gtk_tooltips_disable(gpiv->piveval->tooltips ); + gtk_tooltips_disable(gpiv->pivvalid->tooltips ); + gtk_tooltips_disable(gpiv->pivpost->tooltips ); + } + + +} + + +void +on_buffer_set_focus(GtkWindow * window, + GtkWidget * widget, gpointer user_data) +{ +/* SEE: on_clist_buf_rowselect */ +} + + +void +gtk_window_destroy(GtkButton * button, + gpointer user_data) +{ + +} + + +void +on_appbar_display_user_response(GnomeAppBar * gnomeappbar, + gpointer user_data) +{ + +} + + +void +on_button_open_enter(GtkContainer * container, + GtkDirectionType direction, + gpointer user_data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(container), "gpiv"); + gchar *msg = _("Opens image/PIV data (and display)"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_save_enter(GtkContainer * container, + GtkDirectionType direction, + gpointer user_data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(container), "gpiv"); + gchar *msg = _("Saves data"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_execute_enter(GtkContainer * container, + GtkDirectionType direction, + gpointer user_data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(container), "gpiv"); + gchar *msg = _("Executes all tickmarked processes"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_stop_enter(GtkContainer * container, + GtkDirectionType direction, + gpointer user_data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(container), "gpiv"); + gchar *msg = _("Cancels any running processes"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_close_enter(GtkContainer * container, + GtkDirectionType direction, + gpointer user_data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(container), "gpiv"); + gchar *msg = _("Close active buffer(s)"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_exit_enter(GtkContainer * container, + GtkDirectionType direction, gpointer user_data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(container), "gpiv"); + gchar *msg = _("Exits gpiv"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +/*-------------------------------------------------------------------- + toolbar containing checkbutton for processes */ +void on_toolbar_checkbutton_piv(GtkWidget * widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_piv = TRUE; + } else { + gpiv_par.process_piv = FALSE; + } +} + + +void on_toolbar_checkbutton_gradient(GtkWidget * widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_gradient = TRUE; + } else { + gpiv_par.process_gradient = FALSE; + } +} + + +void on_toolbar_checkbutton_resstats(GtkWidget * widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_resstats = TRUE; + piv_valid_par.res_stats = 1; + } else { + gpiv_par.process_resstats = FALSE; + piv_valid_par.res_stats = 0; + } +} + + +void +on_toolbar_checkbutton_errvec(GtkWidget * widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_errvec = TRUE; + } else { + gpiv_par.process_errvec = FALSE; + } +/* g_warning("on_toolbar_checkbutton_errvec:: process_errvec=%d", */ +} + + +void +on_toolbar_checkbutton_peaklck(GtkWidget * widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_peaklock = TRUE; + } else { + gpiv_par.process_peaklock = FALSE; + } +} + + +void +on_toolbar_checkbutton_scale(GtkWidget * widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_scale = TRUE; + } else { + gpiv_par.process_scale = FALSE; + } +} + + +void +on_toolbar_checkbutton_average(GtkWidget * widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_average = TRUE; + } else { + gpiv_par.process_average = FALSE; + } +} + + +void +on_toolbar_checkbutton_subavg(GtkWidget * widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_substract = TRUE; + } else { + gpiv_par.process_substract = FALSE; + } +} + + +void on_toolbar_checkbutton_vorstra(GtkWidget * widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + gpiv_par.process_vorstra = TRUE; + } else { + gpiv_par.process_vorstra = FALSE; + } +} + + + + +/* GpivData * gpd_active = &display_act->gpd; */ + +/*-------------------------------------------------------------------- + exit, message dialog callbacks */ +void on_button_quit_no_clicked(GtkButton * button, gpointer user_data) +{ + g_warning("on_button_quit_no_clicked::"); + gnome_dialog_close(GNOME_DIALOG(gpiv_exit)); +} + + +void on_button_quit_gpiv_yes_clicked(GtkButton * button, gpointer user_data) +{ + g_warning("on_button_quit_gpiv_yes_clicked::"); + free_all_bufmems(display_act); + gtk_main_quit(); +} + + +void on_button_message_clicked(GtkButton * button, gpointer user_data) +{ + g_warning("on_button_message_clicked::"); + gnome_dialog_close(GNOME_DIALOG(gpiv_exit)); +} + +void on_button_error_clicked(GtkButton * button, gpointer user_data) +{ +/* free_all_bufmems(); */ + gtk_main_quit(); +} + + +/* + * Other functions than callbacks + */ + +/* + * loading images and (piv) data + */ + +static void +file_ok_sel(GtkWidget * widget, + GtkFileSelection * fs) +/* ------------------------------------------------------------------- + PIV data file selection */ +{ + gchar *fname_in; + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(fs), "gpiv"); + + + gtk_clist_set_selection_mode(GTK_CLIST (gpiv->clist_buf), + GTK_SELECTION_SINGLE); + + fname_in = + g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs))); + +#ifdef DEBUG + if (print_par) g_warning("file_ok_sel:: fname_in = %s", fname_in); +#endif + + select_action_from_fname(gpiv, fname_in); + g_free(fname_in); +} + + + +static void +select_action_from_fname(GpivConsole *gpiv, + gchar *fname_in) +/* ------------------------------------------------------------------- + checks filename extension on valid image/data name, on existence of buffer, + loads data */ +{ + gint i, j, ibuf, return_val; + gchar *ext, + *dirname, + *fname_base, + *fname_ext; + gboolean exist_buf = FALSE; + gboolean read_hdf; + gchar *clist_buf_txt[MAX_BUFS][2], cl_int[2]; + + + ext = g_strdup(strrchr(fname_in, '.')); + g_warning("---------select_action_from_fname:: extension = %s", ext); + + fname_last = g_strdup(fname_in); + gnome_config_set_string("fname_last", fname_last); + gnome_config_sync(); + +/* + * Stripping file name + * + */ +/*---------------------------------------------------------------------- + * With GLIB-2.0: + * gchar* g_path_get_basename (const gchar *file_name); + * gchar* g_path_get_dirname (const gchar *file_name); + * g_build_filename + *----------------------------------------------------------------------*/ + dirname = g_strdup(g_dirname(fname_in)); + fname_base = g_strdup(g_basename(fname_in)); + strtok(fname_base, "."); + fname_ext = g_strdup(g_strconcat(dirname, G_DIR_SEPARATOR_S, + fname_base, NULL)); + g_warning("select_action_from_fname:: fname_in=%s fname_last=%s" + "fname_base=%s fname_ext=%s", + fname_in, fname_last, fname_base, fname_ext); + +/* + * reading image data from raw data format or hdf format + */ + if (strcmp(ext, EXT_RAW_IMAGE) == 0 || strcmp(ext, EXT_GPIV) == 0) { + if (strcmp(ext, EXT_GPIV) == 0) { + read_hdf = TRUE; + } else { + read_hdf = FALSE; + } + exist_buf = FALSE; + if (nbufs == 0) { + sensitive(gpiv, IMG, TRUE); + sensitive(gpiv, EVAL, TRUE); + } else { + +/* + * Check if file basename (and buffer/display) already exists + * or if there is a gap in the numbering of th buffers + */ + g_warning("--- file_ok_sel:: Checking for existing bufs, nbufs = %d", + nbufs); + for (ibuf = 0; ibuf < nbufs; ibuf++) { + if (display[ibuf] != NULL + && strcmp(fname_ext, display[ibuf]->fname_base) == 0 ) { + if((return_val = + open_img(fname_in, &display_act->img, read_hdf)) + != 0) { +/* gtk_warning(_("open_img failed")); */ + return; + } + +/* + * Displaying image + */ + +/* display_img(display_act); */ + exist_buf = TRUE; + break; + } else if (display[ibuf] == NULL) { + g_warning("---------------- file_ok_sel:: buffer[%d] is null;loaded", ibuf); + load_buffer(gpiv, fname_in, fname_base, fname_ext, + read_hdf, ibuf, INSERT); + exist_buf = TRUE; + nbufs++; + break; + } + } + } + +/* + * Create new buffer and launches a display if file basename doesn't exist + * and append to the list + */ + if (!exist_buf) { + nbufs++; + ibuf = nbufs - 1; + gpiv_warning("file_ok_sel:: 0; ibuf = %d", ibuf); + load_buffer(gpiv, fname_in, fname_base, fname_ext, read_hdf, + ibuf, APPEND); + + } + +/* + * reading piv data + */ + } else if (strcmp(ext, ".piv") == 0) { + exist_buf = FALSE; + if (nbufs == 0) { + sensitive(gpiv, EVAL, TRUE); + } else { +/* ------------------------------------------------------------------- + Look if file base name (and buffer/display) already exists */ + for (ibuf = 0; ibuf < nbufs; ibuf++) { + if (strcmp(fname_ext, display_act->fname_base) == 0) { + fprintf(stderr, "piv load::using existing buffer: %d", + ibuf); + open_piv(fname_in, &display_act->gpd); + display_all_vectors(&display_act->gpd); + exist_buf = TRUE; + break; + } + } + } +/* ------------------------------------------------------------------- + Create new buffer and launch a display if file base name doesn't exist */ + if (!exist_buf) { +/* gint width, height; */ + nbufs++; + ibuf = nbufs - 1; + display_act->gpd.exist_piv = TRUE; + g_snprintf(display_act->fname_base, MAX_CHARS, "%s", fname_ext); + open_piv(fname_in, &display_act->gpd); + +/* display_act->gpd.zoom_factor = zfactor[gpiv_par.zoom_index]; */ + /* display_act->gpd.stretch_window = gpiv_par.stretch_window; */ + display[ibuf] = create_display(display_act->fname_base, ibuf, gpiv); + display_act = display[ibuf]; + gtk_widget_show(display_act->mwin); + gtk_signal_connect_object(GTK_OBJECT(display_act), + "button_press_event", + GTK_SIGNAL_FUNC (on_my_popup_handler), + GTK_OBJECT(display_act->display_menu)); + + + + g_snprintf(display_act->msg_display_default, MAX_CHARS, "%s", + display_act->fname_base); + gnome_appbar_set_default(GNOME_APPBAR(display_act->appbar), + display_act->msg_display_default); + + g_snprintf(cl_int, 2, "%d", ibuf); + gtk_object_set_data(GTK_OBJECT(display_act), "buffer_nr", + cl_int); + gtk_signal_connect(GTK_OBJECT(display_act), + "focus_in_event", + GTK_SIGNAL_FUNC(on_display_set_focus), NULL); + + display_background(display_act); + for (i = 0; i < MAX_DATA; i++) { + for (j = 0; j < MAX_DATA; j++) { + display_act->gpd.gci_vector[i][j] = NULL; + } + } + display_all_vectors(&display_act->gpd); + + clist_buf_txt[ibuf][0] = cl_int; + clist_buf_txt[ibuf][1] = fname_base; + gtk_clist_append(GTK_CLIST(gpiv->clist_buf), + clist_buf_txt[ibuf]); + fprintf(stderr, "finished gtk_clist\n"); + if (gpiv_par.display_intregs == 1) + create_all_intregs(display_act); + } + + } else { + gtk_warning(_("load_buffer:: non-valid file name")); + } + + gtk_clist_set_selection_mode(GTK_CLIST (gpiv->clist_buf), + GTK_SELECTION_EXTENDED); + + g_free(ext); + g_free(dirname); + g_free(fname_base); + g_free(fname_ext); + if (print_par) gpiv_warning("load_buffer:: END, fname_base = %s", display_act->fname_base); +} + + + +static void +load_buffer(GpivConsole *gpiv, + char *fname_in, + char *fname_base, + char *fname_ext, + gboolean read_hdf, + int ibuf, + enum ClistPut clist_put) +/*-------------------------------------------------------------------- + * create display and its (popup) menu, load image and puts into clist + */ +{ + gint return_val = 0; + gchar *clist_buf_txt[MAX_BUFS][2], cl_int[2]; + + display[ibuf] = create_display(fname_ext, ibuf, gpiv); + display_act = display[ibuf]; + gtk_widget_show(display_act->mwin); + display_act->display_menu = create_display_menu(display_act); + gtk_widget_show(display_act->display_menu); + gtk_signal_connect_object(GTK_OBJECT(display_act->mwin), + "button_press_event", + GTK_SIGNAL_FUNC (on_my_popup_handler), + GTK_OBJECT(display_act->display_menu)); +/* + * Load image data + */ + gpiv_warning("load_buffer:: 1"); + g_snprintf(display_act->fname_base, MAX_CHARS, "%s", fname_ext); + if((return_val = open_img(fname_in, &display_act->img, read_hdf)) + != 0) { +/* gtk_warning(_("open_img failed")); */ + gtk_object_destroy(GTK_OBJECT(display[ibuf]->mwin)); + if (ibuf > 0) { + ibuf = nbufs - 1;; + display_act = display[ibuf]; + } else { + display_act = NULL; + } + nbufs--; + return; + } + + gpiv_warning("load_buffer:: 2"); + display_background(display_act); + + +/* --------- TO BE IMPLEMENTED FOR IMAGES WITH RGB CANVAS --------------*/ +/* #ifdef DISPLAY_IMAGE */ +/* display_img(display_act); */ +/* #endif */ +/* ---------------------------------------------------------------------*/ + + if (gpiv_par.display_intregs == 1) + create_all_intregs(display_act); + +/* --------- TO BE REMOVED WITH RGB CANVAS ----------------------------*/ +/* ---------------------------------------------------------------------*/ + +/* + * Add buffer to list + */ + gpiv_warning("load_buffer:: 3"); + g_snprintf(cl_int, 2, "%d", ibuf); + clist_buf_txt[ibuf][0] = (gchar *) cl_int; + clist_buf_txt[ibuf][1] = fname_base; + if (clist_put == PREPEND) { + gtk_clist_prepend(GTK_CLIST(gpiv->clist_buf), + clist_buf_txt[ibuf]); + } else if (clist_put == INSERT) { + gtk_clist_insert(GTK_CLIST(gpiv->clist_buf), ibuf, + clist_buf_txt[ibuf]); + } else if (clist_put == APPEND) { + gtk_clist_append(GTK_CLIST(gpiv->clist_buf), + clist_buf_txt[ibuf]); + } else { + gtk_error("non-existent CLIST enumerate"); + } + + gtk_clist_set_row_data(GTK_CLIST(gpiv->clist_buf), ibuf, + display_act); + +} + + + +static int +open_img(char *fname_in, + Image * img, + gboolean read_hdf + ) +/*-------------------------------------------------------------------- + * Opens image file + */ +{ + char fname_header[MAX_CHARS]; + char *fname_ext = display_act->fname_base; + +/* + * parameter initializing of image + */ + img->image_par.nbits_logic = 0; + img->image_par.ncolumns_logic = 0; + img->image_par.nrows_logic = 0; + img->image_par.x_corr_logic = 0; + img->image_par.s_scale_logic = 0; + img->image_par.t_scale_logic = 0; + img->image_par.z_off_logic = 0; + img->image_par.project_logic = 0; + img->image_par.creation_date_logic = 0; + img->image_par.location_logic = 0; + img->image_par.comment_logic = 0; + +/* + * Reads hdf format + */ + if (read_hdf) { + int return_val = 0; + gpiv_img_fread_hdf5_parameters(fname_in, &img->image_par); + if (img->image_par.nrows != gpiv_par.img_height + || img->image_par.ncolumns != gpiv_par.img_width) { + gtk_error(_("Image dimensions (%dx%d) differ from \n\ +parameter settings (%dx%d"), + img->image_par.ncolumns, img->image_par.nrows, + gpiv_par.img_width, gpiv_par.img_height); + return -1; + } + copy_img_par(image_par, &img->image_par, print_par); + gpiv_img_check_header_read(img->image_par); + img->img1 = gpiv_ucmatrix(0, img->image_par.nrows - 1, 0, + img->image_par.ncolumns - 1); + if (img->image_par.x_corr != image_par.x_corr) { + gtk_warning(_("cross correlation parameter from image \n\ +not in agreement with gpiv setting")); + return -1; + } + if (img->image_par.x_corr) + img->img2 = gpiv_ucmatrix(0, img->image_par.nrows - 1, 0, + img->image_par.ncolumns - 1); + if ((return_val = gpiv_fread_hdf5_image (fname_in, img->img1, + img->img2, &img->image_par)) + < 0 ) { + gtk_warning(_("file contains no image data")); + return -1; + } + + + } else { +/* + * Reads raw data format + * Reads image header data from file.h or copies from originanals + */ + g_snprintf(fname_header, MAX_CHARS, "%s%s", fname_ext, EXT_HEADER); + if (print_par) gpiv_warning("\n#image header is: %s", fname_header); + gpiv_scan_parameter( "", fname_header, &img->image_par, print_par); + if (print_par) + g_warning("open_img:: x_corr_logic = %d \n" + "image_par.nrows = %d \n" + "image_par.ncolumns = %d", + img->image_par.x_corr_logic, + img->image_par.nrows, + img->image_par.ncolumns ); + if (img->image_par.nrows != gpiv_par.img_height + || img->image_par.ncolumns != gpiv_par.img_width) { + gtk_warning(_("Image dimensions (%dx%d) differ from \n\ +parameter settings (%dx%d)"), + img->image_par.ncolumns, img->image_par.nrows, + gpiv_par.img_width, gpiv_par.img_height); + return -1; + } + copy_img_par (image_par, &img->image_par, print_par); + gpiv_img_check_header_read(img->image_par); +/* + * memory allocation of matrices and vectors + * gpiv_alloc_imgdata(img->img1, image_par.nrows, image_par.ncolumns); + */ + img->img1 = gpiv_ucmatrix(0, img->image_par.nrows - 1, 0, + img->image_par.ncolumns - 1); + if (img->image_par.x_corr != image_par.x_corr) { + gtk_warning(_("cross correlation parameter from image \n\ +not in agreement with gpiv setting")); + return -1; + } + if (image_par.x_corr) + img->img2 = gpiv_ucmatrix(0, img->image_par.nrows - 1, 0, + img->image_par.ncolumns - 1); + + +/* + * reads image data from file in binary format + */ + gpiv_fread_image(fname_in, img->img1, img->img2, img->image_par); + if (!img->img1 || !img->img2) { + gtk_warning(_("failure reading image")); + return -1; + } + } + + display_act->img.exist_img = TRUE; + return 0; +} + + +static void +open_piv(char *fname, + GpivData * gpd + ) +/*------------------------ Opens piv data file and views in display */ +{ + char *function_name = "open_piv"; + int return_val; + +/* var_scale = 0; */ + nc_lines = 0; + + if ((return_val = + gpiv_fcount_pivdata(fname, &gpd->piv_data)) == -1) { + gpiv_error(_("%s: Failure calling gpiv_count_pivdata\n"), PROGNAME); + + } else if (print_par) { + fprintf(stderr, "%s: %s: scale=%d nx=%d ny=%d \n", + function_name, fname, display_act->gpd.scaled_piv, gpd->piv_data.nx, + gpd->piv_data.ny); + } + + + gpiv_alloc_pivdata(&gpd->piv_data); + if ((return_val = gpiv_fread_pivdata(fname, &gpd->piv_data, c_line, + &nc_lines)) != 0) { + gpiv_error(_("%s: Failure calling fread_pivdata\n"), PROGNAME); + } + + if (print_par) + gpiv_write_pivdata(&gpd->piv_data, c_line, nc_lines, + display_act->gpd.scaled_piv, RCSID); + +} + + diff --git a/src/console.h b/src/console.h new file mode 100644 index 0000000..8c072a1 --- /dev/null +++ b/src/console.h @@ -0,0 +1,286 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ +/* + * General callbacks + * $Log: console.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef CONSOLE_H +#define CONSOLE_H + +/* #include "gpiv_gtk.h" */ + +#define THRESHOLD_MAX 16 + + +void +on_widget_leave (GtkContainer *container, + GtkDirectionType direction, + gpointer user_data); + +/*-------------------------------------------------------------------- + -------------------------------------------------------------------- + Callback functions for main */ + +void on_clist_buf_rowselect( GtkWidget *clist, gint row, gint column, + GdkEventButton *event, gpointer data); + + +void +on_clist_buf_drag_data_received (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *data, + guint info, + guint time); + +/*-------------------------------------------------------------------- + -------------------------------------------------------------------- + Callback functions for pop-up meus */ +gint +on_my_popup_handler(GtkWidget *widget, GdkEvent *event); + + +GtkWidget* create_window1 (void); + + +/*-- Select sub-menu ----------------------------------*/ +void +select_all(gpointer data, + guint action, + GtkWidget *widget); + +void +select_none(gpointer data, + guint action, + GtkWidget *widget); + + + + +void +on_open_activate(GtkMenuItem *menuitem, + gpointer user_data); + +void +on_save_activate(GtkMenuItem *menuitem, + gpointer user_data); + +void +save_all_data(GpivConsole * gpiv); + +void +on_execute_activate(GtkMenuItem *menuitem, + gpointer user_data); +void +on_stop_activate(GtkMenuItem *menuitem, + gpointer user_data); + +void +on_close_activate(GtkMenuItem *menuitem, + gpointer user_data); + +void +on_save_as_activate(GtkMenuItem *menuitem, + gpointer user_data); + +void +file_saveas_ok_sel(GtkWidget * widget, + GtkFileSelection * fs + ); + +void +on_exit_activate(GtkMenuItem *menuitem, + gpointer user_data); + +void +on_close_buffer_activate(GtkMenuItem *menuitem, + gpointer user_data); + +void +on_preferences_activate(GtkWidget * widget, +/* GtkMenuItem *menuitem, */ + gpointer user_data); + +void +on_about_activate(GtkMenuItem *menuitem, + gpointer user_data); + + +void +on_manual_activate(GtkMenuItem *menuitem, + gpointer user_data); + +void +on_button_open_clicked(GtkButton *button, + gpointer user_data); + +void +on_menubar_activate (GtkWidget *widget, + gpointer data); + + +void +on_toolbuttons_activate (GtkWidget * widget, + gpointer data); + + +void +on_gpivbuttons_activate (GtkWidget * widget, + gpointer data); + + +void +on_tabulator_activate (GtkWidget * widget, + gpointer data); + + +void +on_tooltip_activate (GtkWidget * widget, + gpointer data); + + +void +on_buffer_set_focus (GtkWindow *window, + GtkWidget *widget, + gpointer user_data); + +void +gtk_window_destroy (GtkButton *button, + gpointer user_data); + +void +on_view_options_clicked (GtkButton *button, + gpointer user_data); + +void +on_appbar_display_user_response (GnomeAppBar *gnomeappbar, + gpointer user_data); + +void +on_button_open_enter (GtkContainer *container, + GtkDirectionType direction, + gpointer user_data); +void +on_button_save_enter (GtkContainer *container, + GtkDirectionType direction, + gpointer user_data); + +void +on_button_execute_enter (GtkContainer *container, + GtkDirectionType direction, + gpointer user_data); + +void +on_button_stop_enter (GtkContainer *container, + GtkDirectionType direction, + gpointer user_data); + +void +on_button_stop_press (GtkWidget *widget, + gpointer data); + +void +on_button_stop_release (GtkWidget *widget, + gpointer data); + +void +on_button_close_enter (GtkContainer *container, + GtkDirectionType direction, + gpointer user_data); + +void +on_button_exit_enter (GtkContainer *container, + GtkDirectionType direction, + gpointer user_data); + + +/* + * process toolbar callbacks + */ +void +on_toolbar_checkbutton_piv(GtkWidget *widget, + gpointer data); + +void +on_toolbar_checkbutton_gradient(GtkWidget *widget, + gpointer data); + +void +on_toolbar_checkbutton_resstats(GtkWidget *widget, + gpointer data); + +void +on_toolbar_checkbutton_errvec(GtkWidget * widget, + gpointer data); + +void +on_toolbar_checkbutton_peaklck(GtkWidget *widget, + gpointer data); + +void +on_toolbar_checkbutton_scale(GtkWidget *widget, + gpointer data); + +void +on_toolbar_checkbutton_average(GtkWidget *widget, + gpointer data); + +void +on_toolbar_checkbutton_subavg(GtkWidget *widget, + gpointer data); + +void +on_toolbar_checkbutton_vorstra(GtkWidget * widget, + gpointer data); + + +/* + * Exit, message, error dialog callbacks + */ +void +on_button_quit_no_clicked (GtkButton *button, + gpointer user_data); + +void +on_button_quit_gpiv_yes_clicked (GtkButton *button, + gpointer user_data); + +void +on_button_message_clicked (GtkButton *button, + gpointer user_data); + +void +on_button_error_clicked (GtkButton *button, + gpointer user_data); + +#endif /* CONSOLE_H */ diff --git a/src/console_interface.c b/src/console_interface.c new file mode 100644 index 0000000..53c61c2 --- /dev/null +++ b/src/console_interface.c @@ -0,0 +1,1840 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * $Log: console_interface.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * +*/ +#ifdef HAVE_CONFIG_H +# include +#endif +#include "support.h" + +#include "gpiv_gtk.h" +#include "console.h" +#include "console_interface.h" +#include "console_menus.h" +#include "piveval.h" +#include "pivvalid.h" +#include "pivpost.h" + + + + +GtkWidget * +create_menu_gpiv_popup(GpivConsole * gpiv) +{ + GtkWidget * console = gpiv->console; + GtkWidget * menu_gpiv_popup = NULL; + + menu_gpiv_popup = gtk_menu_new(); + gtk_object_set_data(GTK_OBJECT(console), + "menu_gpiv_popup", + menu_gpiv_popup); + gnome_app_fill_menu(GTK_MENU_SHELL(menu_gpiv_popup), + menubar_gpiv_popup, + NULL, + FALSE, + 0); + + gtk_widget_ref(menubar_gpiv_popup[0].widget); + gtk_object_set_data_full(GTK_OBJECT(console), + "file", + menubar_gpiv_popup[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + + + gtk_widget_ref(menubar_gpiv_popup[1].widget); + gtk_object_set_data_full(GTK_OBJECT(console), + "settings", + menubar_gpiv_popup[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + + + gtk_widget_ref(menubar_gpiv_popup[2].widget); + gtk_object_set_data_full(GTK_OBJECT(console), + "help", + menubar_gpiv_popup[2].widget, + (GtkDestroyNotify) gtk_widget_unref); + + gtk_widget_ref(help_menu_gpiv_popup[0].widget); + gtk_object_set_data_full(GTK_OBJECT(console), + "tooltip", + help_menu_gpiv_popup[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(help_menu_gpiv_popup[0].widget), + "gpiv", + gpiv); + + + + gtk_widget_ref(file_menu_gpiv_popup[0].widget); + gtk_object_set_data(GTK_OBJECT(file_menu_gpiv_popup[0].widget), + "gpiv", + gpiv); + + gtk_widget_ref(file_menu_gpiv_popup[1].widget); + gtk_object_set_data(GTK_OBJECT(file_menu_gpiv_popup[1].widget), + "gpiv", + gpiv); + + gtk_widget_ref(settings_menu_gpiv_popup[0].widget); + gtk_object_set_data_full(GTK_OBJECT(console), + "gpiv_buttons", + settings_menu_gpiv_popup[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(settings_menu_gpiv_popup[0].widget), + "gpiv", + gpiv); + if (gpiv_par.view_gpivbuttons) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv_popup[0].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv_popup[0].widget), + FALSE); + } + + + + gtk_widget_ref(settings_menu_gpiv_popup[1].widget); + gtk_object_set_data_full(GTK_OBJECT(console), + "tabulator", + settings_menu_gpiv_popup[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(settings_menu_gpiv_popup[1].widget), + "gpiv", + gpiv); + if (gpiv_par.view_tabulator) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv_popup[1].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv_popup[1].widget), + FALSE); + } + + + if (gpiv_par.show_tooltips) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (help_menu_gpiv_popup[0].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (help_menu_gpiv_popup[0].widget), + FALSE); + } + + + + return menu_gpiv_popup; +} + + + +GpivConsole * +create_gpiv(void) +{ + GpivConsole *gpiv = g_new0(GpivConsole, 1); + /* GdkColormap *cmap = gdk_colormap_get_system( ); */ + + GdkColor red = { 0, 0xFFFF, 0x0000, 0x0000 }; + GdkColor yellow = { 0, 0xFFFF, 0xFFFF, 0x0000 }; + GdkColor *bg = &yellow; + GdkColor *fg = &red; + + +/* gdouble color[3]; */ +/* g_warning("::0"); */ +/* fg->red = (gushort) (color[0]*65535.0); */ +/* g_warning("::1"); */ +/* fg->green = (gushort) (color[1]*0.0); */ +/* fg->blue = (gushort) (color[2]*0.0); */ + +/* bg->red = (gushort) (color[0]*0.0); */ +/* bg->green = (gushort) (color[1]*0.0); */ +/* bg->blue = (gushort) (color[2]*0.0); */ + + +/* g_warning("::0"); */ +/* fg->red = (gushort) 10000; */ +/* g_warning("::1"); */ +/* fg->green = (gushort) 0; */ +/* fg->blue = (gushort) 0; */ + +/* g_warning("::0"); */ +/* bg->red = (gushort) 0; */ +/* g_warning("::1"); */ +/* bg->green = (gushort) 0; */ +/* bg->blue = (gushort) 10000; */ +/* g_warning("::3"); */ + + + + + gpiv->tooltips = gtk_tooltips_new(); + +/* if (gdk_parse_color("yellow", &bg) && */ +/* gdk_colormap_alloc_color(cmap, &bg, FALSE, TRUE)) { */ +/* if (gdk_parse_color("red", &fg) && */ +/* gdk_colormap_alloc_color(cmap, &fg, FALSE, TRUE)) { */ + gtk_tooltips_set_colors (GTK_TOOLTIPS (gpiv->tooltips), + bg, + fg); +/* } */ +/* } */ + + + gpiv->console = gnome_app_new("Gpiv-gui-gtk", + _("gpiv")); + gtk_window_set_policy(GTK_WINDOW(gpiv->console), + FALSE, + TRUE, + TRUE); + gtk_object_set_data(GTK_OBJECT(gpiv->console), + "gpiv", + gpiv); + + gpiv->dock1 = GNOME_APP(gpiv->console)->dock; + gtk_widget_ref(gpiv->dock1); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "dock1", + gpiv->dock1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->dock1); + + + +/* + * Menu bar with gnome_app_create_menus + */ + + gnome_app_create_menus(GNOME_APP (gpiv->console), + menubar_gpiv); + + + gtk_widget_ref(menubar_gpiv[0].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "file", + menubar_gpiv[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + + + gtk_widget_ref(file_menu_gpiv[0].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "open", + file_menu_gpiv[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(file_menu_gpiv[0].widget), + "gpiv", + gpiv); + + + gtk_widget_ref(file_menu_gpiv[1].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "save", + file_menu_gpiv[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(file_menu_gpiv[1].widget), + "gpiv", + gpiv); + + gtk_widget_ref(file_menu_gpiv[2].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "save_as", + file_menu_gpiv[2].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(file_menu_gpiv[2].widget), + "gpiv", + gpiv); + + + gtk_widget_ref(file_menu_gpiv[3].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "separator", + file_menu_gpiv[3].widget, + (GtkDestroyNotify) gtk_widget_unref); + + + gtk_widget_ref(file_menu_gpiv[4].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "exit", + file_menu_gpiv[4].widget, + (GtkDestroyNotify) gtk_widget_unref); + + + gtk_widget_ref(menubar_gpiv[1].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "settings", + menubar_gpiv[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + + + gtk_widget_ref(settings_menu_gpiv[0].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "gpiv_buttons", + settings_menu_gpiv[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(settings_menu_gpiv[0].widget), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->console), + "settings_menu_gpiv0", + settings_menu_gpiv[0].widget); + + + gtk_widget_ref(settings_menu_gpiv[1].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "tabulator", + settings_menu_gpiv[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(settings_menu_gpiv[1].widget), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->console), + "settings_menu_gpiv1", + settings_menu_gpiv[1].widget); + + + gtk_widget_ref(settings_menu_gpiv[3].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "preferences", + settings_menu_gpiv[3].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(settings_menu_gpiv[3].widget), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->console), + "settings_menu_gpiv3", + settings_menu_gpiv[3].widget); + + + gtk_widget_ref(menubar_gpiv[2].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "help", + menubar_gpiv[2].widget, + (GtkDestroyNotify) gtk_widget_unref); + + + gtk_widget_ref(help_menu_gpiv[0].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "tooltip", + help_menu_gpiv[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(help_menu_gpiv[0].widget), + "gpiv", + gpiv); + + + gtk_widget_ref(help_menu_gpiv[1].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "manual", + help_menu_gpiv[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(help_menu_gpiv[1].widget), + "gpiv", + gpiv); + + + gtk_widget_ref(help_menu_gpiv[2].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "about", + help_menu_gpiv[2].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(help_menu_gpiv[2].widget), + "gpiv", + gpiv); + + +/* + * toolbar + */ + gnome_app_create_toolbar(GNOME_APP (gpiv->console), + toolbar_gpiv); + + + gtk_widget_ref(toolbar_gpiv[0].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_open", + toolbar_gpiv[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + + gtk_object_set_data(GTK_OBJECT(toolbar_gpiv[0].widget), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[0].widget), + "enter", + GTK_SIGNAL_FUNC(on_button_open_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[0].widget), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + + + + gtk_widget_ref(toolbar_gpiv[1].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_save", + toolbar_gpiv[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + + gtk_object_set_data(GTK_OBJECT(toolbar_gpiv[1].widget), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[1].widget), + "enter", + GTK_SIGNAL_FUNC(on_button_save_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[1].widget), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + + + + gtk_widget_ref(toolbar_gpiv[2].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_exec", + toolbar_gpiv[2].widget, + (GtkDestroyNotify) gtk_widget_unref); + + gtk_object_set_data(GTK_OBJECT(toolbar_gpiv[2].widget), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[2].widget), + "enter", + GTK_SIGNAL_FUNC(on_button_execute_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[2].widget), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + + + + + gtk_widget_ref(toolbar_gpiv[3].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_stop", + toolbar_gpiv[3].widget, + (GtkDestroyNotify) gtk_widget_unref); + + gtk_object_set_data(GTK_OBJECT(toolbar_gpiv[3].widget), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[3].widget), + "button_press_event", + GTK_SIGNAL_FUNC(on_button_stop_press), + NULL); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[3].widget), + "button_release_event", + GTK_SIGNAL_FUNC(on_button_stop_release), + NULL); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[3].widget), + "enter", + GTK_SIGNAL_FUNC(on_button_stop_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[3].widget), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + + + + + gtk_widget_ref(toolbar_gpiv[4].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_close", + toolbar_gpiv[4].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(toolbar_gpiv[4].widget), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[4].widget), + "enter", + GTK_SIGNAL_FUNC(on_button_close_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[4].widget), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + +/* + * toolbar_gpiv[5].widget: Separator + */ + + gtk_widget_ref(toolbar_gpiv[6].widget); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_exit", + toolbar_gpiv[6].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(toolbar_gpiv[6].widget), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[6].widget), + "enter", + GTK_SIGNAL_FUNC(on_button_exit_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(toolbar_gpiv[6].widget), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + + +/* + * vbox_main contains handleboxes for toolbar, gpiv toolbar, tabulator + * and bufferlist + */ + gpiv->vbox_main = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(gpiv->vbox_main); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "vbox_main", + gpiv->vbox_main, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->vbox_main); + gnome_app_set_contents (GNOME_APP (gpiv->console), + gpiv->vbox_main); + + + +/* + * handlebox and toolbar for gpiv chain processes buttons + */ + gpiv->handlebox1 = gtk_handle_box_new(); + gtk_widget_ref(gpiv->handlebox1); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "handlebox1", + gpiv->handlebox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_box_pack_start(GTK_BOX(gpiv->vbox_main), + gpiv->handlebox1, + FALSE, + TRUE, + 0); + + +/* + * Scrolled window + */ + gpiv->scrolledwindow_handbox1 = gtk_scrolled_window_new(NULL, + NULL); + gtk_widget_ref(gpiv->scrolledwindow_handbox1); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "scrolledwindow_handbox1", + gpiv->scrolledwindow_handbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->scrolledwindow_handbox1); + gtk_container_add (GTK_CONTAINER (gpiv->handlebox1), + gpiv->scrolledwindow_handbox1); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW + (gpiv->scrolledwindow_handbox1), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_NEVER); + + + gpiv->viewport_handbox1 = + gtk_viewport_new(NULL, + NULL); + gtk_widget_ref(gpiv->viewport_handbox1); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "viewport_handbox1", + gpiv->viewport_handbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->viewport_handbox1); + gtk_container_add(GTK_CONTAINER(gpiv->scrolledwindow_handbox1), + gpiv->viewport_handbox1); + gtk_widget_set_usize(GTK_WIDGET(gpiv->viewport_handbox1), + 410, + 50); + + +/* + * toolbar + */ + + gpiv->toolbar2 = + gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, + GTK_TOOLBAR_TEXT); + gtk_widget_ref(gpiv->toolbar2); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "gpiv->toolbar2", + gpiv->toolbar2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_toolbar_set_space_style (GTK_TOOLBAR(gpiv->toolbar2), + GTK_TOOLBAR_SPACE_LINE); + gtk_widget_show(gpiv->toolbar2); + gtk_container_add (GTK_CONTAINER (gpiv->viewport_handbox1), + gpiv->toolbar2); + + + + gpiv->hbox_toolbar2 = gtk_hbox_new (FALSE, + 0); + gtk_widget_ref (gpiv->vbox_main); + gtk_object_set_data_full (GTK_OBJECT (gpiv->console), + "hbox_toolbar2", + gpiv->hbox_toolbar2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (gpiv->hbox_toolbar2); + gtk_container_add(GTK_CONTAINER(gpiv->toolbar2), + gpiv->hbox_toolbar2); + + + + gpiv->button_toolbar_piv = gtk_check_button_new_with_label(_("piv")); + gtk_widget_ref(gpiv->button_toolbar_piv); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_piv", + gpiv->button_toolbar_piv, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_piv); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_piv, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_piv, + _("Enables PIV for chain processing: analysing of a PIV image \ +(pair), resulting into the mean displacements of the particle images within \ +each interrogation area. \n\ +The process will be executed by clicking the Execute button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_piv), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_piv), + "enter", + GTK_SIGNAL_FUNC(on_button_piv_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_piv), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_piv), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_piv), + NULL); + if (gpiv_par.process_piv == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_piv), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_piv), + FALSE); + } + + + + gpiv->button_toolbar_gradient = + gtk_check_button_new_with_label(_("gradient")); + gtk_widget_ref(gpiv->button_toolbar_gradient); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_gradient", + gpiv->button_toolbar_gradient, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_gradient); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_gradient, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_gradient, +_("Enables gradient for chain processing: Disables velocities with gradients larger than \ +0.05 over the interrogation area. \ +\nThe process will be executed by clicking the \"Execute\" button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_gradient), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_gradient), + "enter", + GTK_SIGNAL_FUNC(on_button_valid_gradient_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_gradient), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_gradient), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_gradient), + NULL); + if (gpiv_par.process_gradient == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_gradient), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_gradient), + FALSE); + } + + + + gpiv->button_toolbar_resstats = gtk_check_button_new_with_label(_("residu stats")); + gtk_widget_ref(gpiv->button_toolbar_resstats); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_resstats", + gpiv->button_toolbar_resstats, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_resstats); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_resstats, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_resstats, + _("Enables residu statistics for chain processing: calculates \ +the residus of displacements for detection of outliers and shows an histogram \ +of them. The histogram will be displayed in the Piv Validation tab. \n\ +The process will be executed by clicking the Execute button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_resstats), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_resstats), + "enter", + GTK_SIGNAL_FUNC(on_button_valid_errvec_resstats_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_resstats), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_resstats), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_resstats), + NULL); + if (gpiv_par.process_resstats == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_resstats), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_resstats), + FALSE); + } + + + + gpiv->button_toolbar_errvec = gtk_check_button_new_with_label + (_("validate")); + gtk_widget_ref(gpiv->button_toolbar_errvec); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_errvec", + gpiv->button_toolbar_errvec, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_errvec); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_errvec, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_errvec, + _("Enables validation for chain processing: detects \ +outliers of PIV data by testing on median residu or by Signal to Noise \ +Ratio magnitudes and, eventually, substitutes. \n\ +The process will be executed by clicking the Execute button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_errvec), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_errvec), + "enter", + GTK_SIGNAL_FUNC(on_button_valid_errvec_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_errvec), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_errvec), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_errvec), + NULL); + if (gpiv_par.process_errvec == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_errvec), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_errvec), + FALSE); + } + + + + gpiv->button_toolbar_peaklock = + gtk_check_button_new_with_label(_("peaklock")); + gtk_widget_ref(gpiv->button_toolbar_peaklock); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_peaklock", + gpiv->button_toolbar_peaklock, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_peaklock); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_peaklock, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_peaklock, +_("Enables peak-lock for chain processing: shows an histogram \ +of sub-pixel displacements in order to check on peak-locking effects. \ + The histogram will be displayed in the Piv Validation tab. \n\ +The process will be executed by clicking the \"Execute\" button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_peaklock), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_peaklock), + "enter", + GTK_SIGNAL_FUNC(on_button_valid_peaklck_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_peaklock), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_peaklock), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_peaklck), + NULL); + if (gpiv_par.process_peaklock == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_peaklock), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_peaklock), + FALSE); + } + + + gpiv->button_toolbar_scale = + gtk_check_button_new_with_label(_("scale")); + gtk_widget_ref(gpiv->button_toolbar_scale); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_scale", + gpiv->button_toolbar_scale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_scale); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_scale, FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_scale, +_("Enables scaling for chain processing: scales spatial displacements \ +over all data. \ +\nThe process will be executed by clicking the \"Execute\" button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_scale), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_scale), + "enter", + GTK_SIGNAL_FUNC(on_button_post_scale_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_scale), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_scale), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_scale), + NULL); + if (gpiv_par.process_scale == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_scale), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_scale), + FALSE); + } + + + gpiv->button_toolbar_average = + gtk_check_button_new_with_label(_("average")); + gtk_widget_ref(gpiv->button_toolbar_average); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_average", + gpiv->button_toolbar_average, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_average); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_average, FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_average, +_("Enables average for chain processing: Calculates spatial average displacements \ +over all data. \ +\nThe process will be executed by clicking the \"Execute\" button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_average), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_average), + "enter", + GTK_SIGNAL_FUNC(on_button_post_savg_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_average), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_average), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_average), + NULL); + if (gpiv_par.process_average == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_average), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_average), + FALSE); + } + + + gpiv->button_toolbar_subavg = + gtk_check_button_new_with_label(_("substract")); + gtk_widget_ref(gpiv->button_toolbar_subavg); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_subavg", + gpiv->button_toolbar_subavg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_subavg); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_subavg, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_subavg, +_("Enables substract for chain processing: substracts spatial average displacements \ +from all data. \ +\nThe process will be executed by clicking the \"Execute\" button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_subavg), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_subavg), + "enter", + GTK_SIGNAL_FUNC(on_button_post_subavg_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_subavg), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_subavg), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_subavg), + NULL); + if (gpiv_par.process_substract == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_subavg), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_subavg), + FALSE); + } + + + gpiv->button_toolbar_vorstra = + gtk_check_button_new_with_label(_("vorticity")); + gtk_widget_ref(gpiv->button_toolbar_vorstra); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "button_toolbar_vorstra", + gpiv->button_toolbar_vorstra, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->button_toolbar_vorstra); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), + gpiv->button_toolbar_vorstra, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->button_toolbar_vorstra, +_("Enables vorticity for chain processing: calculates \ + vorticity or strain magnitudes from a velocity field.\n\ +The process will be executed by clicking the Execute button"), + NULL); + + gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_vorstra), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_vorstra), + "enter", + GTK_SIGNAL_FUNC(on_button_post_vorstra_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_vorstra), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_vorstra), + "clicked", + GTK_SIGNAL_FUNC(on_toolbar_checkbutton_vorstra), + NULL); + if (gpiv_par.process_vorstra == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_vorstra), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_vorstra), + FALSE); + } + + + +/* gpiv->hbox_main contains a handlebox with buffer list */ + gpiv->hbox_main = gtk_hbox_new(FALSE, + 0); + gtk_widget_ref(gpiv->hbox_main); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "hbox_main", + gpiv->hbox_main, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->hbox_main); + gtk_box_pack_start(GTK_BOX(gpiv->vbox_main), + gpiv->hbox_main, + FALSE, + FALSE, + 0); + + +/* + * Notebook (tabulator) + */ + gpiv->notebook = gtk_notebook_new(); + gtk_widget_ref(gpiv->notebook); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "notebook", + gpiv->notebook, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->notebook); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_main), + gpiv->notebook, + TRUE, + TRUE, + 0); + + + + gpiv->imgh = create_imgh(gpiv->console, + gpiv->notebook); + + gpiv->tablabel_imgh = gtk_label_new(_("Image Info")); + gtk_widget_ref(gpiv->tablabel_imgh); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "tablabel_imgh", + gpiv->tablabel_imgh, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->tablabel_imgh); + gtk_notebook_set_tab_label(GTK_NOTEBOOK(gpiv->notebook), + gtk_notebook_get_nth_page(GTK_NOTEBOOK + (gpiv->notebook), + 0), + gpiv->tablabel_imgh); + + + + gpiv->piveval = create_piveval(gpiv->console, + gpiv->notebook); + + gpiv->tablabel_piveval = gtk_label_new(_("Evaluation")); + gtk_widget_ref(gpiv->tablabel_piveval); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "tablabel_piveval", + gpiv->tablabel_piveval, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->tablabel_piveval); + gtk_notebook_set_tab_label(GTK_NOTEBOOK(gpiv->notebook), + gtk_notebook_get_nth_page(GTK_NOTEBOOK + (gpiv->notebook), + 1), + gpiv->tablabel_piveval); + + + + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->radiobutton_mouse_1), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->radiobutton_mouse_2), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->radiobutton_mouse_3), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->radiobutton_mouse_4), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->radiobutton_mouse_5), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->radiobutton_mouse_6), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->radiobutton_mouse_7), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->checkbutton_disprocess), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->checkbutton_disprocess), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->piveval->button), + "gpiv", + gpiv); + + + gpiv->pivvalid = create_pivvalid(gpiv->console, + gpiv->notebook); + + gpiv->tablabel_pivvalid = gtk_label_new(_("Validation")); + gtk_widget_ref(gpiv->tablabel_pivvalid); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "tablabel_pivvalid", + gpiv->tablabel_pivvalid, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->tablabel_pivvalid); + gtk_notebook_set_tab_label(GTK_NOTEBOOK(gpiv->notebook), + gtk_notebook_get_nth_page(GTK_NOTEBOOK + (gpiv->notebook), + 2), + gpiv->tablabel_pivvalid); + + + + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->button_gradient), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->radiobutton_disable_0), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->radiobutton_disable_1), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->radiobutton_disable_2), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->radiobutton_disable_3), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->radiobutton_disable_4), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->button_gradient), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->button_errvec_resstats), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivvalid->button_peaklck), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT + (gpiv->pivvalid->radiobutton_errvec_residu_1), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT + (gpiv->pivvalid->radiobutton_errvec_residu_2), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT + (gpiv->pivvalid->checkbutton_errvec_disres), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT + (gpiv->pivvalid->radiobutton_errvec_subst_1), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT + (gpiv->pivvalid->radiobutton_errvec_subst_2), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT + (gpiv->pivvalid->radiobutton_errvec_subst_3), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT + (gpiv->pivvalid->button_errvec), + "gpiv", + gpiv); + + + + +/* pivpost->checkbutton_scale */ + gpiv->pivpost = create_pivpost(gpiv->console, + gpiv->notebook); +/* gtk_object_set_data(GTK_OBJECT(gpiv->console), */ +/* "gpiv", */ +/* gpiv); */ + + gpiv->tablabel_pivpost = gtk_label_new(_("Post processing")); + gtk_widget_ref(gpiv->tablabel_pivpost); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "tablabel_pivpost", + gpiv->tablabel_pivpost, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->tablabel_pivpost); + gtk_notebook_set_tab_label(GTK_NOTEBOOK(gpiv->notebook), + gtk_notebook_get_nth_page(GTK_NOTEBOOK + (gpiv->notebook), + 3), + gpiv->tablabel_pivpost); + + + + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost->button_scale), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost->button_savg), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost->button_subavg), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost-> + radiobutton_vorstra_output_1), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost-> + radiobutton_vorstra_output_2), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost-> + radiobutton_vorstra_output_3), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost-> + radiobutton_vorstra_diffscheme_1), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost-> + radiobutton_vorstra_diffscheme_2), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost-> + radiobutton_vorstra_diffscheme_3), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost-> + radiobutton_vorstra_diffscheme_4), + "gpiv", + gpiv); + gtk_object_set_data(GTK_OBJECT(gpiv->pivpost->button_vorstra), + "gpiv", + gpiv); + + + +/* + * handlebox of buffer list + */ + gpiv->handlebox_buf = gtk_handle_box_new(); + gtk_widget_ref(gpiv->handlebox_buf); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "handlebox_buf", + gpiv->handlebox_buf, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->handlebox_buf); + gtk_box_pack_start(GTK_BOX(gpiv->hbox_main), + gpiv->handlebox_buf, + TRUE, + TRUE, + 0); + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(gpiv->handlebox_buf), + GTK_POS_TOP); + gtk_tooltips_set_tip(gpiv->tooltips, + gpiv->handlebox_buf, + _("buffer names and numbers"), + NULL); + + + gpiv->alignment_buf = gtk_alignment_new(0.0, + 0.0, + 0.0, + 1.0); + gtk_widget_ref(gpiv->alignment_buf); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "alignment_buf", + gpiv->alignment_buf, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->alignment_buf); + gtk_container_add(GTK_CONTAINER(gpiv->handlebox_buf), + gpiv->alignment_buf); + + + gpiv->eventbox_buf = gtk_event_box_new(); + gtk_widget_ref(gpiv->eventbox_buf); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "gpiv->eventbox_buf", + gpiv->eventbox_buf, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->eventbox_buf); + gtk_container_add(GTK_CONTAINER(gpiv->alignment_buf), + gpiv->eventbox_buf); + + + gpiv->scrolledwindow_buf = gtk_scrolled_window_new(NULL, + NULL); + gtk_widget_ref(gpiv->scrolledwindow_buf); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "scrolledwindow_buf", + gpiv->scrolledwindow_buf, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->scrolledwindow_buf); + gtk_container_add(GTK_CONTAINER(gpiv->eventbox_buf), + gpiv->scrolledwindow_buf); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW + (gpiv->scrolledwindow_buf), + /* GTK_POLICY_NEVER */ + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); +/* gpiv->scrolledwindow_buf_adj = gtk_adjustment_new (0.0, 500.0, 100.0, 5.0, 50.0, 2500.0); */ +/* gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW(gpiv->scrolledwindow_buf), */ +/* GTK_ADJUSTMENT (gpiv->scrolledwindow_buf_adj)); */ +/* gnome_canvas_set_scroll_region( GNOME_CANVAS(canvas_display()->display_act->gpd.display), */ +/* 0.0, 0.0, IMAGE_WIDTH, IMAGE_HEIGHT); */ + + + gpiv->viewport_buf = + gtk_viewport_new(NULL, + NULL); + gtk_widget_ref(gpiv->viewport_buf); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "viewport_buf", + gpiv->viewport_buf, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->viewport_buf); + gtk_container_add(GTK_CONTAINER(gpiv->scrolledwindow_buf), + gpiv->viewport_buf); + gtk_widget_set_usize(gpiv->viewport_buf, + 120, + 400); + + + + gpiv->clist_buf = gtk_clist_new(2); + gtk_widget_ref(gpiv->clist_buf); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "clist_buf", + gpiv->clist_buf, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->clist_buf); + gtk_container_add(GTK_CONTAINER(gpiv->viewport_buf/* scrolledwindow_buf */ ), + gpiv->clist_buf); + gtk_tooltips_set_tip(gpiv->tooltips, gpiv->clist_buf, + _("buffer list"), + NULL); + gtk_clist_set_column_width(GTK_CLIST(gpiv->clist_buf), + 0, + 10); + gtk_clist_set_column_width(GTK_CLIST(gpiv->clist_buf), + 1, + 80); + gtk_clist_set_selection_mode(GTK_CLIST (gpiv->clist_buf), + GTK_SELECTION_EXTENDED /* MULTIPLE */); + gtk_clist_column_titles_show(GTK_CLIST(gpiv->clist_buf)); + + gtk_object_set_data(GTK_OBJECT(gpiv->clist_buf), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(gpiv->clist_buf), + "select_row", + GTK_SIGNAL_FUNC(on_clist_buf_rowselect), + NULL); + + + gpiv->label_buf_1 = gtk_label_new(_("#")); + gtk_widget_ref(gpiv->label_buf_1); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "label_buf_1", + gpiv->label_buf_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->label_buf_1); + gtk_clist_set_column_widget(GTK_CLIST(gpiv->clist_buf), + 0, + gpiv->label_buf_1); + + + gpiv->label_buf_2 = gtk_label_new(_("buffer name")); + gtk_widget_ref(gpiv->label_buf_2); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "label_buf_2", + gpiv->label_buf_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->label_buf_2); + gtk_clist_set_column_widget(GTK_CLIST(gpiv->clist_buf), + 1, + gpiv->label_buf_2); + gtk_misc_set_alignment(GTK_MISC(gpiv->label_buf_2), + 0.0, + 0.5); + gtk_clist_column_titles_passive(GTK_CLIST(gpiv->clist_buf)); +/* gtk_clist_set_policy (GTK_CLIST (gpiv->clist_buf), */ +/* GTK_POLICY_ALWAYS, */ +/* GTK_POLICY_ALWAYS); */ + + + gtk_clist_set_column_auto_resize(GTK_CLIST(gpiv->clist_buf), + 1, + TRUE); + + gpiv->scrolledwindow_buf_adj = + gtk_adjustment_new(0.0, + 500.0, + 100.0, + 5.0, + 50.0, + 250.0 /* 2500.0 */); + gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW + (gpiv->scrolledwindow_buf), + GTK_ADJUSTMENT + (gpiv->scrolledwindow_buf_adj)); + + + gtk_drag_dest_set (/* GTK_CLIST */ GTK_WIDGET (gpiv->clist_buf), + GTK_DEST_DEFAULT_ALL, + target_table, 1, + GDK_ACTION_COPY); + + gtk_signal_connect (GTK_OBJECT (gpiv->clist_buf), + "drag_data_received", + GTK_SIGNAL_FUNC (on_clist_buf_drag_data_received), + NULL); + +/* + * Application bar buttons + */ + gpiv->appbar = gnome_appbar_new(TRUE, + TRUE, + GNOME_PREFERENCES_ALWAYS); + gtk_widget_ref(gpiv->appbar); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "appbar", + gpiv->appbar, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(gpiv->appbar); + gnome_app_set_statusbar(GNOME_APP(gpiv->console), + gpiv->appbar); +/* gtk_widget_set_sensitive (gpiv->appbar, FALSE); */ + + + + + +/* + * set gpiv->menubars after definition of all console widgets + */ + if (gpiv_par.view_gpivbuttons) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv[0].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv[0].widget), + FALSE); + } + + + if (gpiv_par.view_tabulator) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv[1].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv[1].widget), + FALSE); + } + + + if (gpiv_par.show_tooltips) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (help_menu_gpiv[0].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (help_menu_gpiv[0].widget), + FALSE); + } + + + gnome_app_install_menu_hints (GNOME_APP (gpiv->console), + menubar_gpiv); + + return gpiv; +} + + + + +GtkWidget *create_about(void) +{ + const gchar *authors[] = { + "G. van der Graaf", + NULL + }; +/* GtkWidget *about; */ + about = gnome_about_new( /* Title: */ "gpiv", + /* VersioN: */ VERSION, + /* Copyright */ _("Copyright G. Van der Graaf"), + /* Author(s): */ authors, + /* Comments: */ _("gpiv is a program for " +"(Digital) Particle Image Velocimetry. It evaluates images (pairs), " +"resulting into a velocity field of a fluid flow. The program includes " +"validation of the velocities and allows to post-proces the data resulting " +"into derivatives of the flow."), + NULL); + gtk_object_set_data(GTK_OBJECT(about), + "about", + about); + gtk_window_set_modal(GTK_WINDOW(about), TRUE); + gtk_window_set_wmclass(GTK_WINDOW(about), + "gpiv about", + ""); + + gtk_signal_connect(GTK_OBJECT(about), + "clicked", + GTK_SIGNAL_FUNC(gtk_widget_destroy), + NULL); + + return about; +} + + +GtkWidget +*create_exit(void) +{ + GtkWidget *exit; + GtkWidget *dialog_vbox1; + GtkWidget *exit_message_label; + GtkWidget *dialog_action_area1; + GtkWidget *button_yes; + GtkWidget *button_no; + + + + exit = gnome_dialog_new(NULL, + NULL); + gtk_object_set_data(GTK_OBJECT(exit), + "exit", + exit); + GTK_WINDOW(exit)->type = GTK_WINDOW_DIALOG; + gtk_window_set_position(GTK_WINDOW(exit), + GTK_WIN_POS_CENTER); + gtk_window_set_policy(GTK_WINDOW(exit), + FALSE, + FALSE, + FALSE); + + + + dialog_vbox1 = GNOME_DIALOG(exit)->vbox; + gtk_object_set_data(GTK_OBJECT(exit), + "dialog_vbox1", + dialog_vbox1); + gtk_widget_show(dialog_vbox1); + + + + exit_message_label = + gtk_label_new(_("There are unsaved data that will be lost.\n\ +Are you sure you want to quit?")); + + gtk_widget_ref(exit_message_label); + gtk_object_set_data_full(GTK_OBJECT(exit), + "exit_message_label", + exit_message_label, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(exit_message_label); + gtk_box_pack_start(GTK_BOX(dialog_vbox1), + exit_message_label, + FALSE, + FALSE, + 0); + + + + dialog_action_area1 = GNOME_DIALOG(exit)->action_area; + gtk_object_set_data(GTK_OBJECT(exit), + "dialog_action_area1", + dialog_action_area1); + gtk_widget_show(dialog_action_area1); + gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area1), + GTK_BUTTONBOX_END); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(dialog_action_area1), + 8); + + + + gnome_dialog_append_button(GNOME_DIALOG(exit), + GNOME_STOCK_BUTTON_YES); + button_yes = + GTK_WIDGET(g_list_last(GNOME_DIALOG(exit)->buttons)->data); + gtk_widget_ref(button_yes); + gtk_object_set_data_full(GTK_OBJECT(exit), + "button_yes", + button_yes, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(button_yes); + GTK_WIDGET_SET_FLAGS(GTK_OBJECT(button_yes), + GTK_CAN_DEFAULT); + + + + gnome_dialog_append_button(GNOME_DIALOG(exit), + GNOME_STOCK_BUTTON_NO); + button_no = GTK_WIDGET(g_list_last(GNOME_DIALOG(exit)->buttons)->data); + gtk_widget_ref(button_no); + gtk_object_set_data_full(GTK_OBJECT(exit), + "button_no", + button_no, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(button_no); + GTK_WIDGET_SET_FLAGS(GTK_OBJECT(button_no), + GTK_CAN_DEFAULT); + + + + gtk_signal_connect(GTK_OBJECT(button_yes), + "clicked", + GTK_SIGNAL_FUNC(on_button_quit_gpiv_yes_clicked), + NULL); + + gtk_signal_connect(GTK_OBJECT(button_no), + "clicked", + GTK_SIGNAL_FUNC(on_button_quit_no_clicked), + NULL); + + return exit; +} + + + +GtkWidget +*create_messagebox(gchar * message) +{ + GtkWidget *messagebox; + GtkWidget *dialog_vbox; + GtkWidget *button; + GtkWidget *dialog_action_area2; + + /* We create it with an OK button, and then remove the button, to work + around a bug in gnome-libs. */ + messagebox = gnome_message_box_new(message, + GNOME_MESSAGE_BOX_WARNING, + GNOME_STOCK_BUTTON_OK, + NULL); + gtk_container_remove(GTK_CONTAINER + (GNOME_DIALOG(messagebox)->action_area), + GNOME_DIALOG(messagebox)->buttons->data); + GNOME_DIALOG(messagebox)->buttons = NULL; + gtk_object_set_data(GTK_OBJECT(messagebox), + "messagebox", + messagebox); + gtk_window_set_title(GTK_WINDOW(messagebox), + _("gpiv message")); + gtk_window_set_position(GTK_WINDOW(messagebox), + GTK_WIN_POS_MOUSE); + gtk_window_set_policy(GTK_WINDOW(messagebox), + FALSE, + FALSE, + FALSE); + + + + dialog_vbox = GNOME_DIALOG(messagebox)->vbox; + gtk_object_set_data(GTK_OBJECT(messagebox), + "dialog_vbox", + dialog_vbox); + gtk_widget_show(dialog_vbox); + + + + gnome_dialog_append_button(GNOME_DIALOG(messagebox), + GNOME_STOCK_BUTTON_OK); + button = + GTK_WIDGET(g_list_last(GNOME_DIALOG(messagebox)->buttons)->data); + gtk_widget_ref(button); + gtk_object_set_data_full(GTK_OBJECT(messagebox), + "button", + button, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(button); + GTK_WIDGET_SET_FLAGS(GTK_OBJECT(button), + GTK_CAN_DEFAULT); + + + + dialog_action_area2 = GNOME_DIALOG(messagebox)->action_area; + gtk_widget_ref(dialog_action_area2); + gtk_object_set_data_full(GTK_OBJECT(messagebox), + "dialog_action_area2", + dialog_action_area2, + (GtkDestroyNotify) gtk_widget_unref); + + gtk_signal_connect(GTK_OBJECT(button), + "clicked", + GTK_SIGNAL_FUNC(on_button_message_clicked), + NULL); + + + + return messagebox; +} + + + + +GtkWidget *create_errorbox(gchar * message) +{ + GtkWidget *errorbox; + GtkWidget *dialog_vbox; + GtkWidget *button; + GtkWidget *dialog_action_area3; + + /* We create it with an OK button, and then remove the button, to work + around a bug in gnome-libs. */ + errorbox = gnome_message_box_new(message, + GNOME_MESSAGE_BOX_ERROR, + GNOME_STOCK_BUTTON_OK, + NULL); + gtk_container_remove(GTK_CONTAINER + (GNOME_DIALOG(errorbox)->action_area), + GNOME_DIALOG(errorbox)->buttons->data); + GNOME_DIALOG(errorbox)->buttons = NULL; + gtk_object_set_data(GTK_OBJECT(errorbox), + "errorbox", + errorbox); + gtk_window_set_title(GTK_WINDOW(errorbox), + _("gpiv error")); + gtk_window_set_policy(GTK_WINDOW(errorbox), + FALSE, + FALSE, + FALSE); + + + + dialog_vbox = GNOME_DIALOG(errorbox)->vbox; + gtk_object_set_data(GTK_OBJECT(errorbox), + "dialog_vbox", + dialog_vbox); + gtk_widget_show(dialog_vbox); + + gnome_dialog_append_button(GNOME_DIALOG(errorbox), + GNOME_STOCK_BUTTON_CLOSE); + button = + GTK_WIDGET(g_list_last(GNOME_DIALOG(errorbox)->buttons)->data); + gtk_widget_ref(button); + gtk_object_set_data_full(GTK_OBJECT(errorbox), + "button", + button, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(button); + GTK_WIDGET_SET_FLAGS(GTK_OBJECT(button), + GTK_CAN_DEFAULT); + + + + dialog_action_area3 = GNOME_DIALOG(errorbox)->action_area; + gtk_widget_ref(dialog_action_area3); + gtk_object_set_data_full(GTK_OBJECT(errorbox), + "dialog_action_area3", + dialog_action_area3, + (GtkDestroyNotify) gtk_widget_unref); + + gtk_signal_connect(GTK_OBJECT(button), + "clicked", + GTK_SIGNAL_FUNC(on_button_error_clicked), + NULL); + + return errorbox; +} + + + +gint +close_buffer_yes_no (GpivConsole * gpiv, + char *message) +{ + GtkWidget *dialog, *label; + int button; + + dialog = gnome_dialog_new ( + "gpiv dialog", + GNOME_STOCK_BUTTON_YES, + GNOME_STOCK_BUTTON_NO, + NULL); + + gnome_dialog_set_parent (GNOME_DIALOG (dialog), + GTK_WINDOW(gpiv->console)); + + label = gtk_label_new (message); + gtk_object_set_data_full(GTK_OBJECT(dialog), + "label", + label, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(label); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), + label, + TRUE, + TRUE, + 0); + + /* + * Run the dialog and wait for the user to select yes or no. + * If the user closes the window with the window manager, we + * will get a -1 return value + */ + button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + + return button; +} + diff --git a/src/console_interface.h b/src/console_interface.h new file mode 100644 index 0000000..3156af3 --- /dev/null +++ b/src/console_interface.h @@ -0,0 +1,174 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * $Log: console_interface.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * +*/ +/* -- widgets from GtkWidget *gpiv_gui_gtk ------------*/ +/* #ifdef HAVE_CONFIG_H */ +/* # include */ +/* #endif */ + +/* GtkWidget* create_exit (void); */ + +#ifndef CONSOLE_INTERFACE_H +#define CONSOLE_INTERFACE_H + +#include "gpiv_gtk.h" +#include "imgh_interface.h" +#include "piveval_interface.h" +#include "pivvalid_interface.h" +#include "pivpost_interface.h" + +/* + * widget for pop-up menu + */ + +typedef struct _GpivConsole GpivConsole; +struct _GpivConsole { +/* + * General widgets for gpiv-gui + */ + GtkWidget *console; +/* GnomeApp *console; */ + GtkWidget *appbar; + GtkTooltips *tooltips; + + GtkWidget *dock1; + GtkWidget *alignment3; + GtkWidget *menubar; + GtkWidget *eventbox1; + GtkWidget *toolbar1; +/* GtkWidget *tmp_toolbar_icon; */ +/* GtkWidget *button1; */ +/* GtkWidget *button_open; */ +/* GtkWidget *button_save; */ +/* GtkWidget *button_exec; */ + GtkWidget *vseparator; + GtkWidget *button_exit; + GtkWidget *hbox_main; + GtkWidget *handlebox_buf; + +/* + * Menu widgets + */ + GtkWidget *toggle_view_buttons; + const GtkWidget *toggle_view_tool; + const GtkWidget *toggle_view_tab; + +/* + * Buffer handlebox & clist + */ + gint first_selected_row; + gint last_selected_row; + GtkWidget *alignment_buf; + GtkWidget *eventbox_buf; + GtkWidget *scrolledwindow_buf; + GtkObject *scrolledwindow_buf_adj; + GtkWidget *button_buf; + GtkWidget *viewport_buf; + GtkWidget *clist_buf; + GtkWidget *label_buf_1; + GtkWidget *label_buf_2; + +GtkWidget *vbox_main; + +/* + * gpiv toolbox + */ + GtkWidget *handlebox1; + GtkWidget *scrolledwindow_handbox1; + GtkWidget *viewport_handbox1; + GtkWidget *toolbar2; + GtkWidget *hbox_toolbar2; + GtkWidget *button_toolbar_piv; + GtkWidget *button_toolbar_gradient; + GtkWidget *button_toolbar_resstats; + GtkWidget *button_toolbar_errvec; + GtkWidget *button_toolbar_peaklock; + GtkWidget *button_toolbar_scale; + GtkWidget *button_toolbar_average; + GtkWidget *button_toolbar_subavg; + GtkWidget *button_toolbar_vorstra; + +/* + * Tabulator + */ + GtkWidget *notebook; + Imgheader *imgh; + GtkWidget *tablabel_imgh; + PivEval *piveval; + GtkWidget *tablabel_piveval; + PivValid *pivvalid; + GtkWidget *tablabel_pivvalid; + PivPost *pivpost; + GtkWidget *tablabel_pivpost; + + GSList *mouse_sel_group; + +}; + + +GpivConsole * +create_gpiv(void); + +GtkWidget * +create_menu_gpiv_popup (GpivConsole * gpiv); + + +/* + * widgets from GtkWidget* create_about (void) + */ +/* const gchar *authors[]; */ +GtkWidget* create_about (void); +GtkWidget *about; + + + +/* + * widget for display menu + */ +/* GtkWidget* create_display_menu (void); */ +/* GtkWidget *display_menu; */ + +GtkWidget* create_exit (void); + +GtkWidget* create_messagebox (gchar *message); + +GtkWidget* create_errorbox (gchar *message); + +/* + * widget for closing buffer + */ +gint +close_buffer_yes_no (GpivConsole * gpiv, + char *message); + +#endif /* CONSOLE_INTERFACE_H */ diff --git a/src/console_menus.h b/src/console_menus.h new file mode 100644 index 0000000..a9de3c2 --- /dev/null +++ b/src/console_menus.h @@ -0,0 +1,372 @@ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + + +/* + * menu definitions + * $Log: console_menus.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef MENUS_H +#define MENUS_H + +#include "console.h" + +static GtkTargetEntry target_table[] = { + { "text/plain", 0, 0 } +}; + +/* + * menu bar menus + */ +static GnomeUIInfo file_menu_gpiv[] = +{ + GNOMEUIINFO_MENU_OPEN_ITEM (on_open_activate, NULL), + GNOMEUIINFO_MENU_SAVE_ITEM (on_save_activate, NULL), + GNOMEUIINFO_MENU_SAVE_AS_ITEM (on_save_as_activate, NULL), + GNOMEUIINFO_SEPARATOR, + GNOMEUIINFO_MENU_EXIT_ITEM (on_exit_activate, NULL), + GNOMEUIINFO_END +}; + + +static GnomeUIInfo settings_menu_gpiv[] = +{ + { + GNOME_APP_UI_TOGGLEITEM, N_("gpiv buttons"), + N_("show gpiv check-buttons"), + (gpointer) on_gpivbuttons_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("tabulator"), + N_("show tabulator containing parameter settings"), + (gpointer) on_tabulator_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + GNOMEUIINFO_SEPARATOR, + + { + GNOME_APP_UI_ITEM, N_("Preferences"), + N_("Define settings of the application"), + (gpointer) on_preferences_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + GNOMEUIINFO_END +}; + + + +static GnomeUIInfo help_menu_gpiv[] = +{ + { + GNOME_APP_UI_TOGGLEITEM, N_("show tooltips"), + N_("show extended information in a small pop-up window"), + (gpointer) on_tooltip_activate, /* NULL */ "gpiv", NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_ITEM, N_("manual"), + NULL, + (gpointer) on_manual_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + +/* GNOMEUIINFO_HELP ("/home/gerber/gpiv/docs/index.html"), */ + GNOMEUIINFO_MENU_ABOUT_ITEM (on_about_activate, NULL), + GNOMEUIINFO_END +}; + + + +static GnomeUIInfo menubar_gpiv[] = +{ + GNOMEUIINFO_MENU_FILE_TREE (file_menu_gpiv), + GNOMEUIINFO_MENU_SETTINGS_TREE (settings_menu_gpiv), + GNOMEUIINFO_MENU_HELP_TREE (help_menu_gpiv), + GNOMEUIINFO_END +}; + +/* + * Toolbar buttons + */ + +static GnomeUIInfo toolbar_gpiv[] = +{ + { + GNOME_APP_UI_ITEM, N_("Open"), N_("Open a PIV image or data-file"), + (gpointer) on_button_open_clicked, NULL, NULL, + GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_OPEN, 0, 0, NULL + }, + + { + GNOME_APP_UI_ITEM, N_("Save"), N_("Save data"), + (gpointer) on_save_activate, NULL, NULL, + GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_SAVE, 0, 0, NULL + }, + + { + GNOME_APP_UI_ITEM, N_("Execute"), N_("Execute the enabled chain process(es)"), + (gpointer) on_execute_activate, NULL, NULL, + GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_EXEC, 0, 0, NULL + }, + + { + GNOME_APP_UI_ITEM, N_("Stop"), N_("Cancels all running processes"), + (gpointer) on_stop_activate, NULL, NULL, + GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_STOP, 0, 0, NULL + }, + + { + GNOME_APP_UI_ITEM, N_("Close"), N_("Close active buffer(s).\nA warning message will be issued for unsaved data"), + (gpointer) on_close_activate, NULL, NULL, + GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_CLOSE, 0, 0, NULL + }, + + GNOMEUIINFO_SEPARATOR, + + { + GNOME_APP_UI_ITEM, N_("Exit"), N_("Exit gpiv. \nA warning message will be issued for unsaved data"), + (gpointer) on_exit_activate, NULL, NULL, + GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_EXIT, 0, 0, NULL + }, + GNOMEUIINFO_END +}; + + + +/* + * Toolbar process buttons + */ + +static GnomeUIInfo toolbar2[] = +{ + { + GNOME_APP_UI_TOGGLEITEM, N_("piv"), + N_("Enables PIV for chain processing: analysing of a PIV image \ +(pair), resulting into the mean displacements of the particle images within \ +each interrogation area. \n\ +The process will be executed by clicking the Execute button"), + (gpointer) on_toolbar_checkbutton_piv, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("gradient"), + N_("Enables gradient for chain processing: Disables velocities with \ +gradients larger than 0.05 over the interrogation area. \n\ +The process will be executed by clicking the \"Execute\" button"), + (gpointer) on_toolbar_checkbutton_gradient, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("validate"), + N_("Enables validation for chain processing: detects \ +outliers of PIV data by testing on median residu or by Signal to Noise \ +Ratio magnitudes and, eventually, substitutes. \n\ +The process will be executed by clicking the Execute button"), + (gpointer) on_toolbar_checkbutton_errvec, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("residu stats"), + N_("Enables residu statistics for chain processing: calculates \ +the residus of displacements for detection of outliers and shows an histogram \ +of them. The histogram will be displayed in the Piv Validation tab. \n\ +The process will be executed by clicking the Execute button"), + (gpointer) on_toolbar_checkbutton_resstats, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("peaklock"), + N_("Enables peak-lock for chain processing: shows an histogram \ +of sub-pixel displacements in order to check on peak-locking effects. \ + The histogram will be displayed in the Piv Validation tab. \n\ +The process will be executed by clicking the \"Execute\" button"), + (gpointer) on_toolbar_checkbutton_peaklck, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("scale"), + N_("Enables scale for chain processing: scales spatial \ +displacements from all data. \n\ +The process will be executed by clicking the \"Execute\" button"), + (gpointer) on_toolbar_checkbutton_subavg, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("average"), + N_("Enables average for chain processing: Calculates spatial average \ +displacements over all data. \n\ +The process will be executed by clicking the \"Execute\" button"), + (gpointer) on_toolbar_checkbutton_average, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("substract"), + N_("Enables substract for chain processing: substracts spatial average \ +displacements from all data. \n\ +The process will be executed by clicking the \"Execute\" button"), + (gpointer) on_toolbar_checkbutton_subavg, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + { + GNOME_APP_UI_TOGGLEITEM, N_("vorticity"), + N_("Enables vorticity for chain processing: calculates \ + vorticity or strain magnitudes from a velocity field.\n\ +The process will be executed by clicking the Execute button"), + (gpointer) on_toolbar_checkbutton_vorstra, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + + GNOMEUIINFO_END +}; + + + + +/* + * Popup menus + */ + +static GnomeUIInfo file_menu_gpiv_popup[] = +{ + GNOMEUIINFO_MENU_OPEN_ITEM (on_open_activate, NULL), + GNOMEUIINFO_MENU_SAVE_ITEM (on_save_activate, NULL), +/* GNOMEUIINFO_MENU_SAVE_AS_ITEM (on_save_as_activate, NULL), */ + GNOMEUIINFO_SEPARATOR, + GNOMEUIINFO_MENU_EXIT_ITEM (on_exit_activate, NULL), + GNOMEUIINFO_END +}; + + +static GnomeUIInfo settings_menu_gpiv_popup[] = +{ + +/* { */ +/* GNOME_APP_UI_TOGGLEITEM, N_("menu bar"), */ +/* N_("show menu bar"), */ +/* (gpointer) on_menubar_activate, NULL, NULL, */ +/* GNOME_APP_PIXMAP_NONE, NULL, */ +/* 0, (GdkModifierType) 0, NULL */ +/* }, */ +/* { */ +/* GNOME_APP_UI_TOGGLEITEM, N_("tool buttons"), */ +/* N_("show tool button bar"), */ +/* (gpointer) on_toolbuttons_activate, NULL, NULL, */ +/* GNOME_APP_PIXMAP_NONE, NULL, */ +/* 0, (GdkModifierType) 0, NULL */ +/* }, */ + { + GNOME_APP_UI_TOGGLEITEM, N_("gpiv buttons"), + N_("show gpiv check-buttons"), + (gpointer) on_gpivbuttons_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + { + GNOME_APP_UI_TOGGLEITEM, N_("tabulator"), + N_("show tabulator containing parameter settings"), + (gpointer) on_tabulator_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + GNOMEUIINFO_SEPARATOR, + { + GNOME_APP_UI_ITEM, N_("Preferences"), + NULL, + (gpointer) on_preferences_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + GNOMEUIINFO_END +}; + + + +static GnomeUIInfo help_menu_gpiv_popup[] = +{ + { + GNOME_APP_UI_TOGGLEITEM, N_("show tooltips"), + N_("show extended information in a small pop-up window"), + (gpointer) on_tooltip_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, + { + GNOME_APP_UI_ITEM, N_("manual"), + NULL, + (gpointer) on_manual_activate, NULL, NULL, + GNOME_APP_PIXMAP_NONE, NULL, + 0, (GdkModifierType) 0, NULL + }, +/* GNOMEUIINFO_HELP ("/home/gerber/gpiv/docs/index.html"), */ + GNOMEUIINFO_MENU_ABOUT_ITEM (on_about_activate, NULL), + GNOMEUIINFO_END +}; + + + +static GnomeUIInfo menubar_gpiv_popup[] = +{ + GNOMEUIINFO_MENU_FILE_TREE (file_menu_gpiv_popup), + GNOMEUIINFO_MENU_SETTINGS_TREE (settings_menu_gpiv_popup), + GNOMEUIINFO_MENU_HELP_TREE (help_menu_gpiv_popup), + GNOMEUIINFO_END +}; + + + +#endif /* MENUS_H */ + diff --git a/src/display.c b/src/display.c new file mode 100644 index 0000000..c352c87 --- /dev/null +++ b/src/display.c @@ -0,0 +1,2699 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (callback) functions for the display + * $Log: display.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#include "gpiv_gtk.h" +#include "utils.h" +#include "display_interface.h" +#include "display.h" +#include "piveval.h" + +/* used in canvas_display_motion_notify callback function */ +/* static gint intregs_tmp_nx, intregs_tmp_ny; */ +/* used in canvas_display_button_press and canvas_display_leave_notify +callback function */ +/* static gint col_start_old, row_start_old; */ + +static void +search_nearest_index(gint x, + gint y, + gint * index_y, + gint * index_x, + Display * disp) +{ + gint i, j, x_min = 10e4, y_min = 10e4, dif; + +/* g_warning("search_nearest_index:: 0; disp->count=%d, nx=%d ny=%d", */ +/* disp->count, disp->intreg.data->nx, disp->intreg.data->ny); */ + + for (i = 0; i < disp->intreg.data.ny; i++) { + for (j = 0; j < disp->intreg.data.nx; j++) { + dif = abs(y - (int) disp->intreg.data.point_y[i][j]); + if (dif < y_min) { + y_min = dif; + *index_y = i; + } + dif = abs(x - (int) disp->intreg.data.point_x[i][j]); + if (dif < x_min) { + x_min = dif; + *index_x = j; + } + } + } +} + + + +static void +highlight_intreg(gint index_y, + gint index_x, + Display * disp) +{ + gint index_x_old = disp->index_x_old; + gint index_y_old = disp->index_y_old; + + if (disp->intreg.exist && disp->display_intregs + && index_y <= disp->intreg.data.ny + && index_x <= disp->intreg.data.nx) { +/* index_y <= index_y_old && index_x <= index_x_old */ + + if (disp->intreg.gci_intreg2[index_y_old][index_x_old] != NULL) + gnome_canvas_item_set(disp->intreg. + gci_intreg2[index_y_old][index_x_old], + "outline_color", "yellow", + NULL); +/* fprintf(stderr,"B:: lowering int2 _to_bottom\n"); */ +/* for (i = index_y-3; i < index_y+4; i++) { */ +/* for (j = index_x-3; j < index_x+4; j++) { */ +/* gnome_canvas_item_raise */ +/* (display_act->gpd.gci_intreg1[i][j], 1); */ +/* gnome_canvas_item_lower_to_bottom */ +/* (display_act->gpd.gci_intreg2[index_y][index_x]); */ +/* } */ +/* } */ + + if (disp->intreg.gci_intreg1[index_y_old][index_x_old] != NULL) + gnome_canvas_item_set(disp->intreg. + gci_intreg1[index_y_old][index_x_old], + "outline_color", "blue", + NULL); + + + if (disp->intreg.gci_intreg2[index_y][index_x] != NULL) { +/* gnome_canvas_item_raise(GNOME_CANVAS_ITEM */ +/* (disp->intreg.gci_intreg2[index_y][index_x]), */ +/* disp->intreg.data.ny * */ +/* disp->intreg.data.nx); */ +/* g_warning("highlight_intreg:: 3B"); */ + gnome_canvas_item_set(disp->intreg.gci_intreg2[index_y][index_x], + "outline_color", "red", + NULL); + gnome_canvas_item_raise_to_top(disp->intreg. + gci_intreg2[index_y][index_x]); + } + + + + if (disp->intreg.gci_intreg1[index_y][index_x] != NULL) { +/* gnome_canvas_item_raise(GNOME_CANVAS_ITEM */ +/* (disp->intreg.gci_intreg1[index_y][index_x]), */ +/* disp->intreg.data.ny * */ +/* disp->intreg.data.nx); */ +/* g_warning("highlight_intreg:: 4B"); */ + gnome_canvas_item_set(disp->intreg.gci_intreg1[index_y][index_x], + "outline_color", "green", + NULL); + gnome_canvas_item_raise_to_top(disp->intreg. + gci_intreg1[index_y][index_x]); + } + } +} + + +static void +create_msg_display_with_pivdata(PivData piv_data, + gint index_y, + gint index_x, + gint scale) +{ + if (scale) { + g_snprintf(msg_display, MAX_CHARS, +/* x=%d y=%d */ + "xp=%3.2fmm yp=%3.2fmm U=%3.2fm/s V=%3.2fm/s" + " snr=%3.2f peak #%d", +/* x, y, */ + piv_data.point_x[index_y][index_x] * 1e3, + piv_data.point_y[index_y][index_x] * 1e3, + piv_data.dx[index_y][index_x], + piv_data.dy[index_y][index_x], + piv_data.snr[index_y][index_x], + piv_data.peak_no[index_y][index_x]); + } else { + g_snprintf(msg_display, MAX_CHARS, +/* x=%d y=%d */ + "xp=%3.0fpx yp=%3.0fpx dx=%3.2fpx dy=%3.2fpx" + " snr=%3.2f peak #%d", +/* x, y, */ + piv_data.point_x[index_y][index_x], + piv_data.point_y[index_y][index_x], + piv_data.dx[index_y][index_x], + piv_data.dy[index_y][index_x], + piv_data.snr[index_y][index_x], + piv_data.peak_no[index_y][index_x]); + } + +} + + +static void +create_msg_display_with_pivscdata(PivData piv_data, + ScalarData sc_data, + gint index_y, + gint index_x, + gint scale) +{ + if (scale) { + g_snprintf(msg_display, MAX_CHARS, +/* x=%d y=%d */ + "xp=%3.2fmm yp=%3.2fmm U=%3.2fm/s V=%3.2fm/s " + "snr=%3.2f peak #%d scal=%3.2f", +/* x, y, */ + piv_data.point_x[index_y][index_x] * 1e3, + piv_data.point_y[index_y][index_x] * 1e3, + piv_data.dx[index_y][index_x], + piv_data.dy[index_y][index_x], + piv_data.snr[index_y][index_x], + piv_data.peak_no[index_y][index_x], + sc_data.scalar[index_y][index_x]); + } else { + g_snprintf(msg_display, MAX_CHARS, +/* x=%d y=%d */ + "xp=%3.0fpx yp=%3.0fpx dx=%3.2fpx dy=%3.2fpx " + "snr=%3.2f peak #%d scal=%3.2f", +/* x, y, */ + piv_data.point_x[index_y][index_x], + piv_data.point_y[index_y][index_x], + piv_data.dx[index_y][index_x], + piv_data.dy[index_y][index_x], + piv_data.snr[index_y][index_x], + piv_data.peak_no[index_y][index_x], + sc_data.scalar[index_y][index_x]); + } +} + + +/* + * Callbacks for img_display + */ + +gint +on_button_display_origin_press_event(GtkWidget *widget, + GdkEventButton *event, + gpointer data) +{ + gtk_menu_popup(GTK_MENU(display_act->display_menu), NULL, NULL, NULL, NULL, + event->button, event->time); + return FALSE; +} + + + +void +on_display_set_focus(GtkWidget * widget, + gpointer data) +{ + Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + + gtk_clist_set_selection_mode(GTK_CLIST (gpiv->clist_buf), + GTK_SELECTION_SINGLE); + gtk_clist_select_row(GTK_CLIST(gpiv->clist_buf), disp->count, 0); + gtk_clist_set_selection_mode(GTK_CLIST (gpiv->clist_buf), + GTK_SELECTION_EXTENDED); +} + + +void +on_scrolledwindow_display_adj_changed (GtkAdjustment *adj, + gpointer data) +{ + enum variable_type { + X_ADJ = 0, + Y_ADJ = 1 + } var_type; + + var_type = atoi(gtk_object_get_data(GTK_OBJECT(adj), "var_type")); + if (var_type == X_ADJ) { + x_offset = (gint) adj->value /* * (int) display_act->gpd.zoom_factor */ ; + x_lower = (gint) adj->lower /* * (int) display_act->gpd.zoom_factor */ ; + x_upper = (gint) adj->upper /* * (int) display_act->gpd.zoom_factor */ ; + } + if (var_type == Y_ADJ) { + y_offset = (gint) adj->value/* * (int) display_act->gpd.zoom_factor */; + y_lower = (gint) adj->lower/* * (int) display_act->gpd.zoom_factor */; + y_upper = (gint) adj->upper/* * (int) display_act->gpd.zoom_factor */; + + } +/* adjust rulers here ?! */ +} + + +/* + * Callback functions for pop-up menus + */ + +gint +on_displaypopup_handler(GtkWidget *widget, GdkEvent *event) + { + GtkMenu *menu; + GdkEventButton *event_button; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (GTK_IS_MENU (widget), FALSE); + g_return_val_if_fail (event != NULL, FALSE); + + /* The "widget" is the menu that was supplied when + * gtk_signal_connect_object was called. + */ + menu = GTK_MENU (widget); + + if (event->type == GDK_BUTTON_PRESS) + { + event_button = (GdkEventButton *) event; + if (event_button->button == 3) + { + gtk_menu_popup (menu, NULL, NULL, NULL, NULL, + event_button->button, event_button->time); + return TRUE; + } + } + + return FALSE; + } + + + + + +void +select_zoomscale(gpointer data, + guint action, + GtkWidget * widget) +{ + gint screen_width = 0, screen_height = 0; + gint width = 0, height = 0; + gint new_width = 0, new_height = 0; + gint zoom_index; + Display *disp = display_act; + + if (disp != NULL) { +/* + *test + */ +/* disp = gtk_get_data(display_act); */ + + zoom_index = action; + disp->zoom_factor = zfactor[zoom_index]; + screen_width = gdk_screen_width(); + screen_height = gdk_screen_height(); + gdk_window_get_size(disp->mwin->window, &width, &height); +/* gdk_window_get_size(disp->mwin->window, &width, &height); */ + +/* gnome_win_hints_get_expanded_size(display_act, */ +/* &x, */ +/* &y, */ +/* &width, */ +/* &height); */ + + new_width = (gint) (disp->zoom_factor * gpiv_par.img_width + VIEW_HMARGE); + new_height = (gint) (disp->zoom_factor * gpiv_par.img_height + VIEW_VMARGE); + + if ((new_width < width || new_height < height) + || (gpiv_par.stretch_window ) ) { + + if (new_width < screen_width && new_height < screen_height) { + gnome_win_hints_set_state(disp->mwin, 0); + gdk_window_resize(disp->mwin->window, + new_width, new_height); + } else if (new_width > screen_width && new_height < screen_height) { + gnome_win_hints_set_state(disp->mwin, + WIN_STATE_MAXIMIZED_HORIZ); + } else if (new_width < screen_width && new_height > screen_height) { + gnome_win_hints_set_state(disp->mwin, + WIN_STATE_MAXIMIZED_VERT); + } else if (new_width > screen_width && new_height > screen_height) { + gnome_win_hints_set_state(disp->mwin, + WIN_STATE_MAXIMIZED_HORIZ + + WIN_STATE_MAXIMIZED_VERT); + } else { + g_warning("select_zoomscale:: should not arrive here"); + } + + } + +/* gnome_win_hints_set_expanded_size(disp->mwin, x, y, width, */ +/* height); */ + + + + gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(disp->canvas), + disp->zoom_factor); + } + +} + + + +/* + * Callback functions for actions within display + */ + +gint +canvas_display_enter_notify(GtkWidget * widget, + GdkEventMotion * event) +{ + Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); +/* GtkWidget * view_menu_display4 = */ +/* gtk_object_get_data(GTK_OBJECT(disp->mwin), */ +/* "view_menu_display4"); */ + + disp->index_x_old = 0; + disp->index_y_old = 0; + +/* g_warning("canvas_display_enter_notify:: viewer count = %d", disp->count); */ + if (m_select == NO_MS) { + cursor = gdk_cursor_new(GDK_DOTBOX); +/* g_warning("canvas_display_enter_notify:: NO_MS"); */ + + } else if (m_select == SINGLE_AREA_MS + || m_select == ENABLE_POINT_MS + || m_select == DISABLE_POINT_MS) { + cursor = gdk_cursor_new(GDK_CROSSHAIR); + + } else if (m_select == SINGLE_POINT_MS + || m_select == VLINE_MS + || m_select == HLINE_MS) { + cursor = gdk_cursor_new(GDK_CROSS); + if (display_act->gpd.exist_piv && disp->display_piv) { + hide_all_vectors(&display_act->gpd); + disp->display_piv = FALSE; + } + + if (disp->intreg.exist && disp->display_intregs) { + hide_all_intregs(disp); + disp->display_intregs = FALSE; + } + + } else if (m_select == AOI_MS + || m_select == ENABLE_AREA_MS + || m_select == DISABLE_AREA_MS) { + cursor = gdk_cursor_new(GDK_FLEUR); + if (m_select == AOI_MS) { +/* g_warning(" canvas_display_enter_notify:: hide_all_intregs count=%d", */ +/* disp->count); */ + + hide_all_intregs(disp); + disp->display_intregs = FALSE; + } + } + + gdk_window_set_cursor(disp->mwin->window, cursor); +/* g_warning("canvas_display_enter_notify:: END"); */ + + return TRUE; +} + + + + +gint +canvas_display_motion_notify(GtkWidget * widget, + GdkEventMotion * event) +{ + Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + + gint x, y /*, i, j , x_min = 10e4, y_min = 10e4, dif */; + gint index_y = 0, index_x = 0; + gint index_x_old = disp->index_x_old, index_y_old = disp->index_y_old; + + GdkModifierType state; + PivData piv_data = disp->gpd.piv_data; + PivData piv_data_scaled = disp->gpd.piv_data_scaled; + ScalarData vor_data = disp->gpd.vor_data; + ScalarData vor_data_scaled = disp->gpd.vor_data_scaled; + + GnomeCanvasPoints *points; + points = gnome_canvas_points_new(2); + +/* g_warning("canvas_motion_enter_notify:: START"); */ + +/* gdk_window_get_pointer (widget->mwin, &x, &y, NULL); */ +/* x = event->x; */ +/* y = event->y; */ + + + if (event->is_hint) { + gdk_window_get_pointer(event->window, &x, &y, &state); + x = (x + x_offset)/ disp->zoom_factor; + y = (y + y_offset) / disp->zoom_factor; + } else { + x = (event->x + x_offset) / disp->zoom_factor; + y = (event->y + y_offset) / disp->zoom_factor; + state = event->state; + } + + if (m_select == NO_MS + || m_select == SINGLE_AREA_MS + || m_select == DRAG_MS + || m_select == ENABLE_POINT_MS + || m_select == DISABLE_POINT_MS) { +/* + * display particle displacements / velocities and its attributes, + * search index nearest to pointer + */ + if (disp->gpd.exist_piv && disp->display_piv) { + search_nearest_index(x, y, &index_y, &index_x, disp); + + if (display_act->gpd.exist_vor && display_act->display_vor) { + if (display_act->gpd.scaled_piv) { + create_msg_display_with_pivscdata(piv_data_scaled, + vor_data_scaled, + index_y, + index_x, + display_act->gpd.scaled_piv); + } else { + create_msg_display_with_pivscdata(piv_data, + vor_data, + index_y, + index_x, + display_act->gpd.scaled_piv); + } + } else { + if (display_act->gpd.scaled_piv) { + create_msg_display_with_pivdata(piv_data_scaled, + index_y, + index_x, + display_act->gpd.scaled_piv); + + } else { + create_msg_display_with_pivdata(piv_data, + index_y, + index_x, + display_act->gpd.scaled_piv); + } + } + + +/* + * highlight intreg + */ + + if (/* disp->intreg != NULL && */disp->display_intregs + && piv_data.ny == disp->intreg.data.ny + && piv_data.nx == disp->intreg.data.nx + && piv_data.point_y[0][0] == disp->intreg.data.point_y[0][0] + && piv_data.point_x[0][0] == disp->intreg.data.point_x[0][0] +/* index_y <= intreg.data.ny && index_x <= intreg.data.nx */ + ) { + + highlight_intreg(index_y, index_x, disp); + + +/* + * display correlation function + */ + if (piv_eval_par.print_cov == 1 + && display_act->gpd.exist_cov) { +/* memset(graybuf_int1, 215, */ +/* (sizeof(guchar)) * (MAX_INTERR_SIZE * */ +/* MAX_INTERR_SIZE)); */ +/* memset(graybuf_int2, 215, */ +/* (sizeof(guchar)) * (MAX_INTERR_SIZE * */ +/* MAX_INTERR_SIZE)); */ +/* memset(graybuf_cov, 215, */ +/* (sizeof(guchar)) * (MAX_INTERR_SIZE * */ +/* MAX_INTERR_SIZE)); */ + +/* display_vector(index_y, index_x, display_act->gpd.piv_data); */ + +/* display_img_intreg1(display_act->gpd. */ +/* intreg1[index_y][index_x], */ +/* piv_eval_par.int_size_2, */ +/* gpiv->piveval); */ +/* display_img_intreg2(display_act->gpd. */ +/* intreg2[index_y][index_x], */ +/* piv_eval_par.int_size_2, */ +/* gpiv->piveval); */ +/* display_img_cov(&display_act->gpd.cov[index_y][index_x], */ +/* piv_eval_par.int_size_2, */ +/* gpiv->piveval); */ + } + } + + +/* + * displaces interrogation area nearest to pointer + */ + if ( m_select == DRAG_MS ) { + if (index_x == index_x_old && index_y == index_y_old) { + gnome_canvas_item_set + (GNOME_CANVAS_ITEM(disp->intreg. + gci_intreg1[index_y][index_x]), + "x1", (double) x - piv_eval_par.int_size_1 / 2, + "y1", (double) y - piv_eval_par.int_size_1 / 2, + "x2", (double) x + piv_eval_par.int_size_1 / 2, + "y2", (double) y + piv_eval_par.int_size_1 / 2, + NULL); + + gnome_canvas_item_set + (GNOME_CANVAS_ITEM(disp->intreg. + gci_intreg2[index_y][index_x]), + "x1", (double) x - piv_eval_par.int_size_1 / + 2 + piv_eval_par.pre_shift_col, + "y1", (double) y - piv_eval_par.int_size_1 / + 2 + piv_eval_par.pre_shift_row, + "x2", (double) x + piv_eval_par.int_size_1 / + 2 + piv_eval_par.pre_shift_col, + "y2", (double) y + piv_eval_par.int_size_1 / + 2 + piv_eval_par.pre_shift_row, + NULL); +/* + * put the interrogation area back to its original location + */ + } else { + update_intreg1(index_y_old, index_x_old, disp); + update_intreg2(index_y_old, index_x_old, disp); + } + } + + +/* + * only display locations of interrogation area's + * search index neares to pointer + */ + } else if (/* disp->intreg != NULL */ + /* && */disp->display_intregs) { + + search_nearest_index(x, y, &index_y, &index_x, disp); + highlight_intreg(index_y, index_x, disp); + g_snprintf(msg_display, MAX_CHARS, "x=%3.2f y=%3.2f i=%d j=%d ", + disp->intreg.data.point_x[index_y][index_x], + disp->intreg.data.point_y[index_y][index_x], + index_y, index_x); + + + + } else { + g_snprintf(msg_display, MAX_CHARS, " "); + } + + + } else if (m_select == AOI_MS + || m_select == ENABLE_AREA_MS + || m_select == DISABLE_AREA_MS ) { + g_snprintf(msg_display, MAX_CHARS, "x=%d y=%d", x, y); + + + } else if ( m_select == SINGLE_POINT_MS) { +/* + * I am using the first interrogation area ([0][0]) temporarly for + * displaying + */ + if (disp->intreg.gci_intreg1[0][0] != NULL && + disp-> intreg.gci_intreg2[0][0] != NULL + ) { + if (!disp->display_intregs) { + gnome_canvas_item_show + (GNOME_CANVAS_ITEM(disp->intreg.gci_intreg1[0][0])); + gnome_canvas_item_show + (GNOME_CANVAS_ITEM(disp->intreg.gci_intreg2[0][0])); + disp->display_intregs = TRUE; + } + g_snprintf(msg_display, MAX_CHARS, "x=%d y=%d", x, y); + gnome_canvas_item_set + (GNOME_CANVAS_ITEM(disp->intreg.gci_intreg1[0][0]), + "x1", (double) x - piv_eval_par.int_size_1 / 2, + "y1", (double) y - piv_eval_par.int_size_1 / 2, + "x2", (double) x + piv_eval_par.int_size_1 / 2, + "y2", (double) y + piv_eval_par.int_size_1 / 2, + NULL); + + gnome_canvas_item_set + (GNOME_CANVAS_ITEM(disp->intreg.gci_intreg2[0][0]), + "x1", (double) x - piv_eval_par.int_size_1 / 2 + + piv_eval_par.pre_shift_col, + "y1", (double) y - piv_eval_par.int_size_1 / 2 + + piv_eval_par.pre_shift_row, + "x2", (double) x + piv_eval_par.int_size_1 / 2 + + piv_eval_par.pre_shift_col, + "y2", (double) y + piv_eval_par.int_size_1 / 2 + + piv_eval_par.pre_shift_row, + NULL); + + } else { + create_intreg1(0, 0, display_act); + create_intreg2(0, 0, display_act); + } + +/* } else { */ + +/* + * Putting back the first interrogation area to its orignal location + */ + +/* gnome_canvas_item_set (GNOME_CANVAS_ITEM(display_act->gpd.gci_intreg1[0][0]), */ +/* "x1", (double) display_act->gpd.intregs.point_x[0][0] - piv_eval_par.int_size_1 / 2, */ +/* "y1", (double) display_act->gpd.intregs.point_y[0][0] - piv_eval_par.int_size_1 / 2, */ +/* "x2", (double) display_act->gpd.intregs.point_x[0][0] + piv_eval_par.int_size_1 / 2, */ +/* "y2", (double) display_act->gpd.intregs.point_y[0][0] + piv_eval_par.int_size_1 / 2, */ +/* NULL); */ + +/* gnome_canvas_item_set (GNOME_CANVAS_ITEM(display_act->gpd.gci_intreg2[0][0]), */ +/* "x1", (double) display_act->gpd.intregs.point_x[0][0] - piv_eval_par.int_size_1 / 2 + piv_eval_par.pre_shift_col, */ +/* "y1", (double) display_act->gpd.intregs.point_y[0][0] - piv_eval_par.int_size_1 / 2 + piv_eval_par.pre_shift_row, */ +/* "x2", (double) display_act->gpd.intregs.point_x[0][0] + piv_eval_par.int_size_1 / 2 + piv_eval_par.pre_shift_col, */ +/* "y2", (double) display_act->gpd.intregs.point_y[0][0] + piv_eval_par.int_size_1 / 2 + piv_eval_par.pre_shift_row, */ +/* NULL); */ + +/* hide_all_intregs1(display_act); */ +/* hide_all_intregs2(display_act); */ +/* display_act->gpd.d_intregs = 0; */ +/* g_snprintf(msg_display, MAX_CHARS, "Inactive; outside aoi:: " */ +/* "x=%d y=%d", x, y); */ +/* } */ + + + + } else if (m_select == VLINE_MS) { + g_snprintf(msg_display, MAX_CHARS, "x=%d y=%d", x, y); + + if (state & GDK_BUTTON1_MASK && gci_line != NULL ) { + points->coords[0] = piv_eval_par.int_line_col; + points->coords[1] = piv_eval_par.int_line_row_start; + points->coords[2] = piv_eval_par.int_line_col; + points->coords[3] = y; + gnome_canvas_item_set(GNOME_CANVAS_ITEM(gci_line), + "points", points, + "fill_color", "yellow", + "width_units", (double) THICKNESS, + NULL); + } + + + } else if (m_select == HLINE_MS) { + g_snprintf(msg_display, MAX_CHARS, "x=%d y=%d", x, y); + + if (state & GDK_BUTTON1_MASK && gci_line != NULL ) { + points->coords[0] = piv_eval_par.int_line_col_start; + points->coords[1] = piv_eval_par.int_line_row; + points->coords[2] = x; + points->coords[3] = piv_eval_par.int_line_row; + gnome_canvas_item_set(GNOME_CANVAS_ITEM(gci_line), + "points", points, + "fill_color", "yellow", + "width_units", (double) THICKNESS, + NULL); + } + } + + + gnome_appbar_push(GNOME_APPBAR(disp->appbar), msg_display); + gnome_appbar_push(GNOME_APPBAR(gpiv->appbar), msg_display); + + if (state & GDK_BUTTON1_MASK) { + if ((m_select == AOI_MS + || m_select == ENABLE_AREA_MS + || m_select == DISABLE_AREA_MS) + && gci_aoi != NULL) { + gnome_canvas_item_set(GNOME_CANVAS_ITEM(gci_aoi), + "x2", (double) x, + "y2", (double) y, + NULL); + } + } + + + disp->index_x_old = index_x; + disp->index_y_old = index_y; + gnome_canvas_points_free(points); + + return TRUE; +} + + +gint +canvas_display_button_press(GtkWidget * widget, + GdkEventButton * event) +{ + Display * disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint x, y, i, j, x_min = 10e4, y_min = 10e4, dif; + gint index_x = 0, index_y = 0; +/* Intreg *intreg = disp->intreg; */ + GdkModifierType state; + GnomeCanvasPoints *points; + points = gnome_canvas_points_new(2); + + gdk_window_get_pointer(event->window, &x, &y, &state); + x = (x + x_offset)/ disp->zoom_factor; + y = (y + y_offset) / disp->zoom_factor; + + if (event->button == 1) { + if (m_select == NO_MS) { + + +/* + * select Area Of Interest + */ + } else if (m_select == AOI_MS) { +/* + * storige of original AOI + */ + disp->intreg.col_start_old = piv_eval_par.col_start; + disp->intreg.row_start_old = piv_eval_par.row_start; + + disp->xgrab_first = x; + disp->ygrab_first = y; + assert( gci_aoi == NULL); + gci_aoi = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(disp->canvas)), + gnome_canvas_rect_get_type(), + "x1", (double) x, + "y1", (double) y, + "x2", (double) x, + "y2", (double) y, + "outline_color", "yellow", + "width_units", (double) THICKNESS, + NULL); + +g_warning(" canvas_display_button_press:: destroy_all_intregs count=%d", + disp->count); + destroy_all_intregs(disp); +/* + * analyse at single interrogation area + */ + } else if ((m_select == SINGLE_AREA_MS || m_select == DRAG_MS) && + display_act->img.exist_img) { + if (disp->intreg.exist && display_act->gpd.exist_piv) { +/* + * search index nearest to pointer + */ + for (i = 0; i < disp->intreg.data.ny; i++) { + for (j = 0; j < disp->intreg.data.nx; j++) { + dif = abs(y - (int) disp->intreg.data.point_y[i][j]); + if (dif < y_min) { + y_min = dif; + index_y = i; + } + dif = abs(x - (int) disp->intreg.data.point_x[i][j]); + if (dif < x_min) { + x_min = dif; + index_x = j; + } + } + } + m_select_index_x = index_x; + m_select_index_y = index_y; + + if (m_select == DRAG_MS) { + display_act->gpd.piv_data.point_x[m_select_index_y][m_select_index_x] = (float) x; + display_act->gpd.piv_data.point_y[m_select_index_y][m_select_index_x] = (float) y; + disp->intreg.data.point_x[m_select_index_y][m_select_index_x] = (float) x; + disp->intreg.data.point_y[m_select_index_y][m_select_index_x] = (float) y; + } + +/* g_warning("\nCANVAS_DISPLAY_BUTTON_PRESS::interr analysis at x=%3.2f y=%3.2f i=%d j=%d", */ +/* intregs.point_x[m_select_index_y][m_select_index_x], */ +/* intregs.point_y[m_select_index_y][m_select_index_x], */ +/* m_select_index_y, */ +/* m_select_index_x); */ + interrogate(&display_act->gpd.piv_data, display_act->img.img1, + display_act->img.img2, gpiv); + if (display_act->gpd.gci_vector[m_select_index_y][m_select_index_x] != NULL) { + update_vector(m_select_index_y, m_select_index_x, &display_act->gpd); +/* fprintf(stderr,"CANVAS_DISPLAY_BUTTON_PRESS:: gci_vector != NULL\n"); */ + } else { +/* fprintf(stderr,"PRESS:: gci_vector == NULL\n"); */ + display_vector(m_select_index_y, m_select_index_x, + &display_act->gpd); + } + display_act->gpd.exist_piv = TRUE; + disp->display_piv = TRUE; + if (m_select == DRAG_MS) { + if (disp->intreg. + gci_intreg1[m_select_index_y][m_select_index_x] + != NULL) + update_intreg1 + (m_select_index_y, m_select_index_x, + disp); + if (disp->intreg. + gci_intreg2[m_select_index_y][m_select_index_x] + != NULL) + update_intreg2(m_select_index_y, m_select_index_x, + disp); + } + + } else { + msg_error = "Interrogation area's and piv data must already exist!"; + gtk_warning(msg_error); + } + +/* + * Reset mouse selection to inactive + */ +/* if (m_select == DRAG_MS) */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (radiobutton_piv_mouse_1), */ +/* TRUE); */ + +/* -------------------------------------------------------------------- + analyse at single point */ + } else if (m_select == SINGLE_POINT_MS + && display_act->img.exist_img +/* && */ +/* x >= piv_eval_par.col_start + piv_eval_par.int_size_2 / 2 && */ +/* x <= piv_eval_par.col_end - piv_eval_par.int_size_2 / 2 && */ +/* y >= piv_eval_par.row_start + piv_eval_par.int_size_2 / 2 && */ +/* y <= piv_eval_par.row_end - piv_eval_par.int_size_2 / 2 && */ + +/* x >= piv_eval_par.col_start + piv_eval_par.int_size_2 / 2 - piv_eval_par.pre_shift_col && */ +/* x <= piv_eval_par.col_end - piv_eval_par.int_size_2 / 2 - piv_eval_par.pre_shift_col && */ +/* y >= piv_eval_par.row_start + piv_eval_par.int_size_2 / 2 - piv_eval_par.pre_shift_row && */ +/* y <= piv_eval_par.row_end - piv_eval_par.int_size_2 / 2 - piv_eval_par.pre_shift_row */ + ) { + + if (display_act->gpd.exist_piv) { + destroy_all_vectors(&display_act->gpd); + display_act->gpd.exist_piv = FALSE; + disp->display_piv = FALSE; + } + + destroy_all_intregs(disp); + + m_select_index_x = 0; + m_select_index_y = 0; + piv_eval_par.int_point_col = x; + piv_eval_par.int_point_row = y; + interrogate(&display_act->gpd.piv_data, display_act->img.img1, display_act->img.img2, + gpiv); + + display_all_vectors(&display_act->gpd); + display_act->gpd.exist_piv = TRUE; + disp->display_piv = TRUE; + +/* disp->intreg.data.nx = display_act->gpd.piv_data.nx; */ +/* disp->intreg.data.ny = display_act->gpd.piv_data.ny; */ +/* disp->intreg.data.point_x[0][0] = display_act->gpd.piv_data.point_x[0][0]; */ +/* disp->intreg.data.point_y[0][0] = display_act->gpd.piv_data.point_y[0][0]; */ +/* + * NOT TESTED + */ + disp->intreg.data.nx = 1; + disp->intreg.data.ny = 1; + disp->intreg.data.point_x[0][0] = display_act->gpd.piv_data.point_x[0][0]; + disp->intreg.data.point_y[0][0] = display_act->gpd.piv_data.point_y[0][0]; + disp->intreg.exist = 1; + gnome_canvas_update_now(GNOME_CANVAS(disp->canvas)); + + + } else if (m_select == VLINE_MS && display_act->img.exist_img) { + piv_eval_par.int_line_col = x; + piv_eval_par.int_line_row_start = y; + + points->coords[0] = piv_eval_par.int_line_col; + points->coords[1] = piv_eval_par.int_line_row_start; + points->coords[2] = piv_eval_par.int_line_col; + points->coords[3] = piv_eval_par.int_line_row_start; + if (gci_line != NULL) + gtk_object_destroy(GTK_OBJECT(gci_line)); + gci_line = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(disp->canvas) + ), + gnome_canvas_line_get_type(), + "points", points, + "fill_color", "yellow", + "width_units", (double) THICKNESS, + NULL); + + + + } else if (m_select == HLINE_MS && display_act->img.exist_img) { + piv_eval_par.int_line_col = x; + piv_eval_par.int_line_row_start = y; + + points->coords[0] = piv_eval_par.int_line_col_start; + points->coords[1] = piv_eval_par.int_line_row; + points->coords[2] = piv_eval_par.int_line_col_start; + points->coords[3] = piv_eval_par.int_line_row; + if (gci_line != NULL) + gtk_object_destroy(GTK_OBJECT(gci_line)); + gci_line = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(disp->canvas) + ), + gnome_canvas_line_get_type(), + "points", points, + "fill_color", "yellow", + "width_units", (double) THICKNESS, + NULL); + + + + } else if ( m_select == ENABLE_POINT_MS ) { +/* -------------------------------------------------------------------- + Only active with piv data */ + if (display_act->gpd.exist_piv && disp->display_piv && + disp->intreg.exist && disp->display_intregs) { +/* -------------------------------------------------------------------- + search index nearest to pointer */ + for (i = 0; i < display_act->gpd.piv_data.ny; i++) { + for (j = 0; j < display_act->gpd.piv_data.nx; j++) { + dif = abs(y - (int) display_act->gpd.piv_data.point_y[i][j]); + if (dif < y_min) { + y_min = dif; + index_y = i; + } + dif = abs(x - (int) display_act->gpd.piv_data.point_x[i][j]); + if (dif < x_min) { + x_min = dif; + index_x = j; + } + } + } + display_act->gpd.piv_data.peak_no[index_y][index_x] = 1; + update_vector(index_y, index_x, &display_act->gpd); + } + + +/* + * Enabling and disabling only active with piv data + */ + } else if (display_act->gpd.exist_piv && disp->display_piv) { + if ( m_select == DISABLE_POINT_MS ) { + +/* -------------------------------------------------------------------- + search index nearest to pointer */ + for (i = 0; i < display_act->gpd.piv_data.ny; i++) { + for (j = 0; j < display_act->gpd.piv_data.nx; j++) { + dif = abs(y - (int) display_act->gpd.piv_data.point_y[i][j]); + if (dif < y_min) { + y_min = dif; + index_y = i; + } + dif = abs(x - (int) display_act->gpd.piv_data.point_x[i][j]); + if (dif < x_min) { + x_min = dif; + index_x = j; + } + } + } + display_act->gpd.piv_data.peak_no[index_y][index_x] = -1; + update_vector(index_y, index_x, &display_act->gpd); + + + } else if ( m_select == ENABLE_AREA_MS ) { + enable_col_start = x; + enable_row_start = y; + assert( gci_aoi == NULL); + gci_aoi = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(disp->canvas) + ), + gnome_canvas_rect_get_type(), + "x1", (double) x, + "y1", (double) y, + "x2", (double) x, + "y2", (double) y, + "outline_color", "yellow", + "width_units", (double) THICKNESS, + NULL); + + + } else if ( m_select == DISABLE_AREA_MS) { + enable_col_start = x; + enable_row_start = y; + assert( gci_aoi == NULL); + gci_aoi = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(disp->canvas) + ), + gnome_canvas_rect_get_type(), + "x1", (double) x, + "y1", (double) y, + "x2", (double) x, + "y2", (double) y, + "outline_color", "yellow", + "width_units", (double) THICKNESS, + NULL); + } else { + g_warning("should not arrive here"); + } + } else { + msg_error = _("no image or piv data"); + gtk_warning(msg_error); + } + } + + +/* if (event->button == 2) */ +/* printf("CANVAS_DISPLAY_BUTTON_PRESS2:: button=%d\n", event->button); */ +/* if (event->button == 3) */ +/* printf("CANVAS_DISPLAY_BUTTON_PRESS3:: button=%d\n", event->button); */ + + gnome_canvas_points_free(points); + return TRUE; +} + + +gint +canvas_display_button_release(GtkWidget * widget, GdkEventButton * event) +{ + Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + GtkWidget * view_menu_display4 = + gtk_object_get_data(GTK_OBJECT(disp->mwin), + "view_menu_display4"); + gint x, y, i, j; + GdkModifierType state; +/* Intreg *intreg = disp->intreg; */ + + gdk_window_get_pointer(event->window, &x, &y, &state); + x = (x + x_offset)/ disp->zoom_factor; + y = (y + y_offset) / disp->zoom_factor; + + if (event->button == 1) { +/* printf("CANVAS_DISPLAY_BUTTON_RELEASE:: button=%d\n", */ +/* event->button); */ + + + if (m_select == AOI_MS && gci_aoi != NULL) { + if (display_act->gpd.exist_piv) { +/* free_pivdata(&display_act->gpd.piv_data); */ +/* destroy_all_vectors(&display_act->gpd); */ + } + + if (x >= disp->xgrab_first) { + piv_eval_par.col_start = disp->xgrab_first; + piv_eval_par.col_end = x; + } else { + piv_eval_par.col_end = disp->xgrab_first; + piv_eval_par.col_start = x; + } + + if (y >= disp->ygrab_first) { + piv_eval_par.row_start = disp->ygrab_first; + piv_eval_par.row_end = y; + } else { + piv_eval_par.row_end = disp->ygrab_first; + piv_eval_par.row_start = y; + + } + + create_all_intregs(disp); + if (GTK_CHECK_MENU_ITEM(view_menu_display4)->active) { + show_all_intregs(disp); + disp->display_intregs = TRUE; + } else { + hide_all_intregs(disp); + disp->display_intregs = FALSE; + } + + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (gpiv->piveval->spinbutton_colstart), + piv_eval_par.col_start); + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (gpiv->piveval->spinbutton_rowstart), + piv_eval_par.row_start); + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (gpiv->piveval->spinbutton_colend), + piv_eval_par.col_end); + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (gpiv->piveval->spinbutton_rowend), + piv_eval_par.row_end); + gtk_object_destroy(GTK_OBJECT(gci_aoi)); + + gci_aoi = NULL; + + + + } else if (m_select == ENABLE_AREA_MS && gci_aoi != NULL) { + enable_col_end = x; + enable_row_end = y; + if (display_act->gpd.exist_piv) { + for (i = 0; i < display_act->gpd.piv_data.ny; i++) { + for (j = 0; j < display_act->gpd.piv_data.nx; j++) { + if (display_act->gpd.piv_data.point_x[i][j] >= + enable_col_start + && display_act->gpd.piv_data.point_x[i][j] < + enable_col_end + && display_act->gpd.piv_data.point_y[i][j] >= + enable_row_start + && display_act->gpd.piv_data.point_y[i][j] < + enable_row_end) { + display_act->gpd.piv_data.peak_no[i][j] = 1; + if (disp->display_piv) + update_vector(i, j, &display_act->gpd); + + } + } + } + } + gtk_object_destroy(GTK_OBJECT(gci_aoi)); + gci_aoi = NULL; + + + } else if (m_select == DISABLE_AREA_MS && gci_aoi != NULL) { + enable_col_end = x; + enable_row_end = y; + if (display_act->gpd.exist_piv) { + for (i = 0; i < display_act->gpd.piv_data.ny; i++) { + for (j = 0; j < display_act->gpd.piv_data.nx; j++) { + if (display_act->gpd.piv_data.point_x[i][j] >= + enable_col_start + && display_act->gpd.piv_data.point_x[i][j] < + enable_col_end + && display_act->gpd.piv_data.point_y[i][j] >= + enable_row_start + && display_act->gpd.piv_data.point_y[i][j] < + enable_row_end) { + display_act->gpd.piv_data.peak_no[i][j] = -1; + if (disp->display_piv) + update_vector(i, j, &display_act->gpd); + + } + } + } + } + gtk_object_destroy(GTK_OBJECT(gci_aoi)); + gci_aoi = NULL; + + + } else if ((m_select == VLINE_MS || m_select == HLINE_MS) + && display_act->img.exist_img) { + if (display_act->gpd.exist_piv) { + destroy_all_vectors(&display_act->gpd); + display_act->gpd.exist_piv = FALSE; + disp->display_piv = FALSE; + } + + if (disp->intreg.exist) { + destroy_all_intregs(disp); +/* destroy_all_intregs1(display_act); */ +/* destroy_all_intregs2(display_act); */ +/* intreg.exist = 0; */ + } + + m_select_index_x = 0; + m_select_index_y = 0; + + if (m_select == VLINE_MS) { + piv_eval_par.int_line_row_end = y; + piv_eval_par.int_geo = LINE_C; + } else { + piv_eval_par.int_line_col_end = x; + piv_eval_par.int_geo = LINE_R; + } + + if (gci_line != NULL) { + gtk_object_destroy(GTK_OBJECT(gci_line)); + gci_line = NULL; + } + + +/* interrogate(&display_act->gpd.piv_data, display_act->img.img1, display_act->img.img2); */ + } + + + } + + return TRUE; +} + + +gint canvas_display_leave_notify(GtkWidget * widget, + GdkEventMotion * event) +{ +/* gint x, y; */ +/* GdkModifierType state; */ + Display * disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint index_x_old = disp->index_x_old; + gint index_y_old = disp->index_y_old; + GtkWidget * view_menu_display4 = + gtk_object_get_data(GTK_OBJECT(disp->mwin), + "view_menu_display4"); +/* Intreg *intreg = disp->intreg; */ + + gnome_appbar_push(GNOME_APPBAR(disp->appbar), + disp->msg_display_default); + gnome_appbar_push(GNOME_APPBAR(gpiv->appbar), msg_default); + + + if (m_select == SINGLE_POINT_MS && disp->intreg.exist +/* && !disp->display_intregs */ + ) { + gnome_canvas_item_set (GNOME_CANVAS_ITEM(disp->intreg.gci_intreg1[0][0]), + "x1", (double) disp->intreg.data.point_x[0][0] + - piv_eval_par.int_size_1 / 2, + "y1", (double) disp->intreg.data.point_y[0][0] + - piv_eval_par.int_size_1 / 2, + "x2", (double) disp->intreg.data.point_x[0][0] + + piv_eval_par.int_size_1 / 2, + "y2", (double) disp->intreg.data.point_y[0][0] + + piv_eval_par.int_size_1 / 2, + NULL); + + gnome_canvas_item_set (GNOME_CANVAS_ITEM(disp->intreg.gci_intreg2[0][0]), + "x1", (double) disp->intreg.data.point_x[0][0] + - piv_eval_par.int_size_1 / 2 + + piv_eval_par.pre_shift_col, + "y1", (double) disp->intreg.data.point_y[0][0] + - piv_eval_par.int_size_1 / 2 + + piv_eval_par.pre_shift_row, + "x2", (double) disp->intreg.data.point_x[0][0] + + piv_eval_par.int_size_1 / 2 + + piv_eval_par.pre_shift_col, + "y2", (double) disp->intreg.data.point_y[0][0] + + piv_eval_par.int_size_1 / 2 + + piv_eval_par.pre_shift_row, + NULL); + + if (!disp->display_intregs) { + show_all_intregs(disp); + disp->display_intregs = TRUE; + } + } + + if (m_select == AOI_MS + || m_select == SINGLE_POINT_MS + || m_select == VLINE_MS + || m_select == HLINE_MS) { + if (!disp->display_intregs + && GTK_CHECK_MENU_ITEM(view_menu_display4)->active) { + show_all_intregs(disp); + disp->display_intregs = TRUE; + } + + if (display_act->gpd.exist_piv && !disp->display_piv) { + show_all_vectors(&display_act->gpd); + disp->display_piv = TRUE; + } + + if (gci_line != NULL) { + gtk_object_destroy(GTK_OBJECT(gci_line)); + gci_line = NULL; + } + + } + + + + if (GDK_BUTTON1_MASK) { +/* + * Cancel AOI_MS selection + */ + if (m_select == AOI_MS) { + if (gci_aoi != NULL) { + piv_eval_par.col_start = disp->intreg.col_start_old; + piv_eval_par.row_start = disp->intreg.row_start_old; + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (gpiv->piveval->spinbutton_colstart), + piv_eval_par.col_start); + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (gpiv->piveval->spinbutton_rowstart), + piv_eval_par.row_start); + gtk_object_destroy(GTK_OBJECT(gci_aoi)); + gci_aoi = NULL; + } + +/* show_all_intregs(disp); */ + + } else if ( m_select == ENABLE_AREA_MS + || m_select == DISABLE_AREA_MS) { + enable_col_start = 0; + enable_row_start = 0; + enable_col_end = 0; + enable_row_end = 0; + if (gci_aoi != NULL) { + gtk_object_destroy(GTK_OBJECT(gci_aoi)); + gci_aoi = NULL; + } +/* + * Cancel VLINE_MS selection or LINE_MS selection + */ + } else if (m_select == VLINE_MS || m_select == HLINE_MS) { + if (gci_line != NULL) { + gtk_object_destroy(GTK_OBJECT(gci_line)); + gci_line = NULL; + } +/* + * TODO +*/ + } + } + + + + if (cursor != NULL) { + gdk_cursor_destroy(cursor); + cursor = NULL; + } + + + if (disp->intreg.gci_intreg2[index_y_old][index_x_old] != NULL) + gnome_canvas_item_set(disp->intreg. + gci_intreg2[index_y_old][index_x_old], + "outline_color", + "yellow", NULL); + if (disp->intreg.gci_intreg1[index_y_old][index_x_old] != NULL) + gnome_canvas_item_set(disp->intreg. + gci_intreg1[index_y_old][index_x_old], + "outline_color", + "blue", NULL); + disp->index_x_old = 0; + disp->index_y_old = 0; + + return TRUE; +} + + + +void view_toggle_rulers(GtkWidget * widget, gpointer data) +{ +/* DDisplay *ddisp; */ + +/* ddisp = ddisplay_active(); */ + + /* The following is borrowed straight from the Gimp: */ + + /* This routine use promiscuous knowledge of gtk internals + * in order to hide and show the rulers "smoothly". This + * is kludgy and a hack and may break if gtk is changed + * internally. + */ +/* if (!GTK_CHECK_MENU_ITEM(widget)->active) { */ +/* if (GTK_WIDGET_VISIBLE (ddisp->origin)) { */ +/* gtk_widget_unmap (ddisp->origin); */ +/* gtk_widget_unmap (ddisp->hrule); */ +/* gtk_widget_unmap (ddisp->vrule); */ + +/* GTK_WIDGET_UNSET_FLAGS (ddisp->origin, GTK_VISIBLE); */ +/* GTK_WIDGET_UNSET_FLAGS (ddisp->hrule, GTK_VISIBLE); */ +/* GTK_WIDGET_UNSET_FLAGS (ddisp->vrule, GTK_VISIBLE); */ + +/* gtk_widget_queue_resize (GTK_WIDGET (ddisp->origin->parent)); */ +/* } */ +/* } else { */ +/* if (!GTK_WIDGET_VISIBLE (ddisp->origin)) { */ +/* GTK_WIDGET_SET_FLAGS (ddisp->origin, GTK_VISIBLE); */ +/* GTK_WIDGET_SET_FLAGS (ddisp->hrule, GTK_VISIBLE); */ +/* GTK_WIDGET_SET_FLAGS (ddisp->vrule, GTK_VISIBLE); */ + +/* gtk_widget_map (ddisp->origin); */ +/* gtk_widget_map (ddisp->hrule); */ +/* gtk_widget_map (ddisp->vrule); */ + +/* gtk_widget_queue_resize (GTK_WIDGET (ddisp->origin->parent)); */ +/* } */ +/* } */ +} + + +void view_toggle_stretch_display(GtkWidget * widget, gpointer data) +{ + Display * disp = display_act; + gint screen_width = 0, screen_height = 0; + gint new_width = 0, new_height = 0; + + screen_width = gdk_screen_width(); + screen_height = gdk_screen_height(); + new_width = (gint) (disp->zoom_factor * gpiv_par.img_width + VIEW_HMARGE); + new_height = (gint) (disp->zoom_factor * gpiv_par.img_height + VIEW_VMARGE); + +/* if (GTK_CHECK_MENU_ITEM(widget)->active) { */ +/* gpiv_par.stretch_window = TRUE; */ + if (new_width < screen_width && new_height < screen_height) { + gnome_win_hints_set_state(disp->mwin, 0); + gdk_window_resize(disp->mwin->window, + new_width, new_height); + } else if (new_width > screen_width && new_height < screen_height) { + gnome_win_hints_set_state(disp->mwin, + WIN_STATE_MAXIMIZED_HORIZ); + } else if (new_width < screen_width && new_height > screen_height) { + gnome_win_hints_set_state(disp->mwin, + WIN_STATE_MAXIMIZED_VERT); + } else if (new_width > screen_width && new_height > screen_height) { + gnome_win_hints_set_state(disp->mwin, + WIN_STATE_MAXIMIZED_HORIZ + + WIN_STATE_MAXIMIZED_VERT); + } +/* } else { */ +/* gpiv_par.stretch_window = FALSE; */ +/* } */ + +} + +void view_toggle_img1(GtkWidget * widget, gpointer data) +{ + if (display_act->img.exist_img) { + if (GTK_CHECK_MENU_ITEM(widget)->active) { + display_act->display_img1 = TRUE; + show_display_img1(display_act); + } else { + display_act->display_img1 = FALSE; + hide_display_img1(display_act); + } + } + +} + +void view_toggle_img2(GtkWidget * widget, gpointer data) +{ + if (display_act->img.exist_img) { + if (GTK_CHECK_MENU_ITEM(widget)->active) { + display_act->display_img2 = TRUE; + show_display_img2(display_act); + } else { + display_act->display_img2 = FALSE; + hide_display_img2(display_act); + } + } + +} + +void view_toggle_intregs(GtkWidget * widget, gpointer data) +{ + if (GTK_CHECK_MENU_ITEM(widget)->active) { + show_all_intregs(display_act); +/* if (display_act->intreg.exist != 1) */ +/* create_all_intregs(display_act); */ + display_act->display_intregs = TRUE; + } else { + hide_all_intregs(display_act); + display_act->display_intregs = FALSE; + } +} + + +void view_toggle_piv(GtkWidget * widget, gpointer data) +{ + if (display_act->gpd.exist_piv) { + if (GTK_CHECK_MENU_ITEM(widget)->active) { + display_act->display_piv = TRUE; + show_all_vectors(&display_act->gpd); + } else { + display_act->display_piv = FALSE; + hide_all_vectors(&display_act->gpd); + } + } +} + + +void view_toggle_vor(GtkWidget * widget, gpointer data) +{ + if (display_act->gpd.exist_vor) { + if (GTK_CHECK_MENU_ITEM(widget)->active) { + display_act->display_vor = TRUE; + show_all_scalars(&display_act->gpd.vor_data, VORTICITY); + } else { + display_act->display_vor = FALSE; + hide_all_scalars(&display_act->gpd.vor_data, VORTICITY); + } + } +} + + +void +view_toggle_sstrain(GtkWidget *widget, gpointer data) +{ + if (display_act->gpd.exist_sstrain) { + if (GTK_CHECK_MENU_ITEM(widget)->active) { + display_act->display_sstrain = TRUE; + show_all_scalars(&display_act->gpd.sstrain_data, S_STRAIN); + } else { + display_act->display_sstrain = FALSE; + hide_all_scalars(&display_act->gpd.sstrain_data, S_STRAIN); + } + } +} + + +void +view_toggle_nstrain(GtkWidget *widget, gpointer data) +{ + if (display_act->gpd.exist_nstrain) { + if (GTK_CHECK_MENU_ITEM(widget)->active) { + display_act->display_nstrain = TRUE; + show_all_scalars(&display_act->gpd.nstrain_data, N_STRAIN); + } else { + display_act->display_nstrain = FALSE; + hide_all_scalars(&display_act->gpd.nstrain_data, N_STRAIN); + } + } +} + + +void select_vectorscale(gpointer data, guint action, GtkWidget * widget) +/*--------------------- Setting vectr_scale from display pop-up menu */ +{ + /* if (display () == NULL) return; */ + gpiv_par.vector_scale = action; + update_all_vectors(&display_act->gpd); +} + + +void +nav_popup_click_handler(GtkWidget * widget, GdkEventButton * event, + gpointer data) +{ + /* Seee gimp: nav_window.c */ +} + + + +void on_view_options_clicked(GtkButton * button, gpointer user_data) +{ + +} + + + +/* + * img_display callbacks + */ +gboolean +on_darea_img_expose(GtkWidget * widget, + GdkEventExpose * event, gpointer user_data) +{ + gdk_draw_gray_image(widget->window, + widget->style->fg_gc[GTK_STATE_NORMAL], + 0, + 0, + /* 4-byte aligned width */ display_act->img.rgb_img_width, + gpiv_par.img_height, + GDK_RGB_DITHER_MAX, + display_act->img.graybuf_img, + /* WIDTH */ display_act->img.rgb_img_width); + + return TRUE; +} + + +/* + * Other image function + */ + +void +display_img(Display * disp) +/* --------------------------------- Displays image for a drawing area +TODO: for Gnome canvas*/ +{ + ImagePar image_par = disp->img.image_par; + char display_name[MAX_CHARS]; + guchar *pos; + gint i, j; + + +/* GdkPixbuf *pixbuf; */ +/* gint depth = 8; */ + + +/* + * image in gnome canvas + */ + +/* pixbuf = gdk_pixbuf_new_from_data(rgbbuf, */ +/* GDK_COLORSPACE_RGB, */ +/* FALSE, */ +/* depth, */ +/* gpiv_par.img_width, */ +/* gpiv_par.img_height, */ +/* 768, */ +/* NULL, NULL); */ + +/* gci_img1 = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS(canvas)), */ +/* gnome_canvas_pixbuf_get_type (), */ +/* "pixbuf", pixbuf, */ +/* "x", 0, */ +/* "y", 0, */ +/* "anchor", GTK_ANCHOR_NORTH_WEST, */ +/* "width", (double)gpiv_par.img_width, */ +/* "height", (double)gpiv_par.img_height, */ +/* NULL); */ + + +/* + * image in gdk_drawing_area + */ + g_snprintf(display_name, MAX_CHARS, "A %s", disp->fname_base); + disp->img.img_display1 = create_img_display(display_name, image_par); + gtk_widget_show_all(disp->img.img_display1); + + + +/* + * row stride; each row is a 4-byte buffer array + */ + disp->img.rgb_img_width = gpiv_par.img_width; + while ((disp->img.rgb_img_width) % 4 != 0) { + disp->img.rgb_img_width++; + } + g_warning("display_img:: added: %d", disp->img.rgb_img_width - gpiv_par.img_width); + disp->img.graybuf_img = g_malloc(disp->img.rgb_img_width * gpiv_par.img_height); + pos = disp->img.graybuf_img; + + for (i = 0; i < gpiv_par.img_height; i++) { + for (j = 0; j < gpiv_par.img_width; j++) { + *pos++ = disp->img.img1[i][j]; + } + } + + +#ifdef DEBUG + g_warning("display_img ::gpiv_par.display_img1 = %d", gpiv_par.display_img1); +#endif + + if(gpiv_par.display_img1) { + show_display_img1(disp); + } else { + hide_display_img1(disp); + } + + +/* g_free(graybuf_img); */ + +/* gdk_pixbuf_unref (pixbuf); */ +} + +void +hide_display_img1(Display * disp) +{ +/* assert (disp->img.img_display1 != NULL); */ + gtk_widget_hide(disp->img.img_display1); +} + + +void +show_display_img1(Display * disp) +{ + assert (disp->img.img_display1 != NULL); + gtk_widget_show(disp->img.img_display1); +} + + +void +hide_display_img2(Display * disp) +{ + assert (disp->img.img_display2 != NULL); + gtk_widget_hide(disp->img.img_display2); +} + + +void +show_display_img2(Display * disp) +{ + assert (disp->img.img_display1 != NULL); + gtk_widget_show(disp->img.img_display2); +} + + +/* + * Other display functions than callbacks + */ + +void +display_background(Display *disp) +/* --------------------------------------------- Displays backgroundcolor */ +{ + disp->gci_bg = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(disp->canvas)), + gnome_canvas_rect_get_type(), + "x1", (double) 0, + "y1", (double) 0, + "x2", (double) gpiv_par.img_width, + "y2", (double) gpiv_par.img_height, + "fill_color", "darkblue", + "width_units", 1.0, + NULL); +} + + + +void +destroy_background(Display *disp) +{ + assert (disp->gci_bg != NULL); + gtk_object_destroy(GTK_OBJECT + (disp->gci_bg)); + disp->gci_bg = NULL; +} + + + +void +create_all_intregs(Display * disp) +/* ----------------------------------- Creates all interrogation areas */ +{ + if (disp != NULL) { + if (disp->intreg.exist != 1) { + create_intreg_data(disp); + } + create_all_intregs2(disp); + create_all_intregs1(disp); + disp->intreg.exist = TRUE; + disp->display_intregs = TRUE; + + disp->intreg.row_start_old = 0; + disp->intreg.row_start = piv_eval_par.row_start; + disp->intreg.row_end = piv_eval_par.row_end; + disp->intreg.col_start_old = 0; + disp->intreg.col_start = piv_eval_par.col_start; + disp->intreg.col_end = piv_eval_par.col_end; + disp->intreg.int_size_1 = piv_eval_par.int_size_1; + disp->intreg.int_size_2 = piv_eval_par.int_size_2; + disp->intreg.int_shift = piv_eval_par.int_shift; + disp->intreg.pre_shift_row = piv_eval_par.pre_shift_row; + disp->intreg.pre_shift_col = piv_eval_par.pre_shift_col; + } +} + + +void +destroy_all_intregs(Display * disp) +/* ----------------------------------- Destroys all interrogation areas */ +{ + if (disp != NULL) { + hide_all_intregs1(disp); + destroy_all_intregs1(disp); + hide_all_intregs2(disp); + destroy_all_intregs2(disp); + destroy_intreg_data(disp); + disp->display_intregs = FALSE; + } + } + + +void +show_all_intregs(Display * disp) +/* ----------------------------------- Shows all interrogation areas */ +{ + assert (disp != NULL); + + if (disp->intreg.exist == 0) { + create_all_intregs(disp); + } + show_all_intregs2(disp); + show_all_intregs1(disp); +/* disp->display_intregs = TRUE; */ +/* } */ +} + + +void +hide_all_intregs(Display * disp) +/* ----------------------------------- Hides all interrogation areas */ +{ + assert (disp != NULL); +/* assert (disp->intreg != NULL); */ +/* assert (disp->intreg.data != NULL); */ + + hide_all_intregs2(disp); + hide_all_intregs1(disp); +/* disp->display_intregs = FALSE; */ +} + + +void +create_intreg_data(Display * disp) +{ + PivData data; + data.point_x = NULL; + data.point_y = NULL; + data.dx = NULL; + data.dy = NULL; + data.snr = NULL; + data.peak_no = NULL; + + gpiv_piv_count_pivdata_fromimage(&data, image_par, + piv_eval_par); + gpiv_alloc_pivdata(&data); + gpiv_piv_select_int_point(&data, image_par, piv_eval_par); + disp->intreg.data = data; + disp->intreg.exist = 1; +} + + +void +destroy_intreg_data(Display * disp) +{ + if ( disp->intreg.gci_intreg1[0][0] == NULL + && disp->intreg.gci_intreg1[0][0] == NULL) { + gpiv_free_pivdata(&disp->intreg.data); +/* disp->intreg.data = NULL; */ + disp->intreg.exist = 0; +/* disp->intreg = NULL; */ + } +} + + +void +create_all_intregs1(Display * disp) +/* ------------------------- Displays all first interrogation areas */ +{ + int i = 0, j; + gint nx = 0; + gint ny = 0; + + assert (disp != NULL); + if (disp->intreg.exist != 1) + create_intreg_data(disp); + + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + for (i = 0; i < ny; i++) { + for (j = 0; j < nx ; j++) { + create_intreg1(i, j, disp); + } + } + +} + + +void create_intreg1(gint i, + gint j, + Display * disp) +/* ------------------------------------ Displays first interrogation area */ +{ + int start_x = 0, start_y = 0, end_x = 0, end_y = 0; + float x, y; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + + x = disp->intreg.data.point_x[i][j]; + y = disp->intreg.data.point_y[i][j]; + + +/* ------------------------------ Using centre points of interr regs */ + start_x = (int) x - piv_eval_par.int_size_1 / 2; + start_y = (int) y - piv_eval_par.int_size_1 / 2; + end_x = (int) x + piv_eval_par.int_size_1 / 2; + end_y = (int) y + piv_eval_par.int_size_1 / 2; + + disp->intreg.gci_intreg1[i][j] = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS + (disp->canvas)), + gnome_canvas_rect_get_type(), + "x1", (double) start_x, + "y1", (double) start_y, + "x2", (double) end_x, + "y2", (double) end_y, + "outline_color", "blue", + "width_units", (double) THICKNESS, + NULL); +} + + + +void +update_intreg1(gint i, + gint j, + Display * disp) +/* ------------------------------------ Updates first interrogation area */ +{ + int start_x = 0, start_y = 0, end_x = 0, end_y = 0; + float x, y; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + assert (disp->intreg.gci_intreg1[i][j] != NULL); + + x = disp->intreg.data.point_x[i][j]; + y = disp->intreg.data.point_y[i][j]; + +/* ------------------------------ Using centre points of interr regs */ + start_x = (int) x - piv_eval_par.int_size_1 / 2; + start_y = (int) y - piv_eval_par.int_size_1 / 2; + end_x = (int) x + piv_eval_par.int_size_1 / 2; + end_y = (int) y + piv_eval_par.int_size_1 / 2; + + gnome_canvas_item_set(GNOME_CANVAS_ITEM + (disp->intreg.gci_intreg1[i][j]), + "x1", (double) start_x, + "y1", (double) start_y, + "x2", (double) end_x, + "y2", (double) end_y, + "outline_color", "blue", + "width_units", (double) THICKNESS, + NULL); +} + + +void +show_all_intregs1(Display * disp) +/* ----------------------------------- Shows 1st interrogation areas */ +{ + int i = 0, j = 0; + gint nx = 0, ny = 0; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + assert (disp->intreg.gci_intreg1[i][j] != NULL); + gnome_canvas_item_show(GNOME_CANVAS_ITEM + (disp->intreg.gci_intreg1[i][j])); + } + } + +} + + + +void +hide_all_intregs1(Display * disp) +/* ----------------------------------- Hides 1st interrogation areas */ +{ + int i = 0, j = 0; + gint nx = 0, ny = 0; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + assert (disp->intreg.gci_intreg1[i][j] != NULL); + gnome_canvas_item_hide(GNOME_CANVAS_ITEM + (disp->intreg.gci_intreg1[i][j])); + } + } +} + + +void +destroy_all_intregs1(Display * disp) +/* ------------------------------- Destroys 1st interrogation areas */ +{ + int i = 0, j = 0; + int nx = 0, ny = 0; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + assert (disp->intreg.gci_intreg1[i][j] != NULL); + gtk_object_destroy(GTK_OBJECT + (disp->intreg.gci_intreg1[i][j])); + disp->intreg.gci_intreg1[i][j] = NULL; + } + } + +} + + + +void +create_all_intregs2(Display * disp) +/* ----------------------- Displays all second interrogation areas */ +{ + int i, j; + int nx, ny; + + assert (disp != NULL); + if (disp->intreg.exist != 1) + create_intreg_data(disp); + + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + create_intreg2(i, j, disp); + } + } + +} + + +void +create_intreg2(gint i, + gint j, + Display * disp) +/* ----------------------------- Displays second interrogation area */ +{ + int start_x, start_y, end_x, end_y; + float x, y; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + + x = disp->intreg.data.point_x[i][j]; + y = disp->intreg.data.point_y[i][j]; + +/* --------------------------------------------------------with lines */ + start_x = (int) x - piv_eval_par.int_size_2 / 2 + + piv_eval_par.pre_shift_col; + start_y = (int) y - piv_eval_par.int_size_2 / 2 + + piv_eval_par.pre_shift_row; + end_x = (int) x + piv_eval_par.int_size_2 / 2 + + piv_eval_par.pre_shift_col; + end_y = (int) y + piv_eval_par.int_size_2 / 2 + + piv_eval_par.pre_shift_row; + + disp->intreg.gci_intreg2[i][j] = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS + (disp->canvas)), + gnome_canvas_rect_get_type(), + "x1", (double) start_x, + "y1", (double) start_y, + "x2", (double) end_x, + "y2", (double) end_y, + "outline_color", "yellow", + "width_units", (double) THICKNESS, + NULL); +} + + +void +update_intreg2(gint i, gint j, Display * disp) +/* ------------------------------------ Updates second interrogation area */ +{ + int start_x, start_y, end_x, end_y; + float x, y; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + assert (disp->intreg.gci_intreg1[i][j] != NULL); + + x = disp->intreg.data.point_x[i][j]; + y = disp->intreg.data.point_y[i][j]; + +/* ------------------------------ Using centre points of interr regs */ + start_x = (int) x - piv_eval_par.int_size_1 / 2; + start_y = (int) y - piv_eval_par.int_size_1 / 2; + end_x = (int) x + piv_eval_par.int_size_1 / 2; + end_y = (int) y + piv_eval_par.int_size_1 / 2; + + if (disp->intreg.gci_intreg2[i][j] != NULL) { + gnome_canvas_item_set(GNOME_CANVAS_ITEM + (disp->intreg.gci_intreg2[i][j]), + "x1", (double) start_x, + "y1", (double) start_y, + "x2", (double) end_x, + "y2", (double) end_y, + "outline_color", "blue", + "width_units", (double) THICKNESS, + NULL); + } +} + + +void +show_all_intregs2(Display * disp) +/* ----------------------------------- Shows 2nd interrogation areas */ +{ + int i, j; + int nx, ny; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + assert (disp->intreg.gci_intreg2[i][j] != NULL); + gnome_canvas_item_show(GNOME_CANVAS_ITEM + (disp->intreg.gci_intreg2[i][j])); + } + } + +} + + + +void +hide_all_intregs2(Display * disp) +/* ----------------------------------- Hides 2nd interrogation areas */ +{ + int i, j; + int nx, ny; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + assert (disp->intreg.gci_intreg2[i][j] != NULL); + gnome_canvas_item_hide(GNOME_CANVAS_ITEM + (disp->intreg.gci_intreg2[i][j])); + } + } + +} + + +void +destroy_all_intregs2(Display * disp) +/* ----------------------------------- Destroys 2nd interrogation areas */ +{ + int i, j; + int nx, ny; + + assert (disp != NULL); + assert (disp->intreg.exist == 1); + + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + assert (disp->intreg.gci_intreg2[i][j] != NULL); + gtk_object_destroy(GTK_OBJECT + (disp->intreg.gci_intreg2[i][j])); + disp->intreg.gci_intreg2[i][j] = NULL; + } + } +} + + + +void +display_vector(gint i, gint j, + GpivData * gpd /* PivData piv_data */) +/* ----------------------- Displays a single PIV vector on a Gnome canvas */ +{ + GnomeCanvasPoints *points; + Display *disp = display_act; + + float **point_x = gpd->piv_data.point_x; + float **point_y = gpd->piv_data.point_y; + float **dx = gpd->piv_data.dx, **dy = gpd->piv_data.dy; + int **peak_no = gpd->piv_data.peak_no; +/* GtkWidget *display=gpd->display; */ +/* fprintf(stderr,"\nentering display_all_pivdata\n"); */ + gchar *color; + points = gnome_canvas_points_new(2); + +/*--------------------------------------------------------------------- + fill out the points */ + + points->coords[0] = point_x[i][j]; + points->coords[1] = point_y[i][j]; + points->coords[2] = point_x[i][j] + dx[i][j] * gpiv_par.vector_scale; + points->coords[3] = point_y[i][j] + dy[i][j] * gpiv_par.vector_scale; + + if (peak_no[i][j] == -1) { + color="gray"; + } else if (peak_no[i][j] == 0) { + color="lightblue"; + } else if (peak_no[i][j] == 1) { + color="green"; + } else if (peak_no[i][j] == 2) { + color="yellow"; + } else { +/* if (peak_no[i][j] == 3) */ + color="red"; + } + + + gpd->gci_vector[i][j] = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(disp->canvas)), + gnome_canvas_line_get_type(), + "points", points, + "fill_color", color, + "width_units", (double) THICKNESS, + "last_arrowhead", TRUE, + "arrow_shape_a", (double) ARROW_LENGTH, + "arrow_shape_b", (double) ARROW_EDGE, + "arrow_shape_c", (double) ARROW_WIDTH, + NULL); + + gnome_canvas_points_free(points); + +} + + + +void +update_vector(gint i, + gint j, + GpivData * gpd) +/* ------------------- Updates a single PIV vector on a Gnome canvas */ +{ + + GnomeCanvasPoints *points; + + float **point_x = gpd->piv_data.point_x, **point_y = + gpd->piv_data.point_y; + float **dx = gpd->piv_data.dx, **dy = gpd->piv_data.dy; + float **snr = gpd->piv_data.snr; + int **peak_no = gpd->piv_data.peak_no; + +/* GtkWidget *display=gpd->display; */ +/* fprintf(stderr,"\nentering display_all_pivdata\n"); */ + + gchar *color = NULL; + points = gnome_canvas_points_new(2); +/*-- fill out the points -----------------------------------------------*/ + points->coords[0] = point_x[i][j]; + points->coords[1] = point_y[i][j]; + points->coords[2] = point_x[i][j] + dx[i][j] * gpiv_par.vector_scale; + points->coords[3] = point_y[i][j] + dy[i][j] * gpiv_par.vector_scale; + + + if (v_color == SHOW_PEAKNR) { + if (peak_no[i][j] == -1) { + color = "red"; + } else if (peak_no[i][j] == 0) { + color = "lightblue"; + } else if (peak_no[i][j] == 1) { + color = "green"; + } else if (peak_no[i][j] == 2) { + color = "yellow"; + } else { +/* if (peak_no[i][j] == 3) */ + color = "gray"; + } + } else if (v_color == SHOW_SNR) { + if (snr[i][j] >= piv_valid_par.residu_max) { + color = "red"; + } else { + color = "green"; + } + } + + if (gpd->gci_vector[i][j] != NULL) { + gnome_canvas_item_set(GNOME_CANVAS_ITEM(gpd->gci_vector[i][j]), + "points", points, + "fill_color", color, + "width_units", (double) THICKNESS, + "last_arrowhead", TRUE, + "arrow_shape_a", (double) ARROW_LENGTH, + "arrow_shape_b", (double) ARROW_EDGE, + "arrow_shape_c", (double) ARROW_WIDTH, + NULL); + } + + gnome_canvas_points_free(points); + + +} + +void +destroy_vector(gint i, + gint j, + GpivData * gpd) +/* ------------------- Detroys a single PIV vector on a Gnome canvas */ +{ + + + if (gpd->gci_vector[i][j] != NULL) { + gtk_object_destroy(GTK_OBJECT (gpd->gci_vector[i][j])); + gpd->gci_vector[i][j] = NULL; + } + +} + + +void +display_all_vectors(GpivData * gpd) +/* ---------------------- Displays all PIV vectors on a Gnome canvas */ +{ + int i, j; + gint nx = gpd->piv_data.nx, ny = gpd->piv_data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + display_vector(i, j, gpd); + + } + } + +} + + +void +show_all_vectors(GpivData * gpd) +/* ------------------------- Shows all PIV vectors on a Gnome canvas */ +{ + int i, j; + gint nx = gpd->piv_data.nx, ny = gpd->piv_data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_show(GNOME_CANVAS_ITEM + (gpd->gci_vector[i][j])); + } + } +} + + +void +hide_all_vectors(GpivData * gpd) +/* ------------------------ Hides all PIV vectors on a Gnome canvas */ +{ + int i, j; + gint nx = gpd->piv_data.nx, ny = gpd->piv_data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_hide(GNOME_CANVAS_ITEM + (gpd->gci_vector[i][j])); + } + } +} + + +void +update_all_vectors(GpivData * gpd) +/* ----------------------------- Scales PIV vectors for Gnome canvas */ +{ + int i, j; + GnomeCanvasPoints *points; + + int nx = gpd->piv_data.nx, ny = gpd->piv_data.ny; + + points = gnome_canvas_points_new(2); + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + update_vector(i, j, gpd); + } + } + +} + + + +void +destroy_all_vectors(GpivData * gpd) +/* ---------------------- Destroys all PIV vectors on a Gnome canvas */ +{ + int i, j; + gint nx = gpd->piv_data.nx, ny = gpd->piv_data.ny; + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + destroy_vector(i, j, gpd); + } + } + +} + + + +void +display_scalar(gint i, + gint j, + ScalarData * scalar_data, + gint type, +/* GnomeCanvasItem * gci_scalar, */ + guint col_val) +/* ------------------------------------ Displays a scalar gnome canvas item +by coloring the interrogation area */ +{ + float **x = scalar_data->point_x, **y = scalar_data->point_y; + int start_x, start_y, end_x, end_y; + + GnomeCanvasPoints *points; + points = gnome_canvas_points_new(5); + + +/* ------------------------------ Using centre points of interr regs */ + start_x = (int) x[i][j] - piv_eval_par.int_size_1 / 2; + start_y = (int) y[i][j] - piv_eval_par.int_size_1 / 2; + end_x = (int) x[i][j] + piv_eval_par.int_size_1 / 2; + end_y = (int) y[i][j] + piv_eval_par.int_size_1 / 2; + + if (type == VORTICITY) { + display_act->gpd.gci_scalar_vor[i][j] = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(display_act->canvas)), + gnome_canvas_rect_get_type(), + "x1", (double) start_x, + "y1", (double) start_y, + "x2", (double) end_x, + "y2", (double) end_y, + "fill_color_rgba", col_val, + NULL); + } + + if (type == S_STRAIN) { + display_act->gpd.gci_scalar_sstrain[i][j] = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(display_act->canvas)), + gnome_canvas_rect_get_type(), + "x1", (double) start_x, + "y1", (double) start_y, + "x2", (double) end_x, + "y2", (double) end_y, + "fill_color_rgba", col_val, + NULL); + } + + if (type == N_STRAIN) { + display_act->gpd.gci_scalar_nstrain[i][j] = + gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(display_act->canvas)), + gnome_canvas_rect_get_type(), + "x1", (double) start_x, + "y1", (double) start_y, + "x2", (double) end_x, + "y2", (double) end_y, + "fill_color_rgba", col_val, + NULL); + } + + gnome_canvas_points_free(points); + +} + + +void +display_all_scalars(ScalarData * scalar_data, +/* GnomeCanvasItem * **gci_scalar */ + gint type) +/* ------------------------- Displays all scalar gnome canvas items */ +{ + int i, j; + int nx = scalar_data->nx, ny = scalar_data->ny, **flag = scalar_data->flag; + + float **sc = scalar_data->scalar; + float sc_min = 10000.0, sc_max = -10000.0; + guint col_val = 0; + + float scale_factor = 0.0; +/* g_warning("display_all_scalars:: enter scalar_nx=%d scalar_ny=%d" */ +/* "piv_nx=% piv_ny=%d intreg_nx=%d intreg_ny=%d", */ +/* nx, ny, */ +/* display_act->gpd.piv_data.nx, display_act->gpd.piv_data.ny, */ +/* intreg.data.nx, intreg.data.ny */ +/* ); */ +/* -------------------------------------------------------------------- + normalizing data between 0 and 1 */ + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + if (flag[i][j] != -1) { + if (sc[i][j] < sc_min) sc_min = sc[i][j]; + if (sc[i][j] > sc_max) sc_max = sc[i][j]; + } + } + } + + if (sc_min < 0) { + if (-sc_min >= sc_max) { + scale_factor = 1.0 / -sc_min; + } else { + scale_factor = 1.0 / sc_max; + } + } else { + scale_factor = 1.0 / sc_max; + } + + + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + if (flag[i][j] != -1) { + if (sc_min < 0) { + if (sc[i][j] <0) { + col_val = (int) (-sc[i][j] * 255 * scale_factor); + col_val = (col_val << BITSHIFT_RED); + } else { + col_val = (int) (sc[i][j] * 255 * scale_factor); + col_val = (col_val << BITSHIFT_BLUE); + } + } else { + col_val = (int) (sc[i][j] * 255 * scale_factor); + col_val = (col_val << BITSHIFT_BLUE); + } + } else { + col_val = 128 << BITSHIFT_GREEN; + } + display_scalar(i, j, scalar_data, type, /* gci_scalar[i][j], */ + col_val); + } + } + + if (display_act->display_piv) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_raise_to_top (display_act->intreg.gci_intreg1[i][j]); + gnome_canvas_item_raise_to_top (display_act->intreg.gci_intreg2[i][j]); + } + } + } + + if (display_act->display_intregs) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_raise_to_top (display_act->gpd.gci_vector[i][j]); + } + } + } + +} + + +void +show_all_scalars(ScalarData * scalar_data, + gint type +/* GnomeCanvasItem * **gci_scalar */ + ) +/* ----------------------------------- Shows scalar gnome canvas items */ +{ + int i, j; + int nx = scalar_data->nx, ny = scalar_data->ny; + + if (type == VORTICITY) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_show(GNOME_CANVAS_ITEM(display_act->gpd.gci_scalar_vor[i][j])); + } + } + } + + if (type == S_STRAIN) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_show(GNOME_CANVAS_ITEM(display_act->gpd.gci_scalar_sstrain[i][j])); + } + } + } + + if (type == N_STRAIN) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_show(GNOME_CANVAS_ITEM(display_act->gpd.gci_scalar_nstrain[i][j])); + } + } + } + +} + + +void +hide_all_scalars(ScalarData * scalar_data, + gint type +/* GnomeCanvasItem * **gci_scalar */ + ) +/* ----------------------------------- Hides all scalar gnome canvas items */ +{ + int i, j; + int nx = scalar_data->nx, ny = scalar_data->ny; + + if (type == VORTICITY) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_hide(GNOME_CANVAS_ITEM(display_act->gpd.gci_scalar_vor[i][j])); + } + } + } + + if (type == S_STRAIN) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_hide(GNOME_CANVAS_ITEM(display_act->gpd.gci_scalar_sstrain[i][j])); + } + } + } + + if (type == N_STRAIN) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + gnome_canvas_item_hide(GNOME_CANVAS_ITEM(display_act->gpd.gci_scalar_nstrain[i][j])); + } + } + } + + +} + + +void +destroy_all_scalars(ScalarData * scalar_data, + gint type +/* GnomeCanvasItem * **gci_scalar */ + ) +/* ------------------------------- Destroys scalar canvas items */ +{ + int i, j; + int nx = scalar_data->nx, ny = scalar_data->ny; + + if (type == VORTICITY) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + if (display_act->gpd.gci_scalar_vor[i][j] != NULL) { + gtk_object_destroy(GTK_OBJECT(display_act->gpd. + gci_scalar_vor[i][j])); + display_act->gpd.gci_scalar_vor[i][j] = NULL; + } + } + } + } + + if (type == S_STRAIN) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + if (display_act->gpd.gci_scalar_sstrain[i][j] != NULL) { + gtk_object_destroy(GTK_OBJECT(display_act->gpd. + gci_scalar_sstrain[i][j])); + display_act->gpd.gci_scalar_sstrain[i][j] = NULL; + } + } + } + } + + if (type == N_STRAIN) { + for (i = 0; i < ny; i++) { + for (j = 0; j < nx; j++) { + if (display_act->gpd.gci_scalar_nstrain[i][j] != NULL) { + gtk_object_destroy(GTK_OBJECT(display_act->gpd. + gci_scalar_nstrain[i][j])); + display_act->gpd.gci_scalar_nstrain[i][j] = NULL; + } + } + } + } + + +} + + diff --git a/src/display.h b/src/display.h new file mode 100644 index 0000000..2b8c33f --- /dev/null +++ b/src/display.h @@ -0,0 +1,297 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + + +/* + * (callback) functions for the display + * $Log: display.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef DISPLAY_H +#define DISPLAY_H + + +/* + * Callback functions for the display + */ + +void +/* on_display_set_focus(gpointer data, guint action, GtkWidget *widget); */ +on_display_set_focus (GtkWidget *widget, gpointer data); + +void on_scrolledwindow_display_adj_changed (GtkAdjustment *adj, gpointer data); + +gint +canvas_display_enter_notify (GtkWidget *widget, GdkEventMotion *event); + +gint +canvas_display_motion_notify (GtkWidget *widget, GdkEventMotion *event); + +gint +canvas_display_button_press(GtkWidget *widget, GdkEventButton *event); + +gint +canvas_display_button_release(GtkWidget *widget, GdkEventButton *event); + +gint +canvas_display_leave_notify (GtkWidget *widget, GdkEventMotion *event); + + +/* + * Callback functions for the display menu + */ + +gint +on_displaypopup_handler(GtkWidget *widget, GdkEvent *event); + +void +select_zoomscale(gpointer data, guint action, GtkWidget * widget); + +/* ORIGINAL CALLBACK (DIDN'T WORK) gpointer data, guint action, GtkWidget*widgetvoid */ +void +view_toggle_rulers(GtkWidget *widget, gpointer data); + +void +view_toggle_stretch_display(GtkWidget *widget, gpointer data); + +void +view_visible_grid(GtkWidget *widget, gpointer data); + +void +view_toggle_img1(GtkWidget *widget, gpointer data); + +void +view_toggle_img2(GtkWidget *widget, gpointer data); + +void +view_toggle_intregs(GtkWidget *widget, gpointer data); + +void +view_toggle_piv(GtkWidget *widget, gpointer data); + +void +view_toggle_vor(GtkWidget *widget, gpointer data); + +void +view_toggle_sstrain(GtkWidget *widget, gpointer data); + +void +view_toggle_nstrain(GtkWidget *widget, gpointer data); + +void +select_vectorscale(gpointer data, guint action, GtkWidget *widget); + +void +nav_popup_click_handler(GtkWidget *widget, GdkEventButton *event, + gpointer data); + +void +on_view_options_clicked(GtkButton * button, gpointer user_data); + + +/* + * Callback function for pop-up menu + */ +gint +on_button_display_origin_press_event(GtkWidget *widget, GdkEventButton *event, + gpointer data); + + + +/* + * img_display callbacks + */ +gboolean on_darea_img_expose ( GtkWidget *widget, + GdkEventExpose *event, + gpointer user_data); + + + +/* + * Other functions for display + */ + +void +display_img(Display * disp); + +void +hide_display_img1(Display * disp); + +void +show_display_img1(Display * disp); + +void +hide_display_img2(Display * disp); + +void +show_display_img2(Display * disp); + + + +void +create_all_intregs1(Display * disp); + +void +display_background(Display *disp); + +void +destroy_background(Display *disp); + +void +create_all_intregs(Display * disp); + +void +destroy_all_intregs(Display * disp); + +void +create_intreg_data(Display * disp); + +void +destroy_intreg_data(Display * disp); + +void +show_all_intregs(Display * disp); + +void +hide_all_intregs(Display * disp); + +void +create_all_intregs1(Display * disp); + +void +create_intreg1(gint i, + gint j, + Display * disp); + +/* Updates a single Interrogation Area on a Gnome canvas */ +void +update_intreg1(gint i, + gint j, + Display * disp); + +void +show_all_intregs1(Display * disp); + +void +hide_all_intregs1(Display * disp); + +void +destroy_all_intregs1(Display * disp); + +void +create_all_intregs2(Display * disp); + +void +create_intreg2(gint i, + gint j, + Display * disp); + +/* Updates a single Interrogation Area on a Gnome canvas */ +void +update_intreg2(gint i, + gint j, + Display * disp); + +void +show_all_intregs2(Display * disp); + +void +hide_all_intregs2(Display * disp); + +void +destroy_all_intregs2(Display * disp); + +/* Displays a single PIV vector on a Gnome canvas */ +void +display_vector(gint i, + gint j, + GpivData * gpd); + +/* Updates a single PIV vector on a Gnome canvas */ +void +update_vector(gint i, + gint j, + GpivData * gpd); + +/* Destroys a single PIV vector on a Gnome canvas */ +void +destroy_vector(gint i, + gint j, + GpivData * gpd); + +/* Displays all PIV vectors on a Gnome canvas*/ +void +display_all_vectors(GpivData * gpd); + +/* Shows all PIV vectors on a Gnome canvas */ +void +show_all_vectors(GpivData * gpd); + +/* Hides all PIV vectors on a Gnome canvas */ +void +hide_all_vectors(GpivData * gpd); + +/* Updates all PIV vectors for Gnome canvas */ +void +update_all_vectors(GpivData * gpd); + +/* Destroys all PIV vectors on a Gnome canvas */ +void +destroy_all_vectors(GpivData * gpd); + +void +display_scalar(gint i, gint j, ScalarData * scalar_data, + gint type, +/* GnomeCanvasItem * gci_scalar */ + guint col_val + ); +void +display_all_scalars(ScalarData * scalar_data, + gint type +/* GnomeCanvasItem * **gci_scalar */ + ); +void +show_all_scalars(ScalarData * scalar_data, + gint type +/* GnomeCanvasItem * **gci_scalar */ + ); +void +hide_all_scalars(ScalarData * scalar_data, + gint type +/* GnomeCanvasItem * **gci_scalar */ + ); +void +destroy_all_scalars(ScalarData * scalar_data, + gint type +/* GnomeCanvasItem * **gci_scalar */ + ); + + +#endif /* DISPLAY_H */ diff --git a/src/display_interface.c b/src/display_interface.c new file mode 100644 index 0000000..6318520 --- /dev/null +++ b/src/display_interface.c @@ -0,0 +1,870 @@ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * interface for create_display + * $Log: display_interface.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ +#include "gpiv_gtk.h" +#include "utils.h" +#include "display_interface.h" +#include "display_menus.h" +#include "display.h" + + +Display * +create_display(gchar * fname, + gint display_count, + GpivConsole * gpiv) +{ + + Display *disp = g_new0(Display, + 1); + static gint screen_width = 0, screen_height = 0; + static gint width = 0, height = 0; + static gchar title[MAX_CHARS]; + + snprintf(title, + MAX_CHARS, + "gpiv display #%d", + display_count); + + snprintf(disp->msg_display_default, + MAX_CHARS, + "%s", + fname); + + disp->count = display_count; + disp->zoom_index = gpiv_par.zoom_index; + disp->zoom_factor = zfactor[disp->zoom_index]; + disp->vector_scale = gpiv_par.vector_scale; + disp->display_img1 = gpiv_par.display_img1; + disp->display_img2 = gpiv_par.display_img2; + disp->display_intregs = gpiv_par.display_intregs; + disp->display_piv = gpiv_par.display_piv; + disp->display_vor = gpiv_par.display_vor; + disp->display_sstrain = gpiv_par.display_sstrain; + disp->display_nstrain = gpiv_par.display_nstrain; + + disp->img.exist_img = FALSE; + disp->gpd.exist_piv = FALSE; + disp->gpd.saved_piv = TRUE; + disp->gpd.scaled_piv = FALSE; + disp->gpd.exist_valid = FALSE; + disp->gpd.exist_vor = FALSE; + disp->gpd.exist_vor_scaled = FALSE; + disp->gpd.saved_vor = TRUE; + disp->gpd.exist_sstrain = FALSE; + disp->gpd.exist_sstrain_scaled = FALSE; + disp->gpd.saved_sstrain = TRUE; + disp->gpd.exist_nstrain = FALSE; + disp->gpd.exist_nstrain_scaled = FALSE; + disp->gpd.saved_nstrain = TRUE; + + + +/* disp->intreg.gci_intreg1 = alloc_gci_matrix(MAX_DATA, MAX_DATA); */ +/* gpiv_warning("create_display:: A back from alloc_gci_matrix"); */ +/* disp->intreg.gci_intreg2 = alloc_gci_matrix(MAX_DATA, MAX_DATA); */ +/* gpiv_warning("create_display:: B back from alloc_gci_matrix"); */ + + + disp->mwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(disp->mwin), + title); + gtk_object_set_data(GTK_OBJECT(disp->mwin), + "disp", + disp); + gtk_object_set_data(GTK_OBJECT(disp->mwin), + "gpiv", + gpiv); + +/* + * DESTROYN ITEM + */ +/* gtk_object_set_data_full(GTK_OBJECT(disp->mwin), */ +/* "mwin", */ +/* disp->mwin, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_signal_connect (GTK_OBJECT (disp->mwin), "destroy", */ +/* GTK_SIGNAL_FUNC (destroy), NULL); */ + + +/* + * focussing the actual display + */ + gtk_signal_connect(GTK_OBJECT(disp->mwin), + "focus_in_event", + GTK_SIGNAL_FUNC(on_display_set_focus), + NULL); + + if (screen_width == 0 || screen_height == 0) { + screen_width = gdk_screen_width(); + screen_height = gdk_screen_height(); + } + + width = (gint) (disp->zoom_factor * gpiv_par.img_width + VIEW_HMARGE); + height = (gint) (disp->zoom_factor * gpiv_par.img_height + VIEW_VMARGE); +/* if (width < screen_width && height < screen_height) { */ + gtk_window_set_default_size(GTK_WINDOW(disp->mwin), + width, + height); + +/* }*/ + +/* gtk_window_set_policy (GTK_WINDOW (disp->mwin), */ +/* FALSE, */ +/* TRUE, */ +/* FALSE); */ + + +/* table */ + disp->table = gtk_table_new(2, + 3, + FALSE); + gtk_widget_ref(disp->table); + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "table", + disp->table, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(disp->table); +/* gtk_container_add (GTK_CONTAINER (viewport_display), + disp->table); */ + gtk_container_add(GTK_CONTAINER(disp->mwin), + disp->table); + + +/* + * button with arrow disabled as conflicts with popup menu + */ +/* disp->button_origin = gtk_button_new(); */ +/* disp->arrow_origin = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_OUT); */ +/* gtk_container_add(GTK_CONTAINER(disp->button_origin), */ +/* disp->arrow_origin); */ +/* gtk_widget_show(disp->arrow_origin); */ +/* gtk_signal_connect(GTK_OBJECT(disp->button_origin), */ +/* "button_press_event", */ +/* GTK_SIGNAL_FUNC(on_view_options_clicked), NULL); */ +/* gtk_widget_show(disp->button_origin); */ +/* gtk_table_attach(GTK_TABLE(disp->table), disp->button_origin, 0, 1, */ +/* 0, 1, (GtkAttachOptions) (GTK_FILL), */ +/* (GtkAttachOptions) (0), 0, 0); */ +/* gtk_widget_set_usize(disp->button_origin, 1, 0); */ +/* gtk_signal_connect(GTK_OBJECT(disp->button_origin), */ +/* "button_press_event", */ +/* GTK_SIGNAL_FUNC */ +/* (on_button_display_origin_press_event), NULL); */ + + +/* + * rulers + */ +#define EVENT_METHOD(i, x) GTK_WIDGET_CLASS(GTK_OBJECT(i)->klass)->x + + disp->hruler = gtk_hruler_new(); + gtk_widget_ref(disp->hruler); + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "hruler", + disp->hruler, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(disp->hruler); + gtk_table_attach(GTK_TABLE(disp->table), + disp->hruler, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); +/* gtk_ruler_set_range (GTK_RULER (disp->hruler), 0, 500, 0, 1279); */ + gtk_ruler_set_range(GTK_RULER(disp->hruler), + 0, + gpiv_par.img_width - 1, + 0, + gpiv_par.img_height - 1); + + disp->vruler = gtk_vruler_new(); + gtk_widget_ref(disp->vruler); + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "vruler", + disp->vruler, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(disp->vruler); + gtk_table_attach(GTK_TABLE(disp->table), + disp->vruler, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); +/* gtk_ruler_set_range (GTK_RULER (disp->vruler), 0, 550, 0, 1023); */ + gtk_ruler_set_range(GTK_RULER(disp->vruler), + 0, + gpiv_par.img_width - 1, + 0, + gpiv_par.img_height - 1); + + +/* + * scrolledwindow + */ + disp->scrolledwindow = gtk_scrolled_window_new(NULL, + NULL); + gtk_widget_ref(disp->scrolledwindow); + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "scrolledwindow", + disp->scrolledwindow, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(disp->scrolledwindow); +/* gtk_container_add (GTK_CONTAINER (disp->mwin), disp->scrolledwindow); */ + gtk_table_attach(GTK_TABLE(disp->table), + disp->scrolledwindow, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW + (disp->scrolledwindow), + GTK_POLICY_ALWAYS, + GTK_POLICY_ALWAYS); +/* gtk_widget_set_usize (disp->scrolledwindow_buf, 160, -2); */ + + + disp->scrolledwindow_hadj = + gtk_adjustment_new(0.0, + 0.0, + (gfloat) gpiv_par.img_width, + 5.0, + 50.0, + 50.0); + gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW + (disp->scrolledwindow), + GTK_ADJUSTMENT + (disp->scrolledwindow_hadj)); + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "scrolledwindow_hadj", + disp->scrolledwindow_hadj, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(disp->scrolledwindow_hadj), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(disp->scrolledwindow_hadj), + "value_changed", + GTK_SIGNAL_FUNC + (on_scrolledwindow_display_adj_changed), + NULL); + + + disp->scrolledwindow_vadj = + gtk_adjustment_new(0.0, + 0.0, + (gfloat) gpiv_par.img_height, + 5.0, + 50.0, + 50.0); + gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW + (disp->scrolledwindow), + GTK_ADJUSTMENT + (disp->scrolledwindow_vadj)); + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "scrolledwindow_vadj", + disp->scrolledwindow_vadj, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(disp->scrolledwindow_vadj), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(disp->scrolledwindow_vadj), + "value_changed", + GTK_SIGNAL_FUNC + (on_scrolledwindow_display_adj_changed), + NULL); + +/* + * gnome canvas + */ + gtk_widget_push_visual(gdk_imlib_get_visual()); + gtk_widget_push_colormap(gdk_imlib_get_colormap()); +/* gtk_widget_push_visual (gdk_rgb_get_visual ()); */ +/* gtk_widget_push_colormap (gdk_rgb_get_cmap ()); */ + + disp->canvas = gnome_canvas_new /* _aa */ (); + gtk_widget_pop_colormap(); + gtk_widget_pop_visual(); + gtk_widget_ref(disp->canvas); + gtk_widget_set_events(GTK_WIDGET(disp->canvas), + GDK_LEAVE_NOTIFY_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK); + + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "canvas", + disp->canvas, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(disp->canvas); + gnome_canvas_set_scroll_region(GNOME_CANVAS(disp->canvas), + 0, + 0, + gpiv_par.img_width - 1, + gpiv_par.img_height - 1); + gtk_container_add(GTK_CONTAINER(disp->scrolledwindow), + disp->canvas); + + + + gtk_object_set_data(GTK_OBJECT(disp->canvas), + "disp", + disp); + gtk_object_set_data(GTK_OBJECT(disp->canvas), + "gpiv", + gpiv); + gtk_signal_connect(GTK_OBJECT(disp->canvas), + "enter_notify_event", + GTK_SIGNAL_FUNC(canvas_display_enter_notify), + NULL); + gtk_signal_connect(GTK_OBJECT(disp->canvas), + "motion_notify_event", + GTK_SIGNAL_FUNC(canvas_display_motion_notify), + NULL); + gtk_signal_connect(GTK_OBJECT(disp->canvas), + "button_press_event", + GTK_SIGNAL_FUNC(canvas_display_button_press), + NULL); + gtk_signal_connect(GTK_OBJECT(disp->canvas), + "button_release_event", + GTK_SIGNAL_FUNC(canvas_display_button_release), + NULL); + gtk_signal_connect(GTK_OBJECT(disp->canvas), + "leave_notify_event", + GTK_SIGNAL_FUNC(canvas_display_leave_notify), +NULL); + + +/* + * connect rulers to gnome_canvas drawing area + */ + gtk_signal_connect_object(GTK_OBJECT(disp->canvas), + "motion_notify_event", + (GtkSignalFunc) + EVENT_METHOD(disp->vruler, + motion_notify_event), + GTK_OBJECT(disp->vruler)); + + gtk_signal_connect_object(GTK_OBJECT(disp->canvas), + "motion_notify_event", + (GtkSignalFunc) + EVENT_METHOD(disp->hruler, + motion_notify_event), + GTK_OBJECT(disp->hruler)); + + +/* + * application/status bar + */ + disp->appbar = gnome_appbar_new(FALSE, + TRUE, + GNOME_PREFERENCES_NEVER); + gtk_widget_ref(disp->appbar); + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "appbar", + disp->appbar, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(disp->appbar); + gtk_table_attach(GTK_TABLE(disp->table), + disp->appbar, + 0, + 2, + 2, + 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + gnome_appbar_set_default(GNOME_APPBAR(disp->appbar), + disp->msg_display_default); + + + + +/* gtk_signal_connect_object(GTK_OBJECT(disp->mwin), "button_press_event", */ +/* GTK_SIGNAL_FUNC (on_my_popup_handler), */ +/* GTK_OBJECT(display_menu)); */ + + /* the navigation window button See GIMP */ + disp->nav_ebox = gtk_event_box_new(); + gtk_widget_ref(disp->nav_ebox); + gtk_object_set_data_full(GTK_OBJECT(disp->mwin), + "nav_ebox", + disp->nav_ebox, + (GtkDestroyNotify) gtk_widget_unref); + gtk_table_attach(GTK_TABLE(disp->table), + disp->nav_ebox, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + gtk_widget_show(disp->nav_ebox); + gtk_signal_connect(GTK_OBJECT(disp->nav_ebox), + "button_press_event", + GTK_SIGNAL_FUNC(nav_popup_click_handler), + NULL); + +/* disp->pixmap = gtk_pixmap_new (navbutton_pixmap, navbutton_mask); */ +/* gtk_container_add (GTK_CONTAINER (disp->nav_ebox), disp->pixmap); */ +/* gtk_widget_show (disp->pixmap); */ + + + return disp; +} + + + +GtkWidget * +create_display_menu(Display * disp) +{ + GtkWidget *display_menu = NULL; + + display_menu = gtk_menu_new(); + gtk_object_set_data( +/* GTK_OBJECT(display_act->gpd.display->mwin), */ + GTK_OBJECT(disp->mwin), + "display_menu", + display_menu); + gnome_app_fill_menu(GTK_MENU_SHELL(display_menu), + display_menu_uiinfo, + NULL, + FALSE, + 0); + + +/* + * view menu widgets + */ + gtk_widget_ref(display_menu_uiinfo[0].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "v_m", + display_menu_uiinfo[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + + + gtk_widget_ref(view_menu_display[2].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "view_img1", + view_menu_display[2].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(disp->mwin), + "view_menu_display2", + view_menu_display[2].widget); + g_warning("display_img1 = %d", disp->display_img1); + if (disp->display_img1) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[2].widget), + TRUE); + } + + + + gtk_widget_ref(view_menu_display[3].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "view_img1", + view_menu_display[3].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(disp->mwin), + "view_menu_display3", + view_menu_display[3].widget); + g_warning("display_img2 = %d", disp->display_img2); + if (disp->display_img2) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[3].widget), + TRUE); + } + + + + gtk_widget_ref(view_menu_display[4].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "view_intreg", + view_menu_display[4].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(disp->mwin), + "view_menu_display4", + view_menu_display[4].widget); + g_warning("display_intregs = %d", disp->display_intregs); + if (disp->display_intregs) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[4].widget), + TRUE); + } + + + + gtk_widget_ref(view_menu_display[5].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "view_piv", + view_menu_display[5].widget, + (GtkDestroyNotify) gtk_widget_unref); +/* gtk_object_set_data(GTK_OBJECT(disp->mwin), */ +/* "view_menu_display5", */ +/* view_menu_display[5].widget); */ + if (disp->display_piv) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[5].widget), + TRUE); + } + + + + gtk_widget_ref(view_menu_display[6].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "view_vor", + view_menu_display[6].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.display_vor) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[6].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[6].widget), + FALSE); + } + + + + gtk_widget_ref(view_menu_display[7].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "view_sstrain", + view_menu_display[7].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.display_sstrain) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[7].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[7].widget), + FALSE); + } + + + + gtk_widget_ref(view_menu_display[8].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "view_nstrain", + view_menu_display[8].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.display_nstrain) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[8].widget), + TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (view_menu_display[8].widget), + FALSE); + } + + + +/* + * zoom menu widgets + */ + gtk_widget_ref(zoomscale_menu_display[0].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "zmv_0", + zoomscale_menu_display[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (disp->zoom_index == ZOOM_0) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (zoomscale_menu_display[0].widget), + TRUE); + } + + + + gtk_widget_ref(zoomscale_menu_display[1].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "zmv_1", + zoomscale_menu_display[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (disp->zoom_index == ZOOM_1) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (zoomscale_menu_display[1].widget), + TRUE); + } + + + + gtk_widget_ref(zoomscale_menu_display[2].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "zmv_2", + zoomscale_menu_display[2].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (disp->zoom_index == ZOOM_2) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (zoomscale_menu_display[2].widget), + TRUE); + } + + + + gtk_widget_ref(zoomscale_menu_display[3].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "zmv_3", + zoomscale_menu_display[3].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (disp->zoom_index == ZOOM_3) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (zoomscale_menu_display[3].widget), + TRUE); + } + + + + gtk_widget_ref(zoomscale_menu_display[4].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "zmv_4", + zoomscale_menu_display[4].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (disp->zoom_index == ZOOM_4) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (zoomscale_menu_display[4].widget), + TRUE); + } + + + + gtk_widget_ref(zoomscale_menu_display[5].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "zmv_5", + zoomscale_menu_display[5].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (disp->zoom_index == ZOOM_5) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (zoomscale_menu_display[5].widget), + TRUE); + } + + +/* + * stretch window menu widget to resize window after zoomscaling + */ + + gtk_widget_ref(view_menu_display[0].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "v_mv_0", + view_menu_display[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + gtk_menu_item_activate(GTK_MENU_ITEM(view_menu_display[0].widget)); + + +/* + * vectorscale menu widgets + */ + gtk_widget_ref(vectorscale_menu_display[0].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_0", + vectorscale_menu_display[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 1) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[0].widget), + TRUE); + } + + + + gtk_widget_ref(vectorscale_menu_display[1].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_1", + vectorscale_menu_display[1].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 2) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[1].widget), + TRUE); + } + + + + gtk_widget_ref(vectorscale_menu_display[2].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_2", + vectorscale_menu_display[2].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 4) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[2].widget), + TRUE); + } + + + + gtk_widget_ref(vectorscale_menu_display[3].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_3", + vectorscale_menu_display[3].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 8) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[3].widget), + TRUE); + } + + + + gtk_widget_ref(vectorscale_menu_display[4].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_4", + vectorscale_menu_display[0].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 16) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[4].widget), + TRUE); + } + + + + gtk_widget_ref(vectorscale_menu_display[5].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_0", + vectorscale_menu_display[5].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 32) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[5].widget), + TRUE); + } + + + + gtk_widget_ref(vectorscale_menu_display[6].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_6", + vectorscale_menu_display[6].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 64) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[6].widget), + TRUE); + } + + + + gtk_widget_ref(vectorscale_menu_display[7].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_7", + vectorscale_menu_display[7].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 128) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[7].widget), + TRUE); + } + + + + gtk_widget_ref(vectorscale_menu_display[8].widget); + gtk_object_set_data_full(GTK_OBJECT(display_menu), + "vs_mv_8", + vectorscale_menu_display[8].widget, + (GtkDestroyNotify) gtk_widget_unref); + if (gpiv_par.vector_scale == 256) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (vectorscale_menu_display[8].widget), + TRUE); + } + + + return display_menu; +} + + + + + +GtkWidget *create_img_display(gchar * fname, + ImagePar image_par) +{ + + img_display_window = NULL; + darea = NULL; + + + img_display_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_object_set_data(GTK_OBJECT(img_display_window), + "img_display_window", + img_display_window); + gtk_window_set_title(GTK_WINDOW(img_display_window), + fname); + +/* + * drawing area + */ + + darea = gtk_drawing_area_new(); + gtk_drawing_area_size(GTK_DRAWING_AREA(darea), + gpiv_par.img_width, + gpiv_par.img_height); + gtk_container_add(GTK_CONTAINER(img_display_window), + darea); + gtk_signal_connect(GTK_OBJECT(darea), + "expose-event", + GTK_SIGNAL_FUNC(on_darea_img_expose), + NULL); + +/* if (gpiv_par.view_gpivbuttons) { */ +/* gtk_widget_show(handlebox1); */ + +/* } else { */ +/* gtk_widget_hide(handlebox1); */ +/* } */ +/* gtk_widget_show(handlebox1); */ +/* gtk_widget_show(scrolledwindow_handbox1); */ +/* gtk_widget_show(viewport_handbox1); */ +/* gtk_widget_show(toolbar2); */ +/* gtk_widget_show (hbox_toolbar2); */ + return img_display_window; +} + + diff --git a/src/display_interface.h b/src/display_interface.h new file mode 100644 index 0000000..1ceec47 --- /dev/null +++ b/src/display_interface.h @@ -0,0 +1,200 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * widgets prototypes of display + * $Log: display_interface.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef DISPLAY_INTERFACE_H +#define DISPLAY_INTERFACE_H + +#include "console_interface.h" + + +typedef struct _Image Image; +struct _Image { + GtkWidget *img_display1; + GtkWidget *img_display2; + ImagePar image_par; + unsigned char **img1; + unsigned char **img2; + +/* + * when image is displayed at gdk window + */ +/* guchar rgbbuf_img[IMAGE_WIDTH_MAX * IMAGE_HEIGHT_MAX * 3]; */ +guchar *graybuf_img; +gint rgb_img_width; + +/* + * when image is displayed at gnome canvas + */ +/* GnomeCanvasItem *gci_img1; */ +/* GnomeCanvasItem *gci_img2; */ + gboolean exist_img; + +}; + +typedef struct _Intreg Intreg; +struct _Intreg { + gint row_start_old; + gint row_start; + gint row_end; + gint col_start_old; + gint col_start; + gint col_end; + gint int_size_1; + gint int_size_2; + gint int_shift; + gint pre_shift_row; + gint pre_shift_col; + PivData data; + gboolean exist; + GnomeCanvasItem *gci_intreg1[MAX_DATA][MAX_DATA]; + GnomeCanvasItem *gci_intreg2[MAX_DATA][MAX_DATA]; +}; + + +typedef struct _GpivData GpivData; +struct _GpivData { + PivEvalPar piv_eval_par; + PivData piv_data; + PivData piv_data_scaled; + gboolean exist_piv; + gboolean saved_piv; + gboolean scaled_piv; + GnomeCanvasItem *gci_vector[MAX_DATA][MAX_DATA]; + + + Covariance cov[MAX_DATA][MAX_DATA]; + gboolean exist_cov; + + float **intreg1[MAX_DATA][MAX_DATA]; + float **intreg2[MAX_DATA][MAX_DATA]; + + PivValidPar piv_valid_par; + gboolean exist_valid; + + PivPostPar piv_post_par; + ScalarData vor_data; + ScalarData vor_data_scaled; + gboolean exist_vor; + gboolean exist_vor_scaled; + gboolean saved_vor; + GnomeCanvasItem *gci_scalar_vor[MAX_DATA][MAX_DATA]; + + ScalarData sstrain_data; + ScalarData sstrain_data_scaled; + gboolean exist_sstrain; + gboolean exist_sstrain_scaled; + gboolean saved_sstrain; + GnomeCanvasItem *gci_scalar_sstrain[MAX_DATA][MAX_DATA]; + + ScalarData nstrain_data; + ScalarData nstrain_data_scaled; + gboolean exist_nstrain; + gboolean exist_nstrain_scaled; + gboolean saved_nstrain; + GnomeCanvasItem *gci_scalar_nstrain[MAX_DATA][MAX_DATA]; + +}; + +typedef struct _Display Display; +struct _Display { + char fname_base[MAX_CHARS]; + gint count; + + GtkWidget *mwin; /* main window for display */ + GtkWidget *table; + GtkWidget *button_origin; + GtkWidget *arrow_origin; + GtkWidget *scrolledwindow; + GtkObject *scrolledwindow_hadj; + GtkObject *scrolledwindow_vadj; + GtkWidget *canvas; + GtkWidget *view_options; + GtkWidget *vruler; + GtkWidget *hruler; + GtkWidget *appbar; + GtkWidget *nav_ebox; + + gint zoom_index; + float zoom_factor; + gboolean stretch_window; + gint vector_scale; + gchar msg_display_default[MAX_CHARS]; + + GtkWidget *display_menu; + GnomeCanvasItem *gci_bg; + + + Image img; + Intreg intreg; + GpivData gpd; + + gboolean display_img1; + gboolean display_img2; + gboolean display_intregs; + gboolean display_piv; + gboolean display_vor; + gboolean display_sstrain; + gboolean display_nstrain; + + gint index_x_old; + gint index_y_old; + gint xgrab_first; + gint ygrab_first; + +}; + + +Display * +create_display (gchar *fname, + gint buf, + GpivConsole * gpiv); + +/* + * widget for display menu + */ +GtkWidget +*create_display_menu (Display * disp); + + +/* + * widgets for create_img_display + */ +GtkWidget *create_img_display (gchar *fname, + ImagePar image_par); +GtkWidget *img_display_window; +GtkWidget *darea; + + +#endif /* DISPLAY_INTERFACE_H */ diff --git a/src/display_menus.h b/src/display_menus.h new file mode 100644 index 0000000..94adc3f --- /dev/null +++ b/src/display_menus.h @@ -0,0 +1,124 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * menus of display + * $Log: display_menus.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef DISPLAY_MENUS_H +#define DISPLAY_MENUS_H + +#include "display.h" +/* + * Display menus + */ + +static GnomeUIInfo view_menu_display[] = { + GNOMEUIINFO_ITEM_NONE(N_("Stretch display window"), + N_("Stretch or fit display window to the image area"), + view_toggle_stretch_display), + GNOMEUIINFO_SEPARATOR, + GNOMEUIINFO_TOGGLEITEM(N_("Image A"), NULL, view_toggle_img1, NULL), + GNOMEUIINFO_TOGGLEITEM(N_("Image B"), NULL, view_toggle_img2, NULL), + GNOMEUIINFO_TOGGLEITEM(N_("Interrogation area's"), NULL, + view_toggle_intregs, NULL), + GNOMEUIINFO_TOGGLEITEM(N_("Velocity vectors"), NULL, view_toggle_piv, NULL), + GNOMEUIINFO_TOGGLEITEM(N_("Vorticity"), NULL, view_toggle_vor, NULL), + GNOMEUIINFO_TOGGLEITEM(N_("Shear strain"), NULL, view_toggle_sstrain, NULL), + GNOMEUIINFO_TOGGLEITEM(N_("Normal strain"), NULL, view_toggle_nstrain, NULL), + + GNOMEUIINFO_END +}; + +/* static GtkWidget *display_menu = NULL; */ + +static GnomeUIInfo zoomscale_menu_display[] = { + GNOMEUIINFO_RADIOITEM_DATA(N_("0.5"), NULL, select_zoomscale, + GUINT_TO_POINTER(0), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("0.83"), NULL, select_zoomscale, + GUINT_TO_POINTER(1), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("1.0"), NULL, select_zoomscale, + GUINT_TO_POINTER(2), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("1.3"), NULL, select_zoomscale, + GUINT_TO_POINTER(3), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("1.6"), NULL, select_zoomscale, + GUINT_TO_POINTER(4), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("2"), NULL, select_zoomscale, + GUINT_TO_POINTER(5), NULL), + GNOMEUIINFO_END +}; + +static GnomeUIInfo vectorscale_menu_display[] = { + GNOMEUIINFO_RADIOITEM_DATA(N_("1"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_0), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("2"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_1), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("4"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_2), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("8"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_3), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("16"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_4), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("32"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_5), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("64"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_6), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("128"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_7), NULL), + GNOMEUIINFO_RADIOITEM_DATA(N_("256"), NULL, select_vectorscale, + GUINT_TO_POINTER(VECTOR_SCALE_8), NULL), + + GNOMEUIINFO_END +}; + + + +static GnomeUIInfo zoomscale_radiolist[] = { + GNOMEUIINFO_RADIOLIST(zoomscale_menu_display), + GNOMEUIINFO_END +}; + +static GnomeUIInfo vectorscale_radiolist[] = { + GNOMEUIINFO_RADIOLIST(vectorscale_menu_display), + GNOMEUIINFO_END +}; + + + +static GnomeUIInfo display_menu_uiinfo[] = { + GNOMEUIINFO_MENU_VIEW_TREE(view_menu_display), + GNOMEUIINFO_SUBTREE(N_("Zoom in/out"), zoomscale_radiolist), + GNOMEUIINFO_SUBTREE(N_("Vector scale"), vectorscale_radiolist), + GNOMEUIINFO_END +}; + + +#endif /* DISPLAY_MENUS_H */ diff --git a/src/gpiv_gtk.h b/src/gpiv_gtk.h new file mode 100644 index 0000000..18fff74 --- /dev/null +++ b/src/gpiv_gtk.h @@ -0,0 +1,261 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * Graphical User Interface for gpiv + * $Log: gpiv_gtk.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef GPIV_H +#define GPIV_H + +#include +#include +#include /* for the "pause" function: */ +#include +#include +#include +#include /* for isnan */ +#include +#include + +#define PROGNAME "GP_GUI." /* Abbreviation of program name; used for + error messages and parameter keys are + concatenated to it */ +#define RCSID "$Id: gpiv_gtk.h,v 1.1 2003-06-17 17:10:52 gerber Exp $" /* Revision Control System (RCS) version */ +#define ERR_IVAL = 99 /* Some arbitrary integer error value */ + +#define ADJ_MIN -50.0 /* minimum value for adjustment */ +#define ADJ_MAX 50.0 /* maximum value for adjustment */ +#define ADJ_STEP 0.001 /* Step increment for adjustment */ +#define ADJ_PAGE 0.1 /* Page increment for adjustment */ + +/* + * SVGA: 1280 x 1024 + * Sony PCR-100 video camera: 1152 x 864 + */ +#ifndef IMAGE_WIDTH_MAX +#define IMAGE_WIDTH_MAX 1280 +#endif + +#ifndef IMAGE_HEIGHT_MAX +#define IMAGE_HEIGHT_MAX 1024 +#endif + + +char IMAGE_WIDTH_LABEL[MAX_CHARS]; +char IMAGE_HEIGHT_LABEL[MAX_CHARS]; + +/* + * Extra marge for display + */ +#define VIEW_HMARGE 38 +#define VIEW_VMARGE 62 + +#define MAX_DATA (IMAGE_WIDTH_MAX / 8) /* Maximum number of data/estimators/Interr. Areas per row */ +#define MAX_BUFS 10 /* maximum number of buffers (=displays) */ + +#define MAX_SWEEP 6 + +#define THICKNESS 1 /* line thickness to be drawn in te canvases */ +#define ARROW_LENGTH 6 /* length of (piv) vector arrow head */ +#define ARROW_EDGE 6 /* edge of (piv) vector arrow head */ +#define ARROW_WIDTH 3 /* width of (piv) vector arrow head */ + +#define BITSHIFT_RED 24 /* bitshift for color red value (used in display_all_scalar_intregs) */ +#define BITSHIFT_GREEN 16 /* bitshift for color green value */ +#define BITSHIFT_BLUE 8 /* bitshift for color blue value */ + + +#include "console_interface.h" +#include "display_interface.h" + + +GtkWidget *gpiv; +gchar *msg_default, *msg_error, msg_display[40], *fname_last; + +guchar graybuf_int1[MAX_INTERR_SIZE * MAX_INTERR_SIZE]; +guchar graybuf_int2[MAX_INTERR_SIZE * MAX_INTERR_SIZE]; +guchar graybuf_cov[MAX_INTERR_SIZE * MAX_INTERR_SIZE]; + + +/* GnomeCanvasPoints *points; */ +GnomeCanvasItem *gci_img1, *gci_aoi, *gci_line; +PivData oldpiv_data, intregs_tmp; +gboolean exist_oldpiv; +gint zero_off_tmp, weight_tmp; /* used in on_radiobutton_piv_int */ +gint setby_spinbutton; /* used in on_spinbutton_piv_int and on_radiobutton_piv_int */ + +float **int_area_1, **int_area_1, **covariance; +GnomeCanvasItem *text_piv_disprocess, *gci_background_piv_disprocess, + *gci_vector_piv_disprocess; + +gfloat x_offset, x_lower, x_upper, y_offset, y_lower, y_upper; +gint enable_col_start, enable_col_end, enable_row_start, enable_row_end; +GtkWidget *gpiv_exit, *gpiv_close_buffer, *gpiv_preferences; +GdkCursor *cursor; + +gint nd_lines, nc_lines; +char fname[MAX_CHARS]; + +gboolean print_par; +gboolean exec_process, cancel_process; + +Display *display[MAX_BUFS], *display_act; + + +/* + * Parameters of gpiv: + */ +typedef struct _GpivPar GpivPar; +struct _GpivPar { + gboolean display_img1; /* display first image in display */ + gboolean display_img2; /* display second image in display */ + gboolean display_intregs; /* display interrogation regions in display */ + gboolean display_piv; /* display piv vectors in display */ + gboolean display_vor; /* display vorticity in display */ + gboolean display_sstrain; /* display shear strain in display */ + gboolean display_nstrain; /* display normal strain in display */ + gboolean display_process; /* display interrogation areas and covariance function during image analyzing process */ + gboolean show_tooltips; /* flag to show tooltips or hints (in pop-up window) */ + + gboolean process_piv; /* used by gpiv toolbar to run piv */ + gboolean process_gradient; /* used by gpiv toolbar to run gradient */ + gboolean process_resstats; /* used by gpiv toolbar to run resstats */ + gboolean process_errvec; /* used by gpiv toolbar to run errvec */ + gboolean process_peaklock; /* used by gpiv toolbar to run peaklock */ + gboolean process_average; /* used by gpiv toolbar to run average */ + gboolean process_scale; /* used by gpiv toolbar to run scale */ + gboolean process_substract; /* used by gpiv toolbar to run substract */ + gboolean process_vorstra; /* used by gpiv toolbar to run vorstra */ + + gint zoom_index; /* index for displayed zooming */ + gint vector_scale; /* scale of vectors to be displayed */ + gboolean stretch_window; /* stretch display window for image area */ + gboolean view_tabulator; /* display tabulator of process parameters in main window */ + gboolean view_gpivbuttons; /* display gpiv buttons in main window */ + gint nbins; /* number of bins to display histograms */ + gint img_width; /* number of columns in image */ + gint img_height; /* number of rows in image */ + + gboolean hdf; /* store data in hdf 5 format, with .gpi extension */ + gboolean hdf_img; /* include image data in .gpi file (hdf 5 format) */ +} default_par, gpiv_par; + + +/* + * Parameters for each process: + * ImagePar should be unique for each image + */ +ImagePar image_par; +PivEvalPar piv_eval_par; +PivValidPar piv_valid_par; +PivPostPar piv_post_par; + +char c_line[MAX_LINES_C][MAX_CHARS]; +int var_scale, nc_lines, display_intregs; +gint /* ibuf, */ nbufs; + + +enum ZoomIndex { + ZOOM_0 = 0, + ZOOM_1 = 1, + ZOOM_2 = 2, + ZOOM_3 = 3, + ZOOM_4 = 4, + ZOOM_5 = 5, +}; + + +enum VectorScale { + VECTOR_SCALE_0 = 1, + VECTOR_SCALE_1 = 2, + VECTOR_SCALE_2 = 4, + VECTOR_SCALE_3 = 8, + VECTOR_SCALE_4 = 16, + VECTOR_SCALE_5 = 32, + VECTOR_SCALE_6 = 64, + VECTOR_SCALE_7 = 128, + VECTOR_SCALE_8 = 256 +} /* v_scale */; + + +enum VectorColor { + SHOW_PEAKNR = 0, + SHOW_SNR = 1 +} v_color; + + +enum WidgetSet { + IMG = 0, + IMGPROC = 1, + EVAL = 2, + INTREGS = 3, + VALID = 4, + POST = 5 +} /* wi_set */; + + +enum MouseSelect { + NO_MS = 0, + AOI_MS = 1, + SINGLE_AREA_MS = 2, + SINGLE_POINT_MS = 3, + DRAG_MS = 4, + VLINE_MS = 5, + HLINE_MS = 6, + ENABLE_POINT_MS = 7, + DISABLE_POINT_MS = 8, + ENABLE_AREA_MS = 9, + DISABLE_AREA_MS = 10 +} m_select; + + +enum ClistPut { + PREPEND = 0, + INSERT = 1, + APPEND = 2 +}; + + +static float zfactor[] = { + 0.5, + 0.83, + 1.0, + 1.3, + 1.6, + 2.0 +}; + + +int m_select_index_y, m_select_index_x; + + +#endif /* GPIV_H */ diff --git a/src/imgh.c b/src/imgh.c new file mode 100644 index 0000000..c32feb3 --- /dev/null +++ b/src/imgh.c @@ -0,0 +1,111 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * Image header window/tabulator callbacks + * $Log: imgh.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + + +#include "gpiv_gtk.h" +#include "imgh.h" + +void +on_entry_imgh_project(GtkSpinButton *widget, + GtkWidget *entry) +{ + Imgheader * imgh = gtk_object_get_data(GTK_OBJECT(widget), "imgh"); +/* GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); */ + snprintf(image_par.project, MAX_CHARS,"%s", + gtk_entry_get_text(GTK_ENTRY(imgh->entry_project))); + image_par.project_logic = 1; + + if (display_act != NULL) { + snprintf(display_act->img.image_par.project, MAX_CHARS,"%s", + image_par.project); + display_act->img.image_par.project_logic = 1; + } +} + + +void +on_entry_imgh_crdate(GtkSpinButton *widget, + GtkWidget *entry) +{ + Imgheader * imgh = gtk_object_get_data(GTK_OBJECT(widget), "imgh"); +/* GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); */ + snprintf(image_par.creation_date, MAX_CHARS,"%s", + gtk_entry_get_text(GTK_ENTRY(imgh->entry_crdate))); + image_par.creation_date_logic = 1; + + if (display_act != NULL) { + snprintf(display_act->img.image_par.creation_date, MAX_CHARS,"%s", + image_par.creation_date); + display_act->img.image_par.creation_date_logic = 1; + } +} + + +void +on_entry_imgh_location(GtkSpinButton *widget, + GtkWidget *entry) +{ + Imgheader * imgh = gtk_object_get_data(GTK_OBJECT(widget), "imgh"); +/* GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); */ + snprintf(image_par.location, MAX_CHARS,"%s", + gtk_entry_get_text(GTK_ENTRY(imgh->entry_location))); + image_par.location_logic = 1; + + if (display_act != NULL) { + snprintf(display_act->img.image_par.location, MAX_CHARS,"%s", + image_par.location); + display_act->img.image_par.location_logic = 1; + } +} + + +void +on_entry_imgh_comment(GtkSpinButton *widget, + GtkWidget *entry) +{ + Imgheader * imgh = gtk_object_get_data(GTK_OBJECT(widget), "imgh"); +/* GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); */ + snprintf(image_par.comment, MAX_CHARS,"%s", + gtk_entry_get_text(GTK_ENTRY(imgh->entry_comment))); + image_par.comment_logic = 1; + + if (display_act != NULL) { + snprintf(display_act->img.image_par.comment, MAX_CHARS,"%s", + image_par.comment); + display_act->img.image_par.comment_logic = 1; + } +} + + diff --git a/src/imgh.h b/src/imgh.h new file mode 100644 index 0000000..f413dec --- /dev/null +++ b/src/imgh.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (callback) functions for image header + * $Log: imgh.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef IMGH_H +#define IMGH_H + +void +on_entry_imgh_project(GtkSpinButton *widget, + GtkWidget *entry); + +void +on_entry_imgh_crdate(GtkSpinButton *widget, + GtkWidget *entry); + +void +on_entry_imgh_location(GtkSpinButton *widget, + GtkWidget *entry); + +void +on_entry_imgh_comment(GtkSpinButton *widget, + GtkWidget *entry); + +#endif /* IMGH_H */ diff --git a/src/imgh_interface.c b/src/imgh_interface.c new file mode 100644 index 0000000..49955ae --- /dev/null +++ b/src/imgh_interface.c @@ -0,0 +1,835 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * Image header interface + * $Log: imgh_interface.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gpiv_gtk.h" +#include "imgh_interface.h" +#include "imgh.h" +#include "pivpost.h" + + + +Imgheader * +create_imgh (GtkWidget *main_window, + GtkWidget *container) +/* + * Image Info window with data from header + */ +{ + Imgheader * imgh = g_new0(Imgheader, 1); + + imgh->tooltips = gtk_tooltips_new(); + + imgh->vbox_label = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(imgh->vbox_label); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_vbox_label", + imgh->vbox_label, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->vbox_label); + gtk_container_add(GTK_CONTAINER(container), + imgh->vbox_label); + + + + imgh->label_title = gtk_label_new(_("Image Header Info")); + gtk_widget_ref(imgh->label_title); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh->label_title", + imgh->label_title, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_title); + gtk_box_pack_start(GTK_BOX(imgh->vbox_label), + imgh->label_title, + FALSE, + FALSE, + 0); + + + +/* + * Scrolled window + */ + imgh->vbox_scroll = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(imgh->vbox_scroll); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_vbox_scroll", + imgh->vbox_scroll, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->vbox_scroll); + gtk_box_pack_start(GTK_BOX(imgh->vbox_label), + imgh->vbox_scroll, + TRUE, + TRUE, + 0); + + + + imgh->scrolledwindow = gtk_scrolled_window_new(NULL, + NULL); + gtk_widget_ref(imgh->scrolledwindow); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_scrolledwindow", + imgh->scrolledwindow, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->scrolledwindow); + gtk_box_pack_start(GTK_BOX(imgh->vbox_scroll), + imgh->scrolledwindow, + TRUE, + TRUE, + 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW + (imgh->scrolledwindow), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + + + + imgh->viewport = gtk_viewport_new(NULL, + NULL); + gtk_widget_ref(imgh->viewport); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_viewport", + imgh->viewport, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->viewport); + gtk_container_add(GTK_CONTAINER(imgh->scrolledwindow), + imgh->viewport); + +/* + * main table for image header table/window + */ + imgh->vbox1 = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(imgh->vbox1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh->vbox1", + imgh->vbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->vbox1); + gtk_container_add(GTK_CONTAINER(imgh->viewport), + imgh->vbox1); + + +/* + * buffer number +*/ + imgh->hbox_bufno = gtk_hbox_new(FALSE, + 0); + gtk_widget_ref(imgh->hbox_bufno); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_hbox_bufno", + imgh->hbox_bufno, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->hbox_bufno); + gtk_box_pack_start(GTK_BOX(imgh->vbox1), + imgh->hbox_bufno, + TRUE, + TRUE, + 0); + + + + imgh->label_label_bufno = gtk_label_new(_("buffer #: ")); + gtk_widget_ref(imgh->label_label_bufno); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_label_bufno", + imgh->label_label_bufno, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_label_bufno); + gtk_box_pack_start(GTK_BOX(imgh->hbox_bufno), + imgh->label_label_bufno, + FALSE, + FALSE, + 0); + + + + imgh->label_bufno = gtk_label_new(""); + gtk_widget_ref(imgh->label_bufno); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imh_label_bufno", + imgh->label_bufno, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_bufno); + gtk_box_pack_start(GTK_BOX(imgh->hbox_bufno), + imgh->label_bufno, + FALSE, + FALSE, + 0); + + + +/* + * buffer name +*/ + imgh->hbox_name = gtk_hbox_new(FALSE, + 0); + gtk_widget_ref(imgh->hbox_name); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh->hbox_name", + imgh->hbox_name, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->hbox_name); + gtk_box_pack_start(GTK_BOX(imgh->vbox1), + imgh->hbox_name, + TRUE, + TRUE, + 0); + + + + imgh->label_label_name = gtk_label_new(_("name: ")); + gtk_widget_ref(imgh->label_label_name); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_label_name", + imgh->label_label_name, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_label_name); + gtk_box_pack_start(GTK_BOX(imgh->hbox_name), + imgh->label_label_name, + FALSE, + FALSE, + 0); + + + + imgh->label_name = gtk_label_new(""); + gtk_widget_ref(imgh->label_name); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_name", + imgh->label_name, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_name); + gtk_box_pack_start(GTK_BOX(imgh->hbox_name), + imgh->label_name, + FALSE, + FALSE, + 0); + + + + imgh->table5 = gtk_table_new(2, + 8, + FALSE); + gtk_widget_ref(imgh->table5); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh->table5", + imgh->table5, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->table5); + gtk_box_pack_start(GTK_BOX(imgh->vbox1), + imgh->table5, + TRUE, + FALSE, + 0); +/* viewport_imgh */ + +/* + * label for ncols + */ + imgh->label_label_ncols = gtk_label_new(_("number of columns: ")); + gtk_widget_ref(imgh->label_label_ncols); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_label_ncols", + imgh->label_label_ncols, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_label_ncols); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->label_label_ncols, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND), + (GtkAttachOptions) (0), + 0, + 0); + + + + imgh->label_ncols = gtk_label_new(IMAGE_WIDTH_LABEL); + gtk_widget_ref(imgh->label_ncols); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_ncols", + imgh->label_ncols, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_ncols); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->label_ncols, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + +/* + * label for nrows + */ + imgh->label_label_nrows = gtk_label_new(_("number of rows: ")); + gtk_widget_ref(imgh->label_label_nrows); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imh_label_label_nrows", + imgh->label_label_nrows, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_label_nrows); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->label_label_nrows, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + imgh->label_nrows = gtk_label_new(IMAGE_HEIGHT_LABEL); + gtk_widget_ref(imgh->label_nrows); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imh_label_nrows", + imgh->label_nrows, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_nrows); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->label_nrows, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + +/* + * spinner for spatial scale "sscale" + */ + imgh->label_sscale = gtk_label_new(_("spatial scale (mm/px): ")); + gtk_widget_ref(imgh->label_sscale); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_sscale", + imgh->label_sscale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_sscale); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->label_sscale, + 0, + 1, + 2, + 3, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + imgh->spinbutton_adj_sscale = + gtk_adjustment_new(image_par.s_scale, + 0, + ADJ_MAX, + ADJ_STEP, + ADJ_PAGE, + ADJ_MAX); + + + + imgh->spinbutton_sscale = + gtk_spin_button_new(GTK_ADJUSTMENT(imgh->spinbutton_adj_sscale), + 1, + 4); + gtk_widget_ref(imgh->spinbutton_sscale); + gtk_widget_show(imgh->spinbutton_sscale); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->spinbutton_sscale, + 1, + 2, + 2, + 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(imgh->spinbutton_sscale), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(imgh->spinbutton_sscale), + TRUE); + + gtk_object_set_data(GTK_OBJECT(imgh->spinbutton_sscale), + "var_type", + "3"); + gtk_signal_connect(GTK_OBJECT(imgh->spinbutton_sscale), + "changed", + on_spinbutton_post_scale, + imgh->spinbutton_sscale); + + + +/* + * spinner for time scale "tscale" + */ + imgh->label_tscale = gtk_label_new(_("time scale (ms): ")); + gtk_widget_ref(imgh->label_tscale); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_tscale", + imgh->label_tscale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_tscale); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->label_tscale, + 0, + 1, + 3, + 4, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + imgh->spinbutton_adj_tscale = + gtk_adjustment_new(image_par.t_scale, + 0, + ADJ_MAX, + ADJ_STEP, + ADJ_PAGE, + ADJ_MAX); + + + + imgh->spinbutton_tscale = + gtk_spin_button_new(GTK_ADJUSTMENT(imgh->spinbutton_adj_tscale), + 1, + 4); + gtk_widget_ref(imgh->spinbutton_tscale); + gtk_widget_show(imgh->spinbutton_tscale); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->spinbutton_tscale, + 1, + 2, + 3, + 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(imgh->spinbutton_tscale), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(imgh->spinbutton_tscale), + TRUE); + + gtk_object_set_data(GTK_OBJECT(imgh->spinbutton_tscale), + "var_type", + "4"); + gtk_signal_connect(GTK_OBJECT(imgh->spinbutton_tscale), + "changed", + on_spinbutton_post_scale, + imgh->spinbutton_tscale); + + + + imgh->table2 = gtk_table_new(4, + 2, + FALSE); + gtk_widget_ref(imgh->table2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh->table2", + imgh->table2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->table2); + gtk_box_pack_end(GTK_BOX(imgh->vbox1), + imgh->table2, + TRUE, + FALSE, + 0); + +/* + * spinner for column position + */ + imgh->label_colpos = gtk_label_new(_("position of column #0 (m): ")); + gtk_widget_ref(imgh->label_colpos); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_colpos", + imgh->label_colpos, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_colpos); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->label_colpos, + 0, + 1, + 4, + 5, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + + imgh->spinbutton_adj_colpos = + gtk_adjustment_new(image_par.z_off_x, + ADJ_MIN, + ADJ_MAX, + ADJ_STEP, + ADJ_PAGE, + ADJ_MAX); + + + + imgh->spinbutton_colpos = + gtk_spin_button_new(GTK_ADJUSTMENT(imgh->spinbutton_adj_colpos), + 1, + 4); + gtk_widget_ref(imgh->spinbutton_colpos); + gtk_widget_show(imgh->spinbutton_colpos); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->spinbutton_colpos, + 1, + 2, + 4, + 5, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(imgh->spinbutton_colpos), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(imgh->spinbutton_colpos), + TRUE); + + gtk_object_set_data(GTK_OBJECT(imgh->spinbutton_colpos), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(imgh->spinbutton_colpos), + "changed", + on_spinbutton_post_scale, + imgh->spinbutton_colpos); + + + +/* + * spinner for row position + */ + imgh->label_rowpos = gtk_label_new(_("position of row #0 (m): ")); + gtk_widget_ref(imgh->label_rowpos); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_rowpos", + imgh->label_rowpos, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_rowpos); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->label_rowpos, + 0, + 1, + 5, + 6, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + imgh->spinbutton_adj_rowpos = + gtk_adjustment_new(image_par.z_off_y, + ADJ_MIN, + ADJ_MAX, + ADJ_STEP, + ADJ_PAGE, + ADJ_MAX); + + + + imgh->spinbutton_rowpos = + gtk_spin_button_new(GTK_ADJUSTMENT(imgh->spinbutton_adj_rowpos), + 1, + 4); + gtk_widget_ref(imgh->spinbutton_rowpos); + gtk_widget_show(imgh->spinbutton_rowpos); + gtk_table_attach(GTK_TABLE(imgh->table5), + imgh->spinbutton_rowpos, + 1, + 2, + 5, + 6, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(imgh->spinbutton_rowpos), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(imgh->spinbutton_rowpos), + TRUE); + + gtk_object_set_data(GTK_OBJECT(imgh->spinbutton_rowpos), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(imgh->spinbutton_rowpos), + "changed", + on_spinbutton_post_scale, + imgh->spinbutton_rowpos); + + + +/* + * entry for project + */ + imgh->label_project = gtk_label_new(_("Project: ")); + gtk_widget_ref(imgh->label_project); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_project", + imgh->label_project, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_project); + gtk_table_attach(GTK_TABLE(imgh->table2), + imgh->label_project, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_misc_set_padding(GTK_MISC(imgh->label_project), + 14, + 0); + + + + imgh->entry_project = gtk_entry_new(); + gtk_widget_ref(imgh->entry_project); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_entry_project", + imgh->entry_project, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->entry_project); + gtk_table_attach(GTK_TABLE(imgh->table2), + imgh->entry_project, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + gtk_object_set_data(GTK_OBJECT(imgh->entry_project), + "imgh", + imgh); + gtk_signal_connect(GTK_OBJECT(imgh->entry_project), + "changed", + on_entry_imgh_project, + imgh->entry_project); + + +/* + * entry for creation date + */ + imgh->label_crdate = gtk_label_new(_("Creation date: ")); + gtk_widget_ref(imgh->label_crdate); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_crdate", + imgh->label_crdate, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_crdate); + gtk_table_attach(GTK_TABLE(imgh->table2), + imgh->label_crdate, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_misc_set_alignment(GTK_MISC(imgh->label_crdate), + 2.98023e-07, + 0.5); + gtk_misc_set_padding(GTK_MISC(imgh->label_crdate), + 11, + 0); + + + + imgh->entry_crdate = gtk_entry_new(); + gtk_widget_ref(imgh->entry_crdate); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_entry_crdate", + imgh->entry_crdate, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->entry_crdate); + gtk_table_attach(GTK_TABLE(imgh->table2), + imgh->entry_crdate, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + gtk_object_set_data(GTK_OBJECT(imgh->entry_crdate), + "imgh", + imgh); + gtk_signal_connect(GTK_OBJECT(imgh->entry_crdate), + "changed", + on_entry_imgh_crdate, + imgh->entry_crdate); + +/* + * entry for location + */ + imgh->label_location = gtk_label_new(_("Place: ")); + gtk_widget_ref(imgh->label_location); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_location", + imgh->label_location, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_location); + gtk_table_attach(GTK_TABLE(imgh->table2), + imgh->label_location, + 0, + 1, + 2, + 3, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_misc_set_alignment(GTK_MISC(imgh->label_location), + 0, + 0.5); + gtk_misc_set_padding(GTK_MISC(imgh->label_location), + 19, + 0); + + + + imgh->entry_location = gtk_entry_new(); + gtk_widget_ref(imgh->entry_location); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_entry_location", + imgh->entry_location, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->entry_location); + gtk_table_attach(GTK_TABLE(imgh->table2), + imgh->entry_location, + 1, + 2, + 2, + 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + gtk_object_set_data(GTK_OBJECT(imgh->entry_location), + "imgh", + imgh); + gtk_signal_connect(GTK_OBJECT(imgh->entry_location), + "changed", + on_entry_imgh_location, + imgh->entry_location); + +/* + * entry for comment + */ + imgh->label_comment = gtk_label_new(_("Comment: ")); + gtk_widget_ref(imgh->label_comment); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_label_comment", + imgh->label_comment, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->label_comment); + gtk_table_attach(GTK_TABLE(imgh->table2), + imgh->label_comment, + 0, + 1, + 3, + 4, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + imgh->entry_comment = gtk_entry_new(); + gtk_widget_ref(imgh->entry_comment); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "imgh_entry_comment", + imgh->entry_comment, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(imgh->entry_comment); + gtk_table_attach(GTK_TABLE(imgh->table2), + imgh->entry_comment, + 1, + 2, + 3, + 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + gtk_object_set_data(GTK_OBJECT(imgh->entry_comment), + "imgh", + imgh); + gtk_signal_connect(GTK_OBJECT(imgh->entry_comment), + "changed", + on_entry_imgh_comment, + imgh->entry_comment); + + return imgh; +} diff --git a/src/imgh_interface.h b/src/imgh_interface.h new file mode 100644 index 0000000..82eff84 --- /dev/null +++ b/src/imgh_interface.h @@ -0,0 +1,97 @@ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * Image header tab + * $Log: imgh_interface.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ +#ifndef GPIV_IMGH_INTERFACE_H +#define GPIV_IMGH_INTERFACE_H + + +typedef struct _Imgheader Imgheader; +struct _Imgheader { + GtkTooltips *tooltips; + + GtkWidget *vbox_label; + GtkWidget *label_title; + + GtkWidget *vbox_scroll; + GtkWidget *scrolledwindow; + GtkWidget *viewport; + GtkWidget *vbox1; + + GtkWidget *hbox_bufno; + GtkWidget *label_label_bufno; + GtkWidget *label_bufno; + GtkWidget *hbox_name; + GtkWidget *label_label_name; + GtkWidget *label_name; + GtkWidget *table5; + + GtkWidget *label_label_ncols; + GtkWidget *label_ncols; + GtkWidget *label_label_nrows; + GtkWidget *label_nrows; + + GtkWidget *label_colpos; + GtkObject *spinbutton_adj_colpos; + GtkWidget *spinbutton_colpos; + + GtkWidget *label_rowpos; + GtkObject *spinbutton_adj_rowpos; + GtkWidget *spinbutton_rowpos; + + GtkWidget *label_sscale; + GtkObject *spinbutton_adj_sscale; + GtkWidget *spinbutton_sscale; + + GtkWidget *label_tscale; + GtkObject *spinbutton_adj_tscale; + GtkWidget *spinbutton_tscale; + + GtkWidget *table2; + GtkWidget *label_project; + GtkWidget *entry_project; + + GtkWidget *label_crdate; + GtkWidget *entry_crdate; + + GtkWidget *label_location; + GtkWidget *entry_location; + + GtkWidget *label_comment; + GtkWidget *entry_comment; +}; + +Imgheader * +create_imgh(GtkWidget *main_window, + GtkWidget *container); + +#endif /* GPIV_IMGH_INTERFACE_H */ diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..dbc5ca0 --- /dev/null +++ b/src/main.c @@ -0,0 +1,614 @@ +/* -*- Mode1: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * main routines of gpiv + * $Log: main.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + + +/* ---------- some header inclusions for gtk/gnome (by glade) --*/ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "support.h" + +#include "gpiv_gtk.h" /* all variables are read by a header */ +#include "console.h" +/* #include "console_interface.h" */ +#include "utils.h" + + +#define USAGE "\ +Usage: gpiv-gui [-f filename][-s N][-t] \n\ +\n\ +keys: \n\ +-f filename: loads project \n\ +-s N: vector scale N \n\ +-t: show tooltips \n" + +/* [-p] */ +/* -p: print parameters and other info to stdout \n\ */ + +#define HELP "\n\ +gpiv processes and analyzes images for (Digital) Particle Image \n\ +Velocimetry, post-processes the PIV data and visualizes its \n\ +results in a graphical way. \n" + +/*-- General variables */ + + + +/*-- Function prototypes ---------------------------------------*/ +/*-- General functions (only called by main) -----------------*/ + +int main(int argc, char *argv[]) +/*-------------------------------------------------------------------------*/ +/*---- Main program of gpiv-gui -------------------------------------------*/ +{ + + gboolean used_default = 0; + gchar *msg = "Welcome to gpiv."; + GtkWidget *menu_gpiv_popup = NULL; + GpivConsole *gpiv = NULL; + + static const struct poptOption options[] = { +/* {NULL, 'q', POPT_ARG_NONE, &q, 0, */ +/* N_("Explain gpiv"), NULL}, */ + + {"bins", 'b', POPT_ARG_INT, &gpiv_par.nbins, 0, + N_("number of bins for histograms"), N_("BINS")}, + + {"columns", 'c', POPT_ARG_INT, &gpiv_par.img_width, 0, + N_("number of columns in image"), N_("NCOLUMNS")}, + + {"rows", 'r', POPT_ARG_INT, &gpiv_par.img_height, 0, + N_("number of rows in image"), N_("NROWS")}, + + {"display_img1", '\0', POPT_ARG_NONE, &gpiv_par.display_img1, 0, + N_("enables displaying of the first image of a PIV image pair"), + NULL}, + + {"display_img2", '\0', POPT_ARG_NONE, &gpiv_par.display_img2, 0, + N_("enables displaying of the second image of a PIV image pair"), + NULL}, + + {"display_intregs", '\0', POPT_ARG_NONE, &gpiv_par.display_intregs, 0, + N_("enables displaying of interrogation regions"), NULL}, + + {"display_piv", '\0', POPT_ARG_NONE, &gpiv_par.display_piv, 0, + N_("enables displaying of PIV data"), NULL}, + + {"display_vor", '\0', POPT_ARG_NONE, &gpiv_par.display_vor, 0, + N_("enables displaying of vorticity data"), NULL}, + + {"display_sstrain", '\0', POPT_ARG_NONE, &gpiv_par.display_sstrain, 0, + N_("enables displaying of shear strain data"), NULL}, + + {"display_nstrain", '\0', POPT_ARG_NONE, &gpiv_par.display_nstrain, 0, + N_("enables displaying of normal strain data"), NULL}, + + {"hdf", '\0', POPT_ARG_NONE, &gpiv_par.hdf, 0, + N_("save data in hdf5 format with .gpi extension"), NULL}, + {"hdf_img", '\0', POPT_ARG_NONE, &gpiv_par.hdf_img, 0, + N_("include image data in .gpi file (hdf5 format)"), NULL}, + + {"print", 'p', POPT_ARG_NONE, &print_par, 0, + N_("print parameters and other info to stdout"), NULL}, + + {"proc_piv", '\0', POPT_ARG_NONE, &gpiv_par.process_piv, 0, + N_("includes piv in the chain-proces"), NULL}, + + {"proc_gradient", '\0', POPT_ARG_NONE, &gpiv_par.process_gradient, 0, + N_("includes gradient in the chain-proces"), NULL}, + + {"proc_resstats", '\0', POPT_ARG_NONE, &gpiv_par.process_resstats, 0, + N_("includes resstats in the chain-proces"), NULL}, + + {"proc_errvec", '\0', POPT_ARG_NONE, &gpiv_par.process_errvec, 0, + N_("includes validate in the chain-proces"), NULL}, + + {"proc_peaklock", '\0', POPT_ARG_NONE, &gpiv_par.process_peaklock, 0, + N_("includes peaklock in the chain-proces"), NULL}, + + {"proc_average", '\0', POPT_ARG_NONE, &gpiv_par.process_average, 0, + N_("includes average in the chain-proces"), NULL}, + + {"proc_scale", '\0', POPT_ARG_NONE, &gpiv_par.process_scale, 0, + N_("includes scaling in the chain-proces"), NULL}, + + {"proc_substract", '\0', POPT_ARG_NONE, &gpiv_par.process_substract, 0, + N_("includes substract in the chain-proces"), NULL}, + + {"proc_vorstra", '\0', POPT_ARG_NONE, &gpiv_par.process_vorstra, 0, + N_("includes vorticity in the chain-proces"), NULL}, + + {"zoomscale", 'z', POPT_ARG_INT, &gpiv_par.zoom_index, 0, + N_("display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0"), + N_("SCALE")}, + + {"vectorscale", 's', POPT_ARG_INT, &gpiv_par.vector_scale, 0, + N_("vector length scale"), N_("SCALE")}, + +/* {"stretch_window", '\0', POPT_ARG_NONE, &gpiv_par.stretch_window, 0, */ +/* N_("stretch display window to fit image area "), NULL}, */ + + {"tooltips", 't', POPT_ARG_NONE, &gpiv_par.show_tooltips, 0, + N_("show tooltips"), NULL}, + + {"view_gpivbuttons", '\0', POPT_ARG_NONE, &gpiv_par.view_gpivbuttons, 0, + N_("view the gpiv buttons of the application"), NULL}, + + {"view_tabulator", '\0', POPT_ARG_NONE, &gpiv_par.view_tabulator, 0, + N_("view the tabulator of the application"), NULL}, + + {NULL, '\0', 0, NULL, 0} + }; + +#ifdef ENABLE_NLS + bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR); + textdomain(PACKAGE); +#endif + +/* + * parameter initializing of gpiv-gtk + */ + msg_default = ""; + + +/* + * Reading paramenters from gnome parameter file (~/.gnome/gpiv) + * See: http://developer.gnome.org/doc/GGAD/z79.html + */ + + gnome_config_push_prefix("/gpiv/General/"); + + print_par = + gnome_config_get_bool_with_default("print_par=TRUE", &used_default); + if (used_default) { + g_warning("print_par = %d from default", print_par); + gnome_config_set_bool("print_par", print_par); + } + + default_par.show_tooltips = + gnome_config_get_bool_with_default("show_tooltips=TRUE", &used_default); + if (used_default) { + g_warning("show_tooltips = %d from default", default_par.show_tooltips); + gnome_config_set_bool("show_tooltips", default_par.show_tooltips); + } + + default_par.view_gpivbuttons = + gnome_config_get_bool_with_default("view_gpivbuttons=TRUE", + &used_default); + if (used_default) { + g_warning("view_gpivbuttons = %d from default", default_par.view_gpivbuttons); + gnome_config_set_bool("view_gpivbuttons", default_par.view_gpivbuttons); + } + + default_par.view_tabulator = + gnome_config_get_bool_with_default("view_tabulator=TRUE", &used_default); + if (used_default) { + g_warning("view_tabulator = %d from default", default_par.view_tabulator); + gnome_config_set_bool("view_tabulator", default_par.view_tabulator); + } + + default_par.nbins = + gnome_config_get_int_with_default("nbins=10", &used_default); + if (used_default) { + g_warning("nbins = %d from default", default_par.nbins); + gnome_config_set_int("nbins", default_par.nbins); + } + + default_par.img_width = + gnome_config_get_int_with_default("columns=256", &used_default); + if (used_default) { + g_warning("img_width = %d from default", default_par.img_width); + gnome_config_set_int("columns", default_par.img_width); + } + + default_par.img_height = + gnome_config_get_int_with_default("rows=256", &used_default); + if (used_default) { + g_warning("img_height = %d from default", default_par.img_height); + gnome_config_set_int("rows", default_par.img_height); + } + + default_par.hdf = + gnome_config_get_bool_with_default("hdf=FALSE", &used_default); + if (used_default) { + g_warning("hdf = %d from default ??", default_par.hdf); + gnome_config_set_bool("hdf", default_par.hdf); + } + + default_par.hdf_img = + gnome_config_get_bool_with_default("hdf_img=FALSE", &used_default); + if (used_default) { + g_warning("hdf_img = %d from default ??", default_par.hdf_img); + gnome_config_set_bool("hdf_img", default_par.hdf_img); + } + + + + gnome_config_push_prefix("/gpiv/Processes/"); + + default_par.process_piv = + gnome_config_get_bool_with_default("process_piv=TRUE", &used_default); + if (used_default) { + g_warning("process_piv = %d from default", default_par.process_piv); + gnome_config_set_bool("process_piv", default_par.process_piv); + } + + default_par.process_gradient = + gnome_config_get_bool_with_default("process_gradient=FALSE", &used_default); + if (used_default) { + g_warning("process_gradient = %d from default", default_par.process_gradient); + gnome_config_set_bool("process_gradient", default_par.process_gradient); + } + + default_par.process_resstats = + gnome_config_get_bool_with_default("process_resstats=FALSE", &used_default); + if (used_default) { + g_warning("process_resstats = %d from default", default_par.process_resstats); + gnome_config_set_bool("process_resstats", default_par.process_resstats); + } + + default_par.process_errvec = + gnome_config_get_bool_with_default("process_errvec=FALSE", &used_default); + if (used_default) { + g_warning("process_errvec = %d from default", default_par.process_errvec); + gnome_config_set_bool("process_errvec", default_par.process_errvec); + } + + default_par.process_peaklock = + gnome_config_get_bool_with_default("process_peaklock=FALSE", &used_default); + if (used_default) { + g_warning("process_peaklock = %d from default", default_par.process_peaklock); + gnome_config_set_bool("process_peaklock", default_par.process_peaklock); + } + + default_par.process_average = + gnome_config_get_bool_with_default("process_average=FALSE", &used_default); + if (used_default) { + g_warning("process_average = %d from default", default_par.process_average); + gnome_config_set_bool("process_average", default_par.process_average); + } + + default_par.process_scale = + gnome_config_get_bool_with_default("process_scale=FALSE", &used_default); + if (used_default) { + g_warning("process_scale = %d from default", default_par.process_scale); + gnome_config_set_bool("process_scale", default_par.process_scale); + } + + default_par.process_substract = + gnome_config_get_bool_with_default("process_substract=FALSE", &used_default); + if (used_default) { + g_warning("process_substract = %d from default", default_par.process_substract); + gnome_config_set_bool("process_substract", default_par.process_substract); + } + + default_par.process_vorstra = + gnome_config_get_bool_with_default("process_vorstra=FALSE", &used_default); + if (used_default) { + g_warning("process_vorstra = %d from default", default_par.process_vorstra); + gnome_config_set_bool("process_vorstra", default_par.process_vorstra); + } + + + + gnome_config_push_prefix("/gpiv/Display/"); + + default_par.zoom_index = + gnome_config_get_int_with_default("zoom_index=0", &used_default); + if (used_default) { + g_warning("zoom_index = %d from default", default_par.zoom_index); + gnome_config_set_int("zoom_index", default_par.zoom_index); + } + + default_par.vector_scale = + gnome_config_get_int_with_default("vector_scale=8", &used_default); + if (used_default) { + g_warning("vector_scale = %d from default", default_par.vector_scale); + gnome_config_set_int("vector_scale", default_par.vector_scale); + } + +/* default_par.stretch_window = */ +/* gnome_config_get_int_with_default("stretch_window=0", &used_default); */ +/* if (used_default) { */ +/* g_warning("stretch_window = %d from default", */ +/* default_par.stretch_window); */ +/* gnome_config_set_int("stretch_window", default_par.stretch_window); */ +/* } */ + + default_par.display_img1 = + gnome_config_get_bool_with_default("display_img1=FALSE", + &used_default); + if (used_default) { + g_warning("display_img1 = %d from default", + default_par.display_img1); + gnome_config_set_bool("display_img1", default_par.display_img1); + } + + default_par.display_img2 = + gnome_config_get_bool_with_default("display_img2=FALSE", + &used_default); + if (used_default) { + g_warning("display_img2 = %d from default", + default_par.display_img2); + gnome_config_set_bool("display_img2", default_par.display_img1); + } + + default_par.display_intregs = + gnome_config_get_bool_with_default("display_intregs=TRUE", &used_default); + if (used_default) { + g_warning("display_intregs = %d from default", default_par.display_intregs); + gnome_config_set_bool("display_intregs", default_par.display_intregs); + } + + default_par.display_piv = + gnome_config_get_bool_with_default("display_piv=TRUE", &used_default); + if (used_default) { + g_warning("display_piv = %d from default", default_par.display_piv); + gnome_config_set_bool("display_piv", default_par.display_piv); + } + + default_par.display_vor = + gnome_config_get_bool_with_default("display_vor=TRUE", &used_default); + if (used_default) { + g_warning("display_vor = %d from default", default_par.display_vor); + gnome_config_set_bool("display_vor", default_par.display_vor); + } + + default_par.display_sstrain = + gnome_config_get_bool_with_default("display_sstrain=TRUE", &used_default); + if (used_default) { + g_warning("display_sstrain = %d from default", default_par.display_sstrain); + gnome_config_set_bool("display_sstrain", default_par.display_sstrain); + } + + default_par.display_nstrain = + gnome_config_get_bool_with_default("display_nstrain=TRUE", &used_default); + if (used_default) { + g_warning("display_nstrain = %d from default", default_par.display_nstrain); + gnome_config_set_bool("display_nstrain", default_par.display_nstrain); + } + + gnome_config_pop_prefix(); + + gpiv_par.show_tooltips = default_par.show_tooltips; + gpiv_par.view_tabulator = default_par.view_tabulator; + gpiv_par.view_gpivbuttons = default_par.view_gpivbuttons; + gpiv_par.nbins = default_par.nbins; + gpiv_par.img_width = default_par.img_width; + gpiv_par.img_height = default_par.img_height; + gpiv_par.process_piv = default_par.process_piv; + gpiv_par.process_gradient = default_par.process_gradient; + gpiv_par.process_resstats = default_par.process_resstats; + gpiv_par.process_errvec = default_par.process_errvec; + gpiv_par.process_peaklock = default_par.process_peaklock; + gpiv_par.process_average = default_par.process_average; + gpiv_par.process_scale = default_par.process_scale; + gpiv_par.process_substract = default_par.process_substract; + gpiv_par.process_vorstra = default_par.process_vorstra; + gpiv_par.zoom_index = default_par.zoom_index; + gpiv_par.vector_scale = default_par.vector_scale; +/* gpiv_par.stretch_window = default_par.stretch_window; */ + gpiv_par.display_img1 = default_par.display_img1; + gpiv_par.display_img2 = default_par.display_img2; + gpiv_par.display_intregs = default_par.display_intregs; + gpiv_par.display_piv = default_par.display_piv; + gpiv_par.display_vor = default_par.display_vor; + gpiv_par.display_sstrain = default_par.display_sstrain; + gpiv_par.display_nstrain = default_par.display_nstrain; + gpiv_par.hdf = default_par.hdf; + gpiv_par.hdf_img = default_par.hdf_img; + + + +/* piv_data.nx = MAX_DATA; */ +/* piv_data.ny = MAX_DATA; */ + +/* + * variables initializing of gpiv-gui + */ + + gnome_config_push_prefix("/gpiv/RuntimeVariables/"); + +/* HOME_DIR=getenv("HOME"); */ + fname_last = + gnome_config_get_string_with_default("fname_last=./", &used_default); + if (used_default) { + g_warning("fname_last = %s from default", fname_last); + gnome_config_set_string("fname_last", fname_last); + } + + m_select = 0; + nbufs = 0; + + exec_process = FALSE; + cancel_process = FALSE; + + display_act = NULL; + + memset(graybuf_int1, 215, + (sizeof(guchar)) * (MAX_INTERR_SIZE * MAX_INTERR_SIZE)); + memset(graybuf_int2, 215, + (sizeof(guchar)) * (MAX_INTERR_SIZE * MAX_INTERR_SIZE)); + memset(graybuf_cov, 215, + (sizeof(guchar)) * (MAX_INTERR_SIZE * MAX_INTERR_SIZE)); +/* memset( graybuf_cov, 255, (sizeof (guchar)) *(MAX_INTERR_SIZE * MAX_INTERR_SIZE)); */ + +/* nd_lines = 0; */ +/* nc_lines = 0; */ + + gci_vector_piv_disprocess = NULL; + gci_img1 = NULL; + gci_aoi = NULL; + gci_line = NULL; + + g_snprintf(IMAGE_WIDTH_LABEL, MAX_CHARS, "%d", gpiv_par.img_width); + g_snprintf(IMAGE_HEIGHT_LABEL,MAX_CHARS, "%d", gpiv_par.img_height); + +/* + * parameter initializing of image + */ + image_par.nbits_logic = 0; + image_par.ncolumns_logic = 0; + image_par.nrows_logic = 0; + image_par.x_corr_logic = 0; + image_par.s_scale_logic = 0; + image_par.t_scale_logic = 0; + image_par.z_off_logic = 0; + image_par.project_logic = 0; + image_par.creation_date_logic = 0; + image_par.location_logic = 0; + image_par.comment_logic = 0; + + +/* + * parameter initializing of piv_eval + */ + piv_eval_par.autokey_logic = 0; + piv_eval_par.col_start_logic = 0; + piv_eval_par.col_end_logic = 0; + piv_eval_par.int_geo_logic = 0; + piv_eval_par.ifit_logic = 0; + piv_eval_par.int_line_row_logic = 0; + piv_eval_par.int_line_row_start_logic = 0; + piv_eval_par.int_line_row_end_logic = 0; + piv_eval_par.int_line_col_logic = 0; + piv_eval_par.int_line_col_start_logic = 0; + piv_eval_par.int_line_col_end_logic = 0; + piv_eval_par.int_point_col_logic = 0; + piv_eval_par.int_point_row_logic = 0; + piv_eval_par.int_size = 0; + piv_eval_par.int_size_1_logic = 0; + piv_eval_par.int_size_2_logic = 0; + piv_eval_par.int_shift_logic = 0; + piv_eval_par.old_piv_logic = 0; + piv_eval_par.pre_shift_col_logic = 0; + piv_eval_par.peak_logic = 0; + piv_eval_par.pre_shift_row_logic = 0; + piv_eval_par.print_par_logic = 0; + piv_eval_par.print_piv_logic = 0; + piv_eval_par.print_cov_logic = 0; + piv_eval_par.row_start_logic = 0; + piv_eval_par.row_end_logic = 0; + piv_eval_par.weight_logic = 0; + piv_eval_par.zero_off_logic = 0; + piv_eval_par.central_diff_logic = 0; + + +/* + * parameter initializing of piv_valid + */ + piv_valid_par.auto_thresh_logic = 0; + piv_valid_par.residu_max_logic = 0; + piv_valid_par.res_stats_logic = 0; + piv_valid_par.data_yield_logic = 0; + piv_valid_par.residu_type_logic = 0; + piv_valid_par.subst_type_logic = 0; + piv_valid_par.histo_type_logic = 0; + +/* + * parameter initializing of piv_post + */ + piv_post_par.z_off_d_logic = 0; + + piv_post_par.diff_type_logic = 0; + piv_post_par.operator_vorstra_logic = 0; + +/* + * command line keys: using POPT + */ + + gnome_init_with_popt_table("GPIV", VERSION, argc, argv, + options, 0, NULL); + gdk_rgb_init(); + + g_warning("main::gpiv_par.display_img1 = %d", gpiv_par.display_img1); + + gpiv_scan_resourcefiles(IMAGE_PAR_KEY, &image_par, print_par); + gpiv_scan_resourcefiles(EVAL_PAR_KEY, &piv_eval_par, print_par); + gpiv_scan_resourcefiles(VALID_PAR_KEY, &piv_valid_par, print_par); + gpiv_scan_resourcefiles(POST_PAR_KEY, &piv_post_par, print_par); + +/* checking image_par is done in open_img (concole.c) */ +/* gpiv_img_check_header_read(image_par); */ + gpiv_piv_check_parameters_read(piv_eval_par); + gpiv_valid_check_parameters_read(piv_valid_par); + gpiv_post_check_parameters_read(piv_post_par); + + + if(gpiv_par.img_width <= IMAGE_WIDTH_MAX + && gpiv_par.img_height <= IMAGE_HEIGHT_MAX) { + image_par.ncolumns = gpiv_par.img_width; + image_par.ncolumns_logic = 1; + image_par.nrows = gpiv_par.img_height; + image_par.nrows_logic = 1; + + if (print_par) + gtk_warning(_("image width = %d image height = %d"), + gpiv_par.img_width, gpiv_par.img_height); + gpiv = create_gpiv(); + gtk_widget_show(gpiv->console); + + menu_gpiv_popup = create_menu_gpiv_popup(gpiv); + gtk_signal_connect_object(GTK_OBJECT(gpiv->console), + "button_press_event", + GTK_SIGNAL_FUNC (on_my_popup_handler), + GTK_OBJECT(menu_gpiv_popup)); + + gnome_appbar_set_default(GNOME_APPBAR(gpiv->appbar), msg_default); + gnome_appbar_push(GNOME_APPBAR(gpiv->appbar), msg); + + if(gpiv_par.show_tooltips) { + gtk_tooltips_enable(gpiv->tooltips); + } else { + gtk_tooltips_disable(gpiv->tooltips); + } + + + sensitive(gpiv, IMG, TRUE); + sensitive(gpiv, EVAL, TRUE); + sensitive(gpiv, INTREGS, FALSE); + sensitive(gpiv, VALID, TRUE); + sensitive(gpiv, POST, TRUE); + + + } else { + gtk_error(_("Image dimensions are larger then the allowed maxima (%dx%d)."), + (int)IMAGE_WIDTH_MAX, (int)IMAGE_HEIGHT_MAX); + } + + gtk_main(); + return 0; +} diff --git a/src/piveval.c b/src/piveval.c new file mode 100644 index 0000000..4f051a3 --- /dev/null +++ b/src/piveval.c @@ -0,0 +1,1755 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (callback) functions for Piv evaluation window/tabulator + * $Log: piveval.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + + +#include "gpiv_gtk.h" +#include "utils.h" +#include "piveval.h" +#include "display.h" + + +static void +alloc_bufmem_per_intarea(int index_y, + int index_x, + GpivData * gpd, + ImagePar image_par, + int int_size_0); +static void +free_bufmem_per_intarea(int index_y, + int index_x, + GpivData * gpd, + ImagePar image_par, + int int_size_0); +/* + * Piv evaluation window/tabulator callbacks + */ + +void +on_radiobutton_piv_mouse(GtkWidget * widget, + gpointer data) +{ + m_select = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "mouse_select")); + + if (m_select == NO_MS) { + piv_eval_par.int_geo = AOI; + } else if (m_select == AOI_MS) { + piv_eval_par.int_geo = AOI; + } else if (m_select == SINGLE_POINT_MS) { + piv_eval_par.int_geo = POINT; + } else if (m_select == VLINE_MS) { + piv_eval_par.int_geo = LINE_C; + } else if (m_select == HLINE_MS) { + piv_eval_par.int_geo = LINE_R; + } else if (m_select == SINGLE_AREA_MS || + m_select == DRAG_MS) { + piv_eval_par.int_geo = POINT; + } + +} + + +void +on_radiobutton_piv_mouse1_enter(GtkWidget * widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("No mouse activity within displayer"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_radiobutton_piv_mouse2_enter(GtkWidget * widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Selects an area within the image to be analyzed"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_radiobutton_piv_mouse3_enter(GtkWidget * widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Piv evaluation at a single interrogation area. " + "Conserves other existing data"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_radiobutton_piv_mouse4_enter(GtkWidget * widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Piv evaluation at a single point in the image. " + "Rejects all existing data!!"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_radiobutton_piv_mouse5_enter(GtkWidget * widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Displaces a single interrogation area and analyzes"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_radiobutton_piv_mouse6_enter(GtkWidget * widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Evaluation at a vertical line. "); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_radiobutton_piv_mouse7_enter(GtkWidget * widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Evaluation at a horizontal line. "); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_spinbutton_piv_int(GtkSpinButton * widget, + GtkWidget * entry) +{ + PivEval * eval = gtk_object_get_data(GTK_OBJECT(widget), "eval"); + gint nx = 0, ny = 0; + PivData l_intreg; + gint renew = 1; + enum VariableType { + COL_START = 0, + COL_END = 1, + PRE_SHIFT_COL = 2, + ROWSTART = 3, + ROWEND = 4, + PRESHIFTROW = 5, + INT_SIZE_1 = 6, + INT_SIZE_2 = 7, + INT_SHIFT = 8 + } var_type; + +/* eval = gtk_object_get_data(GTK_OBJECT(widget), "eval"); */ +/* + * Locale vars + */ +/* Display display_act; */ +/* display_act = gtk_object_get_data(widget, display_act); */ + +/* + * Select which variable has to be modified + */ + setby_spinbutton = 1; + var_type = atoi(gtk_object_get_data(GTK_OBJECT(widget), "var_type")); + + if (var_type == COL_START) { + piv_eval_par.col_start = gtk_spin_button_get_value_as_int(widget); + + } else if (var_type == COL_END) { + piv_eval_par.col_end = gtk_spin_button_get_value_as_int(widget); + + } else if (var_type == PRE_SHIFT_COL) { + piv_eval_par.pre_shift_col = gtk_spin_button_get_value_as_int(widget); + + } else if (var_type == ROWSTART) { + piv_eval_par.row_start = gtk_spin_button_get_value_as_int(widget); + + } else if (var_type == ROWEND) { + piv_eval_par.row_end = gtk_spin_button_get_value_as_int(widget); + + } else if (var_type == PRESHIFTROW) { + piv_eval_par.pre_shift_row = gtk_spin_button_get_value_as_int(widget); + + } else if (var_type == INT_SIZE_1) { + piv_eval_par.int_size_1 = gtk_spin_button_get_value_as_int(widget); + + + GTK_ADJUSTMENT(eval->spinbutton_adj_intsize2)->lower = + (gfloat) piv_eval_par.int_size_1; + GTK_ADJUSTMENT(eval->spinbutton_adj_intsize2)->upper = + (gfloat) 128.0; + gtk_adjustment_changed (GTK_ADJUSTMENT(eval->spinbutton_adj_intsize2)); + gtk_adjustment_set_value(GTK_ADJUSTMENT(eval->spinbutton_adj_intsize2), + (gfloat) piv_eval_par.int_size_1); + +/* + * Adjust radio buttons for in. size 1 + */ + if (piv_eval_par.int_size_1 == 16) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize1_2), + TRUE); + + } else if (piv_eval_par.int_size_1 == 32) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize1_3), TRUE); + + } else if (piv_eval_par.int_size_1 == 64) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize1_4), TRUE); + } else if (piv_eval_par.int_size_1 == 128) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize1_5), TRUE); + } + + + } else if (var_type == INT_SIZE_2) { + piv_eval_par.int_size_2 = gtk_spin_button_get_value_as_int(widget); + if (piv_eval_par.int_size_2 > piv_eval_par.int_size_1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), + FALSE); + } + +/* + * Adjust radio buttons for in. size 2 + */ + if (piv_eval_par.int_size_2 == 16) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_2), TRUE); + } else if (piv_eval_par.int_size_2 == 32) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_3), TRUE); + } else if (piv_eval_par.int_size_2 == 64) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_4), TRUE); + } else if (piv_eval_par.int_size_2 == 128) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_5), TRUE); + } + + } else if (var_type == INT_SHIFT) { + piv_eval_par.int_shift = gtk_spin_button_get_value_as_int(widget); + + if (piv_eval_par.int_shift == 8) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_1), TRUE); + } else if (piv_eval_par.int_shift == 16) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_2), TRUE); + } else if (piv_eval_par.int_shift == 32) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_3), TRUE); + } else if (piv_eval_par.int_shift == 64) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_4), TRUE); + } else if (piv_eval_par.int_shift == 128) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_5), TRUE); + } + } + + if (display_act != NULL) { + nx = display_act->intreg.data.nx; + ny = display_act->intreg.data.ny; + gpiv_piv_count_pivdata_fromimage(&l_intreg, image_par, piv_eval_par); + + +/* + * For some operations the intregs have to be renewed unconditionally, + * for others only in case if the number of intregs has been changed + */ + if (var_type == COL_START || var_type == COL_END + || var_type == ROWSTART || var_type == ROWEND) { + if (nx == l_intreg.nx + && ny == l_intreg.ny) { + renew = 0; + } + } + + if (renew == 1 && display_act->display_intregs == 1) { + destroy_all_intregs(display_act); + create_all_intregs(display_act); + } + } + setby_spinbutton = 0; +} + + + +void +on_radiobutton_piv_int(GtkWidget * widget, + gpointer data) +{ + gint int_size_1_tmp, display_intregs_tmp = 0, + nx_tmp = 0, ny_tmp = 0; +/* gint setby_spinbutton = atoi(gtk_object_get_data(GTK_OBJECT(widget), */ +/* "setby_spinbutton")); */ + PivEval *eval = gtk_object_get_data(GTK_OBJECT(widget), "eval"); + Display *disp = display_act; + int nx, ny; + enum VariableType { + SIZE_1 = 0, + SIZE_2 = 1, + SHIFT = 2 + } var_type; + + if (disp != NULL) { + nx = disp->intreg.data.nx; + ny = disp->intreg.data.ny; + } else { + nx = 0; + ny = 0; + } + + if (GTK_TOGGLE_BUTTON(widget)->active) { + var_type = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "var_type")); + +/* + * Select which variable has to be modified + */ + if (var_type == SIZE_1) { + int_size_1_tmp = piv_eval_par.int_size_1; + piv_eval_par.int_size_1 = atoi(gtk_object_get_data + (GTK_OBJECT(widget), + "intsize1")); +/* + * switch off d_intregs temporarly + */ + if (disp != NULL) { + display_intregs_tmp = disp->display_intregs; + disp->display_intregs = 0; + } + nx_tmp = nx; + ny_tmp = ny; + adjust_radiobutton_piv_int(eval, piv_eval_par.int_size_1); + +/* + * return d_intregs to original value + */ + if (disp != NULL) + disp->display_intregs = display_intregs_tmp; + nx = nx_tmp; + ny = ny_tmp; + +/* + * Reset weight and zero_off + */ + if (piv_eval_par.int_size_2 > int_size_1_tmp) { +/* gtk_widget_set_sensitive(eval->checkbutton_zerooff, TRUE); */ +/* gtk_widget_set_sensitive(checkbutton_piv_weightkernel, TRUE); */ + if (zero_off_tmp == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), + FALSE); + gtk_widget_set_sensitive(eval->checkbutton_zerooff, TRUE); + gtk_widget_set_sensitive(eval->checkbutton_weightkernel, + TRUE); + if (weight_tmp == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_weightkernel), + FALSE); + gtk_widget_set_sensitive(eval->checkbutton_zerooff, + TRUE); + gtk_widget_set_sensitive(eval->checkbutton_weightkernel, TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_weightkernel), + TRUE); + gtk_widget_set_sensitive(eval->checkbutton_zerooff, + FALSE); + gtk_widget_set_sensitive(eval->checkbutton_weightkernel, + TRUE); + } + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), + TRUE); + gtk_widget_set_sensitive(eval->checkbutton_zerooff, TRUE); + gtk_widget_set_sensitive(eval->checkbutton_weightkernel, + FALSE); + } + } + +/* + * Also calls on_spinbutton_piv_int, which, on its turn, may call this function + * again resulting into an infinite loop +*/ + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (eval->spinbutton_intsize1), + piv_eval_par.int_size_1); + + + } else if (var_type == SIZE_2) { + piv_eval_par.int_size_2 = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "intsize2")); + +/* + * Adjust spinner + */ + gtk_adjustment_set_value(GTK_ADJUSTMENT + (eval->spinbutton_adj_intsize2), + (gfloat) piv_eval_par.int_size_2); +/* + * Save origanal settings of weight and zero_off for later resetting + */ + if (piv_eval_par.int_size_2 > piv_eval_par.int_size_1) { + zero_off_tmp = piv_eval_par.zero_off; + weight_tmp = piv_eval_par.weight; + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_weightkernel), FALSE); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), TRUE); + gtk_widget_set_sensitive(eval->checkbutton_zerooff, FALSE); + + +/* + * Reset weight and zero_off + */ + } else { + if (zero_off_tmp == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), FALSE); + if (weight_tmp == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_weightkernel), FALSE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_weightkernel), TRUE); + } + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), TRUE); + } + gtk_widget_set_sensitive(eval->checkbutton_zerooff, TRUE); + } + + + } else if (var_type == SHIFT) { + piv_eval_par.int_shift = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "intshift")); +/* + * Adjust spinner + */ + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (eval->spinbutton_intshift), + piv_eval_par.int_shift); + } + + if (disp != NULL && disp->display_intregs == 1) { + destroy_all_intregs(display_act); + create_all_intregs(display_act); + } + + } + +} + + +void +on_toggle_piv(GtkWidget * widget, +gpointer data) +{ + PivEval * eval = gtk_object_get_data(GTK_OBJECT(widget), "eval"); + enum VariableType { + SCHEME = 0, + PEAK_NR = 1, + WEIGHT = 2, + ZERO_OFF = 3, + CENTRAL_INT = 4, + CORRELATION = 5 + } var_type; + +/* + * Select which variable has to be modified + */ + var_type = atoi(gtk_object_get_data(GTK_OBJECT(widget), "var_type")); + + if (var_type == SCHEME) { + piv_eval_par.ifit = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "ifit")); + + } else if (var_type == PEAK_NR) { + piv_eval_par.peak = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "peak")); + + + } else if (var_type == WEIGHT) { + if (GTK_TOGGLE_BUTTON(widget)->active) { + piv_eval_par.weight = 1; + gtk_widget_set_sensitive(eval->checkbutton_zerooff, FALSE); + gtk_widget_set_sensitive(eval->checkbutton_centraldiff, FALSE); +/* + * toggle adaptive interr and zero-off + */ + } else { + piv_eval_par.weight = 0; + gtk_widget_set_sensitive(eval->checkbutton_zerooff, TRUE); + gtk_widget_set_sensitive(eval->checkbutton_centraldiff, TRUE); + } + + + } else if (var_type == ZERO_OFF) { + if (GTK_TOGGLE_BUTTON(widget)->active) { + piv_eval_par.zero_off = 1; + gtk_widget_set_sensitive(eval->checkbutton_weightkernel, FALSE); + } else { + piv_eval_par.zero_off = 0; + gtk_widget_set_sensitive(eval->checkbutton_weightkernel, TRUE); + } + + + } else if (var_type == CENTRAL_INT) { + if (gtk_toggle_button_get_active + (GTK_TOGGLE_BUTTON(eval->checkbutton_centraldiff))) { + piv_eval_par.central_diff = 1; + } else { + piv_eval_par.central_diff = 0; + } + + + } else if (var_type == CORRELATION) { + image_par.x_corr = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "x_corr")); + } + +} + + + +void +adjust_radiobutton_piv_int(PivEval * eval, + int int_size_1) +{ +/* + * adjusting and disabling int_size_2 and its toggle buttons + */ + + +/* if (int_size_1 == 8) { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (eval->radiobutton_intsize2_1), TRUE); */ + /* } else */if (int_size_1 == 16) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_2), TRUE); + } else if (int_size_1 == 32) { +/* g_warning("adjust_radiobutton_piv_int:: 32 call"); */ + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_3), TRUE); +/* g_warning("adjust_radiobutton_piv_int:: 32 return"); */ + } else if (int_size_1 == 64) { +/* g_warning("adjust_radiobutton_piv_int:: 64 call"); */ + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_4), TRUE); +/* g_warning("adjust_radiobutton_piv_int:: 64 return"); */ + } else if (int_size_1 >= 128) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_5), TRUE); + } + +/* g_warning("adjust_radiobutton_piv_int:: 1"); */ + + if (int_size_1 <= 64) { +/* g_warning("adjust_radiobutton_piv_int:: 1a"); */ + gtk_widget_set_sensitive(GTK_WIDGET(eval->radiobutton_intsize2_4), + TRUE); + if (int_size_1 <= 32) { +/* g_warning("adjust_radiobutton_piv_int:: 1b"); */ + gtk_widget_set_sensitive(GTK_WIDGET + (eval->radiobutton_intsize2_3), + TRUE); + if (int_size_1 <= 16) { +/* g_warning("adjust_radiobutton_piv_int:: 1c"); */ + gtk_widget_set_sensitive(GTK_WIDGET + (eval->radiobutton_intsize2_2), + TRUE); +/* if (int_size_1 <= 8) { */ +/* g_warning("adjust_radiobutton_piv_int:: 1d"); */ +/* gtk_widget_set_sensitive(GTK_WIDGET */ +/* (eval->radiobutton_intsize2_1), */ +/* TRUE); */ +/* } */ + } + } + } + +/* fprintf(stderr, "adjust_radiobutton_piv_int:: 2"); */ + + + + + if (int_size_1 >= 16) { +/* g_warning("adjust_radiobutton_piv_int:: 3a"); */ +/* gtk_widget_set_sensitive(GTK_WIDGET(eval->radiobutton_intsize2_1), */ +/* FALSE); */ + if (int_size_1 >= 32) { +/* g_warning("adjust_radiobutton_piv_int:: 3b"); */ + gtk_widget_set_sensitive(GTK_WIDGET + (eval->radiobutton_intsize2_2), + FALSE); + if (int_size_1 >= 64) { +/* g_warning("adjust_radiobutton_piv_int:: 3c"); */ + gtk_widget_set_sensitive(GTK_WIDGET + (eval->radiobutton_intsize2_3), + FALSE); + if (int_size_1 >= 128) { +/* g_warning("adjust_radiobutton_piv_int:: 3d"); */ + gtk_widget_set_sensitive(GTK_WIDGET + (eval->radiobutton_intsize2_4), + FALSE); + } + } + } + } +/* g_warning("adjust_radiobutton_piv_int:: leave"); */ + +} + + + +void +on_checkbutton_piv_disprocess_enter(GtkWidget *widget, + gpointer data) +{ + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = + _("Displays subimages, correlation image and cov. peak location"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + +void on_checkbutton_piv_disprocess(GtkWidget * widget, gpointer data) +{ + PivEval * eval = gtk_object_get_data(GTK_OBJECT(widget), "eval"); + if (piv_eval_par.print_cov == 0) { + piv_eval_par.print_cov = 1; + gci_background_piv_disprocess = + gnome_canvas_item_new(gnome_canvas_root + (GNOME_CANVAS(eval->canvas_disprocess_dval)), + gnome_canvas_rect_get_type(), + "x1", (double) 0, + "y1", (double) 0, + "x2", (double) 128, + "y2", (double) 128, + "fill_color", "darkblue", + "width_units", 1.0, + NULL); + } else { + piv_eval_par.print_cov = 0; + } + g_warning("checkbutton_piv_disprocess clicked, print_cov = %d", + piv_eval_par.print_cov); + +} + + +/* + * showing interrogation area's and correlation function + */ +gboolean +on_darea_piv_disprocess_int1_expose(GtkWidget * widget, + GdkEventExpose * event, + gpointer user_data) +{ + gdk_draw_gray_image(widget->window, + widget->style->fg_gc[GTK_STATE_NORMAL], 0, 0, + MAX_INTERR_SIZE, MAX_INTERR_SIZE, GDK_RGB_DITHER_MAX, + graybuf_int1, MAX_INTERR_SIZE); + + return TRUE; +} + + +gboolean +on_darea_piv_disprocess_int2_expose(GtkWidget * widget, + GdkEventExpose * event, + gpointer user_data) +{ + gdk_draw_gray_image(widget->window, + widget->style->fg_gc[GTK_STATE_NORMAL], 0, 0, + MAX_INTERR_SIZE, MAX_INTERR_SIZE, GDK_RGB_DITHER_MAX, + graybuf_int2, MAX_INTERR_SIZE); + + return TRUE; +} + + +gboolean +on_darea_piv_disprocess_cov_expose(GtkWidget * widget, + GdkEventExpose * event, + gpointer user_data) +{ + gdk_draw_gray_image(widget->window, + widget->style->fg_gc[GTK_STATE_NORMAL], 0, 0, + MAX_INTERR_SIZE, MAX_INTERR_SIZE, GDK_RGB_DITHER_MAX, + graybuf_cov, MAX_INTERR_SIZE); + + return TRUE; +} + + + +void on_button_piv_enter(GtkWidget *widget, + gpointer data) +{ + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Analyses a PIV image (pair)"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void on_button_piv(GtkWidget * widget, gpointer data) +{ +/* ------------------------------------------------------------------- + The actual calculation of particle image displacements */ + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + + exec_piv(gpiv); + } + } +} + + + +void +exec_piv(GpivConsole * gpiv) +{ + char c_line[MAX_LINES_C][MAX_CHARS]; + int nc_lines = 0, return_val = 0; + char fname_piv[MAX_CHARS], fname_old_piv[MAX_CHARS], sdum[MAX_CHARS]; +/* + * Free memory of pivdata and clean the display from its vectors + */ + if (display_act->gpd.exist_piv) { + destroy_all_vectors(&display_act->gpd); + gpiv_free_pivdata (&display_act->gpd.piv_data); + display_act->gpd.exist_piv = FALSE; + if (display_act->gpd.scaled_piv) { + gpiv_free_pivdata(&display_act->gpd.piv_data_scaled); + display_act->gpd.scaled_piv = FALSE; + } + } + +/* + * Free eventually existing memory of vor_data and clean the display + * as they does not belong to the piv data anymore + */ + free_post_bufmems(display_act); + + if (display_act->img.exist_img && !cancel_process) { + exec_process = TRUE; + +/* + * Reads old PIV data filemame.EXT_OLD for refined calculation + */ +/* TODO??: NOT IMPLEMENTED IN GUI */ + if (piv_eval_par.old_piv == 1) { + if (!display_act->gpd.exist_piv) { + g_snprintf(fname_old_piv, MAX_CHARS, "%s%s", display_act->fname_base, EXT_OLD); + g_snprintf(fname_piv, MAX_CHARS, "%s%s", display_act->fname_base, EXT_PIV); + g_snprintf(sdum, MAX_CHARS, "mv %s %s", fname_piv, fname_old_piv); + system(sdum); + if ((return_val = gpiv_fcount_pivdata(fname_old_piv, &display_act->gpd.piv_data)) + == -1) { + gpiv_error(_("Failure calling gpiv_count_pivdata for %s"), + fname_old_piv); + } + } + } else { + gpiv_piv_count_pivdata_fromimage(&display_act->gpd.piv_data, + image_par, piv_eval_par); + } + +/* + * Set mouse selection to None + */ + if (m_select == SINGLE_POINT_MS + || m_select == SINGLE_AREA_MS + || m_select == DRAG_MS) { + m_select = NO_MS; + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->piveval->radiobutton_mouse_1), + TRUE); + } + +/* + * Allocating memory for output data, now the number of points are + * known (from old piv data or from the area of interest within the image + * and interrogation area sizes) + */ + +/* if (m_select != SINGLE_AREA_MS || */ +/* (m_select == SINGLE_AREA_MS && ) { */ + + gpiv_alloc_pivdata(&display_act->gpd.piv_data); + + + if (piv_eval_par.old_piv == 1) { + if ((return_val = + gpiv_fread_pivdata(fname_old_piv, &display_act->gpd.piv_data, c_line, + &nc_lines)) != 0) { + gpiv_error(_("Failure calling gpiv_fread_pivdata for %s"), + fname_old_piv); + } + } + display_act->gpd.exist_piv = TRUE; + +/* printf ("\n%s: returned from gpiv_fread_pivdata\n", function_name); */ +/* gpiv_write_pivdata(oldpiv_data, c_line, 0, 0, RCSID); */ + +/* + * Determine locations of Interrogation Area's + */ + if (piv_eval_par.old_piv != 1 && + m_select != SINGLE_AREA_MS && + m_select != SINGLE_POINT_MS && + m_select != DRAG_MS) { + gpiv_piv_select_int_point(&display_act->gpd.piv_data, image_par, + piv_eval_par); + +/* fprintf (stderr, "%s:: returned from gpiv_piv_select_int_point\n", function_name); */ +/* fprintf (stderr, "%s:: display_act->gpd.point_x = %f display_act->gpd.point_y = %f\n", */ +/* function_name, display_act->gpd.piv_data.point_x[0][0], */ +/* display_act->gpd.piv_data.point_y[0][0]); */ + } + + + interrogate(&display_act->gpd.piv_data, display_act->img.img1, + display_act->img.img2, gpiv); + display_act->gpd.exist_piv = TRUE; + + + + +/* + * Copy parameters in Buffer structure for saving and, eventual, later use + */ + +/* + * image parameters + */ + display_act->img.image_par.s_scale = image_par.s_scale; + display_act->img.image_par.t_scale = image_par.t_scale; + display_act->img.image_par.z_off_x = image_par.z_off_x; + display_act->img.image_par.z_off_y = image_par.z_off_y; + display_act->img.image_par.s_scale_logic = 1; + display_act->img.image_par.t_scale_logic = 1; + display_act->img.image_par.z_off_logic = 1; + + display_act->gpd.piv_eval_par.ad_int = piv_eval_par.ad_int; + display_act->gpd.piv_eval_par.autokey = piv_eval_par.autokey; + display_act->gpd.piv_eval_par.cmpr = piv_eval_par.cmpr; + +/* + * evaluation parameters + */ + display_act->gpd.piv_eval_par.int_geo = piv_eval_par.int_geo; + display_act->gpd.piv_eval_par.col_start = piv_eval_par.col_start; + display_act->gpd.piv_eval_par.col_end = piv_eval_par.col_end; + display_act->gpd.piv_eval_par.int_point_col = piv_eval_par.int_point_col; + display_act->gpd.piv_eval_par.int_point_row = piv_eval_par.int_point_row; + + display_act->gpd.piv_eval_par.int_line_col = piv_eval_par.int_line_col; + display_act->gpd.piv_eval_par.int_line_col_start = piv_eval_par.int_line_col_start; + display_act->gpd.piv_eval_par.int_line_col_end = piv_eval_par.int_line_col_end; + display_act->gpd.piv_eval_par.int_line_row = piv_eval_par.int_line_row; + display_act->gpd.piv_eval_par.int_line_row_start = piv_eval_par.int_line_row_start; + display_act->gpd.piv_eval_par.int_line_row_end = piv_eval_par.int_line_row_end; + display_act->gpd.piv_eval_par.int_point_col = piv_eval_par.int_point_col; + display_act->gpd.piv_eval_par.int_point_row = piv_eval_par.int_point_row; + + display_act->gpd.piv_eval_par.int_size_1 = piv_eval_par.int_size_1; + display_act->gpd.piv_eval_par.int_size_2 = piv_eval_par.int_size_2; + display_act->gpd.piv_eval_par.int_shift = piv_eval_par.int_shift; + display_act->gpd.piv_eval_par.old_piv = piv_eval_par.old_piv; + display_act->gpd.piv_eval_par.peak = piv_eval_par.peak; + display_act->gpd.piv_eval_par.pre_shift_col = piv_eval_par.pre_shift_col; + display_act->gpd.piv_eval_par.pre_shift_row = piv_eval_par.pre_shift_row; + display_act->gpd.piv_eval_par.print_cov = piv_eval_par.print_cov; + display_act->gpd.piv_eval_par.print_par = piv_eval_par.print_par; + display_act->gpd.piv_eval_par.print_piv = piv_eval_par.print_piv; + display_act->gpd.piv_eval_par.row_end = piv_eval_par.row_end; + display_act->gpd.piv_eval_par.row_start = piv_eval_par.row_start; + display_act->gpd.piv_eval_par.weight = piv_eval_par.weight; + display_act->gpd.piv_eval_par.zero_off = piv_eval_par.zero_off; + display_act->gpd.piv_eval_par.central_diff = piv_eval_par.central_diff; + display_act->gpd.piv_eval_par.ifit = piv_eval_par.ifit; + + + + + display_act->gpd.piv_eval_par.autokey_logic = 1; + display_act->gpd.piv_eval_par.int_geo_logic = 1; + display_act->gpd.piv_eval_par.col_start_logic = 1; + display_act->gpd.piv_eval_par.col_end_logic = 1; + display_act->gpd.piv_eval_par.int_line_row_logic = 1; + display_act->gpd.piv_eval_par.int_line_row_start_logic = 1; + display_act->gpd.piv_eval_par.int_line_row_end_logic = 1; + display_act->gpd.piv_eval_par.int_line_col_logic = 1; + display_act->gpd.piv_eval_par.int_line_col_start_logic = 1; + display_act->gpd.piv_eval_par.int_line_col_end_logic = 1; + display_act->gpd.piv_eval_par.int_point_col_logic = 1; + display_act->gpd.piv_eval_par.int_point_row_logic = 1; + + display_act->gpd.piv_eval_par.ifit_logic = 1; + display_act->gpd.piv_eval_par.int_size = 1; + display_act->gpd.piv_eval_par.int_size_1_logic = 1; + display_act->gpd.piv_eval_par.int_size_2_logic = 1; + display_act->gpd.piv_eval_par.int_shift_logic = 1; + display_act->gpd.piv_eval_par.old_piv_logic = 1; + display_act->gpd.piv_eval_par.pre_shift_col_logic = 1; + display_act->gpd.piv_eval_par.peak_logic = 1; + display_act->gpd.piv_eval_par.pre_shift_row_logic = 1; + display_act->gpd.piv_eval_par.print_par_logic = 1; + display_act->gpd.piv_eval_par.print_piv_logic = 1; + display_act->gpd.piv_eval_par.print_cov_logic = 1; + display_act->gpd.piv_eval_par.row_start_logic = 1; + display_act->gpd.piv_eval_par.row_end_logic = 1; + display_act->gpd.piv_eval_par.weight_logic = 1; + display_act->gpd.piv_eval_par.zero_off_logic = 1; + display_act->gpd.piv_eval_par.central_diff_logic = 1; + + exec_process = FALSE; + + } else { + msg_error = + _("At first, open an image. " + "Than we'll further see what will happen."); + g_warning(msg_error); + gtk_warning(msg_error); + } + +} + + + +void +interrogate(PivData * piv_data, + unsigned char **img1, + unsigned char **img2, + GpivConsole * gpiv) +/* -------------------------------------------------------------------- + PIV analyses of an image pair */ +{ +#define EXT_PIV ".piv" + + int index_x = 0, index_y = 0, int_size_0, fname_logic = 1; + gfloat progres_value; + gchar progres_string[MAX_CHARS]; + + unsigned char **img1_ACT = NULL, **img2_ACT = NULL; + ImagePar image_par_ACT; + PivEvalPar piv_eval_par_ACT; + PivData piv_data_ACT/* = *piv_data */; + Covariance w_k; +/* Covariance *cov = display_act->gpd.cov; */ + int sweep = 1, sweep_last = 0, exit_while = 0, + cmpr_fact = 1; + char *fftwis, *fftwis_inv; + + +/* + * Testing parameters on consistency and initializing derived + * parameters/variables + */ + gpiv_piv_test_parameter(&image_par, &piv_eval_par, fname_logic); + + image_par_ACT.ncolumns = image_par.ncolumns; + image_par_ACT.nrows = image_par.nrows; + image_par_ACT.x_corr = image_par.x_corr; + + image_par_ACT.ncolumns_logic = 1; + image_par_ACT.nrows_logic = 1; + image_par_ACT.x_corr_logic = 1; + + + piv_eval_par_ACT.ad_int = piv_eval_par.ad_int; + piv_eval_par_ACT.autokey = piv_eval_par.autokey; + piv_eval_par_ACT.cmpr = piv_eval_par.cmpr; + piv_eval_par_ACT.ifit = piv_eval_par.ifit; + + piv_eval_par_ACT.int_geo = piv_eval_par.int_geo; + piv_eval_par_ACT.col_start = piv_eval_par.col_start; + piv_eval_par_ACT.col_end = piv_eval_par.col_end; + piv_eval_par_ACT.row_end = piv_eval_par.row_end; + piv_eval_par_ACT.row_start = piv_eval_par.row_start; + piv_eval_par_ACT.int_line_col = piv_eval_par.int_line_col; + piv_eval_par_ACT.int_line_col_start = piv_eval_par.int_line_col_start; + piv_eval_par_ACT.int_line_col_end = piv_eval_par.int_line_col_end; + piv_eval_par_ACT.int_line_row = piv_eval_par.int_line_row; + piv_eval_par_ACT.int_line_row_start = piv_eval_par.int_line_row_start; + piv_eval_par_ACT.int_line_row_end = piv_eval_par.int_line_row_end; + piv_eval_par_ACT.int_point_col = piv_eval_par.int_point_col; + piv_eval_par_ACT.int_point_row = piv_eval_par.int_point_row; + + + if (piv_eval_par_ACT.ad_int == 1) { + piv_eval_par_ACT.int_size_1 = piv_eval_par.int_size_2; + } else { + piv_eval_par_ACT.int_size_1 = piv_eval_par.int_size_1; + } + piv_eval_par_ACT.int_size_2 = piv_eval_par.int_size_2; + piv_eval_par_ACT.int_shift = piv_eval_par.int_shift; + piv_eval_par_ACT.old_piv = piv_eval_par.old_piv; + piv_eval_par_ACT.peak = piv_eval_par.peak; + piv_eval_par_ACT.pre_shift_col = piv_eval_par.pre_shift_col; + piv_eval_par_ACT.pre_shift_row = piv_eval_par.pre_shift_row; + piv_eval_par_ACT.print_cov = piv_eval_par.print_cov; + piv_eval_par_ACT.print_par = piv_eval_par.print_par; + piv_eval_par_ACT.print_piv = piv_eval_par.print_piv; + piv_eval_par_ACT.row_end = piv_eval_par.row_end; + piv_eval_par_ACT.row_start = piv_eval_par.row_start; + piv_eval_par_ACT.weight = piv_eval_par.weight; + piv_eval_par_ACT.zero_off = piv_eval_par.zero_off; + piv_eval_par_ACT.central_diff = piv_eval_par.central_diff; + + + piv_eval_par_ACT.autokey_logic = 1; + piv_eval_par_ACT.col_start_logic = 1; + piv_eval_par_ACT.col_end_logic = 1; + piv_eval_par_ACT.ifit_logic = 1; + piv_eval_par_ACT.int_size_1_logic = 1; + piv_eval_par_ACT.int_size_2_logic = 1; + piv_eval_par_ACT.int_shift_logic = 1; + piv_eval_par_ACT.old_piv_logic = 1; + piv_eval_par_ACT.peak_logic= 1; + piv_eval_par_ACT.pre_shift_col_logic = 1; + piv_eval_par_ACT.pre_shift_row_logic = 1; + piv_eval_par_ACT.print_cov_logic = 1; + piv_eval_par_ACT.print_par_logic = 1; + piv_eval_par_ACT.print_piv_logic = 1; + piv_eval_par_ACT.row_end_logic = 1; + piv_eval_par_ACT.row_start_logic = 1; + piv_eval_par_ACT.weight_logic = 1; + piv_eval_par_ACT.zero_off_logic = 1; + piv_eval_par_ACT.central_diff = 1; + +/* g_warning("interrogate:: ENTER"); */ + + if (piv_eval_par.zero_off || piv_eval_par.ad_int) { + sweep_last = 0; +/* piv_eval_par_ACT.ifit = 0; */ + } else { + sweep_last = 1; +/* piv_eval_par_ACT.ifit = piv_eval_par.ifit; */ + } + + +/* + * Reads eventually existing fftw wisdom + */ + fftwis = gpiv_fread_fftw_wisdom(1); + fftwis_inv = gpiv_fread_fftw_wisdom(-1); + + +/* + * Scanning int. area(s) + */ + while ((!cancel_process + && piv_eval_par.zero_off != 1 && sweep <= 1) + || (piv_eval_par.zero_off == 1 && piv_eval_par_ACT.ad_int != 1 && + sweep <= 2) + || (piv_eval_par_ACT.ad_int == 1 && exit_while == 0 )) { +/* (piv_eval_par_ACT.ad_int == 1 && */ +/* piv_eval_par_ACT.int_size_2*cmpr_fact >= */ +/* piv_eval_par.int_size_1)) { */ + + +/* gpiv_img_print_header("", image_par_ACT); */ +/* gpiv_piv_print_parameters("EVAL.", piv_eval_par_ACT); */ + int_size_0 = ZEROPAD_FACT * piv_eval_par_ACT.int_size_2; + + + if (m_select != SINGLE_AREA_MS && m_select != DRAG_MS) { + destroy_all_vectors(&display_act->gpd); + gnome_canvas_update_now(GNOME_CANVAS(display_act->canvas)); + } + + +/* + * cleans drawing areas for displaying interrogation areas + */ +/* if (print_cov == 1) { */ +/* memset(graybuf_int1, 215, */ +/* (sizeof(guchar)) * (MAX_INTERR_SIZE * MAX_INTERR_SIZE)); */ +/* memset(graybuf_int2, 215, */ +/* (sizeof(guchar)) * (MAX_INTERR_SIZE * MAX_INTERR_SIZE)); */ +/* memset(graybuf_cov, 215, */ +/* (sizeof(guchar)) * (MAX_INTERR_SIZE * MAX_INTERR_SIZE)); */ +/* } */ + + + +/* + * Analyze at a single point + */ + if (piv_eval_par_ACT.int_geo == POINT + || m_select == SINGLE_AREA_MS + || m_select == SINGLE_POINT_MS || m_select == DRAG_MS) { + + + img1_ACT = &img1[0]; + img2_ACT = &img2[0]; + piv_data_ACT = *piv_data; + + +/* + * Weight kernel for single int.area + */ + gpiv_piv_bounds_cov(&w_k, int_size_0, image_par_ACT); + w_k.z = gpiv_matrix(w_k.z_rl, w_k.z_rh, w_k.z_cl, w_k.z_ch); + if (piv_eval_par.weight == 1) { + gpiv_piv_weight_kernel_lin(&w_k, int_size_0); + } else { + gpiv_piv_weight_kernel_1(&w_k); + } + + alloc_bufmem_per_intarea(m_select_index_y, m_select_index_x, + &display_act->gpd, image_par_ACT, int_size_0); + + +/* + * Piv evaluation of ** A SINGLE** interrogation area + */ + gpiv_piv_eval_int_reg(m_select_index_y, + m_select_index_x, + img1_ACT, + img2_ACT, + display_act->gpd.intreg1[m_select_index_y][m_select_index_x], + display_act->gpd.intreg2[m_select_index_y][m_select_index_x], + &display_act->gpd.cov[m_select_index_y][m_select_index_x], + &w_k, + &fftwis, + &fftwis_inv, + &piv_data_ACT, + sweep, + sweep_last, + image_par_ACT, + piv_eval_par_ACT); + + +/* + * display piv values, draw interrogation areas and covariance function + * WATCH OUT WITH CMPR!! + */ + if (piv_eval_par.print_cov == 1) { + display_piv_vector(m_select_index_y, m_select_index_x, + display_act->gpd.piv_data, + gpiv->piveval); + display_img_intreg1(display_act->gpd.intreg1 [m_select_index_y] + [m_select_index_x], + piv_eval_par_ACT.int_size_2, + gpiv->piveval); + display_img_intreg2(display_act->gpd.intreg2[m_select_index_y] + [m_select_index_x], + piv_eval_par_ACT.int_size_2, + gpiv->piveval); + display_img_cov(&display_act->gpd.cov[m_select_index_y] + [m_select_index_x], + piv_eval_par_ACT.int_size_2, + gpiv->piveval); + } + + free_bufmem_per_intarea(m_select_index_y, m_select_index_x, + &display_act->gpd, image_par_ACT, int_size_0); + + +/* + * Anlyze all points wthin Area Of Interest + */ + } else { + +/* + * Speedup the process + */ + +/* + * Free memory of pivdata and clean the display from its vectors + */ + +/* if (display_act->gpd.exist_display_act->gpd.intregs) { */ +/* destroy_all_intregs1(&display_act->gpd); */ +/* destroy_all_intregs2(&display_act->gpd); */ +/* free_intregs(&display_act->gpd.intregs); */ +/* display_act->gpd.exist_intregs = FALSE; */ +/* display_act->display_intregs = 0; */ +/* } */ +/* + * SPEEDUP PROCEDURES + */ + /* if (piv_eval_par.zero_off) { */ +/* if (piv_eval_par.int_shift < piv_eval_par.int_size_2) { */ +/* speedup_ishi(&image_par_ACT, + piv_eval_par_ACT, &piv_eval_par_ACT, */ +/* piv_data, &piv_data_ACT, sweep, sweep_last); */ + +/* } else { */ +/* Enable/disable in combination with speedup_ishi */ +/* piv_data_ACT = *piv_data; */ +/* } */ + +/* speedup_cmpr(img1, &img1_ACT, img2, &img2_ACT, image_par, */ +/* &image_par_ACT, piv_eval_par, &piv_eval_par_ACT, */ +/* &piv_data_ACT, &cmpr_fact, &int_size_0, sweep, sweep_last); */ + +/* Enable when switched off speedup_cmpr: */ +/* img1_ACT = &img1[0]; */ +/* img2_ACT = &img2[0]; */ + +/* } else { */ + img1_ACT = &img1[0]; + img2_ACT = &img2[0]; + piv_data_ACT = *piv_data; + +/* } */ + +/* + * SPEEDUP PROCEDURES END + */ + +/* gpiv_piv_count_pivdata_fromimage(&display_act->gpd.intregs, */ +/* image_par_ACT, */ +/* piv_eval_par_ACT); */ +/* g_warning("intregs.nx=%d intregs.ny=%d\n", */ +/* display_act->gpd.intregs.nx, display_act->gpd.intregs.ny); */ +/* gpiv_alloc_scdata(&display[ibuf].intregs); */ +/* display_act->gpd.exist_intregs = TRUE; */ +/* gpiv_piv_select_int_point(&display_act->gpd.intregs, image_par_ACT, */ +/* piv_eval_par_ACT); */ +/* create_all_intregs1(&display_act->gpd); */ +/* create_all_intregs2(&display_act->gpd); */ + + + gpiv_piv_bounds_cov(&w_k, int_size_0, image_par_ACT); /* piv_eval_par_ACT.int_size_2 ?? */ + w_k.z = gpiv_matrix(w_k.z_rl, w_k.z_rh, w_k.z_cl, w_k.z_ch); + if (piv_eval_par.weight == 1) { + gpiv_piv_weight_kernel_lin(&w_k, int_size_0); + } else { + gpiv_piv_weight_kernel_1(&w_k); + } + + +/* + * Print statement + */ +/* if (piv_eval_par.zero_off && sweep_last == 1) { */ +/* gpiv_img_print_header(image_par_ACT); */ +/* gpiv_piv_print_parameters(piv_eval_par_ACT); */ +/* } */ + + for (index_y = 0; index_y < piv_data_ACT.ny; index_y++) { + for (index_x = 0; index_x < piv_data_ACT.nx; index_x++) { + if (cancel_process) break; + alloc_bufmem_per_intarea(index_y, index_x, &display_act->gpd, + image_par_ACT, int_size_0); + + + +/* + * Printing the progress of processing + */ + progres_value = + 100 * (index_y * piv_data->nx + index_x + + 1) / (piv_data->nx * piv_data->ny); + if (piv_eval_par.zero_off && piv_eval_par.ad_int) { + g_snprintf(progres_string, MAX_CHARS, + "piv sweep #%d " + "(int. size = %d): " + "%d%% processed", + sweep, + piv_eval_par_ACT.int_size_2, + (gint) progres_value); + } else if (piv_eval_par.zero_off && piv_eval_par.ad_int == 0) { + g_snprintf(progres_string, MAX_CHARS, + "piv sweep #%d: " + "%d%% processed", + sweep, + (gint) progres_value); + } else { + g_snprintf(progres_string, MAX_CHARS, + "%d%% processed", + (gint) progres_value); + } + + while (g_main_iteration(FALSE)); + gtk_progress_set_value(gnome_appbar_get_progress + (GNOME_APPBAR(gpiv->appbar)), + progres_value); + gnome_appbar_push(GNOME_APPBAR(gpiv->appbar), + progres_string); + + +/* + * Evaluates an interrogation area. + * In the call int_size_1 might be defined equal to + * piv_eval_par_ACT.int_size_2 as well; + * this will reduce the snr during integration + */ + + gpiv_piv_eval_int_reg(index_y, + index_x, + img1_ACT, + img2_ACT, + display_act->gpd.intreg1[index_y][index_x], + display_act->gpd.intreg2[index_y][index_x], + &display_act->gpd.cov[index_y][index_x], + &w_k, + &fftwis, + &fftwis_inv, + &piv_data_ACT, + sweep, + sweep_last, + image_par_ACT, + piv_eval_par_ACT); + + +/* + * Check on validity of data + */ + if (isnan(/* (double) */ display_act->gpd.piv_data.dx[index_y][index_x]) != 0 + || isnan(/* (double) */ display_act->gpd.piv_data.dy[index_y][index_x]) != 0) { + display_act->gpd.piv_data.dx[index_y][index_x] = 0.0; + display_act->gpd.piv_data.dy[index_y][index_x] = 0.0; + display_act->gpd.piv_data.snr[index_y][index_x] = 99.9; + display_act->gpd.piv_data.peak_no[index_y][index_x] = -1; + } + + + +/* printf("sweep =%d x=%f y=%f\n", sweep, */ +/* piv_data_ACT.point_x[index_y][index_x], */ +/* piv_data_ACT.point_y[index_y][index_x]); */ + +/* + * Only draw the vectors for last sweep + */ + if (sweep_last) { + +/* while (!(my_in=getchar())) sleep(10); */ +/* fprintf(stderr, "interrogate:: i=%d j=%d x=%f y=%f dx=%f dy=%f\n", */ +/* index_y, index_x, */ +/* piv_data_ACT.point_x[index_y][index_x], */ +/* piv_data_ACT.point_y[index_y][index_x], */ +/* piv_data_ACT.dx[index_y][index_x], */ +/* piv_data_ACT.dy[index_y][index_x]); */ + +/* if ( buf->gci_vector[index_y][index_x] == NULL) { */ + + display_vector(index_y, index_x, &display_act->gpd); + + +/* } else { */ +/* update_vector(index_y, index_x, &display_act->gpd); */ +/* } */ + +/* if (display_act->gpd.exist_intregs) { */ +/* update_intreg2(index_y, index_x, &display_act->gpd); */ +/* update_intreg1(index_y, index_x, &display_act->gpd); */ +/* } */ + } + + +/* + * Draw interrogation areas, covariance function, display piv vector + * WATCH OUT WITH CMPR!! + */ + if (piv_eval_par.print_cov == 1) { + display_piv_vector(index_y, + index_x, + display_act->gpd.piv_data, + gpiv->piveval); + display_img_intreg1(display_act->gpd.intreg1[index_y][index_x], + piv_eval_par_ACT.int_size_2, + gpiv->piveval); + display_img_intreg2(display_act->gpd.intreg2[index_y][index_x], + piv_eval_par_ACT.int_size_2, + gpiv->piveval); + display_img_cov(&display_act->gpd.cov[index_y][index_x], + piv_eval_par_ACT.int_size_2, + gpiv->piveval); + } + + +/* + * Freeing memory; **Disable** to keep data with print_cov for viewing later + */ +/* => to exec_piv */ + + + free_bufmem_per_intarea(index_y, index_x, &display_act->gpd, + image_par_ACT, int_size_0); + + +/* fprintf(stderr, "\n::i=%d j=%d zero_off=%d ad_int=%d int_size_1=%d" */ +/* "piv_eval_par_ACT.int_size_2=%d int_size_0=%d sweep=%d\n", */ +/* index_y, index_x, piv_eval_par.zero_off, */ +/* piv_eval_par.ad_int, piv_eval_par_ACT.int_size_1, */ +/* piv_eval_par_ACT.int_size_2, int_size_0, sweep); */ + + + } + } + } + + +/* + * Once allocated for entire image: should be freed for new int area size + */ + gpiv_free_matrix(w_k.z, w_k.z_rl, w_k.z_rh, w_k.z_cl, w_k.z_ch); + + +/* + * Adjust piv_eval_par_ACT.int_size_2 in case int_size_1 is not a power of two + */ + + if (piv_eval_par_ACT.ad_int == 1) { +/* fprintf(stderr, "\n::int_size_1=%d int_size_1_ACT=%d" */ +/* "piv_eval_par.int_size_2_ACT=%d cmpr_fact=%d", */ +/* piv_eval_par.int_size_1, piv_eval_par_ACT.int_size_1, */ +/* piv_eval_par_ACT.int_size_2, cmpr_fact); */ + if (sweep_last == 1) exit_while = 1; + if (piv_eval_par_ACT.int_size_2*cmpr_fact/2 == piv_eval_par.int_size_1 || + piv_eval_par_ACT.int_size_2*cmpr_fact/4 < piv_eval_par.int_size_1) { + piv_eval_par_ACT.int_size_1 = piv_eval_par.int_size_1 / cmpr_fact; + piv_eval_par_ACT.int_size_2 = piv_eval_par.int_size_1 / cmpr_fact; + sweep_last = 1; + } else { + piv_eval_par_ACT.int_size_1 = piv_eval_par_ACT.int_size_2 / 2; + piv_eval_par_ACT.int_size_2 = piv_eval_par_ACT.int_size_2 / 2; + } + } + + if (piv_eval_par.zero_off == 1 && piv_eval_par_ACT.ad_int != 1) { + sweep_last = 1; + } + + sweep++; + if (sweep == MAX_SWEEP) { + sweep_last = 1; + piv_eval_par_ACT.ifit = piv_eval_par.ifit; + } +fprintf(stderr, "\n"); +fprintf(stderr, "\n"); + + + } + + +/* + * Writes existing fftw wisdom + */ + gpiv_fwrite_fftw_wisdom(1, fftwis); + gpiv_fwrite_fftw_wisdom(-1, fftwis_inv); + + + display_act->gpd.exist_piv = TRUE; + display_act->gpd.scaled_piv = FALSE; + display_act->gpd.saved_piv = FALSE; +/* display_act->display_piv = TRUE; */ + +/* gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(viewmenu_uiinfo[5].widget), TRUE); */ + + display_act->gpd.exist_cov = TRUE; + + /* gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(viewmenu_uiinfo[6].widget), TRUE); */ +} + + + + + +static void +alloc_bufmem_per_intarea(int index_y, + int index_x, + GpivData * gpd, + ImagePar image_par, + int int_size_0) +{ + +/* -------------------------------------------------------------------- + Memory allocation of covariance in a packed interrogation area array */ + gpiv_piv_bounds_cov(&gpd->cov[index_y][index_x], + int_size_0, image_par); + + gpd->cov[index_y][index_x].z = + gpiv_matrix(gpd->cov[index_y][index_x].z_rl, + gpd->cov[index_y][index_x].z_rh, + gpd->cov[index_y][index_x].z_cl, + gpd->cov[index_y][index_x].z_ch); + +/* + * Memory allocation of interrogation area's + */ + gpd->intreg1[index_y][index_x] = + gpiv_matrix(0, int_size_0 - 1, 0, int_size_0 - 1); + gpd->intreg2[index_y][index_x] = + gpiv_matrix(0, int_size_0 - 1, 0, int_size_0 - 1); + memset(gpd->intreg1[index_y][index_x][0], 0, + (sizeof(float)) * int_size_0 * int_size_0); + memset(gpd->intreg2[index_y][index_x][0], 0, + (sizeof(float)) * int_size_0 * int_size_0); +} + + +static void +free_bufmem_per_intarea(int index_y, + int index_x, + GpivData * gpd, + ImagePar image_par, + int int_size_0) +{ + gpiv_piv_bounds_cov(&gpd->cov[index_y][index_x], + int_size_0, image_par); + + gpiv_free_matrix(gpd->cov[index_y][index_x].z, + gpd->cov[index_y][index_x].z_rl, + gpd->cov[index_y][index_x].z_rh, + gpd->cov[index_y][index_x].z_cl, + gpd->cov[index_y][index_x].z_ch); + + gpiv_free_matrix(gpd->intreg1[index_y][index_x], 0, int_size_0 - 1, + 0, int_size_0 - 1); + + gpiv_free_matrix(gpd->intreg2[index_y][index_x], 0, int_size_0 - 1, + 0, int_size_0 - 1); + + gpd->intreg1[index_y][index_x] = NULL; + gpd->intreg2[index_y][index_x] = NULL; + +} + + + +/* + * Display functions in PIV tabulator canvas + */ + + +void +display_piv_vector(gint i, + gint j, + PivData piv_data, + PivEval * eval) +/* ------------------------- Displays values in PIV tabulator of the GUI */ +{ + float **dx = piv_data.dx, **dy = piv_data.dy; + int **peak_no = piv_data.peak_no; + GnomeCanvasPoints *points; + gchar *color; + points = gnome_canvas_points_new(2); + + if (peak_no[i][j] == -1) { + color="gray"; + } else if (peak_no[i][j] == 0) { + color="lightblue"; + } else if (peak_no[i][j] == 1) { + color="green"; + } else if (peak_no[i][j] == 2) { + color="yellow"; + } else { +/* if (peak_no[i][j] == 3) */ + color="red"; + } + +/* fprintf(stderr, "\nDISPLAY_VECTOR:: 1"); */ + points->coords[0] = MAX_INTERR_SIZE / 2; + points->coords[1] = MAX_INTERR_SIZE / 2; + points->coords[2] = MAX_INTERR_SIZE / 2 + dx[i][j] * gpiv_par.vector_scale; + points->coords[3] = MAX_INTERR_SIZE / 2 + dy[i][j] * gpiv_par.vector_scale; + + + if (gci_vector_piv_disprocess != NULL) { + gnome_canvas_item_set(gci_vector_piv_disprocess, + "points", points, + "fill_color", color, + "width_units", (double) THICKNESS, + "first_arrowhead", FALSE, + "last_arrowhead", TRUE, + "arrow_shape_a", (double) ARROW_LENGTH, + "arrow_shape_b", (double) ARROW_EDGE, + "arrow_shape_c", (double) ARROW_WIDTH, + NULL); + } else { + gci_vector_piv_disprocess = + gnome_canvas_item_new(gnome_canvas_root + (GNOME_CANVAS(eval->canvas_disprocess_dval)), + gnome_canvas_line_get_type(), + "points", points, + "fill_color", "red", + "width_units",(double) THICKNESS, + "first_arrowhead", TRUE, + "arrow_shape_a", (double) THICKNESS, + NULL); + + } + + gnome_canvas_points_free(points); + +} + + +void +display_img_intreg1(float **intreg1, + int int_size, + PivEval * eval) +/* ------------------------- Displays image of intreg1 for drawing area */ +{ + guchar *pos; + gint i, j; + float min = 1000.; + +/* + * As the mean has been substracted from the data, values have to be + * tilted above zero + */ + for (i = 0; i < int_size; i++) { + for (j = 0; j < int_size; j++) { + if (intreg1[i][j] < min) + min = intreg1[i][j]; + } + } + + pos = graybuf_int1; + pos += (MAX_INTERR_SIZE - int_size) / 2 * (MAX_INTERR_SIZE + 1); + for (i = 0; i < int_size; i++) { + for (j = 0; j < int_size; j++) { + *pos++ = (unsigned char) intreg1[i][j] - (unsigned char) min; + } + pos = pos + (MAX_INTERR_SIZE - int_size); + } + gtk_widget_draw(GTK_WIDGET(eval->darea_disprocess_int1), pos); +} + + + +void display_img_intreg2(float **intreg2, + int int_size, + PivEval * eval) +/* ------------------------- Displays image of intreg1 for drawing area */ +{ + guchar *pos; + gint i, j; + float min = 1000.; + +/* + * As the mean has been substracted from the data, values have to be tilted + * above zero + */ + for (i = 0; i < int_size; i++) { + for (j = 0; j < int_size; j++) { + if (intreg2[i][j] < min) + min = intreg2[i][j]; + } + } + + + pos = graybuf_int2; + pos += (MAX_INTERR_SIZE - int_size) / 2 * (MAX_INTERR_SIZE + 1); + for (i = 0; i < int_size; i++) { + for (j = 0; j < int_size; j++) { + *pos++ = (unsigned char) intreg2[i][j] - (unsigned char) min; + } + pos += (MAX_INTERR_SIZE - int_size); + } + gtk_widget_draw(GTK_WIDGET(eval->darea_disprocess_int2), pos); +} + + +void display_img_cov(Covariance * cov, + int int_size, + PivEval * eval) +/* ------------------------- Displays image of intreg1 for drawing area */ +{ + guchar *pos; + gint i, j; + float min = 1000., max = -1000.; + + int z_rl = cov->z_rl, z_rh = cov->z_rh, z_cl = cov->z_cl, z_ch = + cov->z_ch; + + +/* + * Scaling + */ + for (i = z_rl; i < z_rh; i++) { + for (j = z_cl; j < z_ch; j++) { + if (cov->z[i][j] < min) + min = cov->z[i][j]; + if (cov->z[i][j] > max) + max = cov->z[i][j]; + } + } + + + pos = graybuf_cov; + pos += (MAX_INTERR_SIZE - int_size) / 2 * (MAX_INTERR_SIZE + 1); +/* pos += (MAX_INTERR_SIZE - int_size/2)/2 * (MAX_INTERR_SIZE+1); */ + +/* pos += (MAX_INTERR_SIZE - 3*int_size/4)/2; */ + + + for (i = z_rl; i < z_rh; i++) { + for (j = z_cl; j < z_ch; j++) { + cov->z[i][j] -= min; + cov->z[i][j] = (255.0 / (max - min)) * cov->z[i][j]; + *pos++ = (unsigned char) cov->z[i][j]; + } + pos += (MAX_INTERR_SIZE - int_size) + 1; + } + + gtk_widget_draw(GTK_WIDGET(eval->darea_disprocess_cov), pos); +} + + diff --git a/src/piveval.h b/src/piveval.h new file mode 100644 index 0000000..af65f5a --- /dev/null +++ b/src/piveval.h @@ -0,0 +1,162 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (callback) functions for Piv evaluation window/tabulator + * $Log: piveval.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef PIVEVAL_H +#define PIVEVAL_H + + +void +on_radiobutton_piv_mouse(GtkWidget *widget, + gpointer data); + +void +on_radiobutton_piv_mouse1_enter(GtkWidget *widget, + gpointer data); +void +on_radiobutton_piv_mouse2_enter(GtkWidget *widget, + gpointer data); +void +on_radiobutton_piv_mouse3_enter(GtkWidget *widget, + gpointer data); +void +on_radiobutton_piv_mouse4_enter(GtkWidget *widget, + gpointer data); +void +on_radiobutton_piv_mouse5_enter(GtkWidget *widget, + gpointer data); +void +on_radiobutton_piv_mouse6_enter(GtkWidget *widget, + gpointer data); +void +on_radiobutton_piv_mouse7_enter(GtkWidget *widget, + gpointer data); + + +/*-------------------------------------------------------------------- + entries for first, last, and pre-shift columns and rows */ + +void +on_spinbutton_piv_int(GtkSpinButton *widget, + GtkWidget *entry); + + +/*-------------------------------------------------------------------- + radio buttons of first, second interrogation sizes and shift (adjacent + distances */ + +void +on_radiobutton_piv_int(GtkWidget *widget, + gpointer data); + +void +on_toggle_piv(GtkWidget *widget, + gpointer data); + +void +on_button_piv(GtkWidget *widget, + gpointer data); + +void +on_toolbar_chackbutton_piv(GtkWidget *widget, + gpointer data); + +/*-------------------------------------------------------------------- +showing interrogation area's, covariance function and +displacement vector*/ +gboolean +on_darea_piv_disprocess_int1_expose (GtkWidget *widget, + GdkEventExpose *event, + gpointer user_data); + +gboolean +on_darea_piv_disprocess_int2_expose (GtkWidget *widget, + GdkEventExpose *event, + gpointer user_data); +gboolean +on_darea_piv_disprocess_cov_expose (GtkWidget *widget, + GdkEventExpose *event, + gpointer user_data); + +void +on_checkbutton_piv_disprocess_enter(GtkWidget *widget, + gpointer data); + +void +on_checkbutton_piv_disprocess(GtkWidget *widget, + gpointer data); + +void +on_button_piv_enter(GtkWidget *widget, + gpointer data); + +void +adjust_radiobutton_piv_int(PivEval * piveval, + int int_size_1); + + +/* + * Other evaluation functions + */ +void +exec_piv(GpivConsole * gpiv); + +void +interrogate(PivData * piv_data, /* output piv data from image analysis */ + unsigned char **img_1, /* raw (binary) image data of first piv image */ + unsigned char **img_2, /* raw (binary) image data of second piv image */ + GpivConsole *gpiv); /* console widgets structure */ + +void +display_piv_vector(gint i, + gint j, + PivData piv_data, + PivEval * piveval); + +void +display_img_intreg1(float **intreg1, + int int_size, + PivEval * piveval); + +void +display_img_intreg2(float **intreg2, + int int_size, + PivEval * piveval); + +void +display_img_cov(Covariance * cov, + int int_size, + PivEval * piveval); + +#endif /* PIVEVAL_H */ diff --git a/src/piveval_interface.c b/src/piveval_interface.c new file mode 100644 index 0000000..c6fa764 --- /dev/null +++ b/src/piveval_interface.c @@ -0,0 +1,2668 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * PIV evaluation interface + * $Log: piveval_interface.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gpiv_gtk.h" +#include "console.h" +#include "piveval_interface.h" +#include "piveval.h" + +PivEval * +create_piveval (GtkWidget *main_window, + GtkWidget *container) +{ + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(main_window), "gpiv"); + PivEval * eval = g_new0(PivEval, 1); + + eval->tooltips = gtk_tooltips_new(); + + + + eval->vbox_label = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox_label); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_label", + eval->vbox_label, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox_label); + gtk_container_add(GTK_CONTAINER(container), + eval->vbox_label); + + eval->label_title = gtk_label_new(_("Piv: image evaluation")); + gtk_widget_ref(eval->label_title); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_title", + eval->label_title, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->label_title); + gtk_box_pack_start(GTK_BOX(eval->vbox_label), + eval->label_title, + FALSE, + FALSE, + 0); + +/* + * Scrolled window + */ + eval->vbox_scroll = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox_scroll); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_scroll", + eval->vbox_scroll, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox_scroll); + gtk_box_pack_start(GTK_BOX(eval->vbox_label), + eval->vbox_scroll, TRUE, + TRUE, + 0); + + eval->scrolledwindow = gtk_scrolled_window_new(NULL, + NULL); + gtk_widget_ref(eval->scrolledwindow); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "scrolledwindow", + eval->scrolledwindow, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->scrolledwindow); + gtk_box_pack_start(GTK_BOX(eval->vbox_scroll), + eval->scrolledwindow, + TRUE, + TRUE, + 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(eval->scrolledwindow), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + + eval->viewport = gtk_viewport_new(NULL, + NULL); + gtk_widget_ref(eval->viewport); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "viewport", + eval->viewport, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->viewport); + gtk_container_add(GTK_CONTAINER(eval->scrolledwindow), + eval->viewport); + gtk_widget_set_usize(GTK_WIDGET(eval->scrolledwindow), + 410, + 375); + +/* + * main table for PIV + */ + eval->table = gtk_table_new(2, + 8, + FALSE); + gtk_widget_ref(eval->table); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "table", + eval->table, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->table); + gtk_container_add(GTK_CONTAINER(eval->viewport), + eval->table); + + +/* + * table for entries of first, last and pre-shift columns/rows + */ + eval->table_aoi = gtk_table_new(4, + 3, + FALSE); + gtk_widget_ref(eval->table_aoi); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "table_aoi", + eval->table_aoi, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->table_aoi); + gtk_table_attach(GTK_TABLE(eval->table), + eval->table_aoi, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + + eval->label_colstart = gtk_label_new(_("first col:")); + gtk_widget_ref(eval->label_colstart); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_colstart", + eval->label_colstart, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->label_colstart); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->label_colstart, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), + 0, + 0); + + + + eval->label_colend = gtk_label_new(_("last col:")); + gtk_widget_ref(eval->label_colend); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_colend", + eval->label_colend, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->label_colend); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->label_colend, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), + 0, + 0); + + + + eval->label_preshiftcol = gtk_label_new(_("pre-shift col:")); + gtk_widget_ref(eval->label_preshiftcol); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_preshiftcol", + eval->label_preshiftcol, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->label_preshiftcol); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->label_preshiftcol, + 2, + 3, + 0, + 1, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), + 0, + 0); + + + + eval->label_rowstart = gtk_label_new(_("first row:")); + gtk_widget_ref(eval->label_rowstart); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_rowstart", + eval->label_rowstart, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->label_rowstart); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->label_rowstart, + 0, + 1, + 2, + 3, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), + 0, + 0); + + + + eval->label_rowend = gtk_label_new(_("last row:")); + gtk_widget_ref(eval->label_rowend); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_rowend", + eval->label_rowend, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->label_rowend); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->label_rowend, + 1, + 2, + 2, + 3, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), + 0, + 0); + + + + eval->label_preshiftrow = gtk_label_new(_("pre-shift row:")); + gtk_widget_ref(eval->label_preshiftrow); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_preshiftrow", + eval->label_preshiftrow, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->label_preshiftrow); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->label_preshiftrow, + 2, + 3, + 2, + 3, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), + 0, + 0); + + +/* + * spinner for colstart + */ + eval->spinbutton_adj_colstart = + gtk_adjustment_new(piv_eval_par.col_start, + 0, + gpiv_par.img_width - 1, + 1, + 10, + 10); + eval->spinbutton_colstart = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_colstart), + 1, + 0); + gtk_widget_ref(eval->spinbutton_colstart); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_colstart", + eval->spinbutton_colstart, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_colstart); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->spinbutton_colstart, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(eval->spinbutton_colstart), + TRUE); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_colstart), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_colstart), + "var_type", + "0"); + /* gtk_signal_connect (GTK_OBJECT (eval->spinbutton_colstart), + "activate", + on_eval->spinbutton_colstart_activate, + eval->spinbutton_colstart); + */ + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_colstart), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_colstart); + +/* + * spinner for colend + */ + eval->spinbutton_adj_colend = + gtk_adjustment_new(piv_eval_par.col_end, + 0, + gpiv_par.img_width - 1, + 1, + 10, + 10); + eval->spinbutton_colend = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_colend), + 1, + 0); + gtk_widget_ref(eval->spinbutton_colend); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_colend", + eval->spinbutton_colend, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_colend); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->spinbutton_colend, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(eval->spinbutton_colend), + TRUE); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_colend), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_colend), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_colend), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_colend); + + +/* + * spinner for preshiftcol + */ + eval->spinbutton_adj_preshiftcol = + gtk_adjustment_new(piv_eval_par.pre_shift_col, + -(gpiv_par.img_width - 1), + gpiv_par.img_width - 1, + 1, + 10, + 10); + eval->spinbutton_preshiftcol = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_preshiftcol), + 1, + 0); + gtk_widget_ref(eval->spinbutton_preshiftcol); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_preshiftcol", + eval->spinbutton_preshiftcol, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_preshiftcol); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->spinbutton_preshiftcol, + 2, + 3, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON + (eval->spinbutton_preshiftcol), + TRUE); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_preshiftcol), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_preshiftcol), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_preshiftcol), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_preshiftcol); + + +/* + * spinner for rowstart + */ + eval->spinbutton_adj_rowstart = + gtk_adjustment_new(piv_eval_par.row_start, + 0, + gpiv_par.img_height - 1, + 1, + 10, + 10); + eval->spinbutton_rowstart = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_rowstart), + 1, + 0); + gtk_widget_ref(eval->spinbutton_rowstart); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_rowstart", + eval->spinbutton_rowstart, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_rowstart); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->spinbutton_rowstart, + 0, + 1, + 3, + 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(eval->spinbutton_rowstart), + TRUE); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_rowstart), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_rowstart), + "var_type", + "3"); + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_rowstart), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_rowstart); + + +/* + * spinner for rowend + */ + eval->spinbutton_adj_rowend = + gtk_adjustment_new(piv_eval_par.row_end, + 0, + gpiv_par.img_height - 1, + 1, + 10, + 10); + eval->spinbutton_rowend = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_rowend), + 1, + 0); + gtk_widget_ref(eval->spinbutton_rowend); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_rowend", + eval->spinbutton_rowend, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_rowend); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->spinbutton_rowend, + 1, + 2, + 3, + 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_rowend), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_rowend), + "var_type", + "4"); + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_rowend), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_rowend); + + +/* + * spinner for preshiftrow + */ + eval->spinbutton_adj_preshiftrow = + gtk_adjustment_new(piv_eval_par.pre_shift_row, + -(gpiv_par.img_height - 1), + gpiv_par.img_height - 1, + 1, + 10, + 10); + eval->spinbutton_preshiftrow = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_preshiftrow), + 1, + 0); + gtk_widget_ref(eval->spinbutton_preshiftrow); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_preshiftrow", + eval->spinbutton_preshiftrow, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_preshiftrow); + gtk_table_attach(GTK_TABLE(eval->table_aoi), + eval->spinbutton_preshiftrow, + 2, + 3, + 3, + 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_preshiftrow), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_preshiftrow), + "var_type", + "5"); + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_preshiftrow), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_preshiftrow); + + +/* + * radio buttons and spinners for interrogation size 1 + */ + + eval->hbox_intreg = gtk_hbox_new(FALSE, 0); + gtk_widget_ref(eval->hbox_intreg); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "hbox_intreg", + eval->hbox_intreg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->hbox_intreg); + gtk_table_attach(GTK_TABLE(eval->table), eval->hbox_intreg, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); + + eval->frame_2 = gtk_frame_new(_("Int Size 1")); + gtk_widget_ref(eval->frame_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_2", + eval->frame_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_2); + gtk_box_pack_start(GTK_BOX(eval->hbox_intreg), + eval->frame_2, + TRUE, + TRUE, + 0); + + eval->vbox_intsize1 = gtk_vbox_new(FALSE, 0); + gtk_widget_ref(eval->vbox_intsize1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_intsize1", + eval->vbox_intsize1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox_intsize1); + gtk_container_add(GTK_CONTAINER(eval->frame_2), + eval->vbox_intsize1); + + +/* + * spinner for interrogation size 1 + */ + eval->spinbutton_adj_intsize1 = + gtk_adjustment_new(piv_eval_par.int_size_1, + MIN_INTERR_SIZE, + MAX_INTERR_SIZE, + 1, + 10, + 10); + eval->spinbutton_intsize1 = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_intsize1), + 1, + 0); + gtk_widget_ref(eval->spinbutton_intsize1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_intsize1", + eval->spinbutton_intsize1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_intsize1); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize1), + eval->spinbutton_intsize1, + FALSE, FALSE, 0); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_intsize1), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_intsize1), + "var_type", + "6"); + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_intsize1), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_intsize1); + + + +/* + * radio buttons for interrogation size 1 + */ + +/* eval->radiobutton_intsize1_1 = */ +/* gtk_radio_button_new_with_label(eval->int_size_1_group, _("8")); */ +/* eval->int_size_1_group = */ +/* gtk_radio_button_group(GTK_RADIO_BUTTON */ +/* (eval->radiobutton_intsize1_1)); */ +/* gtk_widget_ref(eval->radiobutton_intsize1_1); */ +/* gtk_object_set_data_full(GTK_OBJECT(main_window), */ +/* "radiobutton_intsize1_1", */ +/* eval->radiobutton_intsize1_1, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_widget_show(eval->radiobutton_intsize1_1); */ +/* gtk_box_pack_start(GTK_BOX(eval->vbox_intsize1), */ +/* eval->radiobutton_intsize1_1, FALSE, FALSE, 0); */ + +/* gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_1), "intsize1", */ +/* "8"); */ +/* gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_1), "var_type", */ +/* "0"); */ +/* gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize1_1), "toggled", */ +/* GTK_SIGNAL_FUNC(on_eval->radiobutton_int), NULL); */ + + + eval->radiobutton_intsize1_2 = + gtk_radio_button_new_with_label(eval->int_size_1_group, + _("16")); + eval->int_size_1_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intsize1_2)); + gtk_widget_ref(eval->radiobutton_intsize1_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intsize1_2", + eval->radiobutton_intsize1_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intsize1_2); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize1), + eval->radiobutton_intsize1_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_2), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_2), + "intsize1", + "16"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_2), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize1_2), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intsize1_3 = + gtk_radio_button_new_with_label(eval->int_size_1_group, + _("32")); + eval->int_size_1_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intsize1_3)); + gtk_widget_ref(eval->radiobutton_intsize1_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intsize1_3", + eval->radiobutton_intsize1_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intsize1_3); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize1), + eval->radiobutton_intsize1_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_3), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_3), + "intsize1", + "32"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_3), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize1_3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intsize1_4 = + gtk_radio_button_new_with_label(eval->int_size_1_group, + _("64")); + eval->int_size_1_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intsize1_4)); + gtk_widget_ref(eval->radiobutton_intsize1_4); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intsize1_4", + eval->radiobutton_intsize1_4, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intsize1_4); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize1), + eval->radiobutton_intsize1_4, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_4), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_4), + "intsize1", + "64"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_4), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize1_4), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intsize1_5 = + gtk_radio_button_new_with_label(eval->int_size_1_group, + _("128")); + eval->int_size_1_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intsize1_5)); + gtk_widget_ref(eval->radiobutton_intsize1_5); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intsize1_5", + eval->radiobutton_intsize1_5, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intsize1_5); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize1), + eval->radiobutton_intsize1_5, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_5), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_5), + "intsize1", + "128"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize1_5), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize1_5), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + +/* + * radio buttons for interrogation size 2 + */ + + eval->frame_3 = gtk_frame_new(_("Int Size 2")); + gtk_widget_ref(eval->frame_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_3", + eval->frame_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_3); + gtk_box_pack_start(GTK_BOX(eval->hbox_intreg), + eval->frame_3, + TRUE, + TRUE, + 0); + + + eval->vbox_intsize2 = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox_intsize2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_intsize2", + eval->vbox_intsize2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox_intsize2); + gtk_container_add(GTK_CONTAINER(eval->frame_3), + eval->vbox_intsize2); + + +/* + * spinner for interrogation size 2 + */ + eval->spinbutton_adj_intsize2 = + gtk_adjustment_new(piv_eval_par.int_size_2, + MIN_INTERR_SIZE, + MAX_INTERR_SIZE, + 1, + 10, + 10); + eval->spinbutton_intsize2 = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_intsize2), + 1, + 0); + gtk_widget_ref(eval->spinbutton_intsize2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_intsize2", + eval->spinbutton_intsize2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_intsize2); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize2), + eval->spinbutton_intsize2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_intsize2), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_intsize2), + "var_type", + "7"); + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_intsize2), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_intsize2); + + + + +/* eval->radiobutton_intsize2_1 = */ +/* gtk_radio_button_new_with_label(eval->int_size_2_group, _("8")); */ +/* eval->int_size_2_group = */ +/* gtk_radio_button_group(GTK_RADIO_BUTTON */ +/* (eval->radiobutton_intsize2_1)); */ +/* gtk_widget_ref(eval->radiobutton_intsize2_1); */ +/* gtk_object_set_data_full(GTK_OBJECT(main_window), */ +/* "radiobutton_intsize2_1", */ +/* eval->radiobutton_intsize2_1, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_widget_show(eval->radiobutton_intsize2_1); */ +/* gtk_box_pack_start(GTK_BOX(eval->vbox_intsize2), */ +/* eval->radiobutton_intsize2_1, FALSE, FALSE, 0); */ + +/* gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_1), + "eval", eval); */ +/* gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_1), "intsize2", */ +/* "8"); */ +/* gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_1), "var_type", */ +/* "1"); */ +/* gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize2_1), "toggled", */ +/* GTK_SIGNAL_FUNC(on_radiobutton_piv_int), NULL); */ + + + eval->radiobutton_intsize2_2 = + gtk_radio_button_new_with_label(eval->int_size_2_group, + _("16")); + eval->int_size_2_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intsize2_2)); + gtk_widget_ref(eval->radiobutton_intsize2_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intsize2_2", + eval->radiobutton_intsize2_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intsize2_2); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize2), + eval->radiobutton_intsize2_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_2), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_2), + "intsize2", + "16"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_2), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize2_2), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intsize2_3 = + gtk_radio_button_new_with_label(eval->int_size_2_group, + _("32")); + eval->int_size_2_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intsize2_3)); + gtk_widget_ref(eval->radiobutton_intsize2_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intsize2_3", + eval->radiobutton_intsize2_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intsize2_3); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize2), + eval->radiobutton_intsize2_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_3), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_3), + "intsize2", + "32"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_3), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize2_3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intsize2_4 = + gtk_radio_button_new_with_label(eval->int_size_2_group, + _("64")); + eval->int_size_2_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intsize2_4)); + gtk_widget_ref(eval->radiobutton_intsize2_4); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intsize2_4", + eval->radiobutton_intsize2_4, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intsize2_4); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize2), + eval->radiobutton_intsize2_4, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_4), + "eval", eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_4), + "intsize2", + "64"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_4), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize2_4), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intsize2_5 = + gtk_radio_button_new_with_label(eval->int_size_2_group, + _("128")); + eval->int_size_2_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intsize2_5)); + gtk_widget_ref(eval->radiobutton_intsize2_5); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intsize2_5", + eval->radiobutton_intsize2_5, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intsize2_5); + gtk_box_pack_start(GTK_BOX(eval->vbox_intsize2), + eval->radiobutton_intsize2_5, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_5), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_5), + "intsize2", + "128"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intsize2_5) + , "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intsize2_5), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + +/* + * radio buttons for shifted distance of interrogation areas + */ + + eval->frame_4 = gtk_frame_new(_("Shift")); + gtk_widget_ref(eval->frame_4); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_4", + eval->frame_4, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_4); + gtk_box_pack_start(GTK_BOX(eval->hbox_intreg), + eval->frame_4, + TRUE, + TRUE, + 0); + + eval->vbox_shift = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox_shift); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_shift", + eval->vbox_shift, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox_shift); + gtk_container_add(GTK_CONTAINER(eval->frame_4), + eval->vbox_shift); + + +/* + * spinner for interrogation shift + */ + eval->spinbutton_adj_intshift = + gtk_adjustment_new(piv_eval_par.int_shift, + 8, + MAX_INTERR_SIZE, + 1, + 10, + 10); + eval->spinbutton_intshift = + gtk_spin_button_new(GTK_ADJUSTMENT(eval->spinbutton_adj_intshift), + 1, + 0); + gtk_widget_ref(eval->spinbutton_intshift); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_intshift", + eval->spinbutton_intshift, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->spinbutton_intshift); + gtk_box_pack_start(GTK_BOX(eval->vbox_shift), eval->spinbutton_intshift, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_intshift), + + "eval", eval); + gtk_object_set_data(GTK_OBJECT(eval->spinbutton_intshift), + "var_type", + "8"); + gtk_signal_connect(GTK_OBJECT(eval->spinbutton_intshift), + "changed", + on_spinbutton_piv_int, + eval->spinbutton_intshift); + + + + eval->radiobutton_intshift_1 = + gtk_radio_button_new_with_label(eval->int_shift_group, + _("8")); + eval->int_shift_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intshift_1)); + gtk_widget_ref(eval->radiobutton_intshift_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + + "radiobutton_intshift_1", + eval->radiobutton_intshift_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intshift_1); + gtk_box_pack_start(GTK_BOX(eval->vbox_shift), + eval->radiobutton_intshift_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_1), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_1), + "intshift", + "8"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_1), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intshift_1), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intshift_2 = + gtk_radio_button_new_with_label(eval->int_shift_group, + _("16")); + eval->int_shift_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intshift_2)); + gtk_widget_ref(eval->radiobutton_intshift_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intshift_2", + eval->radiobutton_intshift_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intshift_2); + gtk_box_pack_start(GTK_BOX(eval->vbox_shift), + eval->radiobutton_intshift_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_2), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_2), + "intshift", + "16"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_2), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intshift_2), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intshift_3 = + gtk_radio_button_new_with_label(eval->int_shift_group, + _("32")); + eval->int_shift_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intshift_3)); + gtk_widget_ref(eval->radiobutton_intshift_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intshift_3", + eval->radiobutton_intshift_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intshift_3); + gtk_box_pack_start(GTK_BOX(eval->vbox_shift), + eval->radiobutton_intshift_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_3), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_3), + "intshift", + "32"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_3), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intshift_3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intshift_4 = + gtk_radio_button_new_with_label(eval->int_shift_group, + _("64")); + eval->int_shift_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intshift_4)); + gtk_widget_ref(eval->radiobutton_intshift_4); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intshift_4", + eval->radiobutton_intshift_4, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intshift_4); + gtk_box_pack_start(GTK_BOX(eval->vbox_shift), + eval->radiobutton_intshift_4, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_4), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_4), + "intshift", + "64"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_4), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intshift_4), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + + + eval->radiobutton_intshift_5 = + gtk_radio_button_new_with_label(eval->int_shift_group, + _("128")); + eval->int_shift_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_intshift_5)); + gtk_widget_ref(eval->radiobutton_intshift_5); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_intshift_5", + eval->radiobutton_intshift_5, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_intshift_5); + gtk_box_pack_start(GTK_BOX(eval->vbox_shift), + eval->radiobutton_intshift_5, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_5), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_5), + "intshift", + "128"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_intshift_5), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_intshift_5), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_int), + NULL); + + +/* + * radio button for mouse selecting + */ + + eval->frame_1 = gtk_frame_new(_("Mouse select")); + gtk_widget_ref(eval->frame_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_1", + eval->frame_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_1); + gtk_table_attach(GTK_TABLE(eval->table), + eval->frame_1, + 1, + 2, + 0, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + + eval->vbox_mouseselect = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox_mouseselect); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_mouseselect", + eval->vbox_mouseselect, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox_mouseselect); + gtk_container_add(GTK_CONTAINER(eval->frame_1), + eval->vbox_mouseselect); + + + eval->radiobutton_mouse_1 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("None")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_mouse_1)); + gtk_widget_ref(eval->radiobutton_mouse_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_mouse_1", + eval->radiobutton_mouse_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_mouse_1); + gtk_box_pack_start(GTK_BOX(eval->vbox_mouseselect), + eval->radiobutton_mouse_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_1), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_1), + "mouse_select", + "0" /* NO_MS */); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_1), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse1_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_1), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_1), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse), + NULL); + + + + eval->radiobutton_mouse_2 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Area")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_mouse_2)); + gtk_widget_ref(eval->radiobutton_mouse_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_mouse_2", + eval->radiobutton_mouse_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_mouse_2); + gtk_box_pack_start(GTK_BOX(eval->vbox_mouseselect), + eval->radiobutton_mouse_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_2), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_2), + "mouse_select", + "1" /* AOI_MS */); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_2), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse2_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_2), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_2), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse), + NULL); + + + + eval->radiobutton_mouse_3 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Single int.")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_mouse_3)); + gtk_widget_ref(eval->radiobutton_mouse_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_mouse_3", + eval->radiobutton_mouse_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_mouse_3); + gtk_box_pack_start(GTK_BOX(eval->vbox_mouseselect), + eval->radiobutton_mouse_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_3), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_3), + "mouse_select", + "2" /* SINGLE_AREA_MS */); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_3), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse3_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_3), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse), + NULL); + + + + eval->radiobutton_mouse_4 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Single point")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_mouse_4)); + gtk_widget_ref(eval->radiobutton_mouse_4); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_mouse_4", + eval->radiobutton_mouse_4, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_mouse_4); + gtk_box_pack_start(GTK_BOX(eval->vbox_mouseselect), + eval->radiobutton_mouse_4, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_4), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_4), + "mouse_select", + "3" /* SINGLE_POINT_MS */); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_4), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse4_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_4), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_4), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse), + NULL); + + + + eval->radiobutton_mouse_5 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Drag int.")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_mouse_5)); + gtk_widget_ref(eval->radiobutton_mouse_5); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_mouse_5", + eval->radiobutton_mouse_5, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_mouse_5); + gtk_box_pack_start(GTK_BOX(eval->vbox_mouseselect), + eval->radiobutton_mouse_5, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_5), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_5), + "mouse_select", + "4" /* DRAG_MS */); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_5), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse5_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_5), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_5), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse), + NULL); + + + + eval->radiobutton_mouse_6 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Vert. Line")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_mouse_6)); + gtk_widget_ref(eval->radiobutton_mouse_6); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_mouse_6", + eval->radiobutton_mouse_6, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_mouse_6); + gtk_box_pack_start(GTK_BOX(eval->vbox_mouseselect), + eval->radiobutton_mouse_6, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_6), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_6), + "mouse_select", + "5" /* VLINE_MS */); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_6), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse6_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_6), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_6), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse), + NULL); + + + + eval->radiobutton_mouse_7 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Hor. Line")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_mouse_7)); + gtk_widget_ref(eval->radiobutton_mouse_7); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_mouse_7", + eval->radiobutton_mouse_7, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_mouse_7); + gtk_box_pack_start(GTK_BOX(eval->vbox_mouseselect), + eval->radiobutton_mouse_7, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_7), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_mouse_7), + "mouse_select", + "6" /* HLINE_MS */); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_7), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse7_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_7), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_mouse_7), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_piv_mouse), + NULL); + + +/* + * radio buttons for sub-pixel interpolation scheme + */ + + eval->frame_5 = gtk_frame_new(_("Interpolation scheme")); + gtk_widget_ref(eval->frame_5); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_5", + eval->frame_5, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_5); + gtk_table_attach(GTK_TABLE(eval->table), + eval->frame_5, + 0, + 1, + 2, + 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + eval->vbox10 = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox10); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox10", + eval->vbox10, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox10); + gtk_container_add(GTK_CONTAINER(eval->frame_5), + eval->vbox10); + + + eval->radiobutton_fit_none = + gtk_radio_button_new_with_label(eval->vbox10_group, + _("None")); + eval->vbox10_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_fit_none)); + gtk_widget_ref(eval->radiobutton_fit_none); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_fit_none", + eval->radiobutton_fit_none, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_fit_none); + gtk_box_pack_start(GTK_BOX(eval->vbox10), + eval->radiobutton_fit_none, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_none), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_none), + "ifit", + "0"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_none), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_fit_none), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + + eval->radiobutton_fit_gauss = + gtk_radio_button_new_with_label(eval->vbox10_group, + _("Gauss")); + eval->vbox10_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_fit_gauss)); + gtk_widget_ref(eval->radiobutton_fit_gauss); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_fit_gauss", + eval->radiobutton_fit_gauss, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_fit_gauss); + gtk_box_pack_start(GTK_BOX(eval->vbox10), + eval->radiobutton_fit_gauss, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_gauss), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_gauss), + "ifit", + "1"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_gauss), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_fit_gauss), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + + eval->radiobutton_fit_power = + gtk_radio_button_new_with_label(eval->vbox10_group, + _("Power")); + eval->vbox10_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_fit_power)); + gtk_widget_ref(eval->radiobutton_fit_power); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_fit_power", + eval->radiobutton_fit_power, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_fit_power); + gtk_box_pack_start(GTK_BOX(eval->vbox10), + eval->radiobutton_fit_power, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_power), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_power), + "ifit", + "2"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_power), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_fit_power), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + + eval->radiobutton_fit_gravity = + gtk_radio_button_new_with_label(eval->vbox10_group, + _("Gravity")); + eval->vbox10_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (eval->radiobutton_fit_gravity)); + gtk_widget_ref(eval->radiobutton_fit_gravity); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_fit_gravity", + eval->radiobutton_fit_gravity, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_fit_gravity); + gtk_box_pack_start(GTK_BOX(eval->vbox10), + eval->radiobutton_fit_gravity, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_gravity), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_gravity), + "ifit", + "3"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_gravity), + "var_type", + "0"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_fit_gravity), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + +/* eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, + _("Marquardt")); */ +/* eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); */ +/* gtk_widget_ref (eval->radiobutton_fit_marquardt); */ +/* gtk_object_set_data_full (GTK_OBJECT (main_window), + "radiobutton_fit_marquardt", + eval->radiobutton_fit_marquardt, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_widget_show (eval->radiobutton_fit_marquardt); */ +/* gtk_box_pack_start (GTK_BOX (eval->vbox10), + eval->radiobutton_fit_marquardt, + FALSE, + FALSE, + 0); */ + +/* gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), */ +/* "ifit", + "4"); */ +/* gtk_object_set_data(GTK_OBJECT(eval->radiobutton_fit_marquardt), + "eval", + eval); */ +/* gtk_object_set_data(GTK_OBJECT (eval->radiobutton_fit_marquardt), */ +/* "var_type", + "0"); */ +/* gtk_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), + "toggled", */ +/* GTK_SIGNAL_FUNC (on_toggle_piv), */ +/* NULL); */ + + + +/* + * radio buttons for correlation peak number to be detected + */ + eval->frame_6 = gtk_frame_new(_("Peak #")); + gtk_widget_ref(eval->frame_6); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_6", + eval->frame_6, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_6); + gtk_table_attach(GTK_TABLE(eval->table), + eval->frame_6, + 1, + 2, + 2, + 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + eval->vbox11 = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox11); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox11", + eval->vbox11, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox11); + gtk_container_add(GTK_CONTAINER(eval->frame_6), + eval->vbox11); + + eval->radiobutton_peak_1 = + gtk_radio_button_new_with_label(eval->vbox11_group, + _("1")); + eval->vbox11_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_peak_1)); + gtk_widget_ref(eval->radiobutton_peak_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_peak_1", + eval->radiobutton_peak_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_peak_1); + gtk_box_pack_start(GTK_BOX(eval->vbox11), + eval->radiobutton_peak_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_1), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_1), + "peak", + "1"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_1), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_peak_1), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + + eval->radiobutton_peak_2 = + gtk_radio_button_new_with_label(eval->vbox11_group, + _("2")); + eval->vbox11_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_peak_2)); + gtk_widget_ref(eval->radiobutton_peak_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_peak_2", + eval->radiobutton_peak_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_peak_2); + gtk_box_pack_start(GTK_BOX(eval->vbox11), + eval->radiobutton_peak_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_2), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_2), + "peak", + "2"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_2), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_peak_2), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + + eval->radiobutton_peak_3 = + gtk_radio_button_new_with_label(eval->vbox11_group, + _("3")); + eval->vbox11_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_peak_3)); + gtk_widget_ref(eval->radiobutton_peak_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_peak_3", + eval->radiobutton_peak_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_peak_3); + gtk_box_pack_start(GTK_BOX(eval->vbox11), + eval->radiobutton_peak_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_3), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_3), + "peak", + "3"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_peak_3), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_peak_3), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + +/* + * additonal calculation schemes for correlation detection + */ + + eval->frame_7 = gtk_frame_new(_("Interrogation with:")); + gtk_widget_ref(eval->frame_7); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_7", + eval->frame_7, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_7); + gtk_table_attach(GTK_TABLE(eval->table), + eval->frame_7, + 0, + 1, + 4, + 5, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + + eval->vbox12 = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox12); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox12", + eval->vbox12, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox12); + gtk_container_add(GTK_CONTAINER(eval->frame_7), + eval->vbox12); + + + eval->checkbutton_weightkernel = + gtk_check_button_new_with_label(_("Weight Kernel")); + gtk_widget_ref(eval->checkbutton_weightkernel); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "checkbutton_weightkernel", + eval->checkbutton_weightkernel, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->checkbutton_weightkernel); + gtk_box_pack_start(GTK_BOX(eval->vbox12), + eval->checkbutton_weightkernel, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->checkbutton_weightkernel), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->checkbutton_weightkernel), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(eval->checkbutton_weightkernel), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + + eval->checkbutton_zerooff = + gtk_check_button_new_with_label(_("Zero off-set")); + gtk_widget_ref(eval->checkbutton_zerooff); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "checkbutton_zerooff", + eval->checkbutton_zerooff, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->checkbutton_zerooff); + gtk_box_pack_start(GTK_BOX(eval->vbox12), + eval->checkbutton_zerooff, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->checkbutton_zerooff), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->checkbutton_zerooff), + "var_type", + "3"); + gtk_signal_connect(GTK_OBJECT(eval->checkbutton_zerooff), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + + eval->checkbutton_centraldiff = + gtk_check_button_new_with_label(_("Central diff.")); + gtk_widget_ref(eval->checkbutton_centraldiff); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "checkbutton_centraldiff", + eval->checkbutton_centraldiff, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->checkbutton_centraldiff); + gtk_box_pack_start(GTK_BOX(eval->vbox12), + eval->checkbutton_centraldiff, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->checkbutton_centraldiff), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->checkbutton_centraldiff), + "var_type", + "4"); + gtk_signal_connect(GTK_OBJECT(eval->checkbutton_centraldiff), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + +/* + * radio buttons for cross-or auto correlation + */ + + eval->frame_8 = gtk_frame_new(_("Correlation")); + gtk_widget_ref(eval->frame_8); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_8", + eval->frame_8, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_8); + gtk_table_attach(GTK_TABLE(eval->table), + eval->frame_8, + 1, + 2, + 4, + 5, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + eval->vbox13 = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(eval->vbox13); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox13", + eval->vbox13, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->vbox13); + gtk_container_add(GTK_CONTAINER(eval->frame_8), + eval->vbox13); + + + + eval->radiobutton_cross_1 = + gtk_radio_button_new_with_label(eval->vbox13_group, + _("Auto")); + eval->vbox13_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_cross_1)); + gtk_widget_ref(eval->radiobutton_cross_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_cross_1", + eval->radiobutton_cross_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_cross_1); + gtk_box_pack_start(GTK_BOX(eval->vbox13), + eval->radiobutton_cross_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_cross_1), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_cross_1), + "x_corr", + "0"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_cross_1), + "var_type", + "5"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_cross_1), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + + eval->radiobutton_cross_2 = + gtk_radio_button_new_with_label(eval->vbox13_group, + _("Cross")); + eval->vbox13_group = + gtk_radio_button_group(GTK_RADIO_BUTTON(eval->radiobutton_cross_2)); + gtk_widget_ref(eval->radiobutton_cross_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_cross_2", + eval->radiobutton_cross_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->radiobutton_cross_2); + gtk_box_pack_start(GTK_BOX(eval->vbox13), + eval->radiobutton_cross_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_cross_2), + "eval", + eval); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_cross_2), + "x_corr", + "1"); + gtk_object_set_data(GTK_OBJECT(eval->radiobutton_cross_2), + "var_type", + "5"); + gtk_signal_connect(GTK_OBJECT(eval->radiobutton_cross_2), + "toggled", + GTK_SIGNAL_FUNC(on_toggle_piv), + NULL); + + + +/* + * Monitoring the process by displaying interrogation area's in correlation + * function + */ + eval->frame_disprocess = + gtk_frame_new(_("Interrogation areas and correlation")); + gtk_widget_ref(eval->frame_disprocess); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_disprocess", + eval->frame_disprocess, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_disprocess); + gtk_table_attach(GTK_TABLE(eval->table), + eval->frame_disprocess, + 0, + 2, + 5, + 6, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + eval->table_disprocess = gtk_table_new(2, + 3, + FALSE); + gtk_widget_ref(eval->table_disprocess); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "table_disprocess", + eval->table_disprocess, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->table_disprocess); + gtk_container_add(GTK_CONTAINER(eval->frame_disprocess), + eval->table_disprocess); + + +/* + * drawing area interrogation area1 + */ + eval->frame_disprocess_int1 = gtk_frame_new(_("Int. area 1")); + gtk_widget_ref(eval->frame_disprocess_int1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_disprocess_int1", + eval->frame_disprocess_int1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_disprocess_int1); + gtk_table_attach(GTK_TABLE(eval->table_disprocess), + eval->frame_disprocess_int1, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + + eval->darea_disprocess_int1 = gtk_drawing_area_new(); + gtk_drawing_area_size(GTK_DRAWING_AREA(eval->darea_disprocess_int1), + MAX_INTERR_SIZE, MAX_INTERR_SIZE); + gtk_container_add(GTK_CONTAINER(eval->frame_disprocess_int1), + eval->darea_disprocess_int1); + gtk_widget_show(eval->darea_disprocess_int1); + + gtk_object_set_data(GTK_OBJECT(eval->darea_disprocess_int1), + "eval", + eval); + gtk_signal_connect(GTK_OBJECT(eval->darea_disprocess_int1), + "expose-event", + GTK_SIGNAL_FUNC + (on_darea_piv_disprocess_int1_expose), + NULL); + + + + +/* gnome canvas interrogation area1*/ +/* gtk_widget_push_visual (gdk_imlib_get_visual ()); */ +/* gtk_widget_push_colormap (gdk_imlib_get_colormap ()); */ +/* eval->canvas_disprocess_int1 = gnome_canvas_new (); */ +/* gtk_widget_pop_colormap (); */ +/* gtk_widget_pop_visual (); */ +/* gtk_widget_ref (eval->canvas_disprocess_int1); */ +/* gtk_object_set_data_full (GTK_OBJECT (main_window), + "canvas_disprocess_int1", + eval->canvas_disprocess_int1, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_widget_show (eval->canvas_disprocess_int1); */ +/* gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_int1 ), + eval->canvas_disprocess_int1); */ + + +/* --------- drawing area interrogation area2*/ + eval->frame_disprocess_int2 = gtk_frame_new(_("Int. area 2")); + gtk_widget_ref(eval->frame_disprocess_int2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_disprocess_int2", + eval->frame_disprocess_int2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_disprocess_int2); + gtk_table_attach(GTK_TABLE(eval->table_disprocess), + eval->frame_disprocess_int2, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + + eval->darea_disprocess_int2 = gtk_drawing_area_new(); + gtk_drawing_area_size(GTK_DRAWING_AREA(eval->darea_disprocess_int2), + MAX_INTERR_SIZE, + MAX_INTERR_SIZE); + gtk_container_add(GTK_CONTAINER(eval->frame_disprocess_int2), + eval->darea_disprocess_int2); + gtk_widget_show(eval->darea_disprocess_int2); + + gtk_object_set_data(GTK_OBJECT(eval->darea_disprocess_int2), + "eval", + eval); + gtk_signal_connect(GTK_OBJECT(eval->darea_disprocess_int2), + "expose-event", + GTK_SIGNAL_FUNC + (on_darea_piv_disprocess_int2_expose), + NULL); + + + + +/* gnome canvas interrogation area2*/ +/* gtk_widget_push_visual (gdk_imlib_get_visual ()); */ +/* gtk_widget_push_colormap (gdk_imlib_get_colormap ()); */ +/* eval->canvas_disprocess_int2 = gnome_canvas_new (); */ +/* gtk_widget_pop_colormap (); */ +/* gtk_widget_pop_visual (); */ +/* gtk_widget_ref (eval->canvas_disprocess_int2); */ +/* gtk_object_set_data_full (GTK_OBJECT (main_window), + "canvas_disprocess_int2", + eval->canvas_disprocess_int2, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_widget_show (eval->canvas_disprocess_int2); */ +/* gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_int2), + eval->canvas_disprocess_int2); */ + + +/* gnome canvas display covariance function*/ + eval->frame_disprocess_cov = gtk_frame_new(_("Correlation")); + gtk_widget_ref(eval->frame_disprocess_cov); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_disprocess_cov", + eval->frame_disprocess_cov, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_disprocess_cov); + gtk_table_attach(GTK_TABLE(eval->table_disprocess), + eval->frame_disprocess_cov, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + + eval->darea_disprocess_cov = gtk_drawing_area_new(); + gtk_drawing_area_size(GTK_DRAWING_AREA(eval->darea_disprocess_cov), + MAX_INTERR_SIZE, + MAX_INTERR_SIZE); + gtk_container_add(GTK_CONTAINER(eval->frame_disprocess_cov), + eval->darea_disprocess_cov); + gtk_widget_show(eval->darea_disprocess_cov); + + gtk_object_set_data(GTK_OBJECT(eval->darea_disprocess_cov), + "eval", + eval); + gtk_signal_connect(GTK_OBJECT(eval->darea_disprocess_cov), + "expose-event", + GTK_SIGNAL_FUNC(on_darea_piv_disprocess_cov_expose), + NULL); + + + + +/* gtk_widget_push_visual (gdk_imlib_get_visual ()); */ +/* gtk_widget_push_colormap (gdk_imlib_get_colormap ()); */ +/* eval->canvas_disprocess_cov = gnome_canvas_new (); */ +/* gtk_widget_pop_colormap (); */ +/* gtk_widget_pop_visual (); */ +/* gtk_widget_ref (eval->canvas_disprocess_cov); */ +/* gtk_object_set_data_full (GTK_OBJECT (main_window), + "canvas_disprocess_cov", + eval->canvas_disprocess_cov, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_widget_show (eval->canvas_disprocess_cov); */ +/* gtk_container_add (GTK_CONTAINER (eval->frame_disprocess_cov), + eval->canvas_disprocess_cov); */ + + +/* gnome canvas display values*/ + eval->frame_disprocess_dval = gtk_frame_new(_("Estimator")); + gtk_widget_ref(eval->frame_disprocess_dval); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_disprocess_dval", + eval->frame_disprocess_dval, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->frame_disprocess_dval); + gtk_table_attach(GTK_TABLE(eval->table_disprocess), + eval->frame_disprocess_dval, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + gtk_widget_push_visual(gdk_imlib_get_visual()); + gtk_widget_push_colormap(gdk_imlib_get_colormap()); + eval->canvas_disprocess_dval = gnome_canvas_new(); + gtk_widget_pop_colormap(); + gtk_widget_pop_visual(); + gtk_widget_ref(eval->canvas_disprocess_dval); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "canvas_disprocess_dval", + eval->canvas_disprocess_dval, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->canvas_disprocess_dval); + gtk_container_add(GTK_CONTAINER(eval->frame_disprocess_dval), + eval->canvas_disprocess_dval); + + +/* + * Define button to switched on/off + */ + eval->checkbutton_disprocess = + gtk_check_button_new_with_label(_("Display")); + gtk_widget_ref(eval->checkbutton_disprocess); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "checkbutton_disprocess", + eval->checkbutton_disprocess, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->checkbutton_disprocess); + gtk_table_attach(GTK_TABLE(eval->table_disprocess), + eval->checkbutton_disprocess, + 0, + 2, + 2, + 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + gtk_object_set_data(GTK_OBJECT(eval->checkbutton_disprocess), + "eval", + eval); + gtk_signal_connect(GTK_OBJECT(eval->checkbutton_disprocess), + "enter", + GTK_SIGNAL_FUNC(on_checkbutton_piv_disprocess_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->checkbutton_disprocess), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->checkbutton_disprocess), + "clicked", + GTK_SIGNAL_FUNC(on_checkbutton_piv_disprocess), + NULL); + + + +/* + * PIV activating button + */ + eval->button = gtk_button_new_with_label(_("piv")); + gtk_widget_ref(eval->button); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "button", + eval->button, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(eval->button); + gtk_table_attach(GTK_TABLE(eval->table), + eval->button, + 0, + 2, + 7, + 8, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + gtk_tooltips_set_tip(eval->tooltips, + eval->button, + _("analyses a PIV image (pair) resulting into mean displacements of the particle images within the interrogation areas"), + NULL); + + gtk_object_set_data(GTK_OBJECT(eval->button), + "eval", + eval); + gtk_signal_connect(GTK_OBJECT(eval->button), + "enter", + GTK_SIGNAL_FUNC(on_button_piv_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->button), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(eval->button), + "clicked", + GTK_SIGNAL_FUNC(on_button_piv), + NULL); + + +/* + * Setting initial values + */ + + +/* if (piv_eval_par.int_size_1 == 8) { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (eval->radiobutton_intsize1_1), + TRUE); */ +/* } */ + + + if (piv_eval_par.int_size_1 == 16) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize1_2), + TRUE); + } + + + if (piv_eval_par.int_size_1 == 32) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize1_3), + TRUE); + } + + + if (piv_eval_par.int_size_1 == 64) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize1_4), + TRUE); + } + + + if (piv_eval_par.int_size_1 == 128) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize1_5), + TRUE); + } + + + +/* if (piv_eval_par.int_size_2 == 8) { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (eval->radiobutton_intsize2_1), + TRUE); */ +/* } */ + + + if (piv_eval_par.int_size_2 == 16) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_2), + TRUE); + } + + + if (piv_eval_par.int_size_2 == 32) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_3), + TRUE); + } + + + if (piv_eval_par.int_size_2 == 64) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_4), + TRUE); + } + + + if (piv_eval_par.int_size_2 == 128) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intsize2_5), + TRUE); + } + + + + + if (piv_eval_par.int_shift == 8) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_1), + TRUE); + } + + + if (piv_eval_par.int_shift == 16) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_2), + TRUE); + } + + + if (piv_eval_par.int_shift == 32) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_3), + TRUE); + } + + + if (piv_eval_par.int_shift == 64) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_4), + TRUE); + } + + + if (piv_eval_par.int_shift == 128) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_intshift_5), + TRUE); + } + + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON + (eval->radiobutton_mouse_1), + TRUE); + + + if (piv_eval_par.ifit == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_fit_none), + TRUE); + } + + + if (piv_eval_par.ifit == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_fit_gauss), + TRUE); + } + + + if (piv_eval_par.ifit == 2) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_fit_power), + TRUE); + } + + + if (piv_eval_par.ifit == 3) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_fit_gravity), + TRUE); + } + + +/* if (ifit == -1) { */ +/* gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_fit_marquardt), + TRUE); */ +/* } */ + + + if (piv_eval_par.peak == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_peak_1), + TRUE); + } + + + if (piv_eval_par.peak == 2) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_peak_2), + TRUE); + } + + + if (piv_eval_par.peak == 3) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_peak_3), + TRUE); + } + + + if (piv_eval_par.weight == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_weightkernel), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_weightkernel), + FALSE); + } + + if (piv_eval_par.zero_off == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_zerooff), + FALSE); + } + + if (piv_eval_par.central_diff == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_centraldiff), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_centraldiff), + FALSE); + } + + + if (image_par.x_corr == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_cross_1), + TRUE); + } + + + if (image_par.x_corr == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->radiobutton_cross_2), + TRUE); + } + + + + + + if (gpiv_par.display_process == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_disprocess), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (eval->checkbutton_disprocess), + FALSE); + } + + + + return eval; +} diff --git a/src/piveval_interface.h b/src/piveval_interface.h new file mode 100644 index 0000000..34148c4 --- /dev/null +++ b/src/piveval_interface.h @@ -0,0 +1,163 @@ +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * PIV evaluation + * $Log: piveval_interface.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef GPIV_PIVEVAL_INTERFACE_H +#define GPIV_PIVEVAL_INTERFACE_H + + +typedef struct _PivEval PivEval; +struct _PivEval { + GtkTooltips *tooltips; + + GtkWidget *vbox_label; + GtkWidget *label_title; + + GtkWidget *vbox_scroll; + GtkWidget *scrolledwindow; + GtkWidget *viewport; + + GtkWidget *vbox_viewport1; + GtkWidget *table; + GtkWidget *table_aoi; + GtkWidget *label_colstart; + GtkWidget *label_colend; + GtkWidget *label_preshiftcol; + GtkWidget *label_rowstart; + GtkWidget *label_rowend; + GtkWidget *label_preshiftrow; + GtkObject *spinbutton_adj_colstart; + GtkWidget *spinbutton_colstart; + GtkObject *spinbutton_adj_colend; + GtkWidget *spinbutton_colend; + GtkObject *spinbutton_adj_preshiftcol; + GtkWidget *spinbutton_preshiftcol; + GtkObject *spinbutton_adj_rowstart; + GtkWidget *spinbutton_rowstart; + GtkObject *spinbutton_adj_rowend; + GtkWidget *spinbutton_rowend; + GtkObject *spinbutton_adj_preshiftrow; + GtkWidget *spinbutton_preshiftrow; + + GtkWidget *hbox_intreg; + GtkWidget *frame_2; + GtkWidget *vbox_intsize1; + GSList *int_size_1_group; + GtkObject *spinbutton_adj_intsize1; + GtkWidget *spinbutton_intsize1; +/* GtkWidget *radiobutton_intsize1_1; */ + GtkWidget *radiobutton_intsize1_2; + GtkWidget *radiobutton_intsize1_3; + GtkWidget *radiobutton_intsize1_4; + GtkWidget *radiobutton_intsize1_5; + + GtkWidget *frame_3; + GtkWidget *vbox_intsize2; + GSList *int_size_2_group/* = NULL */; + GtkObject *spinbutton_adj_intsize2; + GtkWidget *spinbutton_intsize2; + /* GtkWidget *radiobutton_intsize2_1; */ + GtkWidget *radiobutton_intsize2_2; +GtkWidget *radiobutton_intsize2_3; + GtkWidget *radiobutton_intsize2_4; + GtkWidget *radiobutton_intsize2_5; + + GtkWidget *frame_4; + GtkWidget *vbox_shift; + GSList *int_shift_group; + GtkObject *spinbutton_adj_intshift; + GtkWidget *spinbutton_intshift; + GtkWidget *radiobutton_intshift_1; + GtkWidget *radiobutton_intshift_2; + GtkWidget *radiobutton_intshift_3; + GtkWidget *radiobutton_intshift_4; + GtkWidget *radiobutton_intshift_5; + + GtkWidget *frame_1; + GtkWidget *vbox_mouseselect; +/* GSList *mouse_sel_group; */ + GtkWidget *radiobutton_mouse_1; + GtkWidget *radiobutton_mouse_2; + GtkWidget *radiobutton_mouse_3; + GtkWidget *radiobutton_mouse_4; + GtkWidget *radiobutton_mouse_5; + GtkWidget *radiobutton_mouse_6; + GtkWidget *radiobutton_mouse_7; + + GtkWidget *frame_disprocess; + GtkWidget *table_disprocess; + GtkWidget *frame_disprocess_int1; + GtkWidget *darea_disprocess_int1; + /* GtkWidget *canvas_disprocess_int1; */ + GtkWidget *frame_disprocess_int2; + GtkWidget *darea_disprocess_int2; + /* GtkWidget *canvas_disprocess_int2; */ + GtkWidget *frame_disprocess_dval; + GtkWidget *canvas_disprocess_dval; + GtkWidget *frame_disprocess_cov; + GtkWidget *darea_disprocess_cov; + /* GtkWidget *canvas_disprocess_cov; */ + GtkWidget *checkbutton_disprocess; + /* GtkWidget *table3; */ + + GtkWidget *frame_5; + GtkWidget *vbox10; + GSList *vbox10_group; + GtkWidget *radiobutton_fit_none; + GtkWidget *radiobutton_fit_gauss; + GtkWidget *radiobutton_fit_power; + GtkWidget *radiobutton_fit_gravity; + GtkWidget *frame_6; + GtkWidget *vbox11; + GSList *vbox11_group; + GtkWidget *radiobutton_peak_1; + GtkWidget *radiobutton_peak_2; + GtkWidget *radiobutton_peak_3; + GtkWidget *frame_7; + GtkWidget *vbox12; + GtkWidget *checkbutton_weightkernel; + GtkWidget *checkbutton_zerooff; + GtkWidget *checkbutton_centraldiff; + GtkWidget *frame_8; + GtkWidget *vbox13; + GSList *vbox13_group; + GtkWidget *radiobutton_cross_1; + GtkWidget *radiobutton_cross_2; + GtkWidget *button; +}; + + +PivEval * +create_piveval (GtkWidget *main_window, + GtkWidget *container); + +#endif /* GPIV_PIVEVAL_INTERFACE_H */ diff --git a/src/pivpost.c b/src/pivpost.c new file mode 100644 index 0000000..0ae5301 --- /dev/null +++ b/src/pivpost.c @@ -0,0 +1,699 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (callback) functions for Piv post processing window/tabulator + * $Log: pivpost.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + + +#include "gpiv_gtk.h" +#include "utils.h" +#include "pivpost.h" +#include "display.h" + + +/* + * Piv post-processing callbacks + */ +void +on_spinbutton_post_scale(GtkSpinButton * widget, GtkWidget * entry) +/* (GtkWidget *widget, gpointer data) */ +{ + enum VariableType { + COL_POS = 1, + ROW_POS = 2, + S_SCALE = 3, + T_SCALE = 4 + } var_type; + + var_type = atoi(gtk_object_get_data(GTK_OBJECT(widget), "var_type")); + + if (var_type == COL_POS) { + image_par.z_off_x = gtk_spin_button_get_value_as_float(widget); + image_par.z_off_logic = 1; + if (display_act != NULL) { + display_act->img.image_par.z_off_x = image_par.z_off_x; + display_act->img.image_par.z_off_logic = 1; + } + + } else if (var_type == ROW_POS) { + image_par.z_off_y = gtk_spin_button_get_value_as_float(widget); + image_par.z_off_logic = 1; + if (display_act != NULL) { + display_act->img.image_par.z_off_y = image_par.z_off_y; + display_act->img.image_par.z_off_logic = 1; + } + + } else if (var_type == S_SCALE) { + image_par.s_scale = gtk_spin_button_get_value_as_float(widget) * 1e-3; + image_par.s_scale_logic = 1; + if (display_act != NULL) { + display_act->img.image_par.s_scale = image_par.s_scale; + display_act->img.image_par.s_scale_logic = 1; + } + + } else if (var_type == T_SCALE) { + image_par.t_scale = gtk_spin_button_get_value_as_float(widget) * 1e-3; + image_par.t_scale_logic = 1; + if (display_act != NULL) { + display_act->img.image_par.t_scale = image_par.t_scale; + display_act->img.image_par.t_scale_logic = 1; + } + + } else { + g_warning("on_spinbutton_post_scale: should not arrive here"); + } + +} + + +void +on_button_post_scale_enter(GtkWidget *widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Calculates scaled locations and velocities"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + +void +on_button_post_scale(GtkWidget *widget, + gpointer data) +{ +/* PivPost * post = gtk_object_get_data(GTK_OBJECT(widget), "post"); */ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + g_warning("on_button_post_scale:: 1"); + exec_scale(gpiv->pivpost); + g_warning("on_button_post_scale:: 2"); + } + } +} + + +void +on_button_post_savg_enter(GtkWidget *widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Calculates spatial average displacements"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_post_savg(GtkWidget *widget, + gpointer data) +{ + PivPost * post = gtk_object_get_data(GTK_OBJECT(widget), "post"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + exec_savg(post); + } + } +} + + +void +on_button_post_subavg_enter(GtkWidget *widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Substracts mean displacements from PIV data"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_post_subavg(GtkWidget *widget, + gpointer data) +{ + PivPost * post = gtk_object_get_data(GTK_OBJECT(widget), "post"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + exec_subavg(post); + } + } +} + + +void +on_radiobutton_post_vorstra_output_enter(GtkWidget *widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Selects the differential quantity"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + +void +on_radiobutton_post_vorstra_output(GtkWidget *widget, + gpointer data) +{ + PivPost * post = gtk_object_get_data(GTK_OBJECT(widget), "post"); + piv_post_par.operator_vorstra = atoi(gtk_object_get_data + (GTK_OBJECT(widget), + "operator")); + fprintf(stderr, "operator_vorstra = %d\n", piv_post_par.operator_vorstra); + + if (piv_post_par.operator_vorstra == VORTICITY) { + gtk_widget_set_sensitive(post->radiobutton_vorstra_diffscheme_4, + TRUE); + } else { + if (piv_post_par.diff_type == CIRCULATION) { + piv_post_par.diff_type = CENTRAL; + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_diffscheme_1), + TRUE); + } + gtk_widget_set_sensitive(post->radiobutton_vorstra_diffscheme_4, + FALSE); + } +} + + +void +on_radiobutton_post_vorstra_diffscheme_enter(GtkWidget *widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Selects the type of differential scheme"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_radiobutton_post_vorstra_diffscheme(GtkWidget *widget, + gpointer data) +{ + piv_post_par.diff_type = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "diff_type")); +/* fprintf(stderr, "diff_type = %d\n", piv_post_par.diff_type); */ + +} + + +void +on_button_post_vorstra_enter(GtkWidget *widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Calculates differential quantity"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_post_vorstra(GtkWidget *widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + exec_vorstra(); + } + } +} + + +/* + * Other post-processing functions + */ + +void +exec_scale(PivPost * pivpost) +{ + + g_warning("exec_scale:: 1"); + if (display_act->gpd.scaled_piv) + gpiv_free_pivdata(&display_act->gpd.piv_data_scaled); + + display_act->gpd.piv_data_scaled.nx = display_act->gpd.piv_data.nx; + display_act->gpd.piv_data_scaled.ny = display_act->gpd.piv_data.ny; + gpiv_alloc_pivdata(&display_act->gpd.piv_data_scaled); + g_warning("exec_scale:: 2"); + + if(display_act->gpd.exist_piv && !cancel_process) { + if ((display_act->gpd.scaled_piv = + gpiv_post_scale (display_act->gpd.piv_data, + &display_act->gpd.piv_data_scaled, + display_act->img.image_par)) != 1) { + gtk_error("exec_scale:: Failure calling gpiv_post_scale"); + } + + free_post_bufmems(display_act); + } else { + gtk_warning(_("no PIV data")); + } + +} + + + +void exec_savg(PivPost * pivpost) +{ + gint ndata = 0; + gfloat mean_dx = 0.0, sdev_dx = 0.0, min_dx = 0.0, max_dx = 0.0; + gfloat mean_dy = 0.0, sdev_dy = 0.0, min_dy = 0.0, max_dy = 0.0; + + gfloat mean_dx_scaled = 0.0, sdev_dx_scaled = 0.0, min_dx_scaled = 0.0, + max_dx_scaled = 0.0; + gfloat mean_dy_scaled = 0.0, sdev_dy_scaled = 0.0, min_dy_scaled = 0.0, + max_dy_scaled = 0.0; + PivData dummy_data; + + if (display_act->gpd.exist_piv && !cancel_process) { + exec_process = TRUE; + piv_post_par.substract = 0; + gpiv_post_savg(display_act->gpd.piv_data, + &dummy_data, + piv_post_par, + &ndata, + &mean_dx, + &mean_dy, + &sdev_dx, + &sdev_dy, + &min_dx, + &min_dy, + &max_dx, + &max_dy); + + +/* display_act->gpd. */ + g_warning("::mean_dx = %f sdev_dx = %f min_dx = %f max_dx = %f", + mean_dx, sdev_dx, min_dx, max_dx); + g_warning("::mean_dy = %f sdev_dy = %f min_dy = %f max_dy = %f\n", + mean_dy, sdev_dy, min_dy, max_dy); + + + gtk_spin_button_set_value (GTK_SPIN_BUTTON + (pivpost->spinbutton_suavg), + (gfloat) mean_dx); + gtk_spin_button_set_value (GTK_SPIN_BUTTON + (pivpost->spinbutton_svavg), + (gfloat) mean_dy); + +/* + * Repete same process for scaled piv_data + */ + if (display_act->gpd.scaled_piv) { + gpiv_post_savg(display_act->gpd.piv_data_scaled, + &dummy_data, + piv_post_par, + &ndata, + &mean_dx_scaled, + &mean_dy_scaled, + &sdev_dx_scaled, + &sdev_dy_scaled, + &min_dx_scaled, + &min_dy_scaled, + &max_dx_scaled, + &max_dy_scaled); + + g_warning(":: mean_dx = %f sdev_dx = %f min_dx = %f max_dx = %f", + mean_dx_scaled, sdev_dx_scaled, min_dx_scaled, max_dx_scaled); + g_warning("::mean_dy = %f sdev_dy = %f min_dy = %f max_dy = %f\n", + mean_dy_scaled, sdev_dy_scaled, min_dy_scaled, max_dy_scaled); + + + gtk_spin_button_set_value (GTK_SPIN_BUTTON + (pivpost->spinbutton_suavg), + (gfloat) mean_dx_scaled); + gtk_spin_button_set_value (GTK_SPIN_BUTTON + (pivpost->spinbutton_svavg), + (gfloat) mean_dy_scaled); + } +/* + * Copy parameters in Buffer structure for saving and, eventual, + * later use + */ + + display_act->gpd.piv_post_par.z_off_dx = piv_post_par.z_off_dx; + display_act->gpd.piv_post_par.z_off_dy = piv_post_par.z_off_dy; + + display_act->gpd.piv_post_par.z_off_d_logic = 1; + exec_process = FALSE; + + } else { + gtk_warning(_("no PIV data")); + } + +/* g_warning("exec_savg:: entering"); */ +/* gtk_warning(_("not connected, yet")); */ + +} + + + +void exec_subavg(PivPost * pivpost) +{ + gint ndata = 0, i, j; + gfloat mean_dx = 0.0, sdev_dx = 0.0, min_dx = 0.0, max_dx = 0.0; + gfloat mean_dy = 0.0, sdev_dy = 0.0, min_dy = 0.0, max_dy = 0.0; + gfloat mean_dx_scaled = 0.0, sdev_dx_scaled = 0.0, min_dx_scaled = 0.0, + max_dx_scaled = 0.0; + gfloat mean_dy_scaled = 0.0, sdev_dy_scaled = 0.0, min_dy_scaled = 0.0, + max_dy_scaled = 0.0; + PivData out_data, out_data_scaled; + + out_data.point_x = NULL; + out_data.point_y = NULL; + out_data.dx = NULL; + out_data.dy = NULL; + out_data.snr = NULL; + out_data.peak_no = NULL; + + out_data_scaled.point_x = NULL; + out_data_scaled.point_y = NULL; + out_data_scaled.dx = NULL; + out_data_scaled.dy = NULL; + out_data_scaled.snr = NULL; + out_data_scaled.peak_no = NULL; + + if (display_act->gpd.exist_piv && !cancel_process) { + exec_process = TRUE; + piv_post_par.substract = 1; + out_data.nx = display_act->gpd.piv_data.nx; + out_data.ny = display_act->gpd.piv_data.ny; + gpiv_alloc_pivdata(&out_data); + gpiv_post_savg(display_act->gpd.piv_data, + &out_data, + piv_post_par, + &ndata, + &mean_dx, + &mean_dy, + &sdev_dx, + &sdev_dy, + &min_dx, + &min_dy, + &max_dx, + &max_dy); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(pivpost->spinbutton_suavg), + (gfloat) mean_dx); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(pivpost->spinbutton_svavg), + (gfloat) mean_dy); + + for (i = 0; i < display_act->gpd.piv_data.ny; i++) { + for (j = 0; j < display_act->gpd.piv_data.nx; j++) { + display_act->gpd.piv_data.dx[i][j] = out_data.dx[i][j]; + display_act->gpd.piv_data.dy[i][j] = out_data.dy[i][j]; + } + } + + gpiv_free_pivdata(&out_data); + update_all_vectors(&display_act->gpd); + +/* + * Repete same process for scaled piv_data + */ + if (display_act->gpd.scaled_piv) { + out_data.nx = display_act->gpd.piv_data_scaled.nx; + out_data.ny = display_act->gpd.piv_data_scaled.ny; + gpiv_alloc_pivdata(&out_data); + gpiv_post_savg(display_act->gpd.piv_data_scaled, + &out_data, + piv_post_par, + &ndata, + &mean_dx_scaled, + &mean_dy_scaled, + &sdev_dx_scaled, + &sdev_dy_scaled, + &min_dx_scaled, + &min_dy_scaled, + &max_dx_scaled, + &max_dy_scaled); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(pivpost->spinbutton_suavg), + (gfloat) mean_dx_scaled); + gtk_spin_button_set_value (GTK_SPIN_BUTTON(pivpost->spinbutton_svavg), + (gfloat) mean_dy_scaled); + + for (i = 0; i < display_act->gpd.piv_data.ny; i++) { + for (j = 0; j < display_act->gpd.piv_data.nx; j++) { + display_act->gpd.piv_data_scaled.dx[i][j] = out_data.dx[i][j]; + display_act->gpd.piv_data_scaled.dy[i][j] = out_data.dy[i][j]; + } + } + + gpiv_free_pivdata(&out_data); + + } + +/* + * Copy parameters in Buffer structure for saving and, eventual, + * later use + */ + + display_act->gpd.piv_post_par.z_off_dx = piv_post_par.z_off_dx; + display_act->gpd.piv_post_par.z_off_dy = piv_post_par.z_off_dy; + + display_act->gpd.piv_post_par.z_off_d_logic = 1; + exec_process = FALSE; + + } else { + gtk_warning(_("no PIV data")); + } + +/* g_warning("exec_savg:: entering"); */ +/* gtk_warning(_("not connected, yet")); */ +} + + + +void exec_vorstra(void) +{ +/* ScalarData out_data; */ + + if (display_act->gpd.exist_piv && !cancel_process) { + exec_process = TRUE; + + +/* + * Vorticity calculation + */ + if (piv_post_par.operator_vorstra == VORTICITY) { + if (display_act->gpd.exist_vor) { + destroy_all_scalars(&display_act->gpd.vor_data, + VORTICITY +/* display_act->gpd.gci_scalar_vor */ + ); + gpiv_free_scdata(&display_act->gpd.vor_data); + display_act->gpd.exist_vor = FALSE; +/* display_act->gpd.d_vor = FALSE; */ + } + + display_act->gpd.vor_data.nx = display_act->gpd.piv_data.nx; + display_act->gpd.vor_data.ny = display_act->gpd.piv_data.ny; + gpiv_alloc_scdata(&display_act->gpd.vor_data); + gpiv_post_vorstra(display_act->gpd.piv_data, &display_act->gpd.vor_data, + piv_post_par); + display_all_scalars(&display_act->gpd.vor_data, + VORTICITY +/* display_act->gpd.gci_scalar_vor */ + ); + display_act->gpd.exist_vor = TRUE; + display_act->gpd.saved_vor = FALSE; +/* display_act->gpd.d_vor = TRUE; */ + +/* + * Repete vorticity calculation process for scaled piv_data + */ + if (display_act->gpd.scaled_piv) { + display_act->gpd.vor_data_scaled.nx = + display_act->gpd.piv_data.nx; + display_act->gpd.vor_data_scaled.ny = + display_act->gpd.piv_data.ny; + gpiv_alloc_scdata(&display_act->gpd.vor_data_scaled); + gpiv_post_vorstra(display_act->gpd.piv_data, + &display_act->gpd.vor_data_scaled, + piv_post_par); + display_act->gpd.exist_vor_scaled = TRUE; + } + + +/* + * Shear strain calculation + */ + } else if (piv_post_par.operator_vorstra == S_STRAIN) { + if (display_act->gpd.exist_sstrain) { + destroy_all_scalars(&display_act->gpd.sstrain_data, S_STRAIN); + gpiv_free_scdata(&display_act->gpd.sstrain_data); + display_act->gpd.exist_sstrain = FALSE; +/* display_act->gpd.d_sstrain = FALSE; */ + } + + display_act->gpd.sstrain_data.nx = display_act->gpd.piv_data.nx; + display_act->gpd.sstrain_data.ny = display_act->gpd.piv_data.ny; + gpiv_alloc_scdata(&display_act->gpd.sstrain_data); + gpiv_post_vorstra(display_act->gpd.piv_data, &display_act->gpd.sstrain_data, + piv_post_par); + display_all_scalars(&display_act->gpd.sstrain_data, S_STRAIN); + display_act->gpd.exist_sstrain = TRUE; + display_act->gpd.saved_sstrain = FALSE; +/* display_act->gpd.d_sstrain = TRUE; */ + +/* + * Repete shear strain calculation process for scaled piv_data + */ + if (display_act->gpd.scaled_piv) { + display_act->gpd.sstrain_data_scaled.nx = + display_act->gpd.piv_data.nx; + display_act->gpd.sstrain_data_scaled.ny = + display_act->gpd.piv_data.ny; + gpiv_alloc_scdata(&display_act->gpd.sstrain_data_scaled); + gpiv_post_vorstra(display_act->gpd.piv_data, + &display_act->gpd.sstrain_data_scaled, + piv_post_par); + display_act->gpd.exist_sstrain_scaled = TRUE; + } + +/* + * Normal strain calculation + */ + } else if (piv_post_par.operator_vorstra == N_STRAIN) { + if (display_act->gpd.exist_nstrain) { + destroy_all_scalars(&display_act->gpd.nstrain_data, N_STRAIN); + gpiv_free_scdata(&display_act->gpd.nstrain_data); + display_act->gpd.exist_nstrain = FALSE; +/* display_act->gpd.d_nstrain = FALSE; */ + } + + display_act->gpd.nstrain_data.nx = display_act->gpd.piv_data.nx; + display_act->gpd.nstrain_data.ny = display_act->gpd.piv_data.ny; + gpiv_alloc_scdata(&display_act->gpd.nstrain_data); + gpiv_post_vorstra(display_act->gpd.piv_data, &display_act->gpd.nstrain_data, + piv_post_par); + display_all_scalars(&display_act->gpd.nstrain_data, N_STRAIN); + display_act->gpd.exist_nstrain = TRUE; + display_act->gpd.saved_nstrain = FALSE; +/* display_act->gpd.d_nstrain = TRUE; */ + +/* + * Repete normal strain calculation process for scaled piv_data + */ + if (display_act->gpd.scaled_piv) { + display_act->gpd.nstrain_data_scaled.nx = + display_act->gpd.piv_data.nx; + display_act->gpd.nstrain_data_scaled.ny = + display_act->gpd.piv_data.ny; + gpiv_alloc_scdata(&display_act->gpd.nstrain_data_scaled); + gpiv_post_vorstra(display_act->gpd.piv_data, + &display_act->gpd.nstrain_data_scaled, + piv_post_par); + display_act->gpd.exist_nstrain_scaled = TRUE; + } + + + + } else { + gtk_warning(_("non valid vorstra operation")); + } + exec_process = FALSE; + + } else { + gtk_warning(_("no PIV data")); + } + +/* -------------------------------------------------------------------- + Copy parameters in Buffer structure for saving and, eventual, + later use */ + + if (display_act->gpd.exist_vor || display_act->gpd.exist_sstrain || + display_act->gpd.exist_nstrain) { + + display_act->gpd.piv_post_par.diff_type = piv_post_par.diff_type; + display_act->gpd.piv_post_par.operator_vorstra = + piv_post_par.operator_vorstra; + + display_act->gpd.piv_post_par.diff_type_logic = 1; + display_act->gpd.piv_post_par.operator_vorstra_logic = 1; + + gpiv_post_print_parameters(display_act->gpd.piv_post_par); + } + + +/* gpiv_write_scdata( &display_act->gpd.vor_data, c_line, nc_lines, */ +/* scale, RCSID); */ + +} + diff --git a/src/pivpost.h b/src/pivpost.h new file mode 100644 index 0000000..5418e18 --- /dev/null +++ b/src/pivpost.h @@ -0,0 +1,120 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*--------------------------------------------------------------------- + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (callback) functions for Piv post-processing window/tabulator + * $Log: pivpost.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef PIVPOST_H +#define PIVPOST_H + + +void +on_spinbutton_post_scale(GtkSpinButton * widget, + GtkWidget * entry); + +/* void */ +/* on_checkbutton_post_scale_enter(GtkWidget *widget, */ +/* gpointer data); */ + +/* void */ +/* on_checkbutton_post_scale(GtkWidget *widget, */ +/* gpointer data); */ + + +void +on_button_post_scale_enter(GtkWidget *widget, + gpointer data); + +void +on_button_post_scale(GtkWidget *widget, + gpointer data); + +void +on_button_post_savg_enter(GtkWidget *widget, + gpointer data); + +void +on_button_post_savg(GtkWidget *widget, + gpointer data); + +void +on_button_post_subavg_enter(GtkWidget *widget, + gpointer data); + +void +on_button_post_subavg(GtkWidget *widget, + gpointer data); + +void +on_radiobutton_post_vorstra_output_enter(GtkWidget *widget, + gpointer data); + +void +on_radiobutton_post_vorstra_output(GtkWidget *widget, + gpointer data); + +void +on_radiobutton_post_vorstra_diffscheme_enter(GtkWidget *widget, + gpointer data); + +void +on_radiobutton_post_vorstra_diffscheme(GtkWidget *widget, + gpointer data); + +void +on_button_post_vorstra_enter(GtkWidget *widget, + gpointer data); + +void +on_button_post_vorstra(GtkWidget *widget, + gpointer data); + + + +/* + * Other post-processing functions + */ + +void +exec_scale(PivPost * pivpost); + +void +exec_savg(PivPost * pivpost); + +void +exec_subavg(PivPost * pivpost); + +void +exec_vorstra(void); + + + +#endif /* PIVPOST_H */ diff --git a/src/pivpost_interface.c b/src/pivpost_interface.c new file mode 100644 index 0000000..973e6eb --- /dev/null +++ b/src/pivpost_interface.c @@ -0,0 +1,1218 @@ +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * PIV Post-processing interface + * $Log: pivpost_interface.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gpiv_gtk.h" +#include "console.h" +#include "pivpost_interface.h" +#include "pivpost.h" + +PivPost* +create_pivpost (GtkWidget *main_window, + GtkWidget *container) +{ + PivPost * post = g_new0(PivPost, 1); + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(main_window), "gpiv"); + + post->tooltips = gtk_tooltips_new(); + + + + post->vbox_label = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(post->vbox_label); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_vbox_label", + post->vbox_label, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->vbox_label); + gtk_container_add(GTK_CONTAINER(container), + post->vbox_label); + + post->label_title = gtk_label_new(_("Piv: data post processing")); + gtk_widget_ref(post->label_title); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_label_title", + post->label_title, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->label_title); + gtk_box_pack_start(GTK_BOX(post->vbox_label), + post->label_title, FALSE, + FALSE, + 0); + + +/* + * Scrolled window + */ + post->vbox_scroll = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(post->vbox_scroll); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_vbox_scroll", + post->vbox_scroll, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->vbox_scroll); + gtk_box_pack_start(GTK_BOX(post->vbox_label), + post->vbox_scroll, + TRUE, + TRUE, + 0); + + + + post->scrolledwindow = gtk_scrolled_window_new(NULL, + NULL); + gtk_widget_ref(post->scrolledwindow); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_scrolledwindow", + post->scrolledwindow, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->scrolledwindow); + gtk_box_pack_start(GTK_BOX(post->vbox_scroll), + post->scrolledwindow, + TRUE, + TRUE, + 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW + (post->scrolledwindow), + GTK_POLICY_NEVER, + GTK_POLICY_NEVER + /* GTK_POLICY_AUTOMATIC */ ); + + + + post->viewport = gtk_viewport_new(NULL, + NULL); + gtk_widget_ref(post->viewport); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_viewport", + post->viewport, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->viewport); + gtk_container_add(GTK_CONTAINER(post->scrolledwindow), + post->viewport); + +/* + * main table for PIVPOST + */ + post->table = gtk_table_new(2, + 2, + FALSE); + gtk_widget_ref(post->table); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_table", + post->table, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->table); + gtk_container_add(GTK_CONTAINER(post->viewport), + post->table); + + + +/* + * Scale frame + */ +/* + * Spinners use the adjustment from spinbutton_adj_imgh_* + */ + post->frame_scale = gtk_frame_new(_("Scaling")); + gtk_widget_ref(post->frame_scale); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_frame_scale", + post->frame_scale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->frame_scale); + gtk_table_attach(GTK_TABLE(post->table), + post->frame_scale, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + post->table_scale = gtk_table_new(5, + 2, + FALSE); + gtk_widget_ref(post->table_scale); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_table_scale", + post->table_scale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->table_scale); + gtk_container_add(GTK_CONTAINER(post->frame_scale), + post->table_scale); + + +/* + *spinner for spatial scale "sscale" + */ + post->label_sscale = gtk_label_new(_("spatial scale (mm/px): ")); + gtk_widget_ref(post->label_sscale); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_label_sscale", + post->label_sscale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->label_sscale); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->label_sscale, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + +/* + * KEEP DISABLED + */ +/* spinbutton_adj_post_sscale = */ +/* gtk_adjustment_new(piv_post_par.s_scale, 0, 1279, 1, 100, 100); */ +/* + * end of KEEP DISABLED + */ + post->spinbutton_sscale = + gtk_spin_button_new(GTK_ADJUSTMENT(gpiv->imgh->spinbutton_adj_sscale), + 1, + 4); + gtk_widget_ref(post->spinbutton_sscale); + gtk_widget_show(post->spinbutton_sscale); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->spinbutton_sscale, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(post->spinbutton_sscale), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(post->spinbutton_sscale), + TRUE); + + gtk_object_set_data(GTK_OBJECT(post->spinbutton_sscale), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->spinbutton_sscale), + "var_type", + "3"); + gtk_signal_connect(GTK_OBJECT(post->spinbutton_sscale), + "changed", + on_spinbutton_post_scale, + post->spinbutton_sscale); + + +/* + *spinner for time scale "tscale" + */ + post->label_tscale = gtk_label_new(_("time scale (ms): ")); + gtk_widget_ref(post->label_tscale); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_label_tscale", + post->label_tscale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->label_tscale); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->label_tscale, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + +/* + * KEEP DISABLED + */ +/* spinbutton_adj_post_tscale = */ +/* gtk_adjustment_new(piv_post_par.t_scale, 0, 1279, 1, 100, 100); */ +/* + * end of KEEP DISABLED + */ + post->spinbutton_tscale = + gtk_spin_button_new(GTK_ADJUSTMENT(gpiv->imgh->spinbutton_adj_tscale), + 1, + 4); + gtk_widget_ref(post->spinbutton_tscale); + gtk_widget_show(post->spinbutton_tscale); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->spinbutton_tscale, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(post->spinbutton_tscale), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(post->spinbutton_tscale), + TRUE); + + gtk_object_set_data(GTK_OBJECT(post->spinbutton_tscale), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->spinbutton_tscale), + "var_type", + "4"); + gtk_signal_connect(GTK_OBJECT(post->spinbutton_tscale), + "changed", + on_spinbutton_post_scale, + post->spinbutton_tscale); + + + +/* + * spinner for column position + */ + post->label_colpos = gtk_label_new(_("pos. of col #0 (m): ")); + gtk_widget_ref(post->label_colpos); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_label_colpos", + post->label_colpos, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->label_colpos); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->label_colpos, + 0, + 1, + 2, + 3, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + +/* + * KEEP DISABLED + */ +/* spinbutton_adj_post_colpos = */ +/* gtk_adjustment_new(piv_post_par.z_off_x, 0, Z_OFF_MAX, 1, 100, */ +/* 100); */ +/* + * end of KEEP DISABLED + */ + post->spinbutton_colpos = + gtk_spin_button_new(GTK_ADJUSTMENT(gpiv->imgh->spinbutton_adj_colpos), + 1, + 4); + gtk_widget_ref(post->spinbutton_colpos); + gtk_widget_show(post->spinbutton_colpos); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->spinbutton_colpos, + 1, + 2, + 2, + 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(post->spinbutton_colpos), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(post->spinbutton_colpos), + TRUE); + + gtk_object_set_data(GTK_OBJECT(post->spinbutton_colpos), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->spinbutton_colpos), + "var_type", + "1"); + gtk_signal_connect(GTK_OBJECT(post->spinbutton_colpos), + "changed", + on_spinbutton_post_scale, + post->spinbutton_colpos); + + + +/* + * spinner for row position + */ + post->label_rowpos = gtk_label_new(_("pos. of row #0 (m): ")); + gtk_widget_ref(post->label_rowpos); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_label_rowpos", + post->label_rowpos, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->label_rowpos); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->label_rowpos, + 0, + 1, + 3, + 4, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + +/* + * KEEP DISABLED + */ +/* spinbutton_adj_post_rowpos = */ +/* gtk_adjustment_new(piv_post_par.z_off_y, 0, Z_OFF_MAX, 1, 100, */ +/* 100); */ +/* + * end of KEEP DISABLED + */ + post->spinbutton_rowpos = + gtk_spin_button_new(GTK_ADJUSTMENT(gpiv->imgh->spinbutton_adj_rowpos), + 1, + 4); + gtk_widget_ref(post->spinbutton_rowpos); + gtk_widget_show(post->spinbutton_rowpos); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->spinbutton_rowpos, + 1, + 2, + 3, + 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(post->spinbutton_rowpos), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(post->spinbutton_rowpos), + TRUE); + + gtk_object_set_data(GTK_OBJECT(post->spinbutton_rowpos), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->spinbutton_rowpos), + "var_type", + "2"); + gtk_signal_connect(GTK_OBJECT(post->spinbutton_rowpos), + "changed", + on_spinbutton_post_scale, + post->spinbutton_rowpos); + + + + post->button_scale = gtk_button_new_with_label(_("scale")); + gtk_widget_ref(post->button_scale); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_button_scale", + post->button_scale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->button_scale); + gtk_table_attach(GTK_TABLE(post->table_scale), + post->button_scale, + 0, + 2, + 4, + 5, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + gtk_tooltips_set_tip(post->tooltips, + post->button_scale, + _("Calculates time and spatial scaled particle " +"displacements (i.e. velocities) from a PIV displacement field, and their " +"scaled positions"), + NULL); + + gtk_object_set_data(GTK_OBJECT(post->button_scale), + "post", + post); + gtk_signal_connect(GTK_OBJECT(post->button_scale), + "enter", + GTK_SIGNAL_FUNC + (on_button_post_scale_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->button_scale), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->button_scale), + "clicked", + GTK_SIGNAL_FUNC(on_button_post_scale), + NULL); + + +/* + * Spatial average frame + */ + + post->frame_savg = gtk_frame_new(_("Spatial statistics")); + gtk_widget_ref(post->frame_savg); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_frame_savg", + post->frame_savg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->frame_savg); + gtk_table_attach(GTK_TABLE(post->table), + post->frame_savg, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + post->table_savg = gtk_table_new(2, + 4, + FALSE); + gtk_widget_ref(post->table_savg); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_table_savg", + post->table_savg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->table_savg); + gtk_container_add(GTK_CONTAINER(post->frame_savg), + post->table_savg); + + +/* + *spinner for spatial U-avg + */ + post->label_suavg = gtk_label_new(_("dx (px), U (m/s): ")); + gtk_widget_ref(post->label_suavg); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_label_suavg", + post->label_suavg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->label_suavg); + gtk_table_attach(GTK_TABLE(post->table_savg), + post->label_suavg, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + post->spinbutton_adj_suavg = +/* ARG1: piv_post_par.s_savg */ + gtk_adjustment_new(0. , + 0, + 1, + 0.01, + 0.1, + 10.0); + post->spinbutton_suavg = + gtk_spin_button_new(GTK_ADJUSTMENT(post->spinbutton_adj_suavg), + 1, + 4); + gtk_widget_ref(post->spinbutton_suavg); + gtk_widget_show(post->spinbutton_suavg); + gtk_table_attach(GTK_TABLE(post->table_savg), + post->spinbutton_suavg, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(post->spinbutton_suavg), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(post->spinbutton_suavg), + TRUE); +/* + * KEEP DISABLED + */ +/* gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), */ +/* "post", post); */ +/* gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), */ +/* "var_type", "3"); */ +/* gtk_signal_connect(GTK_OBJECT(post->spinbutton_suavg), */ +/* "changed", */ +/* on_spinbutton_post_suavg, */ +/* post->spinbutton_suavg); */ +/* + * end of KEEP DISABLED + */ + + + +/* + * spinner for spatial V-avg + */ + post->label_svavg = gtk_label_new(_("dy (px), V (m/s): ")); + gtk_widget_ref(post->label_svavg); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_label_svavg", + post->label_svavg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->label_svavg); + gtk_table_attach(GTK_TABLE(post->table_savg), + post->label_svavg, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + post->spinbutton_adj_svavg = +/* ARG1: piv_post_par.s_savg */ + gtk_adjustment_new(0.0 , + 0, + 100, + 0.1, + 0.1, + 10.0); + post->spinbutton_svavg = + gtk_spin_button_new(GTK_ADJUSTMENT(post->spinbutton_adj_svavg), + 1, + 4); + gtk_widget_ref(post->spinbutton_svavg); + gtk_widget_show(post->spinbutton_svavg); + gtk_table_attach(GTK_TABLE(post->table_savg), + post->spinbutton_svavg, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_entry_set_editable(GTK_ENTRY(post->spinbutton_svavg), + TRUE); + gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(post->spinbutton_svavg), + TRUE); +/* + * KEEP DISABLED + */ +/* gtk_object_set_data(GTK_OBJECT(post->spinbutton_svavg), */ +/* "var_type", "3"); */ +/* gtk_object_set_data(GTK_OBJECT(post->spinbutton_suavg), */ +/* "post", post); */ +/* gtk_signal_connect(GTK_OBJECT(post->spinbutton_svavg), */ +/* "changed", */ +/* on_spinbutton_post_svavg, */ +/* post->spinbutton_svavg); */ +/* + * end of KEEP DISABLED + */ + + +/* + * button to calculate averages + */ + post->button_savg = gtk_button_new_with_label(_("avarage")); + gtk_widget_ref(post->button_savg); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_button_savg", + post->button_savg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->button_savg); + gtk_table_attach(GTK_TABLE(post->table_savg), + post->button_savg, + 0, + 2, + 2, + 3, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_tooltips_set_tip(post->tooltips, post->button_savg, + _("Calculates spatial average particle displacements " +"or velocities from a velocity field, obtained from PIV data"), + NULL); + + gtk_object_set_data(GTK_OBJECT(post->button_savg), + "post", + post); + gtk_signal_connect(GTK_OBJECT(post->button_savg), + "enter", + GTK_SIGNAL_FUNC(on_button_post_savg_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->button_savg), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->button_savg), + "clicked", + GTK_SIGNAL_FUNC(on_button_post_savg), + NULL); + + +/* + * button to substracts averages + */ + post->button_subavg = gtk_button_new_with_label(_("substract")); + gtk_widget_ref(post->button_subavg); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_button_subavg", + post->button_subavg, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->button_subavg); + gtk_table_attach(GTK_TABLE(post->table_savg), + post->button_subavg, + 0, + 2, + 3, + 4, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + gtk_tooltips_set_tip(post->tooltips, + post->button_subavg, + _("Substracts the spatial averages, or values that " +"have been entered manually, from each estimator"), + NULL); + + gtk_object_set_data(GTK_OBJECT(post->button_subavg), + "post", + post); + gtk_signal_connect(GTK_OBJECT(post->button_subavg), + "enter", + GTK_SIGNAL_FUNC(on_button_post_subavg_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->button_subavg), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->button_subavg), + "clicked", + GTK_SIGNAL_FUNC(on_button_post_subavg), + NULL); + + +/* + * Vorstra frame + */ + post->frame_vorstra = gtk_frame_new(_("Vorticity & strain")); + gtk_widget_ref(post->frame_vorstra); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_frame_vorstra", + post->frame_vorstra, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->frame_vorstra); + gtk_table_attach(GTK_TABLE(post->table), + post->frame_vorstra, + 1, + 2, + 0, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + + + post->vbox_vorstra = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(post->vbox_vorstra); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_vbox_vorstra", + post->vbox_vorstra, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->vbox_vorstra); + gtk_container_add(GTK_CONTAINER(post->frame_vorstra), + post->vbox_vorstra); + + + + post->frame_vorstra_output = gtk_frame_new(_("Output:")); + gtk_widget_ref(post->frame_vorstra_output); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_frame_vorstra_output", + post->frame_vorstra_output, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->frame_vorstra_output); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra), + post->frame_vorstra_output, + TRUE, + TRUE, + 0); + gtk_frame_set_shadow_type(GTK_FRAME(post->frame_vorstra_output), + GTK_SHADOW_NONE); + + + + post->vbox_vorstra_output = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(post->vbox_vorstra_output); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_vbox_vorstra_output", + post->vbox_vorstra_output, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->vbox_vorstra_output); + gtk_container_add(GTK_CONTAINER(post->frame_vorstra_output), + post->vbox_vorstra_output); + + + + post->radiobutton_vorstra_output_1 = + gtk_radio_button_new_with_label(post->vbox_vorstra_output_group, + _("Vorticity")); + post->vbox_vorstra_output_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (post->radiobutton_vorstra_output_1)); + gtk_widget_ref(post->radiobutton_vorstra_output_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_radiobutton_vorstra_output_1", + post->radiobutton_vorstra_output_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->radiobutton_vorstra_output_1); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra_output), + post->radiobutton_vorstra_output_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_output_1), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_output_1), + "operator", + "0"); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_1), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_output_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_1), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_1), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_post_vorstra_output), + NULL); + + + + + post->radiobutton_vorstra_output_2 = + gtk_radio_button_new_with_label(post->vbox_vorstra_output_group, + _("Shear strain")); + post->vbox_vorstra_output_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (post->radiobutton_vorstra_output_2)); + gtk_widget_ref(post->radiobutton_vorstra_output_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_radiobutton_vorstra_output_2", + post->radiobutton_vorstra_output_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->radiobutton_vorstra_output_2); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra_output), + post->radiobutton_vorstra_output_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_output_2), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_output_2), + "operator", + "1"); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_2), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_output_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_2), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_2), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_post_vorstra_output), + NULL); + + + + + post->radiobutton_vorstra_output_3 = + gtk_radio_button_new_with_label(post->vbox_vorstra_output_group, + _("Normal strain")); + post->vbox_vorstra_output_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (post->radiobutton_vorstra_output_3)); + gtk_widget_ref(post->radiobutton_vorstra_output_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_radiobutton_vorstra_output_3", + post->radiobutton_vorstra_output_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->radiobutton_vorstra_output_3); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra_output), + post->radiobutton_vorstra_output_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_output_3), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_output_3), + "operator", + "2"); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_3), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_output_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_3), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_output_3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_post_vorstra_output), + NULL); + + + + post->frame_vorstra_diffscheme = gtk_frame_new(_("Differential scheme:")); + gtk_widget_ref(post->frame_vorstra_diffscheme); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_frame_vorstra_diffscheme", + post->frame_vorstra_diffscheme, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->frame_vorstra_diffscheme); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra), + post->frame_vorstra_diffscheme, + TRUE, + TRUE, + 0); + gtk_frame_set_shadow_type(GTK_FRAME(post->frame_vorstra_diffscheme), + GTK_SHADOW_NONE); + + + + + post->vbox_vorstra_diffscheme = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(post->vbox_vorstra_diffscheme); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_vbox_vorstra_diffscheme", + post->vbox_vorstra_diffscheme, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->vbox_vorstra_diffscheme); + gtk_container_add(GTK_CONTAINER(post->frame_vorstra_diffscheme), + post->vbox_vorstra_diffscheme); + + + + + post->radiobutton_vorstra_diffscheme_1 = + gtk_radio_button_new_with_label(post->vbox_vorstra_diffscheme_group, + _("Central")); + post->vbox_vorstra_diffscheme_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (post->radiobutton_vorstra_diffscheme_1)); + gtk_widget_ref(post->radiobutton_vorstra_diffscheme_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_radiobutton_vorstra_diffscheme_1", + post->radiobutton_vorstra_diffscheme_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->radiobutton_vorstra_diffscheme_1); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra_diffscheme), + post->radiobutton_vorstra_diffscheme_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_1), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_1), + "diff_type", + "0"); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_1), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_diffscheme_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_1), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_1), + "toggled", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_diffscheme), + NULL); + + + + post->radiobutton_vorstra_diffscheme_2 = + gtk_radio_button_new_with_label(post->vbox_vorstra_diffscheme_group, + _("Least squares")); + post->vbox_vorstra_diffscheme_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (post->radiobutton_vorstra_diffscheme_2)); + gtk_widget_ref(post->radiobutton_vorstra_diffscheme_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_radiobutton_vorstra_diffscheme_2", + post->radiobutton_vorstra_diffscheme_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->radiobutton_vorstra_diffscheme_2); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra_diffscheme), + post->radiobutton_vorstra_diffscheme_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_2), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_2), + "diff_type", + "1"); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_2), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_diffscheme_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_2), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_2), + "toggled", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_diffscheme), + NULL); + + + + + post->radiobutton_vorstra_diffscheme_3 = + gtk_radio_button_new_with_label(post->vbox_vorstra_diffscheme_group, + _("Richardson")); + post->vbox_vorstra_diffscheme_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (post->radiobutton_vorstra_diffscheme_3)); + gtk_widget_ref(post->radiobutton_vorstra_diffscheme_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_radiobutton_vorstra_diffscheme_3", + post->radiobutton_vorstra_diffscheme_3, + (GtkDestroyNotify) gtk_widget_unref); +/* + *Define which button is switched on at start up time + */ + if (piv_post_par.diff_type == 2) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_diffscheme_3), + TRUE); + } + gtk_widget_show(post->radiobutton_vorstra_diffscheme_3); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra_diffscheme), + post->radiobutton_vorstra_diffscheme_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_3), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_3), + "diff_type", + "2"); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_3), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_diffscheme_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_3), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_3), + "toggled", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_diffscheme), + NULL); + + + + + post->radiobutton_vorstra_diffscheme_4 = + gtk_radio_button_new_with_label(post->vbox_vorstra_diffscheme_group, + _("Circulation method")); + post->vbox_vorstra_diffscheme_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (post->radiobutton_vorstra_diffscheme_4)); + gtk_widget_ref(post->radiobutton_vorstra_diffscheme_4); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_radiobutton_vorstra_diffscheme_4", + post->radiobutton_vorstra_diffscheme_4, + (GtkDestroyNotify) gtk_widget_unref); +/* + *Define which button is switched on at start up time + */ + if (piv_post_par.diff_type == 3) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_diffscheme_4), + TRUE); + } + gtk_widget_show(post->radiobutton_vorstra_diffscheme_4); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra_diffscheme), + post->radiobutton_vorstra_diffscheme_4, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_4), + "post", + post); + gtk_object_set_data(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_4), + "diff_type", + "3"); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_4), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_diffscheme_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_4), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->radiobutton_vorstra_diffscheme_4), + "toggled", + GTK_SIGNAL_FUNC + (on_radiobutton_post_vorstra_diffscheme), + NULL); + + +/* + * Define which button is switched on at start up time; moved to the + * end of the tabulator as diff_scheme button Circulation might be + * enabled or disabled + */ + if (piv_post_par.operator_vorstra == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_output_1), + TRUE); + } else if (piv_post_par.operator_vorstra == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_output_2), + TRUE); + } else if (piv_post_par.operator_vorstra == 2) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_output_3), + TRUE); + } + + + if (piv_post_par.diff_type == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_diffscheme_1), + TRUE); + } + if (piv_post_par.diff_type == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_diffscheme_2), + TRUE); + } else if (piv_post_par.diff_type == 2) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (post->radiobutton_vorstra_diffscheme_3), + TRUE); + } + + + + + post->button_vorstra = gtk_button_new_with_label(_("vorticity")); + gtk_widget_ref(post->button_vorstra); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "post_button_vorstra", + post->button_vorstra, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(post->button_vorstra); + gtk_box_pack_start(GTK_BOX(post->vbox_vorstra), + post->button_vorstra, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(post->tooltips, + post->button_vorstra, + _("Calculates vorticity or strain magnitudes from a velocity field, obtained by PIV"), + NULL); + gtk_object_set_data(GTK_OBJECT(post->button_vorstra), + "post", + post); + gtk_signal_connect(GTK_OBJECT(post->button_vorstra), + "enter", + GTK_SIGNAL_FUNC(on_button_post_vorstra_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(post->button_vorstra), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(post->button_vorstra), + "clicked", + GTK_SIGNAL_FUNC(on_button_post_vorstra), + NULL); + + + return post; +} diff --git a/src/pivpost_interface.h b/src/pivpost_interface.h new file mode 100644 index 0000000..4ec6819 --- /dev/null +++ b/src/pivpost_interface.h @@ -0,0 +1,99 @@ +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * PIV post processing + * $Log: pivpost_interface.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef GPIV_PIVPOST_INTERFACE_H +#define GPIV_PIVPOST_INTERFACE_H + + +typedef struct _PivPost PivPost; +struct _PivPost { + GtkTooltips *tooltips; + + GtkWidget *vbox_label; + GtkWidget *label_title; + GtkWidget *vbox_scroll; + GtkWidget *scrolledwindow; + GtkWidget *viewport; + GtkWidget *table; + + GtkWidget *frame_scale; + GtkWidget *table_scale; + GtkWidget *label_sscale; +/* GtkObject *spinbutton_adj_sscale; */ + GtkWidget *spinbutton_sscale; + GtkWidget *label_tscale; +/* GtkObject *spinbutton_adj_tscale; */ + GtkWidget *spinbutton_tscale; + GtkWidget *label_colpos; +/* GtkObject *spinbutton_adj_colpos; */ + GtkWidget *spinbutton_colpos; + GtkWidget *label_rowpos; +/* GtkObject *spinbutton_adj_rowpos; */ + GtkWidget *spinbutton_rowpos; + GtkWidget *button_scale; + + GtkWidget *frame_savg; + GtkWidget *table_savg; + GtkWidget *label_suavg; + GtkObject *spinbutton_adj_suavg; + GtkWidget *spinbutton_suavg; + GtkWidget *label_svavg; + GtkObject *spinbutton_adj_svavg; + GtkWidget *spinbutton_svavg; + GtkWidget *button_savg; + GtkWidget *button_subavg; + + GtkWidget *frame_vorstra; + GtkWidget *vbox_vorstra; + GtkWidget *frame_vorstra_output; + GtkWidget *vbox_vorstra_output; + GSList *vbox_vorstra_output_group; + + GtkWidget *radiobutton_vorstra_output_1; + GtkWidget *radiobutton_vorstra_output_2; + GtkWidget *radiobutton_vorstra_output_3; + GtkWidget *frame_vorstra_diffscheme; + GtkWidget *vbox_vorstra_diffscheme; + GSList *vbox_vorstra_diffscheme_group/* = NULL */; + GtkWidget *radiobutton_vorstra_diffscheme_1; + GtkWidget *radiobutton_vorstra_diffscheme_2; + GtkWidget *radiobutton_vorstra_diffscheme_3; + GtkWidget *radiobutton_vorstra_diffscheme_4; + GtkWidget *button_vorstra; +}; + +PivPost * +create_pivpost (GtkWidget *main_window, + GtkWidget *container); + +#endif /* GPIV_PIVPOST_INTERFACE_H */ diff --git a/src/pivvalid.c b/src/pivvalid.c new file mode 100644 index 0000000..0ed7043 --- /dev/null +++ b/src/pivvalid.c @@ -0,0 +1,666 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (callback) functions for Piv validation window/tabulator + * $Log: pivvalid.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + + +#include "gpiv_gtk.h" +#include "utils.h" +#include "pivvalid.h" +#include "display.h" +/* + * Piv validation window/tabulator callbacks + */ +void +on_button_valid_gradient_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Examines PIV data on velocity gradients"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); + +} + + +void +on_button_valid_gradient(GtkWidget * widget, + gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + + exec_gradient(); + } + } +} + + +void +on_radiobutton_valid_disable_0_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("No mouse activity within displayer"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); + +} + + +void +on_radiobutton_valid_disable_1_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Enables a single PIV data-point"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); + +} + + +void +on_radiobutton_valid_disable_2_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Disables a single PIV data-point"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); + +} + + +void +on_radiobutton_valid_disable_3_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Enables an area containing PIV data"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); + +} + + +void +on_radiobutton_valid_disable_4_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Disables an area containing PIV data"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); + +} + + +void +on_radiobutton_valid_disable(GtkWidget * widget, + gpointer data) +{ + m_select = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "mouse_select")); +} + +void on_radiobutton_valid_errvec_residu_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Defines residu type to examine data on"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void on_radiobutton_valid_errvec_residu(GtkWidget * widget, gpointer data) +{ + piv_valid_par.residu_type = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "residu")); + +/* if (piv_valid_par.residu_type == SNR) { */ +/* fprintf(stderr, "residu_type SNR\n"); */ +/* } else if (piv_valid_par.residu_type == MEDIAN) { */ +/* fprintf(stderr, "residu_type MEDIAN\n"); */ +/* } else { */ +/* fprintf(stderr, "NO valid residu_type\n"); */ +/* } */ + +} + + + +void +on_button_valid_errvec_resstats_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Displays inverse cumulative histogram of residus"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_valid_errvec_resstats(GtkWidget * widget, gpointer data) +{ + PivValid * valid = gtk_object_get_data(GTK_OBJECT(widget), "valid"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + piv_valid_par.res_stats = 1; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + + exec_errvec(valid); + } + + piv_valid_par.res_stats = 0; + } +} + + + +void +on_spinbutton_valid_errvec_yield(GtkSpinButton *widget, + GtkWidget *entry) +{ + piv_valid_par.data_yield = gtk_spin_button_get_value_as_float(widget); +} + + + +void +on_spinbutton_valid_errvec_res(GtkSpinButton *widget, + GtkWidget *entry) +{ + piv_valid_par.residu_max = gtk_spin_button_get_value_as_float(widget); + if (v_color == SHOW_SNR && display_act->gpd.exist_piv) { + update_all_vectors(&display_act->gpd); + } +} + + + +void +on_checkbutton_valid_errvec_disres_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Display PIV vector colors related to residu or SNR value"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + +void +on_checkbutton_valid_errvec_disres(GtkSpinButton *widget, + GtkWidget *entry) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + v_color = SHOW_SNR; + } else { + v_color = SHOW_PEAKNR; + } + + + if (display_act->gpd.exist_piv && display_act->display_piv) { + update_all_vectors(&display_act->gpd); + } +} + + +void on_radiobutton_valid_errvec_subst_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Defines how to substitute the data"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + + +void on_radiobutton_valid_errvec_subst(GtkWidget * widget, gpointer data) +{ + piv_valid_par.subst_type = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "substitute")); + +/* if (piv_valid_par.subst_type == L_MEAN) { */ +/* fprintf(stderr, "subst_type L_MEAN\n"); */ +/* } else if (piv_valid_par.subst_type == SUBTYPE_MEDIAN) { */ +/* fprintf(stderr, "subst_type SUBTYPE_MEDIAN\n"); */ +/* } else if (piv_valid_par.subst_type == COV_PEAK) { */ +/* fprintf(stderr, "subst_type COV_PEAK\n"); */ +/* } else { */ +/* fprintf(stderr, "NO valid subst_type\n"); */ +/* } */ + +} + + +void +on_button_valid_errvec_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Examines PIV data on outliers and substitutes"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + +void +on_button_valid_errvec(GtkWidget * widget, gpointer data) +{ + PivValid * valid = gtk_object_get_data(GTK_OBJECT(widget), "valid"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + piv_valid_par.res_stats = 0; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + + exec_errvec(valid); + } + } +} + + +void on_spinbutton_valid_peaklck_bins(GtkSpinButton * widget, + GtkWidget * entry) +{ + gpiv_par.nbins = gtk_spin_button_get_value_as_int(widget); +} + + + +void on_button_valid_peaklck_enter(GtkWidget * widget, gpointer data) +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gchar *msg = _("Calculates a histogram of sub-pixel displacements"); + gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); +} + + + +void on_button_valid_peaklck(GtkWidget * widget, gpointer data) +{ + PivValid * valid = gtk_object_get_data(GTK_OBJECT(widget), "valid"); + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + gint row, ibuf; + + if (nbufs > 0) { + for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; + row++) { + display_act = gtk_clist_get_row_data(GTK_CLIST(gpiv->clist_buf), + row); + + ibuf = display_act->count; + if (display[ibuf] != NULL + && display_act->mwin != NULL + && GTK_WIDGET_VISIBLE(GTK_WIDGET(display_act->mwin)) ) { + gdk_window_show(GTK_WIDGET(display_act->mwin)->window); + gdk_window_raise(GTK_WIDGET(display_act->mwin)->window); + } + + exec_peaklock(valid); + } + } +} + + + +/* + * Other validation functions than callbacks + */ + +void exec_gradient(void) +/* ----------------------------------------------------------------- + Testing on gradient of displacements/veocity within Int. Area */ +{ + if (display_act->gpd.exist_piv && !cancel_process) { + exec_process = TRUE; +/* g_warning("on_button_valid_gradient:: gpiv_valid_gradient"); */ + gpiv_valid_gradient(piv_valid_par, + piv_eval_par, + &display_act->gpd.piv_data); +/* g_warning("on_button_valid_gradient:: update_all_vectors"); */ + update_all_vectors(&display_act->gpd); + exec_process = FALSE; + } else { + gtk_warning(_("no PIV data")); + } +/* g_warning("on_button_valid_gradient:: LEAVE"); */ +} + + + +void exec_errvec(PivValid * valid) +{ + gint i, j; + + + GnomeCanvasItem *bg, *bar, *fitline; + GnomeCanvasPoints *points; + double canvas_margin = 20.; + + double canvas_startx = -50.; + double canvas_endx = 150.; + double disp_width = canvas_endx - canvas_startx - 2 * canvas_margin; + + double canvas_starty = -50.; + double canvas_endy = 150.; + double disp_height = canvas_endy - canvas_starty - 2 * canvas_margin; + + double canvas_x1 = canvas_startx + canvas_margin; + double canvas_y1 = canvas_starty + canvas_margin + disp_height; + + double x_val, y_val, x_normf, y_normf; + PivData out_data; + BinData klass; + LinRegData linreg; + + double centre_max = -10.0E+9; + + out_data.point_x = NULL; + out_data.point_y = NULL; + out_data.dx = NULL; + out_data.dy = NULL; + out_data.snr = NULL; + out_data.peak_no = NULL; + + klass.bound = NULL; + klass.centre = NULL; + klass.count = NULL; + + linreg.c0 = 0.0; + linreg.c1 = 0.0; + linreg.cov00 = 0.0; + linreg.cov11 = 0.0; + linreg.cov01 = 0.0; + linreg.sumsq = 0.0; + + points = gnome_canvas_points_new(2); + + + if (display_act->gpd.exist_piv && !cancel_process) { + exec_process = TRUE; + out_data.nx = display_act->gpd.piv_data.nx; + out_data.ny = display_act->gpd.piv_data.ny; + gpiv_alloc_pivdata(&out_data); + klass.nbins = out_data.nx * out_data.ny / NBINS_DEFAULT; + gpiv_alloc_bindata(&klass); + + if (piv_valid_par.res_stats == 1) { +/* g_warning(" exec_errvec:: will process err_vec res_stats nbins=%d", */ +/* klass.nbins); */ + bg = gnome_canvas_item_new(gnome_canvas_root + (GNOME_CANVAS(valid->canvas_peaklck)), + gnome_canvas_rect_get_type(), + "x1", (double) canvas_startx , + "y1", (double) canvas_starty, + "x2", (double) canvas_endx , + "y2", (double) canvas_endy, + "fill_color", "darkblue", + "outline_color", "red", + "width_units", 2.0, + NULL); + + gpiv_valid_errvec(fname, image_par, piv_eval_par, piv_valid_par, + display_act->gpd.piv_data, &out_data, &klass, + &linreg, (int) display_act->img.exist_img, + display_act->img.img1, display_act->img.img2); + +/* -------------------------------------------------------------------- + normalizing data between 0 and 1 and displaying histo and estimated + line curve */ + for (i = 0; i < klass.nbins; i++) { + if (klass.centre[i] > centre_max) + centre_max = klass.centre[i]; + } + + x_normf = (double) disp_width / (klass.max - klass.min); + y_normf = (double) centre_max; + + for (i = 0; i < klass.nbins - 1; i++) { + x_val = (double) (klass.bound[i]) / x_normf; + y_val = (double) klass.centre[i] / y_normf; + bar = + gnome_canvas_item_new(gnome_canvas_root + (GNOME_CANVAS(valid->canvas_peaklck)), + gnome_canvas_rect_get_type(), + "x1", canvas_x1 + + (double) klass.bound[i] * x_normf, + "y1", canvas_y1 - + (double) disp_height * y_val, + "x2", canvas_x1 + + (double) klass.bound[i + 1] * x_normf, + "y2", (double) canvas_y1, + "fill_color", "darkgreen", + "outline_color", "blue", + "width_units", 2.0, + NULL); + } + + piv_valid_par.residu_max = + gpiv_valid_threshold(display_act->gpd.piv_eval_par, + piv_valid_par, linreg); + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (valid->spinbutton_errvec_res), + piv_valid_par.residu_max); + + + + points->coords[0] = (double) canvas_x1; + points->coords[1] = (double) canvas_y1 + - (double) linreg.c0 / y_normf * (double) disp_height + ; + points->coords[2] = (double) canvas_x1 + + (double) disp_width; + points->coords[3] = (double) canvas_y1 + - (double) linreg.c0 / y_normf * (double) disp_height + - (double) linreg.c1 * (double) (disp_width) * (double) (disp_height) + / ( x_normf * y_normf) + ; + +/* points->coords[0] = (double) canvas_x1; */ +/* points->coords[1] = (double) canvas_y1; */ +/* points->coords[2] = (double) canvas_x1 + (double) disp_width; */ +/* points->coords[3] = (double) canvas_y1 - (double) disp_height; */ + + fitline = + gnome_canvas_item_new(gnome_canvas_root + (GNOME_CANVAS(valid->canvas_peaklck)), + gnome_canvas_line_get_type(), + "points", points, + "fill_color", "red", + "width_units", (double) 2.0, + NULL); + + } else { +/* g_warning(" exec_errvec:: err_vec with subst = %d", piv_valid_par.subst_type); */ + gpiv_valid_errvec(fname, image_par, piv_eval_par, piv_valid_par, + display_act->gpd.piv_data, &out_data, &klass, + &linreg, (int) display_act->img.exist_img, + display_act->img.img1, display_act->img.img2); + + + for (i = 0; i < out_data.ny; i++) { + for (j = 0; j < out_data.nx; j++) { + display_act->gpd.piv_data.dx[i][j] = out_data.dx[i][j]; + display_act->gpd.piv_data.dy[i][j] = out_data.dy[i][j]; + display_act->gpd.piv_data.snr[i][j] = out_data.snr[i][j]; + display_act->gpd.piv_data.peak_no[i][j] = out_data.peak_no[i][j]; + } + } + update_all_vectors(&display_act->gpd); + + } + gpiv_free_bindata(&klass); + gpiv_free_pivdata(&out_data); + + display_act->gpd.exist_valid = TRUE; + +/* -------------------------------------------------------------------- + Copy parameters in Buffer structure for saving and, eventual, + later use */ + + display_act->gpd.piv_valid_par.auto_thresh = piv_valid_par.auto_thresh; + display_act->gpd.piv_valid_par.residu_max = piv_valid_par.residu_max; + display_act->gpd.piv_valid_par.res_stats = piv_valid_par.res_stats; + display_act->gpd.piv_valid_par.data_yield = piv_valid_par.data_yield; + display_act->gpd.piv_valid_par.residu_type = piv_valid_par.residu_type; + display_act->gpd.piv_valid_par.subst_type = piv_valid_par.subst_type; + display_act->gpd.piv_valid_par.histo_type = piv_valid_par.histo_type; + + display_act->gpd.piv_valid_par.auto_thresh_logic = 1; + display_act->gpd.piv_valid_par.residu_max_logic = 1; + display_act->gpd.piv_valid_par.res_stats_logic = 1; + display_act->gpd.piv_valid_par.data_yield_logic = piv_valid_par.data_yield_logic; + display_act->gpd.piv_valid_par.residu_type_logic = 1; + display_act->gpd.piv_valid_par.subst_type_logic = 1; + display_act->gpd.piv_valid_par.histo_type_logic = 1; + exec_process = FALSE; + + } else { + gtk_warning(_("no PIV data")); + } + + gnome_canvas_points_free(points); + +} + + + +void exec_peaklock(PivValid * valid) +{ + + gint i; + GnomeCanvasItem *bg, *bar; + double canvas_margin = 20.; + + double canvas_startx = -50.; + double canvas_endx = 150.; + double d_width = canvas_endx - canvas_startx - 2 * canvas_margin; + + double canvas_starty = -50.; + double canvas_endy = 150.; + double d_height = canvas_endy - canvas_starty - 2 * canvas_margin; + + double canvas_x1 = canvas_startx + canvas_margin; + double canvas_y1 = canvas_starty + canvas_margin + d_height; + + double y_val; + gint count_max = -10000; + BinData klass; + + klass.bound = NULL; + klass.centre = NULL; + klass.count = NULL; + + klass.nbins = gpiv_par.nbins; + + if (display_act->gpd.exist_piv && !cancel_process) { + exec_process = TRUE; +/* g_warning("will process peaklock\n"); */ + gpiv_alloc_bindata(&klass); + + bg = + gnome_canvas_item_new(gnome_canvas_root + (GNOME_CANVAS(valid->canvas_peaklck)), + gnome_canvas_rect_get_type(), + "x1", (double) canvas_startx , + "y1", (double) canvas_starty, + "x2", (double) canvas_endx , + "y2", (double) canvas_endy, + "fill_color", "darkgreen", + "outline_color", "red", + "width_units", 2.0, + NULL); + + gpiv_valid_peaklck(display_act->gpd.piv_data, &klass); + +/* -------------------------------------------------------------------- + normalizing data between 0 and 1 */ + for (i = 0; i < klass.nbins; i++) { + if (klass.count[i] > count_max) count_max = klass.count[i]; + } + + for (i = 0; i < klass.nbins; i++) { + y_val = (double) klass.count[i] / (double) count_max; + bar = + gnome_canvas_item_new(gnome_canvas_root + (GNOME_CANVAS(valid->canvas_peaklck)), + gnome_canvas_rect_get_type(), + "x1", canvas_x1 + + (double) klass.bound[i] * d_width, + "y1", canvas_y1 - + (double) d_height * y_val, + "x2", canvas_x1 + + (double) klass.bound[i+1] * d_width, + "y2", canvas_y1, + "fill_color", "yellow", + "outline_color", "blue", + "width_units", 2.0, + NULL); + } + + gpiv_free_bindata(&klass); + display_act->gpd.exist_valid = TRUE; + exec_process = FALSE; + + } else { + gtk_warning(_("no PIV data")); + } + +} + + + diff --git a/src/pivvalid.h b/src/pivvalid.h new file mode 100644 index 0000000..c7932e8 --- /dev/null +++ b/src/pivvalid.h @@ -0,0 +1,152 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * (callback) functions for Piv validation window/tabulator + * $Log: pivvalid.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef PIVVALID_H +#define PIVVALID_H + +void +on_button_valid_gradient_enter(GtkWidget * widget, gpointer data); + + +void +on_button_valid_gradient(GtkWidget * widget, + gpointer data); + + +void +on_radiobutton_valid_disable_0_enter(GtkWidget * widget, + gpointer data); + +void +on_radiobutton_valid_disable_1_enter(GtkWidget * widget, + gpointer data); + +void +on_radiobutton_valid_disable_2_enter(GtkWidget * widget, + gpointer data); + +void +on_radiobutton_valid_disable_3_enter(GtkWidget * widget, + gpointer data); + +void +on_radiobutton_valid_disable_4_enter(GtkWidget * widget, + gpointer data); + +void +on_radiobutton_valid_disable(GtkWidget * widget, + gpointer data); + +void +on_radiobutton_valid_errvec_residu_enter(GtkWidget * widget, + gpointer data); + + +void +on_radiobutton_valid_errvec_residu(GtkWidget * widget, + gpointer data); + +void +on_button_valid_errvec_resstats_enter(GtkWidget * widget, + gpointer data); + +void +on_button_valid_errvec_resstats(GtkWidget * widget, + gpointer data); + +void +on_spinbutton_valid_errvec_yield(GtkSpinButton *widget, + GtkWidget *entry); + +void +on_spinbutton_valid_errvec_res(GtkSpinButton *widget, + GtkWidget *entry); + +void +on_checkbutton_valid_errvec_disres_enter(GtkWidget * widget, + gpointer data); + +void +on_checkbutton_valid_errvec_disres(GtkSpinButton *widget, + GtkWidget *entry); + +void +on_radiobutton_valid_errvec_subst_enter(GtkWidget * widget, + gpointer data); + + +void +on_radiobutton_valid_errvec_subst(GtkWidget * widget, + gpointer data); + +void +on_button_valid_errvec_enter(GtkWidget * widget, + gpointer data); + + +void +on_button_valid_errvec(GtkWidget * widget, + gpointer data); + +void +on_spinbutton_valid_peaklck_bins(GtkSpinButton *widget, + GtkWidget *entry); + +void +on_button_valid_peaklck_enter(GtkWidget * widget, + gpointer data); + + +void +on_button_valid_peaklck(GtkWidget * widget, + gpointer data); + + + +/* + * Other validation functions + */ + +void +exec_gradient(void); + +void +exec_errvec(PivValid * valid); + +void +exec_peaklock(PivValid * valid); + + +#endif /* PIVVALID_H */ diff --git a/src/pivvalid_interface.c b/src/pivvalid_interface.c new file mode 100644 index 0000000..2f6d76f --- /dev/null +++ b/src/pivvalid_interface.c @@ -0,0 +1,1187 @@ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * PIV Validation interface + * $Log: pivvalid_interface.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gpiv_gtk.h" +#include "console.h" +#include "pivvalid_interface.h" +#include "pivvalid.h" + +PivValid * +create_pivvalid (GtkWidget *main_window, + GtkWidget *container) +{ + GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(main_window), "gpiv"); + PivValid *valid = g_new0(PivValid, 1); + + valid->tooltips = gtk_tooltips_new(); + + valid->vbox_label = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(valid->vbox_label); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_label", + valid->vbox_label, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->vbox_label); + gtk_container_add(GTK_CONTAINER(container), + valid->vbox_label); + + valid->label_title = gtk_label_new(_("Piv: data validation")); + gtk_widget_ref(valid->label_title); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_title", + valid->label_title, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->label_title); + gtk_box_pack_start(GTK_BOX(valid->vbox_label), + valid->label_title, + FALSE, + FALSE, + 0); + + +/* + * Scrolled window + */ + valid->vbox_scroll = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(valid->vbox_scroll); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_scroll", + valid->vbox_scroll, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->vbox_scroll); + gtk_box_pack_start(GTK_BOX(valid->vbox_label), + valid->vbox_scroll, + TRUE, + TRUE, + 0); + + + valid->scrolledwindow = gtk_scrolled_window_new(NULL, + NULL); + gtk_widget_ref(valid->scrolledwindow); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "scrolledwindow", + valid->scrolledwindow, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->scrolledwindow); + gtk_box_pack_start(GTK_BOX(valid->vbox_scroll), + valid->scrolledwindow, + TRUE, + TRUE, + 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW + (valid->scrolledwindow), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + + + + + valid->viewport = gtk_viewport_new(NULL, + NULL); + gtk_widget_ref(valid->viewport); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "viewport", + valid->viewport, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->viewport); + gtk_container_add(GTK_CONTAINER(valid->scrolledwindow), + valid->viewport); + +/* + * main table for validation + */ + valid->table = gtk_table_new(2, + 2, + FALSE); + gtk_widget_ref(valid->table); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "table", + valid->table, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->table); + gtk_container_add(GTK_CONTAINER(valid->viewport), + valid->table); + + + +/* + * Enable / Disable frame + */ + + valid->frame_disable = gtk_frame_new(_("Disable data")); + gtk_widget_ref(valid->frame_disable); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_disable", + valid->frame_disable, + (GtkDestroyNotify) + gtk_widget_unref); + gtk_widget_show(valid->frame_disable); + gtk_table_attach(GTK_TABLE(valid->table), + valid->frame_disable, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_SHRINK), + 0, + 0); + + + + valid->vbox_disable = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(valid->vbox_disable); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_disable", + valid->vbox_disable, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->vbox_disable); + gtk_container_add(GTK_CONTAINER(valid->frame_disable), + valid->vbox_disable); + + + + valid->radiobutton_disable_0 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("None")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_disable_0)); + gtk_widget_ref(valid->radiobutton_disable_0); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_disable_0", + valid->radiobutton_disable_0, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->radiobutton_disable_0); + gtk_box_pack_start(GTK_BOX(valid->vbox_disable), + valid->radiobutton_disable_0, + FALSE, + FALSE, + 0); + + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_0), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_0), + "mouse_select", + "0" /* NO_MS */); + + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_0), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable_0_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_0), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_0), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable), + NULL); + + + + + valid->radiobutton_disable_1 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Enable point")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_disable_1)); + gtk_widget_ref(valid->radiobutton_disable_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_valid_disable_1", + valid->radiobutton_disable_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->radiobutton_disable_1); + gtk_box_pack_start(GTK_BOX(valid->vbox_disable), + valid->radiobutton_disable_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_1), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_1), + "mouse_select", + "7" /* ENABLE_POINT_MS */); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_1), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable_1_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_1), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_1), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable), + NULL); + + + + valid->radiobutton_disable_2 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Disable point")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_disable_2)); + gtk_widget_ref(valid->radiobutton_disable_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_disable_2", + valid->radiobutton_disable_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->radiobutton_disable_2); + gtk_box_pack_start(GTK_BOX(valid->vbox_disable), + valid->radiobutton_disable_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_2), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_2), + "mouse_select", + "8" /* DISABLE_POINT_MS */); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_2), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable_2_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_2), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_2), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable), + NULL); + + + + valid->radiobutton_disable_3 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Enable area")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_disable_3)); + gtk_widget_ref(valid->radiobutton_disable_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_disable_3", + valid->radiobutton_disable_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->radiobutton_disable_3); + gtk_box_pack_start(GTK_BOX(valid->vbox_disable), + valid->radiobutton_disable_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_3), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_3), + "mouse_select", + "9" /* ENABLE_AREA_MS */); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_3), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable_3_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_3), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable), + NULL); + + + + valid->radiobutton_disable_4 = + gtk_radio_button_new_with_label(gpiv->mouse_sel_group, + _("Disable area")); + gpiv->mouse_sel_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_disable_4)); + gtk_widget_ref(valid->radiobutton_disable_4); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_disable_4", + valid->radiobutton_disable_4, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->radiobutton_disable_4); + gtk_box_pack_start(GTK_BOX(valid->vbox_disable), + valid->radiobutton_disable_4, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_4), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_disable_4), + "mouse_select", + "10" /* DISABLE_AREA_MS */); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_4), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable_4_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_4), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_disable_4), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_valid_disable), + NULL); + + + +/* + * Button for testing on velocity gradients + */ + valid->button_gradient = + gtk_button_new_with_label(_("validate on velocity gradient ")); + gtk_widget_ref(valid->button_gradient); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "button_gradient", + valid->button_gradient, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->button_gradient); + gtk_table_attach(GTK_TABLE(valid->table), + valid->button_gradient, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_SHRINK /*FILL*/), + (GtkAttachOptions) (GTK_SHRINK), + 0, + 0); + + gtk_tooltips_set_tip(valid->tooltips, + valid->button_gradient, + _("Disables PIV data that have a too large velocity " +"gradient over the Interrogation Area"), + NULL); + + gtk_object_set_data(GTK_OBJECT(valid->button_gradient), + "valid", + valid); + gtk_signal_connect(GTK_OBJECT(valid->button_gradient), + "enter", + GTK_SIGNAL_FUNC(on_button_valid_gradient_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->button_gradient), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->button_gradient), + "clicked", + GTK_SIGNAL_FUNC(on_button_valid_gradient), + NULL); + + + + +/* + * Frame for histogram of sub-pixel values (used to test on peak-locking + * effect) + */ + + valid->frame_peaklck = gtk_frame_new(_("Peak locking")); + gtk_widget_ref(valid->frame_peaklck); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_peaklck", + valid->frame_peaklck, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->frame_peaklck); + gtk_table_attach(GTK_TABLE(valid->table), + valid->frame_peaklck, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) /* (GTK_SHRINK) */ + (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + + valid->vbox_peaklck = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(valid->vbox_peaklck); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_peaklck", + valid->vbox_peaklck, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->vbox_peaklck); + gtk_container_add(GTK_CONTAINER(valid->frame_peaklck), + valid->vbox_peaklck); + + + + + valid->hbox_peaklck_spin = gtk_hbox_new(FALSE, + 0); + gtk_widget_ref(valid->hbox_peaklck_spin); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "hbox_peaklck_spin", + valid->hbox_peaklck_spin, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->hbox_peaklck_spin); + gtk_box_pack_start(GTK_BOX(valid->vbox_peaklck), + valid->hbox_peaklck_spin, + FALSE, + FALSE, + 0); + + + + valid->label_peaklck_bins = gtk_label_new(_("# bins: ")); + gtk_widget_ref(valid->label_peaklck_bins); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_peaklck_bins", + valid->label_peaklck_bins, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->label_peaklck_bins); + gtk_box_pack_start(GTK_BOX(valid->hbox_peaklck_spin), + valid->label_peaklck_bins, + FALSE, + FALSE, + 0); + + + +/* + * NBINS_DEFAULT defined in gpiv.h + */ + valid->spinbutton_adj_peaklck_bins = + gtk_adjustment_new(NBINS_DEFAULT, + 0, + 100, + 1, + 10, + 100); + valid->spinbutton_peaklck_bins = + gtk_spin_button_new(GTK_ADJUSTMENT + (valid->spinbutton_adj_peaklck_bins), + 1, + 0); + gtk_widget_ref(valid->spinbutton_peaklck_bins); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_peaklck_bins", + valid->spinbutton_peaklck_bins, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->spinbutton_peaklck_bins); + gtk_box_pack_start(GTK_BOX(valid->hbox_peaklck_spin), + valid->spinbutton_peaklck_bins, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->spinbutton_peaklck_bins), + "valid", + valid); + gtk_signal_connect(GTK_OBJECT(valid->spinbutton_peaklck_bins), + "changed", + on_spinbutton_valid_peaklck_bins, + valid->spinbutton_peaklck_bins); + + + + + + gtk_widget_push_visual(gdk_imlib_get_visual()); + gtk_widget_push_colormap(gdk_imlib_get_colormap()); + valid->canvas_peaklck = gnome_canvas_new(); + gtk_widget_pop_colormap(); + gtk_widget_pop_visual(); + gtk_widget_ref(valid->canvas_peaklck); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "canvas_peaklck", + valid->canvas_peaklck, + (GtkDestroyNotify) gtk_widget_unref); + gtk_box_pack_start(GTK_BOX(valid->vbox_peaklck), + valid->canvas_peaklck, + TRUE, + TRUE, + 0); + gtk_widget_show(valid->canvas_peaklck); + + + + + valid->hbox_peaklck_buttons = gtk_hbox_new(FALSE, + 0); + gtk_widget_ref(valid->hbox_peaklck_buttons); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "hbox_peaklck_buttons", + valid->hbox_peaklck_buttons, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->hbox_peaklck_buttons); + gtk_box_pack_start(GTK_BOX(valid->vbox_peaklck), + valid->hbox_peaklck_buttons, + FALSE, + FALSE, + 0); + + + + + valid->button_errvec_resstats = + gtk_button_new_with_label(_("residu statistics")); + gtk_widget_ref(valid->button_errvec_resstats); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "button_errvec_resstats", + valid->button_errvec_resstats, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->button_errvec_resstats); + gtk_box_pack_start(GTK_BOX(valid->hbox_peaklck_buttons), + valid->button_errvec_resstats, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(valid->tooltips, + valid->button_errvec_resstats, + _("calculates residus of displacements " +"and displays in a histogram"), + NULL); + + gtk_object_set_data(GTK_OBJECT(valid->button_errvec_resstats), + "valid", + valid); + gtk_signal_connect(GTK_OBJECT(valid->button_errvec_resstats), + "enter", + GTK_SIGNAL_FUNC(on_button_valid_errvec_resstats_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->button_errvec_resstats), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->button_errvec_resstats), + "clicked", + GTK_SIGNAL_FUNC(on_button_valid_errvec_resstats), + NULL); + + + + valid->button_peaklck = gtk_button_new_with_label(_("peak lock")); + gtk_widget_ref(valid->button_peaklck); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "button_peaklck", + valid->button_peaklck, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->button_peaklck); + gtk_box_pack_start(GTK_BOX(valid->hbox_peaklck_buttons), + valid->button_peaklck, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(valid->tooltips, + valid->button_peaklck, + _("shows histogram of sub-pixel displacements " +"in order to check on peak-locking effects"), + NULL); + + gtk_object_set_data(GTK_OBJECT(valid->button_peaklck), + "valid", + valid); + gtk_signal_connect(GTK_OBJECT(valid->button_peaklck), + "enter", + on_button_valid_peaklck_enter, + valid->button_peaklck); + gtk_signal_connect(GTK_OBJECT(valid->button_peaklck), + "leave", + on_widget_leave, + valid->button_peaklck); + gtk_signal_connect(GTK_OBJECT(valid->button_peaklck), + "clicked", + on_button_valid_peaklck, + valid->button_peaklck); + + + + +/* + * Errvec frame + */ + valid->frame_errvec = gtk_frame_new(_("Outliers")); + gtk_widget_ref(valid->frame_errvec); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_errvec", + valid->frame_errvec, + (GtkDestroyNotify) + gtk_widget_unref); + gtk_widget_show(valid->frame_errvec); + gtk_table_attach(GTK_TABLE(valid->table), + valid->frame_errvec, + 1, + 2, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_SHRINK), + 0, + 0); + + + + valid->vbox_errvec = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(valid->vbox_errvec); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_errvec", + valid->vbox_errvec, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->vbox_errvec); + gtk_container_add(GTK_CONTAINER(valid->frame_errvec), + valid->vbox_errvec); + + + + valid->frame_errvec_residu = gtk_frame_new(_("Residu type:")); + gtk_widget_ref(valid->frame_errvec_residu); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_errvec_residu", + valid->frame_errvec_residu, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->frame_errvec_residu); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec), + valid->frame_errvec_residu, + FALSE, + FALSE, + 0); + gtk_frame_set_shadow_type(GTK_FRAME(valid->frame_errvec_residu), + GTK_SHADOW_NONE); + + + + valid->vbox_errvec_residu = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(valid->vbox_errvec_residu); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_errvec_residu", + valid->vbox_errvec_residu, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->vbox_errvec_residu); + gtk_container_add(GTK_CONTAINER(valid->frame_errvec_residu), + valid->vbox_errvec_residu); + + + + valid->radiobutton_errvec_residu_1 = + gtk_radio_button_new_with_label(valid->vbox_errvec_residu_group, + _("Snr")); + valid->vbox_errvec_residu_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_errvec_residu_1)); + gtk_widget_ref(valid->radiobutton_errvec_residu_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_errvec_residu_1", + valid->radiobutton_errvec_residu_1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->radiobutton_errvec_residu_1); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec_residu), + valid->radiobutton_errvec_residu_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_residu_1), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_residu_1), + "residu", + "0"); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_residu_1), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_valid_errvec_residu_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_residu_1), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_residu_1), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_valid_errvec_residu), + NULL); + if (piv_valid_par.residu_type == 0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (valid->radiobutton_errvec_residu_1), + TRUE); + } + + + + valid->radiobutton_errvec_residu_2 = + gtk_radio_button_new_with_label(valid->vbox_errvec_residu_group, + _("Median")); + valid->vbox_errvec_residu_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_errvec_residu_2)); + gtk_widget_ref(valid->radiobutton_errvec_residu_2); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_errvec_residu_2", + valid->radiobutton_errvec_residu_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_residu_2), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_residu_2), + "residu", + "1"); + gtk_widget_show(valid->radiobutton_errvec_residu_2); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec_residu), + valid->radiobutton_errvec_residu_2, + FALSE, + FALSE, + 0); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_residu_2), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_valid_errvec_residu_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_residu_2), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_residu_2), + "clicked", + GTK_SIGNAL_FUNC(on_radiobutton_valid_errvec_residu), + NULL); + if (piv_valid_par.residu_type == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (valid->radiobutton_errvec_residu_2), + TRUE); + } + + + +/* + * A long time ago, the GtkWidget valid->button_errvec_resstats was *here*. + * Though it felt in love with valid->button_peaklock. + * Now they are living at each side and living happy. + * No, they haven't got child widgets, yet. But maybe, one day ... + */ + + + valid->hbox_errvec_yield_spin = gtk_hbox_new(FALSE, + 0); + gtk_widget_ref(valid->hbox_errvec_yield_spin); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "hbox_errvec_yield_spin", + valid->hbox_errvec_yield_spin, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->hbox_errvec_yield_spin); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec), + valid->hbox_errvec_yield_spin, + TRUE, + TRUE, + 0); + + + + valid->label_errvec_yield = gtk_label_new(_("Data yield: ")); + gtk_widget_ref(valid->label_errvec_yield); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_errvec_yield", + valid->label_errvec_yield, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->label_errvec_yield); + gtk_box_pack_start(GTK_BOX(valid->hbox_errvec_yield_spin), + valid->label_errvec_yield, + FALSE, + FALSE, + 0); + + + + valid->spinbutton_adj_errvec_yield = + gtk_adjustment_new(piv_valid_par.data_yield, + 0.0, + 1.0, + 0.01, + 0.1, + 0.1); + valid->spinbutton_errvec_yield = + gtk_spin_button_new(GTK_ADJUSTMENT(valid->spinbutton_adj_errvec_yield), + 0.1, + 3); + gtk_widget_ref(valid->spinbutton_errvec_yield); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_errvec_yield", + valid->spinbutton_errvec_yield, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->spinbutton_errvec_yield); + gtk_box_pack_start(GTK_BOX(valid->hbox_errvec_yield_spin), + valid->spinbutton_errvec_yield, + TRUE, + TRUE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->spinbutton_errvec_yield), + "valid", + valid); + gtk_signal_connect (GTK_OBJECT (valid->spinbutton_errvec_yield), + "changed", + GTK_SIGNAL_FUNC (on_spinbutton_valid_errvec_yield), + NULL); + + + + + valid->hbox_errvec_residu_spin = gtk_hbox_new(FALSE, + 0); + gtk_widget_ref(valid->hbox_errvec_residu_spin); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "hbox_errvec_residu_spin", + valid->hbox_errvec_residu_spin, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->hbox_errvec_residu_spin); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec), + valid->hbox_errvec_residu_spin, + TRUE, + TRUE, + 0); + + + + valid->label_errvec_res = gtk_label_new(_("Threshold: ")); + gtk_widget_ref(valid->label_errvec_res); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "label_errvec_res", + valid->label_errvec_res, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->label_errvec_res); + gtk_box_pack_start(GTK_BOX(valid->hbox_errvec_residu_spin), + valid->label_errvec_res, + FALSE, + FALSE, + 0); + + + + valid->spinbutton_adj_errvec_res = + gtk_adjustment_new(piv_valid_par.residu_max, + 0., + THRESHOLD_MAX, + 0.1, + 1.0, + 1.0); + valid->spinbutton_errvec_res = + gtk_spin_button_new(GTK_ADJUSTMENT(valid->spinbutton_adj_errvec_res), + 0.1, + 3); + gtk_widget_ref(valid->spinbutton_errvec_res); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "spinbutton_errvec_res", + valid->spinbutton_errvec_res, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->spinbutton_errvec_res); + gtk_box_pack_start(GTK_BOX(valid->hbox_errvec_residu_spin), + valid->spinbutton_errvec_res, + TRUE, + TRUE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->spinbutton_errvec_res), + "valid", + valid); + gtk_signal_connect (GTK_OBJECT (valid->spinbutton_errvec_res), + "changed", + GTK_SIGNAL_FUNC (on_spinbutton_valid_errvec_res), + NULL); + + + + + valid->checkbutton_errvec_disres = + gtk_check_button_new_with_label(_("show values")); + gtk_widget_ref(valid->checkbutton_errvec_disres); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "checkbutton_errvec_disres", + valid->checkbutton_errvec_disres, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->checkbutton_errvec_disres); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec), + valid->checkbutton_errvec_disres, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->checkbutton_errvec_disres), + "valid", + valid); + gtk_signal_connect(GTK_OBJECT(valid->checkbutton_errvec_disres), + "enter", + GTK_SIGNAL_FUNC + (on_checkbutton_valid_errvec_disres_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->checkbutton_errvec_disres), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->checkbutton_errvec_disres), + "toggled", + GTK_SIGNAL_FUNC(on_checkbutton_valid_errvec_disres), + NULL); + if (v_color == SHOW_SNR) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (valid->checkbutton_errvec_disres), + TRUE); + } + + +/* + * Radio buttons for substitution type + */ + valid->frame_errvec_subst = gtk_frame_new(_("Substituted by:")); + gtk_widget_ref(valid->frame_errvec_subst); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "frame_errvec_subst", + valid->frame_errvec_subst, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->frame_errvec_subst); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec), + valid->frame_errvec_subst, + FALSE, + FALSE, + 0); + gtk_frame_set_shadow_type(GTK_FRAME(valid->frame_errvec_subst), + GTK_SHADOW_NONE); + + + + valid->vbox_errvec_subst = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(valid->vbox_errvec_subst); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "vbox_errvec_subst", + valid->vbox_errvec_subst, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->vbox_errvec_subst); + gtk_container_add(GTK_CONTAINER(valid->frame_errvec_subst), + valid->vbox_errvec_subst); + + + + valid->radiobutton_errvec_subst_1 = + gtk_radio_button_new_with_label(valid->vbox_errvec_subst_group, + _("Mean of surroundings")); + valid->vbox_errvec_subst_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_errvec_subst_1)); + gtk_widget_ref(valid->radiobutton_errvec_subst_1); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_errvec_subst_1", + valid->radiobutton_errvec_subst_1, + (GtkDestroyNotify) gtk_widget_unref); + if (piv_valid_par.subst_type == L_MEAN) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (valid->radiobutton_errvec_subst_1), + TRUE); + } + gtk_widget_show(valid->radiobutton_errvec_subst_1); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec_subst), + valid->radiobutton_errvec_subst_1, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_subst_1), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_subst_1), + "substitute", + "0" /* L_MEAN */); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_subst_1), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_valid_errvec_subst_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_subst_1), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_subst_1), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_valid_errvec_subst), + NULL); + + + + valid->radiobutton_errvec_subst_2 = + gtk_radio_button_new_with_label (valid->vbox_errvec_subst_group, + _("Median")); + valid->vbox_errvec_subst_group = + gtk_radio_button_group (GTK_RADIO_BUTTON + (valid->radiobutton_errvec_subst_2)); + gtk_widget_ref (valid->radiobutton_errvec_subst_2); + gtk_object_set_data_full (GTK_OBJECT (main_window), + "radiobutton_errvec_subst_2", + valid->radiobutton_errvec_subst_2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (valid->radiobutton_errvec_subst_2); + gtk_box_pack_start (GTK_BOX (valid->vbox_errvec_subst), + valid->radiobutton_errvec_subst_2, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_subst_2), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT (valid->radiobutton_errvec_subst_2), + "substitute", + "1" /* SUBTYPE_MEDIAN */); + gtk_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_2), + "enter", + GTK_SIGNAL_FUNC(on_radiobutton_valid_errvec_subst_enter), + NULL); + gtk_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_2), + "leave", + GTK_SIGNAL_FUNC (on_widget_leave), + NULL); + gtk_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_2), + "toggled", + GTK_SIGNAL_FUNC (on_radiobutton_valid_errvec_subst), + NULL); + if (piv_valid_par.subst_type == SUBTYPE_MEDIAN ) { + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON + (valid->radiobutton_errvec_subst_2), + TRUE); + } + + + + valid->radiobutton_errvec_subst_3 = + gtk_radio_button_new_with_label(valid->vbox_errvec_subst_group, + _("Next highest cov. peak")); + valid->vbox_errvec_subst_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (valid->radiobutton_errvec_subst_3)); + gtk_widget_ref(valid->radiobutton_errvec_subst_3); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "radiobutton_errvec_subst_3", + valid->radiobutton_errvec_subst_3, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->radiobutton_errvec_subst_3); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec_subst), + valid->radiobutton_errvec_subst_3, + FALSE, + FALSE, + 0); + + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_subst_3), + "valid", + valid); + gtk_object_set_data(GTK_OBJECT(valid->radiobutton_errvec_subst_3), + "substitute", + "2" /* COV_PEAK */); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_subst_3), + "enter", + GTK_SIGNAL_FUNC + (on_radiobutton_valid_errvec_subst_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_subst_3), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->radiobutton_errvec_subst_3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_valid_errvec_subst), + NULL); + if (piv_valid_par.subst_type == COV_PEAK /* 2 */) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (valid->radiobutton_errvec_subst_3), + TRUE); + } + + + + valid->button_errvec = + gtk_button_new_with_label(_("validate on outliers")); + gtk_widget_ref(valid->button_errvec); + gtk_object_set_data_full(GTK_OBJECT(main_window), + "button_errvec", + valid->button_errvec, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(valid->button_errvec); + gtk_box_pack_start(GTK_BOX(valid->vbox_errvec), + valid->button_errvec, + FALSE, + FALSE, + 0); + gtk_tooltips_set_tip(valid->tooltips, + valid->button_errvec, + _("substitutes outliers"), + NULL); + + gtk_object_set_data(GTK_OBJECT(valid->button_errvec), + "valid", + valid); + gtk_signal_connect(GTK_OBJECT(valid->button_errvec), + "enter", + GTK_SIGNAL_FUNC(on_button_valid_errvec_enter), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->button_errvec), + "leave", + GTK_SIGNAL_FUNC(on_widget_leave), + NULL); + gtk_signal_connect(GTK_OBJECT(valid->button_errvec), + "clicked", + GTK_SIGNAL_FUNC(on_button_valid_errvec), + NULL); + + + return valid; +} + + + + diff --git a/src/pivvalid_interface.h b/src/pivvalid_interface.h new file mode 100644 index 0000000..4c988a8 --- /dev/null +++ b/src/pivvalid_interface.h @@ -0,0 +1,107 @@ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * PIV validation tab + * $Log: pivvalid_interface.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef GPIV_PIVVALID_INTERFACE_H +#define GPIV_PIVVALID_INTERFACE_H + + + +typedef struct _PivValid PivValid; +struct _PivValid { + GtkTooltips *tooltips; + + GtkWidget *vbox_label; + GtkWidget *label_title; + + GtkWidget *vbox_scroll; + GtkWidget *scrolledwindow; + GtkWidget *viewport; + GtkWidget *table; + + GtkWidget *frame_disable; + GtkWidget *vbox_disable; +/* GSList *vbox_disable_group; */ +/* GSList *disable_group; */ + GtkWidget *radiobutton_disable_0; + GtkWidget *radiobutton_disable_1; + GtkWidget *radiobutton_disable_2; + GtkWidget *radiobutton_disable_3; + GtkWidget *radiobutton_disable_4; + + GtkWidget *button_gradient; + + GtkWidget *frame_errvec; + GtkWidget *vbox_errvec; + GtkWidget *frame_errvec_residu; + GtkWidget *vbox_errvec_residu; + GSList *vbox_errvec_residu_group; + GtkWidget *radiobutton_errvec_residu_1; + GtkWidget *radiobutton_errvec_residu_2; + GtkWidget *button_errvec_resstats; + GtkWidget *hbox_errvec_yield_spin; + GtkWidget *label_errvec_yield; + GtkObject *spinbutton_adj_errvec_yield; + GtkWidget *spinbutton_errvec_yield; + GtkWidget *hbox_errvec_residu_spin; + GtkWidget *label_errvec_res; + GtkObject *spinbutton_adj_errvec_res; + GtkWidget *spinbutton_errvec_res; + GtkWidget *checkbutton_errvec_disres; + GtkWidget *frame_errvec_subst; + GtkWidget *vbox_errvec_subst; + GSList *vbox_errvec_subst_group; + + GtkWidget *radiobutton_errvec_subst_1; + GtkWidget *radiobutton_errvec_subst_2; + GtkWidget *radiobutton_errvec_subst_3; + GtkWidget *button_errvec; + + GtkWidget *frame_peaklck; + GtkWidget *vbox_peaklck; + GtkWidget *hbox_peaklck_spin; + GtkWidget *label_peaklck_bins; + GtkObject *spinbutton_adj_peaklck_bins; + GtkWidget *spinbutton_peaklck_bins; + GtkWidget *hbox_peaklck_buttons; + GtkWidget *button_peaklck; + GtkWidget *canvas_peaklck; + GtkWidget *label; +}; + + +PivValid * +create_pivvalid (GtkWidget *main_window, + GtkWidget *container); + +#endif /* GPIV_PIVVALID_INTERFACE_H */ diff --git a/src/preferences.c b/src/preferences.c new file mode 100644 index 0000000..30794d8 --- /dev/null +++ b/src/preferences.c @@ -0,0 +1,2437 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * $Log: preferences.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#include "support.h" + +#include "gpiv_gtk.h" +#include "utils.h" +#include "preferences.h" +#include "console_menus.h" +#include "display.h" + +/* #include "console_interface.h" */ +/* #include "console.h" */ +/* #include "pivvalid_interface.h" */ + + +GtkWidget *create_preferences (GpivConsole *gpiv) +{ + GtkWidget *preferences; + GtkWidget *dialog_vbox1; + GtkWidget *notebook1; + GtkWidget *table1; + GtkWidget *frame_pref_view; + GtkWidget *vbox1; +/* GtkWidget *checkbutton_pref_menubar; */ +/* GtkWidget *checkbutton_pref_toolbuttons; */ + GtkWidget *checkbutton_pref_gpivbuttons; + GtkWidget *checkbutton_pref_tab; + GtkWidget *frame_pref_io; + GtkWidget *vbox_io; + GtkWidget *checkbutton_pref_hdf; + GtkWidget *checkbutton_pref_hdfimg; + + GtkWidget *hbox_cols; + GtkWidget *label_pref_spinner_cols; + GtkObject *spinbutton_pref_cols_adj; + GtkWidget *spinbutton_pref_cols; + + GtkWidget *hbox_rows; + GtkWidget *label_pref_spinner_rows; + GtkObject *spinbutton_pref_rows_adj; + GtkWidget *spinbutton_pref_rows; + + + + GtkWidget *checkbutton_pref_tooltips; + GtkWidget *frame_pref_processes; + GtkWidget *vbox2; + GtkWidget *checkbutton_pref_process_piv; + GtkWidget *checkbutton_pref_process_gradient; + GtkWidget *checkbutton_pref_process_resstats; + GtkWidget *checkbutton_pref_process_errvec; + GtkWidget *checkbutton_pref_process_peaklck; + GtkWidget *checkbutton_pref_process_scale; + GtkWidget *checkbutton_pref_process_avg; + GtkWidget *checkbutton_pref_process_substract; + GtkWidget *checkbutton_pref_process_vorstra; + GtkWidget *hbox1; + GtkWidget *label_pref_spinner_bins; + GtkObject *spinbutton_pref_bins_adj; + GtkWidget *spinbutton_pref_bins; + + + + GtkWidget *pref_tab1; + GtkWidget *table2; + GtkWidget *frame_pref_display_vecscale; + GtkWidget *vbox_pref_display_vecscale; + GSList *vecscale_group = NULL; + GtkWidget *radiobutton_pref_display_vecscale1; + GtkWidget *radiobutton_pref_display_vecscale2; + GtkWidget *radiobutton_pref_display_vecscale3; + GtkWidget *radiobutton_pref_display_vecscale4; + GtkWidget *radiobutton_pref_display_vecscale5; + GtkWidget *radiobutton_pref_display_vecscale6; + GtkWidget *radiobutton_pref_display_vecscale7; + + + + GtkWidget *frame_pref_display_zoomscale; + GtkWidget *vbox_pref_display_zoomscale; + GSList *zoomscale_group = NULL; + GtkWidget *radiobutton_pref_display_zoomscale1; + GtkWidget *radiobutton_pref_display_zoomscale2; + GtkWidget *radiobutton_pref_display_zoomscale3; + GtkWidget *radiobutton_pref_display_zoomscale4; + GtkWidget *radiobutton_pref_display_zoomscale5; + GtkWidget *radiobutton_pref_display_zoomscale6; + + + + GtkWidget *frame_pref_display_display; + GtkWidget *vbox_pref_display_display; + GtkWidget *checkbutton_pref_display_display_img1; + GtkWidget *checkbutton_pref_display_display_img2; + GtkWidget *checkbutton_pref_display_display_intregs; + GtkWidget *checkbutton_pref_display_display_piv; + GtkWidget *checkbutton_pref_display_display_vor; + GtkWidget *checkbutton_pref_display_display_sstrain; + GtkWidget *checkbutton_pref_display_display_nstrain; + GtkWidget *pref_tab2; + +/* GtkWidget *fontselection; */ +/* GtkWidget *pref_tab3; */ + + GtkWidget *dialog_action_area1; + GtkWidget *button_pref_ok; + GtkWidget *button_pref_apply; + GtkWidget *button_pref_cancel; + +/* _parented */ +/* gnome_dialog_new */ + preferences = gnome_dialog_new (_("Preferences"), + NULL); + gtk_object_set_data (GTK_OBJECT (preferences), + "preferences", + preferences); + gnome_dialog_set_parent (GNOME_DIALOG (preferences), + GTK_WINDOW (gpiv->console)); + gtk_window_set_policy (GTK_WINDOW (preferences), + FALSE, + FALSE, + FALSE); + gtk_window_set_wmclass (GTK_WINDOW (preferences), + "preferneces", + ""); + + dialog_vbox1 = GNOME_DIALOG (preferences)->vbox; + gtk_object_set_data (GTK_OBJECT (preferences), + "dialog_vbox1", + dialog_vbox1); + gtk_widget_show (dialog_vbox1); + + + + notebook1 = gtk_notebook_new (); + gtk_widget_ref (notebook1); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "notebook1", + notebook1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (notebook1); + gtk_box_pack_start (GTK_BOX (dialog_vbox1), + notebook1, + TRUE, + TRUE, + 0); + +/* + * Interface tabulator + */ + + table1 = gtk_table_new (2, + 3, + FALSE); + gtk_widget_ref (table1); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "table1", + table1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (table1); + gtk_container_add (GTK_CONTAINER (notebook1), + table1); + + + + frame_pref_view = gtk_frame_new (_("View")); + gtk_widget_ref (frame_pref_view); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "frame_pref_view", + frame_pref_view, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (frame_pref_view); + gtk_table_attach (GTK_TABLE (table1), + frame_pref_view, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox1); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "vbox1", vbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox1); + gtk_container_add (GTK_CONTAINER (frame_pref_view), + vbox1); + + + + checkbutton_pref_gpivbuttons = + gtk_check_button_new_with_label (_("gpiv buttons")); + gtk_widget_ref (checkbutton_pref_gpivbuttons); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_gpivbuttons", + checkbutton_pref_gpivbuttons, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.view_gpivbuttons == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_gpivbuttons), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_gpivbuttons), + FALSE); + } + gtk_widget_show (checkbutton_pref_gpivbuttons); + gtk_box_pack_start (GTK_BOX (vbox1), + checkbutton_pref_gpivbuttons, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_gpivbuttons), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_gpivbuttons_activate), + NULL); + + + + + checkbutton_pref_tab = gtk_check_button_new_with_label (_("tabulator")); + gtk_widget_ref (checkbutton_pref_tab); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_tab", + checkbutton_pref_tab, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.view_tabulator == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_tab), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_tab), + FALSE); + } + gtk_widget_show (checkbutton_pref_tab); + gtk_box_pack_start (GTK_BOX (vbox1), + checkbutton_pref_tab, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_tab), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_tab_activate), + NULL); + + + +/* */ + frame_pref_io = gtk_frame_new (_("In/output")); + gtk_widget_ref (frame_pref_io); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "frame_pref_io", + frame_pref_io, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (frame_pref_io); + gtk_table_attach (GTK_TABLE (table1), + frame_pref_io, + 2, + 3, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + + + vbox_io = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox_io); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "vbox_io", vbox_io, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox_io); + gtk_container_add (GTK_CONTAINER (frame_pref_io), + vbox_io); + + + checkbutton_pref_hdf = gtk_check_button_new_with_label (_("hdf5 format (.gpi)")); + gtk_widget_ref (checkbutton_pref_hdf); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_hdf", + checkbutton_pref_hdf, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.hdf == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_hdf), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_hdf), + FALSE); + } + gtk_widget_show (checkbutton_pref_hdf); + gtk_box_pack_start (GTK_BOX (vbox_io), + checkbutton_pref_hdf, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_hdf), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_hdf_activate), + NULL); + + + + checkbutton_pref_hdfimg = gtk_check_button_new_with_label (_("include image in .gpi")); + gtk_widget_ref (checkbutton_pref_hdf); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_hdfimg", + checkbutton_pref_hdfimg, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.hdf_img == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_hdfimg), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_hdfimg), + FALSE); + } + gtk_widget_show (checkbutton_pref_hdfimg); + gtk_box_pack_start (GTK_BOX (vbox_io), + checkbutton_pref_hdfimg, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_hdfimg), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_hdfimg_activate), + NULL); + + +/* + * spinners for ncolumns and nrows + */ + hbox_cols = gtk_hbox_new (FALSE, + 0); + gtk_widget_ref (hbox_cols); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "hbox_cols", + hbox_cols, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (hbox_cols); + gtk_box_pack_start (GTK_BOX (vbox_io), + hbox_cols, + FALSE, + FALSE, + 0); + + + + label_pref_spinner_cols = gtk_label_new (_("img width: ")); + gtk_widget_ref (label_pref_spinner_cols); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "label_pref_spinner_cols", + label_pref_spinner_cols, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label_pref_spinner_cols); + gtk_box_pack_start (GTK_BOX (hbox_cols), + label_pref_spinner_cols, + FALSE, + FALSE, + 0); + + + + spinbutton_pref_cols_adj = gtk_adjustment_new (gpiv_par.img_width, + 0, + IMAGE_WIDTH_MAX, + 1, + 10, + 10); + spinbutton_pref_cols = + gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_pref_cols_adj), + 1, + 0); + gtk_widget_ref (spinbutton_pref_cols); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "spinbutton_pref_cols", + spinbutton_pref_cols, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (spinbutton_pref_cols); + gtk_box_pack_start (GTK_BOX (hbox_cols), + spinbutton_pref_cols, + TRUE, + TRUE, + 0); + + gtk_signal_connect (GTK_OBJECT (spinbutton_pref_cols), "changed", + GTK_SIGNAL_FUNC (on_spinbutton_pref_cols_activate), + NULL); + + /* */ + + hbox_rows = gtk_hbox_new (FALSE, + 0); + gtk_widget_ref (hbox_rows); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "hbox_rows", + hbox_rows, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (hbox_rows); + gtk_box_pack_start (GTK_BOX (vbox_io), + hbox_rows, + FALSE, + FALSE, + 0); + + + + label_pref_spinner_rows = gtk_label_new (_("img height: ")); + gtk_widget_ref (label_pref_spinner_rows); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "label_pref_spinner_rows", + label_pref_spinner_rows, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label_pref_spinner_rows); + gtk_box_pack_start (GTK_BOX (hbox_rows), + label_pref_spinner_rows, + FALSE, + FALSE, + 0); + + + + spinbutton_pref_rows_adj = gtk_adjustment_new (gpiv_par.img_height, + 0, + IMAGE_HEIGHT_MAX, + 1, + 10, + 10); + spinbutton_pref_rows = + gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_pref_rows_adj), + 1, + 0); + gtk_widget_ref (spinbutton_pref_rows); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "spinbutton_pref_rows", + spinbutton_pref_rows, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (spinbutton_pref_rows); + gtk_box_pack_start (GTK_BOX (hbox_rows), + spinbutton_pref_rows, + TRUE, + TRUE, + 0); + + gtk_signal_connect (GTK_OBJECT (spinbutton_pref_rows), "changed", + GTK_SIGNAL_FUNC (on_spinbutton_pref_rows_activate), + NULL); + + +/* + * General; tooltips and histogram bins + */ + checkbutton_pref_tooltips = gtk_check_button_new_with_label (_("tooltips")); + gtk_widget_ref (checkbutton_pref_tooltips); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_tooltips", + checkbutton_pref_tooltips, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.show_tooltips == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_tooltips), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_tooltips), + FALSE); + } + gtk_widget_show (checkbutton_pref_tooltips); + gtk_table_attach (GTK_TABLE (table1), + checkbutton_pref_tooltips, + 0, + 1, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), + 0, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_tooltips), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_tooltips_activate), + NULL); + + + + + frame_pref_processes = gtk_frame_new (_("processes")); + gtk_widget_ref (frame_pref_processes); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "frame_pref_processes", + frame_pref_processes, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (frame_pref_processes); + gtk_table_attach (GTK_TABLE (table1), + frame_pref_processes, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + + + vbox2 = gtk_vbox_new (FALSE, + 0); + gtk_widget_ref (vbox2); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "vbox2", + vbox2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox2); + gtk_container_add (GTK_CONTAINER (frame_pref_processes), + vbox2); + + + + checkbutton_pref_process_piv = gtk_check_button_new_with_label (_("piv")); + gtk_widget_ref (checkbutton_pref_process_piv); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_piv", + checkbutton_pref_process_piv, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_piv) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_piv), + TRUE); + } else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_piv), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_piv); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_piv, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_piv), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_piv_activate), + NULL); + + + + + checkbutton_pref_process_gradient = + gtk_check_button_new_with_label (_("gradient")); + gtk_widget_ref (checkbutton_pref_process_gradient); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_gradient", + checkbutton_pref_process_gradient, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_gradient) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_gradient), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_gradient), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_gradient); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_gradient, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_gradient), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_gradient_activate), + NULL); + + + + + checkbutton_pref_process_resstats = + gtk_check_button_new_with_label (_("residu stats")); + gtk_widget_ref (checkbutton_pref_process_resstats); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_resstats", + checkbutton_pref_process_resstats, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_resstats) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_resstats), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_resstats), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_resstats); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_resstats, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_resstats), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_resstats_activate), + NULL); + + + + + checkbutton_pref_process_errvec = + gtk_check_button_new_with_label (_("validate")); + gtk_widget_ref (checkbutton_pref_process_errvec); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_errvec", + checkbutton_pref_process_errvec, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_errvec) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_errvec), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_errvec), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_errvec); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_errvec, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_errvec), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_errvec_activate), + NULL); + + + + + checkbutton_pref_process_peaklck = + gtk_check_button_new_with_label (_("peaklock")); + gtk_widget_ref (checkbutton_pref_process_peaklck); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_peaklck", + checkbutton_pref_process_peaklck, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_peaklock) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_peaklck), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_peaklck), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_peaklck); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_peaklck, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_peaklck), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_peaklck_activate), + NULL); + + + + checkbutton_pref_process_scale = + gtk_check_button_new_with_label (_("scaling")); + gtk_widget_ref (checkbutton_pref_process_scale); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_scale", + checkbutton_pref_process_scale, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_scale) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_scale), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_scale), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_scale); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_scale, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_scale), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_scale_activate), + NULL); + + + + + checkbutton_pref_process_avg = + gtk_check_button_new_with_label (_("average")); + gtk_widget_ref (checkbutton_pref_process_avg); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_avg", + checkbutton_pref_process_avg, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_average) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_avg), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_avg), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_avg); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_avg, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_avg), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_avg_activate), + NULL); + + + + + checkbutton_pref_process_substract = + gtk_check_button_new_with_label (_("substract")); + gtk_widget_ref (checkbutton_pref_process_substract); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_substract", + checkbutton_pref_process_substract, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_substract) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_substract), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_substract), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_substract); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_substract, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_substract), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_substract_activate), + NULL); + + + + + checkbutton_pref_process_vorstra = + gtk_check_button_new_with_label (_("vorticity")); + gtk_widget_ref (checkbutton_pref_process_vorstra); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_process_vorstra", + checkbutton_pref_process_vorstra, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.process_vorstra) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_vorstra), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_process_vorstra), + FALSE); + } + gtk_widget_show (checkbutton_pref_process_vorstra); + gtk_box_pack_start (GTK_BOX (vbox2), + checkbutton_pref_process_vorstra, + FALSE, + FALSE, + 0); + + gtk_signal_connect (GTK_OBJECT (checkbutton_pref_process_vorstra), "clicked", + GTK_SIGNAL_FUNC (on_checkbutton_pref_process_vorstra_activate), + NULL); + + + + + hbox1 = gtk_hbox_new (FALSE, + 0); + gtk_widget_ref (hbox1); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "hbox1", + hbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (hbox1); + gtk_table_attach (GTK_TABLE (table1), + hbox1, + 1, + 3, + 1, + 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + + + label_pref_spinner_bins = gtk_label_new (_("number of histogram bins: ")); + gtk_widget_ref (label_pref_spinner_bins); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "label_pref_spinner_bins", + label_pref_spinner_bins, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (label_pref_spinner_bins); + gtk_box_pack_start (GTK_BOX (hbox1), + label_pref_spinner_bins, + FALSE, + FALSE, + 0); + + + + spinbutton_pref_bins_adj = gtk_adjustment_new (10, + 0, + 100, + 1, + 10, + 10); + spinbutton_pref_bins = + gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_pref_bins_adj), + 1, + 0); + gtk_widget_ref (spinbutton_pref_bins); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "spinbutton_pref_bins", + spinbutton_pref_bins, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (spinbutton_pref_bins); + gtk_box_pack_start (GTK_BOX (hbox1), + spinbutton_pref_bins, + TRUE, + TRUE, + 0); + + gtk_signal_connect (GTK_OBJECT (spinbutton_pref_bins), "changed", + GTK_SIGNAL_FUNC (on_spinbutton_pref_bins_activate), + NULL); + + + + pref_tab1 = gtk_label_new (_("console")); + gtk_widget_ref (pref_tab1); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "pref_tab1", + pref_tab1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (pref_tab1); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), + gtk_notebook_get_nth_page + (GTK_NOTEBOOK (notebook1), + 0), + pref_tab1); + + + +/* + * Display tabulator + */ + + table2 = gtk_table_new (1, + 3, + FALSE); + gtk_widget_ref (table2); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "table2", + table2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (table2); + gtk_container_add (GTK_CONTAINER (notebook1), + table2); + +/* + * Vector scale + */ + + frame_pref_display_vecscale = gtk_frame_new (_("vector scale")); + gtk_widget_ref (frame_pref_display_vecscale); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "frame_pref_display_vecscale", + frame_pref_display_vecscale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (frame_pref_display_vecscale); + gtk_table_attach (GTK_TABLE (table2), + frame_pref_display_vecscale, + 0, + 1, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + vbox_pref_display_vecscale = gtk_vbox_new(FALSE, + 0); + gtk_widget_ref(vbox_pref_display_vecscale); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "vbox_pref_display_vecscale", + vbox_pref_display_vecscale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(vbox_pref_display_vecscale); + gtk_container_add(GTK_CONTAINER(frame_pref_display_vecscale), + vbox_pref_display_vecscale); + + + + radiobutton_pref_display_vecscale1 = + gtk_radio_button_new_with_label(vecscale_group, + _("1")); + vecscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_vecscale1)); + gtk_widget_ref(radiobutton_pref_display_vecscale1); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_vecscale1", + radiobutton_pref_display_vecscale1, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.vector_scale == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale1), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale1), + FALSE); + + } + gtk_widget_show(radiobutton_pref_display_vecscale1); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_vecscale), + radiobutton_pref_display_vecscale1, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_vecscale1), + "vscale", + "1"); + + + + + radiobutton_pref_display_vecscale2 = + gtk_radio_button_new_with_label(vecscale_group, _("2")); + vecscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_vecscale2)); + gtk_widget_ref(radiobutton_pref_display_vecscale2); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_vecscale2", + radiobutton_pref_display_vecscale2, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.vector_scale == 2) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale2), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale2), + FALSE); + } + gtk_widget_show(radiobutton_pref_display_vecscale2); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_vecscale), + radiobutton_pref_display_vecscale2, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_vecscale2), + "vscale", + "2"); + + + + + radiobutton_pref_display_vecscale3 = + gtk_radio_button_new_with_label(vecscale_group, _("4")); + vecscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_vecscale3)); + gtk_widget_ref(radiobutton_pref_display_vecscale3); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_vecscale3", + radiobutton_pref_display_vecscale3, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.vector_scale == 4) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale3), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale3), + FALSE); + } + gtk_widget_show(radiobutton_pref_display_vecscale3); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_vecscale), + radiobutton_pref_display_vecscale3, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_vecscale3), + "vscale", + "4"); + + + + + radiobutton_pref_display_vecscale4 = + gtk_radio_button_new_with_label(vecscale_group, _("8")); + vecscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_vecscale4)); + gtk_widget_ref(radiobutton_pref_display_vecscale4); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_vecscale4", + radiobutton_pref_display_vecscale4, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.vector_scale == 8) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale4), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale4), + FALSE); + } + gtk_widget_show(radiobutton_pref_display_vecscale4); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_vecscale), + radiobutton_pref_display_vecscale4, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_vecscale4), + "vscale", + "8"); + + + + + radiobutton_pref_display_vecscale5 = + gtk_radio_button_new_with_label(vecscale_group, _("16")); + vecscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_vecscale5)); + gtk_widget_ref(radiobutton_pref_display_vecscale5); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_vecscale5", + radiobutton_pref_display_vecscale5, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.vector_scale == 16) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale5), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale5), + FALSE); + } + gtk_widget_show(radiobutton_pref_display_vecscale5); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_vecscale), + radiobutton_pref_display_vecscale5, FALSE, FALSE, 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_vecscale5), + "vscale", + "16"); + + + + + radiobutton_pref_display_vecscale6 = + gtk_radio_button_new_with_label(vecscale_group, _("32")); + vecscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_vecscale6)); + gtk_widget_ref(radiobutton_pref_display_vecscale6); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_vecscale6", + radiobutton_pref_display_vecscale6, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.vector_scale == 32) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale6), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale6), + FALSE); + } + gtk_widget_show(radiobutton_pref_display_vecscale6); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_vecscale), + radiobutton_pref_display_vecscale6, FALSE, FALSE, 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_vecscale6), + "vscale", + "32"); + + + + + radiobutton_pref_display_vecscale7 = + gtk_radio_button_new_with_label(vecscale_group, _("64")); + vecscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_vecscale7)); + gtk_widget_ref(radiobutton_pref_display_vecscale7); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_vecscale7", + radiobutton_pref_display_vecscale7, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.vector_scale == 64) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale7), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_vecscale7), + FALSE); + } + gtk_widget_show(radiobutton_pref_display_vecscale7); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_vecscale), + radiobutton_pref_display_vecscale7, FALSE, FALSE, 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_vecscale7), + "vscale", + "64"); + + +/* + * Zoom scale + */ + frame_pref_display_zoomscale = gtk_frame_new (_("zoom scale")); + gtk_widget_ref (frame_pref_display_zoomscale); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "frame_pref_display_zoomscale", + frame_pref_display_zoomscale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (frame_pref_display_zoomscale); + gtk_table_attach (GTK_TABLE (table2), frame_pref_display_zoomscale, + 1, + 2, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + 0, + 0); + + + vbox_pref_display_zoomscale = gtk_vbox_new(FALSE, 0); + gtk_widget_ref(vbox_pref_display_zoomscale); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "vbox_pref_display_zoomscale", + vbox_pref_display_zoomscale, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show(vbox_pref_display_zoomscale); + gtk_container_add(GTK_CONTAINER(frame_pref_display_zoomscale), + vbox_pref_display_zoomscale); + + + + radiobutton_pref_display_zoomscale1 = + gtk_radio_button_new_with_label(zoomscale_group, _("0.5")); + zoomscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_zoomscale1)); + gtk_widget_ref(radiobutton_pref_display_zoomscale1); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_zoomscale1", + radiobutton_pref_display_zoomscale1, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.zoom_index == ZOOM_0) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_zoomscale1), + TRUE); +/* } else { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (radiobutton_pref_display_zoomscale1), FALSE); */ + } + gtk_widget_show(radiobutton_pref_display_zoomscale1); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_zoomscale), + radiobutton_pref_display_zoomscale1, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_zoomscale1), + "zscale", + "0"); + + + + + radiobutton_pref_display_zoomscale2 = + gtk_radio_button_new_with_label(zoomscale_group, _("0.83")); + zoomscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_zoomscale2)); + gtk_widget_ref(radiobutton_pref_display_zoomscale2); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_zoomscale2", + radiobutton_pref_display_zoomscale2, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.zoom_index == ZOOM_1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_zoomscale2), + TRUE); +/* } else { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (radiobutton_pref_display_zoomscale2), FALSE); */ + } + gtk_widget_show(radiobutton_pref_display_zoomscale2); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_zoomscale), + radiobutton_pref_display_zoomscale2, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_zoomscale2), + "zscale", + "1"); + + + + + radiobutton_pref_display_zoomscale3 = + gtk_radio_button_new_with_label(zoomscale_group, _("1.0")); + zoomscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_zoomscale3)); + gtk_widget_ref(radiobutton_pref_display_zoomscale3); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_zoomscale3", + radiobutton_pref_display_zoomscale3, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.zoom_index == ZOOM_2) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_zoomscale3), + TRUE); +/* } else { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (radiobutton_pref_display_zoomscale3), FALSE); */ + } + gtk_widget_show(radiobutton_pref_display_zoomscale3); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_zoomscale), + radiobutton_pref_display_zoomscale3, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_zoomscale3), + "zscale", + "2"); + + + + + radiobutton_pref_display_zoomscale4 = + gtk_radio_button_new_with_label(zoomscale_group, _("1.3")); + zoomscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_zoomscale4)); + gtk_widget_ref(radiobutton_pref_display_zoomscale4); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_zoomscale4", + radiobutton_pref_display_zoomscale4, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.zoom_index == ZOOM_3) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_zoomscale4), + TRUE); +/* } else { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (radiobutton_pref_display_zoomscale4), FALSE); */ + } + gtk_widget_show(radiobutton_pref_display_zoomscale4); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_zoomscale), + radiobutton_pref_display_zoomscale4, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_zoomscale4), + "zscale", + "3"); + + + + + radiobutton_pref_display_zoomscale5 = + gtk_radio_button_new_with_label(zoomscale_group, _("1.6")); + zoomscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_zoomscale5)); + gtk_widget_ref(radiobutton_pref_display_zoomscale5); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_zoomscale5", + radiobutton_pref_display_zoomscale5, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.zoom_index == ZOOM_4) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_zoomscale5), + TRUE); +/* } else { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (radiobutton_pref_display_zoomscale5), FALSE); */ + } + gtk_widget_show(radiobutton_pref_display_zoomscale5); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_zoomscale), + radiobutton_pref_display_zoomscale5, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_zoomscale5), + "zscale", + "4"); + + + + + radiobutton_pref_display_zoomscale6 = + gtk_radio_button_new_with_label(zoomscale_group, _("2.0")); + zoomscale_group = + gtk_radio_button_group(GTK_RADIO_BUTTON + (radiobutton_pref_display_zoomscale6)); + gtk_widget_ref(radiobutton_pref_display_zoomscale6); + gtk_object_set_data_full(GTK_OBJECT(gpiv->console), + "radiobutton_pref_display_zoomscale6", + radiobutton_pref_display_zoomscale6, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.zoom_index == ZOOM_5) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (radiobutton_pref_display_zoomscale6), + TRUE); +/* } else { */ +/* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ +/* (radiobutton_pref_display_zoomscale6), FALSE); */ + } + gtk_widget_show(radiobutton_pref_display_zoomscale6); + gtk_box_pack_start(GTK_BOX(vbox_pref_display_zoomscale), + radiobutton_pref_display_zoomscale6, + FALSE, + FALSE, + 0); + gtk_object_set_data(GTK_OBJECT(radiobutton_pref_display_zoomscale6), + "zscale", + "5"); + + +/* + * Hide and display data +*/ + + frame_pref_display_display = gtk_frame_new (_("hide/display data")); + gtk_widget_ref (frame_pref_display_display); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "frame_pref_display_display", + frame_pref_display_display, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (frame_pref_display_display); + gtk_table_attach (GTK_TABLE (table2), + frame_pref_display_display, + 2, + 3, + 0, + 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_FILL), + 0, + 0); + + vbox_pref_display_display = gtk_vbox_new (FALSE, 0); + gtk_widget_ref (vbox_pref_display_display); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "vbox_pref_display_display", + vbox_pref_display_display, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox_pref_display_display); + gtk_container_add (GTK_CONTAINER (frame_pref_display_display), + vbox_pref_display_display); + + + + checkbutton_pref_display_display_img1 = + gtk_check_button_new_with_label (_("image A")); + gtk_widget_ref (checkbutton_pref_display_display_img1); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_display_display_img1", + checkbutton_pref_display_display_img1, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.display_img1 == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_img1), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_img1), + FALSE); + } + gtk_widget_show (checkbutton_pref_display_display_img1); + gtk_box_pack_start (GTK_BOX (vbox_pref_display_display), + checkbutton_pref_display_display_img1, + FALSE, + FALSE, + 0); + + + + checkbutton_pref_display_display_img2 = + gtk_check_button_new_with_label (_("image B")); + gtk_widget_ref (checkbutton_pref_display_display_img2); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_display_display_img2", + checkbutton_pref_display_display_img2, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.display_img2 == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_img2), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_img2), + FALSE); + } + gtk_widget_show (checkbutton_pref_display_display_img2); + gtk_box_pack_start (GTK_BOX (vbox_pref_display_display), + checkbutton_pref_display_display_img2, + FALSE, + FALSE, + 0); + + + + checkbutton_pref_display_display_intregs = + gtk_check_button_new_with_label (_("Interrogation area's")); + gtk_widget_ref (checkbutton_pref_display_display_intregs); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_display_display_intregs", + checkbutton_pref_display_display_intregs, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.display_intregs == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_intregs), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_intregs), + FALSE); + } + gtk_widget_show (checkbutton_pref_display_display_intregs); + gtk_box_pack_start (GTK_BOX (vbox_pref_display_display), + checkbutton_pref_display_display_intregs, + FALSE, + FALSE, + 0); + + + + checkbutton_pref_display_display_piv = + gtk_check_button_new_with_label (_("Velocity vectors")); + gtk_widget_ref (checkbutton_pref_display_display_piv); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_display_display_piv", + checkbutton_pref_display_display_piv, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.display_piv) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_piv), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_piv), + FALSE); + } + gtk_widget_show (checkbutton_pref_display_display_piv); + gtk_box_pack_start (GTK_BOX (vbox_pref_display_display), + checkbutton_pref_display_display_piv, + FALSE, + FALSE, + 0); + + + + checkbutton_pref_display_display_vor = + gtk_check_button_new_with_label (_("Vorticity")); + gtk_widget_ref (checkbutton_pref_display_display_vor); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_display_display_vor", + checkbutton_pref_display_display_vor, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.display_vor) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_vor), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_vor), + FALSE); + } + gtk_widget_show (checkbutton_pref_display_display_vor); + gtk_box_pack_start (GTK_BOX (vbox_pref_display_display), + checkbutton_pref_display_display_vor, + FALSE, + FALSE, + 0); + + + + checkbutton_pref_display_display_sstrain = + gtk_check_button_new_with_label (_("Shear strain")); + gtk_widget_ref (checkbutton_pref_display_display_sstrain); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_display_display_sstrain", + checkbutton_pref_display_display_sstrain, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.display_sstrain == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_sstrain), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_sstrain), + FALSE); + } + gtk_widget_show (checkbutton_pref_display_display_sstrain); + gtk_box_pack_start (GTK_BOX (vbox_pref_display_display), + checkbutton_pref_display_display_sstrain, FALSE, FALSE, 0); + + + checkbutton_pref_display_display_nstrain = + gtk_check_button_new_with_label (_("Normal strain")); + gtk_widget_ref (checkbutton_pref_display_display_nstrain); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "checkbutton_pref_display_display_nstrain", + checkbutton_pref_display_display_nstrain, + (GtkDestroyNotify) gtk_widget_unref); + if (default_par.display_nstrain == 1) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_nstrain), + TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (checkbutton_pref_display_display_nstrain), + FALSE); + } + gtk_widget_show (checkbutton_pref_display_display_nstrain); + gtk_box_pack_start (GTK_BOX (vbox_pref_display_display), + checkbutton_pref_display_display_nstrain, + FALSE, + FALSE, + 0); + + + + + + + + pref_tab2 = gtk_label_new (_("display")); + gtk_widget_ref (pref_tab2); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "pref_tab2", + pref_tab2, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (pref_tab2); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), + gtk_notebook_get_nth_page + (GTK_NOTEBOOK (notebook1), 1), + pref_tab2); + + + +/* + * Font selection tabulator + */ + +/* fontselection = gtk_font_selection_new (); */ +/* gtk_widget_ref (fontselection); */ +/* gtk_object_set_data_full (GTK_OBJECT (preferences), "fontselection", fontselection, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_widget_show (fontselection); */ +/* gtk_container_add (GTK_CONTAINER (notebook1), fontselection); */ + +/* pref_tab3 = gtk_label_new (_("fonts")); */ +/* gtk_widget_ref (pref_tab3); */ +/* gtk_object_set_data_full (GTK_OBJECT (preferences), "pref_tab3", pref_tab3, */ +/* (GtkDestroyNotify) gtk_widget_unref); */ +/* gtk_widget_show (pref_tab3); */ +/* gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), pref_tab3); */ + + +/* + * Dialog area with "OK", "Apply and "Cancel" buttons + */ + + dialog_action_area1 = GNOME_DIALOG (preferences)->action_area; + gtk_object_set_data (GTK_OBJECT (preferences), + "dialog_action_area1", + dialog_action_area1); + gtk_widget_show (dialog_action_area1); + gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), + GTK_BUTTONBOX_END); + gtk_button_box_set_spacing (GTK_BUTTON_BOX (dialog_action_area1), + 8); + + + + gnome_dialog_append_button (GNOME_DIALOG (preferences), + GNOME_STOCK_BUTTON_OK); + button_pref_ok = + GTK_WIDGET (g_list_last (GNOME_DIALOG (preferences)->buttons)->data); + gtk_widget_ref (button_pref_ok); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "button_pref_ok", + button_pref_ok, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (button_pref_ok); + GTK_WIDGET_SET_FLAGS (button_pref_ok, + GTK_CAN_DEFAULT); + gtk_tooltips_set_tip(gpiv->tooltips, button_pref_ok, + _("Updates parameters and save as defaults"), + NULL); + + gtk_object_set_data(GTK_OBJECT(button_pref_ok), + "gpiv", + gpiv); + gtk_signal_connect (GTK_OBJECT (button_pref_ok), "clicked", + GTK_SIGNAL_FUNC (on_button_pref_ok), + NULL); + + + + gnome_dialog_append_button (GNOME_DIALOG (preferences), + GNOME_STOCK_BUTTON_APPLY); + button_pref_apply = + GTK_WIDGET (g_list_last (GNOME_DIALOG (preferences)->buttons)->data); + gtk_widget_ref (button_pref_apply); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "button_pref_apply", + button_pref_apply, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (button_pref_apply); + GTK_WIDGET_SET_FLAGS (button_pref_apply, GTK_CAN_DEFAULT); + gtk_tooltips_set_tip(gpiv->tooltips, button_pref_apply, + _("Updates actual parameters, do not store as defaults"), + NULL); + + gtk_object_set_data(GTK_OBJECT(button_pref_apply), + "gpiv", + gpiv); + gtk_signal_connect (GTK_OBJECT (button_pref_apply), "clicked", + GTK_SIGNAL_FUNC (on_button_pref_apply), + NULL); + + + + gnome_dialog_append_button (GNOME_DIALOG (preferences), + GNOME_STOCK_BUTTON_CANCEL); + button_pref_cancel = + GTK_WIDGET (g_list_last (GNOME_DIALOG (preferences)->buttons)->data); + gtk_widget_ref (button_pref_cancel); + gtk_object_set_data_full (GTK_OBJECT (preferences), + "button_pref_cancel", + button_pref_cancel, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (button_pref_cancel); + GTK_WIDGET_SET_FLAGS (button_pref_cancel, + GTK_CAN_DEFAULT); + gtk_tooltips_set_tip(gpiv->tooltips, + button_pref_cancel, + _("Close preferences window"), + NULL); + + gtk_signal_connect (GTK_OBJECT (button_pref_cancel), + "clicked", + GTK_SIGNAL_FUNC (on_button_pref_cancel), + NULL); + + +/* + * Display callback functions + */ + + + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_vecscale1), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_vecscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_vecscale2), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_vecscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_vecscale3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_vecscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_vecscale4), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_vecscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_vecscale5), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_vecscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_vecscale6), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_vecscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_vecscale7), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_vecscale), + NULL); + + + + + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_zoomscale1), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_zoomscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_zoomscale2), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_zoomscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_zoomscale3), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_zoomscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_zoomscale4), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_zoomscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_zoomscale5), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_zoomscale), + NULL); + gtk_signal_connect (GTK_OBJECT(radiobutton_pref_display_zoomscale6), + "toggled", + GTK_SIGNAL_FUNC(on_radiobutton_pref_display_zoomscale), + NULL); + + + + + gtk_signal_connect (GTK_OBJECT(checkbutton_pref_display_display_img1), + "toggled", + GTK_SIGNAL_FUNC(on_checkbutton_pref_display_display_img1), + NULL); + gtk_signal_connect (GTK_OBJECT(checkbutton_pref_display_display_img2), + "toggled", + GTK_SIGNAL_FUNC(on_checkbutton_pref_display_display_img2), + NULL); + gtk_signal_connect (GTK_OBJECT(checkbutton_pref_display_display_intregs), "toggled", + GTK_SIGNAL_FUNC(on_checkbutton_pref_display_display_intregs), + NULL); + gtk_signal_connect (GTK_OBJECT(checkbutton_pref_display_display_piv), + "toggled", + GTK_SIGNAL_FUNC(on_checkbutton_pref_display_display_piv), + NULL); + gtk_signal_connect (GTK_OBJECT(checkbutton_pref_display_display_vor), + "toggled", + GTK_SIGNAL_FUNC(on_checkbutton_pref_display_display_vor), + NULL); + gtk_signal_connect (GTK_OBJECT(checkbutton_pref_display_display_sstrain), + "toggled", + GTK_SIGNAL_FUNC(on_checkbutton_pref_display_display_sstrain), + NULL); + gtk_signal_connect (GTK_OBJECT(checkbutton_pref_display_display_nstrain), + "toggled", + GTK_SIGNAL_FUNC(on_checkbutton_pref_display_display_nstrain), + NULL); + + return preferences; +} + + + + +void +on_checkbutton_pref_gpivbuttons_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.view_gpivbuttons = 1; + } else { + default_par.view_gpivbuttons = 0; + } +} + + +void +on_checkbutton_pref_tab_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.view_tabulator = 1; + } else { + default_par.view_tabulator = 0; + } +} + + +void +on_checkbutton_pref_hdf_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.hdf = 1; + } else { + default_par.hdf = 0; + } +} + + +void +on_checkbutton_pref_hdfimg_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.hdf_img = 1; + } else { + default_par.hdf_img = 0; + } +} + + +void +on_spinbutton_pref_cols_activate(GtkWidget *widget, + gpointer data) +{ + default_par.img_width = gtk_spin_button_get_value_as_int(widget); + img_set = TRUE; +} + +void +on_spinbutton_pref_rows_activate(GtkWidget *widget, + gpointer data) +{ + default_par.img_height = gtk_spin_button_get_value_as_int(widget); + img_set = TRUE; +} + +void +on_checkbutton_pref_tooltips_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.show_tooltips = 1; + } else { + default_par.show_tooltips = 0; + } +} + + +void +on_checkbutton_pref_process_piv_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_piv = TRUE; + } else { + default_par.process_piv = FALSE; + } +} + + +void +on_checkbutton_pref_process_gradient_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_gradient = TRUE; + } else { + default_par.process_gradient = FALSE; + } +} + + + + +void +on_checkbutton_pref_process_resstats_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_resstats = TRUE; + } else { + default_par.process_resstats = FALSE; + } +} + + + +void +on_checkbutton_pref_process_errvec_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_peaklock = TRUE; + } else { + default_par.process_peaklock = FALSE; + } +} + + + +void +on_checkbutton_pref_process_peaklck_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_peaklock = TRUE; + } else { + default_par.process_peaklock = FALSE; + } +} + + + +void +on_checkbutton_pref_process_substract_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_substract = TRUE; + } else { + default_par.process_substract = FALSE; + } +} + + + +void +on_checkbutton_pref_process_scale_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_scale = TRUE; + } else { + default_par.process_scale = FALSE; + } +} + + +void +on_checkbutton_pref_process_avg_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_average = TRUE; + } else { + default_par.process_average = FALSE; + } +} + + +void +on_checkbutton_pref_process_vorstra_activate(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.process_vorstra = TRUE; + } else { + default_par.process_vorstra = FALSE; + } +} + +void +on_spinbutton_pref_bins_activate(GtkWidget *widget, + gpointer data){} + + + + +void +on_radiobutton_pref_display_vecscale(GtkWidget *widget, + gpointer data) +{ + default_par.vector_scale = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "vscale")); +} + + + +void +on_radiobutton_pref_display_zoomscale(GtkWidget *widget, + gpointer data) +{ + default_par.zoom_index = atoi(gtk_object_get_data(GTK_OBJECT(widget), + "zscale")); +} + + + +void +on_checkbutton_pref_display_display_img1(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.display_img1 = 1; + } else { + default_par.display_img1 = 0; + } +} + +void +on_checkbutton_pref_display_display_img2(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.display_img2 = 1; + } else { + default_par.display_img2 = 0; + } +} + +void +on_checkbutton_pref_display_display_intregs(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.display_intregs = TRUE; + } else { + default_par.display_intregs = FALSE; + } +} + +void +on_checkbutton_pref_display_display_piv(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.display_piv = TRUE; + } else { + default_par.display_piv = FALSE; + } +} + +void +on_checkbutton_pref_display_display_vor(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.display_vor = TRUE; + } else { + default_par.display_vor = FALSE; + } +} + +void +on_checkbutton_pref_display_display_sstrain(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.display_sstrain = TRUE; + } else { + default_par.display_sstrain = FALSE; + } +} + +void +on_checkbutton_pref_display_display_nstrain(GtkWidget *widget, + gpointer data) +{ + if (GTK_TOGGLE_BUTTON(widget)->active) { + default_par.display_nstrain = TRUE; + } else { + default_par.display_nstrain = FALSE; + } +} + + + + + + + + +void +on_button_pref_ok(GtkWidget *widget, + gpointer data) +/* -------------------------------------------------------------------- + updates parameters, set as defaults and closes preferences window */ +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + + apply_gpivpar(gpiv); + store_defaultpar(); + + if (img_set) { + gtk_warning("In order to affect image width and height,\n" + "restart gpiv"); + } + + gnome_dialog_close(GNOME_DIALOG(gpiv_preferences)); +} + + + +void +on_button_pref_apply(GtkWidget *widget, + gpointer data) +/* -------------------------------------------------------------------- + updates parameters */ +{ + GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); + apply_gpivpar(gpiv); + if (img_set) gtk_warning("In order to change image width and height,\n" + "press OK button and restart gpiv"); +} + +void +on_button_pref_cancel(GtkWidget *widget, + gpointer data){ +/* -------------------------------------------------------------------- + updates parameters and closes preferences window */ + + gnome_dialog_close(GNOME_DIALOG(gpiv_preferences)); +} + + + + +void +apply_gpivpar(GpivConsole * gpiv) +/* -------------------------------------------------------------------- + Updates actual parameters */ +{ + GtkWidget *settings_menu_gpiv0 = + gtk_object_get_data(GTK_OBJECT(gpiv->console), "settings_menu_gpiv0"); + GtkWidget *settings_menu_gpiv1 = + gtk_object_get_data(GTK_OBJECT(gpiv->console), "settings_menu_gpiv1"); + + + gpiv_par.show_tooltips = default_par.show_tooltips; + gpiv_par.view_tabulator = default_par.view_tabulator; + gpiv_par.view_gpivbuttons = default_par.view_gpivbuttons; + gpiv_par.nbins = default_par.nbins; + gpiv_par.process_piv = default_par.process_piv; + gpiv_par.process_gradient = default_par.process_gradient; + gpiv_par.process_resstats = default_par.process_resstats; + gpiv_par.process_errvec = default_par.process_errvec; + gpiv_par.process_peaklock = default_par.process_peaklock; + gpiv_par.process_scale = default_par.process_scale; + gpiv_par.process_average = default_par.process_average; + gpiv_par.process_substract = default_par.process_substract; + gpiv_par.process_vorstra = default_par.process_vorstra; + gpiv_par.vector_scale = default_par.vector_scale; + gpiv_par.zoom_index = default_par.zoom_index; + gpiv_par.display_img1 = default_par.display_img1; + gpiv_par.display_img2 = default_par.display_img2; + gpiv_par.display_intregs = default_par.display_intregs; + gpiv_par.display_piv = default_par.display_piv; + gpiv_par.display_vor = default_par.display_vor; + gpiv_par.display_sstrain = default_par.display_sstrain; + gpiv_par.display_nstrain = default_par.display_nstrain; + gpiv_par.hdf = default_par.hdf; + gpiv_par.hdf_img = default_par.hdf_img; + + + if (default_par.view_gpivbuttons == 1) { + gtk_widget_show(gpiv->handlebox1); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv0), TRUE); + } else { + gtk_widget_hide(gpiv->handlebox1); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv0), FALSE); + } + + if (default_par.view_tabulator == 1) { + gtk_widget_show(gpiv->notebook); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv1), TRUE); + } else { + gtk_widget_hide(gpiv->notebook); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (settings_menu_gpiv1), FALSE); + } + + if (default_par.show_tooltips == 1) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (help_menu_gpiv[1].widget), TRUE); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (help_menu_gpiv_popup[1].widget), TRUE); + } else { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (help_menu_gpiv[1].widget), FALSE); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM + (help_menu_gpiv_popup[1].widget), FALSE); + } + + gtk_spin_button_set_value(GTK_SPIN_BUTTON + (gpiv->pivvalid->spinbutton_peaklck_bins), + default_par.nbins); + + + + + if (default_par.process_piv) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_piv), TRUE); + } else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_piv), FALSE); + } + + if (default_par.process_gradient) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_gradient), TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_gradient), FALSE); + } + + if (default_par.process_resstats) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_resstats), TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_resstats), FALSE); + } + + if (default_par.process_errvec) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_errvec), TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_errvec), FALSE); + } + + if (default_par.process_peaklock) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_peaklock), TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_peaklock), FALSE); + } + + if (default_par.process_scale) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_scale), TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_scale), FALSE); + } + + if (default_par.process_average) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_average), TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_average), FALSE); + } + + if (default_par.process_substract) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_subavg), TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_subavg), FALSE); + } + + if (default_par.process_vorstra) { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_vorstra), TRUE); + } else { + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON + (gpiv->button_toolbar_vorstra), FALSE); + } + + if (nbufs > 0 && display_act->gpd.exist_piv && display_act->display_piv) { + update_all_vectors(&display_act->gpd); + } + + if (display_act != NULL) { + +/* if (default_par.zoom_index == ZOOM_0) { */ +/* zoomfactor = 0.5; */ +/* } else if (default_par.zoom_index == ZOOM_1) { */ +/* zoomfactor = 0.83; */ +/* } else if (default_par.zoom_index == ZOOM_2) { */ +/* zoomfactor = 1.0; */ +/* } else if (default_par.zoom_index == ZOOM_3) { */ +/* zoomfactor = 1.3; */ +/* } else if (default_par.zoom_index == ZOOM_4) { */ +/* zoomfactor = 1.6; */ +/* } else if (default_par.zoom_index == ZOOM_5) { */ +/* zoomfactor = 2.0; */ +/* } else { */ +/* g_warning ("select_zoomscale:: unvalid zoomfacor"); */ +/* } */ + +/* update_all_displays(&display_act->gpd); */ + + + if (display_act->display_intregs) { + if (default_par.display_intregs == 1) { + create_all_intregs2(display_act); + create_all_intregs1(display_act); + } else { + hide_all_intregs1(display_act); + hide_all_intregs2(display_act); + } + } + + + if (display_act->gpd.exist_piv) { + if (default_par.display_piv) { + display_all_vectors(&display_act->gpd); + } else { + hide_all_vectors(&display_act->gpd); + } + } + + + if (display_act->gpd.exist_vor) { + if (default_par.display_vor) { + display_all_scalars(&display_act->gpd.vor_data, VORTICITY); + } else { + hide_all_scalars(&display_act->gpd.vor_data, VORTICITY); + } + } + + + if (display_act->gpd.exist_sstrain) { + if (default_par.display_sstrain) { + display_all_scalars(&display_act->gpd.sstrain_data, S_STRAIN); + } else { + hide_all_scalars(&display_act->gpd.sstrain_data, S_STRAIN); + } + } + + + if (display_act->gpd.exist_nstrain) { + if (default_par.display_nstrain) { + display_all_scalars(&display_act->gpd.nstrain_data, N_STRAIN); + } else { + hide_all_scalars(&display_act->gpd.nstrain_data, N_STRAIN); + } + } + + } +} + + + +void +store_defaultpar(void) +/* -------------------------------------------------------------------- + Store parameters as defaults */ +{ + gnome_config_push_prefix("/gpiv/General/"); +/* gnome_config_set_bool("print_par", print_par); */ + gnome_config_set_bool("show_tooltips", default_par.show_tooltips); + gnome_config_set_bool("view_gpivbuttons", default_par.view_gpivbuttons); + gnome_config_set_bool("view_tabulator", default_par.view_tabulator); + gnome_config_set_int("nbins", default_par.nbins); + gnome_config_set_bool("hdf", default_par.hdf); + gnome_config_set_bool("hdf_img", default_par.hdf_img); + gnome_config_set_int("columns", default_par.img_width); + gnome_config_set_int("rows", default_par.img_height); + + gnome_config_push_prefix("/gpiv/Processes/"); + gnome_config_set_bool("process_piv", default_par.process_piv); + gnome_config_set_bool("process_gradient", default_par.process_gradient); + gnome_config_set_bool("process_resstats", default_par.process_resstats); + gnome_config_set_bool("process_errvec", default_par.process_errvec); + gnome_config_set_bool("process_peaklock", default_par.process_peaklock); + gnome_config_set_bool("process_scale", default_par.process_scale); + gnome_config_set_bool("process_average", default_par.process_average); + gnome_config_set_bool("process_substract", default_par.process_substract); + gnome_config_set_bool("process_vorstra", default_par.process_vorstra); + + gnome_config_push_prefix("/gpiv/Display/"); + gnome_config_set_int("vector_scale", default_par.vector_scale); + gnome_config_set_int("zoom_index", default_par.zoom_index); + gnome_config_set_int("display_img1", default_par.display_img1); + gnome_config_set_int("display_img2", default_par.display_img2); + gnome_config_set_bool("display_intregs", default_par.display_intregs); + gnome_config_set_bool("display_piv", default_par.display_piv); + gnome_config_set_bool("display_vor", default_par.display_vor); + gnome_config_set_bool("display_sstrain", default_par.display_sstrain); + gnome_config_set_bool("display_nstrain", default_par.display_nstrain); + + gnome_config_pop_prefix(); + gnome_config_sync(); + +} + diff --git a/src/preferences.h b/src/preferences.h new file mode 100644 index 0000000..7a1d04a --- /dev/null +++ b/src/preferences.h @@ -0,0 +1,146 @@ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * $Log: preferences.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifndef PREFERENCES_H +#define PREFERENCES_H +/* #ifdef HAVE_CONFIG_H */ +/* # include */ +/* #endif */ + + +/*------------------------------------------------------------------------ + widgets from preferences */ +GtkWidget *create_preferences (GpivConsole *gpiv); + +gboolean img_set; + +void +on_checkbutton_pref_gpivbuttons_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_tab_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_hdf_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_hdfimg_activate(GtkWidget *widget, + gpointer data); +void +on_spinbutton_pref_cols_activate(GtkWidget *widget, + gpointer data); +void +on_spinbutton_pref_rows_activate(GtkWidget *widget, + gpointer data); + + +void +on_checkbutton_pref_tooltips_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_piv_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_gradient_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_resstats_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_errvec_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_peaklck_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_scale_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_avg_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_substract_activate(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_process_vorstra_activate(GtkWidget *widget, + gpointer data); +void +on_spinbutton_pref_bins_activate(GtkWidget *widget, + gpointer data); + + +void +on_radiobutton_pref_display_zoomscale(GtkWidget *widget, + gpointer data); +void +on_radiobutton_pref_display_vecscale(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_display_display_img1(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_display_display_img2(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_display_display_intregs(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_display_display_piv(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_display_display_vor(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_display_display_sstrain(GtkWidget *widget, + gpointer data); +void +on_checkbutton_pref_display_display_nstrain(GtkWidget *widget, + gpointer data); + + +void +on_button_pref_ok(GtkWidget *widget, + gpointer data); +void +on_button_pref_apply(GtkWidget *widget, + gpointer data); +void +on_button_pref_cancel(GtkWidget *widget, + gpointer data); +void +apply_gpivpar(GpivConsole * gpiv); + +void +store_defaultpar(void); + +#endif /* PREFERENCES_H */ diff --git a/src/support.c b/src/support.c new file mode 100644 index 0000000..9a29403 --- /dev/null +++ b/src/support.c @@ -0,0 +1,174 @@ +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * $Log: support.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include + +#include "support.h" + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* create_dummy_pixmap (GtkWidget *widget, + gboolean gnome_pixmap); + +GtkWidget* +lookup_widget (GtkWidget *widget, + const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) + { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = widget->parent; + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), + widget_name); + if (!found_widget) + g_warning ("Widget not found: %s", widget_name); + return found_widget; +} + +/* This is a dummy pixmap we use when a pixmap can't be found. */ +static char *dummy_pixmap_xpm[] = { +/* columns rows colors chars-per-pixel */ +"1 1 1 1", +" c None", +/* pixels */ +" ", +" " +}; + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* +create_dummy_pixmap (GtkWidget *widget, + gboolean gnome_pixmap) +{ + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + + if (gnome_pixmap) + { + return gnome_pixmap_new_from_xpm_d (dummy_pixmap_xpm); + } + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, + NULL, dummy_pixmap_xpm); + if (gdkpixmap == NULL) + g_error ("Couldn't create replacement pixmap."); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +/* This is an internally used function to create pixmaps. */ +GtkWidget* +create_pixmap (GtkWidget *widget, + const gchar *filename, + gboolean gnome_pixmap) +{ + GtkWidget *pixmap; + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + gchar *pathname; + + if (!filename || !filename[0]) + return create_dummy_pixmap (widget, gnome_pixmap); + + pathname = gnome_pixmap_file (filename); + if (!pathname) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return create_dummy_pixmap (widget, gnome_pixmap); + } + + if (gnome_pixmap) + { + pixmap = gnome_pixmap_new_from_file (pathname); + g_free (pathname); + return pixmap; + } + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, + NULL, pathname); + if (gdkpixmap == NULL) + { + g_warning (_("Couldn't create pixmap from file: %s"), pathname); + g_free (pathname); + return create_dummy_pixmap (widget, gnome_pixmap); + } + g_free (pathname); + + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +/* This is an internally used function to create imlib images. */ +GdkImlibImage* +create_image (const gchar *filename) +{ + GdkImlibImage *image; + gchar *pathname; + + pathname = gnome_pixmap_file (filename); + if (!pathname) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return NULL; + } + + image = gdk_imlib_load_image (pathname); + g_free (pathname); + return image; +} + diff --git a/src/support.h b/src/support.h new file mode 100644 index 0000000..b098845 --- /dev/null +++ b/src/support.h @@ -0,0 +1,63 @@ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * $Log: support.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#include + +/* + * Public Functions. + */ + +/* + * This function returns a widget in a component created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + */ +GtkWidget* lookup_widget (GtkWidget *widget, + const gchar *widget_name); + +/* get_widget() is deprecated. Use lookup_widget instead. */ +#define get_widget lookup_widget + + +/* + * Private Functions. + */ + +/* This is used to create the pixmaps in the interface. */ +GtkWidget* create_pixmap (GtkWidget *widget, + const gchar *filename, + gboolean gnome_pixmap); + +GdkImlibImage* create_image (const gchar *filename); + diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..96b09e2 --- /dev/null +++ b/src/utils.c @@ -0,0 +1,527 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/*---------------------------------------------------------------------- + + gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome + libraries. + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of gpiv. + + Gpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * utility functions for gpiv + * $Log: utils.c,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + +#include "gpiv_gtk.h" +#include "utils.h" +#include "display.h" + + +GnomeCanvasItem +**alloc_gci_matrix(long nr, + long nc + ) +/*-------------------------------------------------------------------- + Allocates 2-dimensional array for GnomeCanvasItem */ +{ + long i; + GnomeCanvasItem **item; + + +/* + * allocate pointers to rows + */ + item = (GnomeCanvasItem **) g_malloc((size_t)((nr - 1) * + sizeof(GnomeCanvasItem*))); + if (!item) gpiv_error("%s: allocation failure 1 in g_malloc()", + "alloc_gci_matrix"); + item += 1; + +/* + * allocate rows and set pointers to them + */ + item[0] = (GnomeCanvasItem *) g_malloc((size_t)((nr * nc - 1) * + sizeof(GnomeCanvasItem))); + if (!item[0]) gpiv_error("%s: allocation failure 2 in g_malloc()", + "alloc_gci_matrix"); + item[0] += 1; + + for(i = 1; i <= nr; i++) item[i] = item[i-1] + 1; + +/* + * return pointer to array of pointers to rows + */ + return item; +} + +void +free_gci_matrix(GnomeCanvasItem **item, + long nr, + long nc + ) +/*-------------------------------------------------------------------- + Frees 2-dimensional array for GnomeCanvasItem */ +{ + assert(item[0] != NULL); + + free((char*) (item[0] - 1)); + free((char*) (item - 1)); +} + + + +void +free_all_bufmems(Display * disp + ) +/*-------------------------- Frees all dynamic memory of Buffer structure */ +{ +/* if (disp->mwin != NULL */ +/* && GTK_WIDGET_VISIBLE(GTK_WIDGET(disp->mwin)) ) { */ +/* gdk_window_show(GTK_WIDGET(disp->mwin)->window); */ +/* gdk_window_raise(GTK_WIDGET(disp->mwin)->window); */ +/* } */ + + free_img_bufmems(disp); + free_eval_bufmems(disp); + free_post_bufmems(disp); +} + + + +void +free_img_bufmems(Display * disp + ) +/*-------------------------------------------------------------------- + * Frees all dynamic memory of Buffer structure of img + */ +{ + g_snprintf(disp->fname_base, MAX_CHARS,""); + + if (disp->img.exist_img) { + free_img(disp->img.img1, image_par); +/* g_free(disp->img.graybuf_img); */ + if (image_par.x_corr == 1) + free_img(disp->img.img2, image_par); +/* g_free(disp->img.graybuf_img2); */ + } + + destroy_background(disp); + if (disp->intreg.exist) + destroy_all_intregs(disp); + + +} + + +void +free_eval_bufmems(Display * disp + ) +/*-------------------------------------------------------------------- + * Frees all dynamic memory of Buffer structure of evaluation processing + */ +{ + if (disp->gpd.exist_piv) { + destroy_all_vectors(&disp->gpd); + gpiv_free_pivdata(&disp->gpd.piv_data); + disp->gpd.exist_piv = FALSE; + } + + if (disp->gpd.scaled_piv) { + gpiv_free_pivdata(&disp->gpd.piv_data_scaled); + disp->gpd.scaled_piv = FALSE; + } + +} + + +void +free_post_bufmems(Display * disp + ) +/*-------------------------------------------------------------------- + * Frees all dynamic memory of Buffer structure of post processing + */ +{ + + if (disp->gpd.exist_vor) { + destroy_all_scalars(&display_act->gpd.vor_data, VORTICITY); + gpiv_free_scdata(&disp->gpd.vor_data); + display_act->gpd.exist_vor = FALSE; + display_act->gpd.piv_post_par.diff_type_logic = 0; + display_act->gpd.piv_post_par.operator_vorstra_logic = 0; + } + + if (disp->gpd.exist_vor_scaled) { + gpiv_free_scdata(&disp->gpd.vor_data_scaled); + display_act->gpd.exist_vor_scaled = FALSE; + } + + if (display_act->gpd.exist_sstrain) { + destroy_all_scalars(&display_act->gpd.sstrain_data, S_STRAIN); + gpiv_free_scdata (&display_act->gpd.sstrain_data); + display_act->gpd.exist_sstrain = FALSE; + display_act->gpd.piv_post_par.diff_type_logic = 0; + display_act->gpd.piv_post_par.operator_vorstra_logic = 0; + } + + if (display_act->gpd.exist_sstrain_scaled) { + gpiv_free_scdata (&display_act->gpd.sstrain_data_scaled); + display_act->gpd.exist_sstrain_scaled = FALSE; + } + + if (display_act->gpd.exist_nstrain) { + destroy_all_scalars(&display_act->gpd.nstrain_data, N_STRAIN); + gpiv_free_scdata (&display_act->gpd.nstrain_data); + display_act->gpd.exist_nstrain = FALSE; + display_act->gpd.piv_post_par.diff_type_logic = 0; + display_act->gpd.piv_post_par.operator_vorstra_logic = 0; + } + + if (display_act->gpd.exist_nstrain_scaled) { + gpiv_free_scdata (&display_act->gpd.nstrain_data_scaled); + display_act->gpd.exist_nstrain_scaled = FALSE; + } + +} + + +void +copy_img_par (ImagePar image_par_src, + ImagePar * image_par_dest, + int print_par + ) +/* + * copy image parameters from src to dest + */ +{ + if (image_par_src.nrows_logic && !image_par_dest->nrows_logic) { + image_par_dest->nrows = image_par_src.nrows; + image_par_dest->nrows_logic = 1; + if (print_par) + gpiv_warning("nrows = %d", image_par_dest->nrows); + } + + if (image_par_src.ncolumns_logic && !image_par_dest->ncolumns_logic) { + image_par_dest->ncolumns = image_par_src.ncolumns; + image_par_dest->ncolumns_logic = 1; + if (print_par) + gpiv_warning("ncolumns = %d", image_par_dest->ncolumns); + } + + if(image_par_src.nbits_logic && !image_par_dest->nbits_logic) { + image_par_dest->nbits = image_par_src.nbits; + image_par_dest->nbits_logic = 1; + if (print_par) + gpiv_warning("nbits = %d", image_par_dest->nbits); + } + + if(image_par_src.x_corr_logic && !image_par_dest->x_corr_logic) { + image_par_dest->x_corr = image_par_src.x_corr; + image_par_dest->x_corr_logic = 1; + if (print_par) + gpiv_warning("x_corr = %d", image_par_dest->x_corr); + } + + if (image_par_src.s_scale_logic && !image_par_dest->s_scale_logic) { + image_par_dest->s_scale = image_par_src.s_scale; + image_par_dest->s_scale_logic = 1; + if (print_par) + gpiv_warning("s_scale = %d", image_par_dest->s_scale); + } + + if(image_par_src.t_scale_logic && !image_par_dest->t_scale_logic) { + image_par_dest->t_scale = image_par_src.t_scale; + image_par_dest->t_scale_logic = 1; + if (print_par) + gpiv_warning("t_scale = %d", image_par_dest->t_scale); + } + + if (image_par_src.z_off_logic && !image_par_dest->z_off_logic) { + image_par_dest->z_off_x = image_par_src.z_off_x; + image_par_dest->z_off_y = image_par_src.z_off_y; + image_par_dest->z_off_logic = 1; + if (print_par) { + gpiv_warning("z_off_x = %f", image_par_dest->z_off_x); + gpiv_warning("z_off_y = %f", image_par_dest->z_off_x); + } + } + + if (image_par.project_logic && !image_par_dest->project_logic) { + image_par_dest->project_logic = 1; + snprintf(image_par_dest->project, MAX_CHARS, "%s", + image_par_src.project); + if (print_par) + gpiv_warning("project = %S", image_par_dest->project); + } + + + if (image_par.creation_date_logic + && !image_par_dest->creation_date_logic) { + image_par_dest->creation_date_logic = 1; + snprintf(image_par_dest->creation_date, MAX_CHARS, "%s", + image_par_src.creation_date); + if (print_par) + gpiv_warning("creation_date = %s", image_par_dest->creation_date); + } else { + char time_string[MAX_CHARS]; + struct tm time_struct; + time_t itime; + time(&itime); + time_struct = *gmtime(&itime); + strftime(time_string, MAX_CHARS, "%a %b %d %Y %T", &time_struct); + if (print_par) + gpiv_warning("Setting new time = %s", time_string); + snprintf(image_par.creation_date, MAX_CHARS, "%s", time_string); + image_par_dest->creation_date_logic = 1; + } + + + if (image_par_src.location_logic && !image_par_dest->location_logic) { + image_par_dest->location_logic = 1; + snprintf(image_par_dest->location, MAX_CHARS, "%s", + image_par_src.location); + if (print_par) + gpiv_warning("location = %s", image_par_dest->location); + } + + + if (image_par_src.comment_logic && !image_par_dest->comment_logic) { + image_par_dest->comment_logic = 1; + snprintf(image_par_dest->comment, MAX_CHARS, "%s", + image_par_src.comment); + if (print_par) + gpiv_warning("comment = %s", image_par_dest->comment); + } +} + + + +/* + * gtk routnies + */ + +void +sensitive(GpivConsole *gpiv, + enum WidgetSet wi_set, + gint sense) +/* ---------- Changes the sensitivity of a set of witgets ---------------*/ +{ + + +/* + * Setting sensitivity of Image witgets + */ + if (wi_set == IMG) { +/* gtk_widget_set_sensitive(gpiv->imgh->label_name, sense); */ +/* gtk_widget_set_sensitive(gpiv->imgh->entry_name, sense); */ +/* gtk_widget_set_sensitive(gpiv->imgh->spinbutton_ncols, sense); */ + + gtk_widget_set_sensitive(gpiv->imgh->label_colpos, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_sscale, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_ncols, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_nrows, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_rowpos, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_tscale, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_crdate, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_location, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_project, sense); + gtk_widget_set_sensitive(gpiv->imgh->label_comment, sense); + gtk_widget_set_sensitive(gpiv->imgh->spinbutton_colpos, sense); + gtk_widget_set_sensitive(gpiv->imgh->spinbutton_sscale, sense); + gtk_widget_set_sensitive(gpiv->imgh->spinbutton_rowpos, sense); + gtk_widget_set_sensitive(gpiv->imgh->spinbutton_tscale, sense); + gtk_widget_set_sensitive(gpiv->imgh->entry_crdate, sense); + gtk_widget_set_sensitive(gpiv->imgh->entry_location, sense); + gtk_widget_set_sensitive(gpiv->imgh->entry_project, sense); + gtk_widget_set_sensitive(gpiv->imgh->entry_comment, sense); + } + + +/* + * Setting sensitivity of Image Processing witgets + */ + if (wi_set == IMGPROC) { + } + + +/* + * Setting sensitivity of PIV witgets + */ + if (wi_set == EVAL) { + gtk_widget_set_sensitive(gpiv->piveval->spinbutton_colstart, sense); + gtk_widget_set_sensitive(gpiv->piveval->spinbutton_colend, sense); + gtk_widget_set_sensitive(gpiv->piveval->spinbutton_preshiftcol, sense); + gtk_widget_set_sensitive(gpiv->piveval->spinbutton_rowstart, sense); + gtk_widget_set_sensitive(gpiv->piveval->spinbutton_rowend, sense); + gtk_widget_set_sensitive(gpiv->piveval->spinbutton_preshiftrow, sense); + +/* gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize1_1, sense); */ + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize1_2, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize1_3, sense); + + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize1_4, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize1_5, sense); + +/* gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize2_1, sense); */ + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize2_2, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize2_3, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize2_4, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize2_5, sense); + + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intshift_1, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intshift_2, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intshift_3, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intshift_4, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intshift_5, sense); + + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_fit_none, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_fit_gauss, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_fit_power, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_fit_gravity, sense); + + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_mouse_1, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_mouse_2, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_mouse_3, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_mouse_4, sense); + + gtk_widget_set_sensitive(gpiv->piveval->checkbutton_disprocess, sense); + + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_peak_1, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_peak_2, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_peak_3, sense); + + gtk_widget_set_sensitive(gpiv->piveval->checkbutton_weightkernel, sense); + gtk_widget_set_sensitive(gpiv->piveval->checkbutton_zerooff, sense); + gtk_widget_set_sensitive(gpiv->piveval->checkbutton_centraldiff, sense); + + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_cross_1, sense); + gtk_widget_set_sensitive(gpiv->piveval->radiobutton_cross_2, sense); + + gtk_widget_set_sensitive(gpiv->piveval->button, sense); + } + + +/* + * Setting sensitivity of a slection of PIV witgets + */ + if (wi_set == INTREGS) { +/* if (piv_eval_par.int_size_1 >= 16) { */ +/* gtk_widget_set_sensitive(GTK_WIDGET */ +/* (gpiv->piveval->radiobutton_intsize2_1), sense); */ + if (piv_eval_par.int_size_1 >= 32) { + gtk_widget_set_sensitive(GTK_WIDGET + (gpiv->piveval->radiobutton_intsize2_2), + sense); + if (piv_eval_par.int_size_1 >= 64) { + gtk_widget_set_sensitive(GTK_WIDGET + (gpiv->piveval->radiobutton_intsize2_3), + sense); + if (piv_eval_par.int_size_1 >= 128) { + gtk_widget_set_sensitive(GTK_WIDGET + (gpiv->piveval->radiobutton_intsize2_4), + sense); + } + } + } +/* } */ + } + + + +/* + * Setting sensitivity of Validation witgets + */ + if (wi_set == VALID) { + gtk_widget_set_sensitive(gpiv->pivvalid->radiobutton_errvec_residu_1, sense); + gtk_widget_set_sensitive(gpiv->pivvalid->radiobutton_errvec_residu_2, sense); + gtk_widget_set_sensitive(gpiv->pivvalid->radiobutton_disable_1, sense); + gtk_widget_set_sensitive(gpiv->pivvalid->label_errvec_res, sense); + gtk_widget_set_sensitive(gpiv->pivvalid->spinbutton_errvec_res, sense); + gtk_widget_set_sensitive(gpiv->pivvalid->checkbutton_errvec_disres, sense); + gtk_widget_set_sensitive(gpiv->pivvalid->button_errvec_resstats, sense); + + gtk_widget_set_sensitive(gpiv->pivvalid->radiobutton_errvec_subst_1, sense); +/* gtk_widget_set_sensitive(gpiv->pivvalid->radiobutton_errvec_subst_2, sense); */ + gtk_widget_set_sensitive(gpiv->pivvalid->radiobutton_errvec_subst_3, sense); + gtk_widget_set_sensitive(gpiv->pivvalid->button_errvec, sense); + + gtk_widget_set_sensitive(gpiv->pivvalid->spinbutton_peaklck_bins, sense); + gtk_widget_set_sensitive(gpiv->pivvalid->button_peaklck, sense); + } + + +/* + * Setting sensitivity of Post processing witgets + */ + if (wi_set == POST) { + gtk_widget_set_sensitive(gpiv->pivpost->radiobutton_vorstra_output_1, sense); + gtk_widget_set_sensitive(gpiv->pivpost->radiobutton_vorstra_output_2, sense); + gtk_widget_set_sensitive(gpiv->pivpost->radiobutton_vorstra_output_3, sense); + + gtk_widget_set_sensitive(gpiv->pivpost->radiobutton_vorstra_diffscheme_1, + sense); + gtk_widget_set_sensitive(gpiv->pivpost->radiobutton_vorstra_diffscheme_2, + sense); + gtk_widget_set_sensitive(gpiv->pivpost->radiobutton_vorstra_diffscheme_3, + sense); + gtk_widget_set_sensitive(gpiv->pivpost->radiobutton_vorstra_diffscheme_4, + sense); + gtk_widget_set_sensitive(gpiv->pivpost->button_vorstra, sense); + } + +} + + + +void destroy(GtkWidget * widget, gpointer data) +{ + gtk_widget_destroy(widget); +} + + +void gtk_warning(gchar * msg, ...) +{ + GtkWidget *gtk_warning_wi; + va_list args; + char local_msg[MAX_CHARS]; + + va_start(args, msg); + vsnprintf (local_msg, MAX_CHARS, msg, args); + gtk_warning_wi = create_messagebox(local_msg); + gtk_widget_show(gtk_warning_wi); + va_end(args); +} + + +void gtk_error(gchar * msg, ...) +{ + GtkWidget *gtk_error_wi; + va_list args; + char local_msg[MAX_CHARS]; + + va_start(args, msg); + vsnprintf (local_msg, MAX_CHARS, msg, args); + gtk_error_wi = create_errorbox(local_msg); + gtk_widget_show(gtk_error_wi); + va_end(args); +} diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..ce16211 --- /dev/null +++ b/src/utils.h @@ -0,0 +1,96 @@ +/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ + +/* + libgpiv - library for Particle Image Velocimetry + + Copyright (C) 2002 Gerber van der Graaf + + This file is part of libgpiv. + + Libgpiv 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +----------------------------------------------------------------------*/ + +/* + * widgets prototypes of display + * $Log: utils.h,v $ + * Revision 1.1 2003-06-17 17:10:52 gerber + * Initial revision + * + */ + + +#ifndef UTILS_H +#define UTILS_H + +/* + * mem allocation functions + */ + +/*-------------------------------------------------------------------- + Allocates 2-dimensional array for GnomeCanvasItem */ +GnomeCanvasItem +**alloc_gci_matrix(long nr, + long nc + ); + +/*-------------------------------------------------------------------- + Frees 2-dimensional array for GnomeCanvasItem */ +void +free_gci_matrix(GnomeCanvasItem **item, + long nr, + long nc + ); + + +void +free_all_bufmems(Display * disp); + +void +free_img_bufmems(Display * disp); + +void +free_eval_bufmems(Display * disp); + +void +free_post_bufmems(Display * disp); + +void +copy_img_par (ImagePar image_par_src, + ImagePar * image_par_dest, + int print_par + ); + +/* + * general gtk functions + */ +void +sensitive(GpivConsole *gpiv, + enum WidgetSet wi_set, + gint sense); + +void +destroy(GtkWidget * widget, + gpointer data); + +void +gtk_warning(gchar * msg, ...); + +void +gtk_error(gchar * msg, ...); + + + +#endif /* UTILS_H */ diff --git a/stamp-h.in b/stamp-h.in new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/stamp-h.in @@ -0,0 +1 @@ +timestamp -- 2.11.4.GIT