[DRE-commits] [ruby-gnome2] 20/31: New upstream version 3.0.9
Daisuke Higuchi
dai at moszumanska.debian.org
Mon Oct 10 13:40:19 UTC 2016
This is an automated email from the git hooks/post-receive script.
dai pushed a commit to branch exp/debian
in repository ruby-gnome2.
commit 5f0b7e1eb7cd13a0304dc8412cf73e3d44ba73be
Author: HIGUCHI Daisuke (VDR dai) <dai at debian.org>
Date: Sun Oct 9 21:56:57 2016 +0900
New upstream version 3.0.9
---
NEWS | 411 +++
README.md | 6 +-
Rakefile | 93 +-
build/Vagrantfile | 12 +-
build/build-windows.sh | 5 +-
clutter-gstreamer/lib/clutter-gst.rb | 6 +-
clutter-gstreamer/test/run-test.rb | 9 +
clutter-gtk/lib/clutter-gtk.rb | 6 +-
clutter-gtk/sample/events.rb | 2 +-
clutter-gtk/sample/test.rb | 2 +-
clutter-gtk/sample/window-test.rb | 4 +-
clutter-gtk/sample/window-test2.rb | 2 +-
clutter-gtk/test/run-test.rb | 7 +
clutter/Rakefile | 2 +-
clutter/lib/clutter.rb | 6 +-
clutter/sample/bin-layout.rb | 2 +-
clutter/sample/image-content.rb | 2 +-
clutter/sample/pan-action.rb | 2 +-
clutter/test/run-test.rb | 7 +-
extconf.rb | 1 +
gdk3/Rakefile | 3 +-
gdk3/lib/gdk3/deprecated.rb | 10 +-
gdk3/test/test-gdk-cursor.rb | 2 +-
gdk_pixbuf2-no-gi/COPYING.LIB | 502 ++++
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/README | 0
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/Rakefile | 0
.../ext/gdk_pixbuf2/depend | 0
.../ext/gdk_pixbuf2/extconf.rb | 0
.../ext/gdk_pixbuf2/gdk_pixbuf2.def | 0
.../ext/gdk_pixbuf2/rbgdk-pixbuf-format.c | 0
.../ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c | 0
.../ext/gdk_pixbuf2/rbgdk-pixbuf.c | 0
.../ext/gdk_pixbuf2/rbgdk-pixbuf.h | 0
.../ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h | 0
.../ext/gdk_pixbuf2/rbgdk-pixbuf2private.h | 0
.../ext/gdk_pixbuf2/rbgdk-pixbufanimation.c | 0
.../ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c | 0
.../ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c | 0
.../ext/gdk_pixbuf2/rbgdk-pixdata.c | 0
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/extconf.rb | 0
.../lib/gdk_pixbuf2.rb | 0
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/anim.rb | 0
.../sample/composite.rb | 0
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/flip.rb | 0
gdk_pixbuf2-no-gi/sample/floppybuddy.gif | Bin 0 -> 5216 bytes
.../sample/format.rb | 0
gdk_pixbuf2-no-gi/sample/gnome-foot.png | Bin 0 -> 2916 bytes
.../sample/inline.rb | 0
.../sample/loader.rb | 0
.../sample/pixdata.rb | 0
.../sample/rotate.rb | 0
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/save.rb | 0
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/scale.rb | 0
.../sample/simpleanim.rb | 0
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/utils.rb | 0
{gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/xpm.rb | 0
.../test/gdk_pixbuf2-test-utils.rb | 0
.../test/run-test.rb | 0
.../test/test-version.rb | 0
gdk_pixbuf2/{README => README.md} | 9 +-
gdk_pixbuf2/Rakefile | 2 +-
gdk_pixbuf2/lib/gdk_pixbuf2.rb | 80 +-
gdk_pixbuf2/lib/gdk_pixbuf2/deprecated.rb | 160 ++
.../lib/gdk_pixbuf2/loader.rb | 47 +-
.../gdk_pixbuf2/pixbuf-loader.rb} | 12 +-
gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf.rb | 282 ++
.../lib/gdk_pixbuf2/version.rb | 22 +-
gdk_pixbuf2/sample/anim.rb | 4 +-
gdk_pixbuf2/sample/composite.rb | 52 +-
gdk_pixbuf2/sample/flip.rb | 4 +-
gdk_pixbuf2/sample/format.rb | 6 +-
gdk_pixbuf2/sample/loader.rb | 6 +-
gdk_pixbuf2/sample/rotate.rb | 8 +-
gdk_pixbuf2/sample/save.rb | 6 +-
gdk_pixbuf2/sample/scale.rb | 20 +-
gdk_pixbuf2/sample/simpleanim.rb | 14 +-
gdk_pixbuf2/sample/utils.rb | 11 +-
gdk_pixbuf2/sample/xpm.rb | 18 +-
gdk_pixbuf2/test/fixture/floppybuddy.gif | Bin 0 -> 5216 bytes
gdk_pixbuf2/test/fixture/gnome-logo-icon.png | Bin 0 -> 3090 bytes
gdk_pixbuf2/test/fixture/image.gresource | Bin 0 -> 3338 bytes
gdk_pixbuf2/test/fixture/image.gresource.xml | 6 +
gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb | 11 +
gdk_pixbuf2/test/run-test.rb | 9 +-
.../test/test-animation.rb | 19 +-
.../arg-info.rb => gdk_pixbuf2/test/test-loader.rb | 20 +-
gdk_pixbuf2/test/test-pixbuf.rb | 334 +++
gio2/lib/gio2.rb | 21 +-
gio2/lib/gio2/application-command-line.rb | 5 -
gio2/lib/gio2/loader.rb | 9 +-
glib2/Rakefile | 4 +-
glib2/ext/glib2/extconf.rb | 1 -
glib2/ext/glib2/rbglib-variant-type.c | 6 +-
glib2/ext/glib2/rbglib-variant.c | 28 +-
glib2/ext/glib2/rbglib.c | 38 -
glib2/ext/glib2/rbglib.h | 4 +-
glib2/ext/glib2/rbglib_convert.c | 12 +-
glib2/ext/glib2/rbglib_matchinfo.c | 4 +
glib2/ext/glib2/rbglib_regex.c | 13 +-
glib2/ext/glib2/rbgobj_object.c | 122 +-
glib2/ext/glib2/rbgobj_signal.c | 13 +-
glib2/ext/glib2/rbgobj_type.c | 8 +-
glib2/ext/glib2/rbgobject.c | 6 -
glib2/ext/glib2/rbgprivate.h | 4 -
glib2/ext/glib2/rbgutil.c | 2 -
glib2/ext/glib2/rbgutil.h | 4 +-
glib2/lib/glib2.rb | 7 +
glib2/lib/gnome2/rake/external-package.rb | 120 +-
glib2/lib/gnome2/rake/package-task.rb | 66 +-
glib2/lib/gnome2/rake/windows-binary-build-task.rb | 680 ++---
.../gnome2/rake/windows-binary-download-task.rb | 299 +-
glib2/lib/mkmf-gnome2.rb | 41 +-
glib2/test/test-binding.rb | 223 +-
glib2/test/test_glib2.rb | 27 +-
gnumeric/COPYING.LIB | 502 ++++
gnumeric/README.md | 25 +
{vte3 => gnumeric}/Rakefile | 33 +-
vte3/lib/vte3.rb => gnumeric/lib/gnm.rb | 18 +-
gnumeric/lib/gnm/loader.rb | 59 +
.../lib/gnumeric.rb | 7 +-
gnumeric/test/fixtures/hello.gnumeric | Bin 0 -> 1803 bytes
.../test/gnumeric-test-utils.rb | 9 +-
{clutter => gnumeric}/test/run-test.rb | 49 +-
gnumeric/test/test-convert.rb | 35 +
gobject-introspection/Rakefile | 2 +-
.../ext/gobject-introspection/rb-gi-argument.c | 95 +-
.../gobject-introspection/rb-gi-function-info.c | 30 +-
.../lib/gobject-introspection/arg-info.rb | 7 +
.../lib/gobject-introspection/callable-info.rb | 79 +-
.../lib/gobject-introspection/collection-reader.rb | 13 +-
.../lib/gobject-introspection/loader.rb | 61 +-
goffice/COPYING.LIB | 502 ++++
goffice/README.md | 25 +
{vte3 => goffice}/Rakefile | 64 +-
vte3/lib/vte3.rb => goffice/lib/goffice.rb | 15 +-
goffice/lib/goffice/loader.rb | 89 +
.../arg-info.rb => goffice/lib/goffice/version.rb | 22 +-
.../patches/libxslt-1.1.28-add-mkdir-fallback.diff | 11 +
.../test/goffice-test-utils.rb | 7 +-
{clutter => goffice}/test/run-test.rb | 47 +-
.../test/test-data-scalar-str.rb | 11 +-
gsf/COPYING.LIB | 502 ++++
gsf/README.md | 25 +
{vte3 => gsf}/Rakefile | 29 +-
gio2/lib/gio2.rb => gsf/lib/gsf.rb | 18 +-
.../lib/gsf/input.rb | 14 +-
gsf/lib/gsf/loader.rb | 57 +
.../test/gsf-test-utils.rb | 6 +-
{gdk_pixbuf2 => gsf}/test/run-test.rb | 27 +-
.../test/test-input-stdio.rb | 13 +-
gstreamer/Rakefile | 28 +-
.../gst-plugins-bad-1.8.0-add-missing-lole32.diff | 12 -
gtk2/sample/gtk-demo/appwindow.rb | 4 +-
gtk2/sample/gtk-demo/cairo-clip-image.rb | 2 +-
gtk2/sample/gtk-demo/cairo-image.rb | 2 +-
gtk2/sample/gtk-demo/iconview.rb | 6 +-
gtk2/sample/gtk-demo/images.rb | 6 +-
gtk2/sample/gtk-demo/pixbufs.rb | 16 +-
gtk2/sample/gtk-demo/stock_browser.rb | 2 +-
gtk2/sample/gtk-demo/textview.rb | 4 +-
gtk2/sample/misc/aboutdialog.rb | 2 +-
gtk2/sample/misc/combobox.rb | 2 +-
gtk2/sample/misc/iconview.rb | 4 +-
gtk2/sample/misc/itemfactory.rb | 2 +-
gtk2/sample/misc/itemfactory2.rb | 2 +-
gtk2/sample/misc/to_drawable.rb | 4 +-
gtk2/sample/misc/treeview.rb | 2 +-
gtk2/test/test_gdk_pixbuf.rb | 12 +-
gtk3/ext/gtk3/rb-gtk3.c | 17 +
gtk3/lib/gtk3/container.rb | 7 -
gtk3/lib/gtk3/deprecated.rb | 6 +-
gtk3/lib/gtk3/image.rb | 14 +-
gtk3/lib/gtk3/loader.rb | 16 +-
gtk3/lib/gtk3/text-buffer.rb | 45 +-
gtk3/lib/gtk3/text-view.rb | 53 +
gtk3/lib/gtk3/tree-model.rb | 5 +
gtk3/lib/gtk3/tree-view.rb | 25 +
gtk3/lib/gtk3/widget.rb | 5 -
gtk3/sample/gtk-demo/TODO | 16 +-
gtk3/sample/gtk-demo/application.ui | 163 +-
gtk3/sample/gtk-demo/appmenu.ui | 19 +
gtk3/sample/gtk-demo/assistant.rb | 1 +
gtk3/sample/gtk-demo/css_accordion.css | 16 +-
gtk3/sample/gtk-demo/css_accordion.rb | 4 +-
gtk3/sample/gtk-demo/css_basics.css | 2 +-
gtk3/sample/gtk-demo/css_basics.rb | 4 +-
gtk3/sample/gtk-demo/css_multiplebgs.rb | 4 +-
gtk3/sample/gtk-demo/css_pixbufs.css | 4 +-
gtk3/sample/gtk-demo/css_pixbufs.rb | 4 +-
gtk3/sample/gtk-demo/css_shadows.css | 10 +-
gtk3/sample/gtk-demo/css_shadows.rb | 4 +-
gtk3/sample/gtk-demo/cssview.css | 10 +-
.../data/16x16/gtk3-demo-symbolic.symbolic.png | Bin 0 -> 324 bytes
gtk3/sample/gtk-demo/data/16x16/gtk3-demo.png | Bin 0 -> 874 bytes
.../data/22x22/gtk3-demo-symbolic.symbolic.png | Bin 0 -> 437 bytes
gtk3/sample/gtk-demo/data/22x22/gtk3-demo.png | Bin 0 -> 1281 bytes
.../data/24x24/gtk3-demo-symbolic.symbolic.png | Bin 0 -> 465 bytes
gtk3/sample/gtk-demo/data/24x24/gtk3-demo.png | Bin 0 -> 1374 bytes
.../data/256x256/gtk3-demo-symbolic.symbolic.png | Bin 0 -> 3937 bytes
gtk3/sample/gtk-demo/data/256x256/gtk3-demo.png | Bin 0 -> 18667 bytes
.../data/32x32/gtk3-demo-symbolic.symbolic.png | Bin 0 -> 581 bytes
gtk3/sample/gtk-demo/data/32x32/gtk3-demo.png | Bin 0 -> 1748 bytes
.../data/48x48/gtk3-demo-symbolic.symbolic.png | Bin 0 -> 854 bytes
gtk3/sample/gtk-demo/data/48x48/gtk3-demo.png | Bin 0 -> 2640 bytes
.../data/512x512/gtk3-demo-symbolic.symbolic.png | Bin 0 -> 7594 bytes
gtk3/sample/gtk-demo/data/512x512/gtk3-demo.png | Bin 0 -> 42374 bytes
gtk3/sample/gtk-demo/data/source.svg | 2886 ++++++++++++++++++++
gtk3/sample/gtk-demo/data/symbolic-source.svg | 29 +
gtk3/sample/gtk-demo/demo.gresource.xml | 21 +-
gtk3/sample/gtk-demo/demo.ui | 1 +
gtk3/sample/gtk-demo/font_features.rb | 2 +-
gtk3/sample/gtk-demo/main.rb | 4 +-
gtk3/sample/gtk-demo/main.ui | 54 +-
gtk3/sample/gtk-demo/markup.rb | 61 +-
gtk3/sample/gtk-demo/markup.txt | 4 +-
gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml | 9 +
gtk3/sample/gtk-demo/pixbufs.rb | 250 +-
gtk3/sample/gtk-demo/reset.css | 59 +-
gtk3/sample/gtk-demo/rotated_text.rb | 174 +-
gtk3/sample/gtk-demo/shortcuts-boxes.ui | 167 ++
gtk3/sample/gtk-demo/shortcuts-builder.ui | 547 ++++
gtk3/sample/gtk-demo/shortcuts-clocks.ui | 166 ++
gtk3/sample/gtk-demo/shortcuts-gedit.ui | 172 ++
gtk3/sample/gtk-demo/shortcuts.ui | 65 +
gtk3/sample/gtk-demo/stack.ui | 10 +-
gtk3/sample/gtk-demo/textscroll.rb | 106 +
gtk3/sample/gtk-demo/theming.ui | 80 +-
gtk3/sample/gtk-demo/theming_style_classes.rb | 9 +-
gtk3/sample/gtk-demo/transparent.rb | 143 +
gtk3/sample/misc/aboutdialog.rb | 2 +-
gtk3/sample/misc/bindings.rb | 51 +-
gtk3/sample/misc/combobox.rb | 2 +-
gtk3/sample/misc/dnd.rb | 6 +-
gtk3/sample/misc/icons-theme-viewer.rb | 2 +-
gtk3/sample/misc/iconview.rb | 4 +-
gtk3/sample/misc/textbuffer-serialize.rb | 32 +-
gtk3/sample/misc/to-drawable.rb | 4 +-
gtk3/sample/misc/tooltips.rb | 1 +
gtk3/sample/misc/treeview.rb | 2 +-
gtk3/sample/tutorial/README.md | 36 +-
gtk3/test/test-gtk-clipboard.rb | 2 +-
gtk3/test/test-gtk-combo-box.rb | 4 +-
gtk3/test/test-gtk-icon-view.rb | 4 +-
gtk3/test/test-gtk-image.rb | 2 +-
gtk3/test/test-gtk-list-store.rb | 12 +-
gtk3/test/test-gtk-text-view.rb | 64 +
gtk3/test/test-gtk-tree-path.rb | 4 +-
gtk3/test/test-gtk-tree-view.rb | 97 +
gtk3/test/test-gtk-window.rb | 4 +-
gtk3/test/test-pango-context.rb | 56 +
gtksourceview3/Rakefile | 2 +-
pango/Rakefile | 6 +-
pango/ext/pango/rbpangoattribute.c | 7 +
pango/ext/pango/rbpangoattrlist.c | 4 +-
pango/ext/pango/rbpangocontext.c | 63 +-
pango/ext/pango/rbpangoglyphinfo.c | 10 +-
pango/test/test-context.rb | 113 +
poppler/Rakefile | 2 +-
poppler/ext/poppler/extconf.rb | 2 +-
poppler/ext/poppler/rbpoppler-page.c | 18 +-
poppler/sample/pdf2.rb | 2 +-
poppler/test/run-test.rb | 8 +-
poppler/test/test_page.rb | 9 +
rsvg2/Rakefile | 2 +-
rsvg2/sample/svg2.rb | 2 +-
run-test.rb | 1 +
travis-before-script.sh | 4 +
vte3/Rakefile | 2 +-
vte3/lib/vte3.rb | 23 +-
269 files changed, 10911 insertions(+), 1886 deletions(-)
diff --git a/NEWS b/NEWS
index ba0a661..56201bf 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,417 @@
= NEWS
+== Ruby-GNOME2 3.0.9: 2016-08-12
+
+=== Changes
+
+==== All
+
+ * Update Realease date in NEWS.
+ * Use the latest Rubies.
+ * Readme: update ruby versions supported.
+ [Patch by cedlemo]
+ * travis: install experimental gems dependent packages for GSF and GOffice.
+ [patch by Hiroshi Hatake]
+ * add GSF, GOffice and Gnumeric in the main Rakefile.
+ [patch by cedlemo]
+ * ignore no-GI version of gdk_pixbuf2 in main run-test.rb and in the main extconf.rb.
+ * remove conditionnal macro based on HAVE_RUBY_ENCODING_H.
+ * clean code in main Rakefile.
+ * define top level windows:version:update in main Rakefile.
+
+==== Ruby/GIO2
+
+ * Improvements
+ * Fixes
+ * remove needless lazy initialization.
+ * follow GI API improvement.
+
+==== Ruby/GLIB2
+
+ * Improvements
+ * support for GLib 2.30 on CentOS 6.
+ [ruby-list:50310][5.5]
+ [ruby-list:50316][5.5]
+ * add GLib 2.30 check.
+ * add GLib 2.34 check.
+ * support customizing signal callback.
+ * support (({GObject#bind_property_full})).
+ [patch by cedlemo]
+ * clean code and style issue.
+ * fix GC bug that alive proc may be GC-ed.
+ * Fixes
+ * windows: improve rake.
+ * split g-ir-compiler args.
+ * add debug option as comment.
+ * fix wrong define location.
+ * use predicate style.
+ * fix wrong function in rbglib-variant.c.
+ * bump version.
+ * use SPDX format for license.
+ * homebrew:
+ * add workaround for libffi.pc isn't found on OS X.
+ * enable libffi workaround for gi.
+ * remove checks for old Ruby.
+ * Ruby 2.1 or later has (({rb_str_new_cstr})).
+ * set UTF-8 encoding to (({GLIB.XXX_to_utf8})) return value.
+ * remove unused variables in rbglib_convert.c.
+ [patch by cedlemo]
+ * support Ruby 2.4 Integer unification.
+ [patch Hiroshi Hatake]
+ * gnome2 rake add windows:version:update task.
+ * gnome2 rake reduce too much update.
+ * gnome2 rake accept the latest version isn't found case.
+ * gnome2 rake ignore development series.
+ * windows: update dependencies.
+ * support :freedesktop download site.
+ * support :freedesktop_gstreamer download site.
+ * ignore development version in :freedesktop_gstreamer.
+
+==== Ruby/GStreamer
+
+ * Improvements
+ * Fixes
+ * windows: improve rake file.
+ * update patches.
+ * follow file name change.
+ * specify x86_64 as arch for 64bit Windows.
+ * stop splitting g-ir-compiler args by default.
+ * fix typo.
+ * windows: update dependencies.
+ * use :freedesktop_gstreamer download_site.
+ * update external packages.
+
+==== Ruby/Poppler
+
+ * Improvements
+ * Fixes
+ * windows: improve rake file.
+ * use https.
+ * add missing Makefile existence check.
+ * segmentation fault in (({Poppler::Page#text_layout})).
+ [patch by YAMAMOTO Masayuki]
+ * use (({GdkPixbuf::Pixbuf})) form in sample files.
+ [patch by cedlemo]
+ * remove needless gdk_pixbuf2 build dependency.
+ * add missing make file existence check in run-test.rb.
+
+==== Ruby/GObjectIntrospection
+
+ * Improvements
+ * support dispatching by Flags and Enums.
+ [GitHub#745][Reported by Mamoru TASAKA]
+ * cache results of methods of (({GI::CallableInfo})).
+ [GitHub#749][Reported by rafagf1]
+ * cache collection reader result.
+ [GitHub#749][Reported by rafagf1]
+ * reduce needless function call.
+ [GitHub#749][Reported by rafagf1]
+ * cache (({GI::AgInfo#gclosure?})).
+ * add (({GI::Loader#rubyish_class_name})).
+ [patch by cedlemo]
+ * accept on_XXX as predicate method name.
+ * support gslist of structure values as return value.
+ [patch by cedlemo]
+ * make constant name easy to customize.
+ * Fixes
+ * fix a typo in loader.rb.
+ * fix a bug that int32[] returns wrong values.
+ [GitHub#758][reported by TASAKA]
+ * don't return array length output argument for return value.
+ * windows: update dependencies.
+
+==== Ruby/GDK3
+
+ * Improvements
+ * Fixes
+ * windows:
+ * support symbolic icons.
+ [GitHub#750][Abby Archer]
+ * use (({GdkPixbuf::Pixbuf})) form in gdk3 library and test files.
+ [patch by cedlemo]
+ * Rake file update GTK+ version.
+
+==== Ruby/GTK3
+
+ * Improvements
+ * update gtk-demo textscroll.
+ [patch by cedlemo]
+ * update gtk-demo data files to Gtk 3.20.
+ [patch by cedlemo]
+ * cache (({Gtk::TreeModel#get_column_type})).
+ [GitHub#749][Reported by rafagf1]
+ * update gtk-demo main.rb to Gtk 3.20.
+ [patch by cedlemo]
+ * update theming_style_classes gtk demo to 3.20.
+ [patch by cedlemo]
+ * update assistant gtk demo to 3.20.
+ [patch by cedlemo]
+ * update css related gtk demos to 3.20.
+ [patch by cedlemo]
+ * update markup gtk demo to 3.20.
+ [patch by cedlemo]
+ * update font-features demo to 3.20.
+ [patch by cedlemo]
+ * make (({Gtk::TreeView#expand_row})) rubyish.
+ * support "row-collapsed" and "row-expanded" signals for (({Gtk::TreeView})).
+ [GitHub#762][Reported Eric Cunningham]
+ * update misc sample bindings.rb to Gtk 3.20.
+ [patch by cedlemo]
+ * update rotated text gtk demo.
+ [patch by cedlemo]
+ * update pixbufs gtk demo.
+ [patch by cedlemo]
+ * hide "found" return value from (({Gtk::TextView#get_iter_at_XXX})).
+ [GitHub#794][Reported by Miguel Hernández]
+ * add (({Gtk::TextView#get_iter_at}))
+ * Fixes
+ * guard text marks from GC.
+ [GitHub#743][Reported by cedlemo]
+ * fix a bug that GC-ed (({Gtk::TextTag})) may be reused.
+ * relax condition in test for (({Gtk::ListStore})).
+ * use GTK+ version check in test for (({Gtk::Image})).
+ * fix issue in the gtk3 tutorial.
+ [patch from Renich Bon Ciric]
+ * follow (({Gtk::TextBuffer#select_bounds})) API change.
+ [GitHub#794][Reported by Miguel Hernandez]
+ * (({Gtk::TextView#get_iter_at*})) return nil when not found.
+ [GitHub#794][Reported by Miguel Hernandez]
+ * fix typo at gtk-demo.
+ [patch by tSU_RooT]
+ * use (({GdkPixbuf::Pixbuf})) form in gtk-demo files.
+ [patch by cedlemo]
+ * use (({GdkPixbuf::Pixbuf})) form in sample misc files.
+ [patch by cedlemo]
+ * use (({GdkPixbuf::Pixbuf})) form in test files.
+ [patch by cedlemo]
+ * gtk3 sample: follow (({Gtk::TextBuffer#select_bounds})) API change.
+ [GitHub#794][Reported by Miguel Hernández]
+ * (({Gtk::TextView#get_iter_at*})) return nil when not found.
+ [GitHub#794][Reported by Miguel Hernández]
+ * fix wrong method used in order to set window size in tutorial samples.
+ [patch by Renich Bon Ciric]
+ * fix label in ((#Gtk::TextView})) tests.
+ * fix typo at gtk-demo.
+ [patch by tSU_RooT]
+ * update all samples, tests, demo, tutorial to use (({GdkPixbuf#Pixbuf})).
+ [patch by cedlemo]
+ * add gtk3 demo transparent.rb.
+ [patch by cedlemo]
+ * update sample with (({Gtk::SeclectionData})) API changes.
+ [patch by cedlemo]
+ * lib and tests follow GI API improvement.
+ * test omit on old GTK+.
+ * require more newer GTK+ version for (({Gtk::TextView})) test.
+
+==== Ruby/Pango
+
+ * Improvements
+ * add tests for (({Pango::Context})).
+ [patch by cedlemo]
+ * improve tests for (({Pango::Context})).
+ * implement (({Pango::Context#set_chape_renderer})).
+ * add (({Pango::AttrShape#data})).
+ [GitHub#766][Reported by cedlemo]
+ * Fixes
+ * fix error with MACRO usage in rbpangoattrlist.c.
+ [patch by cedlemo]
+ * fix a bug that (({Pango#GlyphGeometry#geometry=})) does nothing.
+ * fix GC related problem in rbpangocontext.c.
+ * windows: update external packages.
+
+==== Ruby/GSF
+
+ * Improvements
+ * start GSF module.
+ [patch by cedlemo]
+ * Fixes
+ * follow GI API improvement.
+ * windows: fix external package name.
+ * windows: update external packages.
+
+==== Ruby/GOffice
+
+ * Improvements
+ * start GOffice module.
+ [patch by cedlemo]
+ * support version.
+ * Fixes
+ * add tests for GOffice.
+ * use (({GI::Loader#rubyish_class_nme})) in loader.rb.
+ [patch by cedlemo]
+ * add rules in order to fix issues when building objects.
+ [patch by cedlemo]
+ * add availability check in tests.
+ * fix condition issue in test.
+ * make some tests omitted when run by Travis CI.
+ * windows: update external packages.
+
+==== Ruby/Gnumeric
+
+ * Improvements
+ * start Gnumeric module.
+ [patch by cedlemo]
+ * Fixes
+ * add missing dependency in run-test.rb.
+ * use (({GI::Loader#rubyish_class_nme})) in loader.rb.
+ [patch by cedlemo]
+ * add rules in order to fix issues when building objects.
+ [patch by cedlemo]
+ * travis : add gnumeric as package to install instead of relying on dep.
+ [patch by cedlemo]
+ * improve renaming rules for C structures to ruby Class in GI loader.
+ [patch by cedlemo]
+ * add rules in order to avoid 2 objects information beeing reloaded.
+ [patch by cedlemo]
+ * windows: fix external package version.
+
+==== Ruby/GdkPixbuf2
+ * Improvements
+ * replace C implementation with one based on GObject-Introspection.
+ [patch by cedlemo]
+ * implement backward compatibility for (({GdkPixbuf::Pixbuf.new})).
+ [patch by cedlemo]
+ * add rubyish methods.
+ * add (({GdkPixbuf::Pixbuf#composite!})).
+ * implement rubyish methods:
+ * (({GdkPixbuf#dup}))
+ * (({GdkPixbuf#fill!}))
+ * (({GdkPixbuf#rotate}))
+ * (({GdkPixbuf#saturate_and_pixelate}))
+ * (({GdkPixbuf#save}))
+ * (({GdkPixbuf#scale}))
+ * (({GdkPixbuf#scale!}))
+ * support version information.
+ * support options in (({GdkPixbuf::Pixbuf#composite})) and (({GdkPixbuf::Pixbuf#composite!})).
+ * Fixes
+ * remove needless lazy initialization.
+ * improve tests.
+ * add deprecated message for backward compatibility.
+ * add tests for (({GdkPixbuf::Pixbuf#new})).
+ [patch by cedlemo]
+ * add tests for (({GdkPixbuf::Pixbuf#dup})) and (({GdkPixbuf::Pixbuf#fill!})).
+ [patch by cedlemo]
+ * ignore no-gi version of gdk_pixbuf2 in run-test.rb and extconf.rb.
+ * add tests for (({GdkPixbuf::Pixbuf#rotate})) and (({GdkPixbuf::Pixbuf#new})).
+ [patch by cedlemo]
+ * update and fix issues in the samples.
+ [patch by cedlemo]
+ * improve gdk_pixbuf2 libs and tests style, and add missing copyright header.
+ * add missing GObjectIntrospection dependency in tests.
+ * add backward compatibility between the old Gdk::Pixbuf and GdkPixbuf::Pixbuf.
+ * supports running on different directory for gdk_pixbuf2 samples.
+ * add (({PixbufLoader#last_write})).
+ * add tests for (({GdkPixbuf#new})).
+ [patch by cedlemo]
+ * add tests for (({GdkPixbuf#new})) with :file and :scale parameters.
+ [patch by cedlemo]
+ * add tests for (({GdkPixbuf#new})) from subpixbuf.
+ [patch by cedlemo]
+ * add backward compatibily for (({GdkPixbuf::Pixbuf#new})) and (({GdkPixbuf::Pixbuf#new_subpixbuf})).
+ * simplify and improve tests.
+ * use warn and raise instead of puts messages.
+ * add test for (({GdkPixbuf::Pixbuf#dup})).
+ [patch by cedlemo]
+ * add test for (({GdkPixbuf::Pixbuf#new})) from data.
+ [patch by cedlemo]
+ * add test for (({GdkPixbuf::Pixbuf#fill!})).
+ [patch by cedlemo]
+ * clean (({GdkPixbuf::Pixbuf#fill!})) tests.
+ * add test for (({GdkPixbuf::Pixbuf#new})) from bytes.
+ [patch by cedlemo]
+ * clean (({GdkPixbuf::Pixbuf#new})) tests.
+ * add (({GdkPixbuf::Pixbuf#rotate})) tests.
+ [patch by cedlemo]
+ * clean (({GdkPixbuf::Pixbuf#rotate})) tests.
+ * add (({GdkPixbuf#new})) from resource test.
+ [patch by cedlemo]
+ * add (({GdkPixbuf::Pixbuf#new})) from resource at scale tests.
+ [patch by cedlemo]
+ * clean (({GdkPixbuf::Pixbuf#new})) tests.
+ * update sample with the GdkPixbuf::Pixbuf form.
+ * add deprecated hook for (({GdkPixbuf::PixbufFormat#signature})).
+ * add tests for (({GdkPixbuf::Pixbuf#saturate_and_pixelate})).
+ [patch by cedlemo]
+ * keep backward compatibility for (({Gdk::PixbufError})).
+
+==== Ruby/VTE3
+
+ * Improvements
+ * Fixes
+ * remove needless lazy load.
+ * windows: update external package.
+
+==== Ruby/GTK2
+
+ * Improvements
+ * Fixes
+ * use (({GdkPixbuf::Pixbuf})) form in library, test and sample files.
+ [patch by cedlemo]
+
+==== Ruby/RSVG2
+
+ * Improvements
+ * Fixes
+ * use (({GdkPixbuf::Pixbuf})) form in library, test and sample files.
+ [patch by cedlemo]
+ * windows: update external packages.
+
+==== Ruby/Clutter
+
+ * Improvements
+ * Fixes
+ * use (({GdkPixbuf::Pixbuf})) form in library, test and sample files.
+ [patch by cedlemo]
+ * windows update version.
+
+==== Ruby/ClutterGtk
+
+ * Improvements
+ * Fixes
+ * use (({GdkPixbuf::Pixbuf})) form in library, test and sample files.
+ [patch by cedlemo]
+ * Fix issue with initialization of (({Gtk::IconView})) without hash argument.
+ [patch by cedlemo]
+
+==== Ruby/ClutterGstreamer
+
+ * Improvements
+ * Fixes
+ * add missing gdk_pixbuf2 dependency in tests.
+
+==== Ruby/GtkSourceView3
+
+ * Improvements
+ * Fixes
+ * windows: update dependencies.
+
+==== Ruby/GSF
+
+ * Added.
+
+==== Ruby/GOffice
+
+ * Added.
+
+==== Ruby/Gnumeric
+
+ * Added.
+
+==== Thanks
+
+ * Mamoru TASAKA
+ * rafagf1
+ * 5.5
+ * Abby Archer
+ * Eric Cunningham
+ * Hiroshi Hatake
+ * Renich Bon Ciric
+ * Miguel Hernández
+ * tSU_RooT
+ * YAMAMOTO Masayuki
+ * cedlemo
+
== Ruby-GNOME2 3.0.8: 2016-04-03
It's a release that improves GTK+ 3 support.
diff --git a/README.md b/README.md
index 8dd69b1..7ce0eee 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
## Ruby-GNOME2 -- Ruby bindings for GNOME
This is a set of bindings for the GNOME 2.x and 3.x libraries to use
-from Ruby 2.0.0, 2.1 and 2.2.
+from Ruby 2.1, 2.2 and 2.3.
## Release packages
@@ -50,7 +50,9 @@ from Ruby 2.0.0, 2.1 and 2.2.
### Experimental / Incomplete:
-* ...
+* Ruby/GSF: GSF 1.14.0 or later
+* Ruby/GOffice: GOffice 0.10 or later
+* Ruby/Gnumeric: Gnumeric 1.12 or later
## Install
diff --git a/Rakefile b/Rakefile
index 8ccecbc..eaaf5a5 100644
--- a/Rakefile
+++ b/Rakefile
@@ -91,6 +91,44 @@ def change_environment_variable(variables)
end
end
+gtk2_base_name = "ruby-gtk2"
+gtk3_base_name = "ruby-gtk3"
+gnome2_base_name = "ruby-gnome2-all"
+
+gtk2_packages = [
+ "glib2",
+ "gobject-introspection",
+ "gio2",
+ "atk",
+ "pango",
+ "gdk_pixbuf2",
+ "gtk2",
+]
+gtk3_packages = gtk2_packages - ["gtk2"] + [
+ "cairo-gobject",
+ "gdk3",
+ "gtk3",
+]
+gnome2_packages = gtk2_packages + gtk3_packages + [
+ "gstreamer",
+ "gtksourceview2",
+ "poppler",
+ "rsvg2",
+ "vte",
+ "vte3",
+ "gtksourceview3",
+ "clutter",
+ "clutter-gtk",
+ "clutter-gstreamer",
+ "webkit-gtk",
+ "webkit-gtk2",
+ "webkit2-gtk",
+ "gsf",
+ "goffice",
+ "gnumeric"
+]
+gnome2_packages = gnome2_packages.uniq
+
desc "configure all packages"
task :configure do
ruby("extconf.rb")
@@ -125,6 +163,18 @@ namespace :windows do
desc "build all packages for Windows"
task :build => build_tasks
+
+ namespace :version do
+ desc "update all external packages for Windows"
+ task :update do
+ gnome2_packages.each do |package|
+ next if package == "gtk2"
+ chdir(package) do
+ ruby("-S", "rake", "windows:version:update")
+ end
+ end
+ end
+ end
end
desc "clean all packages"
@@ -142,41 +192,6 @@ task :test => [:build] do
ruby("run-test.rb")
end
-gtk2_base_name = "ruby-gtk2"
-gtk3_base_name = "ruby-gtk3"
-gnome2_base_name = "ruby-gnome2-all"
-
-gtk2_packages = [
- "glib2",
- "gobject-introspection",
- "gio2",
- "atk",
- "pango",
- "gdk_pixbuf2",
- "gtk2",
-]
-gtk3_packages = gtk2_packages - ["gtk2"] + [
- "cairo-gobject",
- "gdk3",
- "gtk3",
-]
-gnome2_packages = gtk2_packages + gtk3_packages + [
- "gstreamer",
- "gtksourceview2",
- "poppler",
- "rsvg2",
- "vte",
- "vte3",
- "gtksourceview3",
- "clutter",
- "clutter-gtk",
- "clutter-gstreamer",
- "webkit-gtk",
- "webkit-gtk2",
- "webkit2-gtk",
-]
-gnome2_packages = gnome2_packages.uniq
-
namespace :dist do
base_files = ["AUTHORS", "COPYING.LIB", "NEWS",
"README.md", "Rakefile",
@@ -196,7 +211,7 @@ namespace :dist do
package(gnome2_base_name, base_files + gnome2_packages)
end
- ruby_versions = ["2.1.10", "2.2.4", "2.3.0"]
+ ruby_versions = ["2.1.10", "2.2.5", "2.3.1"]
namespace :test do
ruby_base_url = "ftp://ftp.ruby-lang.org/pub/ruby"
ruby_versions.each do |ruby_version|
@@ -388,6 +403,8 @@ namespace :gem do
"webkit-gtk",
"webkit-gtk2",
"webkit2-gtk",
+ "goffice",
+ "gnumeric",
]
windows_gnome2_packages = gnome2_packages - windows_unsupported_packages
@@ -480,7 +497,9 @@ namespace :gem do
task :push do
windows_gnome2_packages.each do |package|
ruby("-S", "gem", "push",
- *Dir.glob(File.join(package, "pkg", "*-#{version}-x86-mingw32.gem")))
+ File.join("build", "pkg", "#{package}-#{version}-x86-mingw32.gem"))
+ ruby("-S", "gem", "push",
+ File.join("build", "pkg", "#{package}-#{version}-x64-mingw32.gem"))
end
end
end
diff --git a/build/Vagrantfile b/build/Vagrantfile
index ca809f2..cb89890 100644
--- a/build/Vagrantfile
+++ b/build/Vagrantfile
@@ -23,7 +23,17 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
:privileged => false,
:path => "build-#{target}.sh")
config.vm.provider("virtualbox") do |virtual_box|
- virtual_box.cpus = (ENV["N_CPUS"] || 1).to_i
+ system_n_cpus = 1
+ if File.exist?("/proc/cpuinfo")
+ system_n_cpus = File.readlines("/proc/cpuinfo").grep(/^processor/).size
+ end
+ if system_n_cpus > 1
+ vm_n_cpus = system_n_cpus / 2
+ else
+ vm_n_cpus = 1
+ end
+ virtual_box.cpus = (ENV["N_CPUS"] || vm_n_cpus).to_i
+ virtual_box.memory = (ENV["VM_MEMORY"] || 1024).to_i
end
end
end
diff --git a/build/build-windows.sh b/build/build-windows.sh
index d0edcdb..c2dd9c1 100755
--- a/build/build-windows.sh
+++ b/build/build-windows.sh
@@ -3,8 +3,8 @@
export LANG=C
export DEBIAN_FRONTEND=noninteractive
-ruby_versions="2.1.10 2.2.4 2.3.0"
-export RUBY_CC_VERSION="2.1.10:2.2.4:2.3.0"
+ruby_versions="2.1.10 2.2.4 2.3.1"
+export RUBY_CC_VERSION="2.1.10:2.2.4:2.3.1"
N_CPUS=$(grep '^processor' /proc/cpuinfo | wc -l)
export MAKE_N_JOBS=${N_CPUS}
@@ -46,6 +46,7 @@ if [ ! -f ~/setup.timestamp ]; then
libgdk-pixbuf2.0-dev \
gobject-introspection \
libgtk2.0-bin \
+ gtk-3-examples \
flex \
bison \
gperf \
diff --git a/clutter-gstreamer/lib/clutter-gst.rb b/clutter-gstreamer/lib/clutter-gst.rb
index c5c5324..61c8137 100644
--- a/clutter-gstreamer/lib/clutter-gst.rb
+++ b/clutter-gstreamer/lib/clutter-gst.rb
@@ -57,12 +57,12 @@ module ClutterGst
self.load_version = nil
+ class InitError < StandardError
+ end
+
class Loader < GObjectIntrospection::Loader
NAMESPACE = "ClutterGst"
- class InitError < StandardError
- end
-
def initialize(base_module, init_arguments)
super(base_module)
@init_arguments = init_arguments
diff --git a/clutter-gstreamer/test/run-test.rb b/clutter-gstreamer/test/run-test.rb
index 1e32fa2..cff6726 100755
--- a/clutter-gstreamer/test/run-test.rb
+++ b/clutter-gstreamer/test/run-test.rb
@@ -24,6 +24,7 @@ ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
glib_base = File.join(ruby_gnome2_base, "glib2")
cairo_gobject_base = File.join(ruby_gnome2_base, "cairo-gobject")
gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
+gdk_pixbuf2_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
clutter_base = File.join(ruby_gnome2_base, "clutter")
gstreamer_base = File.join(ruby_gnome2_base, "gstreamer")
clutter_gstreamer_base = File.join(ruby_gnome2_base, "clutter-gstreamer")
@@ -32,6 +33,7 @@ modules = [
[glib_base, "glib2"],
[cairo_gobject_base, "cairo-gobject"],
[gobject_introspection_base, "gobject-introspection"],
+ [gdk_pixbuf2_base, "gdk_pixbuf2"],
[clutter_base, "clutter"],
[gstreamer_base, "gstreamer"],
[clutter_gstreamer_base, "clutter-gst"],
@@ -66,4 +68,11 @@ rescue GLib::Error
exit(true)
end
+begin
+ Clutter.init
+rescue Clutter::InitError
+ puts("Omit because initialization is failed: #{$!.message}")
+ exit(true)
+end
+
exit Test::Unit::AutoRunner.run(true, File.join(clutter_gstreamer_base, "test"))
diff --git a/clutter-gtk/lib/clutter-gtk.rb b/clutter-gtk/lib/clutter-gtk.rb
index a8b3e58..71e1967 100644
--- a/clutter-gtk/lib/clutter-gtk.rb
+++ b/clutter-gtk/lib/clutter-gtk.rb
@@ -50,10 +50,10 @@ module ClutterGtk
end
end
- class Loader < GObjectIntrospection::Loader
- class InitError < StandardError
- end
+ class InitError < StandardError
+ end
+ class Loader < GObjectIntrospection::Loader
NAMESPACE = "GtkClutter"
def initialize(base_module, init_arguments)
diff --git a/clutter-gtk/sample/events.rb b/clutter-gtk/sample/events.rb
index 475fd24..67b509b 100755
--- a/clutter-gtk/sample/events.rb
+++ b/clutter-gtk/sample/events.rb
@@ -90,7 +90,7 @@ clutter_embed.signal_connect("leave-notify-event") do |widget|
end
# Create the main texture that the spin buttons manipulate
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)));
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)));
hand = ClutterGtk::Texture.new
hand.from_pixbuf = pixbuf
stage.add_child(hand)
diff --git a/clutter-gtk/sample/test.rb b/clutter-gtk/sample/test.rb
index f6643a2..964edb6 100755
--- a/clutter-gtk/sample/test.rb
+++ b/clutter-gtk/sample/test.rb
@@ -34,7 +34,7 @@ RADIUS = 150
fade_p = false
fullscreen_p = false
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)))
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)))
window = Gtk::Window.new
window.set_default_size(WINDOW_WIDTH, WINDOW_HEIGHT)
diff --git a/clutter-gtk/sample/window-test.rb b/clutter-gtk/sample/window-test.rb
index 0b67997..b11c9cf 100755
--- a/clutter-gtk/sample/window-test.rb
+++ b/clutter-gtk/sample/window-test.rb
@@ -36,7 +36,7 @@ window.set_default_size(400, 300)
NAME_COLUMN = 0
PIXBUF_COLUMN = 1
-store = Gtk::ListStore.new(String, Gdk::Pixbuf)
+store = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
theme = Gtk::IconTheme.default
[
"devhelp",
@@ -53,7 +53,7 @@ theme = Gtk::IconTheme.default
iter[1] = pixbuf
end
-icon_view = Gtk::IconView.new(store)
+icon_view = Gtk::IconView.new(:model => store)
icon_view.text_column = NAME_COLUMN
icon_view.pixbuf_column = PIXBUF_COLUMN
diff --git a/clutter-gtk/sample/window-test2.rb b/clutter-gtk/sample/window-test2.rb
index 8a487d8..c4aeb70 100755
--- a/clutter-gtk/sample/window-test2.rb
+++ b/clutter-gtk/sample/window-test2.rb
@@ -59,7 +59,7 @@ add_button = lambda do |stock_id, row|
allocation = image.allocation
# replace the icon itself
- blank = Gdk::Pixbuf.new(:colorspace => :rgb,
+ blank = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
:has_alpha => true,
:bits_per_sample => 8,
:width => allocation.width,
diff --git a/clutter-gtk/test/run-test.rb b/clutter-gtk/test/run-test.rb
index 743774d..b2401e3 100755
--- a/clutter-gtk/test/run-test.rb
+++ b/clutter-gtk/test/run-test.rb
@@ -76,6 +76,13 @@ rescue GLib::Error
exit(true)
end
+begin
+ ClutterGtk.init
+rescue ClutterGtk::InitError
+ puts("Omit because initialization is failed: #{$!.message}")
+ exit(true)
+end
+
# exclude sample/test-*
clutter_gtk_test_base = File.join(clutter_gtk_base, "test")
exit Test::Unit::AutoRunner.run(true, clutter_gtk_test_base)
diff --git a/clutter/Rakefile b/clutter/Rakefile
index 179b8ce..6dde4a7 100644
--- a/clutter/Rakefile
+++ b/clutter/Rakefile
@@ -95,7 +95,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "json-glib",
:download_site => :gnome,
:label => "JSON-GLib",
- :version => "1.2.0",
+ :version => "1.2.2",
:compression_method => "xz",
:windows => {
:configure_args => [
diff --git a/clutter/lib/clutter.rb b/clutter/lib/clutter.rb
index 8df36f7..c82f9ee 100644
--- a/clutter/lib/clutter.rb
+++ b/clutter/lib/clutter.rb
@@ -67,10 +67,10 @@ module Clutter
end
end
- class Loader < GObjectIntrospection::Loader
- class InitError < StandardError
- end
+ class InitError < StandardError
+ end
+ class Loader < GObjectIntrospection::Loader
NAMESPACE = "Clutter"
def initialize(base_module, init_arguments)
diff --git a/clutter/sample/bin-layout.rb b/clutter/sample/bin-layout.rb
index da9ea6e..c8b5a87 100755
--- a/clutter/sample/bin-layout.rb
+++ b/clutter/sample/bin-layout.rb
@@ -118,7 +118,7 @@ box.signal_connect("transitions-completed") do |actor|
canvas.set_size(actor.width, actor.height)
end
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)))
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)))
image = Clutter::Image.new
image.set_data(pixbuf.pixels,
pixbuf.has_alpha? ? :rgba_8888 : :rgb_888,
diff --git a/clutter/sample/image-content.rb b/clutter/sample/image-content.rb
index 811668f..84a780a 100755
--- a/clutter/sample/image-content.rb
+++ b/clutter/sample/image-content.rb
@@ -48,7 +48,7 @@ box.margin_left = 12
box.add_constraint(Clutter::BindConstraint.new(stage, :size, 0.0))
stage.add_child(box)
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)))
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)))
image = Clutter::Image.new
image.set_data(pixbuf.pixels,
pixbuf.has_alpha? ? :rgba_8888 : :rgb_888,
diff --git a/clutter/sample/pan-action.rb b/clutter/sample/pan-action.rb
index 52356aa..87cba77 100755
--- a/clutter/sample/pan-action.rb
+++ b/clutter/sample/pan-action.rb
@@ -38,7 +38,7 @@ scroll.add_constraint(Clutter::BindConstraint.new(stage, :size, 0))
content = Clutter::Actor.new
content.set_size(720, 720)
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)))
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)))
image = Clutter::Image.new
image.set_data(pixbuf.pixels,
pixbuf.has_alpha? ? :rgba_8888 : :rgb_888,
diff --git a/clutter/test/run-test.rb b/clutter/test/run-test.rb
index 84f6c82..d4f54a9 100755
--- a/clutter/test/run-test.rb
+++ b/clutter/test/run-test.rb
@@ -60,6 +60,11 @@ rescue GLib::Error
exit(true)
end
-Clutter.init
+begin
+ Clutter.init
+rescue Clutter::InitError
+ puts("Omit because initialization is failed: #{$!.message}")
+ exit(true)
+end
exit Test::Unit::AutoRunner.run(true, File.join(clutter_base, "test"))
diff --git a/extconf.rb b/extconf.rb
index dda9490..79ec930 100644
--- a/extconf.rb
+++ b/extconf.rb
@@ -24,6 +24,7 @@ priorlibs = [
]
unsupported_libraries = [
+ "gdk_pixbuf2-no-gi",
"gdk3-no-gi",
"gtk3-no-gi",
"gtksourceview3-no-gi",
diff --git a/gdk3/Rakefile b/gdk3/Rakefile
index 0b74d95..786d354 100644
--- a/gdk3/Rakefile
+++ b/gdk3/Rakefile
@@ -59,7 +59,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "gtk+",
:download_site => :gnome,
:label => "GTK+",
- :version => "3.20.2",
+ :version => "3.20.8",
:compression_method => "xz",
:windows => {
:configure_args => [
@@ -92,6 +92,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:version => "3.20",
:compression_method => "xz",
:windows => {
+ :use_gobject_introspection => false,
:configure_args => [],
:build_concurrently => false,
:built_file => "share/icons/Adwaita/index.theme",
diff --git a/gdk3/lib/gdk3/deprecated.rb b/gdk3/lib/gdk3/deprecated.rb
index 77c5116..6048c38 100644
--- a/gdk3/lib/gdk3/deprecated.rb
+++ b/gdk3/lib/gdk3/deprecated.rb
@@ -18,7 +18,7 @@ module Gdk
extend GLib::Deprecatable
define_deprecated_enums :GrabStatus, 'GRAB'
define_deprecated_enums :Status
- define_deprecated_const :Image, :raise => "Use 'Gdk::Pixbuf' or 'Cairo::Surface' instead."
+ define_deprecated_const :Image, :raise => "Use 'GdkPixbuf::Pixbuf' or 'Cairo::Surface' instead."
define_deprecated_const :Colormap, :raise => "Use 'Gdk::Visual' instead."
define_deprecated_const :Input, :raise => "Use 'GLib::IOChannel' instead."
define_deprecated_const :X11, 'GdkX11'
@@ -143,10 +143,10 @@ module Gdk
define_deprecated_method :initialize, :raise => "Use 'Gdk::Window#create_similar_surface'."
define_deprecated_singleton_method :create_from_data, :raise => "Use 'Cairo::ImageSurface.new'."
define_deprecated_singleton_method :create_from_xbm, :raise => "Use 'Cairo::ImageSurface.new'."
- define_deprecated_singleton_method :create_from_xpm, :raise => "Use 'Gdk::Pixbuf.new'."
- define_deprecated_singleton_method :create_from_xpm_d, :raise => "Use 'Gdk::Pixbuf.new'."
- define_deprecated_singleton_method :colormap_create_from_xpm, :raise => "Use 'Gdk::Pixbuf.new'."
- define_deprecated_singleton_method :colormap_create_from_xpm_d, :raise => "Use 'Gdk::Pixbuf.new'."
+ define_deprecated_singleton_method :create_from_xpm, :raise => "Use 'GdkPixbuf::Pixbuf.new'."
+ define_deprecated_singleton_method :create_from_xpm_d, :raise => "Use 'GdkPixbuf::Pixbuf.new'."
+ define_deprecated_singleton_method :colormap_create_from_xpm, :raise => "Use 'GdkPixbuf::Pixbuf.new'."
+ define_deprecated_singleton_method :colormap_create_from_xpm_d, :raise => "Use 'GdkPixbuf::Pixbuf.new'."
define_deprecated_singleton_method :foreign_new, :raise => "Don't use this method."
define_deprecated_singleton_method :lookup, :raise => "Don't use this method."
end
diff --git a/gdk3/test/test-gdk-cursor.rb b/gdk3/test/test-gdk-cursor.rb
index 8f8e596..93b3b88 100644
--- a/gdk3/test/test-gdk-cursor.rb
+++ b/gdk3/test/test-gdk-cursor.rb
@@ -24,7 +24,7 @@ class TestGdkCursor < Test::Unit::TestCase
end
test "pixbuf" do
- pixbuf = Gdk::Pixbuf.new(:file => fixture_path("ruby-gnome2-logo.png"))
+ pixbuf = GdkPixbuf::Pixbuf.new(:file => fixture_path("ruby-gnome2-logo.png"))
cursor = Gdk::Cursor.new(pixbuf, 0, 0)
assert_equal(Gdk::CursorType::CURSOR_IS_PIXMAP, cursor.cursor_type)
end
diff --git a/gdk_pixbuf2-no-gi/COPYING.LIB b/gdk_pixbuf2-no-gi/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/gdk_pixbuf2-no-gi/COPYING.LIB
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, 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 library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+ 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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+ If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be 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.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+ 9. 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 Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+ 11. 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 Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. 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.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/gdk_pixbuf2/README b/gdk_pixbuf2-no-gi/README
similarity index 100%
copy from gdk_pixbuf2/README
copy to gdk_pixbuf2-no-gi/README
diff --git a/gdk_pixbuf2/Rakefile b/gdk_pixbuf2-no-gi/Rakefile
similarity index 100%
copy from gdk_pixbuf2/Rakefile
copy to gdk_pixbuf2-no-gi/Rakefile
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/depend b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/depend
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/depend
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/depend
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/extconf.rb b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/extconf.rb
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/extconf.rb
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/extconf.rb
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/gdk_pixbuf2.def b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/gdk_pixbuf2.def
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/gdk_pixbuf2.def
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/gdk_pixbuf2.def
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf-format.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf-format.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf-format.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf-format.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf.h b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf.h
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf.h
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf.h
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf2private.h b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf2private.h
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf2private.h
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf2private.h
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufanimation.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufanimation.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufanimation.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufanimation.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixdata.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixdata.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixdata.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixdata.c
diff --git a/gdk_pixbuf2/extconf.rb b/gdk_pixbuf2-no-gi/extconf.rb
similarity index 100%
rename from gdk_pixbuf2/extconf.rb
rename to gdk_pixbuf2-no-gi/extconf.rb
diff --git a/gdk_pixbuf2/lib/gdk_pixbuf2.rb b/gdk_pixbuf2-no-gi/lib/gdk_pixbuf2.rb
similarity index 100%
copy from gdk_pixbuf2/lib/gdk_pixbuf2.rb
copy to gdk_pixbuf2-no-gi/lib/gdk_pixbuf2.rb
diff --git a/gdk_pixbuf2/sample/anim.rb b/gdk_pixbuf2-no-gi/sample/anim.rb
similarity index 100%
copy from gdk_pixbuf2/sample/anim.rb
copy to gdk_pixbuf2-no-gi/sample/anim.rb
diff --git a/gdk_pixbuf2/sample/composite.rb b/gdk_pixbuf2-no-gi/sample/composite.rb
similarity index 100%
copy from gdk_pixbuf2/sample/composite.rb
copy to gdk_pixbuf2-no-gi/sample/composite.rb
diff --git a/gdk_pixbuf2/sample/flip.rb b/gdk_pixbuf2-no-gi/sample/flip.rb
similarity index 100%
copy from gdk_pixbuf2/sample/flip.rb
copy to gdk_pixbuf2-no-gi/sample/flip.rb
diff --git a/gdk_pixbuf2-no-gi/sample/floppybuddy.gif b/gdk_pixbuf2-no-gi/sample/floppybuddy.gif
new file mode 100644
index 0000000..ac986c8
Binary files /dev/null and b/gdk_pixbuf2-no-gi/sample/floppybuddy.gif differ
diff --git a/gdk_pixbuf2/sample/format.rb b/gdk_pixbuf2-no-gi/sample/format.rb
similarity index 100%
copy from gdk_pixbuf2/sample/format.rb
copy to gdk_pixbuf2-no-gi/sample/format.rb
diff --git a/gdk_pixbuf2-no-gi/sample/gnome-foot.png b/gdk_pixbuf2-no-gi/sample/gnome-foot.png
new file mode 100644
index 0000000..0476658
Binary files /dev/null and b/gdk_pixbuf2-no-gi/sample/gnome-foot.png differ
diff --git a/gdk_pixbuf2/sample/inline.rb b/gdk_pixbuf2-no-gi/sample/inline.rb
similarity index 100%
rename from gdk_pixbuf2/sample/inline.rb
rename to gdk_pixbuf2-no-gi/sample/inline.rb
diff --git a/gdk_pixbuf2/sample/loader.rb b/gdk_pixbuf2-no-gi/sample/loader.rb
similarity index 100%
copy from gdk_pixbuf2/sample/loader.rb
copy to gdk_pixbuf2-no-gi/sample/loader.rb
diff --git a/gdk_pixbuf2/sample/pixdata.rb b/gdk_pixbuf2-no-gi/sample/pixdata.rb
similarity index 100%
rename from gdk_pixbuf2/sample/pixdata.rb
rename to gdk_pixbuf2-no-gi/sample/pixdata.rb
diff --git a/gdk_pixbuf2/sample/rotate.rb b/gdk_pixbuf2-no-gi/sample/rotate.rb
similarity index 100%
copy from gdk_pixbuf2/sample/rotate.rb
copy to gdk_pixbuf2-no-gi/sample/rotate.rb
diff --git a/gdk_pixbuf2/sample/save.rb b/gdk_pixbuf2-no-gi/sample/save.rb
similarity index 100%
copy from gdk_pixbuf2/sample/save.rb
copy to gdk_pixbuf2-no-gi/sample/save.rb
diff --git a/gdk_pixbuf2/sample/scale.rb b/gdk_pixbuf2-no-gi/sample/scale.rb
similarity index 100%
copy from gdk_pixbuf2/sample/scale.rb
copy to gdk_pixbuf2-no-gi/sample/scale.rb
diff --git a/gdk_pixbuf2/sample/simpleanim.rb b/gdk_pixbuf2-no-gi/sample/simpleanim.rb
similarity index 100%
copy from gdk_pixbuf2/sample/simpleanim.rb
copy to gdk_pixbuf2-no-gi/sample/simpleanim.rb
diff --git a/gdk_pixbuf2/sample/utils.rb b/gdk_pixbuf2-no-gi/sample/utils.rb
similarity index 100%
copy from gdk_pixbuf2/sample/utils.rb
copy to gdk_pixbuf2-no-gi/sample/utils.rb
diff --git a/gdk_pixbuf2/sample/xpm.rb b/gdk_pixbuf2-no-gi/sample/xpm.rb
similarity index 100%
copy from gdk_pixbuf2/sample/xpm.rb
copy to gdk_pixbuf2-no-gi/sample/xpm.rb
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gdk_pixbuf2-no-gi/test/gdk_pixbuf2-test-utils.rb
similarity index 100%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gdk_pixbuf2-no-gi/test/gdk_pixbuf2-test-utils.rb
diff --git a/gdk_pixbuf2/test/run-test.rb b/gdk_pixbuf2-no-gi/test/run-test.rb
similarity index 100%
copy from gdk_pixbuf2/test/run-test.rb
copy to gdk_pixbuf2-no-gi/test/run-test.rb
diff --git a/gdk_pixbuf2/test/test-version.rb b/gdk_pixbuf2-no-gi/test/test-version.rb
similarity index 100%
rename from gdk_pixbuf2/test/test-version.rb
rename to gdk_pixbuf2-no-gi/test/test-version.rb
diff --git a/gdk_pixbuf2/README b/gdk_pixbuf2/README.md
similarity index 72%
rename from gdk_pixbuf2/README
rename to gdk_pixbuf2/README.md
index 83e0c14..9ae8a79 100644
--- a/gdk_pixbuf2/README
+++ b/gdk_pixbuf2/README.md
@@ -10,7 +10,7 @@ Requirements
Install
-------
- 0. install ruby-1.9.x or later, GTK+, Ruby/GLib2 and Ruby/GTK2.
+ 0. install ruby-2.1.x or later, GTK+, Ruby/GLib2 and Ruby/GTK2.
1. ruby extconf.rb
2. make
3. su
@@ -18,12 +18,13 @@ Install
Copying
-------
- Copyright (c) 2002-2005 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is free software.
You can distribute/modify this program under the terms of
the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
-Project Website
----------------
+Project Websites
+----------------
http://ruby-gnome2.sourceforge.jp/
+ https://github.com/ruby-gnome2/ruby-gnome2
diff --git a/gdk_pixbuf2/Rakefile b/gdk_pixbuf2/Rakefile
index 7e32f75..6556817 100644
--- a/gdk_pixbuf2/Rakefile
+++ b/gdk_pixbuf2/Rakefile
@@ -1,6 +1,6 @@
# -*- ruby -*-
#
-# Copyright (C) 2011-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
diff --git a/gdk_pixbuf2/lib/gdk_pixbuf2.rb b/gdk_pixbuf2/lib/gdk_pixbuf2.rb
index 401fdf4..3fbf8ad 100644
--- a/gdk_pixbuf2/lib/gdk_pixbuf2.rb
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,80 +14,22 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-require "glib2"
+require "gobject-introspection"
+require "gio2"
base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
vendor_dir = base_dir + "vendor" + "local"
vendor_bin_dir = vendor_dir + "bin"
GLib.prepend_dll_path(vendor_bin_dir)
+vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
+GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
-if vendor_dir.exist?
- require "cairo"
-end
+require "gdk_pixbuf2/loader"
-begin
- major, minor, _ = RUBY_VERSION.split(/\./)
- require "#{major}.#{minor}/gdk_pixbuf2.so"
-rescue LoadError
- require "gdk_pixbuf2.so"
-end
+module GdkPixbuf
+ LOG_DOMAIN = "GdkPixbuf"
+ GLib::Log.set_log_domain(LOG_DOMAIN)
-if vendor_dir.exist?
- begin
- require "gobject-introspection"
- vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
- GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
- rescue LoadError
- end
+ loader = Loader.new(self)
+ loader.load("GdkPixbuf")
end
-
-module Gdk
- class PixbufLoader
- def self.open(type = nil, mime_type = false)
- loader = Gdk::PixbufLoader.new(type, mime_type)
- if block_given?
- begin
- yield(loader)
- ensure
- loader.close
- end
- end
- loader
- end
- end
-
- class Pixbuf
- LOG_DOMAIN = "GdkPixbuf"
-
- class << self
- def cairo_available?
- if Gdk.respond_to?(:cairo_available?)
- Gdk.cairo_available?
- else
- false
- end
- end
- end
-
- module Version
- MAJOR = Gdk::Pixbuf::MAJOR
- MINOR = Gdk::Pixbuf::MINOR
- MICRO = Gdk::Pixbuf::MICRO
- STRING = "#{MAJOR}.#{MINOR}.#{MICRO}"
-
- class << self
- def or_later?(major, minor, micro=nil)
- micro ||= 0
- version = [
- MAJOR,
- MINOR,
- MICRO,
- ]
- (version <=> [major, minor, micro]) >= 0
- end
- end
- end
- end
-end
-
-GLib::Log.set_log_domain(Gdk::Pixbuf::LOG_DOMAIN)
diff --git a/gdk_pixbuf2/lib/gdk_pixbuf2/deprecated.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/deprecated.rb
new file mode 100644
index 0000000..08f92ff
--- /dev/null
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/deprecated.rb
@@ -0,0 +1,160 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+module GdkPixbuf
+ class Pixbuf
+ extend GLib::Deprecatable
+
+ define_deprecated_enums "Colorspace", "COLORSPACE"
+ define_deprecated_enums "InterpType", "INTERP"
+ define_deprecated_enums "PixbufRotation", "ROTATE"
+
+ class << self
+ def new(*args, &block)
+ if args[0].is_a?(Pixbuf)
+ message = "#{caller[0]}: #{self}.new(pixbuf, ...) is deprecated. "
+ message << "Use pixbuf.new_subpixbuf(...) instead."
+ warn(message)
+ args[0].new_subpixbuf(*args[1..-1])
+ elsif args.size == 1 and args[0].is_a?(Hash)
+ options = args[0]
+ src_pixbuf = options[:src_pixbuf]
+ if src_pixbuf
+ message = "#{caller[0]}: "
+ message << "#{self}.new(:src_pixbuf => pixbuf, ...) is deprecated. "
+ message << "Use pixbuf.new_subpixbuf(...) instead."
+ warn(message)
+ src_pixbuf.new_subpixbuf(options[:src_x],
+ options[:src_y],
+ options[:width],
+ options[:height])
+ else
+ super
+ end
+ else
+ super
+ end
+ end
+ end
+
+ define_deprecated_method_by_hash_args :composite,
+ "dest_width, " +
+ "dest_height, " +
+ "interpolation_type, " +
+ "overall_alpha, " +
+ "check_size, " +
+ "color1, " +
+ "color2",
+ ":dest_width => dest_width, " +
+ ":dest_height => dest_height, " +
+ ":interpolation_type => interpolation_type, " +
+ ":overall_alpha => overall_alpha, " +
+ ":check_size => check_size, " +
+ ":color1 => color1, " +
+ ":color2 => color2" do |*args|
+ [
+ :dest_width => args[1],
+ :dest_height => args[2],
+ :interpolation_type => args[3],
+ :overall_alpha => args[4],
+ :check_size => args[5],
+ :color1 => args[6],
+ :color2 => args[7],
+ ]
+ end
+
+ define_deprecated_method_by_hash_args :composite!,
+ "source, " +
+ "dest_x, " +
+ "dest_y, " +
+ "dest_width, " +
+ "dest_height, " +
+ "offset_x, " +
+ "offset_y, " +
+ "scale_x, " +
+ "scale_y, " +
+ "interpolation_type, " +
+ "overall_alpha, " +
+ "check_x=0, " +
+ "check_y=0, " +
+ "check_size=nil, " +
+ "color1=0x999999, " +
+ "color2=0xdddddd",
+ "source, " +
+ ":dest_x => dest_x, " +
+ ":dest_y => dest_y, " +
+ ":dest_width => dest_width, " +
+ ":dest_height => dest_height, " +
+ ":offset_x => offset_x, " +
+ ":offset_y => offset_y, " +
+ ":scale_x => scale_x, " +
+ ":scale_y => scale_y, " +
+ ":interpolation_type => interpolation_type, " +
+ ":overall_alpha => overall_alpha, " +
+ ":check_x => check_x, " +
+ ":check_y => check_y, " +
+ ":check_size => check_size, " +
+ ":color1 => color1, " +
+ ":color2 => color2",
+ 1 do |*args|
+ [
+ args[1],
+ :dest_x => args[2],
+ :dest_y => args[3],
+ :dest_width => args[4],
+ :dest_height => args[5],
+ :offset_x => args[6],
+ :offset_y => args[7],
+ :scale_x => args[8],
+ :scale_y => args[9],
+ :interpolation_type => args[10],
+ :overall_alpha => args[11],
+ :check_x => args[12],
+ :check_y => args[13],
+ :check_size => args[14],
+ :color1 => args[15],
+ :color2 => args[16],
+ ]
+ end
+ end
+
+ class PixbufFormat
+ extend GLib::Deprecatable
+
+ define_deprecated_method "domain", :raise => "Don't use this method anymore."
+ define_deprecated_method "signature", :raise => "Don't use this method anymore."
+ end
+
+ class Pixdata
+ extend GLib::Deprecatable
+
+ unless respond_to?(:from_pixbuf)
+ define_deprecated_singleton_method :from_pixbuf,
+ :raise => "Use Gio::Resource instead"
+ end
+ end
+end
+
+module Gdk
+ extend GLib::Deprecatable
+
+ define_deprecated_const :Pixbuf, "GdkPixbuf::Pixbuf"
+ define_deprecated_const :PixbufAnimation, "GdkPixbuf::PixbufAnimation"
+ define_deprecated_const :PixbufLoader, "GdkPixbuf::PixbufLoader"
+ define_deprecated_const :PixbufSimpleAnim, "GdkPixbuf::PixbufSimpleAnim"
+ define_deprecated_const :Pixdata, "GdkPixbuf::Pixdata"
+ define_deprecated_const :PixbufError, "GdkPixbuf::PixbufError"
+end
diff --git a/gio2/lib/gio2/application-command-line.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/loader.rb
similarity index 51%
copy from gio2/lib/gio2/application-command-line.rb
copy to gdk_pixbuf2/lib/gdk_pixbuf2/loader.rb
index c739064..2812747 100644
--- a/gio2/lib/gio2/application-command-line.rb
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/loader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,23 +14,38 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-module Gio
- class ApplicationCommandLine
- def initialize(properties=nil)
- if properties
- arguments = properties[:arguments]
- if arguments and !arguments.is_a?(GLib::Variant)
- arguments = GLib::Variant.new(arguments,
- GLib::VariantType::BYTESTRING_ARRAY)
- properties = properties.merge(:arguments => arguments)
- end
- end
- super(properties)
+require "English"
+
+module GdkPixbuf
+ class Loader < GObjectIntrospection::Loader
+ private
+ def pre_load(repository, namespace)
+ end
+
+ def post_load(repository, namespace)
+ require_libraries
end
- alias_method :arguments_raw, :arguments
- def arguments
- arguments_raw[0]
+ def require_libraries
+ require "gdk_pixbuf2/pixbuf"
+ require "gdk_pixbuf2/pixbuf-loader"
+
+ require "gdk_pixbuf2/deprecated"
+
+ require "gdk_pixbuf2/version"
+ end
+
+ def initialize_post(object)
+ super
+ return unless object.is_a?(GLib::Object)
+ self.class.reference_gobject(object, :sink => true)
+ end
+
+ def define_constant(name, info)
+ if /PIXBUF_/ =~ name
+ name = $POSTMATCH
+ end
+ super(name, info)
end
end
end
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf-loader.rb
similarity index 82%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf-loader.rb
index fdb6ee3..2650900 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf-loader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,11 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-require "test-unit"
-
-module GdkPixbufTestUtils
+module GdkPixbuf
+ class PixbufLoader
+ def last_write(data)
+ write(data)
+ close
+ end
+ end
end
diff --git a/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf.rb
new file mode 100644
index 0000000..ab18289
--- /dev/null
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf.rb
@@ -0,0 +1,282 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+module GdkPixbuf
+ class Pixbuf
+ alias_method :initialize_raw, :initialize
+
+ def initialize(*args)
+ case args.size
+ when 1
+ case args[0]
+ when Hash
+ initialize_with_hash(args[0])
+ when String
+ message = "#{caller[0]}: #{self.class}.new(path) is deprecated. "
+ message << "Use #{self.class}.new(:file => path) instead."
+ warn message
+ initialize_raw(args[0])
+ when Array
+ message = "#{caller[0]}: #{self.class}.new(xpm) is deprecated. "
+ message << "Use #{self.class}.new(:xpm => xpm) instead."
+ warn message
+ initialize_new_from_xpm_data(args[0])
+ else
+ raise ArgumentError, "must be options: #{args[0].inspect}"
+ end
+ when 2
+ message = "#{caller[0]}: "
+ message << "#{self.class}.new(data, copy_pixels) is deprecated. "
+ message << "Use Gio::Resource instead."
+ warn message
+ initialize_from_inline(*args)
+ when 3
+ message = "#{caller[0]}: "
+ message << "#{self.class}.new(path, width, height) is deprecated. "
+ message << "Use #{self.class}.new(:file => path, :width => width, "
+ message << ":height => height) instead."
+ warn message
+ initialize_new_from_file_at_size(*args)
+ when 4
+ message = "#{caller[0]}: "
+ message << "#{self.class}.new(path, width, height, "
+ message << "preserve_aspect_ratio) is deprecated. "
+ message << "Use #{self.class}.new(:file => path, :width => width, "
+ message << ":height => height, "
+ message << ":preserve_aspect_ratio => preserve_aspect_ratio) instead."
+ warn message
+ initialize_new_from_file_at_scale(*args)
+ when 5
+ message = "#{caller[0]}: "
+ message << "#{self.class}.new(colorspace, has_alpha, bits_per_sample, "
+ message << "width, height) is deprecated."
+ message << "Use #{self.class}.new(:colorspace => colorspace, "
+ message << ":has_alpha => has_alpha, "
+ message << ":bits_per_sample => bits_per_sample, "
+ message << ":width => width, "
+ message << ":height => height) instead."
+ warn message
+ initialize_new(*args)
+ when 7
+ message = "#{caller[0]}: "
+ message << "#{self.class}.new(data, colorspace, has_alpha, "
+ message << "bits_per_sample, width, height) is deprecated."
+ message << "Use #{self.class}.new(:data => data, "
+ message << ":colorspace => colorspace, "
+ message << ":has_alpha => has_alpha, "
+ message << ":bits_per_sample => bits_per_sample, "
+ message << ":width => width, "
+ message << ":height => height) instead."
+ warn message
+ initialize_new_from_data(*args)
+ else
+ super
+ end
+ end
+
+ def initialize_with_hash(options)
+ colorspace = options[:colorspace] || GdkPixbuf::Colorspace::RGB
+ has_alpha = options[:has_alpha]
+ has_alpha = false if has_alpha.nil?
+ bits_per_sample = options[:bits_per_sample] || 8
+ row_stride = options[:row_stride] || 0
+ data = options[:data] || nil
+ bytes = options[:bytes] || nil
+ xpm = options[:xpm] || nil
+ file = options[:file] || nil
+ # stream = options[:stream] || nil
+ resource = options[:resource] || nil
+ width = options[:width] || nil
+ height = options[:height] || nil
+ size = true if width && height
+ scale = options[:scale] || nil
+ preserve_aspect_ratio = options[:preserve_aspect_ratio]
+ preserve_aspect_ratio = true if preserve_aspect_ratio.nil?
+
+ if file && size && scale
+ initialize_new_from_file_at_scale(file, width, height,
+ preserve_aspect_ratio)
+ elsif file && size && !scale
+ initialize_new_from_file_at_size(file, width, height)
+ elsif file && !size
+ initialize_new_from_file(file)
+ elsif resource && size && scale
+ initialize_new_from_resource_at_scale(resource, width, height,
+ preserve_aspect_ratio)
+ elsif resource && !scale
+ initialize_new_from_resource(resource)
+ elsif data && size
+ initialize_new_from_data(data, colorspace, has_alpha, bits_per_sample,
+ width, height, row_stride)
+ elsif bytes && size
+ initialize_new_from_bytes(bytes, colorspace, has_alpha, bits_per_sample,
+ width, height, row_stride)
+
+ elsif xpm
+ initialize_new_from_xpm_data(xpm)
+ elsif size
+ initialize_raw(colorspace, has_alpha, bits_per_sample, width, height)
+ else
+ message =
+ "must specify :file, :resource, :data, :bytes, :xpm, :width or :height"
+ raise ArgumentError, message
+ end
+ # https://developer.gnome.org/gdk-pixbuf/2.33/gdk-pixbuf-Image-Data-in-Memory.html
+ # gdk_pixbuf_new done
+ # gdk_pixbuf_new_from_bytes done
+ # gdk_pixbuf_new_from_data done
+ # gdk_pixbuf_new_from_xpm_data done
+ # gdk_pixbuf_new_subpixbuf
+ # https://developer.gnome.org/gdk-pixbuf/2.33/gdk-pixbuf-File-Loading.html
+ # gdk_pixbuf_new_from_file done
+ # gdk_pixbuf_new_from_file_at_size done
+ # gdk_pixbuf_new_from_file_at_scale done
+ # gdk_pixbuf_get_file_info
+ # gdk_pixbuf_get_file_info_async
+ # gdk_pixbuf_get_file_info_finish
+ # gdk_pixbuf_new_from_resource done
+ # gdk_pixbuf_new_from_resource_at_scale done
+ # gdk_pixbuf_new_from_stream
+ # gdk_pixbuf_new_from_stream_async
+ # gdk_pixbuf_new_from_stream_finish
+ # gdk_pixbuf_new_from_stream_at_scale
+ # gdk_pixbuf_new_from_stream_at_scale_async
+ end
+ private :initialize_with_hash
+
+ def dup
+ copy
+ end
+
+ def fill!(pixel)
+ fill(pixel)
+ end
+
+ def rotate(angle)
+ rotate_simple(angle)
+ end
+
+ alias_method :saturate_and_pixelate_raw, :saturate_and_pixelate
+ def saturate_and_pixelate(saturation, pixelate)
+ dest = dup
+ saturate_and_pixelate_raw(dest, saturation, pixelate)
+ dest
+ end
+
+ # TODO: test
+ # TODO: Improve API by Hash
+ def save(filename, type, options={})
+ keys = []
+ values = []
+ options.each do |key, value|
+ keys << key
+ values << value
+ end
+ savev(filename, type, keys, values)
+ end
+
+ alias_method :scale_raw, :scale
+ # TODO: test
+ # TODO: Improve API by Hash
+ def scale(*args)
+ case args.size
+ when 2, 3
+ width, height, interp_type = args
+ interp_type ||= :bilinear
+ scale_simple(width, height, interp_type)
+ else
+ scale_raw(*args)
+ end
+ end
+
+ # TODO: test
+ # TODO: Improve API by Hash
+ def scale!(source, *args)
+ if args.size == 8
+ args << :bilinear
+ end
+ source.scale_raw(self, *args)
+ end
+
+ alias_method :composite_raw, :composite
+ def composite(options)
+ destination = options[:destination] || options[:dest]
+ dest_x = options[:destination_x] || options[:dest_x] || 0
+ dest_y = options[:destination_y] || options[:dest_y] || 0
+ dest_width = options[:destination_width] || options[:dest_width]
+ dest_height = options[:destination_height] || options[:dest_height]
+
+ destination ||= Pixbuf.new(colorspace,
+ has_alpha?,
+ bits_per_sample,
+ dest_x + dest_width,
+ dest_y + dest_height)
+ destination.composite!(self, options)
+ destination
+ end
+
+ def composite!(source, options)
+ dest_x = options[:destination_x] || options[:dest_x] || 0
+ dest_y = options[:destination_y] || options[:dest_y] || 0
+ dest_width = options[:destination_width] || options[:dest_width]
+ dest_height = options[:destination_height] || options[:dest_height]
+ offset_x = options[:offset_x] || 0.0
+ offset_y = options[:offset_y] || 0.0
+ scale_x = options[:scale_x] || (dest_width / source.width.to_f)
+ scale_y = options[:scale_y] || (dest_height / source.height.to_f)
+ interpolation_type = options[:interpolation_type] ||
+ options[:interp_type] ||
+ :bilinear
+ overall_alpha = options[:overall_alpha] || 255
+ check_x = options[:check_x] || 0
+ check_y = options[:check_y] || 0
+ check_size = options[:check_size]
+ color1 = options[:color1] || 0x999999
+ color2 = options[:color2] || 0xdddddd
+
+ if check_size
+ source.composite_color(self,
+ dest_x,
+ dest_y,
+ dest_width,
+ dest_height,
+ offset_x,
+ offset_y,
+ scale_x,
+ scale_y,
+ interpolation_type,
+ overall_alpha,
+ check_x,
+ check_y,
+ check_size,
+ color1,
+ color2)
+ else
+ source.composite_raw(self,
+ dest_x,
+ dest_y,
+ dest_width,
+ dest_height,
+ offset_x,
+ offset_y,
+ scale_x,
+ scale_y,
+ interpolation_type,
+ overall_alpha)
+ end
+ end
+ end
+end
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/version.rb
similarity index 68%
copy from gobject-introspection/lib/gobject-introspection/arg-info.rb
copy to gdk_pixbuf2/lib/gdk_pixbuf2/version.rb
index 88d785d..9f557ea 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/version.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,14 +14,20 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-module GObjectIntrospection
- class ArgInfo
- def gclosure?
- type_info = type
- return false if type_info.tag != TypeTag::INTERFACE
+module GdkPixbuf
+ module Version
+ STRING = [MAJOR, MINOR, MICRO].join(".")
- struct_info = type_info.interface
- struct_info.gtype.name == "GClosure"
+ class << self
+ def or_later?(major, minor, micro=nil)
+ micro ||= 0
+ version = [
+ MAJOR,
+ MINOR,
+ MICRO,
+ ]
+ (version <=> [major, minor, micro]) >= 0
+ end
end
end
end
diff --git a/gdk_pixbuf2/sample/anim.rb b/gdk_pixbuf2/sample/anim.rb
old mode 100644
new mode 100755
index f6be93d..0ef1e14
--- a/gdk_pixbuf2/sample/anim.rb
+++ b/gdk_pixbuf2/sample/anim.rb
@@ -2,7 +2,7 @@
=begin
anim.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: anim.rb,v 1.5 2006/06/17 14:38:08 mutoh Exp $
@@ -16,7 +16,7 @@ w.signal_connect('delete-event') do
end
box = Gtk::VBox.new
-src = Gdk::PixbufAnimation.new("floppybuddy.gif")
+src = GdkPixbuf::PixbufAnimation.new(File.join(__dir__, "floppybuddy.gif"))
box.pack_start(Gtk::Image.new(src))
p src.width
p src.height
diff --git a/gdk_pixbuf2/sample/composite.rb b/gdk_pixbuf2/sample/composite.rb
old mode 100644
new mode 100755
index 77b45aa..414699d
--- a/gdk_pixbuf2/sample/composite.rb
+++ b/gdk_pixbuf2/sample/composite.rb
@@ -2,7 +2,7 @@
=begin
composite.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: composite.rb,v 1.6 2006/06/17 14:38:08 mutoh Exp $
@@ -16,23 +16,53 @@ unless filename
exit(1)
end
-src = Gdk::Pixbuf.new(filename)
+src = GdkPixbuf::Pixbuf.new(:file => filename)
vbox = Gtk::VBox.new
-dst = src.composite(100, 100, Gdk::Pixbuf::INTERP_HYPER,
- 200, 32, 0xFF0000, 0x00FF00)
+dst = src.composite(:dest_width => 100,
+ :dest_height => 100,
+ :interp_type => :hyper,
+ :overall_alpha => 255,
+ :check_size => 32,
+ :color1 => 0xFF0000,
+ :color2 => 0x00FF00)
vbox.pack_start(Gtk::Image.new(dst))
-dst = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 200, 200)
-dst.composite!(src, 0, 0, 200, 200, 0, 0, 1.8, 1.8,
- Gdk::Pixbuf::INTERP_HYPER, 200)
+dst = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+ :has_alpha => true,
+ :bits_per_sample => 8,
+ :width =>200,
+ :height => 200)
+dst.composite!(src,
+ :dest_width => 200,
+ :dest_height => 200,
+ :scale_x => 1.8,
+ :scale_y => 1.8,
+ :interp_type => :hyper,
+ :overall_alpha => 200)
vbox.pack_start(Gtk::Image.new(dst))
-dst = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 200, 200)
-dst.composite!(src, 10, 10, 180, 180, 15, 15, 3, 2,
- Gdk::Pixbuf::INTERP_BILINEAR, 200, 100, 100, 16,
- 0x999999, 0xdddddd)
+dst = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+ :has_alpha => true,
+ :bits_per_sample => 8,
+ :width =>200,
+ :height => 200)
+dst.composite!(src,
+ :dest_x => 10,
+ :dest_y => 10,
+ :dest_width => 180,
+ :dest_height => 180,
+ :offset_x => 15,
+ :offset_y => 15,
+ :scale_x => 3,
+ :scale_y => 2,
+ :overall_alpha => 200,
+ :check_x => 100,
+ :check_y => 100,
+ :check_size => 16,
+ :color1 => 0x999999,
+ :color2 => 0xdddddd)
vbox.pack_start(Gtk::Image.new(dst))
window = Gtk::Window.new.add(vbox)
diff --git a/gdk_pixbuf2/sample/flip.rb b/gdk_pixbuf2/sample/flip.rb
index 2391452..f56fecb 100644
--- a/gdk_pixbuf2/sample/flip.rb
+++ b/gdk_pixbuf2/sample/flip.rb
@@ -2,7 +2,7 @@
=begin
flip.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2005,2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2005-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: flip.rb,v 1.3 2006/06/17 14:38:08 mutoh Exp $
@@ -25,7 +25,7 @@ end
vbox = Gtk::VBox.new
-src = Gdk::Pixbuf.new(filename)
+src = GdkPixbuf::Pixbuf.new(:file => filename)
vbox.add(Gtk::Image.new(src))
# Horizontal
diff --git a/gdk_pixbuf2/sample/format.rb b/gdk_pixbuf2/sample/format.rb
index 5a41141..c459b72 100644
--- a/gdk_pixbuf2/sample/format.rb
+++ b/gdk_pixbuf2/sample/format.rb
@@ -2,7 +2,7 @@
=begin
format.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2004-2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2004-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: format.rb,v 1.4 2006/06/17 14:38:08 mutoh Exp $
@@ -22,14 +22,12 @@ unless filename
exit(1)
end
-puts fileinfo = Gdk::Pixbuf.get_file_info(filename)[0]
+puts fileinfo = GdkPixbuf::Pixbuf.get_file_info(filename)[0]
puts "name = #{fileinfo.name}"
puts "description = #{fileinfo.description}"
puts "mime_types = #{fileinfo.mime_types.inspect}"
puts "extensions = #{fileinfo.extensions.inspect}"
puts "writable = #{fileinfo.writable?}"
-puts "domain = #{fileinfo.domain}"
-puts "signature = #{fileinfo.signature.inspect}"
if Gtk.check_version?(2, 6, 0)
puts "Since 2.6 --- "
diff --git a/gdk_pixbuf2/sample/loader.rb b/gdk_pixbuf2/sample/loader.rb
old mode 100644
new mode 100755
index dcc797b..60f1c1b
--- a/gdk_pixbuf2/sample/loader.rb
+++ b/gdk_pixbuf2/sample/loader.rb
@@ -2,15 +2,15 @@
=begin
loader.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2003,2006: Ruby-GNOME2 Project Team
+ Copyright (c) 2003-2016: Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: loader.rb,v 1.3 2006/06/17 14:38:08 mutoh Exp $
=end
require 'gtk2'
-loader = Gdk::PixbufLoader.new
-File.open("gnome-foot.png","rb") { |f|
+loader = GdkPixbuf::PixbufLoader.new
+File.open(File.join(__dir__, "gnome-foot.png"), "rb") { |f|
loader.last_write(f.read)
}
pixbuf = loader.pixbuf
diff --git a/gdk_pixbuf2/sample/rotate.rb b/gdk_pixbuf2/sample/rotate.rb
index ea131e9..6fbd02d 100644
--- a/gdk_pixbuf2/sample/rotate.rb
+++ b/gdk_pixbuf2/sample/rotate.rb
@@ -2,7 +2,7 @@
=begin
rotate.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2005,2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2005-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: rotate.rb,v 1.3 2006/06/17 14:38:08 mutoh Exp $
@@ -25,13 +25,13 @@ end
vbox = Gtk::VBox.new
-src = Gdk::Pixbuf.new(filename)
+src = GdkPixbuf::Pixbuf.new(:file => filename)
vbox.add(Gtk::Image.new(src))
-dst = src.rotate(Gdk::Pixbuf::ROTATE_COUNTERCLOCKWISE)
+dst = src.rotate(:counterclockwise)
vbox.add(Gtk::Image.new(dst))
-dst2 = src.rotate(Gdk::Pixbuf::ROTATE_UPSIDEDOWN)
+dst2 = src.rotate(:upsidedown)
vbox.add(Gtk::Image.new(dst2))
window = Gtk::Window.new
diff --git a/gdk_pixbuf2/sample/save.rb b/gdk_pixbuf2/sample/save.rb
index 7fd6f5c..8ae3f04 100644
--- a/gdk_pixbuf2/sample/save.rb
+++ b/gdk_pixbuf2/sample/save.rb
@@ -2,7 +2,7 @@
=begin
save.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: save.rb,v 1.5 2006/06/17 14:38:08 mutoh Exp $
@@ -17,9 +17,9 @@ if ! from or ! to
exit(1)
end
-src = Gdk::Pixbuf.new(from)
+src = GdkPixbuf::Pixbuf.new(from)
-dst = src.scale(300, 300, Gdk::Pixbuf::INTERP_HYPER)
+dst = src.scale(300, 300, :hyper)
# This doesn't work ....
#dst.save(to, "jpeg", {:quality => 100})
dst.save(to, "png")
diff --git a/gdk_pixbuf2/sample/scale.rb b/gdk_pixbuf2/sample/scale.rb
index 4200ec7..cdb1fa7 100644
--- a/gdk_pixbuf2/sample/scale.rb
+++ b/gdk_pixbuf2/sample/scale.rb
@@ -2,7 +2,7 @@
=begin
scale.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: scale.rb,v 1.10 2006/06/17 14:38:08 mutoh Exp $
@@ -18,20 +18,28 @@ end
vbox = Gtk::VBox.new
-src = Gdk::Pixbuf.new(filename)
+src = GdkPixbuf::Pixbuf.new(:file => filename)
vbox.add(Gtk::Image.new(src))
-dst = src.scale(200, 200, Gdk::Pixbuf::INTERP_NEAREST)
+dst = src.scale(200, 200, :nearest)
dst.scale!(src, 60, 60, 90, 90, -50, 50, 6, 3)
vbox.add(Gtk::Image.new(dst))
-dst2 = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 200, 200)
+dst2 = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+ :has_alpha =>true,
+ :bits_per_sample => 8,
+ :width => 200,
+ :height => 200)
dst2.scale!(src, 0, 0, 100, 100, 0, 0, 1.5, 1.5)
vbox.add(Gtk::Image.new(dst2))
-dst3 = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 200, 200)
-dst3.scale!(src, 0, 0, 200, 200, 0, 0, 5, 3, Gdk::Pixbuf::INTERP_HYPER)
+dst3 = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+ :has_alpha =>true,
+ :bits_per_sample => 8,
+ :width => 200,
+ :height => 200)
+dst3.scale!(src, 0, 0, 200, 200, 0, 0, 5, 3, :hyper)
vbox.add(Gtk::Image.new(dst3))
window = Gtk::Window.new
diff --git a/gdk_pixbuf2/sample/simpleanim.rb b/gdk_pixbuf2/sample/simpleanim.rb
index 3f86911..e4fa526 100644
--- a/gdk_pixbuf2/sample/simpleanim.rb
+++ b/gdk_pixbuf2/sample/simpleanim.rb
@@ -1,10 +1,10 @@
#!/usr/bin/env ruby
=begin
simpleanim.rb - Ruby/GdkPixbuf sample script for Gdk::PixbufSimpleAnim.
-
+
Inspired by http://mail.gnome.org/archives/gtk-perl-list/2005-September/msg00110.html
- Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: simpleanim.rb,v 1.2 2006/06/17 14:38:08 mutoh Exp $
@@ -14,13 +14,19 @@ require 'gtk2'
$stdout.sync = true
-simple_anim = Gdk::PixbufSimpleAnim.new(64, 64, 24)
+simple_anim = GdkPixbuf::PixbufSimpleAnim.new(64, 64, 24)
store_pixels = []
print 'generating frames'
for red in 0 .. 126
store_pixels << pixels = ([ 4*(63-red).abs, 0, 0 ] * (64*64)).pack('C*')
- pixbuf = Gdk::Pixbuf.new(pixels, Gdk::Pixbuf::COLORSPACE_RGB, false, 8, 64, 64, 64*3)
+ pixbuf = GdkPixbuf::Pixbuf.new(:data => pixels,
+ :colorspace => :rgb,
+ :has_alpha =>false,
+ :bits_per_sample => 8,
+ :width => 64,
+ :height => 64,
+ :row_stride => 64*3)
simple_anim.add_frame(pixbuf)
print '.'
end
diff --git a/gdk_pixbuf2/sample/utils.rb b/gdk_pixbuf2/sample/utils.rb
index 4237740..16c7eb3 100644
--- a/gdk_pixbuf2/sample/utils.rb
+++ b/gdk_pixbuf2/sample/utils.rb
@@ -2,7 +2,7 @@
=begin
utils.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: utils.rb,v 1.4 2006/06/17 14:38:08 mutoh Exp $
@@ -16,15 +16,18 @@ unless filename
exit(1)
end
-src = Gdk::Pixbuf.new(filename)
+src = GdkPixbuf::Pixbuf.new(:file => filename)
vbox = Gtk::VBox.new
dst = src.add_alpha(true, 0, 0, 0)
vbox.pack_start(Gtk::Image.new(dst))
-dst = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8,
- src.width + 20, src.height + 30)
+dst = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+ :has_alpha => true,
+ :bits_per_sample => 8,
+ :width => src.width + 20,
+ :height => src.height + 30)
src.copy_area(0, 0, src.width / 2, src.height / 2, dst, 10, 20)
vbox.pack_start(Gtk::Image.new(dst))
diff --git a/gdk_pixbuf2/sample/xpm.rb b/gdk_pixbuf2/sample/xpm.rb
index 019db18..8beaa8e 100644
--- a/gdk_pixbuf2/sample/xpm.rb
+++ b/gdk_pixbuf2/sample/xpm.rb
@@ -2,7 +2,7 @@
=begin
xpm.rb - Ruby/GdkPixbuf sample script.
- Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
$Id: xpm.rb,v 1.5 2006/06/17 14:38:08 mutoh Exp $
@@ -11,11 +11,11 @@
require 'gtk2'
r_xpm = [
- "10 10 3 1",
- " c None",
- ". c #FE0B0B",
- "+ c #FFFFFF",
- "+.......++",
+ "10 10 3 1",
+ " c None",
+ ". c #FE0B0B",
+ "+ c #FFFFFF",
+ "+.......++",
"+.. ..+",
"+.. ..+",
"+.. ...+",
@@ -24,15 +24,15 @@ r_xpm = [
"+..++..+++",
"+..++...++",
"+..+++...+",
- "+..++++..+"]
+ "+..++++..+"]
w = Gtk::Window.new
w.signal_connect('delete-event') do
Gtk.main_quit
end
-src = Gdk::Pixbuf.new(r_xpm)
-dst = src.scale(300, 300, Gdk::Pixbuf::INTERP_HYPER)
+src = GdkPixbuf::Pixbuf.new(:xpm => r_xpm)
+dst = src.scale(300, 300, :hyper)
w.add(Gtk::Image.new(dst))
w.show_all
diff --git a/gdk_pixbuf2/test/fixture/floppybuddy.gif b/gdk_pixbuf2/test/fixture/floppybuddy.gif
new file mode 100644
index 0000000..ac986c8
Binary files /dev/null and b/gdk_pixbuf2/test/fixture/floppybuddy.gif differ
diff --git a/gdk_pixbuf2/test/fixture/gnome-logo-icon.png b/gdk_pixbuf2/test/fixture/gnome-logo-icon.png
new file mode 100644
index 0000000..06721a9
Binary files /dev/null and b/gdk_pixbuf2/test/fixture/gnome-logo-icon.png differ
diff --git a/gdk_pixbuf2/test/fixture/image.gresource b/gdk_pixbuf2/test/fixture/image.gresource
new file mode 100644
index 0000000..dbef512
Binary files /dev/null and b/gdk_pixbuf2/test/fixture/image.gresource differ
diff --git a/gdk_pixbuf2/test/fixture/image.gresource.xml b/gdk_pixbuf2/test/fixture/image.gresource.xml
new file mode 100644
index 0000000..62b7313
--- /dev/null
+++ b/gdk_pixbuf2/test/fixture/image.gresource.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/ruby/gnome">
+ <file>gnome-logo-icon.png</file>
+ </gresource>
+</gresources>
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
index fdb6ee3..744676b 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
@@ -17,4 +17,15 @@
require "test-unit"
module GdkPixbufTestUtils
+ private
+ def only_version(major, minor, micro=nil)
+ micro ||= 0
+ unless GdkPixbuf::Version.or_later?(major, minor, micro)
+ omit("Require GdkPixbuf >= #{major}.#{minor}.#{micro}")
+ end
+ end
+
+ def fixture_path(*components)
+ File.join(File.dirname(__FILE__), "fixture", *components)
+ end
end
diff --git a/gdk_pixbuf2/test/run-test.rb b/gdk_pixbuf2/test/run-test.rb
index 17082d2..8786cbd 100755
--- a/gdk_pixbuf2/test/run-test.rb
+++ b/gdk_pixbuf2/test/run-test.rb
@@ -1,6 +1,6 @@
#!/usr/bin/env ruby
#
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -20,14 +20,17 @@ ruby_gnome2_base = File.join(File.dirname(__FILE__), "..", "..")
ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
glib_base = File.join(ruby_gnome2_base, "glib2")
+gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
gdk_pixbuf2_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
modules = [
[glib_base, "glib2"],
- [gdk_pixbuf2_base, "gdk_pixbuf2"]
+ [gobject_introspection_base, "gobject-introspection"],
+ [gdk_pixbuf2_base, "gdk_pixbuf2"],
]
modules.each do |target, module_name|
- if system("which make > /dev/null")
+ makefile = File.join(target, "Makefile")
+ if File.exist?(makefile) and system("which make > /dev/null")
`make -C #{target.dump} > /dev/null` or exit(false)
end
$LOAD_PATH.unshift(File.join(target, "ext", module_name))
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/gdk_pixbuf2/test/test-animation.rb
similarity index 67%
copy from gobject-introspection/lib/gobject-introspection/arg-info.rb
copy to gdk_pixbuf2/test/test-animation.rb
index 88d785d..5628822 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/gdk_pixbuf2/test/test-animation.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,14 +14,17 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-module GObjectIntrospection
- class ArgInfo
- def gclosure?
- type_info = type
- return false if type_info.tag != TypeTag::INTERFACE
+class TestAnimationIter < Test::Unit::TestCase
+ include GdkPixbufTestUtils
- struct_info = type_info.interface
- struct_info.gtype.name == "GClosure"
+ setup do
+ @animation = GdkPixbuf::PixbufAnimation.new(fixture_path("floppybuddy.gif"))
+ @iter = @animation.get_iter
+ end
+
+ test("#on_currently_loading_frame?") do
+ assert do
+ not @iter.on_currently_loading_frame?
end
end
end
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/gdk_pixbuf2/test/test-loader.rb
similarity index 67%
copy from gobject-introspection/lib/gobject-introspection/arg-info.rb
copy to gdk_pixbuf2/test/test-loader.rb
index 88d785d..e7f09ea 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/gdk_pixbuf2/test/test-loader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,14 +14,18 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-module GObjectIntrospection
- class ArgInfo
- def gclosure?
- type_info = type
- return false if type_info.tag != TypeTag::INTERFACE
+class TestLoader < Test::Unit::TestCase
+ include GdkPixbufTestUtils
- struct_info = type_info.interface
- struct_info.gtype.name == "GClosure"
+ setup do
+ @loader = GdkPixbuf::PixbufLoader.new
+ end
+
+ test("#last_write") do
+ assert_nil(@loader.pixbuf)
+ File.open(fixture_path("gnome-logo-icon.png"), "rb") do |png|
+ @loader.last_write(png.read)
end
+ assert_not_nil(@loader.pixbuf)
end
end
diff --git a/gdk_pixbuf2/test/test-pixbuf.rb b/gdk_pixbuf2/test/test-pixbuf.rb
new file mode 100644
index 0000000..e5ee874
--- /dev/null
+++ b/gdk_pixbuf2/test/test-pixbuf.rb
@@ -0,0 +1,334 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+class TestPixbuf < Test::Unit::TestCase
+ include GdkPixbufTestUtils
+
+ sub_test_case(".new") do
+ def r_xpm
+ [
+ "10 10 3 1",
+ " c None",
+ ". c #FE0B0B",
+ "+ c #FFFFFF",
+ "+.......++",
+ "+.. ..+",
+ "+.. ..+",
+ "+.. ...+",
+ "+.......++",
+ "+.....++++",
+ "+..++..+++",
+ "+..++...++",
+ "+..+++...+",
+ "+..++++..+",
+ ]
+ end
+
+ sub_test_case("legacy form") do
+ test "basic" do
+ colorspace = GdkPixbuf::Colorspace::RGB
+ width = 100
+ height = 100
+ has_alpha = true
+ bits_per_sample = 8
+ pixbuf = GdkPixbuf::Pixbuf.new(colorspace,
+ has_alpha,
+ bits_per_sample,
+ width,
+ height)
+ assert_equal(colorspace, pixbuf.colorspace)
+ assert_equal(width, pixbuf.width)
+ assert_equal(height, pixbuf.height)
+ assert_equal(has_alpha, pixbuf.has_alpha?)
+ assert_equal(bits_per_sample, pixbuf.bits_per_sample)
+ end
+
+ test "file" do
+ pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ end
+
+ test "xpm" do
+ pixbuf = GdkPixbuf::Pixbuf.new(r_xpm)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ end
+
+ test "file: size" do
+ pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"),
+ 32, 48)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ assert_equal(32, pixbuf.width)
+ assert_equal(32, pixbuf.height)
+ end
+
+ test "file: scale" do
+ pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"),
+ 32, 48, false)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ assert_equal(32, pixbuf.width)
+ assert_equal(48, pixbuf.height)
+ end
+
+ test "subpixbuf" do
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ pixbuf = GdkPixbuf::Pixbuf.new(src_pixbuf, 0, 0, 32, 32)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ assert_equal(32, pixbuf.width)
+ assert_equal(32, pixbuf.height)
+ end
+
+ test "data" do
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ data = src_pixbuf.pixels.pack("C*")
+ pixbuf = GdkPixbuf::Pixbuf.new(data,
+ src_pixbuf.colorspace,
+ src_pixbuf.has_alpha?,
+ src_pixbuf.bits_per_sample,
+ src_pixbuf.width,
+ src_pixbuf.height,
+ src_pixbuf.rowstride,
+ )
+ assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+ end
+ end
+
+ sub_test_case("Hash form") do
+ test "basic" do
+ colorspace = GdkPixbuf::Colorspace::RGB
+ width = 100
+ height = 100
+ has_alpha = true
+ bits_per_sample = 8
+ pixbuf = GdkPixbuf::Pixbuf.new(:colorspace => colorspace,
+ :has_alpha => has_alpha,
+ :width => width,
+ :height => height,
+ :bits_per_sample => bits_per_sample)
+ assert_equal(colorspace, pixbuf.colorspace)
+ assert_equal(width, pixbuf.width)
+ assert_equal(height, pixbuf.height)
+ assert_equal(has_alpha, pixbuf.has_alpha?)
+ assert_equal(bits_per_sample, pixbuf.bits_per_sample)
+ end
+
+ test "file" do
+ filename = fixture_path("gnome-logo-icon.png")
+ pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ end
+
+ test "xpm" do
+ pixbuf = GdkPixbuf::Pixbuf.new(:xpm => r_xpm)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ end
+
+ test "file: size" do
+ filename = fixture_path("gnome-logo-icon.png")
+ pixbuf = GdkPixbuf::Pixbuf.new(:file => filename,
+ :width => 32,
+ :height => 48)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ assert_equal(32, pixbuf.width)
+ assert_equal(32, pixbuf.height)
+ end
+
+ test "file: scale" do
+ filename = fixture_path("gnome-logo-icon.png")
+ pixbuf = GdkPixbuf::Pixbuf.new(:file => filename,
+ :width => 32,
+ :height => 48,
+ :scale => true,
+ :preserve_aspect_ratio => false)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ assert_equal(32, pixbuf.width)
+ assert_equal(48, pixbuf.height)
+ end
+
+ test "subpixbuf" do
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ pixbuf = GdkPixbuf::Pixbuf.new(:src_pixbuf => src_pixbuf,
+ :src_x => 0,
+ :src_y => 0,
+ :width => 32,
+ :height => 32)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ assert_equal(32, pixbuf.width)
+ assert_equal(32, pixbuf.height)
+ end
+
+ test "data" do
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ data = src_pixbuf.pixels.pack("C*")
+ pixbuf = GdkPixbuf::Pixbuf.new(:data => data,
+ :colorspace => src_pixbuf.colorspace,
+ :has_alpha => src_pixbuf.has_alpha?,
+ :bits_per_sample => src_pixbuf.bits_per_sample,
+ :width => src_pixbuf.width,
+ :height => src_pixbuf.height,
+ :row_stride => src_pixbuf.rowstride,
+ )
+ assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+ end
+
+ test "bytes" do
+ only_version(2, 32)
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ bytes = src_pixbuf.pixels.flatten.pack("C*")
+ pixbuf = GdkPixbuf::Pixbuf.new(:bytes => bytes,
+ :colorspace => src_pixbuf.colorspace,
+ :has_alpha => src_pixbuf.has_alpha?,
+ :bits_per_sample => src_pixbuf.bits_per_sample,
+ :width => src_pixbuf.width,
+ :height => src_pixbuf.height,
+ :row_stride => src_pixbuf.rowstride,
+ )
+ assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+ end
+
+ test "resource" do
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ resource = Gio::Resource.load(fixture_path("image.gresource"))
+ Gio::Resources.register(resource)
+ begin
+ resource_path = "/org/ruby/gnome/gnome-logo-icon.png"
+ pixbuf = GdkPixbuf::Pixbuf.new(:resource => resource_path)
+ assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+ ensure
+ Gio::Resources.unregister(resource)
+ end
+ end
+
+ test "resource: scale" do
+ resource = Gio::Resource.load(fixture_path("image.gresource"))
+ Gio::Resources.register(resource)
+ begin
+ resource_path = "/org/ruby/gnome/gnome-logo-icon.png"
+ pixbuf = GdkPixbuf::Pixbuf.new(:resource => resource_path,
+ :width => 32,
+ :height => 48,
+ :scale => true,
+ :preserve_aspect_ratio => false)
+ assert_equal([
+ GdkPixbuf::Colorspace::RGB,
+ 32,
+ 48,
+ ],
+ [
+ pixbuf.colorspace,
+ pixbuf.width,
+ pixbuf.height,
+ ])
+ ensure
+ Gio::Resources.unregister(resource)
+ end
+ end
+ end
+
+ def test_new_subpixbuf
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ pixbuf = src_pixbuf.new_subpixbuf(0, 0, 32, 32)
+ assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+ assert_equal(32, pixbuf.width)
+ assert_equal(32, pixbuf.height)
+ end
+ end
+
+ def test_dup
+ pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ assert_equal(pixbuf.pixels, pixbuf.dup.pixels)
+ end
+
+ def test_fill!
+ filename = fixture_path("gnome-logo-icon.png")
+ pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
+ pixbuf.fill!(0xffffffff)
+ assert_equal([0xff] * (pixbuf.rowstride * pixbuf.height),
+ pixbuf.pixels)
+ end
+
+ def test_rotate
+ pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ inverted_pixbuf = pixbuf.rotate(:upsidedown)
+ assert_not_equal(pixbuf.pixels, inverted_pixbuf.pixels)
+ inverted_twice_pixbuf = inverted_pixbuf.rotate(:upsidedown)
+ assert_equal(pixbuf.pixels, inverted_twice_pixbuf.pixels)
+ end
+
+ sub_test_case("saturate_and_pixelate") do
+ # Based on the function gdk_pixbuf_saturate_and_pixelate
+ # in gdk-pixbuf-util.c
+ def saturate_and_pixelate_pixels(pixbuf, saturation, pixelate)
+ alpha = pixbuf.has_alpha?
+ width = pixbuf.width
+ height = pixbuf.height
+ pixels = pixbuf.pixels
+ dest_pix = []
+ dark_factor = 0.7
+ height.times do |i|
+ width.times do |k|
+ j =((i ) * width + k) * 4
+ intens = intensity(pixels[j + 0], pixels[j + 1], pixels[j + 2])
+ if pixelate == true && ( (i + k) % 2 == 0)
+ dest_pix << (intens / 2 + 127).floor
+ dest_pix << (intens / 2 + 127).floor
+ dest_pix << (intens / 2 + 127).floor
+ elsif pixelate == true
+ dest_pix << clamp_uchar(saturate(pixels[j + 0],
+ saturation, intens) * dark_factor).floor
+ dest_pix << clamp_uchar(saturate(pixels[j + 1],
+ saturation, intens) * dark_factor).floor
+ dest_pix << clamp_uchar(saturate(pixels[j + 2],
+ saturation, intens) * dark_factor).floor
+ else
+ dest_pix << clamp_uchar(saturate(pixels[j + 0], saturation, intens)).floor
+ dest_pix << clamp_uchar(saturate(pixels[j + 1], saturation, intens)).floor
+ dest_pix << clamp_uchar(saturate(pixels[j + 2], saturation, intens)).floor
+ end
+ dest_pix << pixels[j + 3] if alpha
+ end
+ end
+ dest_pix
+ end
+
+ def saturate(value, saturation, intensity)
+ (1.0 - saturation) * intensity + saturation * (1.0 * value)
+ end
+
+ def clamp_uchar(x)
+ [0, x, 255].sort[1]
+ end
+
+ def intensity(r, g, b)
+ (r * 0.30 + g * 0.59 + b * 0.11).floor
+ end
+
+ test "no modifications" do
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ pixbuf = src_pixbuf.saturate_and_pixelate(1, false)
+ assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+ end
+
+ test "normal usage" do
+ src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ pixbuf = src_pixbuf.saturate_and_pixelate(0, true)
+ ref = saturate_and_pixelate_pixels(src_pixbuf, 0, true)
+ assert_equal(ref, pixbuf.pixels, ref.size)
+ pixbuf = src_pixbuf.saturate_and_pixelate(0.5, true)
+ ref = saturate_and_pixelate_pixels(src_pixbuf, 0.5, true)
+ assert_equal(ref, pixbuf.pixels)
+ end
+ end
+end
diff --git a/gio2/lib/gio2.rb b/gio2/lib/gio2.rb
index c15b978..06842ed 100644
--- a/gio2/lib/gio2.rb
+++ b/gio2/lib/gio2.rb
@@ -35,23 +35,6 @@ module Gio
class Error < StandardError
end
- class << self
- def const_missing(name)
- init
- if const_defined?(name)
- const_get(name)
- else
- super
- end
- end
-
- def init
- class << self
- remove_method(:init)
- remove_method(:const_missing)
- end
- loader = Loader.new(self)
- loader.load("Gio")
- end
- end
+ loader = Loader.new(self)
+ loader.load("Gio")
end
diff --git a/gio2/lib/gio2/application-command-line.rb b/gio2/lib/gio2/application-command-line.rb
index c739064..bf9b31c 100644
--- a/gio2/lib/gio2/application-command-line.rb
+++ b/gio2/lib/gio2/application-command-line.rb
@@ -27,10 +27,5 @@ module Gio
end
super(properties)
end
-
- alias_method :arguments_raw, :arguments
- def arguments
- arguments_raw[0]
- end
end
end
diff --git a/gio2/lib/gio2/loader.rb b/gio2/lib/gio2/loader.rb
index d324359..c7e5b5d 100644
--- a/gio2/lib/gio2/loader.rb
+++ b/gio2/lib/gio2/loader.rb
@@ -102,8 +102,6 @@ module Gio
def load_function_info(info)
name = info.name
case name
- when "init"
- # ignore
when /\Acontent_type_/
load_function_info_content_type(info)
when "content_types_get_registered"
@@ -228,13 +226,12 @@ module Gio
end
end
- def error_class_name(info)
- name = info.name
- case name
+ def rubyish_class_name(info)
+ case info.name
when /Enum\z/
$PREMATCH
else
- name
+ super
end
end
diff --git a/glib2/Rakefile b/glib2/Rakefile
index 03c6546..e0fd1d7 100644
--- a/glib2/Rakefile
+++ b/glib2/Rakefile
@@ -85,7 +85,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "glib",
:download_site => :gnome,
:label => "GLib",
- :version => "2.48.0",
+ :version => "2.48.1",
:compression_method => "xz",
:windows => {
:need_autoreconf => true,
@@ -168,7 +168,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "glib-networking",
:download_site => :gnome,
:label => "glib-networking",
- :version => "2.48.0",
+ :version => "2.48.2",
:compression_method => "xz",
:windows => {
:configure_args => [
diff --git a/glib2/ext/glib2/extconf.rb b/glib2/ext/glib2/extconf.rb
index ada704c..357d4c0 100644
--- a/glib2/ext/glib2/extconf.rb
+++ b/glib2/ext/glib2/extconf.rb
@@ -47,7 +47,6 @@ have_func("ruby_set_current_source", ruby_header)
have_func("rb_thread_call_without_gvl", ruby_header)
have_func("ruby_native_thread_p", ruby_header)
have_func("rb_thread_call_with_gvl", ruby_header)
-have_func("rb_str_new_cstr", ruby_header)
have_func("rb_gc_register_mark_object", ruby_header)
have_func("rb_exc_new_str", ruby_header)
diff --git a/glib2/ext/glib2/rbglib-variant-type.c b/glib2/ext/glib2/rbglib-variant-type.c
index 70e7979..4173f7b 100644
--- a/glib2/ext/glib2/rbglib-variant-type.c
+++ b/glib2/ext/glib2/rbglib-variant-type.c
@@ -1,6 +1,6 @@
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
- * Copyright (C) 2015 Ruby-GNOME2 Project Team
+ * Copyright (C) 2015-2016 Ruby-GNOME2 Project Team
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -286,10 +286,14 @@ Init_glib_variant_type(void)
DEF_TYPE(DICT_ENTRY);
DEF_TYPE(DICTIONARY);
DEF_TYPE(STRING_ARRAY);
+# if GLIB_CHECK_VERSION(2, 30, 0)
DEF_TYPE(OBJECT_PATH_ARRAY);
+# endif
DEF_TYPE(BYTESTRING);
DEF_TYPE(BYTESTRING_ARRAY);
+# if GLIB_CHECK_VERSION(2, 30, 0)
DEF_TYPE(VARDICT);
+# endif
#undef DEF_TYPE
}
diff --git a/glib2/ext/glib2/rbglib-variant.c b/glib2/ext/glib2/rbglib-variant.c
index 1a33005..80081ba 100644
--- a/glib2/ext/glib2/rbglib-variant.c
+++ b/glib2/ext/glib2/rbglib-variant.c
@@ -1,6 +1,6 @@
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
- * Copyright (C) 2015 Ruby-GNOME2 Project Team
+ * Copyright (C) 2015-2016 Ruby-GNOME2 Project Team
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -174,9 +174,7 @@ rg_ruby_to_variant(VALUE rb_value, VALUE rb_variant_type)
} else if (g_variant_type_equal(variant_type, G_VARIANT_TYPE_VARIANT)) {
return g_variant_new_variant(rbg_variant_from_ruby(rb_value));
} else if (g_variant_type_equal(variant_type,
- G_VARIANT_TYPE_STRING_ARRAY) ||
- g_variant_type_equal(variant_type,
- G_VARIANT_TYPE_OBJECT_PATH_ARRAY)) {
+ G_VARIANT_TYPE_STRING_ARRAY)) {
const gchar **strings;
gssize length;
if (NIL_P(rb_value)) {
@@ -192,11 +190,27 @@ rg_ruby_to_variant(VALUE rb_value, VALUE rb_variant_type)
strings[i] = RVAL2CSTR_ACCEPT_NIL(rb_string);
}
}
- if (g_variant_type_equal(variant_type, G_VARIANT_TYPE_STRING_ARRAY)) {
- return g_variant_new_strv(strings, length);
+ return g_variant_new_strv(strings, length);
+#if GLIB_CHECK_VERSION(2, 30, 0)
+ } else if (g_variant_type_equal(variant_type,
+ G_VARIANT_TYPE_OBJECT_PATH_ARRAY)) {
+ const gchar **paths;
+ gssize length;
+ if (NIL_P(rb_value)) {
+ paths = NULL;
+ length = 0;
} else {
- return g_variant_new_objv(strings, length);
+ gssize i;
+
+ length = RARRAY_LEN(rb_value);
+ paths = ALLOCA_N(const gchar *, length);
+ for (i = 0; i < length; i++) {
+ VALUE rb_path = RARRAY_PTR(rb_value)[i];
+ paths[i] = RVAL2CSTR_ACCEPT_NIL(rb_path);
+ }
}
+ return g_variant_new_objv(paths, length);
+#endif
} else if (g_variant_type_equal(variant_type, G_VARIANT_TYPE_ARRAY)) {
int i;
GVariantBuilder builder;
diff --git a/glib2/ext/glib2/rbglib.c b/glib2/ext/glib2/rbglib.c
index f435d94..688acca 100644
--- a/glib2/ext/glib2/rbglib.c
+++ b/glib2/ext/glib2/rbglib.c
@@ -34,10 +34,8 @@ rbg_rval2cstr(VALUE *str)
{
StringValue(*str);
-#ifdef HAVE_RUBY_ENCODING_H
if (rb_enc_get(*str) != rb_utf8_encoding())
*str = rb_str_export_to_enc(*str, rb_utf8_encoding());
-#endif
return StringValueCStr(*str);
}
@@ -142,11 +140,7 @@ rbg_cstr2rval_len(const gchar *str, gsize len)
if (str == NULL)
return Qnil;
-#ifdef HAVE_RUBY_ENCODING_H
return rb_external_str_new_with_enc(str, len, rb_utf8_encoding());
-#else
- return rb_str_new(str, len);
-#endif
}
struct rbg_cstr2rval_len_free_args {
@@ -185,7 +179,6 @@ rbg_cstr2rval_with_encoding(const gchar *str, const gchar *encoding)
return str != NULL ? CSTR2RVAL_LEN_ENC(str, strlen(str), encoding) : Qnil;
}
-#ifdef HAVE_RUBY_ENCODING_H
VALUE
rbg_cstr2rval_len_with_encoding(const gchar *str, gsize len,
const gchar *encoding)
@@ -198,17 +191,6 @@ rbg_cstr2rval_len_with_encoding(const gchar *str, gsize len,
rb_enc_find(encoding) :
rb_utf8_encoding());
}
-#else
-VALUE
-rbg_cstr2rval_len_with_encoding(const gchar *str, gsize len,
- G_GNUC_UNUSED const gchar *encoding)
-{
- if (str == NULL)
- return Qnil;
-
- return rb_str_new(str, len);
-}
-#endif
static VALUE
rbg_cstr2rval_free_body(VALUE str)
@@ -238,11 +220,8 @@ rbg_cstr2rval_with_free(gchar *str)
return rbg_cstr2rval_free(str);
}
-#ifdef HAVE_RUBY_ENCODING_H
static rb_encoding *filename_encoding_if_not_utf8;
-#endif
-#ifdef HAVE_RUBY_ENCODING_H
static VALUE
rbg_filename_to_ruby_body(VALUE filename)
{
@@ -267,12 +246,10 @@ rbg_filename_to_ruby_ensure(VALUE filename)
return Qnil;
}
-#endif
VALUE
rbg_filename_to_ruby(const gchar *filename)
{
-#ifdef HAVE_RUBY_ENCODING_H
gchar *filename_utf8;
gsize written;
GError *error = NULL;
@@ -289,15 +266,11 @@ rbg_filename_to_ruby(const gchar *filename)
return rb_ensure(rbg_filename_to_ruby_body, (VALUE)filename_utf8,
rbg_filename_to_ruby_ensure, (VALUE)filename_utf8);
-#else
- return CSTR2RVAL(filename);
-#endif
}
VALUE
rbg_filename_to_ruby_free(gchar *filename)
{
-#ifdef HAVE_RUBY_ENCODING_H
gchar *filename_utf8;
gsize written;
@@ -318,15 +291,11 @@ rbg_filename_to_ruby_free(gchar *filename)
return rb_ensure(rbg_filename_to_ruby_body, (VALUE)filename_utf8,
rbg_filename_to_ruby_ensure, (VALUE)filename_utf8);
-#else
- return CSTR2RVAL_FREE(filename);
-#endif
}
gchar *
rbg_filename_from_ruby(VALUE filename)
{
-#ifdef HAVE_RUBY_ENCODING_H
gchar *retval;
gsize written;
GError *error = NULL;
@@ -345,9 +314,6 @@ rbg_filename_from_ruby(VALUE filename)
RAISE_GERROR(error);
return retval;
-#else
- return g_strdup(RVAL2CSTR(filename));
-#endif
}
struct rval2strv_args {
@@ -1013,9 +979,7 @@ extern void Init_glib2(void);
void
Init_glib2(void)
{
-#ifdef HAVE_RUBY_ENCODING_H
const gchar **filename_charsets;
-#endif
id_inspect = rb_intern("inspect");
@@ -1096,7 +1060,6 @@ Init_glib2(void)
rb_define_const(RG_TARGET_NAMESPACE, "SEARCHPATH_SEPARATOR", CSTR2RVAL(G_SEARCHPATH_SEPARATOR_S));
/* discover and store glib filename encoding */
-#ifdef HAVE_RUBY_ENCODING_H
if (g_get_filename_charsets(&filename_charsets)
|| filename_charsets == NULL
|| filename_charsets[0] == NULL
@@ -1108,7 +1071,6 @@ Init_glib2(void)
} else {
filename_encoding_if_not_utf8 = rb_enc_find(filename_charsets[0]);
}
-#endif
/* Don't implement them.
#define G_DIR_SEPARATOR_S
diff --git a/glib2/ext/glib2/rbglib.h b/glib2/ext/glib2/rbglib.h
index 917c636..316aff9 100644
--- a/glib2/ext/glib2/rbglib.h
+++ b/glib2/ext/glib2/rbglib.h
@@ -1,6 +1,6 @@
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
- * Copyright (C) 2002-2015 Ruby-GNOME2 Project Team
+ * Copyright (C) 2002-2016 Ruby-GNOME2 Project Team
* Copyright (C) 2002,2003 Masahiro Sakai
*
* This library is free software; you can redistribute it and/or
@@ -36,7 +36,7 @@ extern "C" {
#define RBGLIB_MAJOR_VERSION 3
#define RBGLIB_MINOR_VERSION 0
-#define RBGLIB_MICRO_VERSION 8
+#define RBGLIB_MICRO_VERSION 9
#ifndef RB_ZALLOC
# ifdef ZALLOC
diff --git a/glib2/ext/glib2/rbglib_convert.c b/glib2/ext/glib2/rbglib_convert.c
index 478a32d..cb99e48 100644
--- a/glib2/ext/glib2/rbglib_convert.c
+++ b/glib2/ext/glib2/rbglib_convert.c
@@ -1,6 +1,6 @@
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
- * Copyright (C) 2011 Ruby-GNOME2 Project Team
+ * Copyright (C) 2011-2016 Ruby-GNOME2 Project Team
* Copyright (C) 2009 Ruby-GNOME2 Project Team
* Copyright (C) 2002,2003 KUBO Takehiro
*
@@ -49,7 +49,6 @@ static VALUE
rg_s_locale_to_utf8(G_GNUC_UNUSED VALUE self, VALUE str)
{
GError *err = NULL;
- VALUE s = Qnil;
gchar* ret;
gsize written;
@@ -59,9 +58,7 @@ rg_s_locale_to_utf8(G_GNUC_UNUSED VALUE self, VALUE str)
if (err != NULL)
RAISE_GERROR(err);
- s = rb_str_new(ret, written);
- g_free(ret);
- return s;
+ return CSTR2RVAL_LEN_FREE(ret, written);
}
static VALUE
@@ -87,7 +84,6 @@ static VALUE
rg_s_filename_to_utf8(G_GNUC_UNUSED VALUE self, VALUE str)
{
GError *err = NULL;
- VALUE s = Qnil;
gchar* ret;
gsize written;
@@ -97,9 +93,7 @@ rg_s_filename_to_utf8(G_GNUC_UNUSED VALUE self, VALUE str)
if (err != NULL)
RAISE_GERROR(err);
- s = rb_str_new(ret, written);
- g_free(ret);
- return s;
+ return CSTR2RVAL_LEN_FREE(ret, written);
}
static VALUE
diff --git a/glib2/ext/glib2/rbglib_matchinfo.c b/glib2/ext/glib2/rbglib_matchinfo.c
index 9ea4648..7b6e698 100644
--- a/glib2/ext/glib2/rbglib_matchinfo.c
+++ b/glib2/ext/glib2/rbglib_matchinfo.c
@@ -22,6 +22,7 @@
#define RG_TARGET_NAMESPACE cMatchInfo
#define _SELF(s) ((GMatchInfo*)RVAL2BOXED(s, G_TYPE_MATCH_INFO))
+#if GLIB_CHECK_VERSION(2, 30, 0)
static VALUE
rg_regex(VALUE self)
{
@@ -157,10 +158,12 @@ rg_expand_references(VALUE self, VALUE rb_string)
return CSTR2RVAL_FREE(expanded_string);
}
+#endif
void
Init_glib_matchinfo(void)
{
+#if GLIB_CHECK_VERSION(2, 30, 0)
VALUE RG_TARGET_NAMESPACE;
RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_MATCH_INFO, "MatchInfo", mGLib);
@@ -176,4 +179,5 @@ Init_glib_matchinfo(void)
RG_DEF_METHOD(fetch_all, 0);
RG_DEF_METHOD(next, 0);
RG_DEF_METHOD(expand_references, 1);
+#endif
}
diff --git a/glib2/ext/glib2/rbglib_regex.c b/glib2/ext/glib2/rbglib_regex.c
index be2fa81..05ceec3 100644
--- a/glib2/ext/glib2/rbglib_regex.c
+++ b/glib2/ext/glib2/rbglib_regex.c
@@ -136,6 +136,7 @@ rg_split(gint argc, VALUE *argv, VALUE self)
return STRV2RVAL_FREE(strings);
}
+#if GLIB_CHECK_VERSION(2, 30, 0)
static VALUE
rg_match(gint argc, VALUE *argv, VALUE self)
{
@@ -190,6 +191,7 @@ rg_match(gint argc, VALUE *argv, VALUE self)
rb_iv_set(rb_match_info, "@string", rb_frozen_string);
return rb_match_info;
}
+#endif
static VALUE
rg_max_backref(VALUE self)
@@ -203,6 +205,7 @@ rg_capture_count(VALUE self)
return INT2NUM(g_regex_get_capture_count(_SELF(self)));
}
+#if GLIB_CHECK_VERSION(2, 34, 0)
static VALUE
rg_has_cr_or_lf_p(VALUE self)
{
@@ -214,6 +217,7 @@ rg_max_lookbehind(VALUE self)
{
return INT2NUM(g_regex_get_max_lookbehind(_SELF(self)));
}
+#endif
static VALUE
rg_string_number(VALUE self, VALUE string)
@@ -221,6 +225,7 @@ rg_string_number(VALUE self, VALUE string)
return INT2NUM(g_regex_get_string_number(_SELF(self), RVAL2CSTR(string)));
}
+#if GLIB_CHECK_VERSION(2, 30, 0)
static VALUE
rg_match_all(gint argc, VALUE *argv, VALUE self)
{
@@ -418,7 +423,7 @@ rg_replace(gint argc, VALUE *argv, VALUE self)
return CSTR2RVAL_FREE(modified_string);
}
-
+#endif
static VALUE
rg_s_escape_string(G_GNUC_UNUSED VALUE self, VALUE string)
@@ -466,14 +471,20 @@ Init_glib_regex(void)
RG_DEF_METHOD(compile_flags, 0);
RG_DEF_METHOD(match_flags, 0);
RG_DEF_METHOD(split, -1);
+#if GLIB_CHECK_VERSION(2, 30, 0)
RG_DEF_METHOD(match, -1);
+#endif
RG_DEF_METHOD(max_backref, 0);
RG_DEF_METHOD(capture_count, 0);
+#if GLIB_CHECK_VERSION(2, 34, 0)
RG_DEF_METHOD_P(has_cr_or_lf, 0);
RG_DEF_METHOD(max_lookbehind, 0);
+#endif
RG_DEF_METHOD(string_number, 1);
+#if GLIB_CHECK_VERSION(2, 30, 0)
RG_DEF_METHOD(match_all, -1);
RG_DEF_METHOD(replace, -1);
+#endif
RG_DEF_SMETHOD(escape_string, 1);
RG_DEF_SMETHOD(check_replacement, 1);
diff --git a/glib2/ext/glib2/rbgobj_object.c b/glib2/ext/glib2/rbgobj_object.c
index c2d3794..c51bad7 100644
--- a/glib2/ext/glib2/rbgobj_object.c
+++ b/glib2/ext/glib2/rbgobj_object.c
@@ -302,7 +302,7 @@ rbgobj_gobject_new(GType gtype, VALUE params_hash)
size_t param_size;
struct param_setup_arg arg;
- param_size = NUM2INT(rb_funcall(params_hash, rb_intern("length"), 0));
+ param_size = NUM2INT(rb_funcall(params_hash, rb_intern("length"), 0));
arg.param_size = param_size;
arg.gclass = G_OBJECT_CLASS(g_type_class_ref(gtype));
@@ -621,19 +621,97 @@ rg_type_name(VALUE self)
}
#if GLIB_CHECK_VERSION(2, 26, 0)
+typedef struct {
+ VALUE transform_from_callback;
+ VALUE transform_to_callback;
+ VALUE self;
+} RGBindPropertyCallbackData;
+
+static gboolean
+rg_bind_property_transform_to_callback(G_GNUC_UNUSED GBinding *binding,
+ const GValue *from_value,
+ GValue *to_value,
+ gpointer user_data)
+{
+ RGBindPropertyCallbackData *data = (RGBindPropertyCallbackData *)user_data;
+ VALUE proc;
+ VALUE rb_from_value;
+ VALUE rb_to_value;
+
+ proc = data->transform_to_callback;
+ if (NIL_P(proc))
+ return FALSE;
+
+ rb_from_value = rbgobj_gvalue_to_rvalue(from_value);
+ rb_to_value = rbgobj_gvalue_to_rvalue(to_value);
+ rb_to_value = rb_funcall(proc, rb_intern("call"), 1, rb_from_value);
+ rbgobj_rvalue_to_gvalue(rb_to_value, to_value);
+ return TRUE;
+}
+
+static gboolean
+rg_bind_property_transform_from_callback(G_GNUC_UNUSED GBinding *binding,
+ const GValue *from_value,
+ GValue *to_value,
+ gpointer user_data)
+{
+ RGBindPropertyCallbackData *data = (RGBindPropertyCallbackData *)user_data;
+ VALUE proc;
+ VALUE rb_from_value;
+ VALUE rb_to_value;
+
+ proc = data->transform_from_callback;
+ if (NIL_P(proc))
+ return FALSE;
+
+ rb_from_value = rbgobj_gvalue_to_rvalue(from_value);
+ rb_to_value = rbgobj_gvalue_to_rvalue(to_value);
+ rb_to_value = rb_funcall(proc, rb_intern("call"), 1, rb_from_value);
+ rbgobj_rvalue_to_gvalue(rb_to_value, to_value);
+ return TRUE;
+}
+
+static void
+rg_destroy_bind_property_full_data(gpointer user_data)
+{
+ RGBindPropertyCallbackData *data = (RGBindPropertyCallbackData *)user_data;
+
+ if (!NIL_P(data->transform_to_callback))
+ G_CHILD_REMOVE(data->self, data->transform_to_callback);
+
+ if (!NIL_P(data->transform_from_callback))
+ G_CHILD_REMOVE(data->self, data->transform_from_callback);
+
+ xfree(data);
+}
+
static VALUE
-rg_bind_property(VALUE self,
- VALUE rb_source_property,
- VALUE rb_target,
- VALUE rb_target_property,
- VALUE rb_flags)
+rg_bind_property(gint argc, VALUE *argv, VALUE self)
{
+ VALUE rb_source_property;
+ VALUE rb_target;
+ VALUE rb_target_property;
+ VALUE rb_flags;
+ VALUE rb_options;
+ VALUE rb_transform_to;
+ VALUE rb_transform_from;
+
gpointer source;
const gchar *source_property;
gpointer target;
const gchar *target_property;
GBindingFlags flags;
GBinding *binding;
+ GBindingTransformFunc transform_to = NULL;
+ GBindingTransformFunc transform_from = NULL;
+
+ rb_scan_args(argc, argv, "41", &rb_source_property, &rb_target,
+ &rb_target_property, &rb_flags, &rb_options);
+
+ rbg_scan_options(rb_options,
+ "transform_to", &rb_transform_to,
+ "transform_from", &rb_transform_from,
+ NULL);
source = RVAL2GOBJ(self);
source_property = RVAL2CSTR(rb_source_property);
@@ -641,9 +719,33 @@ rg_bind_property(VALUE self,
target_property = RVAL2CSTR(rb_target_property);
flags = RVAL2GBINDINGFLAGS(rb_flags);
- binding = g_object_bind_property(source, source_property,
- target, target_property,
- flags);
+ if (!NIL_P(rb_transform_to)) {
+ G_CHILD_ADD(self, rb_transform_to);
+ transform_to = rg_bind_property_transform_to_callback;
+ }
+
+ if (!NIL_P(rb_transform_from)) {
+ G_CHILD_ADD(self, rb_transform_from);
+ transform_from = rg_bind_property_transform_from_callback;
+ }
+
+ if (transform_to || transform_from) {
+ RGBindPropertyCallbackData *data;
+ data = (RGBindPropertyCallbackData *)xmalloc(sizeof(RGBindPropertyCallbackData));
+ data->self = self;
+ data->transform_to_callback = rb_transform_to;
+ data->transform_from_callback = rb_transform_from;
+ binding = g_object_bind_property_full(source, source_property,
+ target, target_property,
+ flags, transform_to,
+ transform_from,
+ (gpointer)data,
+ rg_destroy_bind_property_full_data);
+ } else {
+ binding = g_object_bind_property(source, source_property,
+ target, target_property,
+ flags);
+ }
return GOBJ2RVAL(binding);
}
@@ -882,7 +984,7 @@ Init_gobject_gobject(void)
RG_DEF_METHOD(type_name, 0);
#if GLIB_CHECK_VERSION(2, 26, 0)
- RG_DEF_METHOD(bind_property, 4);
+ RG_DEF_METHOD(bind_property, -1);
G_DEF_CLASS(G_TYPE_BINDING_FLAGS, "BindingFlags", mGLib);
#endif
diff --git a/glib2/ext/glib2/rbgobj_signal.c b/glib2/ext/glib2/rbgobj_signal.c
index 48b664e..22787b3 100644
--- a/glib2/ext/glib2/rbgobj_signal.c
+++ b/glib2/ext/glib2/rbgobj_signal.c
@@ -309,7 +309,18 @@ gobj_sig_connect_impl(gboolean after, int argc, VALUE *argv, VALUE self)
if (!g_signal_parse_name(sig_name, CLASS2GTYPE(CLASS_OF(self)), &signal_id, &detail, TRUE))
rb_raise(eNoSignalError, "no such signal: %s", sig_name);
- func = rb_block_proc();
+ {
+ ID id_create_signal_handler;
+ const char *normalized_signal_name;
+
+ CONST_ID(id_create_signal_handler, "create_signal_handler");
+ normalized_signal_name = g_signal_name(signal_id);
+ func = rb_funcall(self,
+ rb_intern("create_signal_handler"),
+ 2,
+ rb_str_new_cstr(normalized_signal_name),
+ rb_block_proc());
+ }
rclosure = g_rclosure_new(func, rest,
rbgobj_get_signal_func(signal_id));
g_rclosure_attach((GClosure *)rclosure, self);
diff --git a/glib2/ext/glib2/rbgobj_type.c b/glib2/ext/glib2/rbgobj_type.c
index 81e89d4..a8a8009 100644
--- a/glib2/ext/glib2/rbgobj_type.c
+++ b/glib2/ext/glib2/rbgobj_type.c
@@ -399,8 +399,9 @@ init_typemap(void)
gtype_to_cinfo = g_hash_table_new(g_direct_hash, g_direct_equal);
rb_global_variable(&klass_to_cinfo);
klass_to_cinfo = rb_hash_new();
-
+#ifndef RUBY_INTEGER_UNIFICATION
_register_fundamental_klass_to_gtype(rb_cFixnum, G_TYPE_LONG);
+#endif
_register_fundamental_klass_to_gtype(rb_cFloat, G_TYPE_DOUBLE);
_register_fundamental_klass_to_gtype(rb_cInteger, G_TYPE_LONG);
_register_fundamental_klass_to_gtype(rb_cString, G_TYPE_STRING);
@@ -420,8 +421,13 @@ init_typemap(void)
_register_fundamental_gtype_to_klass(G_TYPE_UINT64, rb_cInteger);
_register_fundamental_gtype_to_klass(G_TYPE_INT, rb_cInteger);
_register_fundamental_gtype_to_klass(G_TYPE_LONG, rb_cInteger);
+#ifdef RUBY_INTEGER_UNIFICATION
+ _register_fundamental_gtype_to_klass(G_TYPE_CHAR, rb_cInteger);
+ _register_fundamental_gtype_to_klass(G_TYPE_UCHAR, rb_cInteger);
+#else
_register_fundamental_gtype_to_klass(G_TYPE_CHAR, rb_cFixnum);
_register_fundamental_gtype_to_klass(G_TYPE_UCHAR, rb_cFixnum);
+#endif
_register_fundamental_gtype_to_klass(G_TYPE_STRING, rb_cString);
_register_fundamental_gtype_to_klass(G_TYPE_ULONG, rb_cInteger);
_register_fundamental_gtype_to_klass(G_TYPE_NONE, rb_cNilClass);
diff --git a/glib2/ext/glib2/rbgobject.c b/glib2/ext/glib2/rbgobject.c
index a822d42..c20bd37 100644
--- a/glib2/ext/glib2/rbgobject.c
+++ b/glib2/ext/glib2/rbgobject.c
@@ -321,14 +321,8 @@ rbgobj_define_property_accessors(VALUE klass)
g_string_append_printf(source,
"def set_%s(val); set_property('%s', val); end\n",
prop_name, pspec->name);
-#ifdef HAVE_NODE_ATTRASGN
g_string_append_printf(source, "alias %s= set_%s\n",
prop_name, prop_name);
-#else
- g_string_append_printf(source,
- "def %s=(val); set_property('%s', val); val; end\n",
- prop_name, pspec->name);
-#endif
}
g_free(buf);
diff --git a/glib2/ext/glib2/rbgprivate.h b/glib2/ext/glib2/rbgprivate.h
index 15d5d5c..57f9636 100644
--- a/glib2/ext/glib2/rbgprivate.h
+++ b/glib2/ext/glib2/rbgprivate.h
@@ -27,10 +27,6 @@
# define rb_errinfo() (ruby_errinfo)
#endif
-#ifndef HAVE_RB_STR_NEW_CSTR
-# define rb_str_new_cstr(c_string) rb_str_new2(c_string)
-#endif
-
#ifndef HAVE_RB_EXC_NEW_STR
# define rb_exc_new_str(klass, message) rb_exc_new3(klass, message)
#endif
diff --git a/glib2/ext/glib2/rbgutil.c b/glib2/ext/glib2/rbgutil.c
index cee70fb..eabec1c 100644
--- a/glib2/ext/glib2/rbgutil.c
+++ b/glib2/ext/glib2/rbgutil.c
@@ -116,10 +116,8 @@ rbgutil_generic_gtype(VALUE self)
VALUE
rbgutil_string_set_utf8_encoding(VALUE string)
{
-#ifdef HAVE_RUBY_ENCODING_H
if (!NIL_P(string))
rb_enc_associate(string, rb_utf8_encoding());
-#endif
return string;
}
diff --git a/glib2/ext/glib2/rbgutil.h b/glib2/ext/glib2/rbgutil.h
index 7634adb..d00c04f 100644
--- a/glib2/ext/glib2/rbgutil.h
+++ b/glib2/ext/glib2/rbgutil.h
@@ -24,9 +24,7 @@
#include <glib-object.h>
#include "ruby.h"
-#ifdef HAVE_RUBY_ENCODING_H
-# include <ruby/encoding.h>
-#endif
+#include <ruby/encoding.h>
#include "rbglib.h"
#include "rbgutil_list.h"
#include "rbgutildeprecated.h"
diff --git a/glib2/lib/glib2.rb b/glib2/lib/glib2.rb
index fee7fad..6a211da 100644
--- a/glib2/lib/glib2.rb
+++ b/glib2/lib/glib2.rb
@@ -126,6 +126,13 @@ module GLib
end
end
+ class Instantiatable
+ private
+ def create_signal_handler(signal_name, callback)
+ callback
+ end
+ end
+
class Type
def decendants
diff --git a/glib2/lib/gnome2/rake/external-package.rb b/glib2/lib/gnome2/rake/external-package.rb
index 3b03f85..70c3850 100644
--- a/glib2/lib/gnome2/rake/external-package.rb
+++ b/glib2/lib/gnome2/rake/external-package.rb
@@ -16,6 +16,8 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+require "open-uri"
+
module GNOME2
module Rake
class ExternalPackage < Struct.new(:name,
@@ -97,13 +99,32 @@ module GNOME2
super || []
end
+ def latest_version
+ case download_site
+ when :gnome
+ latest_version_gnome
+ when :freedesktop
+ latest_version_freedesktop
+ when :freedesktop_gstreamer
+ latest_version_freedesktop_gstreamer
+ else
+ nil
+ end
+ end
+
private
def download_site_base_url
case download_site
when :gnome
- base_url = "http://ftp.gnome.org/pub/gnome/sources"
+ base_url = gnome_base_url
release_series = version.gsub(/\A(\d+\.\d+)(?:[^\d].*)?\z/, '\1')
base_url << "/#{name}/#{release_series}"
+ when :freedesktop
+ base_url = freedesktop_base_url
+ base_url << "/#{name}/release"
+ when :freedesktop_gstreamer
+ base_url = freedesktop_gstreamer_base_url
+ base_url << "/#{name}"
when :gnu
base_url = "http://ftp.gnu.org/pub/gnu/#{name}"
else
@@ -112,6 +133,96 @@ module GNOME2
base_url
end
+ def gnome_base_url
+ "http://ftp.gnome.org/pub/gnome/sources"
+ end
+
+ def freedesktop_base_url
+ "https://www.freedesktop.org/software"
+ end
+
+ def freedesktop_gstreamer_base_url
+ "https://gstreamer.freedesktop.org/src"
+ end
+
+ def sort_versions(versions)
+ versions.sort_by do |version|
+ version.split(".").collect(&:to_i)
+ end
+ end
+
+ def latest_version_gnome
+ base_url = "#{gnome_base_url}/#{name}"
+ minor_versions = []
+ open(base_url) do |index|
+ index.read.scan(/<a (.+?)>/) do |content,|
+ case content
+ when /href="(\d+(?:\.\d+)*)\/?"/
+ minor_version = $1
+ next if development_minor_version_gnome?(minor_version)
+ minor_versions << minor_version
+ end
+ end
+ end
+ return nil if minor_versions.empty?
+
+ latest_minor_version = sort_versions(minor_versions).last
+ versions = []
+ open("#{base_url}/#{latest_minor_version}") do |index|
+ index.read.scan(/<a (.+?)>/) do |content,|
+ case content
+ when /href="#{Regexp.escape(name)}-
+ (\d+(?:\.\d+)*)
+ \.tar\.#{Regexp.escape(compression_method)}"/x
+ versions << $1
+ end
+ end
+ end
+ sort_versions(versions).last
+ end
+
+ def development_minor_version_gnome?(minor_version)
+ minor_version.split(".").last.to_i.odd?
+ end
+
+ def latest_version_freedesktop
+ base_url = "#{freedesktop_base_url}/#{name}/release"
+ versions = []
+ open(base_url) do |index|
+ index.read.scan(/<a (.+?)>/) do |content,|
+ case content
+ when /href="#{Regexp.escape(name)}-
+ (\d+(?:\.\d+)*)
+ \.tar\.#{Regexp.escape(compression_method)}"/x
+ versions << $1
+ end
+ end
+ end
+ sort_versions(versions).last
+ end
+
+ def latest_version_freedesktop_gstreamer
+ base_url = "#{freedesktop_gstreamer_base_url}/#{name}"
+ versions = []
+ open(base_url) do |index|
+ index.read.scan(/<a (.+?)>/) do |content,|
+ case content
+ when /href="#{Regexp.escape(name)}-
+ (\d+(?:\.\d+)*)
+ \.tar\.#{Regexp.escape(compression_method)}"/x
+ version = $1
+ next if development_version_freedesktop_gstreamer?(version)
+ versions << version
+ end
+ end
+ end
+ sort_versions(versions).last
+ end
+
+ def development_version_freedesktop_gstreamer?(version)
+ version.split(".")[1].to_i.odd?
+ end
+
class WindowsConfiguration < Struct.new(:build,
:include_paths,
:library_paths,
@@ -124,7 +235,8 @@ module GNOME2
:need_autoreconf,
:build_concurrently,
:use_cc_environment_variable,
- :gobject_introspection_compiler_split_args)
+ :gobject_introspection_compiler_split_args,
+ :use_gobject_introspection)
def initialize(properties)
super()
properties.each do |key, value|
@@ -183,6 +295,10 @@ module GNOME2
def gobject_introspection_compiler_split_args?
gobject_introspection_compiler_split_args
end
+
+ def use_gobject_introspection?
+ use_gobject_introspection.nil? ? true : use_gobject_introspection
+ end
end
class NativeConfiguration < Struct.new(:build,
diff --git a/glib2/lib/gnome2/rake/package-task.rb b/glib2/lib/gnome2/rake/package-task.rb
index 9988e44..e4d0e5e 100644
--- a/glib2/lib/gnome2/rake/package-task.rb
+++ b/glib2/lib/gnome2/rake/package-task.rb
@@ -93,6 +93,10 @@ module GNOME2
@package.external_packages = packages
end
+ def windows_binary_build_task
+ @windows_binary_build_task ||= WindowsBinaryBuildTask.new(@package)
+ end
+
private
def initialize_variables
@summary = ""
@@ -133,7 +137,7 @@ module GNOME2
"{sample,test}/**/*"]
files.existing!
s.files = files
- s.required_ruby_version = @required_ruby_version || ">= 1.9.3"
+ s.required_ruby_version = @required_ruby_version || ">= 2.1.0"
s.post_install_message = @post_install_message
@dependency_configuration.apply(s)
end
@@ -161,6 +165,7 @@ module GNOME2
define_windows_extension_task
define_windows_download_task
define_windows_build_task
+ define_windows_version_update_task
end
def so_base_name
@@ -214,11 +219,66 @@ module GNOME2
end
def define_windows_download_task
- GNOME2WindowsBinaryDownloadTask.new(@package)
+ task = WindowsBinaryDownloadTask.new(@package)
+ task.define
end
def define_windows_build_task
- GNOME2WindowsBinaryBuildTask.new(@package)
+ windows_binary_build_task.define
+ end
+
+ def define_windows_version_update_task
+ namespace :windows do
+ namespace :version do
+ task_names = []
+ namespace :update do
+ @package.external_packages.each do |package|
+ task_names << package.name
+ task package.name do
+ latest_version = package.latest_version || package.version
+ if package.version != latest_version
+ update_package_version(package, latest_version)
+ end
+ end
+ end
+ end
+
+ full_task_names = task_names.collect do |name|
+ "windows:version:update:#{name}"
+ end
+ desc "Update Windows package versions"
+ task :update => full_task_names
+ end
+ end
+ end
+
+ def update_package_version(package, latest_version)
+ rakefile_path = ::Rake.application.rakefile
+ rakefile_content = File.read(rakefile_path)
+ updated_rakefile_content = ""
+ in_package = false
+ escaped_name = Regexp.escape(package.name)
+ escaped_version = Regexp.escape(package.version)
+ rakefile_content.each_line do |line|
+ case line
+ when /:name => "#{escaped_name}",/
+ in_package = true
+ updated_rakefile_content << line
+ when /:version => "#{escaped_version}",/
+ if in_package
+ updated_rakefile_content << line.gsub(/#{escaped_version}/,
+ latest_version)
+ in_package = false
+ else
+ updated_rakefile_content << line
+ end
+ else
+ updated_rakefile_content << line
+ end
+ end
+ File.open(rakefile_path, "w") do |rakefile|
+ rakefile.write(updated_rakefile_content)
+ end
end
def define_package_tasks
diff --git a/glib2/lib/gnome2/rake/windows-binary-build-task.rb b/glib2/lib/gnome2/rake/windows-binary-build-task.rb
index f5cc0fc..874f6d4 100644
--- a/glib2/lib/gnome2/rake/windows-binary-build-task.rb
+++ b/glib2/lib/gnome2/rake/windows-binary-build-task.rb
@@ -5,340 +5,346 @@
require "open-uri"
require "pathname"
-class GNOME2WindowsBinaryBuildTask
- include Rake::DSL
-
- def initialize(package)
- @package = package
- define
- end
-
- private
- def define
- namespace :windows do
- namespace :builder do
- task :before
- define_build_tasks
- build_tasks = build_packages.collect do |package|
- "windows:builder:build:#{package.name}"
- end
- task :build => build_tasks
- task :after
- end
- desc "Build Windows binaries"
- task :build => ["windows:builder:before",
- "windows:builder:build",
- "windows:builder:after"]
- end
- end
-
- def define_build_tasks
- namespace :build do
- prepare_task_names = []
- namespace :prepare do
- prepare_task_names << "pkg_config"
- task :pkg_config do
- depended_packages = @package.windows.build_dependencies
- use_packages = [@package.name] + depended_packages
- pkg_config_path = use_packages.collect do |package|
- "../#{package}/#{@package.windows.relative_binary_dir}/lib/pkgconfig"
- end
- ENV["PKG_CONFIG_PATH"] = pkg_config_path.collect do |path|
- File.expand_path(path)
- end.join(":")
- ENV["PKG_CONFIG_LIBDIR"] = rcairo_windows_pkgconfig_path
- end
-
- prepare_task_names << "pkg_config_for_build"
- task :pkg_config_for_build do
- # XXX: Is it needless?
- # ENV["PKG_CONFIG_FOR_BUILD"] = "env - pkg-config"
- end
- end
-
- full_prepare_task_names = prepare_task_names.collect do |name|
- "windows:builder:build:prepare:#{name}"
- end
- task :prepare => full_prepare_task_names
-
- build_packages.each do |package|
- namespace package.name do
- task :before
- download_task = "source:downloader:download:#{package.name}"
- built_file = package.windows.built_file
- if built_file
- built_file = dist_dir + built_file
- file built_file.to_s do
- Rake::Task["windows:builder:build:prepare"].invoke
- Rake::Task[download_task].invoke
- build_package_task_body(package)
- end
- task :build => built_file.to_s
- else
- task :build => [:prepare, download_task] do
- build_package_task_body(package)
- end
- end
- task :after
- end
-
- prefix = "windows:builder:build:#{package.name}"
- desc "Build #{package.label} and install it into #{dist_dir}."
- task package.name => [
- "#{prefix}:before",
- "#{prefix}:build",
- "#{prefix}:after",
- ]
- end
- end
- end
-
- def build_package_task_body(package)
- package_tmp_dir = @package.tmp_dir + "windows" + package.name
- rm_rf(package_tmp_dir)
- mkdir_p(package_tmp_dir)
-
- tar_full_path = @package.download_dir + package.archive_base_name
- Dir.chdir(package_tmp_dir.to_s) do
- sh("tar", "xf", tar_full_path.to_s)
- end
-
- package_dir_path =
- package_tmp_dir + package.base_name + package.base_dir_in_package
- Dir.chdir(package_dir_path.to_s) do
- package.windows.patches.each do |patch|
- sh("patch -p1 < #{@package.patches_dir}/#{patch}")
- end
- if File.exist?("configure")
- configure(package)
- else
- cmake(package)
- end
- common_make_args = []
- common_make_args << "MAKE=make"
- common_make_args << "GLIB_COMPILE_SCHEMAS=glib-compile-schemas"
- if package.windows.use_cc_environment_variable?
- common_make_args << cc_env(package)
- end
- add_gobject_introspection_make_args(package, common_make_args)
- build_make_args = common_make_args.dup
- install_make_args = common_make_args.dup
- if package.windows.build_concurrently?
- make_n_jobs = ENV["MAKE_N_JOBS"]
- build_make_args << "-j#{make_n_jobs}" if make_n_jobs
- end
- ENV["GREP_OPTIONS"] = "--text"
- # ENV["GI_SCANNER_DEBUG"] = "save-temps"
- # build_make_args << "--debug"
- # build_make_args << "V=1"
- sh("nice", "make", *build_make_args) or exit(false)
- sh("make", "install", *install_make_args) or exit(false)
-
- package_license_dir = license_dir + package.name
- mkdir_p(package_license_dir)
- package_license_files = ["AUTHORS", "COPYING", "COPYING.LIB"]
- package_license_files = package_license_files.reject do |file|
- not File.exist?(file)
- end
- cp(package_license_files, package_license_dir)
- bundled_packages = package.bundled_packages
- bundled_packages.each do |bundled_package|
- bundled_package_license_dir = license_dir + bundled_package[:name]
- mkdir_p(bundled_package_license_dir)
- license_files = bundled_package[:license_files].collect do |file|
- File.join(bundled_package[:path], file)
- end
- cp(license_files, bundled_package_license_dir)
- end
- end
- end
-
- def configure(package)
- sh("./autogen.sh") if package.windows.need_autogen?
- sh("autoreconf", "--install", "--force") if package.windows.need_autoreconf?
- sh("./configure",
- cc_env(package),
- dlltool_env,
- "CPPFLAGS=#{cppflags(package)}",
- "LDFLAGS=#{ldflags(package)}",
- "--prefix=#{dist_dir}",
- "--host=#{@package.windows.build_host}",
- *package.windows.configure_args) or exit(false)
- end
-
- def cmake(package)
- sh("cmake",
- ".",
- "-DCMAKE_INSTALL_PREFIX=#{dist_dir}",
- "-DCMAKE_SYSTEM_NAME=Windows",
- "-DCMAKE_SYSTEM_PROCESSOR=#{@package.windows.build_architecture}",
- "-DCMAKE_C_COMPILER=#{cc(package)}",
- "-DCMAKE_CXX_COMPILER=#{cxx(package)}",
- *package.windows.cmake_args) or exit(false)
- end
-
- def cc_env(package)
- "CC=#{cc(package)}"
- end
-
- def dlltool_env
- "DLLTOOL=#{dlltool}"
- end
-
- def build_packages
- packages = @package.external_packages.select do |package|
- package.windows.build?
- end
- # For backward compatibility
- packages + @package.windows.build_packages
- end
-
- def dist_dir
- @package.windows.absolute_binary_dir
- end
-
- def license_dir
- dist_dir + "share" + "license"
- end
-
- def glib2_binary_base_dir
- @package.glib2_root_dir + "vendor" + "local"
- end
-
- def glib2_include_path
- "#{glib2_binary_base_dir}/include"
- end
-
- def glib2_lib_path
- "#{glib2_binary_base_dir}/lib"
- end
-
- def rcairo_windows_dir
- suffix = @package.windows.build_architecture_suffix
- @package.project_root_dir.parent + "rcairo.#{suffix}"
- end
-
- def rcairo_windows_binary_base_dir
- rcairo_windows_dir + "vendor" + "local"
- end
-
- def rcairo_windows_pkgconfig_path
- "#{rcairo_windows_binary_base_dir}/lib/pkgconfig"
- end
-
- def rcairo_windows_include_path
- "#{rcairo_windows_binary_base_dir}/include"
- end
-
- def rcairo_windows_lib_path
- "#{rcairo_windows_binary_base_dir}/lib"
- end
-
- def cc(package)
- cc_command_line = [
- "#{@package.windows.build_host}-gcc",
- *package.windows.cc_args,
- ]
- cc_command_line.compact.join(" ")
- end
-
- def cxx(package)
- cxx_command_line = [
- "#{@package.windows.build_host}-g++",
- ]
- cxx_command_line.compact.join(" ")
- end
-
- def dlltool
- "#{@package.windows.build_host}-dlltool"
- end
-
- def cppflags(package)
- include_paths = package.windows.include_paths
- if @package.windows.build_dependencies.include?("glib2")
- include_paths += [glib2_include_path]
- end
- include_paths += [
- rcairo_windows_include_path,
- dist_dir + 'include',
- ]
- cppflags = include_paths.collect do |path|
- "-I#{path}"
- end
- cppflags.join(" ")
- end
-
- def ldflags(package)
- library_paths = package.windows.library_paths
- if @package.windows.build_dependencies.include?("glib2")
- library_paths += [glib2_lib_path]
- end
- library_paths += [
- rcairo_windows_lib_path,
- dist_dir + 'lib',
- ]
- ldflags = library_paths.collect do |path|
- "-L#{path}"
- end
- ldflags.join(" ")
- end
-
- def cmake_root_paths
- paths = [
- "/usr/#{@package.windows.build_host}",
- rcairo_windows_binary_base_dir.to_path,
- ]
- @package.windows.build_dependencies.each do |package|
- paths << "#{@package.project_root_dir}/#{package}/vendor/local"
- end
- paths
- end
-
- def add_gobject_introspection_make_args(package, common_make_args)
- unless @package.windows.build_dependencies.include?("gobject-introspection")
- return
- end
-
- g_ir_scanner = "#{@package.project_root_dir}/gobject-introspection/"
- g_ir_scanner << "#{@package.native.relative_binary_dir}/bin/g-ir-scanner"
- introspection_scanner = "INTROSPECTION_SCANNER=#{g_ir_scanner}"
- common_make_args << introspection_scanner
-
-
- dependencies = [
- "gobject-introspection",
- @package.name,
- ]
- dependencies += @package.windows.gobject_introspection_dependencies
-
- compute_base_dir = lambda do |dependent_package|
- "#{@package.project_root_dir}/#{dependent_package}/vendor/local"
- end
-
- gi_base_dir = compute_base_dir.call("gobject-introspection")
- introspection_compiler = "INTROSPECTION_COMPILER="
- introspection_compiler << "#{gi_base_dir}/bin/g-ir-compiler.exe"
- introspection_compiler_args = ""
- dependencies.each do |dependent_package|
- gir_dir = "#{compute_base_dir.call(dependent_package)}/share/gir-1.0"
- introspection_compiler_args << " --includedir=#{gir_dir}"
- end
- if package.windows.gobject_introspection_compiler_split_args?
- common_make_args << introspection_compiler
- common_make_args <<
- "INTROSPECTION_COMPILER_ARGS=#{introspection_compiler_args}"
- common_make_args <<
- "INTROSPECTION_COMPILER_OPTS=#{introspection_compiler_args}"
- else
- introspection_compiler << " #{introspection_compiler_args}"
- common_make_args << introspection_compiler
- end
-
- common_make_args << dlltool_env
-
- data_dirs = dependencies.collect do |dependent_package|
- "#{compute_base_dir.call(dependent_package)}/share"
- end
- common_make_args << "XDG_DATA_DIRS=#{data_dirs.join(File::PATH_SEPARATOR)}"
- end
-end
+module GNOME2
+ module Rake
+ class WindowsBinaryBuildTask
+ include ::Rake::DSL
+
+ def initialize(package)
+ @package = package
+ end
+
+ def define
+ namespace :windows do
+ namespace :builder do
+ task :before
+ define_build_tasks
+ build_tasks = build_packages.collect do |package|
+ "windows:builder:build:#{package.name}"
+ end
+ task :build => build_tasks
+ task :after
+ end
+ desc "Build Windows binaries"
+ task :build => ["windows:builder:before",
+ "windows:builder:build",
+ "windows:builder:after"]
+ end
+ end
+
+ def rcairo_windows_binary_base_dir
+ rcairo_windows_dir + "vendor" + "local"
+ end
+
+ private
+ def define_build_tasks
+ namespace :build do
+ prepare_task_names = []
+ namespace :prepare do
+ prepare_task_names << "pkg_config"
+ task :pkg_config do
+ depended_packages = @package.windows.build_dependencies
+ use_packages = [@package.name] + depended_packages
+ pkg_config_path = use_packages.collect do |package|
+ "../#{package}/#{@package.windows.relative_binary_dir}/lib/pkgconfig"
+ end
+ ENV["PKG_CONFIG_PATH"] = pkg_config_path.collect do |path|
+ File.expand_path(path)
+ end.join(":")
+ ENV["PKG_CONFIG_LIBDIR"] = rcairo_windows_pkgconfig_path
+ end
+
+ prepare_task_names << "pkg_config_for_build"
+ task :pkg_config_for_build do
+ # XXX: Is it needless?
+ # ENV["PKG_CONFIG_FOR_BUILD"] = "env - pkg-config"
+ end
+ end
+
+ full_prepare_task_names = prepare_task_names.collect do |name|
+ "windows:builder:build:prepare:#{name}"
+ end
+ task :prepare => full_prepare_task_names
+
+ build_packages.each do |package|
+ namespace package.name do
+ task :before
+ download_task = "source:downloader:download:#{package.name}"
+ built_file = package.windows.built_file
+ if built_file
+ built_file = dist_dir + built_file
+ file built_file.to_s do
+ ::Rake::Task["windows:builder:build:prepare"].invoke
+ ::Rake::Task[download_task].invoke
+ build_package_task_body(package)
+ end
+ task :build => built_file.to_s
+ else
+ task :build => [:prepare, download_task] do
+ build_package_task_body(package)
+ end
+ end
+ task :after
+ end
+
+ prefix = "windows:builder:build:#{package.name}"
+ desc "Build #{package.label} and install it into #{dist_dir}."
+ task package.name => [
+ "#{prefix}:before",
+ "#{prefix}:build",
+ "#{prefix}:after",
+ ]
+ end
+ end
+ end
+
+ def build_package_task_body(package)
+ package_tmp_dir = @package.tmp_dir + "windows" + package.name
+ rm_rf(package_tmp_dir)
+ mkdir_p(package_tmp_dir)
+
+ tar_full_path = @package.download_dir + package.archive_base_name
+ Dir.chdir(package_tmp_dir.to_s) do
+ sh("tar", "xf", tar_full_path.to_s)
+ end
+
+ package_dir_path =
+ package_tmp_dir + package.base_name + package.base_dir_in_package
+ Dir.chdir(package_dir_path.to_s) do
+ package.windows.patches.each do |patch|
+ sh("patch -p1 < #{@package.patches_dir}/#{patch}")
+ end
+ if File.exist?("configure")
+ configure(package)
+ else
+ cmake(package)
+ end
+ common_make_args = []
+ common_make_args << "MAKE=make"
+ common_make_args << "GLIB_COMPILE_SCHEMAS=glib-compile-schemas"
+ if package.windows.use_cc_environment_variable?
+ common_make_args << cc_env(package)
+ end
+ add_gobject_introspection_make_args(package, common_make_args)
+ build_make_args = common_make_args.dup
+ install_make_args = common_make_args.dup
+ if package.windows.build_concurrently?
+ make_n_jobs = ENV["MAKE_N_JOBS"]
+ build_make_args << "-j#{make_n_jobs}" if make_n_jobs
+ end
+ ENV["GREP_OPTIONS"] = "--text"
+ # ENV["GI_SCANNER_DEBUG"] = "save-temps"
+ # build_make_args << "--debug"
+ # build_make_args << "V=1"
+ sh("nice", "make", *build_make_args) or exit(false)
+ sh("make", "install", *install_make_args) or exit(false)
+
+ package_license_dir = license_dir + package.name
+ mkdir_p(package_license_dir)
+ package_license_files = ["AUTHORS", "COPYING", "COPYING.LIB"]
+ package_license_files = package_license_files.reject do |file|
+ not File.exist?(file)
+ end
+ cp(package_license_files, package_license_dir)
+ bundled_packages = package.bundled_packages
+ bundled_packages.each do |bundled_package|
+ bundled_package_license_dir = license_dir + bundled_package[:name]
+ mkdir_p(bundled_package_license_dir)
+ license_files = bundled_package[:license_files].collect do |file|
+ File.join(bundled_package[:path], file)
+ end
+ cp(license_files, bundled_package_license_dir)
+ end
+ end
+ end
+
+ def configure(package)
+ sh("./autogen.sh") if package.windows.need_autogen?
+ sh("autoreconf", "--install", "--force") if package.windows.need_autoreconf?
+ sh("./configure",
+ cc_env(package),
+ dlltool_env,
+ "CPPFLAGS=#{cppflags(package)}",
+ "LDFLAGS=#{ldflags(package)}",
+ "--prefix=#{dist_dir}",
+ "--host=#{@package.windows.build_host}",
+ *package.windows.configure_args) or exit(false)
+ end
+
+ def cmake(package)
+ sh("cmake",
+ ".",
+ "-DCMAKE_INSTALL_PREFIX=#{dist_dir}",
+ "-DCMAKE_SYSTEM_NAME=Windows",
+ "-DCMAKE_SYSTEM_PROCESSOR=#{@package.windows.build_architecture}",
+ "-DCMAKE_C_COMPILER=#{cc(package)}",
+ "-DCMAKE_CXX_COMPILER=#{cxx(package)}",
+ *package.windows.cmake_args) or exit(false)
+ end
+
+ def cc_env(package)
+ "CC=#{cc(package)}"
+ end
+
+ def dlltool_env
+ "DLLTOOL=#{dlltool}"
+ end
+
+ def build_packages
+ packages = @package.external_packages.select do |package|
+ package.windows.build?
+ end
+ # For backward compatibility
+ packages + @package.windows.build_packages
+ end
+
+ def dist_dir
+ @package.windows.absolute_binary_dir
+ end
+
+ def license_dir
+ dist_dir + "share" + "license"
+ end
+
+ def glib2_binary_base_dir
+ @package.glib2_root_dir + "vendor" + "local"
+ end
+
+ def glib2_include_path
+ "#{glib2_binary_base_dir}/include"
+ end
+
+ def glib2_lib_path
+ "#{glib2_binary_base_dir}/lib"
+ end
+
+ def rcairo_windows_dir
+ suffix = @package.windows.build_architecture_suffix
+ @package.project_root_dir.parent + "rcairo.#{suffix}"
+ end
+
+ def rcairo_windows_pkgconfig_path
+ "#{rcairo_windows_binary_base_dir}/lib/pkgconfig"
+ end
+
+ def rcairo_windows_include_path
+ "#{rcairo_windows_binary_base_dir}/include"
+ end
+
+ def rcairo_windows_lib_path
+ "#{rcairo_windows_binary_base_dir}/lib"
+ end
+
+ def cc(package)
+ cc_command_line = [
+ "#{@package.windows.build_host}-gcc",
+ *package.windows.cc_args,
+ ]
+ cc_command_line.compact.join(" ")
+ end
+
+ def cxx(package)
+ cxx_command_line = [
+ "#{@package.windows.build_host}-g++",
+ ]
+ cxx_command_line.compact.join(" ")
+ end
+
+ def dlltool
+ "#{@package.windows.build_host}-dlltool"
+ end
+
+ def cppflags(package)
+ include_paths = package.windows.include_paths
+ if @package.windows.build_dependencies.include?("glib2")
+ include_paths += [glib2_include_path]
+ end
+ include_paths += [
+ rcairo_windows_include_path,
+ dist_dir + 'include',
+ ]
+ cppflags = include_paths.collect do |path|
+ "-I#{path}"
+ end
+ cppflags.join(" ")
+ end
+
+ def ldflags(package)
+ library_paths = package.windows.library_paths
+ if @package.windows.build_dependencies.include?("glib2")
+ library_paths += [glib2_lib_path]
+ end
+ library_paths += [
+ rcairo_windows_lib_path,
+ dist_dir + 'lib',
+ ]
+ ldflags = library_paths.collect do |path|
+ "-L#{path}"
+ end
+ ldflags.join(" ")
+ end
+
+ def cmake_root_paths
+ paths = [
+ "/usr/#{@package.windows.build_host}",
+ rcairo_windows_binary_base_dir.to_path,
+ ]
+ @package.windows.build_dependencies.each do |package|
+ paths << "#{@package.project_root_dir}/#{package}/vendor/local"
+ end
+ paths
+ end
+
+ def add_gobject_introspection_make_args(package, common_make_args)
+ return unless use_gobject_introspection?(package)
+
+ g_ir_scanner = "#{@package.project_root_dir}/gobject-introspection/"
+ g_ir_scanner << "#{@package.native.relative_binary_dir}/bin/g-ir-scanner"
+ introspection_scanner = "INTROSPECTION_SCANNER=#{g_ir_scanner}"
+ common_make_args << introspection_scanner
+
+
+ dependencies = [
+ "gobject-introspection",
+ @package.name,
+ ]
+ dependencies += @package.windows.gobject_introspection_dependencies
+
+ compute_base_dir = lambda do |dependent_package|
+ "#{@package.project_root_dir}/#{dependent_package}/vendor/local"
+ end
+
+ gi_base_dir = compute_base_dir.call("gobject-introspection")
+ introspection_compiler = "INTROSPECTION_COMPILER="
+ introspection_compiler << "#{gi_base_dir}/bin/g-ir-compiler.exe"
+ introspection_compiler_args = ""
+ dependencies.each do |dependent_package|
+ gir_dir = "#{compute_base_dir.call(dependent_package)}/share/gir-1.0"
+ introspection_compiler_args << " --includedir=#{gir_dir}"
+ end
+ if package.windows.gobject_introspection_compiler_split_args?
+ common_make_args << introspection_compiler
+ common_make_args <<
+ "INTROSPECTION_COMPILER_ARGS=#{introspection_compiler_args}"
+ common_make_args <<
+ "INTROSPECTION_COMPILER_OPTS=#{introspection_compiler_args}"
+ else
+ introspection_compiler << " #{introspection_compiler_args}"
+ common_make_args << introspection_compiler
+ end
+
+ common_make_args << dlltool_env
+
+ data_dirs = dependencies.collect do |dependent_package|
+ "#{compute_base_dir.call(dependent_package)}/share"
+ end
+ common_make_args << "XDG_DATA_DIRS=#{data_dirs.join(File::PATH_SEPARATOR)}"
+ end
+
+ def use_gobject_introspection?(package)
+ return false unless package.windows.use_gobject_introspection?
+ @package.windows.build_dependencies.include?("gobject-introspection")
+ end
+ end
+ end
+ end
diff --git a/glib2/lib/gnome2/rake/windows-binary-download-task.rb b/glib2/lib/gnome2/rake/windows-binary-download-task.rb
index 4d1fbd1..418bb5f 100644
--- a/glib2/lib/gnome2/rake/windows-binary-download-task.rb
+++ b/glib2/lib/gnome2/rake/windows-binary-download-task.rb
@@ -6,174 +6,177 @@ require 'open-uri'
require 'rubygems'
require 'mechanize'
-class GNOME2WindowsBinaryDownloadTask
- include Rake::DSL
-
- URL_BASE = "http://ftp.gnome.org/pub/gnome/binaries"
- def initialize(package)
- @package = package
- define
- end
+module GNOME2
+ module Rake
+ class WindowsBinaryDownloadTask
+ include ::Rake::DSL
+
+ URL_BASE = "http://ftp.gnome.org/pub/gnome/binaries"
+ def initialize(package)
+ @package = package
+ end
- private
- def define
- namespace :windows do
- namespace :downloader do
- task :before
-
- download_tasks = []
- namespace :download do
- directory dist_dir.to_s
- task :prepare => [dist_dir.to_s]
-
- packages.each do |package|
- desc "download #{package}"
- task package => [:prepare] do
- download_package(package)
+ def define
+ namespace :windows do
+ namespace :downloader do
+ task :before
+
+ download_tasks = []
+ namespace :download do
+ directory dist_dir.to_s
+ task :prepare => [dist_dir.to_s]
+
+ packages.each do |package|
+ desc "download #{package}"
+ task package => [:prepare] do
+ download_package(package)
+ end
+ download_tasks << package
+ end
+
+ dependencies.each do |dependency|
+ name, version = dependency
+ desc "download #{name}"
+ task name => [:prepare] do
+ download_dependency(dependency)
+ end
+ download_tasks << name
+ end
end
- download_tasks << package
- end
- dependencies.each do |dependency|
- name, version = dependency
- desc "download #{name}"
- task name => [:prepare] do
- download_dependency(dependency)
+ download_tasks = download_tasks.collect do |task|
+ "windows:downloader:download:#{task}"
end
- download_tasks << name
- end
- end
+ desc "download Windows binaries into #{dist_dir}"
+ task :download => download_tasks
- download_tasks = download_tasks.collect do |task|
- "windows:downloader:download:#{task}"
+ task :after
+ end
+ desc "download Windows binaries"
+ task :download => ["windows:downloader:before",
+ "windows:downloader:download",
+ "windows:downloader:after"]
end
- desc "download Windows binaries into #{dist_dir}"
- task :download => download_tasks
+ end
- task :after
+ private
+ def dist_dir
+ @package.windows.absolute_binary_dir
end
- desc "download Windows binaries"
- task :download => ["windows:downloader:before",
- "windows:downloader:download",
- "windows:downloader:after"]
- end
- end
- def dist_dir
- @package.windows.absolute_binary_dir
- end
+ def packages
+ @package.windows.packages
+ end
- def packages
- @package.windows.packages
- end
+ def dependencies
+ @package.windows.dependencies
+ end
- def dependencies
- @package.windows.dependencies
- end
+ def build_architecture_suffix
+ @package.windows.build_architecture_suffix
+ end
- def build_architecture_suffix
- @package.windows.build_architecture_suffix
- end
+ def download_package(package)
+ suffix = build_architecture_suffix
+ version_page_url = "#{URL_BASE}/#{suffix}/#{package}"
+ version_page = agent.get(version_page_url)
+ latest_version_link = version_page.links.sort_by do |link|
+ if /\A(\d+\.\d+)\/\z/ =~ link.href
+ $1.split(/\./).collect {|component| component.to_i}
+ else
+ [-1]
+ end
+ end.last
+
+ escaped_package = Regexp.escape(package)
+ latest_version_page = latest_version_link.click
+ latest_version = latest_version_page.links.collect do |link|
+ case link.href
+ when /#{escaped_package}_([\d\.\-]+)_#{suffix}\.zip\z/,
+ /#{escaped_package}-([\d\.\-]+)-#{suffix}\.zip\z/, # old
+ /#{escaped_package}-([\d\.\-]+)\.zip\z/ # old
+ version = $1
+ normalized_version = version.split(/[\.\-]/).collect do |component|
+ component.to_i
+ end
+ [normalized_version, version]
+ else
+ [[-1], nil]
+ end
+ end.sort_by do |normalized_version, version|
+ normalized_version
+ end.last[1]
- def download_package(package)
- suffix = build_architecture_suffix
- version_page_url = "#{URL_BASE}/#{suffix}/#{package}"
- version_page = agent.get(version_page_url)
- latest_version_link = version_page.links.sort_by do |link|
- if /\A(\d+\.\d+)\/\z/ =~ link.href
- $1.split(/\./).collect {|component| component.to_i}
- else
- [-1]
- end
- end.last
-
- escaped_package = Regexp.escape(package)
- latest_version_page = latest_version_link.click
- latest_version = latest_version_page.links.collect do |link|
- case link.href
- when /#{escaped_package}_([\d\.\-]+)_#{suffix}\.zip\z/,
- /#{escaped_package}-([\d\.\-]+)-#{suffix}\.zip\z/, # old
- /#{escaped_package}-([\d\.\-]+)\.zip\z/ # old
- version = $1
- normalized_version = version.split(/[\.\-]/).collect do |component|
- component.to_i
+ if latest_version.nil?
+ raise "can't find package: <#{package}>:<#{version_page_url}>"
+ end
+ escaped_latest_version = Regexp.escape(latest_version)
+ latest_version_page.links.each do |link|
+ case link.href
+ when /#{escaped_package}(?:-dev)?_#{escaped_latest_version}_#{suffix}\.zip\z/,
+ /#{escaped_package}(?:-dev)?-#{escaped_latest_version}-#{suffix}\.zip\z/, # old
+ /#{escaped_package}(?:-dev)?-#{escaped_latest_version}\.zip\z/ # old
+ click_zip_link(link)
+ end
end
- [normalized_version, version]
- else
- [[-1], nil]
end
- end.sort_by do |normalized_version, version|
- normalized_version
- end.last[1]
- if latest_version.nil?
- raise "can't find package: <#{package}>:<#{version_page_url}>"
- end
- escaped_latest_version = Regexp.escape(latest_version)
- latest_version_page.links.each do |link|
- case link.href
- when /#{escaped_package}(?:-dev)?_#{escaped_latest_version}_#{suffix}\.zip\z/,
- /#{escaped_package}(?:-dev)?-#{escaped_latest_version}-#{suffix}\.zip\z/, # old
- /#{escaped_package}(?:-dev)?-#{escaped_latest_version}\.zip\z/ # old
- click_zip_link(link)
+ def download_dependency(dependency)
+ suffix = build_architecture_suffix
+ dependency_version = "any"
+ dependency_version_re = /[\d\.\-]+/
+ if dependency.is_a?(Array)
+ dependency, dependency_version = dependency
+ dependency_version_re = /#{Regexp.escape(dependency_version)}/
+ end
+ escaped_dependency = Regexp.escape(dependency)
+ dependencies_url = "#{URL_BASE}/dependencies"
+ dependencies_page = agent.get(dependencies_url)
+ latest_version = dependencies_page.links.collect do |link|
+ case link.href
+ when /\A#{escaped_dependency}_(#{dependency_version_re})_#{suffix}\.zip\z/
+ version = $1
+ [version.split(/[\.\-]/).collect {|component| component.to_i}, version]
+ else
+ [[-1], nil]
+ end
+ end.sort_by do |normalized_version, version|
+ normalized_version
+ end.last[1]
+
+ if latest_version.nil?
+ message = "can't find dependency package: " +
+ "<#{dependency}>(#{dependency_version}):<#{dependencies_url}>"
+ raise message
+ end
+ escaped_latest_version = Regexp.escape(latest_version)
+ dependencies_page.links.each do |link|
+ case link.href
+ when /\A#{escaped_dependency}(?:-dev)?_#{escaped_latest_version}_#{suffix}\.zip\z/
+ click_zip_link(link)
+ end
+ end
end
- end
- end
- def download_dependency(dependency)
- suffix = build_architecture_suffix
- dependency_version = "any"
- dependency_version_re = /[\d\.\-]+/
- if dependency.is_a?(Array)
- dependency, dependency_version = dependency
- dependency_version_re = /#{Regexp.escape(dependency_version)}/
- end
- escaped_dependency = Regexp.escape(dependency)
- dependencies_url = "#{URL_BASE}/dependencies"
- dependencies_page = agent.get(dependencies_url)
- latest_version = dependencies_page.links.collect do |link|
- case link.href
- when /\A#{escaped_dependency}_(#{dependency_version_re})_#{suffix}\.zip\z/
- version = $1
- [version.split(/[\.\-]/).collect {|component| component.to_i}, version]
- else
- [[-1], nil]
+ private
+ def agent
+ @agent ||= Mechanize.new
end
- end.sort_by do |normalized_version, version|
- normalized_version
- end.last[1]
-
- if latest_version.nil?
- message = "can't find dependency package: " +
- "<#{dependency}>(#{dependency_version}):<#{dependencies_url}>"
- raise message
- end
- escaped_latest_version = Regexp.escape(latest_version)
- dependencies_page.links.each do |link|
- case link.href
- when /\A#{escaped_dependency}(?:-dev)?_#{escaped_latest_version}_#{suffix}\.zip\z/
- click_zip_link(link)
- end
- end
- end
-
- private
- def agent
- @agent ||= Mechanize.new
- end
- def click_zip_link(link)
- zip = link.click
- Dir.chdir(dist_dir) do
- open(zip.filename, "wb") do |file|
- file.print(zip.body)
- end
- system("unzip", "-o", zip.filename)
- Dir.glob("lib/pkgconfig/*.pc") do |pc_path|
- pc = File.read(pc_path)
- pc = pc.gsub(/\Aprefix=.+$/) {"prefix=#{dist_dir}"}
- File.open(pc_path, "w") do |pc_file|
- pc_file.print(pc)
+ def click_zip_link(link)
+ zip = link.click
+ Dir.chdir(dist_dir) do
+ open(zip.filename, "wb") do |file|
+ file.print(zip.body)
+ end
+ system("unzip", "-o", zip.filename)
+ Dir.glob("lib/pkgconfig/*.pc") do |pc_path|
+ pc = File.read(pc_path)
+ pc = pc.gsub(/\Aprefix=.+$/) {"prefix=#{dist_dir}"}
+ File.open(pc_path, "w") do |pc_file|
+ pc_file.print(pc)
+ end
+ end
end
end
end
diff --git a/glib2/lib/mkmf-gnome2.rb b/glib2/lib/mkmf-gnome2.rb
index eab9b62..5091190 100644
--- a/glib2/lib/mkmf-gnome2.rb
+++ b/glib2/lib/mkmf-gnome2.rb
@@ -151,8 +151,16 @@ def find_gem_spec(package)
end
end
+def setup_homebrew_libffi
+ return unless package_platform == :homebrew
+
+ PKGConfig.add_path("/usr/local/opt/libffi/lib/pkgconfig")
+end
+
#add_depend_package("glib2", "ext/glib2", "/...../ruby-gnome2")
def add_depend_package(target_name, target_srcdir, top_srcdir, options={})
+ setup_homebrew_libffi if target_name == "gobject-introspection"
+
gem_spec = find_gem_spec(target_name)
if gem_spec
target_source_dir = File.join(gem_spec.full_gem_path, "ext/#{target_name}")
@@ -410,34 +418,6 @@ def make_version_header(app_name, pkgname, dir = "src")
out.close
end
-def check_ruby_func
- #Other options
- ruby_header = "ruby.h"
- have_func("rb_define_alloc_func", ruby_header) # for ruby-1.8
- have_func("rb_block_proc", ruby_header) # for ruby-1.8
-
- STDOUT.print("checking for new allocation framework... ") # for ruby-1.7
- if Object.respond_to? :allocate
- STDOUT.print "yes\n"
- $defs << "-DHAVE_OBJECT_ALLOCATE"
- else
- STDOUT.print "no\n"
- end
-
- STDOUT.print("checking for attribute assignment... ") # for ruby-1.7
- STDOUT.flush
- if defined? try_compile and try_compile <<SRC
-#include "ruby.h"
-#include "node.h"
-int node_attrasgn = (int)NODE_ATTRASGN;
-SRC
- STDOUT.print "yes\n"
- $defs << "-DHAVE_NODE_ATTRASGN"
- else
- STDOUT.print "no\n"
- end
-end
-
def add_obj(name)
ensure_objs
$objs << name unless $objs.index(name)
@@ -617,6 +597,9 @@ def required_pkg_config_package(package_info, native_package_info=nil)
else
required_package_info = [package_info]
end
+ if required_package_info.include?("gobject-introspection-1.0")
+ setup_homebrew_libffi
+ end
return true if PKGConfig.have_package(*required_package_info)
native_package_info ||= {}
@@ -635,8 +618,6 @@ end
add_include_path.call("sitearchdir")
add_include_path.call("vendorarchdir")
-check_ruby_func
-
if /mingw/ =~ RUBY_PLATFORM
$ruby.gsub!('\\', '/')
end
diff --git a/glib2/test/test-binding.rb b/glib2/test/test-binding.rb
index 60b9edc..6cbc93f 100644
--- a/glib2/test/test-binding.rb
+++ b/glib2/test/test-binding.rb
@@ -16,82 +16,173 @@
class TestGLibBinding < Test::Unit::TestCase
include GLibTestUtils
+ sub_test_case "bind_property" do
+ class DataObjectDefault < GLib::Object
+ type_register
- class DataObject < GLib::Object
- type_register
-
- install_property(GLib::Param::Int.new("source", # name
- "Source", # nick
- "The source data", # blurb
- 0, # min
- 100, # max
- 0, # default
- GLib::Param::READABLE |
- GLib::Param::WRITABLE))
- install_property(GLib::Param::Int.new("target", # name
- "Target", # nick
- "The target data", # blurb
- 0, # min
- 100, # max
- 0, # default
- GLib::Param::READABLE |
- GLib::Param::WRITABLE))
-
- attr_reader :source, :target
- def initialize
- @source = 0
- @target = 0
- super
- end
-
- def source=(value)
- @source = value
- notify("source")
- end
-
- def target=(value)
- @target = value
- notify("target")
+ install_property(GLib::Param::Int.new("source", # name
+ "Source", # nick
+ "The source data", # blurb
+ 0, # min
+ 100, # max
+ 0, # default
+ GLib::Param::READABLE |
+ GLib::Param::WRITABLE))
+ install_property(GLib::Param::Int.new("target", # name
+ "Target", # nick
+ "The target data", # blurb
+ 0, # min
+ 100, # max
+ 0, # default
+ GLib::Param::READABLE |
+ GLib::Param::WRITABLE))
+
+ attr_reader :source, :target
+ def initialize
+ @source = 0
+ @target = 0
+ super
+ end
+
+ def source=(value)
+ @source = value
+ notify("source")
+ end
+
+ def target=(value)
+ @target = value
+ notify("target")
+ end
end
- end
- setup do
- only_glib_version(2, 26, 0)
- end
+ setup do
+ only_glib_version(2, 26, 0)
+ end
- setup do
- @source = DataObject.new
- @target = DataObject.new
- @binding = @source.bind_property("source", @target, "target", :default)
- end
+ setup do
+ @source = DataObjectDefault.new
+ @target = DataObjectDefault.new
+ @binding = @source.bind_property("source", @target, "target", :default)
+ end
- test "#source" do
- assert_equal(@source, @binding.source)
- end
+ test "#source" do
+ assert_equal(@source, @binding.source)
+ end
- test "#source_property" do
- assert_equal("source", @binding.source_property)
- end
+ test "#source_property" do
+ assert_equal("source", @binding.source_property)
+ end
- test "#target" do
- assert_equal(@target, @binding.target)
- end
+ test "#target" do
+ assert_equal(@target, @binding.target)
+ end
- test "#target_property" do
- assert_equal("target", @binding.target_property)
- end
+ test "#target_property" do
+ assert_equal("target", @binding.target_property)
+ end
- test "#flags" do
- assert_equal(GLib::BindingFlags::DEFAULT, @binding.flags)
+ test "#flags" do
+ assert_equal(GLib::BindingFlags::DEFAULT, @binding.flags)
+ end
+
+ test "#unbind" do
+ only_glib_version(2, 38, 0)
+ assert_equal(0, @target.target)
+ @source.source = 10
+ assert_equal(10, @target.target)
+ @binding.unbind
+ @source.source = 20
+ assert_equal(10, @target.target)
+ end
end
+ sub_test_case "bind_property_full" do
+ class DataObjectBidir < GLib::Object
+ type_register
+
+ install_property(GLib::Param::Int.new("source", # name
+ "Source", # nick
+ "The source data", # blurb
+ 0, # min
+ 100, # max
+ 0, # default
+ GLib::Param::READABLE |
+ GLib::Param::WRITABLE))
+ install_property(GLib::Param::String.new("target", # name
+ "Target", # nick
+ "The target data", # blurb
+ "", # default
+ GLib::Param::READABLE |
+ GLib::Param::WRITABLE))
+
+ attr_reader :source, :target
+ def initialize
+ @source = 0
+ @target = "nan"
+ super
+ end
- test "#unbind" do
- only_glib_version(2, 38, 0)
- assert_equal(0, @target.target)
- @source.source = 10
- assert_equal(10, @target.target)
- @binding.unbind
- @source.source = 20
- assert_equal(10, @target.target)
+ def source=(value)
+ @source = value
+ notify("source")
+ end
+
+ def target=(value)
+ @target = value
+ notify("target")
+ end
+ end
+
+ setup do
+ only_glib_version(2, 26, 0)
+ end
+
+ setup do
+ @source = DataObjectBidir.new
+ @target = DataObjectBidir.new
+ transform_to_callback = proc do |source_value|
+ source_value.to_s
+ end
+
+ transform_from_callback = proc do |target_value|
+ target_value.to_i
+ end
+
+ @binding = @source.bind_property("source", @target, "target",
+ :bidirectional,
+ :transform_to => transform_to_callback,
+ :transform_from => transform_from_callback)
+ end
+
+ test "#source" do
+ assert_equal(@source, @binding.source)
+ end
+
+ test "#source_property" do
+ assert_equal("source", @binding.source_property)
+ end
+
+ test "#target" do
+ assert_equal(@target, @binding.target)
+ end
+
+ test "#target_property" do
+ assert_equal("target", @binding.target_property)
+ end
+
+ test "#flags" do
+ assert_equal(GLib::BindingFlags::BIDIRECTIONAL, @binding.flags)
+ end
+
+ test "#unbind" do
+ only_glib_version(2, 38, 0)
+ assert_equal("nan", @target.target)
+ @source.source = 10
+ assert_equal("10", @target.target)
+ @target.target = "30"
+ assert_equal(30, @source.source)
+ @binding.unbind
+ @source.source = 20
+ assert_equal("30", @target.target)
+ end
end
end
diff --git a/glib2/test/test_glib2.rb b/glib2/test/test_glib2.rb
index 8ea0c80..a092e11 100755
--- a/glib2/test/test_glib2.rb
+++ b/glib2/test/test_glib2.rb
@@ -61,16 +61,31 @@ class TestGLib < Test::Unit::TestCase
assert_equal(GLib.convert(utf8, "UTF-8", "UTF-8"), utf8)
assert_equal(GLib.convert(utf8, "EUC-JP", "UTF-8"), euc)
assert_equal(GLib.convert(utf8, "SHIFT_JIS", "UTF-8"), sjis)
+ end
+
+ def tet_locale_to_utf8
+ assert_equal(Encoding::UTF8,
+ GLib.locale_to_utf8("ascii").encoding)
+ end
+
+ def tet_locale_from_utf8
+ assert_equal(Encoding::ASCII_8BIT,
+ GLib.locale_from_utf8("ascii").encoding)
+ end
+
+ def tet_filename_to_utf8
+ assert_equal(Encoding::UTF8,
+ GLib.filename_to_utf8("ascii.txt").encoding)
+ end
+
+ def tet_filename_from_utf8
+ assert_equal(Encoding::ASCII_8BIT,
+ GLib.filename_from_utf8("ascii.txt").encoding)
+ end
- # rb_define_module_function(mGLib, "locale_to_utf8", rbglib_m_locale_to_utf8, 1);
- # rb_define_module_function(mGLib, "locale_from_utf8", rbglib_m_locale_from_utf8, 1);
- # rb_define_module_function(mGLib, "filename_to_utf8", rbglib_m_filename_to_utf8, 1);
- # rb_define_module_function(mGLib, "filename_from_utf8", rbglib_m_filename_from_utf8, 1);
- #
# rb_define_module_function(mGLib, "filename_to_uri", rbglib_m_filename_to_uri, -1);
# rb_define_module_function(mGLib, "filename_from_uri", rbglib_m_filename_from_uri, 1);
- end
def test_messages
#rb_define_module_function(mGLog, "set_handler", rbglib_m_log_set_handler, 2);
diff --git a/gnumeric/COPYING.LIB b/gnumeric/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/gnumeric/COPYING.LIB
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, 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 library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+ 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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+ If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be 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.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+ 9. 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 Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+ 11. 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 Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. 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.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/gnumeric/README.md b/gnumeric/README.md
new file mode 100644
index 0000000..4ca9653
--- /dev/null
+++ b/gnumeric/README.md
@@ -0,0 +1,25 @@
+# Ruby/Gnumeric
+
+Ruby/Gnumeric is a Ruby binding of Gnumeric.
+
+## Requirements
+
+* Ruby/GOffice in
+ [Ruby-GNOME2](http://ruby-gnome2.sourceforge.jp/)
+* [Gnunmeric](http://www.gnumeric.org/)
+
+## Install
+
+ gem install gnumeric
+
+## License
+
+Copyright (c) 2016 Ruby-GNOME2 Project Team
+
+This program is free software. You can distribute/modify this program
+under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
+
+## Project Websites
+
+* http://ruby-gnome2.sourceforge.jp/
+* https://github.com/ruby-gnome2/ruby-gnome2
diff --git a/vte3/Rakefile b/gnumeric/Rakefile
similarity index 69%
copy from vte3/Rakefile
copy to gnumeric/Rakefile
index 03798d5..3d3eafc 100644
--- a/vte3/Rakefile
+++ b/gnumeric/Rakefile
@@ -1,6 +1,6 @@
# -*- ruby -*-
#
-# Copyright (C) 2011-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -20,41 +20,30 @@ $LOAD_PATH.unshift("./../glib2/lib")
require 'gnome2/rake/package-task'
package_task = GNOME2::Rake::PackageTask.new do |package|
- package.summary = "Ruby/VTE is a Ruby binding of VTE."
- package.description = "Ruby/VTE is a Ruby binding of VTE."
- package.dependency.gem.runtime = ["gtk3", "gobject-introspection"]
+ package.summary = "Ruby/Gnumeric is a Ruby binding of Gnumeric."
+ package.description = "Ruby/Gnumeric is a Ruby binding of Gnumeric."
+ package.dependency.gem.runtime = ["goffice", "gobject-introspection"]
package.windows.packages = []
- package.windows.dependencies = []
+ package.windows.dependencies = ["libxml2"]
package.windows.build_dependencies = [
- "glib2",
- "gio2",
- "atk",
- "pango",
- "gdk_pixbuf2",
- "gdk3",
+ "goffice",
"gobject-introspection",
]
package.windows.gobject_introspection_dependencies = [
- "gio2",
- "atk",
- "pango",
- "gdk_pixbuf2",
- "gdk3",
+ "gio2"
]
package.external_packages = [
{
- :name => "vte",
+ :name => "gnumeric",
:download_site => :gnome,
- :label => "vte",
- :version => "0.44.0",
+ :label => "gnumeric",
+ :version => "1.12.31",
:compression_method => "xz",
:windows => {
:configure_args => [
- "--disable-vala",
],
:patches => [
- ],
- :need_autoreconf => true,
+ ]
},
},
]
diff --git a/vte3/lib/vte3.rb b/gnumeric/lib/gnm.rb
similarity index 84%
copy from vte3/lib/vte3.rb
copy to gnumeric/lib/gnm.rb
index bf72a0a..d39f7d3 100644
--- a/vte3/lib/vte3.rb
+++ b/gnumeric/lib/gnm.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -15,7 +15,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
require "gobject-introspection"
-require "gtk3"
+require "goffice"
base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
vendor_dir = base_dir + "vendor" + "local"
@@ -24,10 +24,10 @@ GLib.prepend_dll_path(vendor_bin_dir)
vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
-require "vte3/loader"
+require "gnm/loader"
-module Vte
- LOG_DOMAIN = "Vte"
+module Gnm
+ LOG_DOMAIN = "Gnumeric"
GLib::Log.set_log_domain(LOG_DOMAIN)
class Error < StandardError
@@ -48,9 +48,13 @@ module Vte
remove_method(:init)
remove_method(:const_missing)
end
- Gtk.init if Gtk.respond_to?(:init)
+ GOffice.init if GOffice.respond_to?(:init)
loader = Loader.new(self)
- loader.load("Vte")
+ loader.load("Gnm")
+ init
+ class << self
+ remove_method(:init)
+ end
end
end
end
diff --git a/gnumeric/lib/gnm/loader.rb b/gnumeric/lib/gnm/loader.rb
new file mode 100644
index 0000000..9f58c88
--- /dev/null
+++ b/gnumeric/lib/gnm/loader.rb
@@ -0,0 +1,59 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+module Gnm
+ class Loader < GObjectIntrospection::Loader
+ private
+ def pre_load(repository, namespace)
+ end
+
+ def post_load(repository, namespace)
+ require_libraries
+ end
+
+ def require_libraries
+ end
+
+ def load_enum_value(value_info, enum_module)
+ name = case value_info.name.upcase
+ when /\A3D_NAME\z/
+ "NAME_3D"
+ else
+ value_info.name.upcase
+ end
+ enum_module.const_set(name, value_info.value)
+ end
+
+ def initialize_post(object)
+ super
+ return unless object.is_a?(GLib::Object)
+ self.class.reference_gobject(object, :sink => true)
+ end
+
+ def rubyish_class_name(info)
+ name = info.name.gsub(/Class\z/, "")
+ case name
+ when /\A.*_t\z/
+ name.gsub(/_t\z/, "").split("_").map do |component|
+ component[0] = component[0].upcase
+ component
+ end.join
+ else
+ name
+ end
+ end
+ end
+end
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gnumeric/lib/gnumeric.rb
similarity index 88%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gnumeric/lib/gnumeric.rb
index fdb6ee3..d2c0b96 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gnumeric/lib/gnumeric.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,4 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-require "test-unit"
-
-module GdkPixbufTestUtils
-end
+require "gnm"
diff --git a/gnumeric/test/fixtures/hello.gnumeric b/gnumeric/test/fixtures/hello.gnumeric
new file mode 100644
index 0000000..a5ece0b
Binary files /dev/null and b/gnumeric/test/fixtures/hello.gnumeric differ
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gnumeric/test/gnumeric-test-utils.rb
similarity index 80%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gnumeric/test/gnumeric-test-utils.rb
index fdb6ee3..9ae83d6 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gnumeric/test/gnumeric-test-utils.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,12 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+require "tempfile"
+
require "test-unit"
-module GdkPixbufTestUtils
+module GnumericTestUtils
+ def fixture_file(*components)
+ File.join(__dir__, "fixtures", *components)
+ end
end
diff --git a/clutter/test/run-test.rb b/gnumeric/test/run-test.rb
similarity index 65%
copy from clutter/test/run-test.rb
copy to gnumeric/test/run-test.rb
index 84f6c82..e3c7525 100755
--- a/clutter/test/run-test.rb
+++ b/gnumeric/test/run-test.rb
@@ -1,6 +1,6 @@
#!/usr/bin/env ruby
#
-# Copyright (C) 2012-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -20,18 +20,33 @@ ruby_gnome2_base = File.join(File.dirname(__FILE__), "..", "..")
ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
glib_base = File.join(ruby_gnome2_base, "glib2")
+atk_base = File.join(ruby_gnome2_base, "atk")
+pango_base = File.join(ruby_gnome2_base, "pango")
+gdk_pixbuf_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
cairo_gobject_base = File.join(ruby_gnome2_base, "cairo-gobject")
gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
-pango_base = File.join(ruby_gnome2_base, "pango")
-clutter_base = File.join(ruby_gnome2_base, "clutter")
+gio2_base = File.join(ruby_gnome2_base, "gio2")
+gdk3_base = File.join(ruby_gnome2_base, "gdk3")
+gtk3_base = File.join(ruby_gnome2_base, "gtk3")
+gsf_base = File.join(ruby_gnome2_base, "gsf")
+goffice_base = File.join(ruby_gnome2_base, "goffice")
+gnumeric_base = File.join(ruby_gnome2_base, "gnumeric")
modules = [
[glib_base, "glib2"],
+ [atk_base, "atk"],
+ [pango_base, "pango"],
[cairo_gobject_base, "cairo-gobject"],
+ [gdk_pixbuf_base, "gdk_pixbuf2"],
[gobject_introspection_base, "gobject-introspection"],
- [pango_base, "pango"],
- [clutter_base, "clutter"],
+ [gio2_base, "gio2"],
+ [gdk3_base, "gdk3"],
+ [gtk3_base, "gtk3"],
+ [gsf_base, "gsf"],
+ [goffice_base, "goffice"],
+ [gnumeric_base, "gnumeric"]
]
+
modules.each do |target, module_name|
makefile = File.join(target, "Makefile")
if File.exist?(makefile) and system("which make > /dev/null")
@@ -41,25 +56,9 @@ modules.each do |target, module_name|
$LOAD_PATH.unshift(File.join(target, "lib"))
end
-$LOAD_PATH.unshift(File.join(glib_base, "test"))
-require "glib-test-init"
-
-$LOAD_PATH.unshift(File.join(gobject_introspection_base, "test"))
-require "gobject-introspection-test-utils"
-
-$LOAD_PATH.unshift(File.join(clutter_base, "test"))
-require "clutter-test-utils"
-
-require "clutter"
-
-repository = GObjectIntrospection::Repository.default
-begin
- repository.require(Clutter::Loader::NAMESPACE)
-rescue GLib::Error
- puts("Omit because typelib file doesn't exist: #{$!.message}")
- exit(true)
-end
+$LOAD_PATH.unshift(File.join(gnumeric_base, "test"))
+require "gnumeric-test-utils"
-Clutter.init
+require "gnumeric"
-exit Test::Unit::AutoRunner.run(true, File.join(clutter_base, "test"))
+exit Test::Unit::AutoRunner.run(true, File.join(gnumeric_base, "test"))
diff --git a/gnumeric/test/test-convert.rb b/gnumeric/test/test-convert.rb
new file mode 100644
index 0000000..6d109ad
--- /dev/null
+++ b/gnumeric/test/test-convert.rb
@@ -0,0 +1,35 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+class ConvertTest < Test::Unit::TestCase
+ include GnumericTestUtils
+
+ test ".gnumeric -> .csv" do
+ # TODO: Improve API
+ input_path = fixture_file("hello.gnumeric")
+ output = Tempfile.new(["test-gnumeric", ".csv"])
+ command_context = Gnm::CmdContextStderr.new
+ Gnm.plugins_init(command_context)
+ io_context = GOffice::IOContext.new(command_context)
+ view = Gnm::WorkbookView.new("file://#{input_path}",
+ nil,
+ io_context,
+ "utf-8")
+ saver = GOffice::FileSaver.for_file_name(output.path)
+ Gnm.wb_view_save_as(view, saver, "file://#{output.path}", command_context)
+ assert_equal("hello\n", File.read(output.path))
+ end
+end
diff --git a/gobject-introspection/Rakefile b/gobject-introspection/Rakefile
index 4c701ce..faa59e3 100644
--- a/gobject-introspection/Rakefile
+++ b/gobject-introspection/Rakefile
@@ -32,7 +32,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "glib",
:download_site => :gnome,
:label => "GLib",
- :version => "2.48.0",
+ :version => "2.48.1",
:compression_method => "xz",
:windows => {
:build => false,
diff --git a/gobject-introspection/ext/gobject-introspection/rb-gi-argument.c b/gobject-introspection/ext/gobject-introspection/rb-gi-argument.c
index 319df93..de8c75f 100644
--- a/gobject-introspection/ext/gobject-introspection/rb-gi-argument.c
+++ b/gobject-introspection/ext/gobject-introspection/rb-gi-argument.c
@@ -1,6 +1,6 @@
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
- * Copyright (C) 2012-2015 Ruby-GNOME2 Project Team
+ * Copyright (C) 2012-2016 Ruby-GNOME2 Project Team
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -191,7 +191,7 @@ array_c_to_ruby_sized(gconstpointer *elements,
case GI_TYPE_TAG_INT32:
g_base_info_unref(element_type_info);
{
- const gint8 *numbers = (const gint8 *)elements;
+ const gint32 *numbers = (const gint32 *)elements;
for (i = 0; i < n_elements; i++) {
rb_ary_push(rb_array, INT2NUM(numbers[i]));
}
@@ -946,6 +946,86 @@ rb_gi_argument_to_ruby_glist(GIArgument *argument, GITypeInfo *type_info)
}
static VALUE
+rb_gi_argument_to_ruby_gslist_interface(GIArgument *argument,
+ G_GNUC_UNUSED GITypeInfo *type_info,
+ GITypeInfo *element_type_info)
+{
+ VALUE rb_argument = Qnil;
+ GIBaseInfo *interface_info;
+ GIInfoType interface_type;
+ const gchar *interface_name;
+ GType gtype;
+
+ interface_info = g_type_info_get_interface(element_type_info);
+ interface_type = g_base_info_get_type(interface_info);
+ interface_name = g_info_type_to_string(interface_type);
+ gtype = g_registered_type_info_get_g_type(interface_info);
+
+ switch (interface_type) {
+ case GI_INFO_TYPE_INVALID:
+ case GI_INFO_TYPE_FUNCTION:
+ case GI_INFO_TYPE_CALLBACK:
+ g_base_info_unref(interface_info);
+ g_base_info_unref(element_type_info);
+ rb_raise(rb_eNotImpError,
+ "TODO: GIArgument(GSList)[interface(%s)](%s) -> Ruby",
+ interface_name,
+ g_type_name(gtype));
+ break;
+ case GI_INFO_TYPE_STRUCT:
+ if (gtype == G_TYPE_NONE) {
+ GSList *node;
+ rb_argument = rb_ary_new();
+ for (node = argument->v_pointer; node; node = g_slist_next(node)) {
+ rb_ary_push(rb_argument,
+ interface_struct_to_ruby(node->data,
+ FALSE,
+ element_type_info,
+ interface_info));
+ }
+ } else {
+ rb_argument = BOXEDGLIST2RVAL(argument->v_pointer, gtype);
+ }
+ break;
+ case GI_INFO_TYPE_BOXED:
+ rb_argument = BOXEDGLIST2RVAL(argument->v_pointer, gtype);
+ break;
+ case GI_INFO_TYPE_ENUM:
+ case GI_INFO_TYPE_FLAGS:
+ case GI_INFO_TYPE_OBJECT:
+ case GI_INFO_TYPE_INTERFACE:
+ rb_argument = GOBJGLIST2RVAL(argument->v_pointer);
+ break;
+ case GI_INFO_TYPE_CONSTANT:
+ case GI_INFO_TYPE_INVALID_0:
+ case GI_INFO_TYPE_UNION:
+ case GI_INFO_TYPE_VALUE:
+ case GI_INFO_TYPE_SIGNAL:
+ case GI_INFO_TYPE_VFUNC:
+ case GI_INFO_TYPE_PROPERTY:
+ case GI_INFO_TYPE_FIELD:
+ case GI_INFO_TYPE_ARG:
+ case GI_INFO_TYPE_TYPE:
+ case GI_INFO_TYPE_UNRESOLVED:
+ g_base_info_unref(interface_info);
+ g_base_info_unref(element_type_info);
+ rb_raise(rb_eNotImpError,
+ "TODO: GIArgument(GSList)[interface(%s)](%s) -> Ruby",
+ interface_name,
+ g_type_name(gtype));
+ break;
+ default:
+ g_assert_not_reached();
+ break;
+ }
+
+ g_base_info_unref(interface_info);
+ g_base_info_unref(element_type_info);
+
+ return rb_argument;
+}
+
+static VALUE
rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info)
{
VALUE rb_argument;
@@ -954,7 +1034,6 @@ rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info)
element_type_info = g_type_info_get_param_type(type_info, 0);
element_type_tag = g_type_info_get_tag(element_type_info);
- g_base_info_unref(element_type_info);
switch (element_type_tag) {
case GI_TYPE_TAG_VOID:
@@ -970,34 +1049,42 @@ rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info)
case GI_TYPE_TAG_FLOAT:
case GI_TYPE_TAG_DOUBLE:
case GI_TYPE_TAG_GTYPE:
+ g_base_info_unref(element_type_info);
rb_raise(rb_eNotImpError,
"TODO: GIArgument(GSList)[%s] -> Ruby",
g_type_tag_to_string(element_type_tag));
break;
case GI_TYPE_TAG_UTF8:
+ g_base_info_unref(element_type_info);
rb_argument = CSTRGSLIST2RVAL(argument->v_pointer);
break;
case GI_TYPE_TAG_FILENAME:
+ g_base_info_unref(element_type_info);
rb_argument = FILENAMEGSLIST2RVAL(argument->v_pointer);
break;
case GI_TYPE_TAG_ARRAY:
+ g_base_info_unref(element_type_info);
rb_raise(rb_eNotImpError,
"TODO: GIArgument(GSList)[%s] -> Ruby",
g_type_tag_to_string(element_type_tag));
break;
case GI_TYPE_TAG_INTERFACE:
- rb_argument = GOBJGSLIST2RVAL(argument->v_pointer);
+ rb_argument = rb_gi_argument_to_ruby_gslist_interface(argument,
+ type_info,
+ element_type_info);
break;
case GI_TYPE_TAG_GLIST:
case GI_TYPE_TAG_GSLIST:
case GI_TYPE_TAG_GHASH:
case GI_TYPE_TAG_ERROR:
case GI_TYPE_TAG_UNICHAR:
+ g_base_info_unref(element_type_info);
rb_raise(rb_eNotImpError,
"TODO: GIArgument(GSList)[%s] -> Ruby",
g_type_tag_to_string(element_type_tag));
break;
default:
+ g_base_info_unref(element_type_info);
g_assert_not_reached();
break;
}
diff --git a/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c b/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c
index 1621dca..402d124 100644
--- a/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c
+++ b/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c
@@ -215,6 +215,29 @@ fill_metadata_array(GPtrArray *args_metadata)
}
static void
+fill_metadata_array_from_callable_info(GPtrArray *args_metadata,
+ GICallableInfo *info)
+{
+ GITypeInfo return_type_info;
+ RBGIArgMetadata *array_length_metadata;
+ gint array_length_index = -1;
+
+ g_callable_info_load_return_type(info, &return_type_info);
+ if (g_type_info_get_tag(&return_type_info) != GI_TYPE_TAG_ARRAY) {
+ return;
+ }
+
+ array_length_index = g_type_info_get_array_length(&return_type_info);
+ if (array_length_index == -1) {
+ return;
+ }
+
+ array_length_metadata = g_ptr_array_index(args_metadata, array_length_index);
+ array_length_metadata->array_length_p = TRUE;
+ array_length_metadata->rb_arg_index = -1;
+}
+
+static void
fill_metadata_rb_arg_index(GPtrArray *args_metadata)
{
guint i;
@@ -251,10 +274,11 @@ fill_metadata_rb_arg_index(GPtrArray *args_metadata)
}
static void
-fill_metadata(GPtrArray *args_metadata)
+fill_metadata(GPtrArray *args_metadata, GICallableInfo *info)
{
fill_metadata_callback(args_metadata);
fill_metadata_array(args_metadata);
+ fill_metadata_array_from_callable_info(args_metadata, info);
fill_metadata_rb_arg_index(args_metadata);
}
@@ -866,7 +890,7 @@ ffi_closure_callback(G_GNUC_UNUSED ffi_cif *cif,
in_args,
out_args,
args_metadata);
- fill_metadata(args_metadata);
+ fill_metadata(args_metadata, callback->callback_info);
arguments_from_raw_data(callback->callback_info,
raw_args,
in_args,
@@ -1071,7 +1095,7 @@ arguments_from_ruby(GICallableInfo *info, VALUE self, VALUE rb_arguments,
gint i, n_args;
allocate_arguments(info, in_args, out_args, args_metadata);
- fill_metadata(args_metadata);
+ fill_metadata(args_metadata, info);
n_args = g_callable_info_get_n_args(info);
for (i = 0; i < n_args; i++) {
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/gobject-introspection/lib/gobject-introspection/arg-info.rb
index 88d785d..7abeee1 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/gobject-introspection/lib/gobject-introspection/arg-info.rb
@@ -17,6 +17,13 @@
module GObjectIntrospection
class ArgInfo
def gclosure?
+ @gclosure_p ||= nil
+ return @gclosure_p unless @gclosure_p.nil?
+ @gclosure_p = compute_gclosure?
+ end
+
+ private
+ def compute_gclosure?
type_info = type
return false if type_info.tag != TypeTag::INTERFACE
diff --git a/gobject-introspection/lib/gobject-introspection/callable-info.rb b/gobject-introspection/lib/gobject-introspection/callable-info.rb
index 8254e29..564ece5 100644
--- a/gobject-introspection/lib/gobject-introspection/callable-info.rb
+++ b/gobject-introspection/lib/gobject-introspection/callable-info.rb
@@ -23,6 +23,48 @@ module GObjectIntrospection
collection_reader("args")
def in_args
+ @in_args ||= compute_in_args
+ end
+
+ def required_in_args
+ @required_in_args ||= in_args.reject do |arg|
+ arg.may_be_null?
+ end
+ end
+
+ def n_in_args
+ in_args.size
+ end
+
+ def n_required_in_args
+ required_in_args.size
+ end
+
+ def require_callback?
+ args.any? do |arg|
+ arg.direction == Direction::IN and
+ arg.scope != ScopeType::INVALID and
+ !arg.may_be_null?
+ end
+ end
+
+ def out_args
+ @out_args ||= args.find_all do |arg|
+ case arg.direction
+ when Direction::OUT, Direction::INOUT
+ true
+ else
+ false
+ end
+ end
+ end
+
+ def n_out_args
+ out_args.size
+ end
+
+ private
+ def compute_in_args
array_length_indexes = []
callback_indexes = []
closure_indexes = []
@@ -61,42 +103,5 @@ module GObjectIntrospection
end
end
end
-
- def required_in_args
- in_args.reject do |arg|
- arg.may_be_null?
- end
- end
-
- def n_in_args
- in_args.size
- end
-
- def n_required_in_args
- required_in_args.size
- end
-
- def require_callback?
- args.any? do |arg|
- arg.direction == Direction::IN and
- arg.scope != ScopeType::INVALID and
- !arg.may_be_null?
- end
- end
-
- def out_args
- args.find_all do |arg|
- case arg.direction
- when Direction::OUT, Direction::INOUT
- true
- else
- false
- end
- end
- end
-
- def n_out_args
- out_args.size
- end
end
end
diff --git a/gobject-introspection/lib/gobject-introspection/collection-reader.rb b/gobject-introspection/lib/gobject-introspection/collection-reader.rb
index d6b3b2c..9620dcf 100644
--- a/gobject-introspection/lib/gobject-introspection/collection-reader.rb
+++ b/gobject-introspection/lib/gobject-introspection/collection-reader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2012 Ruby-GNOME2 Project Team
+# Copyright (C) 2012-2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -24,9 +24,16 @@ module GObjectIntrospection
singular = name.sub(/s\z/, "")
end
getter = "get_#{singular}"
+ cache_name = "@#{name}"
define_method(name) do
- send(n_getter).times.collect do |i|
- send(getter, i)
+ if instance_variable_defined?(cache_name)
+ instance_variable_get(cache_name)
+ else
+ collection = send(n_getter).times.collect do |i|
+ send(getter, i)
+ end
+ instance_variable_set(cache_name, collection)
+ collection
end
end
end
diff --git a/gobject-introspection/lib/gobject-introspection/loader.rb b/gobject-introspection/lib/gobject-introspection/loader.rb
index 549ae47..db1d0d2 100644
--- a/gobject-introspection/lib/gobject-introspection/loader.rb
+++ b/gobject-introspection/lib/gobject-introspection/loader.rb
@@ -121,11 +121,12 @@ module GObjectIntrospection
end
def define_struct(info, options={})
+ name = rubyish_class_name(info)
if info.gtype == GLib::Type::NONE
- klass = self.class.define_struct(info.size, info.name, @base_module,
+ klass = self.class.define_struct(info.size, name, @base_module,
:parent => options[:parent])
else
- klass = self.class.define_class(info.gtype, info.name, @base_module,
+ klass = self.class.define_class(info.gtype, name, @base_module,
:parent => options[:parent],
:size => info.size)
end
@@ -136,7 +137,7 @@ module GObjectIntrospection
def load_struct_info(info)
case info.name
when /Class\z/
- base_class_name = $PREMATCH
+ base_class_name = rubyish_class_name(info)
method_infos = info.methods.find_all do |method_info|
method_info.is_a?(MethodInfo)
end
@@ -169,26 +170,18 @@ module GObjectIntrospection
def define_enum(info)
self.class.define_class(info.gtype,
- enum_class_name(info),
+ rubyish_class_name(info),
@base_module)
end
- def enum_class_name(info)
- info.name
- end
-
def define_error(info)
self.class.define_error(info.error_domain,
- error_class_name(info),
+ rubyish_class_name(info),
@base_module,
:parent => error_parent_class(info),
:gtype => info.gtype)
end
- def error_class_name(info)
- info.name
- end
-
def error_parent_class(info)
nil
end
@@ -199,7 +192,7 @@ module GObjectIntrospection
info.values.each do |value_info|
load_enum_value(value_info, enum_module)
end
- @base_module.const_set(info.name, enum_module)
+ @base_module.const_set(rubyish_class_name(info), enum_module)
else
if info.error_domain
define_error(info)
@@ -219,7 +212,7 @@ module GObjectIntrospection
info.values.each do |value_info|
load_flag_value(value_info, flags_module)
end
- @base_module.const_set(info.name, flags_module)
+ @base_module.const_set(rubyish_class_name(info), flags_module)
else
self.class.define_class(info.gtype, flags_class_name(info), @base_module)
end
@@ -230,7 +223,9 @@ module GObjectIntrospection
end
def load_object_info(info)
- klass = self.class.define_class(info.gtype, info.name, @base_module)
+ klass = self.class.define_class(info.gtype,
+ rubyish_class_name(info),
+ @base_module)
load_fields(info, klass)
load_methods(info, klass)
end
@@ -414,7 +409,9 @@ module GObjectIntrospection
when InfoType::STRUCT
match_argument_interface_struct?(arg_info, interface, argument)
when InfoType::OBJECT,
- InfoType::INTERFACE
+ InfoType::INTERFACE,
+ InfoType::FLAGS,
+ InfoType::ENUM
argument.is_a?(interface.gtype.to_class)
else
# TODO
@@ -468,7 +465,7 @@ module GObjectIntrospection
else
name
end
- when /\A(?:has|use|can|in|.*_is)_/
+ when /\A(?:has|use|can|in|on|.*_is)_/
"#{name}?"
when "exists"
"exist?"
@@ -504,6 +501,21 @@ module GObjectIntrospection
end
end
+ def rubyish_class_name(info)
+ name = info.name
+ case info
+ when StructInfo
+ case name
+ when /Class\z/
+ $PREMATCH
+ else
+ name
+ end
+ else
+ name
+ end
+ end
+
def should_unlock_gvl?(function_info, klass)
false
end
@@ -537,10 +549,11 @@ module GObjectIntrospection
validate_arguments(info, "#{klass}\##{method_name}", arguments)
[arguments, block]
end
+ require_callback_p = info.require_callback?
klass.__send__(:define_method, method_name) do |*arguments, &block|
arguments = [self] + arguments if function_info_p
arguments, block = prepare.call(arguments, &block)
- if block.nil? and info.require_callback?
+ if block.nil? and require_callback_p
to_enum(method_name, *arguments)
else
options = {
@@ -577,12 +590,18 @@ module GObjectIntrospection
def load_interface_info(info)
interface_module =
- self.class.define_interface(info.gtype, info.name, @base_module)
+ self.class.define_interface(info.gtype,
+ rubyish_class_name(info),
+ @base_module)
load_methods(info, interface_module)
end
def load_constant_info(info)
- @base_module.const_set(info.name, info.value)
+ define_constant(info.name, info)
+ end
+
+ def define_constant(name, info)
+ @base_module.const_set(name, info.value)
end
def load_union_info(info)
diff --git a/goffice/COPYING.LIB b/goffice/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/goffice/COPYING.LIB
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, 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 library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+ 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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+ If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be 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.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+ 9. 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 Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+ 11. 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 Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. 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.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/goffice/README.md b/goffice/README.md
new file mode 100644
index 0000000..9228672
--- /dev/null
+++ b/goffice/README.md
@@ -0,0 +1,25 @@
+# Ruby/GOffice
+
+Ruby/GOffice is a Ruby binding of GOffice.
+
+## Requirements
+
+* Ruby/GTK3 and Ruby/GSF in
+ [Ruby-GNOME2](http://ruby-gnome2.sourceforge.jp/)
+* [GOffice](https://developer.gnome.org/goffice/)
+
+## Install
+
+ gem install goffice
+
+## License
+
+Copyright (c) 2016 Ruby-GNOME2 Project Team
+
+This program is free software. You can distribute/modify this program
+under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
+
+## Project Websites
+
+* http://ruby-gnome2.sourceforge.jp/
+* https://github.com/ruby-gnome2/ruby-gnome2
diff --git a/vte3/Rakefile b/goffice/Rakefile
similarity index 50%
copy from vte3/Rakefile
copy to goffice/Rakefile
index 03798d5..ffcf4a7 100644
--- a/vte3/Rakefile
+++ b/goffice/Rakefile
@@ -1,6 +1,6 @@
# -*- ruby -*-
#
-# Copyright (C) 2011-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -20,43 +20,59 @@ $LOAD_PATH.unshift("./../glib2/lib")
require 'gnome2/rake/package-task'
package_task = GNOME2::Rake::PackageTask.new do |package|
- package.summary = "Ruby/VTE is a Ruby binding of VTE."
- package.description = "Ruby/VTE is a Ruby binding of VTE."
- package.dependency.gem.runtime = ["gtk3", "gobject-introspection"]
+ package.summary = "Ruby/GOFFICE is a Ruby binding of GOFFICE."
+ package.description = "Ruby/GOFFICE is a Ruby binding of GOFFICE."
+ package.dependency.gem.runtime = ["gsf", "gobject-introspection", "gtk3"]
package.windows.packages = []
package.windows.dependencies = []
package.windows.build_dependencies = [
"glib2",
- "gio2",
+ "cairo-gobject",
"atk",
"pango",
"gdk_pixbuf2",
"gdk3",
+ "rsvg2",
+ "gsf",
"gobject-introspection",
]
package.windows.gobject_introspection_dependencies = [
- "gio2",
- "atk",
- "pango",
- "gdk_pixbuf2",
"gdk3",
+ "rsvg2",
+ "gsf",
]
+ # rcairo_windows_binary_base_dir =
+ # package.windows_binary_build_task.rcairo_windows_binary_base_dir
package.external_packages = [
- {
- :name => "vte",
- :download_site => :gnome,
- :label => "vte",
- :version => "0.44.0",
- :compression_method => "xz",
- :windows => {
- :configure_args => [
- "--disable-vala",
- ],
- :patches => [
- ],
- :need_autoreconf => true,
- },
- },
+ # {
+ # :name => "libxslt",
+ # :version => "1.1.28",
+ # :download_base_url => "ftp://xmlsoft.org/libxslt",
+ # :compression_method => "gz",
+ # :windows => {
+ # :built_file => "bin/libxslt-1.dll",
+ # :configure_args => [
+ # "--with-libxml-prefix=#{rcairo_windows_binary_base_dir}",
+ # "--without-python",
+ # ],
+ # :patches => [
+ # "libxslt-1.1.28-add-mkdir-fallback.diff",
+ # ],
+ # },
+ # },
+ # {
+ # :name => "goffice",
+ # :download_site => :gnome,
+ # :label => "goffice",
+ # :version => "0.10.31",
+ # :compression_method => "xz",
+ # :windows => {
+ # :configure_args => [
+ # ],
+ # :patches => [
+ # ],
+ # },
+ # },
]
end
package_task.define
diff --git a/vte3/lib/vte3.rb b/goffice/lib/goffice.rb
similarity index 87%
copy from vte3/lib/vte3.rb
copy to goffice/lib/goffice.rb
index bf72a0a..86f0f14 100644
--- a/vte3/lib/vte3.rb
+++ b/goffice/lib/goffice.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -16,6 +16,7 @@
require "gobject-introspection"
require "gtk3"
+require "gsf"
base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
vendor_dir = base_dir + "vendor" + "local"
@@ -24,10 +25,10 @@ GLib.prepend_dll_path(vendor_bin_dir)
vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
-require "vte3/loader"
+require "goffice/loader"
-module Vte
- LOG_DOMAIN = "Vte"
+module GOffice
+ LOG_DOMAIN = "GOffice"
GLib::Log.set_log_domain(LOG_DOMAIN)
class Error < StandardError
@@ -50,7 +51,11 @@ module Vte
end
Gtk.init if Gtk.respond_to?(:init)
loader = Loader.new(self)
- loader.load("Vte")
+ loader.load("GOffice")
+ init
+ class << self
+ remove_method(:init)
+ end
end
end
end
diff --git a/goffice/lib/goffice/loader.rb b/goffice/lib/goffice/loader.rb
new file mode 100644
index 0000000..2970329
--- /dev/null
+++ b/goffice/lib/goffice/loader.rb
@@ -0,0 +1,89 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+module GOffice
+ class Loader < GObjectIntrospection::Loader
+ private
+ def pre_load(repository, namespace)
+ end
+
+ def post_load(repository, namespace)
+ define_version(repository, namespace)
+ require_libraries
+ end
+
+ def define_version(repository, namespace)
+ major, minor, micro = repository.get_version(namespace).split(".")
+ @base_module.const_set("MAJOR", Integer(major))
+ @base_module.const_set("MINOR", Integer(minor))
+ micro = Integer(micro) unless micro.nil?
+ @base_module.const_set("MICRO", micro)
+ end
+
+ def require_libraries
+ require "goffice/version"
+ end
+
+ def load_enum_value(value_info, enum_module)
+ name = case value_info.name.upcase
+ when /\A30E_360\z/
+ "EUR_30_360"
+ when /\A30EP_360\z/
+ "EP_30_360"
+ else
+ value_info.name.upcase
+ end
+ enum_module.const_set(name, value_info.value)
+ end
+
+ def initialize_post(object)
+ super
+ return unless object.is_a?(GLib::Object)
+ self.class.reference_gobject(object, :sink => true)
+ end
+
+ def load_info(info)
+ case info.name
+ when "_SearchReplace"
+ return
+ when "gViewAllocation"
+ return
+ else
+ super
+ end
+ end
+
+ def rubyish_class_name(info)
+ name = info.name.gsub(/Class\z/, "")
+ case name
+ when /\A3DRotationSel\z/
+ "Rotation3DSel"
+ when /\Ag(\d*[A-Z]\w*)\z/
+ "Graph#{Object::Regexp.last_match[1]}"
+ when /\Ac(\d*[A-Z]\w*)\z/
+ "Canvas#{Object::Regexp.last_match[1]}"
+ when /\Ago_regression_stat_t\z/
+ "RegressionStatT"
+ when /\Ago_regression_stat_tl\z/
+ "RegressionStatTl"
+ when /\A\_(.*)\z/
+ Object::Regexp.last_match[1]
+ else
+ name
+ end
+ end
+ end
+end
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/goffice/lib/goffice/version.rb
similarity index 67%
copy from gobject-introspection/lib/gobject-introspection/arg-info.rb
copy to goffice/lib/goffice/version.rb
index 88d785d..a560cd0 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/goffice/lib/goffice/version.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,14 +14,20 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-module GObjectIntrospection
- class ArgInfo
- def gclosure?
- type_info = type
- return false if type_info.tag != TypeTag::INTERFACE
+module GOffice
+ module Version
+ STRING = [MAJOR, MINOR, MICRO].compact.join(".")
- struct_info = type_info.interface
- struct_info.gtype.name == "GClosure"
+ class << self
+ def or_later?(major, minor, micro=nil)
+ micro ||= 0
+ version = [
+ MAJOR,
+ MINOR,
+ MICRO,
+ ].compact
+ (version <=> [major, minor, micro]) >= 0
+ end
end
end
end
diff --git a/goffice/patches/libxslt-1.1.28-add-mkdir-fallback.diff b/goffice/patches/libxslt-1.1.28-add-mkdir-fallback.diff
new file mode 100644
index 0000000..456509a
--- /dev/null
+++ b/goffice/patches/libxslt-1.1.28-add-mkdir-fallback.diff
@@ -0,0 +1,11 @@
+diff -ru libxslt-1.1.28.orig/libxslt/security.c libxslt-1.1.28/libxslt/security.c
+--- libxslt-1.1.28.orig/libxslt/security.c 2012-09-12 14:58:14.000000000 +0900
++++ libxslt-1.1.28/libxslt/security.c 2013-12-28 19:25:13.615751850 +0900
+@@ -39,6 +39,7 @@
+ #ifndef INVALID_FILE_ATTRIBUTES
+ #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
+ #endif
++#define mkdir(path, mode) mkdir(path)
+ #endif
+
+ #ifndef HAVE_STAT
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/goffice/test/goffice-test-utils.rb
similarity index 82%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to goffice/test/goffice-test-utils.rb
index fdb6ee3..d95c858 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/goffice/test/goffice-test-utils.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -16,5 +16,8 @@
require "test-unit"
-module GdkPixbufTestUtils
+module GOfficeTestUtils
+ def omit_on_travis_ci
+ omit("This test can't be run on Travis CI") if ENV["CI"]
+ end
end
diff --git a/clutter/test/run-test.rb b/goffice/test/run-test.rb
similarity index 68%
copy from clutter/test/run-test.rb
copy to goffice/test/run-test.rb
index 84f6c82..46ace56 100755
--- a/clutter/test/run-test.rb
+++ b/goffice/test/run-test.rb
@@ -1,6 +1,6 @@
#!/usr/bin/env ruby
#
-# Copyright (C) 2012-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -20,18 +20,31 @@ ruby_gnome2_base = File.join(File.dirname(__FILE__), "..", "..")
ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
glib_base = File.join(ruby_gnome2_base, "glib2")
+atk_base = File.join(ruby_gnome2_base, "atk")
+pango_base = File.join(ruby_gnome2_base, "pango")
+gdk_pixbuf_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
cairo_gobject_base = File.join(ruby_gnome2_base, "cairo-gobject")
gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
-pango_base = File.join(ruby_gnome2_base, "pango")
-clutter_base = File.join(ruby_gnome2_base, "clutter")
+gio2_base = File.join(ruby_gnome2_base, "gio2")
+gdk3_base = File.join(ruby_gnome2_base, "gdk3")
+gsf_base = File.join(ruby_gnome2_base, "gsf")
+gtk3_base = File.join(ruby_gnome2_base, "gtk3")
+goffice_base = File.join(ruby_gnome2_base, "goffice")
modules = [
[glib_base, "glib2"],
+ [atk_base, "atk"],
+ [pango_base, "pango"],
[cairo_gobject_base, "cairo-gobject"],
+ [gdk_pixbuf_base, "gdk_pixbuf2"],
[gobject_introspection_base, "gobject-introspection"],
- [pango_base, "pango"],
- [clutter_base, "clutter"],
+ [gio2_base, "gio2"],
+ [gdk3_base, "gdk3"],
+ [gtk3_base, "gtk3"],
+ [gsf_base, "gsf"],
+ [goffice_base, "goffice"]
]
+
modules.each do |target, module_name|
makefile = File.join(target, "Makefile")
if File.exist?(makefile) and system("which make > /dev/null")
@@ -41,25 +54,9 @@ modules.each do |target, module_name|
$LOAD_PATH.unshift(File.join(target, "lib"))
end
-$LOAD_PATH.unshift(File.join(glib_base, "test"))
-require "glib-test-init"
-
-$LOAD_PATH.unshift(File.join(gobject_introspection_base, "test"))
-require "gobject-introspection-test-utils"
-
-$LOAD_PATH.unshift(File.join(clutter_base, "test"))
-require "clutter-test-utils"
-
-require "clutter"
-
-repository = GObjectIntrospection::Repository.default
-begin
- repository.require(Clutter::Loader::NAMESPACE)
-rescue GLib::Error
- puts("Omit because typelib file doesn't exist: #{$!.message}")
- exit(true)
-end
+$LOAD_PATH.unshift(File.join(goffice_base, "test"))
+require "goffice-test-utils"
-Clutter.init
+require "goffice"
-exit Test::Unit::AutoRunner.run(true, File.join(clutter_base, "test"))
+exit Test::Unit::AutoRunner.run(true, File.join(goffice_base, "test"))
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/goffice/test/test-data-scalar-str.rb
similarity index 75%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to goffice/test/test-data-scalar-str.rb
index fdb6ee3..724c09c 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/goffice/test/test-data-scalar-str.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,12 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-require "test-unit"
+class DataScalarStrTest < Test::Unit::TestCase
+ include GOfficeTestUtils
-module GdkPixbufTestUtils
+ test ".new" do
+ omit_on_travis_ci
+ data = GOffice::DataScalarStr.new("XXX")
+ assert_equal("XXX", data.str)
+ end
end
diff --git a/gsf/COPYING.LIB b/gsf/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/gsf/COPYING.LIB
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, 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 library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+ 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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+ If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be 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.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+ 9. 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 Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+ 11. 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 Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. 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.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/gsf/README.md b/gsf/README.md
new file mode 100644
index 0000000..eb44d6e
--- /dev/null
+++ b/gsf/README.md
@@ -0,0 +1,25 @@
+# Ruby/GSF
+
+Ruby/GSF is a Ruby binding of GSF which is needed by GOffice.
+
+## Requirements
+
+* Ruby/GIO2 in
+ [Ruby-GNOME2](http://ruby-gnome2.sourceforge.jp/)
+* [GSF](https://developer.gnome.org/gsf/)
+
+## Install
+
+ gem install gsf
+
+## License
+
+Copyright (c) 2016 Ruby-GNOME2 Project Team
+
+This program is free software. You can distribute/modify this program
+under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
+
+## Project Websites
+
+* http://ruby-gnome2.sourceforge.jp/
+* https://github.com/ruby-gnome2/ruby-gnome2
diff --git a/vte3/Rakefile b/gsf/Rakefile
similarity index 72%
copy from vte3/Rakefile
copy to gsf/Rakefile
index 03798d5..9cdeabd 100644
--- a/vte3/Rakefile
+++ b/gsf/Rakefile
@@ -1,6 +1,6 @@
# -*- ruby -*-
#
-# Copyright (C) 2011-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -20,41 +20,34 @@ $LOAD_PATH.unshift("./../glib2/lib")
require 'gnome2/rake/package-task'
package_task = GNOME2::Rake::PackageTask.new do |package|
- package.summary = "Ruby/VTE is a Ruby binding of VTE."
- package.description = "Ruby/VTE is a Ruby binding of VTE."
- package.dependency.gem.runtime = ["gtk3", "gobject-introspection"]
+ package.summary = "Ruby/GSF is a Ruby binding of GSF."
+ package.description = "Ruby/GSF is a Ruby binding of GSF."
+ package.dependency.gem.runtime = ["gio2", "gobject-introspection"]
package.windows.packages = []
- package.windows.dependencies = []
+ package.windows.dependencies = ["libxml2"]
package.windows.build_dependencies = [
"glib2",
"gio2",
- "atk",
- "pango",
- "gdk_pixbuf2",
- "gdk3",
+ "cairo-gobject",
"gobject-introspection",
]
package.windows.gobject_introspection_dependencies = [
"gio2",
- "atk",
- "pango",
- "gdk_pixbuf2",
- "gdk3",
+ "cairo-gobject",
]
package.external_packages = [
{
- :name => "vte",
+ :name => "libgsf",
:download_site => :gnome,
- :label => "vte",
- :version => "0.44.0",
+ :label => "gsf",
+ :version => "1.14.39",
:compression_method => "xz",
:windows => {
:configure_args => [
- "--disable-vala",
],
:patches => [
],
- :need_autoreconf => true,
+ :built_file => "bin/libgsf-win32-1-114.dll",
},
},
]
diff --git a/gio2/lib/gio2.rb b/gsf/lib/gsf.rb
similarity index 87%
copy from gio2/lib/gio2.rb
copy to gsf/lib/gsf.rb
index c15b978..0d1ac44 100644
--- a/gio2/lib/gio2.rb
+++ b/gsf/lib/gsf.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -15,7 +15,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
require "gobject-introspection"
-require "glib2"
+require "gio2"
base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
vendor_dir = base_dir + "vendor" + "local"
@@ -24,17 +24,12 @@ GLib.prepend_dll_path(vendor_bin_dir)
vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
-require "gio2/loader"
+require "gsf/loader"
-module Gio
- LOG_DOMAIN = "Gio"
+module Gsf
+ LOG_DOMAIN = "Gsf"
GLib::Log.set_log_domain(LOG_DOMAIN)
- Version = GLib::Version
-
- class Error < StandardError
- end
-
class << self
def const_missing(name)
init
@@ -50,8 +45,9 @@ module Gio
remove_method(:init)
remove_method(:const_missing)
end
+ Gio.init if Gio.respond_to?(:init)
loader = Loader.new(self)
- loader.load("Gio")
+ loader.load("Gsf")
end
end
end
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gsf/lib/gsf/input.rb
similarity index 76%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gsf/lib/gsf/input.rb
index fdb6ee3..a79d838 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gsf/lib/gsf/input.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,13 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-require "test-unit"
-
-module GdkPixbufTestUtils
+module Gsf
+ class Input
+ alias_method :read_raw, :read
+ def read(size=nil)
+ size ||= remaining
+ bytes = read_raw(size)
+ bytes.pack("C*")
+ end
+ end
end
diff --git a/gsf/lib/gsf/loader.rb b/gsf/lib/gsf/loader.rb
new file mode 100644
index 0000000..93a2fc3
--- /dev/null
+++ b/gsf/lib/gsf/loader.rb
@@ -0,0 +1,57 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+module Gsf
+ class Loader < GObjectIntrospection::Loader
+ private
+ def load_function_info(info)
+ name = info.name
+ case name
+ when "init"
+ # ignore
+ else
+ super
+ end
+ end
+
+ def load_enum_value(value_info, enum_module)
+ # TODO: Add constant name rename feature to
+ # gobject-introspection and use it.
+ if value_info.name == "2nd"
+ enum_module.const_set("SECOND", value_info.value)
+ else
+ super
+ end
+ end
+
+ def pre_load(repository, namespace)
+ end
+
+ def post_load(repository, namespace)
+ require_libraries
+ end
+
+ def require_libraries
+ require "gsf/input"
+ end
+
+ def initialize_post(object)
+ super
+ return unless object.is_a?(GLib::Object)
+ self.class.reference_gobject(object, :sink => true)
+ end
+ end
+end
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gsf/test/gsf-test-utils.rb
similarity index 89%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gsf/test/gsf-test-utils.rb
index fdb6ee3..b3ee055 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gsf/test/gsf-test-utils.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,9 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+require "tempfile"
+
require "test-unit"
-module GdkPixbufTestUtils
+module GsfTestUtils
end
diff --git a/gdk_pixbuf2/test/run-test.rb b/gsf/test/run-test.rb
similarity index 65%
copy from gdk_pixbuf2/test/run-test.rb
copy to gsf/test/run-test.rb
index 17082d2..63144c5 100755
--- a/gdk_pixbuf2/test/run-test.rb
+++ b/gsf/test/run-test.rb
@@ -1,6 +1,6 @@
#!/usr/bin/env ruby
#
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -19,27 +19,28 @@
ruby_gnome2_base = File.join(File.dirname(__FILE__), "..", "..")
ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
-glib_base = File.join(ruby_gnome2_base, "glib2")
-gdk_pixbuf2_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
+gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
+gio2_base = File.join(ruby_gnome2_base, "gio2")
+gsf_base = File.join(ruby_gnome2_base, "gsf")
modules = [
- [glib_base, "glib2"],
- [gdk_pixbuf2_base, "gdk_pixbuf2"]
+ [gobject_introspection_base, "gobject-introspection"],
+ [gio2_base, "gio2"],
+ [gsf_base, "gsf"]
]
+
modules.each do |target, module_name|
- if system("which make > /dev/null")
+ makefile = File.join(target, "Makefile")
+ if File.exist?(makefile) and system("which make > /dev/null")
`make -C #{target.dump} > /dev/null` or exit(false)
end
$LOAD_PATH.unshift(File.join(target, "ext", module_name))
$LOAD_PATH.unshift(File.join(target, "lib"))
end
-$LOAD_PATH.unshift(File.join(glib_base, "test"))
-require "glib-test-init"
-
-$LOAD_PATH.unshift(File.join(gdk_pixbuf2_base, "test"))
-require "gdk_pixbuf2-test-utils"
+$LOAD_PATH.unshift(File.join(gsf_base, "test"))
+require "gsf-test-utils"
-require "gdk_pixbuf2"
+require "gsf"
-exit Test::Unit::AutoRunner.run(true, File.join(gdk_pixbuf2_base, "test"))
+exit Test::Unit::AutoRunner.run(true, File.join(gsf_base, "test"))
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gsf/test/test-input-stdio.rb
similarity index 72%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gsf/test/test-input-stdio.rb
index fdb6ee3..b22776d 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gsf/test/test-input-stdio.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,12 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-require "test-unit"
-
-module GdkPixbufTestUtils
+class InputStdioTest < Test::Unit::TestCase
+ test ".new" do
+ file = Tempfile.new("test-input-stdio")
+ file.write("hello")
+ file.close
+ input = Gsf::InputStdio.new(file.path)
+ assert_equal("hello", input.read)
+ end
end
diff --git a/gstreamer/Rakefile b/gstreamer/Rakefile
index 7058bea..e55a797 100644
--- a/gstreamer/Rakefile
+++ b/gstreamer/Rakefile
@@ -29,7 +29,6 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
"glib2", "atk", "pango", "gdk_pixbuf2", "gtk2", "gobject-introspection",
]
xiph_download_url_base = "http://downloads.xiph.org/releases"
- freedesktop_download_url_base = "https://gstreamer.freedesktop.org/src"
sf_net_download_url_base = "http://downloads.sourceforge.net/project"
libmad_version = "0.15.1b"
package.external_packages = [
@@ -48,7 +47,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "sqlite-autoconf",
:download_base_url => "http://www.sqlite.org/2016",
:label => "SQLite",
- :version => "3120000",
+ :version => "3140100",
:compression_method => "gz",
:windows => {
:configure_args => [],
@@ -59,7 +58,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "libsoup",
:download_site => :gnome,
:label => "libsoup",
- :version => "2.54.0.1",
+ :version => "2.54.1",
:compression_method => "xz",
:windows => {
:configure_args => [
@@ -143,9 +142,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
},
{
:name => "gstreamer",
- :download_base_url => "#{freedesktop_download_url_base}/gstreamer",
+ :download_site => :freedesktop_gstreamer,
:label => "GStreamer",
- :version => "1.8.0",
+ :version => "1.8.2",
:compression_method => "xz",
:windows => {
:cc_args => "-std=gnu99",
@@ -163,9 +162,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
},
{
:name => "gst-plugins-base",
- :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-base",
+ :download_site => :freedesktop_gstreamer,
:label => "GStreamer plugins (base)",
- :version => "1.8.0",
+ :version => "1.8.2",
:compression_method => "xz",
:windows => {
:configure_args => [
@@ -184,9 +183,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
},
{
:name => "gst-plugins-good",
- :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-good",
+ :download_site => :freedesktop_gstreamer,
:label => "GStreamer plugins (good)",
- :version => "1.8.0",
+ :version => "1.8.2",
:compression_method => "xz",
:windows => {
:configure_args => [
@@ -198,9 +197,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
},
{
:name => "gst-plugins-bad",
- :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-bad",
+ :download_site => :freedesktop_gstreamer,
:label => "GStreamer plugins (bad)",
- :version => "1.8.0",
+ :version => "1.8.2",
:compression_method => "xz",
:windows => {
:configure_args => ["--disable-librfb"],
@@ -211,14 +210,13 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:gobject_introspection_compiler_split_args => true,
:patches => [
"gst-plugins-bad-1.8.0-use-only-I.diff",
- "gst-plugins-bad-1.8.0-add-missing-lole32.diff",
],
:built_file => "lib/gstreamer-1.0/libgstmxf.dll",
},
},
# {
# :name => "gst-plugins-ugly",
- # :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-ugly",
+ # :download_site => :freedesktop_gstreamer,
# :label => "GStreamer plugins (ugly)",
# :version => "1.8.0",
# :compression_method => "xz",
@@ -229,9 +227,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
# },
{
:name => "gst-libav",
- :download_base_url => "#{freedesktop_download_url_base}/gst-libav",
+ :download_site => :freedesktop_gstreamer,
:label => "GStreamer libav",
- :version => "1.8.0",
+ :version => "1.8.2",
:compression_method => "xz",
:windows => {
:configure_args => [
diff --git a/gstreamer/patches/gst-plugins-bad-1.8.0-add-missing-lole32.diff b/gstreamer/patches/gst-plugins-bad-1.8.0-add-missing-lole32.diff
deleted file mode 100644
index a921745..0000000
--- a/gstreamer/patches/gst-plugins-bad-1.8.0-add-missing-lole32.diff
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -ru gst-plugins-bad-1.8.0.orig/sys/directsound/Makefile.am gst-plugins-bad-1.8.0/sys/directsound/Makefile.am
---- gst-plugins-bad-1.8.0.orig/sys/directsound/Makefile.am 2015-04-13 15:56:11.000000000 +0900
-+++ gst-plugins-bad-1.8.0/sys/directsound/Makefile.am 2016-04-03 17:42:06.389387506 +0900
-@@ -5,7 +5,7 @@
- $(GST_PLUGINS_BASE_CFLAGS) $(DIRECTX_CFLAGS)
- libgstdirectsoundsrc_la_LIBADD = \
- $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \
-- $(DIRECTX_LDFLAGS) $(DIRECTSOUND_LIBS)
-+ $(DIRECTX_LDFLAGS) $(DIRECTSOUND_LIBS) -lole32
- libgstdirectsoundsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
- libgstdirectsoundsrc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-
diff --git a/gtk2/sample/gtk-demo/appwindow.rb b/gtk2/sample/gtk-demo/appwindow.rb
index 7b84547..d7e2e70 100644
--- a/gtk2/sample/gtk-demo/appwindow.rb
+++ b/gtk2/sample/gtk-demo/appwindow.rb
@@ -184,7 +184,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
]
- transparent = Gdk::Pixbuf.new(Demo.find_file("gtk-logo-rgb.gif")).add_alpha(true, 0xff, 0xff, 0xff)
+ transparent = GdkPixbuf::Pixbuf.new(:file => Demo.find_file("gtk-logo-rgb.gif")).add_alpha(true, 0xff, 0xff, 0xff)
Gtk::AboutDialog.set_email_hook {|about, link|
puts "send mail to #{link}"
@@ -222,7 +222,7 @@ Boston, MA 02111-1307, USA.
factory.add_default
filename = Demo.find_file('gtk-logo-rgb.gif')
- pixbuf = Gdk::Pixbuf.new(filename)
+ pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
transparent = pixbuf.add_alpha(true, 0xff, 0xff, 0xff)
diff --git a/gtk2/sample/gtk-demo/cairo-clip-image.rb b/gtk2/sample/gtk-demo/cairo-clip-image.rb
index b949e07..9fe1e9c 100644
--- a/gtk2/sample/gtk-demo/cairo-clip-image.rb
+++ b/gtk2/sample/gtk-demo/cairo-clip-image.rb
@@ -23,7 +23,7 @@ module Demo
cr.new_path
- loader = Gdk::PixbufLoader.new
+ loader = GdkPixbuf::PixbufLoader.new
File.open("background.jpg", "rb") do |f|
loader.last_write(f.read)
end
diff --git a/gtk2/sample/gtk-demo/cairo-image.rb b/gtk2/sample/gtk-demo/cairo-image.rb
index b102989..8827d6b 100644
--- a/gtk2/sample/gtk-demo/cairo-image.rb
+++ b/gtk2/sample/gtk-demo/cairo-image.rb
@@ -18,7 +18,7 @@ module Demo
def draw(cr)
cr.save do
- loader = Gdk::PixbufLoader.new
+ loader = GdkPixbuf::PixbufLoader.new
File.open("background.jpg", "rb") do |f|
loader.last_write(f.read)
end
diff --git a/gtk2/sample/gtk-demo/iconview.rb b/gtk2/sample/gtk-demo/iconview.rb
index cb2ac9c..b385b37 100644
--- a/gtk2/sample/gtk-demo/iconview.rb
+++ b/gtk2/sample/gtk-demo/iconview.rb
@@ -37,10 +37,10 @@ puts path
def initialize
super('Gtk::IconView demo')
- @file_pixbuf = Gdk::Pixbuf.new(Demo.find_file("gnome-fs-regular.png"))
- @folder_pixbuf = Gdk::Pixbuf.new(Demo.find_file("gnome-fs-directory.png"))
+ @file_pixbuf = GdkPixbuf::Pixbuf.new(:file => Demo.find_file("gnome-fs-regular.png"))
+ @folder_pixbuf = GdkPixbuf::Pixbuf.new(:file => Demo.find_file("gnome-fs-directory.png"))
- @store = Gtk::ListStore.new(String, String, TrueClass, Gdk::Pixbuf)
+ @store = Gtk::ListStore.new(String, String, TrueClass, GdkPixbuf::Pixbuf)
@parent = "/"
@store.set_default_sort_func do |a, b|
diff --git a/gtk2/sample/gtk-demo/images.rb b/gtk2/sample/gtk-demo/images.rb
index e0edb91..642590a 100644
--- a/gtk2/sample/gtk-demo/images.rb
+++ b/gtk2/sample/gtk-demo/images.rb
@@ -6,7 +6,7 @@
= Images
Gtk::Image is used to display an image; the image can be in a number of formats.
-Typically, you load an image into a Gdk::Pixbuf, then display the pixbuf.
+Typically, you load an image into a GdkPixbuf::Pixbuf, then display the pixbuf.
This demo code shows some of the more obscure cases, in the simple
case a call to Gtk::Image.new is all you need.
@@ -55,7 +55,7 @@ module Demo
pixbuf = nil
begin
filename = Demo.find_file('gtk-logo-rgb.gif')
- pixbuf = Gdk::Pixbuf.new(filename)
+ pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
rescue
# This code shows off error handling. You can just use
# Gtk::Image.new instead if you don't want to report
@@ -159,7 +159,7 @@ module Demo
@pixbuf_loader = nil
end
- @pixbuf_loader = Gdk::PixbufLoader.new
+ @pixbuf_loader = GdkPixbuf::PixbufLoader.new
@pixbuf_loader.signal_connect('area_prepared') do |loader|
pixbuf = loader.pixbuf
diff --git a/gtk2/sample/gtk-demo/pixbufs.rb b/gtk2/sample/gtk-demo/pixbufs.rb
index b3616cb..1e15dd0 100644
--- a/gtk2/sample/gtk-demo/pixbufs.rb
+++ b/gtk2/sample/gtk-demo/pixbufs.rb
@@ -5,7 +5,7 @@
=begin
= Pixbufs
-A Gdk::Pixbuf represents an image, normally in RGB or RGBA format.
+A GdkPixbuf::Pixbuf represents an image, normally in RGB or RGBA format.
Pixbufs are normally used to load files from disk and perform
image scaling.
@@ -51,9 +51,11 @@ module Demo
set_size_request(@background.width, @background.height)
- @frame = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB,
- false, 8,
- @background.width, @background.height)
+ @frame = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+ :has_alpha => false,
+ :bits_per_sample => 8,
+ :width => @background.width,
+ :height => @background.height)
@da = Gtk::DrawingArea.new
@@ -96,12 +98,12 @@ module Demo
# in the location where the file is installed.
#
filename = Demo.find_file(BACKGROUND_NAME)
- @background = Gdk::Pixbuf.new(filename)
+ @background = GdkPixbuf::Pixbuf.new(:file => filename)
IMAGE_NAMES.each_with_index do |basename, i|
filename = Demo.find_file(basename)
- @images[i] = Gdk::Pixbuf.new(filename)
+ @images[i] = GdkPixbuf::Pixbuf.new(:file => filename)
end
end
@@ -154,7 +156,7 @@ module Demo
dest = r1.intersect(r2)
if dest
@frame.composite!(image, dest.x, dest.y, dest.width, dest.height,
- xpos, ypos, k, k, Gdk::Pixbuf::INTERP_NEAREST,
+ xpos, ypos, k, k, :nearest,
if (i & 1) == 1
[
127,
diff --git a/gtk2/sample/gtk-demo/stock_browser.rb b/gtk2/sample/gtk-demo/stock_browser.rb
index ae29c0e..c813099 100644
--- a/gtk2/sample/gtk-demo/stock_browser.rb
+++ b/gtk2/sample/gtk-demo/stock_browser.rb
@@ -147,7 +147,7 @@ module Demo
# Make the result the proper size for our thumbnail
w, h = Gtk::IconSize.lookup(size)
- scaled = info.small_icon.scale(w, h, Gdk::Pixbuf::INTERP_BILINEAR)
+ scaled = info.small_icon.scale(w, h, GdkPixbuf::Pixbuf::INTERP_BILINEAR)
info.small_icon = scaled
end
diff --git a/gtk2/sample/gtk-demo/textview.rb b/gtk2/sample/gtk-demo/textview.rb
index a948712..0f8debb 100644
--- a/gtk2/sample/gtk-demo/textview.rb
+++ b/gtk2/sample/gtk-demo/textview.rb
@@ -188,14 +188,14 @@ module Demo
#
filename = Demo.find_file("gtk-logo-rgb.gif")
- pixbuf = Gdk::Pixbuf.new(filename) if filename
+ pixbuf = GdkPixbuf::Pixbuf.new(:file => filename) if filename
unless pixbuf
$stderr.print "Failed to load image file gtk-logo-rgb.gif\n"
exit 1
end
- scaled = pixbuf.scale(32, 32, Gdk::Pixbuf::INTERP_BILINEAR)
+ scaled = pixbuf.scale(32, 32, :bilinear)
pixbuf = scaled
##
diff --git a/gtk2/sample/misc/aboutdialog.rb b/gtk2/sample/misc/aboutdialog.rb
index 812ffe8..cbcfcb4 100644
--- a/gtk2/sample/misc/aboutdialog.rb
+++ b/gtk2/sample/misc/aboutdialog.rb
@@ -31,7 +31,7 @@ a.comments = "This is a sample script for Gtk::AboutDialog"
a.copyright = "Copyright (C) 2005 Ruby-GNOME2 Project"
a.documenters = ["Documenter 1 <no1 at foo.bar.com>", "Documenter 2 <no2 at foo.bar.com>"]
a.license = "This program is licenced under the same licence as Ruby-GNOME2."
-a.logo = Gdk::Pixbuf.new("gnome-logo-icon.png")
+a.logo = GdkPixbuf::Pixbuf.new(:file => "gnome-logo-icon.png")
a.program_name = "Gtk::AboutDialog sample"
a.translator_credits = "Translator 1\nTranslator 2\n"
a.version = "1.0.0"
diff --git a/gtk2/sample/misc/combobox.rb b/gtk2/sample/misc/combobox.rb
index 23242bd..4aefe9b 100644
--- a/gtk2/sample/misc/combobox.rb
+++ b/gtk2/sample/misc/combobox.rb
@@ -35,7 +35,7 @@ end
#
# Icon and text
#
-model = Gtk::ListStore.new(Gdk::Pixbuf, String)
+model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String)
[[Gtk::Stock::QUIT, "quit"],
[Gtk::Stock::CANCEL, "cancel"],
[Gtk::Stock::OK, "ok"]].each do |stock, name|
diff --git a/gtk2/sample/misc/iconview.rb b/gtk2/sample/misc/iconview.rb
index 5c06c4e..ef2625d 100644
--- a/gtk2/sample/misc/iconview.rb
+++ b/gtk2/sample/misc/iconview.rb
@@ -13,7 +13,7 @@ require 'gtk2'
TEXT_COLUMN = 0
PIXBUF_COLUMN = 1
-model = Gtk::ListStore.new(String, Gdk::Pixbuf)
+model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
iv = Gtk::IconView.new(model)
@@ -23,7 +23,7 @@ iv.pixbuf_column = PIXBUF_COLUMN
Dir.glob("../gtk-demo/gnome*.png").each do |f|
iter = model.append
iter[TEXT_COLUMN] = File.basename(f)
- iter[PIXBUF_COLUMN] = Gdk::Pixbuf.new(f)
+ iter[PIXBUF_COLUMN] = GdkPixbuf::Pixbuf.new(:file => f)
end
iv.signal_connect("item_activated") do |iv, path|
diff --git a/gtk2/sample/misc/itemfactory.rb b/gtk2/sample/misc/itemfactory.rb
index 71629b5..1bcfc40 100644
--- a/gtk2/sample/misc/itemfactory.rb
+++ b/gtk2/sample/misc/itemfactory.rb
@@ -56,7 +56,7 @@ ifp.create_items([
["/_Misc", "<LastBranch>"],
["/_Misc/Tearoff", "<Tearoff>"],
["/_Misc/Title", "<Title>"],
- ["/_Misc/Image", "<ImageItem>", "", Gdk::Pixbuf.new("gnome-logo-icon.png"), cal_misc, 1],
+ ["/_Misc/Image", "<ImageItem>", "", GdkPixbuf::Pixbuf.new(:file => "gnome-logo-icon.png"), cal_misc, 1],
["/_Misc/Separator", "<Separator>"],
["/_Misc/Item", "<Item>", nil, nil, cal_misc, 2]
])
diff --git a/gtk2/sample/misc/itemfactory2.rb b/gtk2/sample/misc/itemfactory2.rb
index 64dd337..7fc3b17 100644
--- a/gtk2/sample/misc/itemfactory2.rb
+++ b/gtk2/sample/misc/itemfactory2.rb
@@ -60,7 +60,7 @@ ifp.create_item("/_Misc", "<LastBranch>")
ifp.create_item("/_Misc/Tearoff", "<Tearoff>")
ifp.create_item("/_Misc/Title", "<Title>")
ifp.create_item("/_Misc/Seperator", "<Separator>")
-ifp.create_item("/_Misc/Image", "<ImageItem>", "", Gdk::Pixbuf.new("gnome-logo-icon.png")) do
+ifp.create_item("/_Misc/Image", "<ImageItem>", "", GdkPixbuf::Pixbuf.new(:file => "gnome-logo-icon.png")) do
p "ImageItem"
end
diff --git a/gtk2/sample/misc/to_drawable.rb b/gtk2/sample/misc/to_drawable.rb
index 46844f8..8a2cfa3 100644
--- a/gtk2/sample/misc/to_drawable.rb
+++ b/gtk2/sample/misc/to_drawable.rb
@@ -1,6 +1,6 @@
#!/usr/bin/env ruby
=begin
- to_drawable.rb - Gdk::Pixbuf(GDK methods) sample script.
+ to_drawable.rb - GdkPixbuf::Pixbuf(GDK methods) sample script.
Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
@@ -16,7 +16,7 @@ unless filename
exit(1)
end
-pixbuf = Gdk::Pixbuf.new(filename)
+pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
w = Gtk::Window.new("Drawable sample")
w.realize
diff --git a/gtk2/sample/misc/treeview.rb b/gtk2/sample/misc/treeview.rb
index de0257c..59bcd19 100644
--- a/gtk2/sample/misc/treeview.rb
+++ b/gtk2/sample/misc/treeview.rb
@@ -13,7 +13,7 @@ require 'gtk2'
window = Gtk::Window.new("Gtk::TreeView sample")
# Create data
-model = Gtk::TreeStore.new(String, String, Gdk::Color, Float, Gdk::Pixbuf)
+model = Gtk::TreeStore.new(String, String, Gdk::Color, Float, GdkPixbuf::Pixbuf)
# column 1
root_iter = model.append(nil)
diff --git a/gtk2/test/test_gdk_pixbuf.rb b/gtk2/test/test_gdk_pixbuf.rb
index 3c80a3b..9a91360 100644
--- a/gtk2/test/test_gdk_pixbuf.rb
+++ b/gtk2/test/test_gdk_pixbuf.rb
@@ -23,12 +23,12 @@ class TestGdkPixbuf < Test::Unit::TestCase
width, height = gdk_window.size
assert_nothing_raised do
- Gdk::Pixbuf.from_drawable(colormap,
- gdk_window,
- src_x,
- src_y,
- width,
- height)
+ GdkPixbuf::Pixbuf.from_drawable(colormap,
+ gdk_window,
+ src_x,
+ src_y,
+ width,
+ height)
end
end
end
diff --git a/gtk3/ext/gtk3/rb-gtk3.c b/gtk3/ext/gtk3/rb-gtk3.c
index ddb2fb9..3fd43d5 100644
--- a/gtk3/ext/gtk3/rb-gtk3.c
+++ b/gtk3/ext/gtk3/rb-gtk3.c
@@ -575,6 +575,21 @@ rb_gtk3_ui_manager_mark(gpointer object)
}
#endif
+static void
+rb_gtk3_text_tag_table_mark_body(GtkTextTag *tag, gpointer data)
+{
+ rbgobj_gc_mark_instance(tag);
+}
+
+static void
+rb_gtk3_text_tag_table_mark(gpointer object)
+{
+ GtkTextTagTable *table;
+
+ table = GTK_TEXT_TAG_TABLE(object);
+ gtk_text_tag_table_foreach(table, rb_gtk3_text_tag_table_mark_body, NULL);
+}
+
void
rbgtk3_class_init_func(gpointer g_class, G_GNUC_UNUSED gpointer class_data)
{
@@ -614,6 +629,8 @@ Init_gtk3(void)
#ifndef RB_GTK_UI_MANAGER_IS_DEPRECATED
rbgobj_register_mark_func(GTK_TYPE_UI_MANAGER, rb_gtk3_ui_manager_mark);
#endif
+ rbgobj_register_mark_func(GTK_TYPE_TEXT_TAG_TABLE,
+ rb_gtk3_text_tag_table_mark);
rbgtk3_cell_layout_init();
rbgtk3_container_init();
diff --git a/gtk3/lib/gtk3/container.rb b/gtk3/lib/gtk3/container.rb
index 9c203c0..48d1b62 100644
--- a/gtk3/lib/gtk3/container.rb
+++ b/gtk3/lib/gtk3/container.rb
@@ -16,13 +16,6 @@
module Gtk
class Container
- class << self
- alias_method :child_properties_raw, :child_properties
- def child_properties
- child_properties_raw[0]
- end
- end
-
include Enumerable
alias_method :add_raw, :add
diff --git a/gtk3/lib/gtk3/deprecated.rb b/gtk3/lib/gtk3/deprecated.rb
index 4ad295b..9cb737c 100644
--- a/gtk3/lib/gtk3/deprecated.rb
+++ b/gtk3/lib/gtk3/deprecated.rb
@@ -297,7 +297,7 @@ module Gtk
case icon
when Symbol
context.set_icon(:stock_id => icon, :hot_x => hot_x, :hot_y => hot_y)
- when Gdk::Pixbuf
+ when GdkPixbuf::Pixbuf
context.set_icon(:pixbuf => icon, :hot_x => hot_x, :hot_y => hot_y)
when Gtk::Widget
context.set_icon(:widget => icon, :hot_x => hot_x, :hot_y => hot_y)
@@ -523,7 +523,7 @@ module Gtk
end
when Symbol
[{:stock => image, :size => size}]
- when Gdk::Pixbuf
+ when GdkPixbuf::Pixbuf
[{:pixbuf => image}]
when Gtk::IconSet
[{:icon_set => image, :size => size}]
@@ -531,7 +531,7 @@ module Gtk
[{:icon => image, :size => size}]
else
message =
- "Image must be String, Symbol, Gdk::Pixbuf, Gtk::IconSet or " +
+ "Image must be String, Symbol, GdkPixbuf::Pixbuf, Gtk::IconSet or " +
"Gio::Icon: #{image.inspect}"
raise ArgumentError, message
end
diff --git a/gtk3/lib/gtk3/image.rb b/gtk3/lib/gtk3/image.rb
index d31492c..8a748bc 100644
--- a/gtk3/lib/gtk3/image.rb
+++ b/gtk3/lib/gtk3/image.rb
@@ -21,7 +21,7 @@ module Gtk
# given.
#
# @param Hash{Symbol => Gtk::Stock, String, Gtk::IconSet, Gio::Icon,
- # Gdk::Pixbuf, Gdk::PixbufAnimation, Cairo::Surface,
+ # GdkPixbuf::Pixbuf, GdkPixbuf::PixbufAnimation, Cairo::Surface,
# Fixnum}
#
# @example Create an empty image.
@@ -45,18 +45,18 @@ module Gtk
# icon = Gio::ThemedIcon.new 'gtk-open'
# image = Gtk::Image.new :icon => icon, :size => :dialog
#
- # @example Create an image from a Gdk::Pixbuf.
- # pixbuf = Gdk::Pixbuf.new 'path/to/the/image.png'
+ # @example Create an image from a GdkPixbuf::Pixbuf.
+ # pixbuf = GdkPixbuf::Pixbuf.new(:file => 'path/to/the/image.png')
# image = Gtk::Image.new :pixbuf => pixbuf
#
# @example Create an image from an Gtk::IconSet, that itself is created
- # from a Gdk::Pixbuf.
- # pixbuf = Gdk::Pixbuf.new 'path/to/the/image.png'
+ # from a GdkPixbuf::Pixbuf.
+ # pixbuf = GdkPixbuf::Pixbuf.new(:file => 'path/to/the/image.png')
# iconSet = Gtk::IconSet.new pixbuf
# image = Gtk::Image.new :icon_set => iconSet, :size => :dialog
#
- # @example Create an image from a Gdk::PixbufAnimation
- # pixAnim = Gdk::PixbufAnimation.new 'anim.gif'
+ # @example Create an image from a GdkPixbuf::PixbufAnimation
+ # pixAnim = GdkPixbuf::PixbufAnimation.new 'anim.gif'
# image = Gtk::Image.new :animation => pixAnim
#
# @example Create an image from a file in a resource file
diff --git a/gtk3/lib/gtk3/loader.rb b/gtk3/lib/gtk3/loader.rb
index 0d64819..d195b33 100644
--- a/gtk3/lib/gtk3/loader.rb
+++ b/gtk3/lib/gtk3/loader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2014-2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -142,6 +142,7 @@ module Gtk
require "gtk3/text-buffer"
require "gtk3/text-iter"
require "gtk3/text-tag-table"
+ require "gtk3/text-view"
require "gtk3/toggle-action"
require "gtk3/toggle-button"
require "gtk3/tool-button"
@@ -239,10 +240,15 @@ module Gtk
end
end
- def enum_class_name(info)
- case info.name
- when /\ARc/
- "RC#{$POSTMATCH}"
+ def rubyish_class_name(info)
+ case info
+ when GObjectIntrospection::EnumInfo
+ case info.name
+ when /\ARc/
+ "RC#{$POSTMATCH}"
+ else
+ super
+ end
else
super
end
diff --git a/gtk3/lib/gtk3/text-buffer.rb b/gtk3/lib/gtk3/text-buffer.rb
index c94659b..5d8f555 100644
--- a/gtk3/lib/gtk3/text-buffer.rb
+++ b/gtk3/lib/gtk3/text-buffer.rb
@@ -29,6 +29,37 @@ module Gtk
tag
end
+ alias_method :add_mark_raw, :add_mark
+ def add_mark(mark, where)
+ @marks ||= {}
+ add_mark_raw(mark, where)
+ mark_name = mark.name
+ @marks[mark_name] = mark if mark_name
+ end
+
+ alias_method :create_mark_raw, :create_mark
+ def create_mark(name, where, options={})
+ if options == true or options == false
+ options = {:left_gravity => options}
+ end
+ left_gravity = options[:left_gravity]
+ left_gravity = true if left_gravity.nil?
+ @marks ||= {}
+ if name.nil?
+ create_mark_raw(name, where, left_gravity)
+ else
+ @marks[name] = create_mark_raw(name, where, left_gravity)
+ end
+ end
+
+ alias_method :delete_mark_raw, :delete_mark
+ def delete_mark(mark)
+ @marks ||= {}
+ mark_name = mark.name
+ delete_mark_raw(mark)
+ @marks.delete(mark_name) if mark_name
+ end
+
# prevent collision with deprecated methods.
alias_method :get_iter_at_line_offset_raw, :get_iter_at_line_offset
alias_method :get_iter_at_line_index_raw, :get_iter_at_line_index
@@ -99,7 +130,7 @@ module Gtk
insert_interactive(iter, target, default_editable)
else
case target
- when Gdk::Pixbuf
+ when GdkPixbuf::Pixbuf
insert_pixbuf_raw(iter, target)
when TextChildAnchor
insert_text_child_anchor_raw(iter, target)
@@ -148,19 +179,9 @@ module Gtk
end
end
- alias_method :serialize_formats_raw, :serialize_formats
- def serialize_formats
- serialize_formats_raw[0]
- end
-
- alias_method :deserialize_formats_raw, :deserialize_formats
- def deserialize_formats
- deserialize_formats_raw[0]
- end
-
alias_method :serialize_raw, :serialize
def serialize(*arguments)
- serialize_raw(*arguments)[0].pack("C*")
+ serialize_raw(*arguments).pack("C*")
end
alias_method :selection_bounds_raw, :selection_bounds
diff --git a/gtk3/lib/gtk3/text-view.rb b/gtk3/lib/gtk3/text-view.rb
new file mode 100644
index 0000000..0335102
--- /dev/null
+++ b/gtk3/lib/gtk3/text-view.rb
@@ -0,0 +1,53 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+module Gtk
+ class TextView
+ def get_iter_at(options)
+ location = options[:location]
+ position = options[:position]
+
+ if location
+ get_iter_at_location(*location)
+ elsif position
+ get_iter_at_position(*position)
+ else
+ message = "must specify :location or :position: #{options.inspect}"
+ raise ArgumentError, message
+ end
+ end
+
+ alias_method :get_iter_at_location_raw, :get_iter_at_location
+ def get_iter_at_location(x, y)
+ found, iter = get_iter_at_location_raw(x, y)
+ if found
+ iter
+ else
+ nil
+ end
+ end
+
+ alias_method :get_iter_at_position_raw, :get_iter_at_position
+ def get_iter_at_position(x, y)
+ found, iter, trailing = get_iter_at_position_raw(x, y)
+ if found
+ [iter, trailing]
+ else
+ nil
+ end
+ end
+ end
+end
diff --git a/gtk3/lib/gtk3/tree-model.rb b/gtk3/lib/gtk3/tree-model.rb
index 78a4d85..0437d92 100644
--- a/gtk3/lib/gtk3/tree-model.rb
+++ b/gtk3/lib/gtk3/tree-model.rb
@@ -100,6 +100,11 @@ module Gtk
set(iter, columns, _values)
end
+ alias_method :get_column_type_raw, :get_column_type
+ def get_column_type(index)
+ (@column_types ||= {})[index] ||= get_column_type_raw(index)
+ end
+
private
def setup_iter(iter)
iter.model = self
diff --git a/gtk3/lib/gtk3/tree-view.rb b/gtk3/lib/gtk3/tree-view.rb
index 5492f4d..b3c9771 100644
--- a/gtk3/lib/gtk3/tree-view.rb
+++ b/gtk3/lib/gtk3/tree-view.rb
@@ -61,5 +61,30 @@ module Gtk
raise ArgumentError, "wrong number of arguments (#{args.size} for 2..4)"
end
end
+
+ alias_method :expand_row_raw, :expand_row
+ def expand_row(path, options={})
+ if options == true or options == false
+ open_all = options
+ else
+ open_all = options[:open_all]
+ open_all = true if open_all.nil?
+ end
+
+ expand_row_raw(path, open_all)
+ end
+
+ private
+ def create_signal_handler(signal_name, callback)
+ case signal_name
+ when "row-collapsed", "row-expanded"
+ lambda do |tree_view, iter, path, *extra_args|
+ iter.model = tree_view.model
+ callback.call(tree_view, iter, path, *extra_args)
+ end
+ else
+ super
+ end
+ end
end
end
diff --git a/gtk3/lib/gtk3/widget.rb b/gtk3/lib/gtk3/widget.rb
index d23a03e..848ddff 100644
--- a/gtk3/lib/gtk3/widget.rb
+++ b/gtk3/lib/gtk3/widget.rb
@@ -50,11 +50,6 @@ module Gtk
end
end
- alias_method :style_properties_raw, :style_properties
- def style_properties
- style_properties_raw[0]
- end
-
alias_method :set_connect_func_raw, :set_connect_func
def set_connect_func(&block)
set_connect_func_raw do |*args|
diff --git a/gtk3/sample/gtk-demo/TODO b/gtk3/sample/gtk-demo/TODO
index 3b13529..e36ae20 100644
--- a/gtk3/sample/gtk-demo/TODO
+++ b/gtk3/sample/gtk-demo/TODO
@@ -1,6 +1,10 @@
# C version (3.19.1) versus Ruby version
-C version Ruby version Updated
+# Ruby version : is there already a ruby version of the demo
+# Updated 3.19 : if there is a ruby version is it udapted to 3.19
+# Changed? 3.20: does this demo has changed with version 3.20
+#
+C version Ruby version Updated 3.20
application.c no no
assistant.c ok ok
builder.c ok ok
@@ -25,6 +29,7 @@ expander.c ok ok
filtermodel.c ok ok
flowbox.c no no
font_features.c ok ok
+foreigndrawing no no
gestures.c no no
glarea.c no no
headerbar.c ok ok
@@ -45,11 +50,11 @@ overlay.c ok ok
overlay2.c ok ok
panes.c ok ok
pickers.c ok ok
-pixbufs.c ok no
+pixbufs.c ok ok
popover.c ok ok
printing.c ok ok
revealer.c ok ok
-rotated_text.c ok no
+rotated_text.c ok ok
scale.c ok ok
search_entry.c no no
search_entry2.c ok ok
@@ -60,11 +65,11 @@ spinbutton.c no no
spinner.c ok ok
stack.c ok ok
textmask.c ok ok
-textscroll.c no no
+textscroll.c ok ok
textview.c ok no
theming_style_classes.c ok ok
toolpalette.c no no
-transparent.c no no
+transparent.c ok ok
tree_store.c ok no
# Ruby version
@@ -72,4 +77,3 @@ Check all the ruby demos that doesn't correspond to a C version.
# Demo that are not to be done
pagesetup.c
-
diff --git a/gtk3/sample/gtk-demo/application.ui b/gtk3/sample/gtk-demo/application.ui
index b3d8753..1ff1b4b 100644
--- a/gtk3/sample/gtk-demo/application.ui
+++ b/gtk3/sample/gtk-demo/application.ui
@@ -1,100 +1,123 @@
<?xml version="1.0"?>
<interface>
- <object class="GtkGrid" id="grid">
+ <template class="DemoApplicationWindow" parent="GtkApplicationWindow">
+ <property name="title" translatable="yes">Application Class</property>
+ <property name="default-width">200</property>
+ <property name="default-height">200</property>
+ <property name="icon-name">document-open</property>
<child>
- <object class="GtkToolbar" id="toolbar">
- <property name="hexpand">1</property>
- <style>
- <class name="primary-toolbar"/>
- </style>
- <child>
- <object class="GtkMenuToolButton" id="menutool">
- <property name="icon-name">document-open</property>
- </object>
- </child>
+ <object class="GtkGrid">
+ <property name="visible">1</property>
<child>
- <object class="GtkToolButton" id="quit">
- <property name="icon-name">application-exit</property>
- <property name="action-name">app.quit</property>
+ <object class="GtkToolbar">
+ <property name="visible">1</property>
+ <property name="hexpand">1</property>
+ <style>
+ <class name="primary-toolbar"/>
+ </style>
+ <child>
+ <object class="GtkMenuToolButton" id="menutool">
+ <property name="visible">1</property>
+ <property name="icon-name">document-open</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToolButton">
+ <property name="visible">1</property>
+ <property name="icon-name">application-exit</property>
+ <property name="action-name">app.quit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem">
+ <property name="visible">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToolButton">
+ <property name="visible">1</property>
+ <property name="icon-name">applications-other</property>
+ <property name="action-name">win.logo</property>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
</child>
<child>
- <object class="GtkSeparatorToolItem" id="sep"/>
- </child>
- <child>
- <object class="GtkToolButton" id="logo">
- <property name="icon-name">applications-other</property>
- <property name="action-name">win.logo</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkInfoBar" id="infobar">
- <property name="no-show-all">1</property>
- <property name="hexpand">1</property>
- <child internal-child="content_area">
- <object class="GtkBox" id="content_area">
- <child>
- <object class="GtkLabel" id="message">
- <property name="visible">1</property>
- <property name="hexpand">1</property>
+ <object class="GtkInfoBar" id="infobar">
+ <property name="no-show-all">1</property>
+ <property name="hexpand">1</property>
+ <child internal-child="content_area">
+ <object class="GtkBox" id="content_area">
+ <child>
+ <object class="GtkLabel" id="message">
+ <property name="visible">1</property>
+ <property name="hexpand">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="valign">center</property>
+ <property name="label" translatable="yes">_OK</property>
+ <property name="use_underline">1</property>
+ <signal name="clicked" handler="clicked_cb"/>
+ </object>
+ </child>
</object>
</child>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
</child>
- <child internal-child="action_area">
- <object class="GtkBox" id="action_area">
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">1</property>
+ <property name="shadow-type">in</property>
<child>
- <object class="GtkButton" id="button">
+ <object class="GtkTextView">
<property name="visible">1</property>
- <property name="valign">center</property>
- <property name="label" translatable="yes">_OK</property>
- <property name="use_underline">1</property>
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="buffer">buffer</property>
</object>
</child>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
</child>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="sw">
- <property name="shadow-type">in</property>
<child>
- <object class="GtkTextView" id="contents">
+ <object class="GtkStatusbar" id="status">
<property name="hexpand">1</property>
- <property name="vexpand">1</property>
+ <property name="visible">1</property>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
</child>
</object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">2</property>
- </packing>
</child>
- <child>
- <object class="GtkStatusbar" id="status">
- <property name="hexpand">1</property>
- <property name="visible">1</property>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">3</property>
- </packing>
- </child>
- </object>
+ </template>
<menu id="toolmenu">
<item>
<attribute name="label">File1</attribute>
<attribute name="action">win.file1</attribute>
</item>
</menu>
+ <object class="GtkTextBuffer" id="buffer">
+ <signal name="changed" handler="update_statusbar"/>
+ <signal name="mark-set" handler="mark_set_callback"/>
+ </object>
</interface>
diff --git a/gtk3/sample/gtk-demo/appmenu.ui b/gtk3/sample/gtk-demo/appmenu.ui
new file mode 100644
index 0000000..d52693b
--- /dev/null
+++ b/gtk3/sample/gtk-demo/appmenu.ui
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <menu id="appmenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">About</attribute>
+ <attribute name="action">app.about</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="action">app.quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/gtk3/sample/gtk-demo/assistant.rb b/gtk3/sample/gtk-demo/assistant.rb
index 5ec588e..6dd2071 100644
--- a/gtk3/sample/gtk-demo/assistant.rb
+++ b/gtk3/sample/gtk-demo/assistant.rb
@@ -60,6 +60,7 @@ module AssistantDemo
entry = Gtk::Entry.new
entry.activates_default = true
+ entry.valign = :center
box.pack_start(entry, :expand => true, :fill => true, :padding => 0)
entry.signal_connect "changed" do |widget|
diff --git a/gtk3/sample/gtk-demo/css_accordion.css b/gtk3/sample/gtk-demo/css_accordion.css
index 957999a..ef28451 100644
--- a/gtk3/sample/gtk-demo/css_accordion.css
+++ b/gtk3/sample/gtk-demo/css_accordion.css
@@ -7,7 +7,7 @@
font: Cantarell 20px;
}
-GtkWindow {
+window {
background: linear-gradient(153deg, #151515, #151515 5px, transparent 5px) 0 0,
linear-gradient(333deg, #151515, #151515 5px, transparent 5px) 10px 5px,
linear-gradient(153deg, #222, #222 5px, transparent 5px) 0 5px,
@@ -18,7 +18,7 @@ GtkWindow {
background-size: 20px 20px;
}
-.button {
+button {
color: black;
background-color: #bbb;
border-style: solid;
@@ -28,25 +28,25 @@ GtkWindow {
padding: 12px 4px;
}
-.button:first-child {
+button:first-child {
border-radius: 5px 0 0 5px;
}
-.button:last-child {
+button:last-child {
border-radius: 0 5px 5px 0;
border-width: 2px;
}
-.button:hover {
+button:hover {
padding: 12px 48px;
background-color: #4870bc;
}
-.button *:hover {
+button *:hover {
color: white;
}
-.button:hover:active,
-.button:active {
+button:hover:active,
+button:active {
background-color: #993401;
}
diff --git a/gtk3/sample/gtk-demo/css_accordion.rb b/gtk3/sample/gtk-demo/css_accordion.rb
index 9628f9d..13b2c61 100644
--- a/gtk3/sample/gtk-demo/css_accordion.rb
+++ b/gtk3/sample/gtk-demo/css_accordion.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
=begin
-= CSS Theming/CSS Accordion
+= Theming/CSS Accordion
A simple accordion demo written using CSS transitions and multiple backgrounds
=end
diff --git a/gtk3/sample/gtk-demo/css_basics.css b/gtk3/sample/gtk-demo/css_basics.css
index 62dba7a..0b3365f 100644
--- a/gtk3/sample/gtk-demo/css_basics.css
+++ b/gtk3/sample/gtk-demo/css_basics.css
@@ -16,7 +16,7 @@
}
/* Make sure selections are visible */
-:selected {
+selection {
background-color: darkGreen;
color: black;
}
diff --git a/gtk3/sample/gtk-demo/css_basics.rb b/gtk3/sample/gtk-demo/css_basics.rb
index c6c529b..614e594 100644
--- a/gtk3/sample/gtk-demo/css_basics.rb
+++ b/gtk3/sample/gtk-demo/css_basics.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
=begin
-= CSS Theming/CSS Basics
+= Theming/CSS Basics
Gtk themes are written using CSS. Every widget is build of multiple items
that you can style very similarly to a regular website.
diff --git a/gtk3/sample/gtk-demo/css_multiplebgs.rb b/gtk3/sample/gtk-demo/css_multiplebgs.rb
index 8b9e783..a9a733f 100644
--- a/gtk3/sample/gtk-demo/css_multiplebgs.rb
+++ b/gtk3/sample/gtk-demo/css_multiplebgs.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
=begin
-= CSS Theming/Multiple Backgrounds
+= Theming/Multiple Backgrounds
Gtk themes are written using CSS. Every widget is build of multiple items
that you can style very similarly to a regular website.
diff --git a/gtk3/sample/gtk-demo/css_pixbufs.css b/gtk3/sample/gtk-demo/css_pixbufs.css
index 226525c..e6d33b0 100644
--- a/gtk3/sample/gtk-demo/css_pixbufs.css
+++ b/gtk3/sample/gtk-demo/css_pixbufs.css
@@ -50,7 +50,7 @@
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto }
}
-GtkWindow {
+window {
background-image: url("resource://css_pixbufs/apple-red.png"),
url("resource://css_pixbufs/gnome-applets.png"),
url("resource://css_pixbufs/gnome-calendar.png"),
@@ -66,7 +66,7 @@ GtkWindow {
}
/* Make the text editor has a nice style */
-.view, .scrollbar, .pane-separator {
+.view, scrollbar, separator {
color: black;
background-color: rgba(255,255,255,0.5);
}
diff --git a/gtk3/sample/gtk-demo/css_pixbufs.rb b/gtk3/sample/gtk-demo/css_pixbufs.rb
index 0d7a3f6..56bfbf8 100644
--- a/gtk3/sample/gtk-demo/css_pixbufs.rb
+++ b/gtk3/sample/gtk-demo/css_pixbufs.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
=begin
-= CSS Theming/Animated Backgrounds
+= Theming/Animated Backgrounds
This demo is done in honour of the Pixbufs demo further down.
It is done exclusively with CSS as the background of the window.
diff --git a/gtk3/sample/gtk-demo/css_shadows.css b/gtk3/sample/gtk-demo/css_shadows.css
index 6e6b21a..ca7a041 100644
--- a/gtk3/sample/gtk-demo/css_shadows.css
+++ b/gtk3/sample/gtk-demo/css_shadows.css
@@ -19,7 +19,7 @@
background-size: 29px, 59px, 73px, 109px;
}
-.button {
+button {
color: black;
padding: 10px;
border-radius: 5px;
@@ -27,17 +27,17 @@
border: 1px transparent solid;
}
-.button:hover {
+button:hover {
text-shadow: 3px 3px 5px alpha(black, 0.75);
- icon-shadow: 3px 3px 5px alpha(black, 0.75);
+ -gtk-icon-shadow: 3px 3px 5px alpha(black, 0.75);
box-shadow: 3px 3px 5px alpha(black, 0.5) inset;
border: solid 1px alpha(black, 0.75);
}
-.button:active {
+button:active {
padding: 11px 9px 9px 11px;
text-shadow: 1px 1px 2.5px alpha(black, 0.6);
- icon-shadow: 1px 1px 2.5px alpha(black, 0.6);
+ -gtk-icon-shadow: 1px 1px 2.5px alpha(black, 0.6);
}
diff --git a/gtk3/sample/gtk-demo/css_shadows.rb b/gtk3/sample/gtk-demo/css_shadows.rb
index e42cf99..50835d2 100644
--- a/gtk3/sample/gtk-demo/css_shadows.rb
+++ b/gtk3/sample/gtk-demo/css_shadows.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
=begin
-= CSS Theming/Shadows
+= Theming/Shadows
This demo shows how to use CSS shadows.
=end
diff --git a/gtk3/sample/gtk-demo/cssview.css b/gtk3/sample/gtk-demo/cssview.css
index 5060c39..a3675c9 100644
--- a/gtk3/sample/gtk-demo/cssview.css
+++ b/gtk3/sample/gtk-demo/cssview.css
@@ -10,12 +10,12 @@
background-color: #4a90d9;
}
-.scrollbar.trough,
+scrollbar trough,
.scrollbars-junction {
background-color: alpha(white, 0.80);
}
-.scrollbar.slider {
+scrollbar slider {
border-width: 3px;
border-style: solid;
border-radius: 10px;
@@ -24,11 +24,11 @@
background-color: #999;
}
-.scrollbar.slider:prelight {
+scrollbar slider:hover {
background-color: #555;
}
-.pane-separator {
+paned separator {
background-color: alpha(white, 0.80);
background-image: linear-gradient(transparent, transparent 1px, #999 1px, #999 4px, transparent 4px);
background-size: 40px auto;
@@ -36,6 +36,6 @@
background-position: center;
}
-.pane-separator:prelight {
+paned separator:hover {
background-image: linear-gradient(transparent, transparent 1px, #555 1px, #555 4px, transparent 4px);
}
diff --git a/gtk3/sample/gtk-demo/data/16x16/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/16x16/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..945c632
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/16x16/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/16x16/gtk3-demo.png b/gtk3/sample/gtk-demo/data/16x16/gtk3-demo.png
new file mode 100644
index 0000000..604e6c5
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/16x16/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/22x22/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/22x22/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..dbe69aa
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/22x22/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/22x22/gtk3-demo.png b/gtk3/sample/gtk-demo/data/22x22/gtk3-demo.png
new file mode 100644
index 0000000..9bf42e8
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/22x22/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/24x24/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/24x24/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..21d0ac1
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/24x24/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/24x24/gtk3-demo.png b/gtk3/sample/gtk-demo/data/24x24/gtk3-demo.png
new file mode 100644
index 0000000..7136592
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/24x24/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/256x256/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/256x256/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..ef5305d
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/256x256/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/256x256/gtk3-demo.png b/gtk3/sample/gtk-demo/data/256x256/gtk3-demo.png
new file mode 100644
index 0000000..2a59889
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/256x256/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/32x32/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/32x32/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..d212a0f
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/32x32/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/32x32/gtk3-demo.png b/gtk3/sample/gtk-demo/data/32x32/gtk3-demo.png
new file mode 100644
index 0000000..9d046bb
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/32x32/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/48x48/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/48x48/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..93fa6b7
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/48x48/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/48x48/gtk3-demo.png b/gtk3/sample/gtk-demo/data/48x48/gtk3-demo.png
new file mode 100644
index 0000000..d351788
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/48x48/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/512x512/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/512x512/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..7746398
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/512x512/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/512x512/gtk3-demo.png b/gtk3/sample/gtk-demo/data/512x512/gtk3-demo.png
new file mode 100644
index 0000000..d6d38cb
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/512x512/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/source.svg b/gtk3/sample/gtk-demo/data/source.svg
new file mode 100644
index 0000000..b2eafd9
--- /dev/null
+++ b/gtk3/sample/gtk-demo/data/source.svg
@@ -0,0 +1,2886 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="300"
+ id="svg11300"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-ydpi="90.000000"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="gtk3-demo.svg"
+ sodipodi:version="0.32"
+ style="display:inline;enable-background:new"
+ version="1.0"
+ width="400">
+ <metadata
+ id="metadata150">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:title />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Lapo Calamandrei</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>optical</rdf:li>
+ <rdf:li>media</rdf:li>
+ <rdf:li>cd</rdf:li>
+ <rdf:li>dvd</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ fill="#f57900"
+ gridtolerance="12"
+ guidetolerance="13"
+ height="300px"
+ id="base"
+ inkscape:current-layer="layer6"
+ inkscape:cx="-181.38052"
+ inkscape:cy="86.438237"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:showpageshadow="false"
+ inkscape:snap-bbox="true"
+ inkscape:snap-nodes="false"
+ inkscape:window-height="1374"
+ inkscape:window-width="2560"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:zoom="1"
+ objecttolerance="7"
+ pagecolor="#ffffff"
+ showgrid="false"
+ stroke="#ef2929"
+ width="400px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ enabled="true"
+ id="grid5883"
+ spacingx="1px"
+ spacingy="1px"
+ type="xygrid"
+ visible="true"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <defs
+ id="defs3">
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect13049"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect13045"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect13041"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect13037"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect13033"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect13029"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect13025"
+ is_visible="true" />
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect13021"
+ effect="spiro" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect13017"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect12179"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect12082"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect12062"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect12058"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect11284"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect10766"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect1920"
+ is_visible="true" />
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect22436"
+ is_visible="true" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient22426">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop22428" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop22430" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect22396"
+ is_visible="true" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3448">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3450" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3452" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect3446"
+ is_visible="true" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3436">
+ <stop
+ style="stop-color:#fcaf3e;stop-opacity:1;"
+ offset="0"
+ id="stop3438" />
+ <stop
+ style="stop-color:#df8604;stop-opacity:1"
+ offset="1"
+ id="stop3440" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2952">
+ <stop
+ style="stop-color:#c3571f;stop-opacity:1"
+ offset="0"
+ id="stop2954" />
+ <stop
+ style="stop-color:#e17843;stop-opacity:0;"
+ offset="1"
+ id="stop2956" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2762">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2764" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop2766" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2646">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2648" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2650" />
+ </linearGradient>
+ <inkscape:path-effect
+ effect="spiro"
+ id="path-effect2620"
+ is_visible="true" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5679">
+ <stop
+ style="stop-color:#ff7215;stop-opacity:1"
+ offset="0"
+ id="stop5681" />
+ <stop
+ style="stop-color: rgb(252, 175, 62); stop-opacity: 0;"
+ offset="1"
+ id="stop5683" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5669">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5671" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5673" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5625">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5627" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5629" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5505">
+ <stop
+ id="stop5507"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0.5"
+ id="stop5509" />
+ <stop
+ id="stop5511"
+ offset="1"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5495">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.21327014"
+ offset="0"
+ id="stop5497" />
+ <stop
+ id="stop5499"
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0;"
+ offset="1"
+ id="stop5501" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5110">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.4"
+ offset="0"
+ id="stop5112" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop5114" />
+ </linearGradient>
+ <linearGradient
+ y2="14.2033"
+ x2="35.391201"
+ y1="32.4165"
+ x1="12.2744"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4573">
+ <stop
+ id="stop4575"
+ style="stop-color:#babdb6;stop-opacity:1"
+ offset="0" />
+ <stop
+ offset="0.25"
+ style="stop-color:#d9d9d9;stop-opacity:1;"
+ id="stop4577" />
+ <stop
+ id="stop4579"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.5" />
+ <stop
+ offset="1"
+ style="stop-color:#888a85;stop-opacity:1"
+ id="stop4581" />
+ </linearGradient>
+ <linearGradient
+ y2="14.2033"
+ y1="32.4165"
+ x2="35.391201"
+ x1="12.2744"
+ id="linearGradient4237"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#FBFBFB"
+ offset="0"
+ id="stop4239" />
+ <stop
+ style="stop-color:#B6B6B6"
+ offset="0.5"
+ id="stop4241" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1"
+ id="stop4243" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3435"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3437"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3439"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3394"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3396"
+ offset="0.0000000"
+ style="stop-color:#fff307;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3398"
+ offset="0.50000000"
+ style="stop-color:#166eff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3400"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3406"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3408"
+ offset="0.0000000"
+ style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+ <stop
+ id="stop3410"
+ offset="1.0000000"
+ style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+ <stop
+ id="stop3412"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5844"
+ gradientUnits="userSpaceOnUse"
+ x1="12.2744"
+ y1="32.4165"
+ x2="35.391201"
+ y2="14.2033">
+ <stop
+ offset="0"
+ style="stop-color:#fbfbfb;stop-opacity:0;"
+ id="stop5846" />
+ <stop
+ id="stop5848"
+ style="stop-color:#e8e8e8;stop-opacity:0;"
+ offset="0.30952382" />
+ <stop
+ offset="0.46209913"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ id="stop5850" />
+ <stop
+ id="stop5859"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.54616135" />
+ <stop
+ id="stop5852"
+ style="stop-color:#e3e3e3;stop-opacity:0;"
+ offset="0.71428573" />
+ <stop
+ offset="1"
+ style="stop-color:#d1d1d1;stop-opacity:0;"
+ id="stop5854" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5956">
+ <stop
+ id="stop5958"
+ offset="0"
+ style="stop-color:#e6e6e6;stop-opacity:1;" />
+ <stop
+ style="stop-color:#404040;stop-opacity:0.52525252;"
+ offset="0.5"
+ id="stop5964" />
+ <stop
+ id="stop5960"
+ offset="1"
+ style="stop-color:#ededed;stop-opacity:0.78823531;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6117">
+ <stop
+ id="stop6119"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop6121"
+ offset="1"
+ style="stop-color:#333333;stop-opacity:0.26262626;" />
+ </linearGradient>
+ <linearGradient
+ y2="14.2033"
+ x2="35.391201"
+ y1="32.4165"
+ x1="12.2744"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5724">
+ <stop
+ id="stop5726"
+ style="stop-color:#f5f5f5;stop-opacity:1;"
+ offset="0" />
+ <stop
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:0;"
+ id="stop5728" />
+ <stop
+ id="stop5730"
+ style="stop-color:#d9d9d9;stop-opacity:1;"
+ offset="0.75" />
+ <stop
+ offset="1"
+ style="stop-color:#e8e8e8;stop-opacity:0;"
+ id="stop5732" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5753">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0"
+ id="stop5755" />
+ <stop
+ id="stop5761"
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.75"
+ id="stop5763" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5757" />
+ </linearGradient>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4359">
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 383.15625,310 C 380.25513,310.02465 377.31331,310.15721 374.375,310.40625 C 311.69083,315.7191 265.09339,370.94084 270.40625,433.625 C 275.71911,496.3092 330.94082,542.90663 393.625,537.59375 C 456.30917,532.28089 502.90662,477.05917 497.59375,414.375 C 492.52994,354.62912 442.14563,309.49854 383.15625,310 z M 384,388 C 403.872,388.00001 420,404.128 420,424 C 420,443.872 403.872,460 384,460 C 364.12801,460 348,443.872 348,424 C 348,404.128 364.128,388 384,388 z"
+ id="path4361" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath5197">
+ <g
+ transform="matrix(-4.519923e-2,-0.998978,0.998978,-4.519923e-2,316.33904,0.34975)"
+ id="g5199">
+ <text
+ xml:space="preserve"
+ style="font-size:6px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Impact;-inkscape-font-specification:Impact Bold"
+ id="text5201"
+ sodipodi:linespacing="125%"
+ transform="translate(0,-330)"
+ x="88.68774"
+ y="-177.16786">Tango Media. Only capable of holding freely licensed content. Explodes in hard drives when trying to store proprietary software.</text>
+ <path
+ style="fill:#000000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new"
+ d="M 144,-279 C 81.365681,-279 31,-228.63428 31,-166 C 31,-103.3657 81.365691,-53 144,-53 C 206.63423,-53.00001 257,-103.36571 257,-166 C 257,-228.63427 206.63424,-279 144,-279 z M 144,-214 C 170.496,-214 192,-192.496 192,-166 C 192,-139.504 170.496,-118 144,-118 C 117.504,-118.00001 95.999996,-139.504 95.999996,-166 C 96.000006,-192.496 117.504,-214 144,-214 z"
+ id="path5205" />
+ </g>
+ </clipPath>
+ <linearGradient
+ y2="42.813938"
+ x2="32.309113"
+ y1="46.229389"
+ x1="32.556377"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1469"
+ xlink:href="#linearGradient2498"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="34.307499"
+ x2="32.511002"
+ y1="11.1885"
+ x1="14.9966"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd1-6">
+ <stop
+ id="stop3034-6"
+ style="stop-color: rgb(235, 235, 235);"
+ offset="0" />
+ <stop
+ id="stop3036-4"
+ style="stop-color: rgb(255, 255, 255);"
+ offset="0.5" />
+ <stop
+ id="stop3038-9"
+ style="stop-color: rgb(235, 235, 235);"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="14.2033"
+ x2="35.391201"
+ y1="32.4165"
+ x1="12.2744"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd2-6">
+ <stop
+ id="stop3043-8"
+ style="stop-color: rgb(251, 251, 251);"
+ offset="0" />
+ <stop
+ id="stop3045-9"
+ style="stop-color: rgb(182, 182, 182);"
+ offset="0.5" />
+ <stop
+ id="stop3047-2"
+ style="stop-color: rgb(228, 228, 228);"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4236-9">
+ <stop
+ id="stop4238-2"
+ offset="0"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+ <stop
+ id="stop4240-0"
+ offset="1.0000000"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0.60396;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2421">
+ <stop
+ id="stop2423"
+ offset="0"
+ style="stop-color: rgb(245, 121, 0); stop-opacity: 1;" />
+ <stop
+ style="stop-color: rgb(245, 121, 0); stop-opacity: 1;"
+ offset="0.33333334"
+ id="stop2437" />
+ <stop
+ id="stop2425"
+ offset="1"
+ style="stop-color: rgb(206, 92, 0); stop-opacity: 1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2490">
+ <stop
+ id="stop2492"
+ offset="0"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0.738281;" />
+ <stop
+ id="stop2494"
+ offset="1"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2498"
+ inkscape:collect="always">
+ <stop
+ id="stop2500"
+ offset="0"
+ style="stop-color: rgb(206, 92, 0);" />
+ <stop
+ id="stop2502"
+ offset="1"
+ style="stop-color: rgb(245, 121, 0);" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5821">
+ <stop
+ style="stop-color:#f3d09c;stop-opacity:1"
+ offset="0"
+ id="stop5823" />
+ <stop
+ style="stop-color:#e78221;stop-opacity:1"
+ offset="1"
+ id="stop5825" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6016"
+ id="radialGradient6317"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1273876,-0.07262356,0.03283417,0.5061061,-15.126596,94.990248)"
+ cx="67.131371"
+ cy="199.40643"
+ fx="67.131371"
+ fy="199.40643"
+ r="55.921093" />
+ <linearGradient
+ id="linearGradient6016">
+ <stop
+ id="stop6020"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0;" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="0.5"
+ id="stop6054" />
+ <stop
+ id="stop6018"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:1;" />
+ </linearGradient>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6069">
+ <path
+ style="fill:#9db029;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block"
+ d="m 273.29692,48.665497 c 0,0 -130.66434,-9.858649 -130.66434,-9.858649 L 116.21736,169.22225 c -9.23859,-5.31235 -33.790951,-9.59854 -49.480102,-9.50756 -27.276396,0.15818 -48.916422,10.81607 -48.475101,23.6374 0.441322,12.82132 22.873124,23.18139 50.149525,23.02322 25.77572,-0.14948 49.845828,-9.00109 51.691458,-20.85605 L 143.69896,71.672145 c 0,0 116.86507,5.728523 116.86507,5.728523 L 240.66029,177.58293 c -59.8807,-21.26165 -95.64677,2.00187 -95.20544,14.82319 0.44132,12. [...]
+ id="path6071"
+ sodipodi:nodetypes="cccccccccccccc" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4933">
+ <path
+ style="color:#000000;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2674925;marker:none;visibility:visible;display:inline;overflow:visible"
+ d="m 23.461731,22.506139 c 0,1.644577 -0.551831,3.034662 -2.902033,2.973157 -2.28621,-0.05983 -2.998404,-1.416364 -3.047314,-2.979308 -0.0282,-0.924199 -0.448771,-4.4116 4.03064,-6.925454 -1.479411,2.513854 1.918707,5.287026 1.918707,6.931605 z"
+ id="path4935"
+ sodipodi:nodetypes="czscc" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath5024">
+ <path
+ style="fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block"
+ d="m 105.34425,31.00775 -0.5,134.89807 c -10.19391,-3.45371 -35.35077,-2.85656 -50.86945,0.33875 -26.98001,5.55521 -46.31271,20.43475 -43.35318,33.09551 2.95954,12.66076 27.21146,18.52246 54.19148,12.96725 25.49564,-5.24958 47.59017,-18.81406 47.08547,-30.96656 l 0.96771,-117.86646 c 47.00266,0 34.49688,35.56847 74.85559,35.56847 -30.26906,1.828 -20.58605,-67.806 -82.37762,-68.03503 z"
+ id="path5026"
+ sodipodi:nodetypes="ccccccccc" />
+ </clipPath>
+ <linearGradient
+ id="linearGradient2522-7">
+ <stop
+ id="stop2524-2"
+ offset="0"
+ style="stop-color: rgb(187, 83, 0); stop-opacity: 1;" />
+ <stop
+ id="stop2526-4"
+ offset="1"
+ style="stop-color: rgb(206, 92, 0); stop-opacity: 0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2773-5">
+ <stop
+ id="stop2775-8"
+ offset="0"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+ <stop
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0;"
+ offset="0.83333331"
+ id="stop1465-9" />
+ <stop
+ id="stop2777-5"
+ offset="1"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5625"
+ id="linearGradient5631"
+ x1="159.00543"
+ y1="216.25502"
+ x2="157.50327"
+ y2="198.58092"
+ gradientUnits="userSpaceOnUse" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath5645">
+ <path
+ d="m -70,190.5 a 106.5,82.5 0 1 1 -213,0 106.5,82.5 0 1 1 213,0 z"
+ sodipodi:ry="82.5"
+ sodipodi:rx="106.5"
+ sodipodi:cy="190.5"
+ sodipodi:cx="-176.5"
+ id="path5647"
+ style="color:#000000;fill:#fcaf3e;fill-opacity:1;fill-rule:evenodd;stroke:#f54d00;stroke-width:1.04322076;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ sodipodi:type="arc" />
+ </clipPath>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5669"
+ id="radialGradient5675"
+ cx="-108"
+ cy="182.35294"
+ fx="-108"
+ fy="182.35294"
+ r="13"
+ gradientTransform="matrix(1,0,0,0.46153846,0,102.30769)"
+ gradientUnits="userSpaceOnUse" />
+ <inkscape:perspective
+ id="perspective6244"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective6266"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective6288"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective6310"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective6332"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective6354"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ id="linearGradient5956-1">
+ <stop
+ id="stop5958-9"
+ offset="0"
+ style="stop-color:#e6e6e6;stop-opacity:1;" />
+ <stop
+ style="stop-color:#404040;stop-opacity:0.52525252;"
+ offset="0.5"
+ id="stop5964-6" />
+ <stop
+ id="stop5960-4"
+ offset="1"
+ style="stop-color:#ededed;stop-opacity:0.78823531;" />
+ </linearGradient>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4359-8">
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 383.15625,310 c -2.90112,0.0247 -5.84294,0.15721 -8.78125,0.40625 C 311.69083,315.7191 265.09339,370.94084 270.40625,433.625 275.71911,496.3092 330.94082,542.90663 393.625,537.59375 456.30917,532.28089 502.90662,477.05917 497.59375,414.375 492.52994,354.62912 442.14563,309.49854 383.15625,310 z M 384,388 c 19.872,10e-6 36,16.128 36,36 0,19.872 -16.128,36 -36,36 -19.87199,0 -36,-16.128 -36,-36 0,-19.872 16.128,-36 36,-36 z"
+ id="path4361-0" />
+ </clipPath>
+ <linearGradient
+ y2="14.2033"
+ x2="35.391201"
+ y1="32.4165"
+ x1="12.2744"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4573-8">
+ <stop
+ id="stop4575-1"
+ style="stop-color:#babdb6;stop-opacity:1"
+ offset="0" />
+ <stop
+ offset="0.25"
+ style="stop-color:#d9d9d9;stop-opacity:1;"
+ id="stop4577-0" />
+ <stop
+ id="stop4579-2"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.5" />
+ <stop
+ offset="1"
+ style="stop-color:#888a85;stop-opacity:1"
+ id="stop4581-2" />
+ </linearGradient>
+ <linearGradient
+ y2="14.2033"
+ x2="35.391201"
+ y1="32.4165"
+ x1="12.2744"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5724-9">
+ <stop
+ id="stop5726-7"
+ style="stop-color:#f5f5f5;stop-opacity:1;"
+ offset="0" />
+ <stop
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:0;"
+ id="stop5728-5" />
+ <stop
+ id="stop5730-6"
+ style="stop-color:#d9d9d9;stop-opacity:1;"
+ offset="0.75" />
+ <stop
+ offset="1"
+ style="stop-color:#e8e8e8;stop-opacity:0;"
+ id="stop5732-4" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6117-6">
+ <stop
+ id="stop6119-3"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop6121-7"
+ offset="1"
+ style="stop-color:#333333;stop-opacity:0.26262626;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1081">
+ <stop
+ id="stop1083"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1085"
+ offset="1"
+ style="stop-color:#333333;stop-opacity:0.26262626;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1088">
+ <stop
+ id="stop1090"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1092"
+ offset="1"
+ style="stop-color:#333333;stop-opacity:0.26262626;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1095">
+ <stop
+ id="stop1097"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop1099"
+ offset="1"
+ style="stop-color:#333333;stop-opacity:0.26262626;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5753-9">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0"
+ id="stop5755-7" />
+ <stop
+ id="stop5761-4"
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.75"
+ id="stop5763-9" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5757-1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1118">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0"
+ id="stop1120" />
+ <stop
+ id="stop1122"
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.75"
+ id="stop1124" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop1126" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5110-7">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.4"
+ offset="0"
+ id="stop5112-0" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop5114-6" />
+ </linearGradient>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath5197-0">
+ <g
+ transform="matrix(-0.04519923,-0.998978,0.998978,-0.04519923,316.33904,0.34975)"
+ id="g5199-8">
+ <text
+ xml:space="preserve"
+ style="font-size:6px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold"
+ id="text5201-5"
+ sodipodi:linespacing="125%"
+ transform="translate(0,-330)"
+ x="106.65373"
+ y="-177.97882">Tango Media. Only capable of holding freely licensed content. Explodes in hard drives when trying to store proprietary software.</text>
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#000000;fill-rule:nonzero;stroke:none;display:inline;enable-background:new"
+ d="m 144,-279 c -62.634319,0 -113,50.36572 -113,113 0,62.6343 50.365691,113 113,113 62.63423,-1e-5 113,-50.36571 113,-113 0,-62.63427 -50.36576,-113 -113,-113 z m 0,65 c 26.496,0 48,21.504 48,48 0,26.496 -21.504,48 -48,48 -26.496,-1e-5 -48.000004,-21.504 -48.000004,-48 1e-5,-26.496 21.504004,-48 48.000004,-48 z"
+ id="path5205-3" />
+ </g>
+ </clipPath>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter3474-9">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2600695"
+ id="feGaussianBlur3476-4" />
+ </filter>
+ <linearGradient
+ y2="14.2033"
+ y1="32.4165"
+ x2="35.391201"
+ x1="12.2744"
+ id="linearGradient4237-1"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ style="stop-color:#FBFBFB"
+ offset="0"
+ id="stop4239-5" />
+ <stop
+ style="stop-color:#B6B6B6"
+ offset="0.5"
+ id="stop4241-4" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1"
+ offset="1"
+ id="stop4243-1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5844-5"
+ gradientUnits="userSpaceOnUse"
+ x1="12.2744"
+ y1="32.4165"
+ x2="35.391201"
+ y2="14.2033">
+ <stop
+ offset="0"
+ style="stop-color:#fbfbfb;stop-opacity:0;"
+ id="stop5846-5" />
+ <stop
+ id="stop5848-4"
+ style="stop-color:#e8e8e8;stop-opacity:0;"
+ offset="0.30952382" />
+ <stop
+ offset="0.46209913"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ id="stop5850-9" />
+ <stop
+ id="stop5859-8"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.54616135" />
+ <stop
+ id="stop5852-3"
+ style="stop-color:#e3e3e3;stop-opacity:0;"
+ offset="0.71428573" />
+ <stop
+ offset="1"
+ style="stop-color:#d1d1d1;stop-opacity:0;"
+ id="stop5854-8" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3394-5"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3396-2"
+ offset="0.0000000"
+ style="stop-color:#fff307;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3398-2"
+ offset="0.50000000"
+ style="stop-color:#166eff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3400-2"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3406-7"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3408-0"
+ offset="0.0000000"
+ style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+ <stop
+ id="stop3410-3"
+ offset="1.0000000"
+ style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+ <stop
+ id="stop3412-4"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3435-6"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3437-3"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3439-6"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1167"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop1169"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop1171"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1174"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop1176"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop1178"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2730">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2732" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2734" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2730"
+ id="linearGradient3510"
+ gradientUnits="userSpaceOnUse"
+ x1="163.4375"
+ y1="148.21875"
+ x2="179"
+ y2="77" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5625"
+ id="linearGradient1704"
+ gradientUnits="userSpaceOnUse"
+ x1="159.00543"
+ y1="216.25502"
+ x2="157.50327"
+ y2="198.58092" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5625"
+ id="linearGradient1714"
+ gradientUnits="userSpaceOnUse"
+ x1="159.00543"
+ y1="216.25502"
+ x2="157.50327"
+ y2="198.58092" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6016"
+ id="radialGradient1736"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1273876,-0.07262356,0.03283417,0.5061061,-15.126596,94.990248)"
+ cx="67.131371"
+ cy="199.40643"
+ fx="67.131371"
+ fy="199.40643"
+ r="55.921093" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath2510">
+ <path
+ sodipodi:nodetypes="ccssscccc"
+ id="path2512"
+ d="m 201.09656,416.5043 -0.5,134.89807 c -10.19391,-3.45371 -21.0687,-2.87794 -30.24939,-1.69678 -19.48847,2.50733 -36.39656,11.71607 -33.39087,22.93345 2.73921,10.22288 21.25214,14.56977 48.04719,8.18172 8.93827,-2.13092 21.73788,-7.66457 22.64739,-13.98344 l 0.96771,-117.86646 c 47.00266,0 34.49688,35.56847 74.85559,35.56847 -30.26906,1.828 -20.58605,-67.806 -82.37762,-68.03503 z"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-opacity:1;marker:none;visibility:visible;display:block"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <filter
+ inkscape:collect="always"
+ id="filter2530">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.3145457"
+ id="feGaussianBlur2532" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5314-4"
+ id="radialGradient5320-7"
+ cx="156.5"
+ cy="258"
+ fx="156.5"
+ fy="258"
+ r="89.5"
+ gradientTransform="matrix(1,0,0,0.2122905,0,203.22905)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5314-4">
+ <stop
+ style="stop-color:#2e3436;stop-opacity:1;"
+ offset="0"
+ id="stop5316-1" />
+ <stop
+ style="stop-color:#2e3436;stop-opacity:0;"
+ offset="1"
+ id="stop5318-6" />
+ </linearGradient>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath2626">
+ <path
+ sodipodi:nodetypes="ccczzs"
+ id="path2628"
+ d="m 13.438424,13.355863 c 1.530009,2.06226 7.728822,7.396424 10.988415,10.988743 l 0.02709,-16.5291315 c 1.3e-5,-1.3112616 -1.574459,-1.6407193 -4.128882,-1.6406941 -2.467865,2.43e-5 -3.679033,0.6281048 -5.886798,2.6042469 -1.999519,1.7897437 -2.269426,2.8655817 -0.999831,4.5768357 z"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:0.34132761;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <filter
+ inkscape:collect="always"
+ id="filter2642">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.59907852"
+ id="feGaussianBlur2644" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2762"
+ id="radialGradient2774"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1889619,9.5604788e-8,-7.7861589e-8,1.7827147,8.3227222,119.87469)"
+ cx="-4.7158127"
+ cy="-152.43588"
+ fx="-4.7158127"
+ fy="-152.43588"
+ r="51.25" />
+ <mask
+ maskUnits="userSpaceOnUse"
+ id="mask2770">
+ <rect
+ style="color:#000000;fill:url(#radialGradient2774);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect2772"
+ width="102.5"
+ height="137.25"
+ x="-120.25"
+ y="-224" />
+ </mask>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2762-8">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2764-2" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop2766-0" />
+ </linearGradient>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath2940">
+ <path
+ style="color:#000000;fill:none;stroke:#e17843;stroke-width:0.54435194;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+ d="M 45.485011,24.650406 C 45.489502,36.169162 36.087252,45.514052 24.497845,45.509535 12.908437,45.505018 3.4988962,36.152795 3.4944046,24.634039 3.489913,13.115282 12.892164,3.770392 24.481571,3.7749093 c 11.589407,0.00452 20.998948,9.3567397 21.00344,20.8754967 z"
+ id="path2942"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <filter
+ inkscape:collect="always"
+ id="filter2964">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.52548081"
+ id="feGaussianBlur2966" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3436"
+ id="radialGradient3442"
+ cx="-157.99718"
+ cy="189.70802"
+ fx="-157.99718"
+ fy="189.70802"
+ r="11.162659"
+ gradientTransform="matrix(1,0,0,1.6589031,0,-120.43148)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3448"
+ id="radialGradient3454"
+ cx="-169.79938"
+ cy="186.50612"
+ fx="-169.79938"
+ fy="186.50612"
+ r="4.866712"
+ gradientTransform="matrix(2.7798583,0,0,8.3915425,302.21884,-1371.4749)"
+ gradientUnits="userSpaceOnUse" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6015">
+ <path
+ sodipodi:nodetypes="ccczzs"
+ id="path6017"
+ d="m 24.58135,8.5262881 0,15.7773249 11.19494,-11.15627 C 36.717617,12.206016 36.012089,10.650914 34.178268,8.8170923 32.406587,7.0454117 31.086217,6.626796 28.082662,6.46047 25.362414,6.3098322 24.58135,6.9905478 24.58135,8.5262881 z"
+ style="color:#000000;fill:none;stroke:#ae561c;stroke-width:0.34849483;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2646-60">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2648-6" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2650-6" />
+ </linearGradient>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath2626-7">
+ <path
+ sodipodi:nodetypes="ccczzs"
+ id="path2628-7"
+ d="m 13.438424,13.355863 c 1.530009,2.06226 7.728822,7.396424 10.988415,10.988743 l 0.02709,-16.5291315 c 1.3e-5,-1.3112616 -1.574459,-1.6407193 -4.128882,-1.6406941 -2.467865,2.43e-5 -3.679033,0.6281048 -5.886798,2.6042469 -1.999519,1.7897437 -2.269426,2.8655817 -0.999831,4.5768357 z"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:0.34132761;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter2642-1">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.59907852"
+ id="feGaussianBlur2644-6" />
+ </filter>
+ <radialGradient
+ r="5.8939619"
+ fy="9.6037779"
+ fx="17.519264"
+ cy="9.6037779"
+ cx="17.519264"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6038"
+ xlink:href="#linearGradient2646-60"
+ inkscape:collect="always" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath6449">
+ <path
+ style="color:#000000;fill:none;stroke:#ae561c;stroke-width:0.34849483;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+ d="m 8.8040241,24.696408 c 2.5788719,0.382055 10.8583649,-0.238784 15.7773249,0 L 12.734773,12.811161 c -0.941327,-0.941326 -2.308165,-0.04753 -4.1419858,1.786288 -1.7716806,1.771681 -2.1902964,3.09205 -2.3566221,6.095606 -0.1506379,2.720248 0.4279227,3.686326 2.567859,4.003353 z"
+ id="path6451"
+ sodipodi:nodetypes="ccczzs"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2646-4">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2648-7" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2650-79" />
+ </linearGradient>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath2626-9">
+ <path
+ sodipodi:nodetypes="ccczzs"
+ id="path2628-1"
+ d="m 13.438424,13.355863 c 1.530009,2.06226 7.728822,7.396424 10.988415,10.988743 l 0.02709,-16.5291315 c 1.3e-5,-1.3112616 -1.574459,-1.6407193 -4.128882,-1.6406941 -2.467865,2.43e-5 -3.679033,0.6281048 -5.886798,2.6042469 -1.999519,1.7897437 -2.269426,2.8655817 -0.999831,4.5768357 z"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:0.34132761;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter2642-4">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.59907852"
+ id="feGaussianBlur2644-63" />
+ </filter>
+ <radialGradient
+ r="5.8939619"
+ fy="9.6037779"
+ fx="17.519264"
+ cy="9.6037779"
+ cx="17.519264"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient6472"
+ xlink:href="#linearGradient2646-4"
+ inkscape:collect="always" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2762-8"
+ id="radialGradient6587"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0101777,-0.18624006,0.18650749,2.149352,61.479867,166.11438)"
+ cx="-29.586737"
+ cy="-167.494"
+ fx="-29.586737"
+ fy="-167.494"
+ r="51.25" />
+ <mask
+ maskUnits="userSpaceOnUse"
+ id="mask6583">
+ <rect
+ transform="matrix(0.99990965,0.01344185,0.01330504,0.99991148,0,0)"
+ style="color:#000000;fill:url(#radialGradient6587);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6585"
+ width="133.43913"
+ height="180.5154"
+ x="-126.05099"
+ y="-252.44954" />
+ </mask>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646"
+ id="radialGradient6729"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="17.519264"
+ cy="9.6037779"
+ fx="17.519264"
+ fy="9.6037779"
+ r="5.8939618" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646-60"
+ id="radialGradient6731"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="22.352484"
+ cy="10.509538"
+ fx="22.352484"
+ fy="10.509538"
+ r="5.8939619" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646-4"
+ id="radialGradient6733"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="14.04755"
+ cy="17.795752"
+ fx="14.04755"
+ fy="17.795752"
+ r="5.8939619" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5679"
+ id="linearGradient6735"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+ x1="21.436686"
+ y1="13.453218"
+ x2="21.436686"
+ y2="25.460827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5495"
+ id="linearGradient6737"
+ gradientUnits="userSpaceOnUse"
+ x1="24.061403"
+ y1="14.889434"
+ x2="25.633825"
+ y2="25.486128" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2952"
+ id="radialGradient6741"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+ cx="17.013964"
+ cy="7.9955516"
+ fx="17.013964"
+ fy="7.9955516"
+ r="20.995305" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2952"
+ id="radialGradient6743"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+ cx="28.948936"
+ cy="5.7242703"
+ fx="28.948936"
+ fy="5.7242703"
+ r="20.995305" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="aigrd2"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3043"
+ offset="0"
+ style="stop-color:#FBFBFB" />
+ <stop
+ id="stop3045"
+ offset="0.5"
+ style="stop-color:#B6B6B6" />
+ <stop
+ id="stop3047"
+ offset="1"
+ style="stop-color:#E4E4E4" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4236">
+ <stop
+ id="stop4238"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+ <stop
+ id="stop4240"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7295">
+ <stop
+ id="stop7297"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+ <stop
+ id="stop7299"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3394-56"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3396-9"
+ offset="0.0000000"
+ style="stop-color:#fff307;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3398-6"
+ offset="0.50000000"
+ style="stop-color:#166eff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3400-3"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3406-71"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3408-8"
+ offset="0.0000000"
+ style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+ <stop
+ id="stop3410-8"
+ offset="1.0000000"
+ style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+ <stop
+ id="stop3412-9"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3421"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3423"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3427"
+ offset="1.0000000"
+ style="stop-color:#b8c04c;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3435-7"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3437-2"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3439-7"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7320"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop7322"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop7324"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient7327"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop7329"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop7331"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646"
+ id="radialGradient7707"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="17.519264"
+ cy="9.6037779"
+ fx="17.519264"
+ fy="9.6037779"
+ r="5.8939618" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646-60"
+ id="radialGradient7709"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="22.352484"
+ cy="10.509538"
+ fx="22.352484"
+ fy="10.509538"
+ r="5.8939619" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646-4"
+ id="radialGradient7711"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="14.04755"
+ cy="17.795752"
+ fx="14.04755"
+ fy="17.795752"
+ r="5.8939619" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5679"
+ id="linearGradient7713"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+ x1="21.436686"
+ y1="13.453218"
+ x2="21.436686"
+ y2="25.460827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5495"
+ id="linearGradient7715"
+ gradientUnits="userSpaceOnUse"
+ x1="24.061403"
+ y1="14.889434"
+ x2="25.633825"
+ y2="25.486128" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2952"
+ id="radialGradient7721"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+ cx="28.948936"
+ cy="5.7242703"
+ fx="28.948936"
+ fy="5.7242703"
+ r="20.995305" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646"
+ id="radialGradient7761"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="17.519264"
+ cy="9.6037779"
+ fx="17.519264"
+ fy="9.6037779"
+ r="5.8939618" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646-60"
+ id="radialGradient7763"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="22.352484"
+ cy="10.509538"
+ fx="22.352484"
+ fy="10.509538"
+ r="5.8939619" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646-4"
+ id="radialGradient7765"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="14.04755"
+ cy="17.795752"
+ fx="14.04755"
+ fy="17.795752"
+ r="5.8939619" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5679"
+ id="linearGradient7767"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+ x1="21.436686"
+ y1="13.453218"
+ x2="21.436686"
+ y2="25.460827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5495"
+ id="linearGradient7769"
+ gradientUnits="userSpaceOnUse"
+ x1="24.061403"
+ y1="14.889434"
+ x2="25.633825"
+ y2="25.486128" />
+ <linearGradient
+ id="linearGradient2421-6">
+ <stop
+ id="stop2423-1"
+ offset="0"
+ style="stop-color: rgb(245, 121, 0); stop-opacity: 1;" />
+ <stop
+ style="stop-color: rgb(245, 121, 0); stop-opacity: 1;"
+ offset="0.33333334"
+ id="stop2437-3" />
+ <stop
+ id="stop2425-6"
+ offset="1"
+ style="stop-color: rgb(206, 92, 0); stop-opacity: 1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2490-1">
+ <stop
+ id="stop2492-0"
+ offset="0"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0.738281;" />
+ <stop
+ id="stop2494-7"
+ offset="1"
+ style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646"
+ id="radialGradient22335"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="17.519264"
+ cy="9.6037779"
+ fx="17.519264"
+ fy="9.6037779"
+ r="5.8939618" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646-60"
+ id="radialGradient22337"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="22.352484"
+ cy="10.509538"
+ fx="22.352484"
+ fy="10.509538"
+ r="5.8939619" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2646-4"
+ id="radialGradient22339"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+ cx="14.04755"
+ cy="17.795752"
+ fx="14.04755"
+ fy="17.795752"
+ r="5.8939619" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5679"
+ id="linearGradient22341"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+ x1="21.436686"
+ y1="13.453218"
+ x2="21.436686"
+ y2="25.460827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5495"
+ id="linearGradient22343"
+ gradientUnits="userSpaceOnUse"
+ x1="24.061403"
+ y1="14.889434"
+ x2="25.633825"
+ y2="25.486128" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2952"
+ id="radialGradient22347"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+ cx="17.013964"
+ cy="7.9955516"
+ fx="17.013964"
+ fy="7.9955516"
+ r="20.995305" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2952"
+ id="radialGradient22349"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+ cx="28.948936"
+ cy="5.7242703"
+ fx="28.948936"
+ fy="5.7242703"
+ r="20.995305" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath22418">
+ <path
+ d="m -157.5,164.25 c -6.39361,3.53188 -11.46767,9.39092 -14.0625,16.21875 -1.42692,3.75469 -2.1098,7.95217 -1,11.8125 0.73069,2.54163 2.23501,4.86361 4.3125,6.5 2.0775,1.6364 4.69966,2.5506 7.34375,2.5 3.05625,-0.0585 6.08319,-1.45178 8.0625,-3.78125 1.97931,-2.32948 2.88713,-5.55437 2.34375,-8.5625 -0.37317,-2.06583 -1.38717,-3.96997 -2.5,-5.75 -1.11283,-1.78003 -2.34656,-3.49531 -3.28125,-5.375 -2.06881,-4.16042 -2.51197,-9.09969 -1.21875,-13.5625 z"
+ inkscape:href="#path2453-1"
+ id="path22420"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:0.8175624;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible"
+ xlink:href="#path2453-1"
+ inkscape:original="M -157.5 164.25 C -163.89361 167.78188 -168.96767 173.64092 -171.5625 180.46875 C -172.98942 184.22344 -173.6723 188.42092 -172.5625 192.28125 C -171.83181 194.82288 -170.32749 197.14486 -168.25 198.78125 C -166.17251 200.41764 -163.55034 201.33186 -160.90625 201.28125 C -157.85 201.22275 -154.82306 199.82948 -152.84375 197.5 C -150.86444 195.17052 -149.95662 191.94563 -150.5 188.9375 C -150.87317 186.87167 -151.88717 184.96753 -153 183.1875 C -154.11283 181.4 [...]
+ inkscape:radius="0"
+ sodipodi:type="inkscape:offset" />
+ </clipPath>
+ <filter
+ inkscape:collect="always"
+ id="filter22422"
+ x="-0.11209149"
+ width="1.224183"
+ y="-0.068917568"
+ height="1.1378351">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.0634338"
+ id="feGaussianBlur22424" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient22426"
+ id="radialGradient22432"
+ cx="-160.5031"
+ cy="192.8199"
+ fx="-160.5031"
+ fy="192.8199"
+ r="11.384634"
+ gradientTransform="matrix(4.4078935,4.3997187e-7,-2.6986351e-7,2.7036492,546.97752,-322.19946)"
+ gradientUnits="userSpaceOnUse" />
+ <inkscape:perspective
+ id="perspective12277"
+ inkscape:persp3d-origin="14.502729 : 10.331991 : 1"
+ inkscape:vp_z="29.005459 : 15.497986 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 15.497986 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="aigrd1"
+ x1="14.9966"
+ x2="32.511002"
+ y1="11.1885"
+ y2="34.307499">
+ <stop
+ id="stop3034"
+ offset="0"
+ style="stop-color:#EBEBEB" />
+ <stop
+ id="stop3036"
+ offset="0.5"
+ style="stop-color:#FFFFFF" />
+ <stop
+ id="stop3038"
+ offset="1"
+ style="stop-color:#EBEBEB" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="aigrd2-2"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3043-1"
+ offset="0"
+ style="stop-color:#FBFBFB" />
+ <stop
+ id="stop3045-3"
+ offset="0.5"
+ style="stop-color:#B6B6B6" />
+ <stop
+ id="stop3047-3"
+ offset="1"
+ style="stop-color:#E4E4E4" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4236-95">
+ <stop
+ id="stop4238-3"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+ <stop
+ id="stop4240-2"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient23325">
+ <stop
+ id="stop23327"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+ <stop
+ id="stop23329"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3394-59"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3396-26"
+ offset="0.0000000"
+ style="stop-color:#fff307;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3398-7"
+ offset="0.50000000"
+ style="stop-color:#166eff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3400-5"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3406-6"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3408-3"
+ offset="0.0000000"
+ style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+ <stop
+ id="stop3410-1"
+ offset="1.0000000"
+ style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+ <stop
+ id="stop3412-7"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3421-9"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3423-5"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3427-2"
+ offset="1.0000000"
+ style="stop-color:#b8c04c;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3435-8"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3437-9"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3439-2"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient23354"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop23356"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop23358"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient23361"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop23363"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop23365"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <inkscape:perspective
+ id="perspective12483"
+ inkscape:persp3d-origin="10.999997 : 18.969167 : 1"
+ inkscape:vp_z="21.999994 : 28.453751 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 28.453751 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="aigrd2-64"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3043-7"
+ offset="0"
+ style="stop-color:#FBFBFB" />
+ <stop
+ id="stop3045-6"
+ offset="0.5"
+ style="stop-color:#B6B6B6" />
+ <stop
+ id="stop3047-4"
+ offset="1"
+ style="stop-color:#E4E4E4" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4236-2">
+ <stop
+ id="stop4238-37"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+ <stop
+ id="stop4240-00"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient23440">
+ <stop
+ id="stop23442"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+ <stop
+ id="stop23444"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3394-7"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3396-0"
+ offset="0.0000000"
+ style="stop-color:#fff307;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3398-66"
+ offset="0.50000000"
+ style="stop-color:#166eff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3400-38"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3406-1"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3408-34"
+ offset="0.0000000"
+ style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+ <stop
+ id="stop3410-14"
+ offset="1.0000000"
+ style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+ <stop
+ id="stop3412-8"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3421-6"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3423-8"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3427-7"
+ offset="1.0000000"
+ style="stop-color:#b8c04c;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3435-5"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop3437-1"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop3439-9"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient23473"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop23475"
+ offset="0"
+ style="stop-color:#FBFBFB" />
+ <stop
+ id="stop23477"
+ offset="0.5"
+ style="stop-color:#B6B6B6" />
+ <stop
+ id="stop23479"
+ offset="1"
+ style="stop-color:#E4E4E4" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient23482"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop23484"
+ offset="0.0000000"
+ style="stop-color:#fff307;stop-opacity:1.0000000;" />
+ <stop
+ id="stop23486"
+ offset="0.50000000"
+ style="stop-color:#166eff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop23488"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient23491"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop23493"
+ offset="0.0000000"
+ style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+ <stop
+ id="stop23495"
+ offset="1.0000000"
+ style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+ <stop
+ id="stop23497"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient23500"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop23502"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop23504"
+ offset="1.0000000"
+ style="stop-color:#b8c04c;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient23507"
+ x1="12.2744"
+ x2="35.391201"
+ y1="32.4165"
+ y2="14.2033">
+ <stop
+ id="stop23509"
+ offset="0.0000000"
+ style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+ <stop
+ id="stop23511"
+ offset="1.0000000"
+ style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient23522">
+ <stop
+ id="stop23524"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+ <stop
+ id="stop23526"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient23529">
+ <stop
+ id="stop23531"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+ <stop
+ id="stop23533"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5679"
+ id="linearGradient12741"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+ x1="21.436686"
+ y1="13.453218"
+ x2="21.436686"
+ y2="25.460827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5495"
+ id="linearGradient12743"
+ gradientUnits="userSpaceOnUse"
+ x1="24.061403"
+ y1="14.889434"
+ x2="25.633825"
+ y2="25.486128" />
+ <inkscape:perspective
+ id="perspective12757"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12181-5"
+ id="radialGradient12187-8"
+ cx="326.8168"
+ cy="85.207542"
+ fx="326.8168"
+ fy="85.207542"
+ r="1.63605"
+ gradientTransform="matrix(3.0221026,-0.84080995,1.7034055,6.1225092,-806.00011,-158.76002)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient12181-5">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop12183-3" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop12185-2" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5679"
+ id="linearGradient13007"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+ x1="21.436686"
+ y1="13.453218"
+ x2="21.436686"
+ y2="25.460827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5495"
+ id="linearGradient13009"
+ gradientUnits="userSpaceOnUse"
+ x1="24.061403"
+ y1="14.889434"
+ x2="25.633825"
+ y2="25.486128" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5679"
+ id="linearGradient13217"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+ x1="21.436686"
+ y1="13.453218"
+ x2="21.436686"
+ y2="25.460827" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5495"
+ id="linearGradient13219"
+ gradientUnits="userSpaceOnUse"
+ x1="24.061403"
+ y1="14.889434"
+ x2="25.633825"
+ y2="25.486128" />
+ <inkscape:perspective
+ id="perspective13291"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective13357"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective13357-6"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <filter
+ inkscape:collect="always"
+ id="filter8384">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.9447791"
+ id="feGaussianBlur8386" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter8402"
+ x="-0.10574768"
+ width="1.2114954"
+ y="-0.0970362"
+ height="1.1940724">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="8.8343373"
+ id="feGaussianBlur8404" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter17718">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.98945784"
+ id="feGaussianBlur17720" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter17771">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.623996"
+ id="feGaussianBlur17773" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter17787">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.2991968"
+ id="feGaussianBlur17789" />
+ </filter>
+ </defs>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="artwork:media-optical"
+ style="display:inline">
+ <g
+ id="layer6"
+ inkscape:groupmode="layer"
+ inkscape:label="baseplate"
+ style="display:none">
+ <rect
+ height="48"
+ id="rect6284"
+ inkscape:label="48x48"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ width="48"
+ x="296"
+ y="50" />
+ <rect
+ height="32"
+ id="rect6592"
+ inkscape:label="32x32"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ width="32"
+ x="303"
+ y="126" />
+ <rect
+ height="22"
+ id="rect6749"
+ inkscape:label="22x22"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ width="22"
+ x="303"
+ y="177" />
+ <rect
+ height="16"
+ id="rect6833"
+ inkscape:label="16x16"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ width="16"
+ x="303"
+ y="219" />
+ <rect
+ height="24"
+ id="rect8104"
+ inkscape:label="24x24"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ width="24"
+ x="302"
+ y="176" />
+ <rect
+ height="256"
+ id="rect6282"
+ inkscape:label="256x256"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ width="256"
+ x="16"
+ y="36"
+ inkscape:export-filename="/home/lapo/Scrivania/cd.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ id="context"
+ inkscape:label="context"
+ style="font-size:18.30070686px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:Bitstream Vera Sans"
+ x="20.970737"
+ xml:space="preserve"
+ y="21.513618"><tspan
+ id="tspan2716"
+ sodipodi:role="line"
+ x="20.970737"
+ y="21.513618">apps</tspan></text>
+ <text
+ id="icon-name"
+ inkscape:label="icon-name"
+ sodipodi:linespacing="125%"
+ style="font-size:18.30070686px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:Droid Sans;-inkscape-font-specification:Droid Sans Bold"
+ x="191.97073"
+ xml:space="preserve"
+ y="21.513618"><tspan
+ id="tspan3023"
+ sodipodi:role="line"
+ x="191.97073"
+ y="21.513618">gtk3-demo</tspan></text>
+ <path
+ style="opacity:0.4510002;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 16,36 0,256 18,0 220,0 18,0 0,-18 0,-238 -18,0 0,238 -220,0 0,-238 -18,0 z"
+ id="rect10603"
+ inkscape:connector-curvature="0" />
+ <rect
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/lapo/Scrivania/cd.png"
+ y="38.816284"
+ x="-538"
+ width="512"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:label="256x256"
+ id="rect17807"
+ height="512" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="hires">
+ <g
+ id="g17679"
+ transform="matrix(1.011355,0,0,1.011355,0.4017933,-4.910467)">
+ <path
+ style="opacity:0.53469388;fill:#000000;fill-opacity:1;stroke:none;display:inline;filter:url(#filter8402);enable-background:new"
+ d="m 40.5,90 5,119.5 72,68 115,-48 L 241,109 155.5,59 z"
+ id="path8388"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path7588"
+ d="m 40.5,89 5,119.5 72,68 115,-48 L 241,108 155.5,58 z"
+ style="opacity:0.53469388;fill:#000000;fill-opacity:1;stroke:none;display:inline;filter:url(#filter8384);enable-background:new" />
+ <g
+ transform="matrix(2.270162,0,0,2.270162,-4.2860217,19.388834)"
+ id="layer1-2"
+ style="display:inline;enable-background:new">
+ <path
+ inkscape:connector-curvature="0"
+ d="M 20.88413,30.82696 53.816977,55.527708 107.33282,39.060543 70.587303,17.177763 20.88413,30.82696 z"
+ id="path6976"
+ style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 22.94243,82.287118 -2.0583,-51.460158 32.932847,24.700748 0,55.577152 L 22.94243,82.287118 z"
+ id="path6978"
+ style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 53.816977,111.10486 49.399213,-20.58416 4.11663,-51.460157 -53.515843,16.467165 0,55.577152 z"
+ id="path6980"
+ style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ inkscape:connector-curvature="0"
+ d="M 23.216626,81.319479 70.48573,67.361442 103.38422,90.444516"
+ id="path6982"
+ style="fill:none;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 70.434539,17.875593 0,49.109284"
+ id="path6984"
+ style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ </g>
+ <g
+ transform="matrix(2.02271,0,0,2.02271,-569.19642,-43.00464)"
+ id="g17809">
+ <path
+ inkscape:connector-curvature="0"
+ id="path17811"
+ d="m 40.5,90 5,119.5 72,68 115,-48 L 241,109 155.5,59 z"
+ style="opacity:0.53469388;fill:#000000;fill-opacity:1;stroke:none;display:inline;filter:url(#filter8402);enable-background:new" />
+ <path
+ style="opacity:0.53469388;fill:#000000;fill-opacity:1;stroke:none;display:inline;filter:url(#filter8384);enable-background:new"
+ d="m 40.5,89 5,119.5 72,68 115,-48 L 241,108 155.5,58 z"
+ id="path17813"
+ inkscape:connector-curvature="0" />
+ <g
+ style="display:inline;enable-background:new"
+ id="g17815"
+ transform="matrix(2.270162,0,0,2.270162,-4.2860217,19.388834)">
+ <path
+ style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17817"
+ d="M 20.88413,30.82696 53.816977,55.527708 107.33282,39.060543 70.587303,17.177763 20.88413,30.82696 z"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17819"
+ d="m 22.94243,82.287118 -2.0583,-51.460158 32.932847,24.700748 0,55.577152 L 22.94243,82.287118 z"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17821"
+ d="m 53.816977,111.10486 49.399213,-20.58416 4.11663,-51.460157 -53.515843,16.467165 0,55.577152 z"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path17823"
+ d="M 23.216626,81.319479 70.48573,67.361442 103.38422,90.444516"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path17825"
+ d="m 70.434539,17.875593 0,49.109284"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="lowres">
+ <g
+ id="g17722">
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path17708"
+ d="m 300,59.999999 0.0625,22.437501 15.5,13.3125 23.5,-8.875 L 339,63.999999 322.75,53.937499 z"
+ style="opacity:0.47346939;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter17718)" />
+ <g
+ transform="matrix(0.45064623,0,0,0.45064623,290.98476,45.227875)"
+ id="layer1-2-2"
+ style="display:inline;enable-background:new">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ d="M 20.88413,30.82696 54.307319,56.487484 105.37145,40.041227 67.841387,18.256516 z"
+ id="path6976-8"
+ style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ d="M 21.177198,81.306434 20.88413,30.82696 l 33.487606,26.019146 0.03365,52.905504 z"
+ id="path6978-0"
+ style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ d="M 54.510426,109.71796 105.3737,89.932289 105.37145,39.845091 54.510426,56.250725 z"
+ id="path6980-8"
+ style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ d="M 23.216626,81.319479 67.249471,66.8711 103.38422,90.444516"
+ id="path6982-2"
+ style="fill:none;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 67.198295,17.973661 0,49.109284"
+ id="path6984-5"
+ style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ </g>
+ <g
+ id="g17731"
+ transform="matrix(0.6583064,0,0,0.6583064,108.76773,93.275532)">
+ <path
+ style="opacity:0.55510203999999996;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter17787)"
+ d="m 300,60.805598 0.0625,22.437501 15.5,13.3125 23.5,-8.875 L 339,64.805598 322.75,54.743098 z"
+ id="path17733"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <g
+ style="display:inline;enable-background:new"
+ id="g17735"
+ transform="matrix(0.45064623,0,0,0.45064623,290.98476,45.227875)">
+ <path
+ style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.22592115;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17737"
+ d="M 20.88413,30.82696 54.307319,56.487484 105.37145,40.041227 67.841387,18.256516 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.22592115;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17739"
+ d="M 21.177198,81.306434 20.88413,30.82696 l 33.487606,26.019146 0.03365,52.905504 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.22592115;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17741"
+ d="M 54.510426,109.71796 105.3737,89.932289 105.37145,39.845091 54.510426,56.250725 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:1.89881182;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path17743"
+ d="M 23.216626,81.319479 67.249471,66.8711 103.38422,90.444516"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.89881182;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path17745"
+ d="m 67.198295,17.973661 0,49.109284"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ transform="matrix(0.52497154,0,0,0.5249716,146.75519,148.48904)"
+ id="g17747">
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path17749"
+ d="m 300,60.336735 0.0625,22.437501 15.5,13.3125 23.5,-8.875 L 339,64.336735 322.75,54.274235 z"
+ style="opacity:0.61632649;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter17771)" />
+ <g
+ transform="matrix(0.45064623,0,0,0.45064623,290.98476,45.227875)"
+ id="g17751"
+ style="display:inline;enable-background:new">
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ d="M 20.88413,30.82696 54.307319,56.487484 105.37145,40.041227 67.841387,18.256516 z"
+ id="path17753"
+ style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.04525661;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ d="M 21.177198,81.306434 20.88413,30.82696 l 33.487606,26.019146 0.03365,52.905504 z"
+ id="path17755"
+ style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.04525661;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ d="M 54.510426,109.71796 105.3737,89.932289 105.37145,39.845091 54.510426,56.250725 z"
+ id="path17757"
+ style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.04525661;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ d="M 23.216626,81.319479 67.249471,66.8711 103.38422,90.444516"
+ id="path17759"
+ style="fill:none;stroke:#ffffff;stroke-width:2.3810811;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 67.198295,17.973661 0,49.109284"
+ id="path17761"
+ style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.3810811;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ </g>
+ <g
+ id="g17791"
+ transform="matrix(0.34145959,0,0,0.34145962,201.89299,201.3414)">
+ <path
+ style="opacity:0.61632649;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter17771)"
+ d="m 300,60.336735 0.0625,22.437501 15.5,13.3125 23.5,-8.875 L 339,64.336735 322.75,54.274235 z"
+ id="path17793"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <g
+ style="display:inline;enable-background:new"
+ id="g17795"
+ transform="matrix(0.45064623,0,0,0.45064623,290.98476,45.227875)">
+ <path
+ style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:6.21931458;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17797"
+ d="M 20.88413,30.82696 54.307319,56.487484 105.37145,40.041227 67.841387,18.256516 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:6.21931458;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17799"
+ d="M 21.177198,81.306434 20.88413,30.82696 l 33.487606,26.019146 0.03365,52.905504 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:6.21931458;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path17801"
+ d="M 54.510426,109.71796 105.3737,89.932289 105.37145,39.845091 54.510426,56.250725 z"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:3.66075492;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path17803"
+ d="M 23.216626,81.319479 67.249471,66.8711 103.38422,90.444516"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.66075492;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path17805"
+ d="m 67.198295,17.973661 0,49.109284"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="clipshadow"
+ style="display:none">
+ <rect
+ height="256"
+ id="rect6282-0"
+ inkscape:label="256x256"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ width="256"
+ x="16"
+ y="36"
+ inkscape:export-filename="/home/lapo/Scrivania/cd.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ </g>
+</svg>
diff --git a/gtk3/sample/gtk-demo/data/symbolic-source.svg b/gtk3/sample/gtk-demo/data/symbolic-source.svg
new file mode 100644
index 0000000..36fa0ff
--- /dev/null
+++ b/gtk3/sample/gtk-demo/data/symbolic-source.svg
@@ -0,0 +1,29 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='gtk3-demo-symbolic.svg' height='16.000015' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.5 r10040' version='1.1' w [...]
+ <metadata id='metadata90'>
+ <rdf:RDF>
+ <cc:Work rdf:about=''>
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+ <dc:title>Gnome Symbolic Icon Theme</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-12.5126' inkscape:cy='-0.73412416' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape: [...]
+ <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-182.99998px' originy='-251.99998px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+ </sodipodi:namedview>
+ <title id='title9167'>Gnome Symbolic Icon Theme</title>
+ <defs id='defs7386'>
+ <linearGradient id='linearGradient7212' osb:paint='solid'>
+ <stop id='stop7214' offset='0' style='stop-color:#000000;stop-opacity:1;'/>
+ </linearGradient>
+ </defs>
+ <g inkscape:groupmode='layer' id='layer9' inkscape:label='apps' style='display:inline' transform='translate(-424.00018,35)'>
+
+ <rect height='8.0000048' id='rect7866' style='opacity:0.3;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.39999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0.83205029,0.5547002,0,1,0,0)' width='7.2111053' x='510.78668' y='-314.33347'/>
+ <rect height='8.0000086' id='rect7868' style='opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.39999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(-0.86824295,0.49613928,0,1,0,0)' width='8.0622425' x='-505.61908' y='219.8575'/>
+ <path inkscape:connector-curvature='0' d='m 431.53145,-28 -5.875,-3.65625 6.8125,-3.34375 6.03125,3 z' id='path7870' sodipodi:nodetypes='ccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.39999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+ </g>
+</svg>
diff --git a/gtk3/sample/gtk-demo/demo.gresource.xml b/gtk3/sample/gtk-demo/demo.gresource.xml
index ca927ef..577f25f 100644
--- a/gtk3/sample/gtk-demo/demo.gresource.xml
+++ b/gtk3/sample/gtk-demo/demo.gresource.xml
@@ -2,11 +2,13 @@
<gresources>
<gresource prefix="/ui">
<file preprocess="xml-stripblanks">main.ui</file>
+ <file preprocess="xml-stripblanks">appmenu.ui</file>
</gresource>
- <gresource prefix="/application">
+ <!-- <gresource prefix="/application_demo">
+ <file>application.c</file>
<file>application.ui</file>
<file>menus.ui</file>
- </gresource>
+ </gresource>-->
<gresource prefix="/builder">
<file>demo.ui</file>
</gresource>
@@ -91,6 +93,13 @@
<gresource prefix="/stack">
<file>stack.ui</file>
</gresource>
+ <gresource prefix="/shortcuts">
+ <file>shortcuts.ui</file>
+ <file>shortcuts-builder.ui</file>
+ <file>shortcuts-gedit.ui</file>
+ <file>shortcuts-clocks.ui</file>
+ <file>shortcuts-boxes.ui</file>
+ </gresource>
<gresource prefix="/revealer">
<file>revealer.ui</file>
</gresource>
@@ -110,8 +119,8 @@
<file>gnu-keys.png</file>
</gresource>
<gresource prefix="/sources">
-<!-- <file>application.rb</file>
- <file>assistant.rb</file>
+<!-- <file>application_demo.rb</file>
+ <file>assistant.rb</file>
<file>builder.rb</file>
<file>button_box.rb</file>
<file>changedisplay.rb</file>
@@ -133,6 +142,7 @@
<file>expander.rb</file>
<file>filtermodel.rb</file>
<file>flowbox.rb</file>
+ <file>foreigndrawing.rb</file>
<file>font_features.rb</file>
<file>gestures.rb</file>
<file>glarea.rb</file>
@@ -163,6 +173,7 @@
<file>scale.rb</file>
<file>search_entry.rb</file>
<file>search_entry2.rb</file>
+ <file>shortcuts.rb</file>
<file>sizegroup.rb</file>
<file>sidebar.rb</file>
<file>stack.rb</file>
@@ -191,7 +202,7 @@
<file>glarea-fragment.glsl</file>
<file>glarea-vertex.glsl</file>
</gresource>
- <gresource prefix="/font-features">
+ <gresource prefix="/font_features">
<file>font-features.ui</file>
</gresource>
<gresource prefix="/spinbutton">
diff --git a/gtk3/sample/gtk-demo/demo.ui b/gtk3/sample/gtk-demo/demo.ui
index f14eb2e..bbed319 100644
--- a/gtk3/sample/gtk-demo/demo.ui
+++ b/gtk3/sample/gtk-demo/demo.ui
@@ -78,6 +78,7 @@
<property name="visible">1</property>
<property name="label" translatable="yes">Save _As</property>
<property name="use-underline">1</property>
+ <accelerator key="s" modifiers="primary | shift-mask" signal="activate"/>
</object>
</child>
<child>
diff --git a/gtk3/sample/gtk-demo/font_features.rb b/gtk3/sample/gtk-demo/font_features.rb
index e37741a..2d5a70d 100644
--- a/gtk3/sample/gtk-demo/font_features.rb
+++ b/gtk3/sample/gtk-demo/font_features.rb
@@ -10,7 +10,7 @@
=end
module FontFeaturesDemo
def self.run_demo(main_window)
- builder = Gtk::Builder.new(:resource => "/font-features/font-features.ui")
+ builder = Gtk::Builder.new(:resource => "/font_features/font-features.ui")
window = builder["window"]
label = builder["label"]
settings = builder["settings"]
diff --git a/gtk3/sample/gtk-demo/main.rb b/gtk3/sample/gtk-demo/main.rb
index 2981eac..b257356 100755
--- a/gtk3/sample/gtk-demo/main.rb
+++ b/gtk3/sample/gtk-demo/main.rb
@@ -438,7 +438,7 @@ class Demo < Gtk::Application
def fontify(start_iter = @source_buffer.start_iter,
end_iter = @source_buffer.end_iter)
str = @source_buffer.get_text(start_iter, end_iter, true)
- tokenizer = RubyTokonizer.new
+ tokenizer = RubyTokenizer.new
tokenizer.tokenize(str, start_iter.offset) do |tag, start, last|
@source_buffer.apply_tag(tag.to_s,
@source_buffer.get_iter_at(:offset => start),
@@ -446,7 +446,7 @@ class Demo < Gtk::Application
end
end
- class RubyTokonizer
+ class RubyTokenizer
RESERVED_WORDS = %w(begin end module class def if then else
while unless do case when require yield)
RESERVED_WORDS_PATTERN = Regexp.compile(/(^|\s+)(#{RESERVED_WORDS.collect do |pat| Regexp.quote(pat) end.join("|")})(\s+|$)/)
diff --git a/gtk3/sample/gtk-demo/main.ui b/gtk3/sample/gtk-demo/main.ui
index 03493d7..f284a1a 100644
--- a/gtk3/sample/gtk-demo/main.ui
+++ b/gtk3/sample/gtk-demo/main.ui
@@ -1,31 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.10 -->
- <menu id="appmenu">
- <section>
- <item>
- <attribute name="label" translatable="yes">About</attribute>
- <attribute name="action">app.about</attribute>
- </item>
- </section>
- <section>
- <item>
- <attribute name="label" translatable="yes">_Quit</attribute>
- <attribute name="action">app.quit</attribute>
- <attribute name="accel"><Primary>q</attribute>
- </item>
- </section>
- </menu>
<object class="GtkTreeStore" id="treestore">
<columns>
- <!-- column-name NAME
- <column type="gchararray"/> -->
<!-- column-name TITLE -->
<column type="gchararray"/>
<!-- column-name FILENAME -->
<column type="gchararray"/>
- <!-- column-name FUNC
- <column type="gpointer"/> -->
<!-- column-name STYLE -->
<column type="gint"/>
</columns>
@@ -41,7 +22,7 @@
<property name="visible">1</property>
<property name="show-close-button">1</property>
<child>
- <object class="GtkButton" id="run_button">
+ <object class="GtkButton">
<property name="visible">1</property>
<property name="valign">center</property>
<property name="can_focus">1</property>
@@ -50,7 +31,7 @@
<class name="text-button"/>
</style>
<child>
- <object class="GtkLabel" id="run_label">
+ <object class="GtkLabel">
<property name="visible">1</property>
<property name="label" translatable="yes">Run</property>
</object>
@@ -60,21 +41,18 @@
</object>
</child>
<child>
- <object class="GtkBox" id="box1">
+ <object class="GtkBox">
<property name="visible">1</property>
<child>
<object class="GtkFrame">
<property name="visible">1</property>
<child>
- <object class="GtkScrolledWindow" id="scrolledwindow">
+ <object class="GtkScrolledWindow">
<property name="width_request">120</property>
<property name="visible">1</property>
<property name="can_focus">1</property>
<property name="hscrollbar_policy">never</property>
<property name="min_content_width">150</property>
- <style>
- <class name="sidebar"/>
- </style>
<child>
<object class="GtkTreeView" id="treeview">
<property name="visible">1</property>
@@ -87,15 +65,19 @@
</object>
</child>
<child>
- <object class="GtkTreeViewColumn" id="treeviewcolumn0">
- <property name="title" translatable="yes">column</property>
+ <object class="GtkTreeViewColumn">
<child>
- <object class="GtkCellRendererText" id="cellrenderertext0"/>
+ <object class="GtkCellRendererText"/>
<attributes>
<attribute name="style">2</attribute>
<attribute name="text">0</attribute>
</attributes>
</child>
+ <child>
+ <object class="GtkCellRendererText">
+ <property name="text"> </property>
+ </object>
+ </child>
</object>
</child>
</object>
@@ -112,7 +94,7 @@
<property name="enable_popup">1</property>
<property name="show_border">0</property>
<child>
- <object class="GtkScrolledWindow" id="info-scrolledwindow">
+ <object class="GtkScrolledWindow">
<property name="visible">1</property>
<property name="can_focus">1</property>
<child>
@@ -121,8 +103,8 @@
<property name="can_focus">1</property>
<property name="left-margin">20</property>
<property name="right-margin">20</property>
- <!-- TODO <property name="top-margin">20</property>
- <property name="bottom-margin">20</property>-->
+ <property name="top-margin">20</property>
+ <property name="bottom-margin">20</property>
<property name="pixels_above_lines">2</property>
<property name="pixels_below_lines">2</property>
<property name="editable">0</property>
@@ -136,7 +118,7 @@
</packing>
</child>
<child type="tab">
- <object class="GtkLabel" id="label1">
+ <object class="GtkLabel">
<property name="visible">1</property>
<property name="label" translatable="yes">_Info</property>
<property name="use_underline">1</property>
@@ -156,8 +138,8 @@
<property name="can_focus">1</property>
<property name="left-margin">20</property>
<property name="right-margin">20</property>
- <!-- TODO <property name="top-margin">20</property>
- <property name="bottom-margin">20</property> -->
+ <property name="top-margin">20</property>
+ <property name="bottom-margin">20</property>
<property name="editable">0</property>
<property name="cursor_visible">0</property>
</object>
@@ -169,7 +151,7 @@
</packing>
</child>
<child type="tab">
- <object class="GtkLabel" id="label2">
+ <object class="GtkLabel">
<property name="visible">1</property>
<property name="label" translatable="yes">Source</property>
</object>
diff --git a/gtk3/sample/gtk-demo/markup.rb b/gtk3/sample/gtk-demo/markup.rb
index 643826e..2c33e15 100644
--- a/gtk3/sample/gtk-demo/markup.rb
+++ b/gtk3/sample/gtk-demo/markup.rb
@@ -17,25 +17,70 @@ module MarkupDemo
window.screen = main_window.screen
window.set_default_size(450, 450)
- window.set_title("Markup")
+ stack = Gtk::Stack.new
+ stack.show
+ window.add(stack)
+
+ show_source = Gtk::CheckButton.new("Source")
+ show_source.valign = :center
+
+ header = Gtk::HeaderBar.new
+ header.pack_start(show_source)
+ header.show_close_button = true
+ header.show_all
+ window.titlebar = header
+
+ window.title = "Markup"
view = Gtk::TextView.new
- view.set_wrap_mode(:word)
- view.set_left_margin(10)
- view.set_right_margin(10)
+ view.wrap_mode = :word
+ view.left_margin = 10
+ view.right_margin = 10
sw = Gtk::ScrolledWindow.new(nil, nil)
- sw.set_policy(:never, :automatic)
+ sw.set_policy(:automatic, :automatic)
- window.add(sw)
sw.add(view)
+ sw.show_all
+
+ stack.add_named(sw, "formatted")
+
+ view2 = Gtk::TextView.new
+ view2.wrap_mode = :word
+ view2.left_margin = 10
+ view2.right_margin = 10
+
+ sw = Gtk::ScrolledWindow.new(nil, nil)
+ sw.set_policy(:automatic, :automatic)
+
+ sw.add(view2)
+ sw.show_all
+
+ stack.add_named(sw, "source")
markup = Gio::Resources.lookup_data("/markup/markup.txt", 0)
-
+
+ show_source.signal_connect "toggled" do |button|
+ if button.active?
+ stack.visible_child_name = "source"
+ else
+ buffer = view2.buffer
+ markup = buffer.get_text(buffer.start_iter,
+ buffer.end_iter,
+ false)
+ buffer = view.buffer
+ buffer.insert_markup(buffer.start_iter, markup, -1)
+ stack.visible_child_name = "formatted"
+ end
+ end
+
buffer = view.buffer
buffer.insert_markup(buffer.start_iter, markup, -1)
- sw.show_all
+ buffer = view2.buffer
+ buffer.insert(buffer.start_iter, markup)
+
+ stack.show
if !window.visible?
window.show_all
diff --git a/gtk3/sample/gtk-demo/markup.txt b/gtk3/sample/gtk-demo/markup.txt
index feece2c..92da324 100644
--- a/gtk3/sample/gtk-demo/markup.txt
+++ b/gtk3/sample/gtk-demo/markup.txt
@@ -1,9 +1,9 @@
Text sizes: <span size="xx-small">tiny</span> <span size="x-small">very small</span> <span size="small">small</span> <span size="medium">normal</span> <span size="large">large</span> <span size="x-large">very large</span> <span size="xx-large">huge</span>
-Text <span color="gray">c<span color="green">o</span>l<span color="tomato">o</span>rs</span>
+Text <span color="gray">c<span color="green">o</span>l<span color="tomato">o</span>rs</span> and <span background="pink">backgrounds</span>
-Colorful <span underline="low" underline-color="blue"><span underline="double" underline-color="red">under</span>lines</span>
+Colorful <span underline="low" underline-color="blue"><span underline="double" underline-color="red">under</span>lines</span> and <span background="pink"><span underline="error">mo</span><span underline="error" underline-color="green">re</span></span>
Colorful <span strikethrough="true" strikethrough-color="magenta">strikethroughs</span>
diff --git a/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml b/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml
index 33e12aa..93be088 100644
--- a/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml
+++ b/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml
@@ -12,6 +12,15 @@
<key name='color' enum='org.gtk.Demo.Color'>
<default>'red'</default>
</key>
+ <key name='window-size' type='(ii)'>
+ <default>(-1, -1)</default>
+ </key>
+ <key name='maximized' type='b'>
+ <default>false</default>
+ </key>
+ <key name='fullscreen' type='b'>
+ <default>false</default>
+ </key>
</schema>
</schemalist>
diff --git a/gtk3/sample/gtk-demo/pixbufs.rb b/gtk3/sample/gtk-demo/pixbufs.rb
index 6cb386a..2428953 100644
--- a/gtk3/sample/gtk-demo/pixbufs.rb
+++ b/gtk3/sample/gtk-demo/pixbufs.rb
@@ -1,167 +1,127 @@
-# Copyright (c) 2003-2014 Ruby-GNOME2 Project Team
+# Copyright (c) 2016 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
-# $Id: pixbufs.rb,v 1.5 2005/02/12 23:02:43 kzys Exp $
=begin
-= Pixbufs
+= Pixbufs
-A Gdk::Pixbuf represents an image, normally in RGB or RGBA format.
-Pixbufs are normally used to load files from disk and perform
-image scaling.
+ A GdkPixbuf represents an image, normally in RGB or RGBA format.
+ Pixbufs are normally used to load files from disk and perform
+ image scaling.
-This demo is not all that educational, but looks cool. It was written
-by Extreme Pixbuf Hacker Federico Mena Quintero. It also shows
-off how to use Gtk::DrawingArea to do a simple animation.
+ This demo is not all that educational, but looks cool. It was written
+ by Extreme Pixbuf Hacker Federico Mena Quintero. It also shows
+ off how to use GtkDrawingArea to do a simple animation.
-Look at the Image demo for additional pixbuf usage examples.
+ Look at the Image demo for additional pixbuf usage examples.
=end
-
-require "common"
-
-module Demo
- class Pixbufs < BasicWindow
- FRAME_DELAY = 50
-
- BACKGROUND_NAME = "background.jpg"
-
- IMAGE_NAMES = [
- "apple-red.png",
- "gnome-applets.png",
- "gnome-calendar.png",
- "gnome-foot.png",
- "gnome-gmush.png",
- "gnome-gimp.png",
- "gnome-gsame.png",
- "gnu-keys.png",
- "ruby-gnome2-logo.png",
- ]
-
- CYCLE_LEN = 60
- def initialize
- super("Pixbufs")
- set_resizable(false)
-
- @background = nil
- @frame = nil
- @frame_num = 0
- @images = []
-
- begin
- load_pixbufs
-
- set_size_request(@background.width, @background.height)
-
- @frame = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB,
- false, 8,
- @background.width, @background.height)
-
- @da = Gtk::DrawingArea.new
-
- @da.signal_connect("draw") do |w, e|
- draw_cb(w, e)
- end
-
- add(@da)
-
- timeout_id = GLib::Timeout.add(FRAME_DELAY) do
- timeout
- end
- signal_connect("destroy") do
- GLib::Source.remove(timeout_id)
- end
- rescue
- message = "Failed to load an image: #{$!.message}"
- dialog = Gtk::MessageDialog.new(:parent => self,
- :flags => :destroy_with_parent,
- :type => :error,
- :buttons_type => :close,
- :message => message)
-
- dialog.signal_connect("response") do
- dialog.destroy
- end
-
- dialog.show
- end
+module PixbufsDemo
+ IMAGES_NAMES = %w(/pixbufs/apple-red.png /pixbufs/gnome-applets.png
+ /pixbufs/gnome-calendar.png /pixbufs/gnome-foot.png
+ /pixbufs/gnome-gmush.png /pixbufs/gnome-gimp.png
+ /pixbufs/gnome-gsame.png /pixbufs/gnu-keys.png)
+ N_IMAGES = IMAGES_NAMES.size
+ BACKGROUND_NAME = "/pixbufs/background.jpg"
+ CYCLE_TIME = 3_000_000
+
+ def self.run_demo(main_window)
+ window = Gtk::Window.new(:toplevel)
+ window.screen = main_window.screen
+ window.resizable = false
+
+ background_pixbuf = load_pixbuf(window, BACKGROUND_NAME)
+ other_pixbufs = []
+ IMAGES_NAMES.each do |img|
+ other_pixbufs << load_pixbuf(window, img)
end
- def load_pixbufs
- # Loads the images for the demo
+ width = background_pixbuf.width
+ height = background_pixbuf.height
+ window.set_size_request(width, height)
- if @background
- return # already loaded earlier
- end
+ frame = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+ :has_alpha => false,
+ :bits_per_sample => 8,
+ :width => width, :height => height)
- # demo_find_file() looks in the the current directory first,
- # so you can run gtk-demo without installing GTK, then looks
- # in the location where the file is installed.
- #
- filename = Demo.find_file(BACKGROUND_NAME)
- @background = Gdk::Pixbuf.new(filename)
+ da = Gtk::DrawingArea.new
+ da.signal_connect "draw" do |_widget, cr|
+ cr.set_source_pixbuf(frame, 0, 0)
+ cr.paint
+ true
+ end
+ window.add(da)
+ start_time = 0
+ da.add_tick_callback do |_widget, frame_clock|
+ background_pixbuf.copy_area(0, 0, width, height, frame, 0, 0)
+ start_time = frame_clock.frame_time if start_time == 0
+ current_time = frame_clock.frame_time
+ f = ((current_time - start_time) % CYCLE_TIME) / Float(CYCLE_TIME)
+ xmid = width / 2
+ ymid = height / 2
+ radius = [xmid, ymid].min / 2
+ N_IMAGES.times do |i|
+ ang = 2 * Math::PI * i / N_IMAGES - f * 2 * Math::PI
+ iw = other_pixbufs[i].width
+ ih = other_pixbufs[i].height
+
+ r = radius + (radius / 3) * Math.sin(f * 2 * Math::PI)
+
+ xpos = (xmid + r * Math.cos(ang) - iw / 2 + 0.5).floor
+ ypos = (ymid + r * Math.sin(ang) - ih / 2 + 0.5).floor
+ k = (i & 1) ? Math.sin(f * 2 * Math::PI) : Math.cos(f * 2 * Math::PI)
+ k = 2.0 * k * k
+ k = [0.25, k].max
+
+ r1 = Gdk::Rectangle.new(xpos, ypos, iw * k, iw * k)
+ r2 = Gdk::Rectangle.new(0, 0, width, height)
- IMAGE_NAMES.each_with_index do |basename, i|
- filename = Demo.find_file(basename)
+ dest = r1.intersect(r2)
+ next unless dest
+ frame.composite!(other_pixbufs[i], dest.x, dest.y, dest.width,
+ dest.height, xpos, ypos, k, k,
+ :nearest,
+ if (i & 1) == 1
+ [
+ 127, (255 * Math.sin(f * 2.0 * Math::PI)).abs
+ ].max
+ else
+ [
+ 127, (255 * Math.cos(f * 2.0 * Math::PI)).abs
+ ].max
+ end)
- @images[i] = Gdk::Pixbuf.new(filename)
end
+ da.queue_draw
+ GLib::Source::CONTINUE
end
- def draw_cb(widget, cairo_context)
- cairo_context.set_source_pixbuf(@frame)
- cairo_context.paint
- true
+ if !window.visible?
+ window.show_all
+ else
+ window.destroy
end
+ window
+ end
- # Timeout handler to regenerate the frame
- def timeout
- @background.copy_area(0, 0, @background.width, @background.height,
- @frame, 0, 0)
-
- f = Float(@frame_num % CYCLE_LEN) / CYCLE_LEN;
-
- xmid = @background.width / 2.0
- ymid = @background.height / 2.0
-
- radius = [xmid, ymid].min / 2.0
-
- @images.each_with_index do |image, i|
- ang = 2.0 * Math::PI * Float(i) / IMAGE_NAMES.length - f * 2.0 * Math::PI
-
- r = radius + (radius / 3.0) * Math.sin(f * 2.0 * Math::PI)
-
- xpos = (xmid + r * Math.cos(ang) - image.width / 2.0 + 0.5).floor
- ypos = (ymid + r * Math.sin(ang) - image.height / 2.0 + 0.5).floor
-
- k = if (i & 1) == 1
- Math.sin(f * 2.0 * Math::PI)
- else
- Math.cos(f * 2.0 * Math::PI)
- end
- k = [0.25, 2.0 * k * k].max
-
- r1 = Gdk::Rectangle.new(xpos, ypos, image.width * k, image.height * k)
- r2 = Gdk::Rectangle.new(0, 0, @background.width, @background.height)
+ def self.show_message_dialog_on(window, error)
+ message = "Failed to load an image: #{error.message}"
+ dialog = Gtk::MessageDialog.new(:parent => window,
+ :flags => :destroy_with_parent,
+ :type => :error,
+ :buttons => :close,
+ :message => message)
+ dialog.signal_connect("response", &:destroy)
+ dialog.show
+ end
- dest = r1.intersect(r2)
- if dest
- @frame.composite!(image, dest.x, dest.y, dest.width, dest.height,
- xpos, ypos, k, k, Gdk::Pixbuf::INTERP_NEAREST,
- if (i & 1) == 1
- [
- 127,
- (255 * Math.sin(f * 2.0 * Math::PI)).abs,
- ].max
- else
- [
- 127,
- (255 * Math.cos(f * 2.0 * Math::PI)).abs,
- ].max
- end)
- end
- end
- @da.queue_draw
- @frame_num += 1
- true
+ def self.load_pixbuf(window, image_name)
+ begin
+ # Is it OK? should we implement gdk_pixbuf_new_from_resource instead?
+ #Gtk::Image.new(:resource => image_name).pixbuf
+ GdkPixbuf::Pixbuf.new(:resource => image_name)
+ rescue StandardError => e
+ show_message_dialog_on(window, e)
+ window.destroy
end
end
end
diff --git a/gtk3/sample/gtk-demo/reset.css b/gtk3/sample/gtk-demo/reset.css
index 1c27a8e..7af3e7f 100644
--- a/gtk3/sample/gtk-demo/reset.css
+++ b/gtk3/sample/gtk-demo/reset.css
@@ -7,62 +7,5 @@
*/
* {
- color: inherit;
- font-size: inherit;
- background-color: initial;
- font-family: inherit;
- font-style: inherit;
- font-variant: inherit;
- font-weight: inherit;
- text-shadow: inherit;
- icon-shadow: inherit;
- box-shadow: initial;
- margin-top: initial;
- margin-left: initial;
- margin-bottom: initial;
- margin-right: initial;
- padding-top: initial;
- padding-left: initial;
- padding-bottom: initial;
- padding-right: initial;
- border-top-style: initial;
- border-top-width: initial;
- border-left-style: initial;
- border-left-width: initial;
- border-bottom-style: initial;
- border-bottom-width: initial;
- border-right-style: initial;
- border-right-width: initial;
- border-top-left-radius: initial;
- border-top-right-radius: initial;
- border-bottom-right-radius: initial;
- border-bottom-left-radius: initial;
- outline-style: initial;
- outline-width: initial;
- outline-offset: initial;
- background-clip: initial;
- background-origin: initial;
- background-size: initial;
- background-position: initial;
- border-top-color: initial;
- border-right-color: initial;
- border-bottom-color: initial;
- border-left-color: initial;
- outline-color: initial;
- background-repeat: initial;
- background-image: initial;
- border-image-source: initial;
- border-image-repeat: initial;
- border-image-slice: initial;
- border-image-width: initial;
- transition-property: initial;
- transition-duration: initial;
- transition-timing-function: initial;
- transition-delay: initial;
- engine: initial;
- gtk-key-bindings: initial;
-
- -GtkWidget-focus-line-width: 0;
- -GtkWidget-focus-padding: 0;
- -GtkNotebook-initial-gap: 0;
+ all: unset;
}
diff --git a/gtk3/sample/gtk-demo/rotated_text.rb b/gtk3/sample/gtk-demo/rotated_text.rb
index 01b2d23..83e6099 100644
--- a/gtk3/sample/gtk-demo/rotated_text.rb
+++ b/gtk3/sample/gtk-demo/rotated_text.rb
@@ -1,72 +1,136 @@
-# Copyright (c) 2005-2014 Ruby-GNOME2 Project Team
+# Copyright (c) 2016 Ruby-GNOME2 Project Team
# This program is licenced under the same licence as Ruby-GNOME2.
#
-# $Id: rotated_text.rb,v 1.2 2005/03/05 15:01:16 mutoh Exp $
=begin
-= Rotated Text
+= Pango/Rotated Text
-This demo shows how to use Cairo and Pango to draw rotated and transformed text.
+ This demo shows how to use PangoCairo to draw rotated and transformed
+ text. The right pane shows a rotated GtkLabel widget.
+
+ In both cases, a custom PangoCairo shape renderer is installed to draw
+ a red heard using cairo drawing operations instead of the Unicode heart
+ character.
=end
-require "common"
-
-module Demo
- class RotatedText < BasicWindow
- RADIUS = 150
- N_WORDS = 10
- FONT = "Sans Bold 27"
-
- def initialize
- super("Rotated Text")
-
- drawing_area = Gtk::DrawingArea.new
- add(drawing_area)
- drawing_area.override_background_color(:normal, Gdk::RGBA.new(1.0,
- 1.0,
- 1.0,
- 0.0))
-
- drawing_area.signal_connect("draw") do |_drawing_area, cairo_context|
- cairo_context.set_source_rgb(1.0, 1.0, 1.0)
- cairo_context.paint
- cairo_context.save do
- width, height = size
- cairo_context.scale(width.to_f / (RADIUS * 2),
- height.to_f / (RADIUS * 2))
- draw_text(cairo_context)
- end
- end
- end
+module RotatedTextDemo
+ HEART = "♥"
+ RADIUS = 150
+ N_WORDS = 5
+ FONT = "Serif 18"
+ TEXT = "I ♥ GTK+"
- private
- def draw_text(cairo_context)
- # Center coordinates on the middle of the region we are drawing
- cairo_context.translate(RADIUS, RADIUS)
+ def self.run_demo(main_window)
+ window = Gtk::Window.new(:toplevel)
+ window.screen = main_window.screen
+ window.title = "Rotated Text"
+ window.set_default_size(4 * RADIUS, 2 * RADIUS)
- # Create a PangoLayout, set the font and text
- layout = cairo_context.create_pango_layout
+ box = Gtk::Box.new(:horizontal, 0)
+ box.homogeneous = true
+ window.add(box)
- layout.text = "Text"
- layout.font_description = Pango::FontDescription.new(FONT)
+ # Add adrawing area
+ drawing_area = Gtk::DrawingArea.new
+ box.add(drawing_area)
+ drawing_area.style_context.add_class("view")
- # Draw the layout N_WORDS times in a circle
- N_WORDS.times do |i|
- angle = (360.0 * i) / N_WORDS
+ drawing_area.signal_connect "draw" do |widget, cr|
+ # Create a cairo context and set up a transformation matrix so that the
+ # user space coordinates for the centered square where we draw are
+ # [-RADIUS, RADIUS], [-RADIUS, RADIUS].
+ # We first center, then change the scale.
+ width = widget.allocated_width
+ height = widget.allocated_width
+ device_radius = [width, height].min / 2
+ cr.translate(device_radius + (width - 2 * device_radius) / 2,
+ device_radius + (height - 2 * device_radius) / 2)
+ cr.scale(device_radius / RADIUS, device_radius / RADIUS)
+
+ # Create a subtle gradient source and use it
+ pattern = Cairo::LinearPattern.new(-RADIUS, -RADIUS, RADIUS, RADIUS)
+ pattern.add_color_stop_rgb(0, 0.5, 0, 0)
+ pattern.add_color_stop_rgb(1, 0, 0, 0.5)
+ cr.set_source(pattern)
- cairo_context.save do
- # Gradient from red at angle == 60 to blue at angle == 240
- red = (1 + Math.cos((angle - 60) * Math::PI / 180.0)) / 2
- cairo_context.set_source_rgb(red, 0.0, 1.0 - red)
+ # Create a PangoContext and set up our shape renderer
+ context = widget.create_pango_context
+ context.set_shape_renderer do |cairo, attr, do_path|
+ fancy_shape_renderer(cairo, attr, do_path)
+ end
- cairo_context.rotate(angle * Math::PI / 180.0)
+ # Create a PangoLayout, set the text, font and attributes
+ layout = Pango::Layout.new(context)
+ layout.text = TEXT
+ desc = Pango::FontDescription.new(FONT)
+ layout.font_description = desc
- # Inform Pango to re-layout the text with the new transformation
- cairo_context.update_pango_layout(layout)
+ attrs = create_fancy_attr_list_for_layout(layout)
+ layout.attributes = attrs
- width, height = layout.size
- cairo_context.move_to(-(width / Pango::SCALE) / 2, -RADIUS)
- cairo_context.show_pango_layout(layout)
- end
+ # Draw the layout N_WORDS times in a circle
+ N_WORDS.times do
+ # inform Pango to re-layout the text with the new transformation matrix
+ cr.update_pango_layout(layout)
+ w, = layout.pixel_size
+ cr.move_to(- w / 2, - RADIUS * 0.9)
+ cr.show_pango_layout(layout)
+ cr.rotate(Math::PI * 2 / N_WORDS)
end
+
+ false
+ end
+
+ # And a label
+ label = Gtk::Label.new(TEXT)
+ box.add(label)
+ label.angle = 45
+
+ # Set up fancy stuff on the label
+ layout = label.layout
+ layout.context.set_shape_renderer do |cr, attr, do_path|
+ fancy_shape_renderer(cr, attr, do_path)
end
+
+ layout.attributes = create_fancy_attr_list_for_layout(layout)
+
+ if !window.visible?
+ window.show_all
+ else
+ window.destroy
+ end
+ window
+ end
+
+ def self.fancy_shape_renderer(cr, attr, do_path)
+ x, y = cr.current_point
+ cr.translate(x, y)
+ cr.scale(attr.ink_rect.width / Pango::SCALE,
+ attr.ink_rect.height / Pango::SCALE)
+
+ if attr.data == HEART
+ cr.move_to(0.5, 0)
+ cr.line_to(0.9, -0.4)
+ cr.curve_to(1.1, -0.8, 0.5, -0.9, 0.5, -0.5)
+ cr.curve_to(0.5, -0.9, -0.1, -0.8, 0.1, -0.4)
+ cr.close_path
+ end
+
+ unless do_path
+ cr.set_source_rgb(1, 0, 0)
+ cr.fill
+ end
+ end
+
+ def self.create_fancy_attr_list_for_layout(layout)
+ metrics = layout.context.get_metrics(layout.font_description)
+ ascent = metrics.ascent
+ logical_rect = Pango::Rectangle.new(0, -ascent, ascent, ascent)
+ ink_rect = logical_rect.dup
+
+ attrs = Pango::AttrList.new
+ attr = Pango::AttrShape.new(ink_rect, logical_rect, HEART)
+ attr.start_index = TEXT[0, TEXT.index(HEART)].bytesize
+ attr.end_index = attr.start_index + HEART.bytesize
+ attrs.insert(attr)
+ attrs
end
end
diff --git a/gtk3/sample/gtk-demo/shortcuts-boxes.ui b/gtk3/sample/gtk-demo/shortcuts-boxes.ui
new file mode 100644
index 0000000..6bcaf8a
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts-boxes.ui
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.17 -->
+
+ <object class="GtkShortcutsWindow" id="shortcuts-boxes">
+ <property name="modal">1</property>
+
+ <child>
+ <object class="GtkShortcutsSection">
+ <property name="visible">1</property>
+ <property name="section-name">shortcuts</property>
+ <property name="max-height">12</property>
+
+ <!-- Overview shortcuts -->
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Overview</property>
+ <property name="view">overview</property>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">F1</property>
+ <property name="title" translatable="yes">Help</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><Ctrl>n</property>
+ <property name="title" translatable="yes">Create a new box</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><Ctrl>f</property>
+ <property name="title" translatable="yes">Search</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><Ctrl>k</property>
+ <property name="title" translatable="yes">Keyboard shortcuts</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><Ctrl>q</property>
+ <property name="title" translatable="yes">Close Window/Quit Boxes</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <!-- Wizard and Properties shortcuts -->
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Box Creation and Properties</property>
+ <property name="view">wizard</property>
+
+ <!-- LTR -->
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="direction">ltr</property>
+ <property name="accelerator"><Alt>Right</property>
+ <property name="title" translatable="yes">Switch to the next page</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="direction">ltr</property>
+ <property name="accelerator"><Alt>Left</property>
+ <property name="title" translatable="yes">Switch to the previous page</property>
+ </object>
+ </child>
+
+ <!-- RTL -->
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="direction">rtl</property>
+ <property name="accelerator"><Alt>Left</property>
+ <property name="title" translatable="yes">Switch to the next page</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="direction">rtl</property>
+ <property name="accelerator"><Alt>Right</property>
+ <property name="title" translatable="yes">Switch to the previous page</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <!-- Display shortcuts -->
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Box Display</property>
+ <property name="view">display</property>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">Control_L+Alt_L</property>
+ <property name="title" translatable="yes">Grab/Ungrab keyboard</property>
+ </object>
+ </child>
+
+ <!-- LTR -->
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="direction">ltr</property>
+ <property name="accelerator"><Alt>Left</property>
+ <property name="title" translatable="yes">Back to overview</property>
+ </object>
+ </child>
+
+ <!-- RTL -->
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="direction">rtl</property>
+ <property name="accelerator"><Alt>Right</property>
+ <property name="title" translatable="yes">Back to overview</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><Ctrl>q</property>
+ <property name="title" translatable="yes">Close window/Quit Boxes</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">F11</property>
+ <property name="title" translatable="yes">Fullscreen/Restore from fullscreen</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+
+</interface>
diff --git a/gtk3/sample/gtk-demo/shortcuts-builder.ui b/gtk3/sample/gtk-demo/shortcuts-builder.ui
new file mode 100644
index 0000000..20ed760
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts-builder.ui
@@ -0,0 +1,547 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.17 -->
+
+ <object class="GtkShortcutsWindow" id="shortcuts-builder">
+ <property name="modal">1</property>
+ <child>
+ <object class="GtkShortcutsSection">
+ <property name="visible">1</property>
+ <property name="section-name">editor</property>
+ <property name="title" translatable="yes">Editor Shortcuts</property>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">General</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Global Search</property>
+ <property name="accelerator"><ctrl>period</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Preferences</property>
+ <property name="accelerator"><ctrl>comma</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Command Bar</property>
+ <property name="accelerator"><ctrl>Return</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Terminal</property>
+ <property name="accelerator"><ctrl><shift>t</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Keyboard Shortcuts</property>
+ <property name="accelerator"><ctrl><shift>question</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Panels</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Toggle left panel</property>
+ <property name="accelerator">F9</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Toggle right panel</property>
+ <property name="accelerator"><shift>F9</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Toggle bottom panel</property>
+ <property name="accelerator"><ctrl>F9</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Touchpad gestures</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-two-finger-swipe-right</property>
+ <property name="title" translatable="yes">Switch to the next document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-two-finger-swipe-left</property>
+ <property name="title" translatable="yes">Switch to the previous document</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Files</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>n</property>
+ <property name="title" translatable="yes">Create new document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>o</property>
+ <property name="title" translatable="yes">Open a document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>s</property>
+ <property name="title" translatable="yes">Save the document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>w</property>
+ <property name="title" translatable="yes">Close the document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><alt>Page_Down</property>
+ <property name="title" translatable="yes">Switch to the next document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><alt>Page_Up</property>
+ <property name="title" translatable="yes">Switch to the previous document</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Find and replace</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>f</property>
+ <property name="title" translatable="yes">Find</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>g</property>
+ <property name="title" translatable="yes">Find the next match</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><shift>g</property>
+ <property name="title" translatable="yes">Find the previous match</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><shift>k</property>
+ <property name="title" translatable="yes">Clear highlight</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Copy and Paste</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>c</property>
+ <property name="title" translatable="yes">Copy selected text to clipboard</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>x</property>
+ <property name="title" translatable="yes">Cut selected text to clipboard</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>v</property>
+ <property name="title" translatable="yes">Paste text from clipboard</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Undo and Redo</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>z</property>
+ <property name="title" translatable="yes">Undo previous command</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><shift>z</property>
+ <property name="title" translatable="yes">Redo previous command</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Editing</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><shift>a</property>
+ <property name="title" translatable="yes">Increment number at cursor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><shift>x</property>
+ <property name="title" translatable="yes">Decrement number at cursor</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>j</property>
+ <property name="title" translatable="yes">Join selected lines</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>space</property>
+ <property name="title" translatable="yes">Show completion window</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">Insert</property>
+ <property name="title" translatable="yes">Toggle overwrite</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><alt>i</property>
+ <property name="title" translatable="yes">Reindent line</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Navigation</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt>n</property>
+ <property name="title" translatable="yes">Move to next error in file</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt>p</property>
+ <property name="title" translatable="yes">Move to previous error in file</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><shift><alt>Left</property>
+ <property name="title" translatable="yes">Move to previous edit location</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><shift><alt>Right</property>
+ <property name="title" translatable="yes">Move to next edit location</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt>period</property>
+ <property name="title" translatable="yes">Jump to definition of symbol</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt><shift>Up</property>
+ <property name="title" translatable="yes">Move sectionport up within the file</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt><shift>Down</property>
+ <property name="title" translatable="yes">Move sectionport down within the file</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt><shift>End</property>
+ <property name="title" translatable="yes">Move sectionport to end of file</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt><shift>Home</property>
+ <property name="title" translatable="yes">Move sectionport to beginning of file</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>percent</property>
+ <property name="title" translatable="yes">Move to matching bracket</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Selections</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>a</property>
+ <property name="title" translatable="yes">Select all</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>backslash</property>
+ <property name="title" translatable="yes">Unselect all</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsSection">
+ <property name="visible">1</property>
+ <property name="section-name">terminal</property>
+ <property name="title" translatable="yes">Terminal Shortcuts</property>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">General</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Global Search</property>
+ <property name="accelerator"><ctrl>period</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Preferences</property>
+ <property name="accelerator"><ctrl>comma</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Command Bar</property>
+ <property name="accelerator"><ctrl>Return</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Terminal</property>
+ <property name="accelerator"><ctrl><shift>t</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Keyboard Shortcuts</property>
+ <property name="accelerator"><ctrl><shift>question</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Copy and Paste</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><shift>c</property>
+ <property name="title" translatable="yes">Copy selected text to clipboard</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><shift>v</property>
+ <property name="title" translatable="yes">Paste text from clipboard</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Switching</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt>1...9</property>
+ <property name="title" translatable="yes">Switch to n-th tab</property>
+ </object>
+ </child>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">All gestures</property>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-pinch</property>
+ <property name="title" translatable="yes">A stock pinch gesture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-stretch</property>
+ <property name="title" translatable="yes">A stock stretch gesture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-rotate-clockwise</property>
+ <property name="title" translatable="yes">A stock rotation gesture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-rotate-counterclockwise</property>
+ <property name="title" translatable="yes">A stock rotation gesture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-two-finger-swipe-left</property>
+ <property name="title" translatable="yes">A stock swipe gesture</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-two-finger-swipe-right</property>
+ <property name="title" translatable="yes">A stock swipe gesture</property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">'Special' combinations</property>
+
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">t+t</property>
+ <property name="title" translatable="yes">You want tea ?</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><shift><ctrl></property>
+ <property name="title" translatable="yes">Shift Control</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>&<ctrl></property>
+ <property name="title" translatable="yes">Control Control</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">Control_L&Control_R</property>
+ <property name="title" translatable="yes">Left and right control</property>
+ </object>
+ </child>
+
+ </object>
+ </child>
+
+ </object>
+ </child>
+ </object>
+
+</interface>
diff --git a/gtk3/sample/gtk-demo/shortcuts-clocks.ui b/gtk3/sample/gtk-demo/shortcuts-clocks.ui
new file mode 100644
index 0000000..5d31a9b
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts-clocks.ui
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.17 -->
+
+ <object class="GtkShortcutsWindow" id="shortcuts-clocks">
+ <property name="modal">1</property>
+ <child>
+ <object class="GtkShortcutsSection">
+ <property name="visible">1</property>
+ <property name="section-name">shortcuts</property>
+ <property name="max-height">10</property>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">General</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>Page_Down</property>
+ <property name="title" translatable="yes">Go to the next section</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>Page_Up</property>
+ <property name="title" translatable="yes">Go to the previous section</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt>Q</property>
+ <property name="title" translatable="yes">Quit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt>Right</property>
+ <property name="direction">ltr</property>
+ <property name="title" translatable="yes">Forward</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>Left</property>
+ <property name="direction">ltr</property>
+ <property name="title" translatable="yes">Back</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><alt>Left</property>
+ <property name="direction">rtl</property>
+ <property name="title" translatable="yes">Forward</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>Right</property>
+ <property name="direction">rtl</property>
+ <property name="title" translatable="yes">Back</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="view">world</property>
+ <property name="title" translatable="yes">World Clocks</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>N</property>
+ <property name="title" translatable="yes">Add a world clock</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>S</property>
+ <property name="title" translatable="yes">Select world clocks</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="view">alarm</property>
+ <property name="title" translatable="yes">Alarm</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>N</property>
+ <property name="title" translatable="yes">Add an alarm</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>S</property>
+ <property name="title" translatable="yes">Select alarms</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="view">stopwatch</property>
+ <property name="title" translatable="yes">Stopwatch</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">Return space</property>
+ <property name="title" translatable="yes">Start / Stop / Continue</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">L</property>
+ <property name="title" translatable="yes">Lap</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">Delete</property>
+ <property name="title" translatable="yes">Reset</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="view">timer</property>
+ <property name="title" translatable="yes">Timer</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">Return space</property>
+ <property name="title" translatable="yes">Start / Stop / Pause</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">Delete</property>
+ <property name="title" translatable="yes">Reset</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+
+</interface>
diff --git a/gtk3/sample/gtk-demo/shortcuts-gedit.ui b/gtk3/sample/gtk-demo/shortcuts-gedit.ui
new file mode 100644
index 0000000..acb30d0
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts-gedit.ui
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.17 -->
+
+ <object class="GtkShortcutsWindow" id="shortcuts-gedit">
+ <property name="modal">1</property>
+ <child>
+ <object class="GtkShortcutsSection">
+ <property name="visible">1</property>
+ <property name="section-name">shortcuts</property>
+ <property name="max-height">12</property>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Touchpad gestures</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-two-finger-swipe-right</property>
+ <property name="title" translatable="yes">Switch to the next document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="shortcut-type">gesture-two-finger-swipe-left</property>
+ <property name="title" translatable="yes">Switch to the previous document</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Documents</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>N</property>
+ <property name="title" translatable="yes">Create new document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>O</property>
+ <property name="title" translatable="yes">Open a document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>S</property>
+ <property name="title" translatable="yes">Save the document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>W</property>
+ <property name="title" translatable="yes">Close the document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><Alt>Page_Down</property>
+ <property name="title" translatable="yes">Switch to the next document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><Alt>Page_Up</property>
+ <property name="title" translatable="yes">Switch to the previous document</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Find and Replace</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>F</property>
+ <property name="title" translatable="yes">Find</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>G</property>
+ <property name="title" translatable="yes">Find the next match</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><Shift>G</property>
+ <property name="title" translatable="yes">Find the previous match</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>H</property>
+ <property name="title" translatable="yes">Find and Replace</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl><Shift>K</property>
+ <property name="title" translatable="yes">Clear highlight</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>I</property>
+ <property name="title" translatable="yes">Go to line</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Tools</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><shift>F7</property>
+ <property name="title" translatable="yes">Check spelling</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsGroup">
+ <property name="visible">1</property>
+ <property name="title" translatable="yes">Miscellaneous</property>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">F11</property>
+ <property name="title" translatable="yes">Fullscreen on / off</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator"><ctrl>P</property>
+ <property name="title" translatable="yes">Print the document</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkShortcutsShortcut">
+ <property name="visible">1</property>
+ <property name="accelerator">Insert</property>
+ <property name="title" translatable="yes">Toggle insert / overwrite</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+
+</interface>
diff --git a/gtk3/sample/gtk-demo/shortcuts.ui b/gtk3/sample/gtk-demo/shortcuts.ui
new file mode 100644
index 0000000..cb64e1e
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts.ui
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.17 -->
+
+ <object class="GtkWindow" id="window1">
+ <property name="title" translatable="yes">Shortcuts</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">1</property>
+ <property name="orientation">vertical</property>
+ <property name="margin">50</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Builder</property>
+ <signal name="clicked" handler="builder_shortcuts" swapped="1" object="window1"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">GEdit</property>
+ <signal name="clicked" handler="gedit_shortcuts" swapped="1" object="window1"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Clocks - All</property>
+ <signal name="clicked" handler="clocks_shortcuts" swapped="1" object="window1"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Clocks - Stopwatch</property>
+ <signal name="clicked" handler="clocks_shortcuts_stopwatch" swapped="1" object="window1"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Boxes</property>
+ <signal name="clicked" handler="boxes_shortcuts" swapped="1" object="window1"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Boxes - Wizard</property>
+ <signal name="clicked" handler="boxes_shortcuts_wizard" swapped="1" object="window1"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Boxes - Display</property>
+ <signal name="clicked" handler="boxes_shortcuts_display" swapped="1" object="window1"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/gtk3/sample/gtk-demo/stack.ui b/gtk3/sample/gtk-demo/stack.ui
index ed67261..1383f41 100644
--- a/gtk3/sample/gtk-demo/stack.ui
+++ b/gtk3/sample/gtk-demo/stack.ui
@@ -4,10 +4,10 @@
<object class="GtkWindow" id="window1">
<property name="title" translatable="yes">Stack</property>
<child>
- <object class="GtkGrid" id="grid1">
+ <object class="GtkGrid">
<property name="visible">1</property>
<child>
- <object class="GtkStackSwitcher" id="switcher">
+ <object class="GtkStackSwitcher">
<property name="visible">1</property>
<property name="stack">stack</property>
<property name="halign">center</property>
@@ -23,7 +23,7 @@
<property name="can_focus">1</property>
<property name="transition-type">crossfade</property>
<child>
- <object class="GtkImage" id="image1">
+ <object class="GtkImage">
<property name="visible">1</property>
<property name="margin-top">20</property>
<property name="margin-bottom">20</property>
@@ -35,7 +35,7 @@
</packing>
</child>
<child>
- <object class="GtkCheckButton" id="checkbutton1">
+ <object class="GtkCheckButton">
<property name="label" translatable="yes">Page 2</property>
<property name="visible">1</property>
<property name="can_focus">1</property>
@@ -49,7 +49,7 @@
</packing>
</child>
<child>
- <object class="GtkSpinner" id="spinner1">
+ <object class="GtkSpinner">
<property name="visible">1</property>
<property name="halign">center</property>
<property name="valign">center</property>
diff --git a/gtk3/sample/gtk-demo/textscroll.rb b/gtk3/sample/gtk-demo/textscroll.rb
new file mode 100644
index 0000000..9d2c8f4
--- /dev/null
+++ b/gtk3/sample/gtk-demo/textscroll.rb
@@ -0,0 +1,106 @@
+# Copyright (c) 2016 Ruby-GNOME2 Project Team
+# This program is licenced under the same licence as Ruby-GNOME2.
+#
+=begin
+= Text View/Automatic Scrolling
+
+ This example demonstrates how to use the gravity of
+ GtkTextMarks to keep a text view scrolled to the bottom
+ while appending text.
+=end
+module TextscrollDemo
+ def self.run_demo(main_window)
+ window = Gtk::Window.new(:toplevel)
+ window.screen = main_window.screen
+
+ window.set_default_size(600, 400)
+
+ hbox = Gtk::Box.new(:horizontal, 6)
+ hbox.homogeneous = true
+ window.add(hbox)
+
+ create_text_view(hbox, true)
+ create_text_view(hbox, false)
+
+ if !window.visible?
+ window.show_all
+ else
+ window.destroy
+ end
+ window
+ end
+
+ def self.create_text_view(hbox, to_end)
+ swindow = Gtk::ScrolledWindow.new
+ hbox.pack_start(swindow, :fill => true, :expand => true, :padding => 0)
+ textview = Gtk::TextView.new
+ swindow.add(textview)
+ timeout = setup_scroll(textview, to_end)
+ textview.signal_connect("destroy") { GLib::Source.remove(timeout) }
+ end
+
+ def self.setup_scroll(textview, to_end)
+ buffer = textview.buffer
+ end_iter = buffer.end_iter
+ count = 0
+ if to_end
+ # If we want to scroll to the end, including horizontal scrolling,
+ # then we just create a mark with right gravity at the end of the
+ # buffer. It will stay at the end unless explicitly moved with
+ # gtk_text_buffer_move_mark.
+ buffer.create_mark("end", end_iter, false)
+
+ # add scrolling timeout
+ return GLib::Timeout.add(50) do # scroll to end
+ count += 1
+ # Get "end" mark. It's located at the end of buffer because
+ # of right gravity
+ mark = buffer.get_mark("end")
+ mark_iter = buffer.get_iter_at(:mark => mark)
+ # and insert some text at its position, the iter will be
+ # revalidated after insertion to point to the end of inserted text
+ buffer.insert(mark_iter, "\n")
+ buffer.insert(mark_iter, " " * count)
+ buffer.insert(mark_iter, "Scroll to end scroll to end scroll" +
+ " to end scroll to end #{count}")
+ # Now scroll the end mark onscreen.
+ textview.scroll_mark_onscreen(mark)
+
+ # Emulate typewriter behavior, shift to the left if we
+ # are far enough to the right.
+ count = 0 if count > 150
+ GLib::Source::CONTINUE
+ end
+ else
+ # If we want to scroll to the bottom, but not scroll horizontally,
+ # then an end mark won't do the job. Just create a mark so we can
+ # use it with gtk_text_view_scroll_mark_onscreen, we'll position it
+ # explicitly when needed. Use left gravity so the mark stays where
+ # we put it after inserting new text.
+ buffer.create_mark("scroll", end_iter, true)
+ return GLib::Timeout.add(100) do # scroll to bottom
+ count += 1
+ # Get end iterator
+ end_iter = buffer.end_iter
+ # and insert some text at it, the iter will be revalidated
+ # after insertion to point to the end of inserted text
+ buffer.insert(end_iter, "\n")
+ buffer.insert(end_iter, " " * count)
+ buffer.insert(end_iter,"Scroll to bottom scroll to bottom scroll" +
+ " to bottom scroll to bottom #{count}")
+ # Move the iterator to the beginning of line, so we don't scroll
+ # in horizontal direction
+ end_iter.line_offset = 0
+ # and place the mark at iter. the mark will stay there after we
+ # insert some text at the end because it has left gravity.
+ mark = buffer.get_mark("scroll")
+ buffer.move_mark(mark, end_iter)
+ # Scroll the mark onscreen.
+ textview.scroll_mark_onscreen(mark)
+ # Shift text back if we got enough to the right.
+ count = 0 if count > 40
+ GLib::Source::CONTINUE
+ end
+ end
+ end
+end
diff --git a/gtk3/sample/gtk-demo/theming.ui b/gtk3/sample/gtk-demo/theming.ui
index d3a6e21..617a2f7 100644
--- a/gtk3/sample/gtk-demo/theming.ui
+++ b/gtk3/sample/gtk-demo/theming.ui
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkGrid" id="grid">
- <property name="row-spacing">6</property>
+ <property name="row-spacing">10</property>
<property name="orientation">vertical</property>
<child>
- <object class="GtkToolbar" id="toolbar1">
+ <object class="GtkToolbar">
<property name="visible">1</property>
<property name="hexpand">1</property>
<property name="show-arrow">0</property>
@@ -12,7 +12,7 @@
<class name="primary-toolbar"/>
</style>
<child>
- <object class="GtkToggleToolButton" id="toolbutton1">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="use_action_appearance">0</property>
@@ -26,7 +26,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="toolbutton2">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="use_action_appearance">0</property>
@@ -41,7 +41,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="toolbutton3">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="sensitive">0</property>
@@ -55,7 +55,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="toolbutton5">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="label" translatable="yes">Raised</property>
@@ -71,7 +71,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="toolbutton6">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="label" translatable="yes">Raised Active</property>
@@ -88,7 +88,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="toolbutton4">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="sensitive">0</property>
@@ -103,7 +103,7 @@
</packing>
</child>
<child>
- <object class="GtkToolItem" id="toolitementry">
+ <object class="GtkToolItem">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<child>
@@ -118,7 +118,7 @@
</object>
</child>
<child>
- <object class="GtkToolItem" id="toolitemswitch">
+ <object class="GtkToolItem">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<child>
@@ -132,7 +132,7 @@
</object>
</child>
<child>
- <object class="GtkBox" id="box1">
+ <object class="GtkBox">
<property name="visible">1</property>
<property name="valign">center</property>
<property name="halign">center</property>
@@ -140,7 +140,7 @@
<class name="linked"/>
</style>
<child>
- <object class="GtkButton" id="button1">
+ <object class="GtkButton">
<property name="label" translatable="yes">Hi, I am a button</property>
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
@@ -150,8 +150,8 @@
</object>
</child>
<child>
- <object class="GtkButton" id="button2">
- <property name="label" translatable="yes">And I'm another button</property>
+ <object class="GtkButton">
+ <property name="label" translatable="yes">And I'm another button</property>
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="can_focus">1</property>
@@ -163,7 +163,7 @@
</packing>
</child>
<child>
- <object class="GtkButton" id="button3">
+ <object class="GtkButton">
<property name="label" translatable="yes">This is a button party!</property>
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
@@ -178,15 +178,16 @@
</object>
</child>
<child>
- <object class="GtkToolbar" id="itoolbar1">
+ <object class="GtkToolbar">
<property name="visible">1</property>
<property name="hexpand">1</property>
<property name="icon_size">1</property>
+ <property name="toolbar-style">icons</property>
<style>
<class name="inline-toolbar"/>
</style>
<child>
- <object class="GtkToggleToolButton" id="itoolbutton1">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="use_action_appearance">0</property>
@@ -199,7 +200,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="itoolbutton2">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="use_action_appearance">0</property>
@@ -212,7 +213,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="itoolbutton3">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="use_action_appearance">0</property>
@@ -226,7 +227,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="itoolbutton4">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="use_action_appearance">0</property>
@@ -240,7 +241,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="itoolbutton5">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="sensitive">0</property>
@@ -254,7 +255,7 @@
</packing>
</child>
<child>
- <object class="GtkToggleToolButton" id="itoolbutton6">
+ <object class="GtkToggleToolButton">
<property name="use_action_appearance">0</property>
<property name="visible">1</property>
<property name="sensitive">0</property>
@@ -270,5 +271,40 @@
</child>
</object>
</child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">1</property>
+ <property name="spacing">10</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Plain</property>
+ <property name="halign">end</property>
+ </object>
+ <packing>
+ <property name="expand">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Destructive</property>
+ <style>
+ <class name="destructive-action"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">1</property>
+ <property name="label">Suggested</property>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
</object>
</interface>
diff --git a/gtk3/sample/gtk-demo/theming_style_classes.rb b/gtk3/sample/gtk-demo/theming_style_classes.rb
index 27dfbbf..f6de92d 100644
--- a/gtk3/sample/gtk-demo/theming_style_classes.rb
+++ b/gtk3/sample/gtk-demo/theming_style_classes.rb
@@ -4,7 +4,7 @@
# This is licensed under the terms of the GNU Lesser General Public
# License, version 2.1 or (at your option) later.
#
-# Copyright (C) 2014-2015 Ruby-GNOME2 Project Team
+# Copyright (C) 2014-2016 Ruby-GNOME2 Project Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -20,7 +20,7 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
=begin
-= CSS Theming/Style Classes
+= Theming/Style Classes
GTK+ uses CSS for theming. Style classes can be associated
with widgets to inform the theme about intended rendering.
@@ -34,8 +34,9 @@ module ThemingStyleClassesDemo
def self.run_demo(main_window)
window = Gtk::Window.new(:toplevel)
window.screen = main_window.screen
- window.set_title("Style Classes")
- window.set_border_width(12)
+ window.title = "Style Classes"
+ window.resizable = false
+ window.border_width = 12
builder = Gtk::Builder.new(:resource => "/theming_style_classes/theming.ui")
grid = builder["grid"]
diff --git a/gtk3/sample/gtk-demo/transparent.rb b/gtk3/sample/gtk-demo/transparent.rb
new file mode 100644
index 0000000..868440f
--- /dev/null
+++ b/gtk3/sample/gtk-demo/transparent.rb
@@ -0,0 +1,143 @@
+# Copyright (c) 2016 Ruby-GNOME2 Project Team
+# This program is licenced under the same licence as Ruby-GNOME2.
+#
+=begin
+= Overlay/Transparency
+
+ Use transparent background on GdkWindows to create a shadow effect on a GtkOverlay widget.
+=end
+module TransparentDemo
+ SHADOW_OFFSET_X = 7
+ SHADOW_OFFSET_Y = 7
+ SHADOW_RADIUS = 5
+
+ def self.run_demo(main_window)
+ window = Gtk::Window.new(:toplevel)
+ window.screen = main_window.screen
+ window.set_default_size(450, 450)
+ window.title = "Transparency"
+ window.border_width = 0
+
+ view = Gtk::TextView.new
+ sw = Gtk::ScrolledWindow.new
+ sw.set_policy(:automatic, :automatic)
+ sw.add(view)
+
+ overlay = Gtk::Overlay.new
+ overlay.add(sw)
+ window.add(overlay)
+
+ entry = Gtk::Entry.new
+ css = <<-CSS
+ * { border-width: 0px #{SHADOW_OFFSET_X}px #{SHADOW_OFFSET_Y}px 0px; }
+ CSS
+ provider = Gtk::CssProvider.new
+ provider.load_from_data(css)
+ style_context = entry.style_context
+ style_context.add_provider(provider,
+ Gtk::StyleProvider::PRIORITY_APPLICATION)
+ entry.signal_connect "draw" do |widget, cr|
+ allocation = widget.allocation
+ rect = [allocation.x + SHADOW_OFFSET_X,
+ allocation.y + SHADOW_OFFSET_Y,
+ allocation.width - SHADOW_OFFSET_X,
+ allocation.height - SHADOW_OFFSET_Y
+ ]
+ draw_shadow_box(cr, rect, SHADOW_RADIUS, 0.4)
+ false
+ end
+
+ overlay.add_overlay(entry)
+ entry.valign = :center
+ entry.halign = :start
+ overlay.show_all
+
+ if !window.visible?
+ window.show_all
+ else
+ window.destroy
+ end
+ window
+ end
+
+ def self.draw_shadow_box(cr, rect, radius, transparency)
+ x0 = rect[0]
+ x1 = rect[0] + radius
+ x2 = rect[0] + rect[2] - radius
+ x3 = rect[0] + rect[2]
+
+ y0 = rect[1]
+ y1 = rect[1] + radius
+ y2 = rect[1] + rect[3] - radius
+ y3 = rect[1] + rect[3]
+
+ # Fill non-border part
+ cr.set_source_rgba(0, 0, 0, transparency)
+ cr.rectangle(x1, y1, x2 - x1, y2 - y1)
+
+ # Upper border
+ pattern = Cairo::LinearPattern.new(0, y0, 0, y1)
+ pattern.add_color_stop_rgba(0.0, 0.0, 0.0, 0.0)
+ pattern.add_color_stop_rgba(1.0, 0.0, 0.0, transparency)
+
+ cr.set_source(pattern)
+ cr.rectangle(x1, y0, x2 - x1, y1 - y0)
+ cr.fill
+
+ # Bottom border
+ pattern = Cairo::LinearPattern.new(0, y2, 0, y3)
+ pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+ pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+ cr.set_source(pattern)
+ cr.rectangle(x1, y2, x2 - x1, y3 - y2)
+ cr.fill
+
+ # Left border
+ pattern = Cairo::LinearPattern.new(x0, 0, x1, 0)
+ pattern.add_color_stop_rgba(0.0, 0.0, 0.0, 0.0)
+ pattern.add_color_stop_rgba(1.0, 0.0, 0.0, transparency)
+ cr.set_source(pattern)
+ cr.rectangle(x0, y1, x1 - x0, y2 - y1)
+ cr.fill
+
+ # Right border
+ pattern = Cairo::LinearPattern.new(x2, 0, x3, 0)
+ pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+ pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+ cr.set_source(pattern)
+ cr.rectangle(x2, y1, x3 - x2, y2 - y1)
+ cr.fill
+
+ # NW corner
+ pattern = Cairo::RadialPattern.new(x1, y1, 0, x1, y1, radius)
+ pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+ pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+ cr.set_source(pattern)
+ cr.rectangle(x0, y0, x1 - x0, y1 - y0)
+ cr.fill
+
+ # NE corner
+ pattern = Cairo::RadialPattern.new(x2, y1, 0, x2, y1, radius)
+ pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+ pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+ cr.set_source(pattern)
+ cr.rectangle(x2, y0, x3 - x2, y1 - y0)
+ cr.fill
+
+ # SW corner
+ pattern = Cairo::RadialPattern.new(x1, y2, 0, x1, y2, radius)
+ pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+ pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+ cr.set_source(pattern)
+ cr.rectangle(x0, y2, x1 - x0, y3 - y2)
+ cr.fill
+
+ # SE corner
+ pattern = Cairo::RadialPattern.new(x2, y2, 0, x2, y2, radius)
+ pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+ pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+ cr.set_source(pattern)
+ cr.rectangle(x2, y2, x3 - x2, y3 - y2)
+ cr.fill
+ end
+end
diff --git a/gtk3/sample/misc/aboutdialog.rb b/gtk3/sample/misc/aboutdialog.rb
index 7bee790..1cfd89a 100755
--- a/gtk3/sample/misc/aboutdialog.rb
+++ b/gtk3/sample/misc/aboutdialog.rb
@@ -19,7 +19,7 @@ a.comments = "This is a sample script for Gtk::AboutDialog"
a.copyright = "Copyright (C) 2005 Ruby-GNOME2 Project"
a.documenters = ["Documenter 1 <no1 at foo.bar.com>", "Documenter 2 <no2 at foo.bar.com>"]
a.license = "This program is licenced under the same licence as Ruby-GNOME2."
-a.logo = Gdk::Pixbuf.new(File.join(__dir__, "gnome-logo-icon.png"))
+a.logo = GdkPixbuf::Pixbuf.new(:file => File.join(__dir__, "gnome-logo-icon.png"))
a.program_name = "Gtk::AboutDialog sample"
a.translator_credits = "Translator 1\nTranslator 2\n"
a.version = "1.0.0"
diff --git a/gtk3/sample/misc/bindings.rb b/gtk3/sample/misc/bindings.rb
index ad91c9d..1508f57 100644
--- a/gtk3/sample/misc/bindings.rb
+++ b/gtk3/sample/misc/bindings.rb
@@ -50,22 +50,43 @@ window = Gtk::Window.new
window.name = "pager_window"
css_provider = Gtk::CssProvider.new
-css_provider.load(:data => <<CSS)
- at binding-set MoveCursor {
- bind "<Control>j" { "move-cursor" (display-lines, 1, 0) };
- bind "<Control>k" { "move-cursor" (display-lines, -1, 0) };
- bind "<Control>l" { "move-cursor" (buffer-ends, 1, 0) };
- bind "<Control>m" { "move-cursor" (buffer-ends, -1, 0) };
-}
-GtkTextView {
- -GtkWidget-cursor-color: green;
- -GtkWidget-aspect-ratio: 1.0;
- font: 20 Sans;
- color: #aaa;
- background-color: #333 ;
- gtk-key-bindings: MoveCursor;
-}
+
+if Gtk::Version.or_later?(3, 20, 0)
+ css_provider.load(:data => <<CSS)
+ @binding-set MoveCursor {
+ bind "<Control>j" { "move-cursor" (display-lines, 1, 0) };
+ bind "<Control>k" { "move-cursor" (display-lines, -1, 0) };
+ bind "<Control>l" { "move-cursor" (buffer-ends, 1, 0) };
+ bind "<Control>m" { "move-cursor" (buffer-ends, -1, 0) };
+ }
+ textview {
+ caret-color: green;
+ -GtkWidget-aspect-ratio: 1.0;
+ font: 20 Sans;
+ color: #aaa;
+ background-color: #333 ;
+ -gtk-key-bindings: MoveCursor;
+ }
+CSS
+else
+ css_provider.load(:data => <<CSS)
+ @binding-set MoveCursor {
+ bind "<Control>j" { "move-cursor" (display-lines, 1, 0) };
+ bind "<Control>k" { "move-cursor" (display-lines, -1, 0) };
+ bind "<Control>l" { "move-cursor" (buffer-ends, 1, 0) };
+ bind "<Control>m" { "move-cursor" (buffer-ends, -1, 0) };
+ }
+ GtkTextView {
+ -GtkWidget-cursor-color: green;
+ -GtkWidget-aspect-ratio: 1.0;
+ font: 20 Sans;
+ color: #aaa;
+ background-color: #333 ;
+ gtk-key-bindings: MoveCursor;
+ }
CSS
+end
+
hbox = Gtk::Box.new(:horizontal)
hbox.add(button1 = Gtk::Button.new(:label => "Ctrl + l"))
diff --git a/gtk3/sample/misc/combobox.rb b/gtk3/sample/misc/combobox.rb
index d4354be..6561b6d 100644
--- a/gtk3/sample/misc/combobox.rb
+++ b/gtk3/sample/misc/combobox.rb
@@ -32,7 +32,7 @@ end
#
# Icon and text
#
-model = Gtk::ListStore.new(Gdk::Pixbuf, String)
+model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String)
[[Gtk::Stock::QUIT, "quit"],
[Gtk::Stock::CANCEL, "cancel"],
[Gtk::Stock::OK, "ok"]].each do |stock, name|
diff --git a/gtk3/sample/misc/dnd.rb b/gtk3/sample/misc/dnd.rb
index caad2d1..bfd10f7 100644
--- a/gtk3/sample/misc/dnd.rb
+++ b/gtk3/sample/misc/dnd.rb
@@ -2,7 +2,7 @@
dnd.rb - Drag and Drop sample script.
Copyright (C) 2002-2015 Masao Mutoh
- Copyright (c) 2002-2015 Ruby-GNOME2 Project Team
+ Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
=end
@@ -44,9 +44,9 @@ class DestWindow < Gtk::Window
context.targets.each do |target|
if target.name == "test" ||
selection_data.type == Gdk::Selection::TYPE_STRING
- data_len = selection_data.data[1]
+ data_len = selection_data.data.size
puts "drag-data-received signal:"
- puts selection_data.data[0].pack("C#{data_len}")
+ puts selection_data.data.pack("C#{data_len}")
puts selection_data.text
else
next
diff --git a/gtk3/sample/misc/icons-theme-viewer.rb b/gtk3/sample/misc/icons-theme-viewer.rb
index d509108..abf0ad5 100644
--- a/gtk3/sample/misc/icons-theme-viewer.rb
+++ b/gtk3/sample/misc/icons-theme-viewer.rb
@@ -9,7 +9,7 @@
require "gtk3"
def fill_model(icons)
- model = Gtk::ListStore.new(String, Gdk::Pixbuf)
+ model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
icons.each do |icon|
pixbuf = Gtk::IconTheme.default.load_icon(icon, 32, 0)
iter = model.append
diff --git a/gtk3/sample/misc/iconview.rb b/gtk3/sample/misc/iconview.rb
index beb63e8..ce49fe1 100644
--- a/gtk3/sample/misc/iconview.rb
+++ b/gtk3/sample/misc/iconview.rb
@@ -11,7 +11,7 @@ require "gtk3"
TEXT_COLUMN = 0
PIXBUF_COLUMN = 1
-model = Gtk::ListStore.new(String, Gdk::Pixbuf)
+model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
iv = Gtk::IconView.new
iv.set_model(model)
@@ -21,7 +21,7 @@ iv.pixbuf_column = PIXBUF_COLUMN
Dir.glob("#{File.expand_path(File.dirname(__FILE__))}/../gtk-demo/gnome*.png").each do |f|
iter = model.append
iter[TEXT_COLUMN] = File.basename(f)
- iter[PIXBUF_COLUMN] = Gdk::Pixbuf.new(f)
+ iter[PIXBUF_COLUMN] = GdkPixbuf::Pixbuf.new(:file => f)
end
iv.signal_connect("item_activated") do |iv, path|
diff --git a/gtk3/sample/misc/textbuffer-serialize.rb b/gtk3/sample/misc/textbuffer-serialize.rb
old mode 100644
new mode 100755
index 0cb760e..4b586a3
--- a/gtk3/sample/misc/textbuffer-serialize.rb
+++ b/gtk3/sample/misc/textbuffer-serialize.rb
@@ -84,16 +84,18 @@ button_color = Gtk::ToolButton.new(:icon_widget => nil, :label => "Color the reg
button_color.signal_connect "clicked" do
dialog = Gtk::ColorChooserDialog.new(:title => "Color the region", :parent => window)
if dialog.run == Gtk::ResponseType::OK
- bounds = buffer.selection_bounds # returns an array [Gtk::TextIter, Gtk::TextIter]
- rgba = dialog.rgba
- color = Gdk::Color.new(rgba.red*65535, rgba.green*65535, rgba.blue*65535)
- tag_name = color.to_s
- unless tag = buffer.tag_table.lookup(tag_name)
- tag = Gtk::TextTag.new(tag_name)
- tag.set_foreground_gdk(color)
+ bounds = buffer.selection_bounds # returns an array [Gtk::TextIter, Gtk::TextIter] or nil
+ if bounds
+ rgba = dialog.rgba
+ color = Gdk::Color.new(rgba.red*65535, rgba.green*65535, rgba.blue*65535)
+ tag_name = color.to_s
+ unless tag = buffer.tag_table.lookup(tag_name)
+ tag = Gtk::TextTag.new(tag_name)
+ tag.set_foreground_gdk(color)
+ end
+ buffer.tag_table.add(tag)
+ buffer.apply_tag(tag, bounds[0], bounds[1])
end
- buffer.tag_table.add(tag)
- buffer.apply_tag(tag, bounds[0], bounds[1])
end
dialog.destroy
end
@@ -103,12 +105,14 @@ button_font.signal_connect "clicked" do
dialog = Gtk::FontChooserDialog.new(:label => "Set font to the region", :parent => window)
if dialog.run == Gtk::ResponseType::OK
bounds = buffer.selection_bounds
- font = dialog.font
- unless tag = buffer.tag_table.lookup(font)
- tag = Gtk::TextTag.new(font).set_font(font)
+ if bounds
+ font = dialog.font
+ unless tag = buffer.tag_table.lookup(font)
+ tag = Gtk::TextTag.new(font).set_font(font)
+ end
+ buffer.tag_table.add(tag)
+ buffer.apply_tag(tag, bounds[0], bounds[1])
end
- buffer.tag_table.add(tag)
- buffer.apply_tag(tag, bounds[0], bounds[1])
end
dialog.destroy
end
diff --git a/gtk3/sample/misc/to-drawable.rb b/gtk3/sample/misc/to-drawable.rb
index fead54c..7aaec4f 100755
--- a/gtk3/sample/misc/to-drawable.rb
+++ b/gtk3/sample/misc/to-drawable.rb
@@ -1,6 +1,6 @@
#!/usr/bin/env ruby
=begin
- to_drawable.rb - Gdk::Pixbuf(GDK methods) sample script.
+ to_drawable.rb - GdkPixbuf::Pixbuf(GDK methods) sample script.
Copyright (c) 2002-2015 Ruby-GNOME2 Project Team
This program is licenced under the same licence as Ruby-GNOME2.
@@ -13,7 +13,7 @@ filename = "#{File.expand_path(File.dirname(__FILE__))}/gnome-logo-icon.png"
window = Gtk::Window.new("Drawable sample")
window.set_border_width(10)
-pixbuf = Gdk::Pixbuf.new(filename)
+pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
drawing_area = Gtk::DrawingArea.new
window.add(drawing_area)
diff --git a/gtk3/sample/misc/tooltips.rb b/gtk3/sample/misc/tooltips.rb
index 61bd8a6..96bc94b 100755
--- a/gtk3/sample/misc/tooltips.rb
+++ b/gtk3/sample/misc/tooltips.rb
@@ -41,6 +41,7 @@ def textview_query_tooltip(textview, keyboard_tip, x, y, tooltip, tag)
else
bx, by = textview.window_to_buffer_coords(Gtk::TextWindowType::TEXT, x, y)
iter, = textview.get_iter_at_position(bx, by)
+ return false if iter.nil?
end
if iter.has_tag?(tag)
tooltip.text = 'Tooltip on text tag'
diff --git a/gtk3/sample/misc/treeview.rb b/gtk3/sample/misc/treeview.rb
index dcd29b6..6b2d370 100644
--- a/gtk3/sample/misc/treeview.rb
+++ b/gtk3/sample/misc/treeview.rb
@@ -10,7 +10,7 @@ require "gtk3"
window = Gtk::Window.new("Gtk::TreeView sample")
# Create data
-model = Gtk::TreeStore.new(String, String, Gdk::RGBA, Float, Gdk::Pixbuf)
+model = Gtk::TreeStore.new(String, String, Gdk::RGBA, Float, GdkPixbuf::Pixbuf)
# column 1
root_iter = model.append(nil)
diff --git a/gtk3/sample/tutorial/README.md b/gtk3/sample/tutorial/README.md
index 0b9422c..8212b72 100644
--- a/gtk3/sample/tutorial/README.md
+++ b/gtk3/sample/tutorial/README.md
@@ -16,7 +16,7 @@ Here is the most basic example that illustrate the principles of widget hierarch
require "gtk3"
window = Gtk::Window.new("First example")
-window.set_request_size(400, 400)
+window.set_size_request(400, 400)
window.set_border_width(10)
button = Gtk::Button.new(:label => "Say hello")
@@ -157,7 +157,7 @@ app.signal_connect "activate" do |application|
window.set_title("Window")
window.set_border_width(10)
- # Here we construct the container that is going pack our buttons
+ # Here we construct the container that is going pack our buttons
grid = Gtk::Grid.new
# Pack the container in the window
@@ -281,7 +281,7 @@ Here is the "builder.ui" file that describes the interface:
The usage of the `Gtk::Builder` is really easy, we just create an instance from the
file "builder.ui" with `Gtk::Builder.new(:file => builder_file)`. Then you can access every widget or part of the interface thanks to its name: `window = builder.get_object("window")`. Note that `Gtk::Builder` can also be used to construct objects that are not widgets, such as tree models, adjustments, etc.
-The XML definition of the interface can be loaded from a file, a string or a path in a gresource binary. More informations related to this XML definition can be found [here](https://developer.gnome.org/gtk3/stable/GtkBuilder.html#BUILDER-UI). Those files are generally built with [glade](https://glade.gnome.org/).
+The XML definition of the interface can be loaded from a file, a string or a path in a gresource binary. More informations related to this XML definition can be found [here](https://developer.gnome.org/gtk3/stable/GtkBuilder.html#BUILDER-UI). Those files are generally built with [glade](https://glade.gnome.org/).
## Building applications
@@ -296,7 +296,7 @@ require "gtk3"
class ExampleAppWindow < Gtk::ApplicationWindow
def open(file)
-
+
end
end
@@ -318,7 +318,7 @@ class ExampleApp < Gtk::Application
end
files.each { |file| win.open(file) }
-
+
win.present
end
end
@@ -393,7 +393,7 @@ Here is the "window.ui" file that contains the template of the window:
```
Unlike regular interface descriptions, in template XML descriptions, a`<template>` tag is expected as a direct child of the toplevel `<interface>` tag. Yhe `<template>` tag must specify the "*class*" attribute which must be the class name of the widget. Optionally, the "*parent*" attribute may be specified to indicate the direct parent class (superclass).
-More informations can be found in the part [building composite widgets from template XML](https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget.description) of the `Gtk::Widget` documentation.
+More informations can be found in the part [building composite widgets from template XML](https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget.description) of the `Gtk::Widget` documentation.
#### Link a template to a custom class widget.
@@ -411,7 +411,7 @@ class ExampleAppWindow < Gtk::ApplicationWindow
end
def open(file)
-
+
end
end
```
@@ -482,7 +482,7 @@ This new way to access the stack widget is used in the following code. We have p
```ruby
class ExampleAppWindow < Gtk::ApplicationWindow
def open(file)
-
+
end
end
@@ -500,7 +500,7 @@ class ExampleApp < Gtk::Application
end
files.each { |file| win.open(file) }
-
+
win.present
end
end
@@ -526,14 +526,14 @@ def open(file)
view.buffer.text = stream.read
end
```
-Each file is opened and loaded in a `Gtk::TextView` with
+Each file is opened and loaded in a `Gtk::TextView` with
```ruby
stream = file.read
view.buffer.text = stream.read
```
-We get the basename, of the file in argument, that will be used as title for each tab of the stack widget:
+We get the basename, of the file in argument, that will be used as title for each tab of the stack widget:
```
stack.add_titled(scrolled, basename, basename)
@@ -611,7 +611,7 @@ application.add_action(action)
#### Add accelerators for action.
-An accelerator is just a keys combination that acts as a shortcut for an action.
+An accelerator is just a keys combination that acts as a shortcut for an action.
```ruby
quit_accels = ["<Ctrl>Q"]
@@ -655,7 +655,7 @@ We are going to use `Gio::Settings` to store our preferences. `Gio::Settings` re
</schemalist>
```
-Before we can make use of this schema in our application, we need to compile it into the binary form that `Gio::Settings` expects.
+Before we can make use of this schema in our application, we need to compile it into the binary form that `Gio::Settings` expects.
```ruby
system("glib-compile-schemas", data_path)
@@ -670,12 +670,12 @@ Gio::SettingsSchemaSource.new(data_path,
false)
```
-This is the corresponding method to the function [g_settings_schema_source_new_from_directory](https://developer.gnome.org/gio/stable/gio-GSettingsSchema-GSettingsSchemaSource.html#g-settings-schema-source-new-from-directory).
+This is the corresponding method to the function [g_settings_schema_source_new_from_directory](https://developer.gnome.org/gio/stable/gio-GSettingsSchema-GSettingsSchemaSource.html#g-settings-schema-source-new-from-directory).
As an alternative, our schema can just be loaded by using the `GSETTINGS_SCHEMA_DIR` environment variable.
```ruby
-ENV["GSETTINGS_SCHEMA_DIR"] = data_path
+ENV["GSETTINGS_SCHEMA_DIR"] = data_path
```
More informations on the use of gschemas can be found [here](https://developer.gnome.org/gio/stable/gio-GSettingsSchema-GSettingsSchemaSource.html)
@@ -842,11 +842,11 @@ def open(file)
stream = file.read
buffer = view.buffer
buffer.text = stream.read
- tag = buffer.create_tag()
+ tag = buffer.create_tag()
@settings.bind("font", tag, "font", Gio::SettingsBindFlags::DEFAULT)
buffer.apply_tag(tag, buffer.start_iter, buffer.end_iter)
end
-```
+```
### Adding a search bar
https://developer.gnome.org/gtk3/stable/ch01s04.html#id-1.2.3.12.10
@@ -1297,4 +1297,4 @@ Our application already uses a `Gtk::HeaderBar`, but so far it still gets a 'nor
</interface>
```
-A small extra bonus of using a header bar is that we get a fallback application menu for free.
+A small extra bonus of using a header bar is that we get a fallback application menu for free.
diff --git a/gtk3/test/test-gtk-clipboard.rb b/gtk3/test/test-gtk-clipboard.rb
index 4906a2b..8167eee 100644
--- a/gtk3/test/test-gtk-clipboard.rb
+++ b/gtk3/test/test-gtk-clipboard.rb
@@ -66,7 +66,7 @@ class TestGtkClipboard < Test::Unit::TestCase
received_image = image
loop.quit
end
- image = Gdk::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ image = GdkPixbuf::Pixbuf.new(:file => fixture_path("gnome-logo-icon.png"))
@clipboard.image = image
loop.run
diff --git a/gtk3/test/test-gtk-combo-box.rb b/gtk3/test/test-gtk-combo-box.rb
index 280208d..1adb47f 100644
--- a/gtk3/test/test-gtk-combo-box.rb
+++ b/gtk3/test/test-gtk-combo-box.rb
@@ -27,7 +27,7 @@ class TestGtkComboBox < Test::Unit::TestCase
end
test ":model" do
- model = Gtk::ListStore.new(Gdk::Pixbuf, String)
+ model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String)
combo_box = Gtk::ComboBox.new(:entry => true, :model => model)
assert do
combo_box.has_entry?
@@ -55,7 +55,7 @@ class TestGtkComboBox < Test::Unit::TestCase
end
test ":model" do
- model = Gtk::ListStore.new(Gdk::Pixbuf, String)
+ model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String)
combo_box = Gtk::ComboBox.new(:model => model)
assert do
not combo_box.has_entry?
diff --git a/gtk3/test/test-gtk-icon-view.rb b/gtk3/test/test-gtk-icon-view.rb
index 9d31631..f66cb8b 100644
--- a/gtk3/test/test-gtk-icon-view.rb
+++ b/gtk3/test/test-gtk-icon-view.rb
@@ -41,7 +41,7 @@ class TestGtkIconView < Test::Unit::TestCase
class TestGetCellRect < self
def setup
only_gtk_version(3, 6, 0)
- model = Gtk::ListStore.new(String, Gdk::Pixbuf)
+ model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
iter = model.append
model.set_values(iter, ["label", nil])
@path = iter.path
@@ -53,7 +53,7 @@ class TestGtkIconView < Test::Unit::TestCase
end
def test_not_found
- indices, _ = @path.indices
+ indices = @path.indices
not_found_path = Gtk::TreePath.new
not_found_path.append_index(indices.last + 1)
assert_nil(@icon_view.get_cell_rect(not_found_path))
diff --git a/gtk3/test/test-gtk-image.rb b/gtk3/test/test-gtk-image.rb
index 8820768..ca1ca22 100644
--- a/gtk3/test/test-gtk-image.rb
+++ b/gtk3/test/test-gtk-image.rb
@@ -40,13 +40,13 @@ class TestGtkImage < Test::Unit::TestCase
end
test "resource" do
+ only_gtk_version(3, 18, 0)
resource = Gio::Resource.load(fixture_path("image.gresource"))
Gio::Resources.register(resource)
begin
resource_path = "/org/ruby/gnome/gnome-logo-icon.png"
image = Gtk::Image.new(:resource => resource_path,
:size => :dialog)
- omit("GTK+ 3.16 doesn't support getting resource path. See GitHub#461.")
assert_equal(resource_path,
image.resource)
ensure
diff --git a/gtk3/test/test-gtk-list-store.rb b/gtk3/test/test-gtk-list-store.rb
index 11c6648..4268df3 100644
--- a/gtk3/test/test-gtk-list-store.rb
+++ b/gtk3/test/test-gtk-list-store.rb
@@ -194,20 +194,26 @@ class TestGtkListStore < Test::Unit::TestCase
test "iter" do
GC.start
n_iterators = count_objects(Gtk::TreeIter)
- 50.times do |i|
+ n_items = 50
+ n_iterators_created = 100
+ n_iterators_for_remove = 1
+
+ n_items.times do |i|
iter = @store.append
iter[ID] = i
iter[NAME] = i.to_s
end
- 100.times do
+ n_iterators_created.times do
@store.iter_first
end
iter = @store.iter_first
while @store.remove(iter); end
assert_equal(0, @store.to_enum(:each).to_a.size)
+
GC.start
assert do
- count_objects(Gtk::TreeIter) <= n_iterators + 1
+ count_objects(Gtk::TreeIter) <
+ (n_iterators + n_items + n_iterators_created + n_iterators_for_remove)
end
end
diff --git a/gtk3/test/test-gtk-text-view.rb b/gtk3/test/test-gtk-text-view.rb
new file mode 100644
index 0000000..0001116
--- /dev/null
+++ b/gtk3/test/test-gtk-text-view.rb
@@ -0,0 +1,64 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+class TestGtkTextView < Test::Unit::TestCase
+ include GtkTestUtils
+
+ sub_test_case "instance methods" do
+ def setup
+ only_gtk_version(3, 14)
+ @text_buffer = Gtk::TextBuffer.new
+ @text_buffer.text = "Hello"
+ @text_view = Gtk::TextView.new(@text_buffer)
+ end
+
+ sub_test_case "#get_iter_at" do
+ test ":location" do
+ iter = @text_view.get_iter_at(:location => [0, 0])
+ assert_equal("H", iter.char)
+ end
+
+ test ":position" do
+ iter, trailing = @text_view.get_iter_at(:position => [0, 0])
+ assert_equal(["H", 0],
+ [iter.char, trailing])
+ end
+ end
+
+ sub_test_case "#get_iter_at_location" do
+ test "found" do
+ iter = @text_view.get_iter_at_location(0, 0)
+ assert_equal("H", iter.char)
+ end
+
+ test "not found" do
+ assert_nil(@text_view.get_iter_at_location(100, 0))
+ end
+ end
+
+ sub_test_case "#get_iter_at_position" do
+ test "found" do
+ iter, trailing = @text_view.get_iter_at_position(0, 0)
+ assert_equal(["H", 0],
+ [iter.char, trailing])
+ end
+
+ test "not found" do
+ assert_nil(@text_view.get_iter_at_position(100, 0))
+ end
+ end
+ end
+end
diff --git a/gtk3/test/test-gtk-tree-path.rb b/gtk3/test/test-gtk-tree-path.rb
index 489133b..75d6be0 100644
--- a/gtk3/test/test-gtk-tree-path.rb
+++ b/gtk3/test/test-gtk-tree-path.rb
@@ -30,9 +30,7 @@ class TestGtkTreePath < Test::Unit::TestCase
end
def test_indices
- indices, depth = tree_path("2").indices
- assert_equal([[2], 1],
- [indices, depth])
+ assert_equal([2], tree_path("2").indices)
end
def test_down!
diff --git a/gtk3/test/test-gtk-tree-view.rb b/gtk3/test/test-gtk-tree-view.rb
index e02a2d3..94b67c2 100644
--- a/gtk3/test/test-gtk-tree-view.rb
+++ b/gtk3/test/test-gtk-tree-view.rb
@@ -87,6 +87,67 @@ class TestGtkTreeView < Test::Unit::TestCase
normalized_data)
end
+ sub_test_case "#expand_row" do
+ setup do
+ @parent = @store.append(nil)
+ @parent[0] = "parent"
+ @child = @store.append(@parent)
+ @child[0] = "child"
+ @grand_child = @store.append(@child)
+ @grand_child[0] = "grand child"
+ end
+
+ test "default" do
+ @view.expand_row(@parent.path)
+ assert do
+ @view.row_expanded?(@parent.path)
+ end
+ assert do
+ @view.row_expanded?(@child.path)
+ end
+ end
+
+ test "true" do
+ @view.expand_row(@parent.path, true)
+ assert do
+ @view.row_expanded?(@parent.path)
+ end
+ assert do
+ @view.row_expanded?(@child.path)
+ end
+ end
+
+ test "false" do
+ @view.expand_row(@parent.path, false)
+ assert do
+ @view.row_expanded?(@parent.path)
+ end
+ assert do
+ not @view.row_expanded?(@child.path)
+ end
+ end
+
+ test ":open_all => true" do
+ @view.expand_row(@parent.path, :open_all => true)
+ assert do
+ @view.row_expanded?(@parent.path)
+ end
+ assert do
+ @view.row_expanded?(@child.path)
+ end
+ end
+
+ test ":open_all => false" do
+ @view.expand_row(@parent.path, :open_all => false)
+ assert do
+ @view.row_expanded?(@parent.path)
+ end
+ assert do
+ not @view.row_expanded?(@child.path)
+ end
+ end
+ end
+
test "#row_expanded?" do
parent = @store.append(nil)
parent[0] = "Hello"
@@ -129,4 +190,40 @@ class TestGtkTreeView < Test::Unit::TestCase
end
end
end
+
+ sub_test_case "signal" do
+ def setup
+ @store = Gtk::TreeStore.new(String)
+ @view = Gtk::TreeView.new(@store)
+
+ root = @store.append(nil)
+ root[0] = "root"
+ child = @store.append(root)
+ child[0] = "child"
+ grand_child = @store.append(child)
+ grand_child[0] = "grand child"
+ end
+
+ test "row-collapsed" do
+ @view.expand_all
+
+ values = []
+ @view.signal_connect("row-collapsed") do |_, iter, path|
+ values << iter[0]
+ end
+ @view.collapse_row(Gtk::TreePath.new("0:0"))
+ assert_equal(["child"], values)
+ end
+
+ test "row-expanded" do
+ @view.collapse_all
+
+ values = []
+ @view.signal_connect("row-expanded") do |_, iter, path|
+ values << iter[0]
+ end
+ @view.expand_row(Gtk::TreePath.new("0"))
+ assert_equal(["root", "child"], values)
+ end
+ end
end
diff --git a/gtk3/test/test-gtk-window.rb b/gtk3/test/test-gtk-window.rb
index bda69ca..6f23f8b 100644
--- a/gtk3/test/test-gtk-window.rb
+++ b/gtk3/test/test-gtk-window.rb
@@ -26,8 +26,8 @@ class TestGtkWindow < Test::Unit::TestCase
@window.icon = fixture_path("gnome-logo-icon.png")
end
- test "Gdk::Pixbuf" do
- icon = Gdk::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+ test "GdkPixbuf::Pixbuf" do
+ icon = GdkPixbuf::Pixbuf.new(:file => fixture_path("gnome-logo-icon.png"))
@window.icon = icon
end
end
diff --git a/gtk3/test/test-pango-context.rb b/gtk3/test/test-pango-context.rb
new file mode 100644
index 0000000..589e74b
--- /dev/null
+++ b/gtk3/test/test-pango-context.rb
@@ -0,0 +1,56 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+class TestPangoContext < Test::Unit::TestCase
+ include GtkTestUtils
+
+ def test_set_shape_renderer
+ text = "this is a test"
+ label = Gtk::Label.new(text)
+ layout = label.layout
+
+ last_block_arguments = nil
+ layout.context.set_shape_renderer do |cr, attr, do_path|
+ last_block_arguments = [cr.class, attr.class, do_path]
+ end
+
+ metrics = layout.context.get_metrics(layout.font_description)
+ ascent = metrics.ascent
+ logical_rect = Pango::Rectangle.new(0, -ascent, ascent, ascent)
+ ink_rect = logical_rect.dup
+ attrs = Pango::AttrList.new
+ attr = Pango::AttrShape.new(ink_rect, logical_rect, "a")
+ attr.start_index = text[0, text.index("a")].bytesize
+ attr.end_index = attr.start_index + "a".bytesize
+ attrs.insert(attr)
+ label.attributes = attrs
+
+ window = Gtk::Window.new
+ window.signal_connect("destroy") do
+ Gtk.main_quit
+ end
+ window.add(label)
+ GLib::Timeout.add(1000) do
+ window.destroy
+ GLib::Source::REMOVE
+ end
+ window.show_all
+ Gtk.main
+
+ assert_equal([Cairo::Context, Pango::AttrShape, false],
+ last_block_arguments)
+ end
+end
diff --git a/gtksourceview3/Rakefile b/gtksourceview3/Rakefile
index 18a54df..803ab6d 100644
--- a/gtksourceview3/Rakefile
+++ b/gtksourceview3/Rakefile
@@ -44,7 +44,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "gtksourceview",
:download_site => :gnome,
:label => "GtkSourceView",
- :version => "3.20.1",
+ :version => "3.20.4",
:compression_method => "xz",
:windows => {
:configure_args => [
diff --git a/pango/Rakefile b/pango/Rakefile
index e5603f3..e841cf8 100644
--- a/pango/Rakefile
+++ b/pango/Rakefile
@@ -48,9 +48,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
},
{
:name => "harfbuzz",
- :download_base_url => "https://www.freedesktop.org/software/harfbuzz/release",
+ :download_site => :freedesktop,
:label => "HarfBuzz",
- :version => "1.2.4",
+ :version => "1.3.0",
:compression_method => "bz2",
:windows => {
:configure_args => [
@@ -64,7 +64,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "pango",
:download_site => :gnome,
:label => "pango",
- :version => "1.40.0",
+ :version => "1.40.1",
:compression_method => "xz",
:windows => {
:configure_args => [
diff --git a/pango/ext/pango/rbpangoattribute.c b/pango/ext/pango/rbpangoattribute.c
index b9a9436..4976222 100644
--- a/pango/ext/pango/rbpangoattribute.c
+++ b/pango/ext/pango/rbpangoattribute.c
@@ -229,6 +229,12 @@ attr_shape_value(VALUE self)
return rb_ary_new3(2, attr_shape_ink_rect(self), attr_shape_logical_rect(self));
}
+static VALUE
+attr_shape_data(VALUE self)
+{
+ return (VALUE)(((PangoAttrShape *)RVAL2ATTR(self))->data);
+}
+
/*
* Initialize methods
*/
@@ -464,6 +470,7 @@ Init_pango_attribute(VALUE mPango)
rbg_define_method(tmpklass, "ink_rect", attr_shape_ink_rect, 0);
rbg_define_method(tmpklass, "logical_rect", attr_shape_logical_rect, 0);
rbg_define_method(tmpklass, "value", attr_shape_value, 0);
+ rbg_define_method(tmpklass, "data", attr_shape_data, 0);
MAKE_ATTR(PANGO_ATTR_SCALE, AttrScale, pattrfloat, 1);
/* PangoScale */
rb_define_const(tmpklass, "XX_SMALL", rb_float_new(PANGO_SCALE_XX_SMALL));
diff --git a/pango/ext/pango/rbpangoattrlist.c b/pango/ext/pango/rbpangoattrlist.c
index a563fb6..a3c095e 100644
--- a/pango/ext/pango/rbpangoattrlist.c
+++ b/pango/ext/pango/rbpangoattrlist.c
@@ -1,6 +1,6 @@
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
- * Copyright (C) 2011 Ruby-GNOME2 Project Team
+ * Copyright (C) 2011-2016 Ruby-GNOME2 Project Team
* Copyright (C) 2002-2005 Masao Mutoh
*
* This library is free software; you can redistribute it and/or
@@ -64,7 +64,7 @@ rg_splice(VALUE self, VALUE other, VALUE pos, VALUE len)
static gboolean
filter_func(PangoAttribute *attr, gpointer data)
{
- return CBOOL2RVAL(rb_funcall((VALUE)data, id_call, 1, ATTR2RVAL(attr)));
+ return RVAL2CBOOL(rb_funcall((VALUE)data, id_call, 1, ATTR2RVAL(attr)));
}
static VALUE
diff --git a/pango/ext/pango/rbpangocontext.c b/pango/ext/pango/rbpangocontext.c
index d935295..f90695f 100644
--- a/pango/ext/pango/rbpangocontext.c
+++ b/pango/ext/pango/rbpangocontext.c
@@ -1,6 +1,6 @@
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
- * Copyright (C) 2011 Ruby-GNOME2 Project Team
+ * Copyright (C) 2011-2016 Ruby-GNOME2 Project Team
* Copyright (C) 2002-2005 Masao Mutoh
*
* This library is free software; you can redistribute it and/or
@@ -21,6 +21,8 @@
#include "rbpangoprivate.h"
+static ID id_call;
+
#define RG_TARGET_NAMESPACE cContext
#define _SELF(self) (RVAL2PANGOCONTEXT(self))
@@ -33,26 +35,26 @@ rg_itemize(int argc, VALUE *argv, VALUE self)
rb_scan_args(argc, argv, "42", &arg1, &arg2, &arg3, &arg4, &arg5, &arg6);
if (TYPE(arg1) == T_STRING) {
- list = pango_itemize(_SELF(self),
- RVAL2CSTR(arg1), /* text */
- NUM2INT(arg2), /* start_index */
+ list = pango_itemize(_SELF(self),
+ RVAL2CSTR(arg1), /* text */
+ NUM2INT(arg2), /* start_index */
NUM2INT(arg3), /* length */
RVAL2PANGOATTRLIST(arg4), /* attrs */
NIL_P(arg5) ? NULL : RVAL2PANGOATTRITERATOR(arg5)); /* cached_iter */
} else {
#ifdef HAVE_PANGO_ITEMIZE_WITH_BASE_DIR
- list = pango_itemize_with_base_dir(_SELF(self),
+ list = pango_itemize_with_base_dir(_SELF(self),
RVAL2PANGODIRECTION(arg1), /* base_dir */
- RVAL2CSTR(arg2), /* text */
- NUM2INT(arg3), /* start_index */
+ RVAL2CSTR(arg2), /* text */
+ NUM2INT(arg3), /* start_index */
NUM2INT(arg4), /* length */
RVAL2PANGOATTRLIST(arg5), /* attrs */
NIL_P(arg6) ? NULL : RVAL2PANGOATTRITERATOR(arg6)); /* cached_iter */
#else
rb_warn("Pango::Context#itemize(base_dir, text, start_index, length, attrs, cached_iter) isn't supported on this environment.");
- list = pango_itemize(_SELF(self),
- RVAL2CSTR(arg1), /* text */
- NUM2INT(arg2), /* start_index */
+ list = pango_itemize(_SELF(self),
+ RVAL2CSTR(arg1), /* text */
+ NUM2INT(arg2), /* start_index */
NUM2INT(arg3), /* length */
RVAL2PANGOATTRLIST(arg4), /* attrs */
NIL_P(arg5) ? NULL : RVAL2PANGOATTRITERATOR(arg5)); /* cached_iter */
@@ -111,7 +113,7 @@ rg_language(VALUE self)
static VALUE
rg_set_language(VALUE self, VALUE lang)
{
- pango_context_set_language(_SELF(self),
+ pango_context_set_language(_SELF(self),
RVAL2PANGOLANGUAGE(lang));
return self;
}
@@ -167,7 +169,7 @@ rg_matrix(VALUE self)
static VALUE
rg_set_matrix(VALUE self, VALUE matrix)
{
- pango_context_set_matrix(_SELF(self),
+ pango_context_set_matrix(_SELF(self),
RVAL2PANGOMATRIX(matrix));
return self;
}
@@ -192,8 +194,8 @@ rg_get_metrics(int argc, VALUE *argv, VALUE self)
rb_scan_args(argc, argv, "11", &desc, &lang);
- return PANGOFONTMETRICS2RVAL(pango_context_get_metrics(_SELF(self),
- RVAL2PANGOFONTDESCRIPTION(desc),
+ return PANGOFONTMETRICS2RVAL(pango_context_get_metrics(_SELF(self),
+ RVAL2PANGOFONTDESCRIPTION(desc),
NIL_P(lang) ? NULL : RVAL2PANGOLANGUAGE(lang)));
}
@@ -253,6 +255,36 @@ rg_resolution(VALUE self)
{
return rb_float_new(pango_cairo_context_get_resolution(_SELF(self)));
}
+
+static void
+shape_renderer_callback(cairo_t *cr,
+ PangoAttrShape *attr,
+ gboolean do_path,
+ gpointer data)
+{
+ VALUE rb_cr;
+ VALUE rb_attr;
+ VALUE rb_do_path;
+ VALUE rb_callback;
+
+ rb_cr = CRCONTEXT2RVAL(cr);
+ rb_attr = ATTR2RVAL((PangoAttribute *)attr);
+ rb_do_path = CBOOL2RVAL(do_path);
+ rb_callback = (VALUE)data;
+ rb_funcall(rb_callback, id_call, 3, rb_cr, rb_attr, rb_do_path);
+}
+
+static VALUE
+rg_set_shape_renderer(VALUE self)
+{
+ VALUE func = rb_block_proc();
+ rb_iv_set(self, "@shape_renderer", func);
+ pango_cairo_context_set_shape_renderer(_SELF(self),
+ shape_renderer_callback,
+ (gpointer)func,
+ NULL);
+ return self;
+}
#endif
static VALUE
@@ -267,6 +299,8 @@ Init_pango_context(VALUE mPango)
{
VALUE RG_TARGET_NAMESPACE = G_DEF_CLASS(PANGO_TYPE_CONTEXT, "Context", mPango);
+ id_call = rb_intern("call");
+
RG_DEF_METHOD(itemize, -1);
#ifdef PANGO_ENABLE_BACKEND
@@ -298,6 +332,7 @@ Init_pango_context(VALUE mPango)
RG_DEF_METHOD(font_options, 0);
RG_DEF_METHOD(set_resolution, 1);
RG_DEF_METHOD(resolution, 0);
+ RG_DEF_METHOD(set_shape_renderer, 0);
#endif
/* This will remove 2 or 3 releases later since 0.14.0. */
diff --git a/pango/ext/pango/rbpangoglyphinfo.c b/pango/ext/pango/rbpangoglyphinfo.c
index 0d5269d..f989ab2 100644
--- a/pango/ext/pango/rbpangoglyphinfo.c
+++ b/pango/ext/pango/rbpangoglyphinfo.c
@@ -1,6 +1,6 @@
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
- * Copyright (C) 2011 Ruby-GNOME2 Project Team
+ * Copyright (C) 2011-2016 Ruby-GNOME2 Project Team
* Copyright (C) 2005 Masao Mutoh
*
* This library is free software; you can redistribute it and/or
@@ -83,11 +83,11 @@ rg_geometry(VALUE self)
static VALUE
rg_set_geometry(VALUE self, VALUE width, VALUE x_offset, VALUE y_offset)
{
- PangoGlyphGeometry geo = _SELF(self)->geometry;
+ PangoGlyphGeometry *geo = &(_SELF(self)->geometry);
- geo.width = NUM2INT(width);
- geo.x_offset = NUM2INT(x_offset);
- geo.y_offset = NUM2INT(y_offset);
+ geo->width = NUM2INT(width);
+ geo->x_offset = NUM2INT(x_offset);
+ geo->y_offset = NUM2INT(y_offset);
return self;
}
diff --git a/pango/test/test-context.rb b/pango/test/test-context.rb
new file mode 100644
index 0000000..c66e5ac
--- /dev/null
+++ b/pango/test/test-context.rb
@@ -0,0 +1,113 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+class TestContext < Test::Unit::TestCase
+ include PangoTestUtils
+
+ def setup
+ font_map = Pango::CairoFontMap.default
+ @context = font_map.create_context
+ end
+
+ def test_set_font_map
+ font_map = Pango::CairoFontMap.default
+ @context.font_map = font_map
+ assert_equal(font_map, @context.font_map)
+ end
+
+ def test_set_font_description
+ description = Pango::FontDescription.new("monospace")
+ description.size = 10 * Pango::SCALE
+ @context.font_description = description
+ assert_equal("monospace 10", @context.font_description.to_s)
+ end
+
+ def test_set_language
+ @context.language = Pango::Language.new("fr")
+ assert_equal("fr", @context.language.to_s)
+ end
+
+ def test_set_base_dir
+ @context.base_dir = Pango::Context::DIRECTION_LTR
+ assert_equal(Pango::Context::DIRECTION_LTR, @context.base_dir)
+ end
+
+ def test_set_gravity
+ @context.gravity_hint = Pango::Gravity::HINT_STRONG
+ assert_equal(Pango::Gravity::HINT_STRONG, @context.gravity_hint)
+ end
+
+ def test_set_matrix
+ matrix = Pango::Matrix.new(0.1, 0.2, 0.3, 0.4, 0.5, 0.6)
+ @context.matrix = matrix
+ assert_equal(0.1, @context.matrix.xx)
+ assert_equal(0.2, @context.matrix.xy)
+ assert_equal(0.3, @context.matrix.yx)
+ assert_equal(0.4, @context.matrix.yy)
+ assert_equal(0.5, @context.matrix.x0)
+ assert_equal(0.6, @context.matrix.y0)
+ end
+
+ def test_load_font
+ description = Pango::FontDescription.new("monospace")
+ description.size = 10 * Pango::SCALE
+ font = @context.load_font(description)
+ assert_equal(10,
+ (font.describe.size.to_f / Pango::SCALE).round)
+ end
+
+ def test_load_fontset
+ description = Pango::FontDescription.new("monospace")
+ description.size = 10 * Pango::SCALE
+ language = Pango::Language.new("fr")
+ fontset = @context.load_fontset(description, language)
+ a_unicode = GLib::UTF8.get_char("a")
+ font = fontset.get_font(a_unicode)
+ assert_equal(10,
+ (font.describe.size.to_f / Pango::SCALE).round)
+ end
+
+ def test_get_metrics
+ description = Pango::FontDescription.new("monospace")
+ description.size = 10 * Pango::SCALE
+ language = Pango::Language.new("fr")
+ metrics = @context.get_metrics(description, language)
+ assert do
+ metrics.ascent > metrics.descent
+ end
+ end
+
+ def test_families
+ family_names = @context.families.collect(&:name)
+ assert do
+ family_names.include?("Monospace")
+ end
+ end
+
+ def test_font_options
+ options = Cairo::FontOptions.new
+ options.antialias = Cairo::Antialias::BEST
+ @context.font_options = options
+ assert_equal(Cairo::Antialias::BEST,
+ @context.font_options.antialias)
+ end
+
+ def test_resolution
+ dpi = 72
+ @context.resolution = dpi
+ assert_equal(dpi, @context.resolution)
+ end
+end
diff --git a/poppler/Rakefile b/poppler/Rakefile
index 5ab8012..86e56b2 100644
--- a/poppler/Rakefile
+++ b/poppler/Rakefile
@@ -49,7 +49,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "sqlite-autoconf",
:download_base_url => "http://www.sqlite.org/2016",
:label => "SQLite",
- :version => "3120000",
+ :version => "3140100",
:compression_method => "gz",
:windows => {
:configure_args => [],
diff --git a/poppler/ext/poppler/extconf.rb b/poppler/ext/poppler/extconf.rb
index 756f105..a9e2291 100644
--- a/poppler/ext/poppler/extconf.rb
+++ b/poppler/ext/poppler/extconf.rb
@@ -30,7 +30,7 @@ rescue LoadError
require 'mkmf-gnome2'
end
-["glib2", "atk", "gdk_pixbuf2"].each do |package|
+["glib2", "atk"].each do |package|
directory = "#{package}#{version_suffix}"
build_dir = "#{directory}/tmp/#{RUBY_PLATFORM}/#{package}/#{RUBY_VERSION}"
add_depend_package(package, "#{directory}/ext/#{package}",
diff --git a/poppler/ext/poppler/rbpoppler-page.c b/poppler/ext/poppler/rbpoppler-page.c
index 12219d0..c4cc437 100644
--- a/poppler/ext/poppler/rbpoppler-page.c
+++ b/poppler/ext/poppler/rbpoppler-page.c
@@ -205,17 +205,17 @@ rg_text_layout(VALUE self)
guint n_rectangles;
if (poppler_page_get_text_layout(SELF(self), &rectangles, &n_rectangles)) {
- VALUE *rb_list, *p;
- VALUE ary;
+ VALUE rb_rectangles;
guint i;
- rb_list = p = ALLOC_N(VALUE, n_rectangles);
- for (i = 0; i < n_rectangles; i++, p++) {
- *p = POPPLERRECTANGLE2RVAL(&rectangles[i]);
+
+ rb_rectangles = rb_ary_new2(n_rectangles);
+ for (i = 0; i < n_rectangles; i++) {
+ rb_ary_push(rb_rectangles,
+ POPPLERRECTANGLE2RVAL(&(rectangles[i])));
}
- ary = rb_ary_new4(n_rectangles, rb_list);
- free(rb_list);
- free(rectangles);
- return ary;
+ g_free(rectangles);
+
+ return rb_rectangles;
} else {
return Qnil;
}
diff --git a/poppler/sample/pdf2.rb b/poppler/sample/pdf2.rb
index 2db8405..9b493f0 100755
--- a/poppler/sample/pdf2.rb
+++ b/poppler/sample/pdf2.rb
@@ -115,7 +115,7 @@ def to_pixbuf_with_cairo(input, page_number, scale, rotate)
temp = Tempfile.new("pdf2")
cr.target.write_to_png(temp.path)
cr.target.finish
- Gdk::Pixbuf.new(temp.path)
+ GdkPixbuf::Pixbuf.new(:file => temp.path)
end
unless Poppler.cairo_available?
diff --git a/poppler/test/run-test.rb b/poppler/test/run-test.rb
index a6413ec..c0028ab 100755
--- a/poppler/test/run-test.rb
+++ b/poppler/test/run-test.rb
@@ -15,10 +15,12 @@ require 'glib-test-init'
[pango_dir, "pango"],
[glib_dir, "glib2"],
[base_dir, "poppler"]].each do |dir, module_name|
- if have_make
- system("cd #{dir.dump} && make > /dev/null") or exit(false)
+ if File.exist?(File.join(dir, "Makefile"))
+ if have_make
+ system("cd #{dir.dump} && make > /dev/null") or exit(false)
+ end
+ $LOAD_PATH.unshift(File.join(dir, "ext", module_name))
end
- $LOAD_PATH.unshift(File.join(dir, "ext", module_name))
$LOAD_PATH.unshift(File.join(dir, "lib"))
end
require "poppler"
diff --git a/poppler/test/test_page.rb b/poppler/test/test_page.rb
index bc187a5..01ffc84 100644
--- a/poppler/test/test_page.rb
+++ b/poppler/test/test_page.rb
@@ -30,6 +30,15 @@ class TestPage < Test::Unit::TestCase
assert_kind_of(Poppler::Annotation, mapping.annotation)
end
+ def test_text_layout
+ only_poppler_version(0, 16, 0)
+ document = Poppler::Document.new(form_pdf)
+ page = document[0]
+ layout = page.text_layout
+ assert_equal([60, 31, 79, 60],
+ layout[0].to_a.collect(&:round))
+ end
+
private
def find_first_image_mapping(document)
document.each do |page|
diff --git a/rsvg2/Rakefile b/rsvg2/Rakefile
index cea234f..37f74a8 100644
--- a/rsvg2/Rakefile
+++ b/rsvg2/Rakefile
@@ -57,7 +57,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "librsvg",
:download_site => :gnome,
:label => "librsvg",
- :version => "2.40.13",
+ :version => "2.40.16",
:compression_method => "xz",
:windows => {
:configure_args => [
diff --git a/rsvg2/sample/svg2.rb b/rsvg2/sample/svg2.rb
index bd1fc5f..3f1bb56 100644
--- a/rsvg2/sample/svg2.rb
+++ b/rsvg2/sample/svg2.rb
@@ -38,7 +38,7 @@ def to_pixbuf_with_cairo(input, ratio)
temp = Tempfile.new("svg2")
cr.target.write_to_png(temp.path)
cr.target.finish
- Gdk::Pixbuf.new(temp.path)
+ GdkPixbuf::Pixbuf.new(:file => temp.path)
end
def to_pixbuf(input, ratio)
diff --git a/run-test.rb b/run-test.rb
index 061dc1b..ce70d9f 100755
--- a/run-test.rb
+++ b/run-test.rb
@@ -28,6 +28,7 @@ Pathname.glob((base_dir + "*").to_s) do |dir|
end
ignored_modules = [
+ "gdk_pixbuf2-no-gi",
"gstreamer-no-gi",
"gdk3-no-gi",
"gtk3-no-gi",
diff --git a/travis-before-script.sh b/travis-before-script.sh
index d3a5ce4..2305bd2 100755
--- a/travis-before-script.sh
+++ b/travis-before-script.sh
@@ -34,5 +34,9 @@ sudo apt-get install -qq -y \
gir1.2-webkit-1.0 \
gir1.2-webkit-3.0 \
gir1.2-webkit2-3.0 \
+ gir1.2-gsf-1 \
+ gir1.2-goffice-0.10 \
+ gir1.2-gnumeric\
+ gnumeric\
gnome-icon-theme \
dbus-x11
diff --git a/vte3/Rakefile b/vte3/Rakefile
index 03798d5..5657924 100644
--- a/vte3/Rakefile
+++ b/vte3/Rakefile
@@ -46,7 +46,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
:name => "vte",
:download_site => :gnome,
:label => "vte",
- :version => "0.44.0",
+ :version => "0.44.2",
:compression_method => "xz",
:windows => {
:configure_args => [
diff --git a/vte3/lib/vte3.rb b/vte3/lib/vte3.rb
index bf72a0a..c3f8137 100644
--- a/vte3/lib/vte3.rb
+++ b/vte3/lib/vte3.rb
@@ -33,24 +33,7 @@ module Vte
class Error < StandardError
end
- class << self
- def const_missing(name)
- init
- if const_defined?(name)
- const_get(name)
- else
- super
- end
- end
-
- def init
- class << self
- remove_method(:init)
- remove_method(:const_missing)
- end
- Gtk.init if Gtk.respond_to?(:init)
- loader = Loader.new(self)
- loader.load("Vte")
- end
- end
+ Gtk.init if Gtk.respond_to?(:init)
+ loader = Loader.new(self)
+ loader.load("Vte")
end
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-gnome2.git
More information about the Pkg-ruby-extras-commits
mailing list