]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge to upstream
authorErik Charlebois <erikcharlebois@gmail.com>
Tue, 16 Feb 2010 18:35:15 +0000 (10:35 -0800)
committerErik Charlebois <erikcharlebois@gmail.com>
Tue, 16 Feb 2010 18:35:15 +0000 (10:35 -0800)
82 files changed:
Factor.app/Contents/Info.plist
GNUmakefile
basis/cocoa/tags.txt
basis/globs/globs-tests.factor
basis/globs/globs.factor
basis/images/tags.txt
basis/inverse/inverse.factor
basis/io/directories/directories-docs.factor
basis/io/directories/directories-tests.factor
basis/io/directories/directories.factor
basis/math/vectors/simd/simd-docs.factor
basis/stack-checker/errors/errors-docs.factor
basis/tools/deploy/backend/backend.factor
basis/tools/deploy/deploy-docs.factor [changed mode: 0644->0755]
basis/tools/deploy/deploy-tests.factor
basis/tools/deploy/macosx/macosx.factor
basis/tools/deploy/shaker/shaker.factor
basis/tools/deploy/test/test.factor
basis/tools/deploy/unix/unix.factor
basis/tools/deploy/windows/ico/ico.factor [new file with mode: 0755]
basis/tools/deploy/windows/ico/tags.txt [new file with mode: 0644]
basis/tools/deploy/windows/windows.factor [changed mode: 0644->0755]
basis/ui/gadgets/buttons/buttons.factor
basis/ui/gadgets/corners/corners.factor
basis/ui/gadgets/search-tables/search-tables.factor
basis/ui/gadgets/sliders/sliders.factor
basis/ui/gadgets/tabbed/tabbed.factor
basis/ui/gadgets/theme/authors.txt
basis/ui/gadgets/theme/resources.txt [new file with mode: 0644]
basis/ui/gadgets/theme/theme.factor [new file with mode: 0644]
basis/ui/pens/image/image.factor
basis/vocabs/metadata/metadata-docs.factor
basis/vocabs/metadata/metadata.factor
basis/vocabs/metadata/resources/resources-docs.factor [new file with mode: 0644]
basis/vocabs/metadata/resources/resources-tests.factor [new file with mode: 0644]
basis/vocabs/metadata/resources/resources.factor [new file with mode: 0644]
basis/vocabs/metadata/resources/test/1/1.factor [new file with mode: 0644]
basis/vocabs/metadata/resources/test/1/bar [new file with mode: 0644]
basis/vocabs/metadata/resources/test/1/bas [new file with mode: 0644]
basis/vocabs/metadata/resources/test/1/foo [new file with mode: 0644]
basis/vocabs/metadata/resources/test/1/resources.txt [new file with mode: 0644]
basis/vocabs/metadata/resources/test/2/2.factor [new file with mode: 0644]
basis/vocabs/metadata/resources/test/2/bar.wtf [new file with mode: 0644]
basis/vocabs/metadata/resources/test/2/bas.ftw [new file with mode: 0644]
basis/vocabs/metadata/resources/test/2/foo.wtf [new file with mode: 0644]
basis/vocabs/metadata/resources/test/2/no-resources-here/zim.wtf [new file with mode: 0644]
basis/vocabs/metadata/resources/test/2/resources.txt [new file with mode: 0644]
basis/vocabs/metadata/resources/test/3/3.factor [new file with mode: 0644]
basis/vocabs/metadata/resources/test/3/resource-dir/bar [new file with mode: 0644]
basis/vocabs/metadata/resources/test/3/resource-dir/bas/zang [new file with mode: 0644]
basis/vocabs/metadata/resources/test/3/resource-dir/bas/zim [new file with mode: 0644]
basis/vocabs/metadata/resources/test/3/resource-dir/foo [new file with mode: 0644]
basis/vocabs/metadata/resources/test/3/resources.txt [new file with mode: 0644]
basis/windows/com/tags.txt
basis/windows/kernel32/kernel32.factor
core/alien/tags.txt
core/combinators/combinators-docs.factor
core/sequences/sequences-docs.factor
core/vocabs/loader/loader-docs.factor [changed mode: 0644->0755]
extra/annotations/tags.txt
extra/audio/chunked-file/chunked-file.factor
extra/gpu/demos/bunny/bunny.factor
extra/gpu/demos/bunny/deploy.factor
extra/gpu/demos/bunny/icon.icns [new file with mode: 0644]
extra/gpu/demos/bunny/icon.ico [new file with mode: 0644]
extra/gpu/demos/bunny/resources.txt [new file with mode: 0644]
extra/gpu/demos/bunny/tags.txt [new file with mode: 0644]
extra/gpu/demos/raytrace/deploy.factor [new file with mode: 0644]
extra/gpu/demos/raytrace/icon.icns [new file with mode: 0644]
extra/gpu/demos/raytrace/icon.ico [new file with mode: 0644]
extra/gpu/demos/raytrace/resources.txt [new file with mode: 0644]
extra/gpu/demos/raytrace/tags.txt [new file with mode: 0644]
extra/gpu/textures/textures-docs.factor
extra/gpu/textures/textures.factor
extra/svg/tags.txt
extra/terrain/tags.txt [new file with mode: 0644]
extra/trees/splay/tags.txt
extra/trees/tags.txt
extra/tty-server/tags.txt
extra/webapps/fjsc/tags.txt
extra/websites/concatenative/concatenative.factor
vm/factor.rs

index c87520d0fdf3ab76cbba2a98ed82c6902f08a4b2..1c07f95643962ceddad10d5515829684fa563c22 100644 (file)
        <string>Factor</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
+       <key>CFBundleVersion</key>
+       <string>0.93</string>
        <key>NSHumanReadableCopyright</key>
-       <string>Copyright Â© 2003-2009, Slava Pestov and friends</string>
+       <string>Copyright Â© 2003-2010 Factor developers</string>
        <key>NSServices</key>
        <array>
                <dict>
index c4796de63be6205e18b997a23b9c8d40060dfecf..eac1c696df5b5ecab92c5eb709d48b2c60f79bb7 100755 (executable)
@@ -4,7 +4,7 @@ ifdef CONFIG
        AR = ar
        LD = ld
 
-       VERSION = 0.92
+       VERSION = 0.93
 
        BUNDLE = Factor.app
        LIBPATH = -L/usr/X11R6/lib
index 2320bdd64800598d4f0633f3441065dc20e4018f..86dd9eeb911c05e4fb9ec4df73340bba66a0c33b 100644 (file)
@@ -1,2 +1,3 @@
 unportable
 bindings
+ffi
index bdc0623d5413eb591589a8f35420f59b8c356d26..c9903b163348454ca4df67479871ca82ea6df044 100644 (file)
@@ -1,4 +1,4 @@
-USING: tools.test globs ;
+USING: arrays tools.test globs io.pathnames sequences ;
 IN: globs.tests
 
 [ f ] [ "abd" "fdf" glob-matches? ] unit-test
@@ -17,3 +17,24 @@ IN: globs.tests
 [ f ] [ "foo." "*.{xml,txt}" glob-matches? ] unit-test
 [ t ] [ "foo." "*.{,xml,txt}" glob-matches? ] unit-test
 [ t ] [ "foo.{" "*.{" glob-matches? ] unit-test
+
+[ f ] [ "foo" "bar" append-path "*" glob-matches? ] unit-test
+[ t ] [ "foo" "bar" append-path "*" "*" append-path glob-matches? ] unit-test
+[ f ] [ "foo" "bar" append-path "foo?bar" glob-matches? ] unit-test
+[ t ] [ "foo" "bar" append-path "fo?" "bar" append-path glob-matches? ] unit-test
+
+[ f ] [ "foo" glob-pattern? ] unit-test
+[ t ] [ "fo?" glob-pattern? ] unit-test
+[ t ] [ "fo*" glob-pattern? ] unit-test
+[ t ] [ "fo[mno]" glob-pattern? ] unit-test
+[ t ] [ "fo\\*" glob-pattern? ] unit-test
+[ t ] [ "fo{o,bro}" glob-pattern? ] unit-test
+
+"foo" "bar" append-path 1array
+[ { "foo" "bar" "ba?" } path-separator join glob-parent-directory ] unit-test
+
+[ "foo" ] 
+[ { "foo" "b?r" "bas" } path-separator join glob-parent-directory ] unit-test
+
+[ "" ] 
+[ { "f*" "bar" "bas" } path-separator join glob-parent-directory ] unit-test
index cac7fd9a2ff8056387fe96ca2c09f5585f543cbf..72b686c3b1db7cc603037b055d9b7ab02b2dd4d1 100644 (file)
@@ -1,9 +1,12 @@
 ! Copyright (C) 2007, 2009 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: sequences kernel regexp.combinators strings unicode.case
-peg.ebnf regexp arrays ;
+USING: sequences io.pathnames kernel regexp.combinators
+strings unicode.case peg.ebnf regexp arrays ;
 IN: globs
 
+: not-path-separator ( -- sep )
+    "[^" path-separator "]" 3append <regexp> ; foldable
+
 EBNF: <glob>
 
 Character = "\\" .:c => [[ c 1string <literal> ]]
