From 035ba3bc93b6986e7de946174f67877dc34e2862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Thu, 22 Jul 2010 12:39:16 +0200 Subject: [PATCH] ui.backend.gtk, tools.deploy.unix: support for icons --- basis/glib/ffi/ffi.factor | 18 ++++++++++++++-- basis/images/gtk/gtk.factor | 15 ------------- basis/tools/deploy/unix/unix.factor | 23 +++++++++++++------- basis/ui/backend/gtk/gtk.factor | 29 +++++++++++++++++++------- basis/ui/backend/gtk/icon.ico | Bin 0 -> 15086 bytes core/vocabs/loader/loader-docs.factor | 2 +- 6 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 basis/ui/backend/gtk/icon.ico diff --git a/basis/glib/ffi/ffi.factor b/basis/glib/ffi/ffi.factor index 7724cf5698..a0dc3a3fdb 100644 --- a/basis/glib/ffi/ffi.factor +++ b/basis/glib/ffi/ffi.factor @@ -1,8 +1,8 @@ ! Copyright (C) 2009 Anton Gorenko. ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien alien.c-types alien.destructors -alien.libraries alien.syntax combinators compiler.units gir -kernel system vocabs.parser words ; +alien.libraries alien.strings alien.syntax combinators gir +io.encodings.utf8 kernel system vocabs.parser words ; IN: glib.ffi << @@ -78,3 +78,17 @@ CALLBACK: gboolean GSourceFuncsPrepareFunc ( GSource* source, gint* timeout_ ) ; CALLBACK: gboolean GSourceFuncsCheckFunc ( GSource* source ) ; CALLBACK: gboolean GSourceFuncsDispatchFunc ( GSource* source, GSourceFunc callback, gpointer user_data ) ; +ERROR: g-error domain code message ; + +: GError>g-error ( GError -- g-error ) + [ domain>> g_quark_to_string utf8 alien>string ] + [ code>> ] + [ message>> utf8 alien>string ] tri + \ g-error boa ; + +: handle-GError ( GError/f -- ) + [ + [ GError>g-error ] + [ g_error_free ] bi + throw + ] when* ; diff --git a/basis/images/gtk/gtk.factor b/basis/images/gtk/gtk.factor index 9b50bf6a62..e08ac996ad 100644 --- a/basis/images/gtk/gtk.factor +++ b/basis/images/gtk/gtk.factor @@ -18,27 +18,12 @@ SINGLETON: gtk-image "bmp" gtk-image register-image-class "ico" gtk-image register-image-class -ERROR: g-error domain code message ; - GInputStream ( data -- GInputStream ) [ malloc-byte-array &free ] [ length ] bi f g_memory_input_stream_new_from_data &g_object_unref ; -: GError>g-error ( GError -- g-error ) - [ domain>> g_quark_to_string utf8 alien>string ] - [ code>> ] - [ message>> utf8 alien>string ] tri - \ g-error boa ; - -: handle-GError ( GError/f -- ) - [ - [ GError>g-error ] - [ g_error_free ] bi - throw - ] when* ; - : GInputStream>GdkPixbuf ( GInputStream -- GdkPixbuf ) f { { pointer: GError initial: f } } [ gdk_pixbuf_new_from_stream ] with-out-parameters diff --git a/basis/tools/deploy/unix/unix.factor b/basis/tools/deploy/unix/unix.factor index 1b6b8596e2..2fba79ad1e 100644 --- a/basis/tools/deploy/unix/unix.factor +++ b/basis/tools/deploy/unix/unix.factor @@ -1,25 +1,34 @@ ! Copyright (C) 2008 James Cash ! See http://factorcode.org/license.txt for BSD license. -USING: io io.pathnames io.directories io.files -io.files.info.unix io.backend kernel namespaces make sequences -system tools.deploy.backend tools.deploy.config -tools.deploy.config.editor assocs hashtables prettyprint ; +USING: io io.backend io.directories io.files io.files.info.unix +io.pathnames kernel namespaces sequences system +tools.deploy.backend tools.deploy.config +tools.deploy.config.editor vocabs.loader vocabs.metadata ; IN: tools.deploy.unix +: used-ico ( vocab -- ico ) + dup vocab-windows-icon-path vocab-append-path + [ exists? ] keep "vocab:ui/backend/gtk/icon.ico" ? ; + +: copy-ico ( vocab bundle-name -- ) + [ used-ico ] + [ "ui/backend/gtk/icon.ico" append-path ] bi* + copy-file ; + : create-app-dir ( vocab bundle-name -- vm ) - copy-vm + [ copy-vm ] [ copy-ico ] 2bi dup OCT: 755 set-file-permissions ; : bundle-name ( -- str ) deploy-name get ; M: unix deploy* ( vocab -- ) - "." resource-path [ + "resource:" [ dup deploy-config [ [ bundle-name create-app-dir ] keep [ bundle-name image-name ] keep namespace make-deploy-image bundle-name "" [ copy-resources ] [ copy-libraries ] 3bi - bundle-name normalize-path [ "Binary deployed to " % % "." % ] "" make print + bundle-name normalize-path "Binary deployed to " "." surround print ] bind ] with-directory ; diff --git a/basis/ui/backend/gtk/gtk.factor b/basis/ui/backend/gtk/gtk.factor index 4d72abdd5e..2e0a776dfe 100644 --- a/basis/ui/backend/gtk/gtk.factor +++ b/basis/ui/backend/gtk/gtk.factor @@ -1,14 +1,16 @@ ! Copyright (C) 2010 Anton Gorenko, Philipp Brüschweiler. ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien.accessors alien.c-types alien.data -alien.strings arrays assocs classes.struct command-line destructors -gdk.ffi gdk.gl.ffi glib.ffi gobject.ffi gtk.ffi gtk.gl.ffi -io.backend.unix.multiplexers io.encodings.utf8 io.thread kernel libc -literals locals math math.bitwise math.order math.vectors namespaces -sequences strings system threads ui ui.backend ui.clipboards -ui.commands ui.event-loop ui.gadgets ui.gadgets.menus -ui.gadgets.private ui.gadgets.worlds ui.gestures ui.pixel-formats -ui.pixel-formats.private ui.private ; +alien.strings alien.syntax arrays assocs classes.struct +command-line destructors gdk.ffi gdk.gl.ffi glib.ffi +gobject.ffi gtk.ffi gtk.gl.ffi io.backend +io.backend.unix.multiplexers io.encodings.utf8 io.thread kernel +libc literals locals math math.bitwise math.order math.vectors +namespaces sequences strings system threads ui ui.backend +ui.clipboards ui.commands ui.event-loop ui.gadgets +ui.gadgets.menus ui.gadgets.private ui.gadgets.worlds +ui.gestures ui.pixel-formats ui.pixel-formats.private +ui.private ; RENAME: windows ui.private => ui:windows EXCLUDE: ui.gadgets.editors => change-caret ; RENAME: change-caret ui.gadgets.editors => editors:change-caret @@ -264,10 +266,21 @@ SYMBOL: next-timeout f g_source_attach drop nano-count next-timeout set-global ; +: load-icon ( -- ) + ! This file is not in a resource.txt because it can be + ! overwritten when deploying. See 'Vocabulary icons' + ! in the docs. + "vocab:ui/backend/gtk/icon.ico" + normalize-path utf8 string>alien + { { pointer: GError initial: f } } + [ gtk_window_set_default_icon_from_file ] with-out-parameters + handle-GError drop ; + M: gtk-ui-backend (with-ui) [ f f gtk_init f f gtk_gl_init + load-icon init-clipboard start-ui stop-io-thread diff --git a/basis/ui/backend/gtk/icon.ico b/basis/ui/backend/gtk/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1df40e3d4e21f4bc3c5f202140f72c17077d0857 GIT binary patch literal 15086 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 Jjrb1b{{YY9Rd@gZ literal 0 HcmV?d00001 diff --git a/core/vocabs/loader/loader-docs.factor b/core/vocabs/loader/loader-docs.factor index d3736db9bf..0224ec9450 100755 --- a/core/vocabs/loader/loader-docs.factor +++ b/core/vocabs/loader/loader-docs.factor @@ -28,7 +28,7 @@ ARTICLE: "vocabs.roots" "Vocabulary roots" { $subsections "add-vocab-roots" } ; ARTICLE: "vocabs.icons" "Vocabulary icons" -"An icon file representing the vocabulary can be provided for use by " { $link "tools.deploy" } ". 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." ; +"An icon file representing the vocabulary can be provided for use by " { $link "tools.deploy" } ". A file named " { $snippet "icon.ico" } " will be used as the application icon when the application is deployed on Windows, Linux or the *BSD. A file named " { $snippet "icon.icns" } " will be used when the application is deployed on MacOS X." ; ARTICLE: "vocabs.loader" "Vocabulary loader" "The " { $link POSTPONE: USE: } " and " { $link POSTPONE: USING: } " words load vocabularies using the vocabulary loader. The vocabulary loader is implemented in the " { $vocab-link "vocabs.loader" } " vocabulary."