@@ -24,8 +27,8 @@ CharClass = "^"?:n Ranges:e => [[ e <or> n [ <not> ] when ]]
 AlternationBody = Concatenation:c "," AlternationBody:a => [[ a c prefix ]]
                 | Concatenation => [[ 1array ]]
 
-Element = "*" => [[ R/ .*/ ]]
-        | "?" => [[ R/ ./ ]]
+Element = "*" => [[ not-path-separator <zero-or-more> ]]
+        | "?" => [[ not-path-separator ]]
         | "[" CharClass:c "]" => [[ c ]]
         | "{" AlternationBody:b "}" => [[ b <or> ]]
         | Character
@@ -40,3 +43,10 @@ Main = Concatenation End
 
 : glob-matches? ( input glob -- ? )
     [ >case-fold ] bi@ <glob> matches? ;
+
+: glob-pattern? ( string -- ? )
+    [ "\\*?[{" member? ] any? ;
+
+: glob-parent-directory ( glob -- parent-directory )
+    path-components dup [ glob-pattern? ] find drop head
+    path-separator join ;
index 04b54a06f4a2b08e72a46e419c8855c6be492725..9347bd326b9ab51cf7c8d7217d3411c2a8613f12 100644 (file)
@@ -1 +1 @@
-bitmap graphics
+graphics
index d112e4e6ebd6e3b31374b0233c4ddfd3a4fa0fcd..3485b3efa709c75927485470ce37f66842fb6f0c 100644 (file)
@@ -1,10 +1,10 @@
 ! Copyright (C) 2007, 2009 Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel locals words summary slots quotations
-sequences assocs math arrays stack-checker effects
-continuations debugger classes.tuple namespaces make vectors
-bit-arrays byte-arrays strings sbufs math.functions macros
-sequences.private combinators mirrors splitting combinators.smart
+sequences assocs math arrays stack-checker effects continuations
+classes.tuple namespaces make vectors bit-arrays byte-arrays
+strings sbufs math.functions macros sequences.private
+combinators mirrors splitting combinators.smart
 combinators.short-circuit fry words.symbol generalizations
 classes ;
 IN: inverse
index 4af5ee45927c80410ce094fae6ce331a80245632..804a2f4a8d10c0b377793ae787d2e65cb8d52473 100644 (file)
@@ -46,10 +46,18 @@ HELP: directory-files
 { $values { "path" "a pathname string" } { "seq" "a sequence of filenames" } }
 { $description "Outputs the contents of a directory named by " { $snippet "path" } "." } ;
 
+HELP: directory-tree-files
+{ $values { "path" "a pathname string" } { "seq" "a sequence of filenames" } }
+{ $description "Outputs a sequence of all files and subdirectories inside the directory named by " { $snippet "path" } " or recursively inside its subdirectories." } ;
+
 HELP: with-directory-files
 { $values { "path" "a pathname string" } { "quot" quotation } }
 { $description "Calls the quotation with the directory file names on the stack and with the directory set as the " { $link current-directory } ".  Restores the current directory after the quotation is called." } ;
 
+HELP: with-directory-tree-files
+{ $values { "path" "a pathname string" } { "quot" quotation } }
+{ $description "Calls the quotation with the recursive directory file names on the stack and with the directory set as the " { $link current-directory } ".  Restores the current directory after the quotation is called." } ;
+
 HELP: with-directory-entries
 { $values { "path" "a pathname string" } { "quot" quotation } }
 { $description "Calls the quotation with the directory entries on the stack and with the directory set as the " { $link current-directory } ".  Restores the current directory after the quotation is called." } ;
index b703421b45b471d854db36a4283f436b10ca09ca..742a927b4bab8adfd4600ae8295ff7f80041bad2 100644 (file)
@@ -22,6 +22,24 @@ IN: io.directories.tests
     ] with-directory-files
 ] unit-test
 
+[ { "classes/tuple/tuple.factor" } ] [
+    "resource:core" [
+        "." directory-tree-files [ "classes/tuple/tuple.factor" = ] filter
+    ] with-directory
+] unit-test
+
+[ { "classes/tuple" } ] [
+    "resource:core" [
+        "." directory-tree-files [ "classes/tuple" = ] filter
+    ] with-directory
+] unit-test
+
+[ { "classes/tuple/tuple.factor" } ] [
+    "resource:core" [
+        [ "classes/tuple/tuple.factor" = ] filter
+    ] with-directory-tree-files
+] unit-test
+
 [ ] [ "blahblah" temp-file dup exists? [ delete-directory ] [ drop ] if ] unit-test
 [ ] [ "blahblah" temp-file make-directory ] unit-test
 [ t ] [ "blahblah" temp-file file-info directory? ] unit-test
index 05243983041c35c4f8bd650fac1c30e7858dbc53..d12adc5f41592de0e1e9ccda1638a754c34fc20e 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2004, 2008 Slava Pestov, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators destructors io io.backend
-io.encodings.binary io.files io.pathnames kernel namespaces
-sequences system vocabs.loader fry ;
+USING: accessors arrays combinators destructors io io.backend
+io.encodings.binary io.files io.files.types io.pathnames
+kernel namespaces sequences system vocabs.loader fry ;
 IN: io.directories
 
 : set-current-directory ( path -- )
@@ -41,12 +41,26 @@ HOOK: (directory-entries) os ( path -- seq )
 : directory-files ( path -- seq )
     directory-entries [ name>> ] map ;
 
+: directory-tree-files ( path -- seq )
+    dup directory-entries
+    [
+        dup type>> +directory+ =
+        [ name>>
+            [ append-path directory-tree-files ]
+            [ [ prepend-path ] curry map ]
+            [ prefix ] tri
+        ] [ nip name>> 1array ] if
+    ] with map concat ;
+
 : with-directory-entries ( path quot -- )
     '[ "" directory-entries @ ] with-directory ; inline
 
 : with-directory-files ( path quot -- )
     '[ "" directory-files @ ] with-directory ; inline
 
+: with-directory-tree-files ( path quot -- )
+    '[ "" directory-tree-files @ ] with-directory ; inline
+
 ! Touching files
 HOOK: touch-file io-backend ( path -- )
 
index 540838bdd5b1705b8970a64a4f84c1ad1b4cf731..bcc05564fc2745df386602df82ad7e0a09ee93e5 100644 (file)
@@ -8,7 +8,7 @@ ARTICLE: "math.vectors.simd.intro" "Introduction to SIMD support"
 $nl
 "SIMD support in the processor takes the form of instruction sets which operate on vector registers. By operating on multiple scalar values at the same time, code which operates on points, colors, and other vector data can be sped up."
 $nl
-"In Factor, SIMD support is exposed in the form of special-purpose SIMD " { $link "sequence-protocol" } " implementations. These are fixed-length, homogeneous sequences. They are referred to as vectors, but should not be confused with Factor's " { $link "vectors" } ", which can hold any type of object and can be resized.)."
+"In Factor, SIMD support is exposed in the form of special-purpose SIMD " { $link "sequence-protocol" } " implementations. These are fixed-length, homogeneous sequences. They are referred to as vectors, but should not be confused with Factor's " { $link "vectors" } ", which can hold any type of object and can be resized."
 $nl
 "The words in the " { $vocab-link "math.vectors" } " vocabulary, which can be used with any sequence of numbers, are special-cased by the compiler. If the compiler can prove that only SIMD vectors are used, it expands " { $link "math-vectors" } " into " { $link "math.vectors.simd.intrinsics" } ". While in the general case, SIMD intrinsics operate on heap-allocated SIMD vectors, that too can be optimized since in many cases the compiler unbox SIMD vectors, storing them directly in registers."
 $nl
@@ -36,7 +36,7 @@ $nl
 ARTICLE: "math.vectors.simd.types" "SIMD vector types"
 "Each SIMD vector type is named " { $snippet "scalar-count" } ", where " { $snippet "scalar" } " is a scalar C type and " { $snippet "count" } " is a vector dimension."
 $nl
-"The following vector types are available:"
+"The following 128-bit vector types are defined in the " { $vocab-link "math.vectors.simd" } " vocabulary:"
 { $code
     "char-16"
     "uchar-16"
@@ -48,6 +48,19 @@ $nl
     "ulonglong-2"
     "float-4"
     "double-2"
+}
+"Double-width 256-bit vector types are defined in the " { $vocab-link "math.vectors.simd.cords" } " vocabulary:"
+{ $code
+    "char-32"
+    "uchar-32"
+    "short-16"
+    "ushort-16"
+    "int-8"
+    "uint-8"
+    "longlong-4"
+    "ulonglong-4"
+    "float-8"
+    "double-4"
 } ;
 
 ARTICLE: "math.vectors.simd.words" "SIMD vector words"
@@ -142,7 +155,12 @@ M\\ actor advance optimized."""
 """USE: compiler.tree.debugger
 
 M\\ actor advance test-mr mr.""" }
-"An example of a high-performance algorithm that uses SIMD primitives can be found in the " { $vocab-link "benchmark.nbody-simd" } " vocabulary." ;
+"Example of a high-performance algorithms that use SIMD primitives can be found in the following vocabularies:"
+{ $list
+    { $vocab-link "benchmark.nbody-simd" }
+    { $vocab-link "benchmark.raytracer-simd" }
+    { $vocab-link "random.sfmt" }
+} ;
 
 ARTICLE: "math.vectors.simd.intrinsics" "Low-level SIMD primitives"
 "The words in the " { $vocab-link "math.vectors.simd.intrinsics" } " vocabulary are used to implement SIMD support. These words have three disadvantages compared to the higher-level " { $link "math-vectors" } " words:"
index 4b432e733f38cf5083c566c5938b33405b871040..9aa7ed0d14538fa2a9b440ab06a0c92186358b66 100644 (file)
@@ -134,10 +134,10 @@ HELP: inconsistent-recursive-call-error
 } ;
 
 ARTICLE: "inference-errors" "Stack checker errors"
-"These " { $link "inference" } " failure conditions are reported in one of two ways:"
+"Stack effect checking failure conditions are reported in one of two ways:"
 { $list
-    { { $link "tools.inference" } " throws them as errors" }
-    { "The " { $link "compiler" } " reports them via " { $link "tools.errors" } }
+    { { $link "tools.inference" } " report them when fed quotations interactively" }
+    { "The " { $link "compiler" } " reports them while compiling words, via the " { $link "tools.errors" } " mechanism" }
 }
 "Errors thrown when insufficient information is available to calculate the stack effect of a call to a combinator or macro (see " { $link "inference-combinators" } "):"
 { $subsections
index fe8049e9e37c1b801cc5b3d6891a1b9f89a0d598..9d6b8d4c0805fba47028827720827351f05b7aec 100644 (file)
@@ -7,21 +7,15 @@ summary layouts vocabs.loader prettyprint.config prettyprint debugger
 io.streams.c io.files io.files.temp io.pathnames io.directories
 io.directories.hierarchy io.backend quotations io.launcher
 tools.deploy.config tools.deploy.config.editor bootstrap.image
-io.encodings.utf8 destructors accessors hashtables ;
+io.encodings.utf8 destructors accessors hashtables
+vocabs.metadata.resources ;
 IN: tools.deploy.backend
 
 : copy-vm ( executable bundle-name -- vm )
     prepend-path vm over copy-file ;
 
-CONSTANT: theme-path "basis/ui/gadgets/theme/"
-
-: copy-theme ( name dir -- )
-    deploy-ui? get [
-        append-path
-        theme-path append-path
-        [ make-directories ]
-        [ theme-path "resource:" prepend swap copy-tree ] bi
-    ] [ 2drop ] if ;
+: copy-resources ( manifest name dir -- )
+    append-path swap [ copy-vocab-resources ] with each ;
 
 : image-name ( vocab bundle-name -- str )
     prepend-path ".image" append ;
@@ -89,7 +83,7 @@ DEFER: ?make-staging-image
     [ "deploy-config-" prepend temp-file ] bi
     [ utf8 set-file-contents ] keep ;
 
-: deploy-command-line ( image vocab config -- flags )
+: deploy-command-line ( image vocab manifest-file config -- flags )
     [
         bootstrap-profile ?make-staging-image
 
@@ -97,6 +91,7 @@ DEFER: ?make-staging-image
             "-i=" bootstrap-profile staging-image-name append ,
             "-resource-path=" "" resource-path append ,
             "-run=tools.deploy.shaker" ,
+            "-vocab-manifest-out=" prepend ,
             [ "-deploy-vocab=" prepend , ]
             [ make-deploy-config "-deploy-config=" prepend , ] bi
             "-output-image=" prepend ,
@@ -104,8 +99,10 @@ DEFER: ?make-staging-image
         ] { } make
     ] bind ;
 
-: make-deploy-image ( vm image vocab config -- )
+: make-deploy-image ( vm image vocab config -- manifest )
     make-boot-image
-    deploy-command-line run-factor ;
+    over "vocab-manifest-" prepend temp-file
+    [ swap deploy-command-line run-factor ]
+    [ utf8 file-lines ] bi ;
 
 HOOK: deploy* os ( vocab -- )
old mode 100644 (file)
new mode 100755 (executable)
index 948db1c..a552bd0
@@ -7,8 +7,14 @@ ARTICLE: "prepare-deploy" "Preparing to deploy an application"
 { $subsections
     "deploy-config"
     "deploy-flags"
+    "deploy-resources"
 } ;
 
+ARTICLE: "deploy-resources" "Deployed resource files"
+"To include additional files in your deployed application, specify their names in a vocabulary's " { $snippet "resources.txt" } " file. The " { $snippet "resources.txt" } " file contains one glob pattern per line. These patterns are expanded relative to the vocabulary directory; files outside of the vocabulary directory cannot be referenced. If a file inside the vocabulary directory matches any of these patterns, it will be included in deployed applications that reference the vocabulary. If a subdirectory matches, its contents will be included recursively."
+$nl
+"If the deployed vocabulary includes an icon file for the current platform (" { $snippet "icon.ico" } " on Windows, or " { $snippet "icon.icns" } " on MacOS X), it will be embedded in the deployed application as its GUI icon." ;
+
 ARTICLE: "tools.deploy.usage" "Deploy tool usage"
 "Once the necessary deployment flags have been set, the application can be deployed:"
 { $subsections deploy }
index f76ad7a5573d285bc224a2477d3ec2a92c57eca9..4f470af20227d8b4d71b6875b25c4856a6f5c9f2 100644 (file)
@@ -24,8 +24,12 @@ IN: tools.deploy.tests
 
 [ ] [ "terrain" shake-and-bake 1700000 small-enough? ] unit-test
 
+[ ] [ "gpu.demos.raytrace" shake-and-bake 2500000 small-enough? ] unit-test
+
 [ ] [ "bunny" shake-and-bake 2500000 small-enough? ] unit-test
 
+[ ] [ "gpu.demos.bunny" shake-and-bake 3500000 small-enough? ] unit-test
+
 os macosx? [
     [ ] [ "webkit-demo" shake-and-bake 500000 small-enough? ] unit-test
 ] when
index f753e38fb2bf8c3a1e3355d37670d684d085278c..8bd3749093404b0dadf39bf64969ca4abb000e81 100644 (file)
@@ -6,7 +6,7 @@ sequences system tools.deploy.backend tools.deploy.config
 tools.deploy.config.editor assocs hashtables prettyprint
 io.backend.unix cocoa io.encodings.utf8 io.backend
 cocoa.application cocoa.classes cocoa.plists
-combinators ;
+combinators vocabs.metadata vocabs.loader ;
 IN: tools.deploy.macosx
 
 : bundle-dir ( -- dir )
@@ -16,7 +16,7 @@ IN: tools.deploy.macosx
     [ bundle-dir prepend-path swap ] keep
     "Contents" prepend-path append-path copy-tree ;
 
-: app-plist ( executable bundle-name -- assoc )
+: app-plist ( icon? executable bundle-name -- assoc )
     [
         "6.0" "CFBundleInfoDictionaryVersion" set
         "APPL" "CFBundlePackageType" set
@@ -25,9 +25,11 @@ IN: tools.deploy.macosx
 
         [ "CFBundleExecutable" set ]
         [ "org.factor." prepend "CFBundleIdentifier" set ] bi
+
+        [ "Icon.icns" "CFBundleIconFile" set ] when
     ] H{ } make-assoc ;
 
-: create-app-plist ( executable bundle-name -- )
+: create-app-plist ( icon? executable bundle-name -- )
     [ app-plist ] keep
     "Contents/Info.plist" append-path
     write-plist ;
@@ -40,17 +42,24 @@ IN: tools.deploy.macosx
         "Resources/English.lproj/MiniFactor.nib" copy-bundle-dir
     ] [ drop ] if ;
 
+: copy-icns ( vocab bundle-name -- icon? )
+    swap dup vocab-mac-icon-path vocab-append-path dup exists?
+    [ swap "Contents/Resources/Icon.icns" append-path copy-file t ]
+    [ 2drop f ] if ;
+
 : create-app-dir ( vocab bundle-name -- vm )
-    [
-        nip {
-            [ copy-dll ]
-            [ copy-nib ]
-            [ "Contents/Resources" append-path make-directories ]
-            [ "Contents/Resources" copy-theme ]
-        } cleave
-    ]
-    [ create-app-plist ]
-    [ "Contents/MacOS/" append-path copy-vm ] 2tri
+    {
+        [
+            nip {
+                [ copy-dll ]
+                [ copy-nib ]
+                [ "Contents/Resources" append-path make-directories ]
+            } cleave
+        ]
+        [ copy-icns ]
+        [ create-app-plist ]
+        [ "Contents/MacOS/" append-path copy-vm ]
+    } 2cleave
     dup OCT: 755 set-file-permissions ;
 
 : deploy.app-image ( vocab bundle-name -- str )
@@ -72,6 +81,7 @@ M: macosx deploy* ( vocab -- )
             [ bundle-name create-app-dir ] keep
             [ bundle-name deploy.app-image ] keep
             namespace make-deploy-image
+            bundle-name "Contents/Resources" copy-resources
             bundle-name show-in-finder
         ] bind
     ] with-directory ;
index 1060853343b3b0d530dc459c9c201a3018336795..d8a653c02139d927edacaf954d287a9944b153be 100755 (executable)
@@ -1,13 +1,13 @@
 ! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays accessors io.backend io.pathnames io.streams.c
-init fry namespaces math make assocs kernel parser parser.notes
-lexer strings.parser vocabs sequences sequences.deep
+USING: arrays accessors io.backend io.encodings.utf8 io.files
+io.streams.c init fry namespaces math make assocs kernel parser
+parser.notes lexer strings.parser vocabs sequences sequences.deep
 sequences.private words memory kernel.private continuations io
 vocabs.loader system strings sets vectors quotations byte-arrays
 sorting compiler.units definitions generic generic.standard
 generic.single tools.deploy.config combinators classes
-classes.builtin slots.private grouping command-line ;
+classes.builtin slots.private grouping command-line io.pathnames ;
 QUALIFIED: bootstrap.stage2
 QUALIFIED: classes.private
 QUALIFIED: compiler.crossref
@@ -466,7 +466,8 @@ SYMBOL: deploy-vocab
 
 : startup-stripper ( -- )
     t "quiet" set-global
-    f output-stream set-global ;
+    f output-stream set-global
+    V{ "resource:" } clone vocab-roots set-global ;
 
 : next-method* ( method -- quot )
     [ "method-class" word-prop ]
@@ -502,7 +503,12 @@ SYMBOL: deploy-vocab
     "Clearing megamorphic caches" show
     [ clear-megamorphic-cache ] each ;
 
-: strip ( -- )
+: write-vocab-manifest ( vocab-manifest-out -- )
+    "Writing vocabulary manifest to " write dup print flush
+    vocabs swap utf8 set-file-lines ;
+
+: strip ( vocab-manifest-out -- )
+    [ write-vocab-manifest ] when*
     startup-stripper
     strip-libc
     strip-destructors
@@ -536,7 +542,7 @@ SYMBOL: deploy-vocab
         1 exit
     ] recover ; inline
 
-: (deploy) ( final-image vocab config -- )
+: (deploy) ( final-image vocab-manifest-out vocab config -- )
     #! Does the actual work of a deployment in the slave
     #! stage2 image
     [
@@ -549,11 +555,11 @@ SYMBOL: deploy-vocab
                     "ui.debugger" require
                 ] when
             ] unless
-            deploy-vocab set
-            deploy-vocab get require
-            deploy-vocab get vocab-main [
-                "Vocabulary has no MAIN: word." print flush 1 exit
-            ] unless
+            [ deploy-vocab set ] [ require ] [
+                vocab-main [
+                    "Vocabulary has no MAIN: word." print flush 1 exit
+                ] unless
+            ] tri
             strip
             "Saving final image" show
             save-image-and-exit
@@ -562,6 +568,7 @@ SYMBOL: deploy-vocab
 
 : do-deploy ( -- )
     "output-image" get
+    "vocab-manifest-out" get
     "deploy-vocab" get
     "Deploying " write dup write "..." print
     "deploy-config" get parse-file first
index d8414baba7842956137e5ced29db9987e87b3c10..bc458dde3629789ee36b371521ac4cb75fa4b088 100644 (file)
@@ -7,7 +7,7 @@ IN: tools.deploy.test
     [ "test.image" temp-file delete-file ] ignore-errors
     "resource:" [
         [ vm "test.image" temp-file ] dip
-        dup deploy-config make-deploy-image
+        dup deploy-config make-deploy-image drop
     ] with-directory ;
 
 ERROR: image-too-big actual-size max-size ;
index f88cf06ef7fc8f48127b4e7875bfdad2f259c52a..2646f2d5a490f6d1451e1e6ed1db37efd56d6a69 100644 (file)
@@ -7,7 +7,6 @@ tools.deploy.config.editor assocs hashtables prettyprint ;
 IN: tools.deploy.unix
 
 : create-app-dir ( vocab bundle-name -- vm )
-    dup "" copy-theme
     copy-vm
     dup OCT: 755 set-file-permissions ;
 
@@ -20,6 +19,7 @@ M: unix deploy* ( vocab -- )
             [ bundle-name create-app-dir ] keep
             [ bundle-name image-name ] keep
             namespace make-deploy-image
+            bundle-name "" copy-resources
             bundle-name normalize-path [ "Binary deployed to " % % "." % ] "" make print
         ] bind
-    ] with-directory ;
\ No newline at end of file
+    ] with-directory ;
diff --git a/basis/tools/deploy/windows/ico/ico.factor b/basis/tools/deploy/windows/ico/ico.factor
new file mode 100755 (executable)
index 0000000..46610c4
--- /dev/null
@@ -0,0 +1,72 @@
+USING: accessors alien alien.c-types arrays classes.struct combinators
+io.backend kernel locals math sequences specialized-arrays
+tools.deploy.windows windows.kernel32 windows.types ;
+IN: tools.deploy.windows.ico
+
+<PRIVATE
+
+STRUCT: ico-header
+    { Reserved WORD }
+    { Type WORD }
+    { ImageCount WORD } ;
+
+STRUCT: ico-directory-entry
+    { Width        BYTE  }
+    { Height       BYTE  }
+    { Colors       BYTE  }
+    { Reserved     BYTE  }
+    { Planes       WORD  }
+    { BitsPerPixel WORD  }
+    { ImageSize    DWORD }
+    { ImageOffset  DWORD } ;
+SPECIALIZED-ARRAY: ico-directory-entry
+
+STRUCT: group-directory-entry
+    { Width        BYTE  }
+    { Height       BYTE  }
+    { Colors       BYTE  }
+    { Reserved     BYTE  }
+    { Planes       WORD  }
+    { BitsPerPixel WORD  }
+    { ImageSize    DWORD }
+    { ImageResourceID WORD } ;
+
+: ico>group-directory-entry ( ico i -- group )
+    [ {
+        [ Width>> ] [ Height>> ] [ Colors>> ] [ Reserved>> ]
+        [ Planes>> ] [ BitsPerPixel>> ] [ ImageSize>> ]
+    } cleave ] [ 1 + ] bi* group-directory-entry <struct-boa> >c-ptr ; inline
+
+: ico-icon ( directory-entry bytes -- subbytes )
+    [ [ ImageOffset>> dup ] [ ImageSize>> + ] bi ] dip subseq ; inline
+
+:: ico-group-and-icons ( bytes -- group-bytes icon-bytes )
+    bytes ico-header memory>struct :> header
+
+    ico-header heap-size bytes <displaced-alien> 
+    header ImageCount>> <direct-ico-directory-entry-array> :> directory
+
+    directory dup length iota [ ico>group-directory-entry ] { } 2map-as
+        :> group-directory
+    directory [ bytes ico-icon ] { } map-as :> icon-bytes
+
+    header clone >c-ptr group-directory concat append
+    icon-bytes ; inline
+
+PRIVATE>
+
+:: embed-icon-resource ( exe ico-bytes id -- )
+    exe normalize-path 1 BeginUpdateResource :> hUpdate
+    hUpdate [
+        ico-bytes ico-group-and-icons :> ( group icons )
+        hUpdate RT_GROUP_ICON id 0 group dup byte-length
+        UpdateResource drop
+
+        icons [| icon i |
+            hUpdate RT_ICON i 1 + MAKEINTRESOURCE 0 icon dup byte-length
+            UpdateResource drop
+        ] each-index
+
+        hUpdate 0 EndUpdateResource drop
+    ] when ;
+
diff --git a/basis/tools/deploy/windows/ico/tags.txt b/basis/tools/deploy/windows/ico/tags.txt
new file mode 100644 (file)
index 0000000..6bf6830
--- /dev/null
@@ -0,0 +1 @@
+unportable
old mode 100644 (file)
new mode 100755 (executable)
index f21f4ac..9f0b228
@@ -1,11 +1,15 @@
 ! Copyright (C) 2007, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: io io.files io.pathnames io.directories io.encodings.ascii kernel namespaces
+USING: io io.encodings.binary io.files io.pathnames io.directories
+io.encodings.ascii kernel namespaces
 sequences locals system splitting tools.deploy.backend
 tools.deploy.config tools.deploy.config.editor assocs hashtables
-prettyprint combinators windows.shell32 windows.user32 ;
+prettyprint combinators windows.kernel32 windows.shell32 windows.user32
+alien.c-types vocabs.metadata vocabs.loader tools.deploy.windows.ico ;
 IN: tools.deploy.windows
 
+CONSTANT: app-icon-resource-id "APPICON"
+
 : copy-dll ( bundle-name -- )
     "resource:factor.dll" swap copy-file-into ;
 
@@ -16,20 +20,24 @@ IN: tools.deploy.windows
 
 : create-exe-dir ( vocab bundle-name -- vm )
     dup copy-dll
-    deploy-ui? get [
-        [ "" copy-theme ] [ ".exe" copy-vm ] bi
-    ] [ ".com" copy-vm ] if ;
+    deploy-ui? get ".exe" ".com" ? copy-vm ;
+
+: embed-ico ( vm vocab -- )
+    dup vocab-windows-icon-path vocab-append-path dup exists?
+    [ binary file-contents app-icon-resource-id embed-icon-resource ]
+    [ 2drop ] if ;
 
 M: winnt deploy*
     "resource:" [
         dup deploy-config [
             deploy-name get
-            [
-                [ create-exe-dir ]
+            {
+                [ create-exe-dir dup ]
+                [ drop embed-ico ]
                 [ image-name ]
-                [ drop ]
-                2tri namespace make-deploy-image
-            ]
-            [ nip open-in-explorer ] 2bi
+                [ drop namespace make-deploy-image ]
+                [ nip "" copy-resources ]
+                [ nip open-in-explorer ]
+            } 2cleave 
         ] bind
     ] with-directory ;
index 061fd8d3643eeb095f9ad7238dfe74dcf8789aee..d0d25a063083b4e39609e5717c205ac2a0eba059 100644 (file)
@@ -5,9 +5,9 @@ colors.constants combinators combinators.short-circuit
 combinators.smart fry kernel locals math math.rectangles
 math.vectors models namespaces opengl opengl.gl quotations
 sequences strings ui.commands ui.gadgets ui.gadgets.borders
-ui.gadgets.labels ui.gadgets.packs ui.gadgets.tracks
-ui.gadgets.worlds ui.gestures ui.pens ui.pens.image
-ui.pens.solid ui.pens.tile ;
+ui.gadgets.labels ui.gadgets.packs ui.gadgets.theme
+ui.gadgets.tracks ui.gadgets.worlds ui.gestures ui.pens
+ui.pens.image ui.pens.solid ui.pens.tile ;
 FROM: models => change-model ;
 IN: ui.gadgets.buttons
 
index 7f558fca198cde63348cb8bf299440b039587f17..31b7d5db2ee999caf540ed99ecfaff9d5536703a 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel sequences namespaces ui.gadgets.frames
-ui.pens.image ui.gadgets.icons ui.gadgets.grids ;
+ui.pens.image ui.gadgets.icons ui.gadgets.grids ui.gadgets.theme ;
 IN: ui.gadgets.corners
 
 CONSTANT: @center { 1 1 }
@@ -40,4 +40,4 @@ SYMBOL: name
 
 : make-corners ( class name quot -- corners )
     [ [ [ 3 3 ] dip new-frame { 1 1 } >>filled-cell ] dip name ] dip
-    with-variable ; inline
\ No newline at end of file
+    with-variable ; inline
index dd2232df60895c1132498c7eebe9fbd6c4b334a4..1da137270aab7f0d4b6dc06b147d8c02cf10462c 100644 (file)
@@ -3,7 +3,7 @@
 USING: accessors kernel delegate fry sequences models
 combinators.short-circuit models.search models.delay calendar locals
 ui.gestures ui.pens ui.pens.image ui.gadgets.editors ui.gadgets.labels
-ui.gadgets.scrollers ui.gadgets.tables ui.gadgets.tracks
+ui.gadgets.scrollers ui.gadgets.tables ui.gadgets.theme ui.gadgets.tracks
 ui.gadgets.borders ui.gadgets.buttons ui.baseline-alignment ui.gadgets ;
 IN: ui.gadgets.search-tables
 
@@ -78,4 +78,4 @@ CONSULT: table-protocol search-table table>> ;
 M: search-table model-changed
     nip field>> clear-search-field ;
 
-M: search-table focusable-child* field>> ;
\ No newline at end of file
+M: search-table focusable-child* field>> ;
index b98a0d152e9c00566f0ad285ce7e3f06d7f346e0..6851ff4be76b9154466a8459d381aa66526ca875 100644 (file)
@@ -4,7 +4,7 @@ USING: accessors arrays assocs kernel math namespaces sequences
 vectors models models.range math.vectors math.functions quotations
 colors colors.constants math.rectangles fry combinators ui.gestures
 ui.pens ui.gadgets ui.gadgets.buttons ui.gadgets.tracks math.order
-ui.gadgets.icons ui.pens.tile ui.pens.image ;
+ui.gadgets.icons ui.gadgets.theme ui.pens.tile ui.pens.image ;
 IN: ui.gadgets.sliders
 
 TUPLE: slider < track elevator thumb saved line ;
index 23881103a9430d1d0b38e5dee9f9f129182276be..77ddb902702bbe42f43847418a8badaf62b5a08d 100644 (file)
@@ -2,8 +2,9 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: ui.pens ui.gadgets.tracks ui.gadgets.buttons
 ui.gadgets.buttons.private ui.gadgets.books ui.gadgets.packs
-ui.gadgets.borders ui.gadgets.icons ui.gadgets ui.pens.image
-sequences models accessors kernel colors colors.constants ;
+ui.gadgets.borders ui.gadgets.icons ui.gadgets ui.gadgets.theme
+ui.pens.image sequences models accessors kernel colors
+colors.constants ;
 IN: ui.gadgets.tabbed
 
 TUPLE: tabbed-gadget < track tabs book ;
index 1901f27a24507e2512d93a1f956aaaa0d2f05714..580f882c8d78327fd1fc737a4da0624407fe0e7a 100644 (file)
@@ -1 +1,2 @@
 Slava Pestov
+Joe Groff
diff --git a/basis/ui/gadgets/theme/resources.txt b/basis/ui/gadgets/theme/resources.txt
new file mode 100644 (file)
index 0000000..72238b4
--- /dev/null
@@ -0,0 +1 @@
+*.tiff
diff --git a/basis/ui/gadgets/theme/theme.factor b/basis/ui/gadgets/theme/theme.factor
new file mode 100644 (file)
index 0000000..ab10999
--- /dev/null
@@ -0,0 +1,6 @@
+! (c)2009, 2010 Slava Pestov, Joe Groff bsd license
+USING: io.pathnames sequences ui.images ;
+IN: ui.gadgets.theme
+
+: theme-image ( name -- image-name )
+    "vocab:ui/gadgets/theme/" prepend-path ".tiff" append <image-name> ;
index da253f8b0cae24d29b3a2e1579b3b1be852f74fc..be37e6e129ba480bb486dc80261a7ac7645f4a67 100644 (file)
@@ -18,5 +18,3 @@ M: image-pen draw-interior
 
 M: image-pen pen-pref-dim nip image>> image-dim ;
 
-: theme-image ( name -- image-name )
-    "vocab:ui/gadgets/theme/" prepend-path ".tiff" append <image-name> ;
\ No newline at end of file
index 66041e249ce4c5818c094cde7fcb1bda2e7f41d7..95c8083e0f81eebb61ec53bd8baa6df050e32095 100644 (file)
@@ -18,6 +18,11 @@ ARTICLE: "vocabs.metadata" "Vocabulary metadata"
     set-vocab-tags
     add-vocab-tags
 }
+"Vocabulary resources:"
+{ $subsections
+    vocab-resources
+    set-vocab-resources
+}
 "Getting and setting arbitrary vocabulary metadata:"
 { $subsections
     vocab-file-contents
@@ -50,3 +55,11 @@ HELP: set-vocab-tags
 { $values { "tags" "a sequence of strings" } { "vocab" "a vocabulary specifier" } }
 { $description "Stores a list of short tags classifying the vocabulary to the " { $snippet "tags.txt" } " file in the vocabulary's directory." } ;
 
+HELP: vocab-resources
+{ $values { "vocab" "a vocabulary specifier" } { "patterns" "a sequence of glob patterns" } }
+{ $description "Outputs a list of glob patterns matching files that will be deployed with an application that includes " { $snippet "vocab" } ", as specified by the " { $snippet "resources.txt" } " file in the vocabulary's directory. Outputs an empty array if the file doesn't exist." }
+{ $notes "The " { $vocab-link "vocabs.metadata.resources" } " vocabulary contains words that will expand the glob patterns and directory names in " { $snippet "patterns" } " and return all the matching files." } ;
+
+HELP: set-vocab-resources
+{ $values { "patterns" "a sequence of glob patterns" } { "vocab" "a vocabulary specifier" } }
+{ $description "Stores a list of glob patterns matching files that will be deployed with an application that includes " { $snippet "vocab" } " to the " { $snippet "resources.txt" } " file in the vocabulary's directory." } ;
index 85a503c7f05d33d01178fe7790364f0bcdd2c06f..04a0ea7546c0945e5f1f2ab89767b0cb02eecf40 100644 (file)
@@ -19,6 +19,21 @@ MEMO: vocab-file-contents ( vocab name -- seq )
         3append throw
     ] ?if ;
 
+: vocab-windows-icon-path ( vocab -- string )
+    vocab-dir "icon.ico" append-path ;
+
+: vocab-mac-icon-path ( vocab -- string )
+    vocab-dir "icon.icns" append-path ;
+
+: vocab-resources-path ( vocab -- string )
+    vocab-dir "resources.txt" append-path ;
+
+: vocab-resources ( vocab -- patterns )
+    dup vocab-resources-path vocab-file-contents harvest ;
+
+: set-vocab-resources ( patterns vocab -- )
+    dup vocab-resources-path set-vocab-file-contents ;
+
 : vocab-summary-path ( vocab -- string )
     vocab-dir "summary.txt" append-path ;
 
@@ -67,4 +82,4 @@ M: vocab-link summary vocab-summary ;
     dup vocab-authors-path set-vocab-file-contents ;
 
 : unportable? ( vocab -- ? )
-    vocab-tags "unportable" swap member? ;
\ No newline at end of file
+    vocab-tags "unportable" swap member? ;
diff --git a/basis/vocabs/metadata/resources/resources-docs.factor b/basis/vocabs/metadata/resources/resources-docs.factor
new file mode 100644 (file)
index 0000000..a20775e
--- /dev/null
@@ -0,0 +1,26 @@
+! (c)2010 Joe Groff bsd license
+USING: help.markup help.syntax kernel ;
+IN: vocabs.metadata.resources
+
+HELP: expand-vocab-resource-files
+{ $values
+    { "vocab" "a vocabulary specifier" } { "resource-glob-strings" "a sequence of glob patterns" }
+    { "filenames" "a sequence of filenames" }
+}
+{ $description "Matches all the glob patterns in " { $snippet "resource-glob-strings" } " to the set of files inside " { $snippet "vocab" } "'s directory and outputs a sequence containing the individual files and directories that match. Any matching directories will also have their contents recursively included in the output. The paths in the output will be relative to " { $snippet "vocab" } "'s directory." } ;
+
+HELP: vocab-resource-files
+{ $values
+    { "vocab" "a vocabulary specifier" }
+    { "filenames" "a sequence of filenames" }
+}
+{ $description "Outputs a sequence containing the individual resource files and directories that match the patterns specified in " { $snippet "vocab" } "'s " { $snippet "resources.txt" } " file. Any matching directories will also have their contents recursively included in the output. The paths in the output will be relative to " { $snippet "vocab" } "'s directory." } ;
+
+ARTICLE: "vocabs.metadata.resources" "Vocabulary resource metadata"
+"The " { $vocab-link "vocabs.metadata.resources" } " vocabulary contains words to retrieve the full list of files that match the patterns specified in a vocabulary's " { $snippet "resources.txt" } " file."
+{ $subsections
+    vocab-resource-files
+    expand-vocab-resource-files
+} ;
+
+ABOUT: "vocabs.metadata.resources"
diff --git a/basis/vocabs/metadata/resources/resources-tests.factor b/basis/vocabs/metadata/resources/resources-tests.factor
new file mode 100644 (file)
index 0000000..36fd131
--- /dev/null
@@ -0,0 +1,19 @@
+! (c)2010 Joe Groff bsd license
+USING: sorting tools.test vocabs.metadata.resources ;
+IN: vocabs.metadata.resources.tests
+
+[ { "bar" "bas" "foo" } ]
+[ "vocabs.metadata.resources.test.1" vocab-resource-files natural-sort ] unit-test
+
+[ { "bar.wtf" "foo.wtf" } ]
+[ "vocabs.metadata.resources.test.2" vocab-resource-files natural-sort ] unit-test
+
+[ {
+    "resource-dir"
+    "resource-dir/bar"
+    "resource-dir/bas"
+    "resource-dir/bas/zang"
+    "resource-dir/bas/zim"
+    "resource-dir/buh"
+    "resource-dir/foo"
+} ] [ "vocabs.metadata.resources.test.3" vocab-resource-files natural-sort ] unit-test
diff --git a/basis/vocabs/metadata/resources/resources.factor b/basis/vocabs/metadata/resources/resources.factor
new file mode 100644 (file)
index 0000000..d8f9bdc
--- /dev/null
@@ -0,0 +1,45 @@
+! (c)2010 Joe Groff bsd license
+USING: arrays fry globs io.directories io.files.info
+io.pathnames kernel regexp sequences vocabs.loader
+vocabs.metadata ;
+IN: vocabs.metadata.resources
+
+<PRIVATE
+
+: (expand-vocab-resource) ( resource-path -- filenames )
+    dup file-info directory?
+    [ dup '[ _ directory-tree-files [ append-path ] with map ] [ prefix ] bi ]
+    [ 1array ] if ;
+
+: filter-resources ( vocab-files resource-globs -- resource-files ) 
+    '[ _ [ matches? ] with any? ] filter ;
+
+: copy-vocab-resource ( to from file -- )
+    [ append-path ] curry bi@
+    dup file-info directory?
+    [ drop make-directories ]
+    [ swap [ parent-directory make-directories ] [ copy-file ] bi ] if ;
+    
+PRIVATE>
+
+: vocab-dir-in-root ( vocab -- dir )
+    [ find-vocab-root ] [ vocab-dir ] bi append-path ;
+
+: expand-vocab-resource-files ( vocab resource-glob-strings -- filenames )
+    [ vocab-dir-in-root ] dip [ <glob> ] map '[
+        _ filter-resources
+        [ (expand-vocab-resource) ] map concat
+    ] with-directory-tree-files ;
+
+: vocab-resource-files ( vocab -- filenames )
+    dup vocab-resources
+    [ drop f ] [ expand-vocab-resource-files ] if-empty ;
+
+: copy-vocab-resources ( dir vocab -- )
+    dup vocab-resource-files 
+    [ 2drop ] [
+        [ [ vocab-dir append-path ] [ vocab-dir-in-root ] bi ] dip
+        [ 2drop make-directories ]
+        [ [ copy-vocab-resource ] with with each ] 3bi
+    ] if-empty ;
+
diff --git a/basis/vocabs/metadata/resources/test/1/1.factor b/basis/vocabs/metadata/resources/test/1/1.factor
new file mode 100644 (file)
index 0000000..dddc0dd
--- /dev/null
@@ -0,0 +1,6 @@
+USING: io kernel ;
+IN: vocabs.metadata.resources.test.1
+
+: main ( -- ) "Resources test 1" print ;
+
+MAIN: main
diff --git a/basis/vocabs/metadata/resources/test/1/bar b/basis/vocabs/metadata/resources/test/1/bar
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/1/bas b/basis/vocabs/metadata/resources/test/1/bas
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/1/foo b/basis/vocabs/metadata/resources/test/1/foo
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/1/resources.txt b/basis/vocabs/metadata/resources/test/1/resources.txt
new file mode 100644 (file)
index 0000000..ce0f4c9
--- /dev/null
@@ -0,0 +1,3 @@
+foo
+bar
+bas
diff --git a/basis/vocabs/metadata/resources/test/2/2.factor b/basis/vocabs/metadata/resources/test/2/2.factor
new file mode 100644 (file)
index 0000000..82a5a11
--- /dev/null
@@ -0,0 +1,6 @@
+USING: io kernel ;
+IN: vocabs.metadata.resources.test.2
+
+: main ( -- ) "Resources test 2" print ;
+
+MAIN: main
diff --git a/basis/vocabs/metadata/resources/test/2/bar.wtf b/basis/vocabs/metadata/resources/test/2/bar.wtf
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/2/bas.ftw b/basis/vocabs/metadata/resources/test/2/bas.ftw
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/2/foo.wtf b/basis/vocabs/metadata/resources/test/2/foo.wtf
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/2/no-resources-here/zim.wtf b/basis/vocabs/metadata/resources/test/2/no-resources-here/zim.wtf
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/2/resources.txt b/basis/vocabs/metadata/resources/test/2/resources.txt
new file mode 100644 (file)
index 0000000..8dfd81c
--- /dev/null
@@ -0,0 +1 @@
+*.wtf
diff --git a/basis/vocabs/metadata/resources/test/3/3.factor b/basis/vocabs/metadata/resources/test/3/3.factor
new file mode 100644 (file)
index 0000000..a81fd70
--- /dev/null
@@ -0,0 +1,6 @@
+USING: io kernel ;
+IN: vocabs.metadata.resources.test.3
+
+: main ( -- ) "Resources test 3" print ;
+
+MAIN: main
diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bar b/basis/vocabs/metadata/resources/test/3/resource-dir/bar
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zang b/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zang
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zim b/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zim
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/foo b/basis/vocabs/metadata/resources/test/3/resource-dir/foo
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/basis/vocabs/metadata/resources/test/3/resources.txt b/basis/vocabs/metadata/resources/test/3/resources.txt
new file mode 100644 (file)
index 0000000..c27d538
--- /dev/null
@@ -0,0 +1 @@
+resource-dir
index 2320bdd64800598d4f0633f3441065dc20e4018f..86dd9eeb911c05e4fb9ec4df73340bba66a0c33b 100755 (executable)
@@ -1,2 +1,3 @@
 unportable
 bindings
+ffi
index 80f50ef2b08f50c9ace1346c3e5386354d2a53f6..576fac3a0692334d4e213585a7065788f9b4cef9 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2006 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien alien.c-types alien.syntax kernel windows.types
-multiline classes.struct ;
+math multiline classes.struct ;
 IN: windows.kernel32
 
 CONSTANT: MAX_PATH 260
@@ -787,6 +787,30 @@ CONSTANT: STATUS_CONTROL_C_EXIT             HEX: C000013A
 CONSTANT: STATUS_FLOAT_MULTIPLE_FAULTS      HEX: C00002B4
 CONSTANT: STATUS_FLOAT_MULTIPLE_TRAPS       HEX: C00002B5
 
+! Resource IDs
+: MAKEINTRESOURCE ( int -- resource ) HEX: ffff bitand <alien> ; inline
+
+: RT_CURSOR       ( -- id )  1 MAKEINTRESOURCE ; inline
+: RT_BITMAP       ( -- id )  2 MAKEINTRESOURCE ; inline
+: RT_ICON         ( -- id )  3 MAKEINTRESOURCE ; inline
+: RT_MENU         ( -- id )  4 MAKEINTRESOURCE ; inline
+: RT_DIALOG       ( -- id )  5 MAKEINTRESOURCE ; inline
+: RT_STRING       ( -- id )  6 MAKEINTRESOURCE ; inline
+: RT_FONTDIR      ( -- id )  7 MAKEINTRESOURCE ; inline
+: RT_FONT         ( -- id )  8 MAKEINTRESOURCE ; inline
+: RT_ACCELERATOR  ( -- id )  9 MAKEINTRESOURCE ; inline
+: RT_RCDATA       ( -- id ) 10 MAKEINTRESOURCE ; inline
+: RT_MESSAGETABLE ( -- id ) 11 MAKEINTRESOURCE ; inline
+: RT_GROUP_CURSOR ( -- id ) 12 MAKEINTRESOURCE ; inline
+: RT_GROUP_ICON   ( -- id ) 14 MAKEINTRESOURCE ; inline
+: RT_VERSION      ( -- id ) 16 MAKEINTRESOURCE ; inline
+: RT_DLGINCLUDE   ( -- id ) 17 MAKEINTRESOURCE ; inline
+: RT_PLUGPLAY     ( -- id ) 19 MAKEINTRESOURCE ; inline
+: RT_VXD          ( -- id ) 20 MAKEINTRESOURCE ; inline
+: RT_ANICURSOR    ( -- id ) 21 MAKEINTRESOURCE ; inline
+: RT_ANIICON      ( -- id ) 22 MAKEINTRESOURCE ; inline
+: RT_MANIFEST     ( -- id ) 24 MAKEINTRESOURCE ; inline
+
 LIBRARY: kernel32
 ! FUNCTION: _hread
 ! FUNCTION: _hwrite
@@ -826,7 +850,8 @@ FUNCTION: BOOL AllocConsole ( ) ;
 ! FUNCTION: BaseUpdateAppcompatCache
 ! FUNCTION: Beep
 ! FUNCTION: BeginUpdateResourceA
-! FUNCTION: BeginUpdateResourceW
+FUNCTION: HANDLE BeginUpdateResourceW ( LPCTSTR pFileName, BOOL bDeleteExistingResources ) ;
+ALIAS: BeginUpdateResource BeginUpdateResourceW
 ! FUNCTION: BindIoCompletionCallback
 ! FUNCTION: BuildCommDCBA
 ! FUNCTION: BuildCommDCBAndTimeoutsA
@@ -1013,7 +1038,8 @@ CONSTANT: DUPLICATE_SAME_ACCESS 2
 ! FUNCTION: EncodePointer
 ! FUNCTION: EncodeSystemPointer
 ! FUNCTION: EndUpdateResourceA
-! FUNCTION: EndUpdateResourceW
+FUNCTION: BOOL EndUpdateResourceW ( HANDLE hUpdate, BOOL fDiscard ) ;
+ALIAS: EndUpdateResource EndUpdateResourceW
 ! FUNCTION: EnterCriticalSection
 ! FUNCTION: EnumCalendarInfoA
 ! FUNCTION: EnumCalendarInfoExA
@@ -1831,7 +1857,8 @@ FUNCTION: BOOL UnmapViewOfFile ( LPCVOID lpBaseAddress ) ;
 ! FUNCTION: UnregisterWait
 ! FUNCTION: UnregisterWaitEx
 ! FUNCTION: UpdateResourceA
-! FUNCTION: UpdateResourceW
+FUNCTION: BOOL UpdateResourceW ( HANDLE hUpdate, LPCTSTR lpType, LPCTSTR lpName, WORD wLanguage, LPVOID lpData, DWORD cbData ) ;
+ALIAS: UpdateResource UpdateResourceW
 ! FUNCTION: UTRegister
 ! FUNCTION: UTUnRegister
 ! FUNCTION: ValidateLCType
index 86a7c8e637fced6690f944c4b275c3f714e48ee3..7ea420feed71f90939ba08f699c07dcaa3b3d6a5 100644 (file)
@@ -1 +1,2 @@
 compiler
+ffi
index 02114496f45303182d4852bdc7a31ac2d502191a..31183a629e2f2540ef455257f2664064c2bc089a 100644 (file)
@@ -176,15 +176,15 @@ ARTICLE: "conditionals" "Conditional combinators"
 { $subsections "conditionals-boolean-equivalence" }
 { $see-also "booleans" "bitwise-arithmetic" both? either? } ;
 
-ARTICLE: "dataflow-combinators" "Data flow combinators"
-"Data flow combinators express common dataflow patterns such as performing a operation while preserving its inputs, applying multiple operations to a single value, applying a set of operations to a set of values, or applying a single operation to multiple values."
+ARTICLE: "dataflow-combinators" "Dataflow combinators"
+"Dataflow combinators express common dataflow patterns such as performing a operation while preserving its inputs, applying multiple operations to a single value, applying a set of operations to a set of values, or applying a single operation to multiple values."
 { $subsections
     "dip-keep-combinators"
     "cleave-combinators"
     "spread-combinators"
     "apply-combinators"
 }
-"More intricate data flow can be constructed by composing " { $link "curried-dataflow" } "." ;
+"More intricate dataflow can be constructed by composing " { $link "curried-dataflow" } "." ;
 
 ARTICLE: "combinators-quot" "Quotation construction utilities"
 "Some words for creating quotations which can be useful for implementing method combinations and compiler transforms:"
index 819b5b2115057c4c9a2302b1c82d42fe5e02ca38..02dadb323cea8f1239c4aad05f09973235b2a1f0 100644 (file)
@@ -1416,9 +1416,7 @@ $nl
 ARTICLE: "sequences-integers" "Counted loops"
 "A virtual sequence is defined for iterating over integers from zero."
 { $subsection iota }
-"For example, calling " { $link iota } " on the integer 3 produces a sequence containing the elements 0, 1, and 2. This is very useful for performing counted loops."
-$nl
-"This means the " { $link each } " combinator, given an integer, simply calls a quotation that number of times, pushing a counter on each iteration that ranges from 0 up to that integer:"
+"For example, calling " { $link iota } " on the integer 3 produces a sequence containing the elements 0, 1, and 2. This is very useful for performing counted loops using words such as " { $link each } ":"
 { $example "3 iota [ . ] each" "0\n1\n2" }
 "A common idiom is to iterate over a sequence, while also maintaining a loop counter. This can be done using " { $link each-index } ", " { $link map-index } " and " { $link reduce-index } "."
 $nl
old mode 100644 (file)
new mode 100755 (executable)
index 7d00cbe..ce4a319
@@ -45,12 +45,15 @@ $nl
     { { $snippet "foo/bar/bar-docs.factor" } " - documentation, see " { $link "writing-help" } }
     { { $snippet "foo/bar/bar-tests.factor" } " - unit tests, see " { $link "tools.test" } }
 }
-"Finally, optional three text files may contain meta-data:"
+"Finally, four optional text files may contain metadata:"
 { $list
-    { { $snippet "foo/bar/authors.txt" } " - a series of lines, with one author name per line. These are listed under " { $link "vocab-authors" } }
-    { { $snippet "foo/bar/summary.txt" } " - a one-line description" }
-    { { $snippet "foo/bar/tags.txt" } " - a whitespace-separated list of tags which classify the vocabulary. Consult " { $link "vocab-tags" } " for a list of existing tags you can re-use" }
+    { { $snippet "foo/bar/authors.txt" } " - a series of lines, with one author name per line. These are listed under " { $link "vocab-authors" } "." }
+    { { $snippet "foo/bar/resources.txt" } " - a series of lines with one file glob pattern per line. Files inside the vocabulary directory whose names match any of these glob patterns will be included with the compiled application as " { $link "deploy-resources" } "." }
+    { { $snippet "foo/bar/summary.txt" } " - a one-line description." }
+    { { $snippet "foo/bar/tags.txt" } " - a whitespace-separated list of tags which classify the vocabulary. Consult " { $link "vocab-tags" } " for a list of existing tags you can reuse." }
 }
+"An icon file representing the vocabulary can also be provided. A file named " { $snippet "icon.ico" } " will be used as the application icon when the application is deployed on Windows. A file named " { $snippet "icon.icns" } " will be used when the application is deployed on MacOS X."
+$nl
 "The " { $link POSTPONE: USE: } " and " { $link POSTPONE: USING: } " words load vocabularies which have not been loaded yet, as needed."
 $nl
 "Vocabularies can also be loaded at run time, without altering the vocabulary search path. This is done by calling a word which loads a vocabulary if it is not in the image, doing nothing if it is:"
index 278296de5e5292f818ef8d10875b1ec07eaccce9..ef1aab0d0e80e39c69ee151fac63f9fc11f1f70d 100644 (file)
@@ -1,2 +1 @@
-comments
-annotation
+tools
index a450790ec625119d90379172d9346511ef4941b3..f5844a60d0acbfcd1eedb180a2e164d4bbe067c3 100644 (file)
@@ -24,5 +24,5 @@ ERROR: invalid-audio-file ;
     } case ;
 
 : check-chunk ( chunk id class -- ? )
-    heap-size [ id= ] [ [ length ] dip >= ] bi-curry* bi and ;
+    heap-size [ id= ] [ [ length ] dip >= ] bi-curry* bi and ; inline
 
index 987d3d15077a989892d4a8cabe5e59d654fce4c1..bee94d302a1a5bb8c00322feeaaf0b4e0417bdb9 100644 (file)
@@ -3,8 +3,8 @@ USING: accessors alien.c-types arrays classes.struct combinators
 combinators.short-circuit game.loop game.worlds gpu gpu.buffers
 gpu.util.wasd gpu.framebuffers gpu.render gpu.shaders gpu.state
 gpu.textures gpu.util grouping http.client images images.loader
-io io.encodings.ascii io.files io.files.temp kernel locals math
-math.matrices math.vectors.simd math.parser math.vectors
+images.tiff io io.encodings.ascii io.files io.files.temp kernel
+locals math math.matrices math.vectors.simd math.parser math.vectors
 method-chains namespaces sequences splitting threads ui ui.gadgets
 ui.gadgets.worlds ui.pixel-formats specialized-arrays
 specialized-vectors literals ;
index fe80da122e73b933d6ad653d38bc746470a1a28b..1289caadb6dfb574184dbd85de958f1594b381ec 100644 (file)
@@ -1,14 +1,14 @@
 USING: tools.deploy.config ;
 H{
-    { deploy-name "gpu.demos.bunny" }
-    { deploy-word-defs? f }
-    { deploy-io 3 }
+    { deploy-name "Bunny" }
+    { deploy-ui? t }
+    { deploy-c-types? f }
+    { deploy-unicode? f }
     { "stop-after-last-window?" t }
-    { deploy-math? t }
+    { deploy-io 3 }
+    { deploy-reflection 2 }
     { deploy-word-props? f }
+    { deploy-math? t }
     { deploy-threads? t }
-    { deploy-c-types? f }
-    { deploy-reflection 2 }
-    { deploy-unicode? f }
-    { deploy-ui? t }
+    { deploy-word-defs? f }
 }
diff --git a/extra/gpu/demos/bunny/icon.icns b/extra/gpu/demos/bunny/icon.icns
new file mode 100644 (file)
index 0000000..ef7ed0a
Binary files /dev/null and b/extra/gpu/demos/bunny/icon.icns differ
diff --git a/extra/gpu/demos/bunny/icon.ico b/extra/gpu/demos/bunny/icon.ico
new file mode 100644 (file)
index 0000000..0fd376b
Binary files /dev/null and b/extra/gpu/demos/bunny/icon.ico differ
diff --git a/extra/gpu/demos/bunny/resources.txt b/extra/gpu/demos/bunny/resources.txt
new file mode 100644 (file)
index 0000000..7aa9238
--- /dev/null
@@ -0,0 +1 @@
+loading.tiff
diff --git a/extra/gpu/demos/bunny/tags.txt b/extra/gpu/demos/bunny/tags.txt
new file mode 100644 (file)
index 0000000..cb5fc20
--- /dev/null
@@ -0,0 +1 @@
+demos
diff --git a/extra/gpu/demos/raytrace/deploy.factor b/extra/gpu/demos/raytrace/deploy.factor
new file mode 100644 (file)
index 0000000..b01a64c
--- /dev/null
@@ -0,0 +1,14 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-name "Raytrace" }
+    { deploy-ui? t }
+    { deploy-c-types? f }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-io 2 }
+    { deploy-reflection 2 }
+    { deploy-word-props? f }
+    { deploy-math? t }
+    { deploy-threads? t }
+    { deploy-word-defs? f }
+}
diff --git a/extra/gpu/demos/raytrace/icon.icns b/extra/gpu/demos/raytrace/icon.icns
new file mode 100644 (file)
index 0000000..3828803
Binary files /dev/null and b/extra/gpu/demos/raytrace/icon.icns differ
diff --git a/extra/gpu/demos/raytrace/icon.ico b/extra/gpu/demos/raytrace/icon.ico
new file mode 100644 (file)
index 0000000..806fe33
Binary files /dev/null and b/extra/gpu/demos/raytrace/icon.ico differ
diff --git a/extra/gpu/demos/raytrace/resources.txt b/extra/gpu/demos/raytrace/resources.txt
new file mode 100644 (file)
index 0000000..24d3bb9
--- /dev/null
@@ -0,0 +1,4 @@
+green-ball.aiff
+mirror-ball.aiff
+red-ball.aiff
+yellow-ball.aiff
diff --git a/extra/gpu/demos/raytrace/tags.txt b/extra/gpu/demos/raytrace/tags.txt
new file mode 100644 (file)
index 0000000..cb5fc20
--- /dev/null
@@ -0,0 +1 @@
+demos
index ffac0bc29b28d8bf7d4f59073686c3437e75fb79..09906d623a32edfe0c4134bc941fa1700c37474d 100644 (file)
@@ -335,12 +335,16 @@ HELP: compressed-texture-format
 { { $link DXT1-RGBA } }
 { { $link DXT3 } }
 { { $link DXT5 } }
+{ { $link LATC1 } }
+{ { $link LATC1-SIGNED } }
+{ { $link LATC2 } }
+{ { $link LATC2-SIGNED } }
 { { $link RGTC1 } }
 { { $link RGTC1-SIGNED } }
 { { $link RGTC2 } }
 { { $link RGTC2-SIGNED } }
 } }
-{ $notes "The " { $snippet "DXT1" } " formats require either the " { $snippet "GL_EXT_texture_compression_s3tc" } " or " { $snippet "GL_EXT_texture_compression_dxt1" } " extension. The other " { $snippet "DXT" } " formats require the " { $snippet "GL_EXT_texture_compression_s3tc" } " extension. The " { $snippet "RGTC" } " formats require OpenGL 3.0 or later or the " { $snippet "GL_EXT_texture_compression_rgtc" } " extension." } ;
+{ $notes "The " { $snippet "DXT1" } " formats require either the " { $snippet "GL_EXT_texture_compression_s3tc" } " or " { $snippet "GL_EXT_texture_compression_dxt1" } " extension. The other " { $snippet "DXT" } " formats require the " { $snippet "GL_EXT_texture_compression_s3tc" } " extension. The " { $snippet "LATC" } " formats require the " { $snippet "GL_EXT_texture_compression_latc" } " extension. The " { $snippet "RGTC" } " formats require OpenGL 3.0 or later or the " { $snippet "GL_EXT_texture_compression_rgtc" } " extension." } ;
 
 HELP: compressed-texture-data
 { $class-description { $snippet "compressed-texture-data" } " tuples are used to feed compressed texture data to " { $link allocate-compressed-texture } " and " { $link update-compressed-texture } "."
index e1afc20f8840c6992575237a3e9d8198c3292592..132e4303e7bb88ff1b111743fb938592dc668fc2 100644 (file)
@@ -51,6 +51,7 @@ UNION: ?float-array float-array POSTPONE: f ;
 
 VARIANT: compressed-texture-format
     DXT1-RGB DXT1-RGBA DXT3 DXT5
+    LATC1 LATC1-SIGNED LATC2 LATC2-SIGNED
     RGTC1 RGTC1-SIGNED RGTC2 RGTC2-SIGNED ;
 
 TUPLE: compressed-texture-data
index 0cf061a2520ae13ffb4950a1bfbedc2eee8bb0bd..65e8f3eddbe7ed0e2caf2bdf5f81d89ff31b783f 100644 (file)
@@ -1,3 +1,2 @@
 xml
 graphics
-svg
diff --git a/extra/terrain/tags.txt b/extra/terrain/tags.txt
new file mode 100644 (file)
index 0000000..cb5fc20
--- /dev/null
@@ -0,0 +1 @@
+demos
index fb6cea7147a1e0cc87d314c576362caa3b76dbdc..42d711b32ba66957d114e76b2aedcc5a59c9c58a 100644 (file)
@@ -1,2 +1 @@
 collections
-trees
index fb6cea7147a1e0cc87d314c576362caa3b76dbdc..42d711b32ba66957d114e76b2aedcc5a59c9c58a 100644 (file)
@@ -1,2 +1 @@
 collections
-trees
index 587fb228f32e7bf4dab53905babfeeb79bd89d82..8dfb43b5786ab0a1ce52d0d84ce046990ee21fe4 100644 (file)
@@ -1,4 +1,4 @@
 tools
 applications
 demos
-networking
+network
index 1b93c9eb4dadb94c6c52fc88c7e22f5ed41ce8ad..14d6b62728d46b32878a2579320c8aca6747c5b9 100644 (file)
@@ -1 +1,2 @@
-webapp
+web
+examples
index fd4fb7515f306403b17ec700ba53045d0dd95da4..92a4942fe65563ff79476e20a288895dc71d353c 100644 (file)
@@ -98,7 +98,7 @@ SYMBOL: dh-file
         <login-config> <factor-boilerplate> test-db <alloy> "concatenative.org" add-responder
         <pastebin> <login-config> <factor-boilerplate> test-db <alloy> "paste.factorcode.org" add-responder
         <planet> <login-config> <factor-boilerplate> test-db <alloy> "planet.factorcode.org" add-responder
-        <mason-app> <login-config> "builds.factorcode.org" add-responder
+        <mason-app> <login-config> test-db <alloy> "builds.factorcode.org" add-responder
         home "docs" append-path <help-webapp> "docs.factorcode.org" add-responder
         home "cgi" append-path <gitweb> "gitweb.factorcode.org" add-responder
     main-responder set-global ;
index 47f899fef6d5a28e7300e2b206cc42d5f9d438d4..a36ef297f187ddad484b3a1997b74ba51cf5decf 100644 (file)
@@ -1,2 +1,2 @@
-fraptor ICON "misc/icons/Factor.ico"
+APPICON ICON "misc/icons/Factor.ico"